connections: Introduction of generic API
[vswitchperf.git] / vswitches / ovs_dpdk_vhost.py
index 327a697..8da043c 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright 2015-2016 Intel Corporation.
+# Copyright 2015-2018 Intel Corporation., Tieto
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 """VSPERF VSwitch implementation using DPDK and vhost ports
 """
 
-import logging
 import subprocess
-import os
 
 from src.ovs import OFBridge
 from src.dpdk import dpdk
-from conf import settings
+from conf import settings as S
 from vswitches.ovs import IVSwitchOvs
 
 class OvsDpdkVhost(IVSwitchOvs):
@@ -37,14 +35,19 @@ class OvsDpdkVhost(IVSwitchOvs):
     """
 
     def __init__(self):
-        super(OvsDpdkVhost, self).__init__()
-        self._logger = logging.getLogger(__name__)
-
+        super().__init__()
         vswitchd_args = []
 
         # legacy DPDK configuration through --dpdk option of vswitchd
         if self.old_dpdk_config():
-            vswitchd_args = ['--dpdk'] + settings.getValue('VSWITCHD_DPDK_ARGS')
+            # override socket-mem settings
+            tmp_dpdk_args = S.getValue('VSWITCHD_DPDK_ARGS')
+            for tmp_arg in tmp_dpdk_args:
+                if tmp_arg.startswith('--socket-mem'):
+                    tmp_dpdk_args.remove(tmp_arg)
+            tmp_dpdk_args += ['--socket-mem ' + ','.join(S.getValue('DPDK_SOCKET_MEM'))]
+            vswitchd_args = ['--dpdk'] + tmp_dpdk_args
+            # add dpdk args to generic ovs-vswitchd settings
             if self._vswitchd_args:
                 self._vswitchd_args = vswitchd_args + ['--'] + self._vswitchd_args
             else:
@@ -53,8 +56,10 @@ class OvsDpdkVhost(IVSwitchOvs):
     def configure(self):
         """ Configure vswitchd DPDK options through ovsdb if needed
         """
-        dpdk_config = settings.getValue('VSWITCHD_DPDK_CONFIG')
+        dpdk_config = S.getValue('VSWITCHD_DPDK_CONFIG')
         if dpdk_config and not self.old_dpdk_config():
+            # override socket-mem settings
+            dpdk_config['dpdk-socket-mem'] = ','.join(S.getValue('DPDK_SOCKET_MEM'))
             # enforce calls to ovs-vsctl with --no-wait
             tmp_br = OFBridge(timeout=-1)
             for option in dpdk_config:
@@ -69,12 +74,12 @@ class OvsDpdkVhost(IVSwitchOvs):
         dpdk.init()
         super(OvsDpdkVhost, self).start()
         # old style OVS <= 2.5.0 multi-queue enable
-        if settings.getValue('OVS_OLD_STYLE_MQ') and \
-                int(settings.getValue('VSWITCH_DPDK_MULTI_QUEUES')):
+        if S.getValue('OVS_OLD_STYLE_MQ') and \
+                int(S.getValue('VSWITCH_DPDK_MULTI_QUEUES')):
             tmp_br = OFBridge(timeout=-1)
             tmp_br.set_db_attribute(
                 'Open_vSwitch', '.', 'other_config:' +
-                'n-dpdk-rxqs', settings.getValue('VSWITCH_DPDK_MULTI_QUEUES'))
+                'n-dpdk-rxqs', S.getValue('VSWITCH_DPDK_MULTI_QUEUES'))
 
     def stop(self):
         """See IVswitch for general description
@@ -93,12 +98,12 @@ class OvsDpdkVhost(IVSwitchOvs):
             switch_params = switch_params + params
 
         super(OvsDpdkVhost, self).add_switch(switch_name, switch_params)
-        if settings.getValue('VSWITCH_AFFINITIZATION_ON') == 1:
+        if S.getValue('VSWITCH_AFFINITIZATION_ON') == 1:
             # Sets the PMD core mask to VSWITCH_PMD_CPU_MASK
             # for CPU core affinitization
-            self._bridges[switch_name].set_db_attribute('Open_vSwitch', '.',
-                                                        'other_config:pmd-cpu-mask',
-                                                        settings.getValue('VSWITCH_PMD_CPU_MASK'))
+            self._switches[switch_name].set_db_attribute('Open_vSwitch', '.',
+                                                         'other_config:pmd-cpu-mask',
+                                                         S.getValue('VSWITCH_PMD_CPU_MASK'))
 
     def add_phy_port(self, switch_name):
         """See IVswitch for general description
@@ -106,16 +111,26 @@ class OvsDpdkVhost(IVSwitchOvs):
         Creates a port of type dpdk.
         The new port is named dpdk<n> where n is an integer starting from 0.
         """
