[dts] [dts 4/9] Optimize network topology discovery routine in virtual scenario

Yong Liu yong.liu at intel.com
Thu Jun 18 05:06:39 CEST 2015


From: Marvin Liu <yong.liu at intel.com>

Signed-off-by: Marvin Liu <yong.liu at intel.com>

diff --git a/framework/dut.py b/framework/dut.py
index a9b4ed0..96c362b 100644
--- a/framework/dut.py
+++ b/framework/dut.py
@@ -781,10 +781,12 @@ class Dut(Crb):
                     continue
 
                 if getattr(self, 'send_ping6', None):
-                    self.send_ping6(
-                        dutPort, self.tester.ports_info[remotePort]['ipv6'])
-                out = self.tester.send_ping6(
-                    remotePort, ipv6, self.get_mac_address(dutPort))
+                    out = self.send_ping6(
+                        dutPort, self.tester.ports_info[remotePort]['ipv6'],
+                        self.get_mac_address(dutPort))
+                else:
+                    out = self.tester.send_ping6(
+                        remotePort, ipv6, self.get_mac_address(dutPort))
 
                 if ('64 bytes from' in out):
                     self.logger.info("PORT MAP: [dut %d: tester %d]" % (dutPort, remotePort))
diff --git a/framework/virt_dut.py b/framework/virt_dut.py
index b52109d..79ecc2a 100644
--- a/framework/virt_dut.py
+++ b/framework/virt_dut.py
@@ -35,7 +35,7 @@ import time
 import dts
 import settings
 from config import PortConf
-from settings import NICS, LOG_NAME_SEP
+from settings import NICS, LOG_NAME_SEP, get_netdev
 from ssh_connection import SSHConnection
 from project_dpdk import DPDKdut
 from dut import Dut
@@ -54,7 +54,9 @@ class VirtDut(DPDKdut):
     or CRBBareMetal.
     """
 
-    def __init__(self, crb, serializer, virttype, vm_name, suite):
+    def __init__(self, hyper, crb, serializer, virttype, vm_name, suite):
+        self.vm_name = vm_name
+        self.hyper = hyper
         super(Dut, self).__init__(crb, serializer)
         self.vm_ip = self.get_ip_address()
         self.NAME = 'virtdut' + LOG_NAME_SEP + '%s' % self.vm_ip
@@ -96,8 +98,27 @@ class VirtDut(DPDKdut):
         """
         Load port config for this virtual machine
         """
+        self.conf = PortConf()
+        self.conf.load_ports_config(self.vm_name)
+        self.ports_cfg = self.conf.get_ports_config()
+
         return
 
+    def create_portmap(self):
+        port_num = len(self.ports_info)
+        self.ports_map = [-1] * port_num
+        for key in self.ports_cfg.keys():
+            index = int(key)
+            if index >= port_num:
+                print dts.RED("Can not found [%d ]port info" % index)
+                continue
+
+            if 'peer' in self.ports_cfg[key].keys():
+                tester_pci = self.ports_cfg[key]['peer']
+                # find tester_pci index
+                pci_idx = self.tester.get_local_index(tester_pci)
+                self.ports_map[index] = pci_idx
+
     def set_target(self, target):
         """
         Set env variable, these have to be setup all the time. Some tests
@@ -121,7 +142,7 @@ class VirtDut(DPDKdut):
 
         self.bind_interfaces_linux('igb_uio')
 
