test suite reviews and discussions
 help / color / mirror / Atom feed
From: Qian Xu <qian.q.xu@intel.com>
To: dts@dpdk.org
Subject: [dts] [PATCH] Update the suite to remove promisc and UDP for lpm case, add socket sensitive.
Date: Wed,  9 Sep 2015 15:20:04 +0800	[thread overview]
Message-ID: <1441783204-15643-1-git-send-email-qian.q.xu@intel.com> (raw)

The major updates are as below: 
1. Remove promisc mode in the sample command and ensure the traffic is sent to the correct MAC address. 
2. Update 2 ports and 4 ports case list, which can cover 10G, 40G Nics.
3. Make the lcore's socket in the commands automatically change with the NIC's socket.
4. Remove UDP in traffic settings.
5. Update config file to have best perf on FVL.

Signed-off-by: Qian Xu <qian.q.xu@intel.com>

diff --git a/tests/TestSuite_l3fwd.py b/tests/TestSuite_l3fwd.py
index 65fa6f7..0e09256 100644
--- a/tests/TestSuite_l3fwd.py
+++ b/tests/TestSuite_l3fwd.py
@@ -41,55 +41,29 @@ from plotting import Plotting
 from test_case import TestCase
 from exception import VerifyFailure
 from settings import HEADER_SIZE
+from etgen import IxiaPacketGenerator
 
-
-class TestL3fwd(TestCase):
+class TestL3fwd(TestCase,IxiaPacketGenerator):
 
     path = "./examples/l3fwd/build/"
 