-        bridge = self._bridges[switch_name]
+        _nics = S.getValue('NICS')
+        bridge = self._switches[switch_name]
         dpdk_count = self._get_port_count('type=dpdk')
+        if dpdk_count == len(_nics):
+            raise RuntimeError("Can't add phy port! There are only {} ports defined "
+                               "by WHITELIST_NICS parameter!".format(len(_nics)))
         port_name = 'dpdk' + str(dpdk_count)
-        params = ['--', 'set', 'Interface', port_name, 'type=dpdk']
+        # PCI info. Please note there must be no blank space, eg must be
+        # like 'options:dpdk-devargs=0000:06:00.0'
+        nic_pci = 'options:dpdk-devargs=' + _nics[dpdk_count]['pci']
+        params = ['--', 'set', 'Interface', port_name, 'type=dpdk', nic_pci]
         # multi-queue enable
 
-        if int(settings.getValue('VSWITCH_DPDK_MULTI_QUEUES')) and \
-                not settings.getValue('OVS_OLD_STYLE_MQ'):
-                params += ['options:n_rxq={}'.format(
-                    settings.getValue('VSWITCH_DPDK_MULTI_QUEUES'))]
+        if int(S.getValue('VSWITCH_DPDK_MULTI_QUEUES')) and \
+                not S.getValue('OVS_OLD_STYLE_MQ'):
+            params += ['options:n_rxq={}'.format(
+                S.getValue('VSWITCH_DPDK_MULTI_QUEUES'))]
+        if S.getValue('VSWITCH_JUMBO_FRAMES_ENABLED'):
+            params += ['mtu_request={}'.format(
+                S.getValue('VSWITCH_JUMBO_FRAMES_SIZE'))]
         of_port = bridge.add_port(port_name, params)
         return (port_name, of_port)
 
@@ -126,15 +141,22 @@ class OvsDpdkVhost(IVSwitchOvs):
         The new port is named dpdkvhost<n> where n is an integer starting
         from 0
         """
-        bridge = self._bridges[switch_name]
-        vhost_count = self._get_port_count('type=dpdkvhostuser')
-        port_name = 'dpdkvhostuser' + str(vhost_count)
-        params = ['--', 'set', 'Interface', port_name, 'type=dpdkvhostuser']
-        # multi queue enable
-        if int(settings.getValue('VSWITCH_DPDK_MULTI_QUEUES')) and \
-                not settings.getValue('OVS_OLD_STYLE_MQ'):
-            params += ['options:n_rxq={}'.format(
-                settings.getValue('VSWITCH_DPDK_MULTI_QUEUES'))]
+        bridge = self._switches[switch_name]
+
+        if S.getValue('VSWITCH_VHOSTUSER_SERVER_MODE'):
+            nic_type = 'dpdkvhostuser'
+        else:
+            nic_type = 'dpdkvhostuserclient'
+
+        vhost_count = self._get_port_count('type={}'.format(nic_type))
+        port_name = nic_type + str(vhost_count)
+        params = ['--', 'set', 'Interface', port_name, 'type={}'.format(nic_type)]
+        if not S.getValue('VSWITCH_VHOSTUSER_SERVER_MODE'):
+            params += ['--', 'set', 'Interface', port_name, 'options:vhost-server-path='
+                       '{}{}'.format(S.getValue('TOOLS')['ovs_var_tmp'], port_name)]
+        if S.getValue('VSWITCH_JUMBO_FRAMES_ENABLED'):
+            params += ['mtu_request={}'.format(
+                S.getValue('VSWITCH_JUMBO_FRAMES_SIZE'))]
         of_port = bridge.add_port(port_name, params)
 
         return (port_name, of_port)
@@ -146,7 +168,7 @@ class OvsDpdkVhost(IVSwitchOvs):
         :returns: True if legacy --dpdk option is supported, otherwise it returns False
         """
 
-        ovs_vswitchd_bin = settings.getValue('TOOLS')['ovs-vswitchd']
+        ovs_vswitchd_bin = S.getValue('TOOLS')['ovs-vswitchd']
         try:
             subprocess.check_output(ovs_vswitchd_bin + r' --help | grep "\-\-dpdk"', shell=True)
             return True