-    def prerequisites(self, pkgName, patch):
+    def prerequisites(self, pkgName, patch, auto_portmap):
         """
         Prerequest function should be called before execute any test case.
         Will call function to scan all lcore's information which on DUT.
@@ -153,13 +174,19 @@ class VirtDut(DPDKdut):
 
         # no need to rescan ports for guest os just bootup
         # load port infor from config file
-        self.load_portconf()
+        if auto_portmap is False:
+            self.load_portconf()
 
         # enable tester port ipv6
         self.host_dut.enable_tester_ipv6()
         self.mount_procfs()
-        # auto detect network topology
-        self.map_available_ports()
+
+        if auto_portmap:
+            # auto detect network topology
+            self.map_available_ports()
+        else:
+            self.create_portmap()
+
         # disable tester port ipv6
         self.host_dut.disable_tester_ipv6()
 
@@ -167,6 +194,22 @@ class VirtDut(DPDKdut):
         for port_info in self.ports_info:
             self.logger.info(port_info)
 
+    def init_core_list(self):
+        self.cores = []
+        cpuinfo = self.send_expect("grep --color=never \"processor\""
+                                   " /proc/cpuinfo", "#", alt_session=False)
+        cpuinfo = cpuinfo.split('\r\n')
+        for line in cpuinfo:
+            m = re.search("processor\t: (\d+)", line)
+            if m:
+                thread = m.group(1)
+                socket = 0
+                core = thread
+            self.cores.append(
+                {'thread': thread, 'socket': socket, 'core': core})
+
+        self.number_of_cores = len(self.cores)
+
     def restore_interfaces_domu(self):
         """
         Restore Linux interfaces.
@@ -227,13 +270,66 @@ class VirtDut(DPDKdut):
         Load or generate network connection mapping list.
         """
         self.map_available_ports_uncached()
-        self.logger.warning("DUT PORT MAP: " + str(self.ports_map))
+        self.logger.warning("VM DUT PORT MAP: " + str(self.ports_map))
 
-    def send_ping6(self, localPort, ipv6, mac=''):
+    def map_available_ports_uncached(self):
         """
-        Send ping6 packet from local port with destination ipv6 address.
+        Generate network connection mapping list.
         """
-        if self.ports_info[localPort]['type'] == 'ixia':
-            pass
-        else:
-            return self.send_expect("ping6 -w 1 -c 1 -A -I %s %s" % (self.ports_info[localPort]['intf'], ipv6), "# ", 10)
+        nrPorts = len(self.ports_info)
+        if nrPorts == 0:
+            return
+
+        remove = []
+        self.ports_map = [-1] * nrPorts
+
+        hits = [False] * len(self.tester.ports_info)
+
+        for dutPort in range(nrPorts):
+            peer = self.get_peer_pci(dutPort)
+            # if peer pci configured
+            if peer is not None:
+                for remotePort in range(len(self.tester.ports_info)):
+                    if self.tester.ports_info[remotePort]['pci'] == peer:
+                        hits[remotePort] = True
+                        self.ports_map[dutPort] = remotePort
+                        break
+                if self.ports_map[dutPort] == -1:
+                    self.logger.error("CONFIGURED TESTER PORT CANNOT FOUND!!!")
+                else:
+                    continue  # skip ping6 map
+
+            if hasattr(self.hyper, 'pt_devices'):
+                hostpci = self.hyper.pt_devices[dutPort]
+                netdev = get_netdev(self.host_dut, hostpci)
+
+            # auto ping port map
+            for remotePort in range(len(self.tester.ports_info)):
+                # for two vfs connected to same tester port
+                # can't skip those teste ports even have hits
+                # need skip ping self vf port
+                remotepci = self.tester.ports_info[remotePort]['pci']
+                remoteport =  self.tester.ports_info[remotePort]['port']
+                vfs = []
+                # vm_dut and tester in same dut
+                host_ip = self.crb['IP'].split(':')[0]
+                if self.crb['tester IP'] == host_ip:
+                    vfs = remoteport.get_sriov_vfs_pci()
+                # if hostpci is vf of tester port
+                if netdev.pci in vfs:
+                    print dts.RED("Skip ping from PF device")
+                    continue
+
+                ipv6 = self.get_ipv6_address(dutPort)
+                if ipv6 == "Not connected":
+                    continue
+
+                out = self.tester.send_ping6(
+                    remotePort, ipv6, self.get_mac_address(dutPort))
+
+                if ('64 bytes from' in out):
+                    self.logger.info(
+                        "PORT MAP: [dut %d: tester %d]" % (dutPort, remotePort))
+                    self.ports_map[dutPort] = remotePort
+                    hits[remotePort] = True
+                    continue
-- 
1.9.3



More information about the dts mailing list