-    test_cases_2_ports = {"1S/1C/1T": "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{1.1.0}), (P1,0,C{1.1.0})'",
-                          "1S/1C/2T": "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{1.1.0}), (P1,0,C{1.1.1})'",
-                          "1S/2C/1T": "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{1.1.0}), (P1,0,C{1.2.0})'"
+    test_cases_2_ports = {"1S/1C/1T": "%s -c %s -n %d -- -p %s  --config '(P0,0,C{1.1.0}), (P1,0,C{1.1.0})'",
+                          "1S/1C/2T": "%s -c %s -n %d -- -p %s  --config '(P0,0,C{1.1.0}), (P1,0,C{1.1.1})'",
+                          "1S/2C/1T": "%s -c %s -n %d -- -p %s  --config '(P0,0,C{1.1.0}), (P1,0,C{1.2.0})'",
+                          "1S/4C/1T": "%s -c %s -n %d -- -p %s  --config '(P0,0,C{1.1.0}), (P1,0,C{1.2.0}),(P0,1,C{1.3.0}), (P1,1,C{1.4.0})'",
+                          "2S/2C/1T": "%s -c %s -n %d -- -p %s  --config '(P0,0,C{0.1.0}), (P1,0,C{0.2.0}),(P0,1,C{1.3.0}), (P1,1,C{1.4.0})'",
                           }
 
     test_cases_4_ports = [(1, "1S/1C/1T",
-                           "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{1.1.0}),(P1,0,C{1.1.0}),(P2,0,C{1.1.0}),(P3,0,C{1.1.0})'"),
-                          (1, "1S/1C/2T",
-                           "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{1.1.0}),(P1,0,C{1.1.0}),(P2,0,C{1.1.1}),(P3,0,C{1.1.1})'"),
-                          (1, "1S/2C/1T",
-                           "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{1.1.0}),(P1,0,C{1.1.0}),(P2,0,C{1.2.0}),(P3,0,C{1.2.0})'"),
+                           "%s -c %s -n %d -- -p %s  --config '(P0,0,C{1.1.0}),(P1,0,C{1.1.0}),(P2,0,C{1.1.0}),(P3,0,C{1.1.0})'"),
                           (1, "1S/2C/2T",
-                           "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{1.1.0}),(P1,0,C{1.1.1}),(P2,0,C{1.2.0}),(P3,0,C{1.2.1})'"),
+                           "%s -c %s -n %d -- -p %s  --config '(P0,0,C{1.1.0}),(P1,0,C{1.1.1}),(P2,0,C{1.2.0}),(P3,0,C{1.2.1})'"),
                           (1, "1S/4C/1T",
-                           "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{1.1.0}),(P1,0,C{1.2.0}),(P2,0,C{1.3.0}),(P3,0,C{1.4.0})'"),
-                          (1, "2S/1C/1T",
-                           "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{0.1.0}),(P1,0,C{0.1.0}),(P2,0,C{1.1.0}),(P3,0,C{1.1.0})'"),
-                          (1, "2S/1C/2T",
-                           "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{0.1.0}),(P1,0,C{0.1.1}),(P2,0,C{1.1.0}),(P3,0,C{1.1.1})'"),
-                          (1, "2S/2C/1T",
-                           "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{0.1.0}),(P1,0,C{0.2.0}),(P2,0,C{1.1.0}),(P3,0,C{1.2.0})'"),
-                          (2, "1S/1C/1T",
-                           "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{1.1.0}),(P0,1,C{1.1.0}),(P1,0,C{1.1.0}),(P1,1,C{1.1.0}),(P2,0,C{1.1.0}),(P2,1,C{1.1.0}),(P3,0,C{1.1.0}),(P3,1,C{1.1.0})'"),
-                          (2, "1S/1C/2T",
-                           "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{1.1.0}),(P0,1,C{1.1.0}),(P1,0,C{1.1.0}),(P1,1,C{1.1.0}),(P2,0,C{1.1.1}),(P2,1,C{1.1.1}),(P3,0,C{1.1.1}),(P3,1,C{1.1.1})'"),
-                          (2, "1S/2C/1T",
-                           "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{1.1.0}),(P0,1,C{1.1.0}),(P1,0,C{1.1.0}),(P1,1,C{1.1.0}),(P2,0,C{1.2.0}),(P2,1,C{1.2.0}),(P3,0,C{1.2.0}),(P3,1,C{1.2.0})'"),
-                          (2, "1S/2C/2T",
-                           "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{1.1.0}),(P0,1,C{1.1.0}),(P1,0,C{1.1.1}),(P1,1,C{1.1.1}),(P2,0,C{1.2.0}),(P2,1,C{1.2.0}),(P3,0,C{1.2.1}),(P3,1,C{1.2.1})'"),
-                          (2, "1S/4C/1T",
-                           "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{1.1.0}),(P0,1,C{1.1.0}),(P1,0,C{1.2.0}),(P1,1,C{1.2.0}),(P2,0,C{1.3.0}),(P2,1,C{1.3.0}),(P3,0,C{1.4.0}),(P3,1,C{1.4.0})'"),
-                          (2, "1S/4C/2T",
-                           "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{1.1.0}),(P0,1,C{1.1.1}),(P1,0,C{1.2.0}),(P1,1,C{1.2.1}),(P2,0,C{1.3.0}),(P2,1,C{1.3.1}),(P3,0,C{1.4.0}),(P3,1,C{1.4.1})'"),
-                          (2, "2S/1C/1T",
-                           "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{0.1.0}),(P0,1,C{0.1.0}),(P1,0,C{0.1.0}),(P1,1,C{0.1.0}),(P2,0,C{1.1.0}),(P2,1,C{1.1.0}),(P3,0,C{1.1.0}),(P3,1,C{1.1.0})'"),
-                          (2, "2S/1C/2T",
-                           "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{0.1.0}),(P0,1,C{0.1.0}),(P1,0,C{0.1.1}),(P1,1,C{0.1.1}),(P2,0,C{1.1.0}),(P2,1,C{1.1.0}),(P3,0,C{1.1.1}),(P3,1,C{1.1.1})'"),
+                           "%s -c %s -n %d -- -p %s  --config '(P0,0,C{1.1.0}),(P1,0,C{1.2.0}),(P2,0,C{1.3.0}),(P3,0,C{1.4.0})'"),
+                          (2, "1S/8C/1T",
+                           "%s -c %s -n %d -- -p %s  --config '(P0,0,C{1.1.0}),(P0,1,C{1.2.0}),(P1,0,C{1.3.0}),(P1,1,C{1.4.0}),(P2,0,C{1.5.0}),(P2,1,C{1.6.0}),(P3,0,C{1.7.0}),(P3,1,C{1.8.0})'"),
                           (2, "2S/2C/1T",
-                           "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{0.1.0}),(P0,1,C{0.1.0}),(P1,0,C{0.2.0}),(P1,1,C{0.2.0}),(P2,0,C{1.1.0}),(P2,1,C{1.1.0}),(P3,0,C{1.2.0}),(P3,1,C{1.2.0})'"),
-                          (2, "2S/2C/2T",
-                           "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{0.1.0}),(P0,1,C{0.1.1}),(P1,0,C{0.2.0}),(P1,1,C{0.2.1}),(P2,0,C{1.1.0}),(P2,1,C{1.1.1}),(P3,0,C{1.2.0}),(P3,1,C{1.2.1})'"),
-                          (2, "2S/4C/1T",
-                           "%s -c %s -n %d -- -p %s -P --config '(P0,0,C{0.1.0}),(P0,1,C{0.2.0}),(P1,0,C{0.3.0}),(P1,1,C{0.4.0}),(P2,0,C{1.1.0}),(P2,1,C{1.2.0}),(P3,0,C{1.3.0}),(P3,1,C{1.4.0})'")
+                           "%s -c %s -n %d -- -p %s  --config '(P0,0,C{1.1.0}),(P1,0,C{1.2.0}),(P2,0,C{0.3.0}),(P3,0,C{0.4.0})'"),
                           ]
 
     queues_4_ports = []
