[dts] [PATCH v1 1/2] framework/etgen: support latest dpdk-pktgen

Marvin Liu yong.liu at intel.com
Fri Apr 20 00:38:52 CEST 2018


Removed outdated dpdk-pktgen support, current support version is dpdk
v18.02 + dpdk-pktgen v3.5.0. Ports statistics will be retrieved from lua
output. Also enlarged memory size for supporting at least four ports.

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

diff --git a/framework/config.py b/framework/config.py
index f7f347a..71b1c37 100644
--- a/framework/config.py
+++ b/framework/config.py
@@ -288,6 +288,9 @@ class CrbsConf(UserConf):
                 elif key == 'tester_passwd':
                     crb['tester pass'] = value
                 elif key == 'ixia_group':
+                    # None type will be check later
+                    if value.lower() == 'none':
+                        value = None
                     crb[IXIA] = value
                 elif key == 'channels':
                     crb['memory channels'] = int(value)
diff --git a/framework/etgen.py b/framework/etgen.py
index b96b8ed..2856a28 100644
--- a/framework/etgen.py
+++ b/framework/etgen.py
@@ -54,6 +54,7 @@ class SoftwarePacketGenerator():
         self.tester.send_expect("insmod igb_uio.ko", "#")
 
         bind_cmd = ""
+        white_list = ""
         ports = []
         tx_ports = []
         for (tx_port, rx_port, pcap_file) in portList:
@@ -65,6 +66,7 @@ class SoftwarePacketGenerator():
 
         for port in ports:
             bind_cmd += " %s" % self.tester.ports_info[port]['pci']
+            white_list += " -w %s"  % self.tester.ports_info[port]['pci']
 
         self.tester.send_expect("./dpdk-devbind.py --bind=igb_uio %s" % bind_cmd, "#")
 
@@ -73,6 +75,17 @@ class SoftwarePacketGenerator():
         port_index = range(len(ports))
         port_map = dict(zip(ports, port_index))
         self.tester.init_reserved_core()
+
+        # reserve one core for master process
+        used_cores = list()
+        master_core = self.tester.get_reserved_core("1C", socket=0)
+
+        if len(master_core) < 1:
+            raise VerifyFailure("Not enough core for performance!!!")
+
+        used_cores.append(int(master_core[0]))
+
+        # allocate cores for each port
         for port in ports:
             numa = self.tester.get_port_numa(port)
             cores = self.tester.get_reserved_core("2C", socket=numa)
@@ -81,39 +94,58 @@ class SoftwarePacketGenerator():
                 raise VerifyFailure("Not enough cores for performance!!!")
 
             map_cmd += "[%s:%s].%d, " % (cores[0], cores[1], port_map[port])
+            used_cores.append(int(cores[0]))
+            used_cores.append(int(cores[1]))
 
-        # create pcap for every port
+        # prepare pcap for every port
         pcap_cmd = ""
         for (tx_port, rx_port, pcap_file) in portList:
             pcap_cmd += " -s %d:%s" % (port_map[tx_port], pcap_file)
 
         # Selected 2 for -n to optimize results on Burage
-        cores_mask = create_mask(self.tester.get_core_list("all"))
+        cores_mask = create_mask(used_cores)
+
+        # allocate enough memory for 4 ports
+        socket_mem = "--socket-mem 1024,1024"
 
-        self.tester.send_expect("./pktgen -n 2 -c %s --proc-type auto --socket-mem 256,256 -- -P -m \"%s\" %s"
-                                % (cores_mask, map_cmd, pcap_cmd), "Pktgen >", 100)
+        # current support version is dpdk v18.02 + pktgen v3.5.0
+        pkt_cmd = "./pktgen -n 2 -c {CORE} --file-prefix=pktgen {WHITE} " \
+                  "{MEM} -- -P -m \"{CORE_MAP}\" {PCAP}".format(CORE=cores_mask,
+                  WHITE=white_list, MEM=socket_mem, CORE_MAP=map_cmd, PCAP=pcap_cmd)
+
+        self.tester.send_expect(pkt_cmd, "Pktgen:/>", 100)
+        self.tester.send_expect("disable screen", "Pktgen:/>")
 
         if rate_percent != 100:
-            self.tester.send_expect("set all rate %s" % rate_percent, "Pktgen>")
+            self.tester.send_expect("set all rate %s" % rate_percent, "Pktgen:/>")
         else:
-            self.tester.send_expect("set all rate 100", "Pktgen>")
+            self.tester.send_expect("set all rate 100", "Pktgen:/>")
 
-        self.tester.send_expect("start all", "Pktgen>")
+        self.tester.send_expect("start all", "Pktgen:/>")
         time.sleep(10)
-        out = self.tester.send_expect("clr", "Pktgen>")
-
-        match = r"Bits per second: (\d+)+/(\d+)"
-        m = re.search(match, out)
-
-        match = r"Packets per second: (\d+)+/(\d+)"
-        n = re.search(match, out)
-
-        rx_bps = int(m.group(1))
-        rx_pps = int(n.group(1))
-        tx_bps = int(m.group(2))
-
-        self.tester.send_expect("stop all", "Pktgen>")
-        self.tester.send_expect("quit", "# ")
+        out = self.tester.send_expect("lua \"prints('portRates', pktgen.portStats('all', 'rate'))\"", "Pktgen:/>")
+        rx_bps = 0
+        rx_pps = 0
+        tx_bps = 0
+        rx_match = r"\[\"mbits_rx\"\] = (\d+),"
+        port_stats = re.findall(rx_match, out)
+        for port_stat in port_stats:
+            rx_bps += int(port_stat)
+
+        tx_match = r"\[\"mbits_tx\"\] = (\d+),"
+        port_stats = re.findall(tx_match, out)
+        for port_stat in port_stats:
+            tx_bps += int(port_stat)
+
+        pps_match = r"\[\"pkts_rx\"\] = (\d+),"
+        port_stats = re.findall(pps_match, out)
+        for port_stat in port_stats:
+            rx_pps += int(port_stat)
+
+        self.tester.send_expect("stop all", "Pktgen:/>")
+        self.tester.send_expect("quit", "#")
+        # restore stty setting
+        self.tester.send_expect('stty -echo', '#')
         self.tester.kill_all(killall=True)
         self.tester.restore_interfaces()
 
-- 
1.9.3



More information about the dts mailing list