@@ -120,8 +94,7 @@ class TestL3fwd(TestCase):
         "{IPv4(13,101,0,0), 24, P3}",
     ]
 
-    frame_sizes = [64]  # 65, 128
-
+    frame_sizes = [64,128]  # 65, 128
     methods = ['lpm', 'exact']
 
     #
@@ -313,18 +286,30 @@ class TestL3fwd(TestCase):
         if not ports:
             ports = self.dut.get_ports(socket=0)
 
+        self.tester.extend_external_packet_generator(TestL3fwd, self)
         # Verify that enough ports are available
         self.verify(len(ports) >= 2, "Insufficient ports for speed testing")
+        
+        netdev = self.dut.ports_info[ports[0]]['port']
+        
+        self.port_socket = netdev.socket
+        
 
         # Verify that enough threads are available
-        cores = self.dut.get_core_list("2S/4C/2T")
+        cores = self.dut.get_core_list("2S/8C/2T")
         self.verify(cores is not None, "Insufficient cores for speed testing")
 
         global valports
         valports = [_ for _ in ports if self.tester.get_local_port(_) != -1]
+        
         self.verify(len(valports) >= 2, "Insufficient active ports for speed testing")
 
         pat = re.compile("P([0123])")
+        # Update config file and rebuild to get best perf on FVL
+        self.dut.send_expect("sed -i -e 's/CONFIG_RTE_PCI_CONFIG=n/CONFIG_RTE_PCI_CONFIG=y/' ./config/common_linuxapp", "#", 20)
+        self.dut.send_expect("sed -i -e 's/CONFIG_RTE_PCI_EXTENDED_TAG=.*$/CONFIG_RTE_PCI_EXTENDED_TAG=\"on\"/' ./config/common_linuxapp", "#", 20)
+        self.dut.build_install_dpdk(self.target)
+
 
         # Prepare long prefix match table, replace P(x) port pattern
         lpmStr = "static struct ipv4_l3fwd_route ipv4_l3fwd_route_array[] = {\\\n"
@@ -372,16 +357,16 @@ class TestL3fwd(TestCase):
         Return a list of packets that implements the flows described in the
         l3fwd test plan.
 
-        """
+        """   
         return [
-            'IP(src="1.2.3.4",dst="10.100.0.1")/UDP(sport=10,dport=1)',
-            'IP(src="1.2.3.4",dst="10.101.0.1")/UDP(sport=10,dport=1)',
-            'IP(src="1.2.3.4",dst="11.100.0.1")/UDP(sport=11,dport=1)',
-            'IP(src="1.2.3.4",dst="11.101.0.1")/UDP(sport=11,dport=1)',
-            'IP(src="1.2.3.4",dst="12.100.0.1")/UDP(sport=12,dport=1)',
-            'IP(src="1.2.3.4",dst="12.101.0.1")/UDP(sport=12,dport=1)',
-            'IP(src="1.2.3.4",dst="13.100.0.1")/UDP(sport=13,dport=1)',
-            'IP(src="1.2.3.4",dst="13.101.0.1")/UDP(sport=13,dport=1)']
+            'IP(src="1.2.3.4",dst="11.100.0.1")',
+            'IP(src="1.2.3.4",dst="11.101.0.1")',
+            'IP(src="1.2.3.4",dst="10.100.0.1")',
+            'IP(src="1.2.3.4",dst="10.101.0.1")',
+            'IP(src="1.2.3.4",dst="13.100.0.1")',
+            'IP(src="1.2.3.4",dst="13.101.0.1")',
+            'IP(src="1.2.3.4",dst="12.100.0.1")',
+            'IP(src="1.2.3.4",dst="12.101.0.1")']
 
     def repl(self, match):
         pid = match.group(1)
@@ -404,6 +389,9 @@ class TestL3fwd(TestCase):
         """
 
         output_pattern = re.compile("P([0123]),([0123]),(C\{\d.\d.\d\})")
+        pat2 = re.compile("C\{\d")
+        repl1 = "C{" + str(self.port_socket)
+ 
 
         bps = dict()
         pps = dict()
@@ -411,9 +399,14 @@ class TestL3fwd(TestCase):
 
         global corelist
         corelist = []
-
+        
+        
         while output_pattern.search(command_line):
+        # If one socket case, we update the socket to ensure the core used by l3fwd is on the same socket of the NIC.
+            if cores_config.find('1S')>=0:
+                command_line = pat2.sub(repl1,command_line)
             command_line = output_pattern.sub(self.repl, command_line)
+            
 
         self.logger.debug("%s\n" % str(corelist))
         core_mask = dts.create_mask(set(corelist))
@@ -439,7 +432,11 @@ class TestL3fwd(TestCase):
                     tx_interface = self.tester.get_local_port(valports[rxPort - 1])
 
                 rx_interface = self.tester.get_local_port(valports[rxPort])
-                tgen_input.append((tx_interface, rx_interface, "dst%d.pcap" % valports[rxPort]))
+                # Make sure the traffic send to the correct MAC address
+                if rxPort % 2 == 0: 
+                    tgen_input.append((tx_interface, rx_interface, "dst%d.pcap" % valports[rxPort+1]))
+                else:
+                    tgen_input.append((tx_interface, rx_interface, "dst%d.pcap" % valports[rxPort-1]))
 
             # FIX ME
             bps[method], pps[method] = self.tester.traffic_generator_throughput(tgen_input)
@@ -490,7 +487,7 @@ class TestL3fwd(TestCase):
         for frame_size in TestL3fwd.frame_sizes:
 
             # Prepare traffic flow
-            payload_size = frame_size - HEADER_SIZE['udp'] - \
+            payload_size = frame_size - \
                 HEADER_SIZE['ip'] - HEADER_SIZE['eth']
 
             for _port in range(4):
@@ -532,28 +529,37 @@ class TestL3fwd(TestCase):
         for frame_size in TestL3fwd.frame_sizes:
 
             # Prepare traffic flow
-            payload_size = frame_size - HEADER_SIZE['udp'] - \
+            payload_size = frame_size -  \
                 HEADER_SIZE['ip'] - HEADER_SIZE['eth']
-
-            flows = ['Ether()/%s/("X"*%d)' % (flow, payload_size) for flow in self.flows()[:4]]
+            for _port in range(2):
+                dmac = self.dut.get_mac_address(valports[_port])
+                flows = ['Ether(dst=%s)/%s/("X"*%d)' % (dmac, flow, payload_size) for flow in self.flows()[_port *2:(_port +1)*2]]
+                self.tester.scapy_append('wrpcap("dst%d.pcap", [%s])' %(valports[_port],string.join(flows,',')))
+            self.tester.scapy_execute() 
 
             dts.report("Flows for 2 ports, %d frame size.\n" % (frame_size),
                        annex=True)
             dts.report("%s" % string.join(flows, '\n'),
                        frame=True, annex=True)
 
-            self.tester.scapy_append('wrpcap("test2ports.pcap", [%s])' % string.join(flows, ','))
-            self.tester.scapy_execute()
 
             # Prepare the command line
             global corelist
             pat = re.compile("P([0123]),([0123]),(C\{\d.\d.\d\})")
+            
+            pat2 = re.compile("C\{\d")
+            repl1 = "C{" + str(self.port_socket)
+
             coreMask = {}
             rtCmdLines = dict(TestL3fwd.test_cases_2_ports)
             for key in rtCmdLines.keys():
                 corelist = []
                 while pat.search(rtCmdLines[key]):
+                    # Change the socket to the NIC's socket
+                    if key.find('1S')>=0:
+                        rtCmdLines[key] = pat2.sub(repl1, rtCmdLines[key])
                     rtCmdLines[key] = pat.sub(self.repl, rtCmdLines[key])
+
                 self.logger.info("%s\n" % str(corelist))
                 coreMask[key] = dts.create_mask(set(corelist))
 
@@ -589,8 +595,10 @@ class TestL3fwd(TestCase):
                             txIntf = self.tester.get_local_port(valports[rxPort - 1])
 
                         rxIntf = self.tester.get_local_port(valports[rxPort])
-
-                        tgenInput.append((txIntf, rxIntf, "test2ports.pcap"))
+                        if rxPort % 2 == 0: 
+                            tgenInput.append((txIntf, rxIntf, "dst%d.pcap" %valports[rxPort+1]))
+                        else: 
+                            tgenInput.append((txIntf, rxIntf, "dst%d.pcap" %valports[rxPort-1]))
 
                     _, pps = self.tester.traffic_generator_throughput(tgenInput)
                     self.verify(pps > 0, "No traffic detected")
-- 
2.1.0

             reply	other threads:[~2015-09-09  7:20 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-09  7:20 Qian Xu [this message]
2015-09-16  2:18 ` Liu, Yong

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1441783204-15643-1-git-send-email-qian.q.xu@intel.com \
    --to=qian.q.xu@intel.com \
    --cc=dts@dpdk.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).