[dts] [PATCH v3] tests/ip_pipeline: fix test failures

Jianbo Liu jianbo.liu at linaro.org
Tue Sep 12 05:31:34 CEST 2017


The ip_pipeline was changed a lot, and the configuration and commands
are different from those in this testing case.

v2:
  - the sink0 id is 2.

v3:
  - add more comments for cfg file creations.
  - remove temporary files with force in case they don't exist.

Signed-off-by: Jianbo Liu <jianbo.liu at linaro.org>
---
 tests/TestSuite_ip_pipeline.py | 172 +++++++++++++++++++++++++----------------
 1 file changed, 105 insertions(+), 67 deletions(-)

diff --git a/tests/TestSuite_ip_pipeline.py b/tests/TestSuite_ip_pipeline.py
index 90dba31..76a477f 100644
--- a/tests/TestSuite_ip_pipeline.py
+++ b/tests/TestSuite_ip_pipeline.py
@@ -124,11 +124,62 @@ class TestIPPipeline(TestCase):
 
         writer.close()
 
+    def create_passthrough_cfgfile(self):
+        """
+        Create configuration file for passthrough pipeline.
+        Two ports are connected as follows: RXQ0.0 -> TXQ1.0, RXQ1.0 -> TXQ0.0.
+        """
+
+        self.dut.send_expect('echo [PIPELINE0] > /tmp/ip_pipeline.cfg', '#')
+        self.dut.send_expect('echo type = MASTER >> /tmp/ip_pipeline.cfg', '#')
+        self.dut.send_expect('echo core = 0 >> /tmp/ip_pipeline.cfg', '#')
+        self.dut.send_expect('echo [PIPELINE1] >> /tmp/ip_pipeline.cfg', '#')
+        self.dut.send_expect('echo type = PASS-THROUGH >> /tmp/ip_pipeline.cfg', '#')
+        self.dut.send_expect('echo core = 1 >> /tmp/ip_pipeline.cfg', '#')
+        self.dut.send_expect('echo pktq_in = RXQ0.0 RXQ1.0 >> /tmp/ip_pipeline.cfg', '#')
+        self.dut.send_expect('echo pktq_out = TXQ1.0 TXQ0.0 >> /tmp/ip_pipeline.cfg', '#')
+
+    def create_routing_cfgfile(self):
+        """
+        Create configuration file for ip routing pipeline.
+        It is mainly to set ip header offset and arp key offset in the packet buffer.
+        """
+
+        self.dut.send_expect('echo [PIPELINE0] > /tmp/ip_pipeline.cfg', '#')
+        self.dut.send_expect('echo type = MASTER >> /tmp/ip_pipeline.cfg', '#')
+        self.dut.send_expect('echo core = 0 >> /tmp/ip_pipeline.cfg', '#')
+        self.dut.send_expect('echo [PIPELINE1] >> /tmp/ip_pipeline.cfg', '#')
+        self.dut.send_expect('echo type = ROUTING >> /tmp/ip_pipeline.cfg', '#')
+        self.dut.send_expect('echo core = 1 >> /tmp/ip_pipeline.cfg', '#')
+        self.dut.send_expect('echo pktq_in = RXQ0.0 RXQ1.0 >> /tmp/ip_pipeline.cfg', '#')
+        self.dut.send_expect('echo pktq_out = TXQ0.0 TXQ1.0 >> /tmp/ip_pipeline.cfg', '#')
+        self.dut.send_expect('echo encap = ethernet >> /tmp/ip_pipeline.cfg', '#')
+        self.dut.send_expect('echo ip_hdr_offset = 270 >> /tmp/ip_pipeline.cfg', '#')
+        self.dut.send_expect('echo arp_key_offset = 128 >> /tmp/ip_pipeline.cfg', '#')
+        self.dut.send_expect('echo n_arp_entries = 1000 >> /tmp/ip_pipeline.cfg', '#')
+
+    def create_flow_cfgfile(self):
+        """
+        Create configuration file for flow classification pipeline.
+        It is mainly to set key size, offset and mask to get the ipv4 5-tuple.
+        """
+
+        self.dut.send_expect('echo [PIPELINE0] > /tmp/ip_pipeline.cfg', '#')
+        self.dut.send_expect('echo type = MASTER >> /tmp/ip_pipeline.cfg', '#')
+        self.dut.send_expect('echo core = 0 >> /tmp/ip_pipeline.cfg', '#')
+        self.dut.send_expect('echo [PIPELINE1] >> /tmp/ip_pipeline.cfg', '#')
+        self.dut.send_expect('echo type = FLOW_CLASSIFICATION >> /tmp/ip_pipeline.cfg', '#')
+        self.dut.send_expect('echo core = 1 >> /tmp/ip_pipeline.cfg', '#')
+        self.dut.send_expect('echo pktq_in = RXQ0.0 RXQ1.0 >> /tmp/ip_pipeline.cfg', '#')
+        self.dut.send_expect('echo pktq_out = TXQ0.0 TXQ1.0 SINK0 >> /tmp/ip_pipeline.cfg', '#')
+        self.dut.send_expect('echo n_flows = 65536 >> /tmp/ip_pipeline.cfg', '#')
+        self.dut.send_expect('echo key_size = 16 >> /tmp/ip_pipeline.cfg', '#')
+        self.dut.send_expect('echo key_offset = 278 >> /tmp/ip_pipeline.cfg', '#')
+        self.dut.send_expect('echo key_mask = 00FF0000FFFFFFFFFFFFFFFFFFFFFFFF >> /tmp/ip_pipeline.cfg', '#')
+        self.dut.send_expect('echo flowid_offset = 128 >> /tmp/ip_pipeline.cfg', '#')
+
     def start_ip_pipeline(self, ports):
-        command_line = "./examples/ip_pipeline/build/ip_pipeline -c %s -n %d -- -p %s" % \
-            (self.coremask,
-             self.dut.get_memory_channels(),
-             ports)
+        command_line = "./examples/ip_pipeline/build/ip_pipeline -p %s -f /tmp/ip_pipeline.cfg" % ports
 
         out = self.dut.send_expect(command_line, 'pipeline>', 60)
         sleep(5)    # 'Initialization completed' is not the last output, some
@@ -150,10 +201,10 @@ class TestIPPipeline(TestCase):
         """
 
         for iface in ifaces:
+            command = ('rm -f tcpdump_{0}.pcap').format(iface)
+            self.tester.send_expect(command, '#')
             command = (
                 'tcpdump -w tcpdump_{0}.pcap -i {0} 2>tcpdump_{0}.out &').format(iface)
-            self.tester.send_expect(
-                'rm -f tcpdump_{0}.pcap', '#').format(iface)
             self.tester.send_expect(command, '#')
 
     def tcpdump_stop_sniff(self):
@@ -200,15 +251,13 @@ class TestIPPipeline(TestCase):
 
         tx_port = self.tester.get_local_port(self.dut_ports[from_port])
         rx_port = self.tester.get_local_port(self.dut_ports[to_port])
+        port0 = self.tester.get_local_port(self.dut_ports[0])
 
         tx_interface = self.tester.get_interface(tx_port)
         rx_interface = self.tester.get_interface(rx_port)
 
         self.tcpdump_start_sniffing([tx_interface, rx_interface])
 
-        self.dut.send_expect('link 0 up', 'pipeline>')
-        self.dut.send_expect('link 1 up', 'pipeline>')
-
         timeout = frames_number * inter + 2
         inter = ", inter=%d" % inter
 
@@ -225,64 +274,58 @@ class TestIPPipeline(TestCase):
 
         self.tcpdump_stop_sniff()
 
-        self.dut.send_expect('link 0 down', 'pipeline>')
-        self.dut.send_expect('link 1 down', 'pipeline>')
-
         rx_stats = self.number_of_packets('tcpdump_%s.pcap' % rx_interface)
         tx_stats = self.number_of_packets('tcpdump_%s.pcap' % tx_interface)
 
         # Do not count the sent frames in the tx_interface
         tx_stats = tx_stats - frames_number
 
-        return {'rx': rx_stats, 'tx': tx_stats}
+        if port0 == tx_port:
+            return {'rx0': tx_stats, 'rx1': rx_stats}
+        else:
+            return {'rx0': rx_stats, 'rx1': tx_stats}
 
     def check_results(self, stats, expected):
         """
-        This function check that the Rx and Tx stats matches the expected.
-        expected = [Rx, Tx]
+        This function check that the received packet numbers of port0 and port1 match the expected.
+        expected = [Rx0, Rx1]
         """
 
-        for port in ['rx', 'tx']:
+        for port in ['rx0', 'rx1']:
             self.verify(stats[port] == expected[port],
                         'Frames expected (%s) and received (%s) mismatch on %s port' % (
                 expected[port], stats[port], port))
 
     def pipeline_command(self, command):
         out = self.dut.send_expect(command, 'pipeline>')
-        self.verify("Illegal" not in out, "Pipeline command error 1: '%s'" % command)
-        self.verify("Bad" not in out, "Pipeline command error 2: '%s'" % command)
+        self.verify("arguments" not in out, "Incorrect arguments: '%s'" % command)
+        self.verify("Invalid" not in out, "Invalid argument: '%s'" % command)
+        self.verify("Syntax error" not in out, "Syntax error: '%s'" % command)
         return out
 
-    def pipeline_add_flow(self, port, src_ip, dst_ip, src_port, dst_port,
+    def pipeline_add_flow(self, port, src_ip, dst_ip, src_port, dst_port, flowid,
                           protocol=6):
-        command = 'flow add %s %s %d %d %d %d' % (src_ip, dst_ip, src_port,
-                                                  dst_port, protocol, port)
+        command = 'p 1 flow add ipv4 %s %s %d %d %d port %d id %d' % (src_ip, dst_ip, src_port,
+                                                  dst_port, protocol, port, flowid)
         out = self.pipeline_command(command)
-        self.verify("Adding flow" in out, "Add flow error")
+        self.verify("failed" not in out, "Add flow error")
 
     def pipeline_del_flow(self, src_ip, dst_ip, src_port, dst_port,
                           protocol=6):
-        command = 'flow del %s %s %d %d %d' % (src_ip, dst_ip, src_port,
+        command = 'p 1 flow del ipv4 %s %s %d %d %d' % (src_ip, dst_ip, src_port,
                                                dst_port, protocol)
         out = self.pipeline_command(command)
-        self.verify("Deleting flow" in out, "Del flow error")
+        self.verify("failed" not in out, "Del flow error")
 
     def pipeline_add_route(self, port, src_ip, netmask, gw_ip):
-        command = 'route add %s %d %d %s' % (src_ip, netmask, port, gw_ip)
+        command = 'p 1 route add %s %d port %d ether %s' % (src_ip, netmask, port, gw_ip)
         out = self.pipeline_command(command)
-        self.verify("Adding route" in out, "Add route error")
+        self.verify("failed" not in out, "Add route error")
 
     def pipeline_del_route(self, src_ip, netmask):
-        command = 'route del %s %d' % (src_ip, netmask)
+        command = 'p 1 route del %s %d' % (src_ip, netmask)
         out = self.pipeline_command(command)
-        self.verify("Deleting route" in out, "Del route error")
-
-    def pipeline_traffic_burst(self):
-        self.dut.send_expect('link 0 up', 'pipeline>')
-        self.dut.send_expect('link 1 up', 'pipeline>')
-        sleep(0.1)
-        self.dut.send_expect('link 0 down', 'pipeline>')
-        self.dut.send_expect('link 1 down', 'pipeline>')
+        self.verify("failed" not in out, "Del route error")
 
     def set_up_all(self):
         """
@@ -291,14 +334,8 @@ class TestIPPipeline(TestCase):
         PMD prerequisites.
         """
 
-        # Check for port availability
-        self.needed_ports = {"niantic": 2,
-                             "I217V": 1,
-                             "I217LM": 1,
-                             "I218V": 1,
-                             "I218LM": 1}
         self.dut_ports = self.dut.get_ports()
-        self.verify(len(self.dut_ports) >= self.needed_ports[self.nic],
+        self.verify(len(self.dut_ports) >= 2,
                     "Insufficient ports for speed testing")
 
         out = self.dut.build_dpdk_apps("./examples/ip_pipeline")
@@ -324,9 +361,10 @@ class TestIPPipeline(TestCase):
         pcap_file = 'ip_pipeline.pcap'
         frame_size = 64
 
+        self.create_passthrough_cfgfile()
         self.start_ip_pipeline(ports=self.ports_mask)
         self.dut.send_expect(
-            'run examples/ip_pipeline/ip_pipeline.sh', 'pipeline>', 10)
+            'run examples/ip_pipeline/config/ip_pipeline.sh', 'pipeline>', 10)
 
         # Create a PCAP file containing the maximum frames_number of frames needed
         # with fixed size and incremental IP
@@ -342,13 +380,13 @@ class TestIPPipeline(TestCase):
                 stats = self.send_and_sniff_pcap_file(pcap_file, frames_number,
                                                       1, 0, inter)
 
-                expected = {'tx': 0, 'rx': frames_number}
+                expected = {'rx0': frames_number, 'rx1': 0}
                 self.check_results(stats, expected)
 
                 stats = self.send_and_sniff_pcap_file(pcap_file, frames_number,
                                                       0, 1, inter)
 
-                expected = {'tx': frames_number, 'rx': 0}
+                expected = {'rx0': 0, 'rx1': frames_number}
                 self.check_results(stats, expected)
 
     def test_frame_sizes(self):
@@ -359,9 +397,10 @@ class TestIPPipeline(TestCase):
         frames_number = 100
         inter = 0.5
 
+        self.create_passthrough_cfgfile()
         self.start_ip_pipeline(ports=self.ports_mask)
         self.dut.send_expect(
-            'run examples/ip_pipeline/ip_pipeline.sh', 'pipeline>', 10)
+            'run examples/ip_pipeline/config/ip_pipeline.sh', 'pipeline>', 10)
 
         for frame_size in TestIPPipeline.frame_sizes:
 
@@ -376,13 +415,13 @@ class TestIPPipeline(TestCase):
             stats = self.send_and_sniff_pcap_file(pcap_file, frames_number,
                                                   1, 0, inter)
 
-            expected = {'tx': 0, 'rx': frames_number}
+            expected = {'rx0': frames_number, 'rx1': 0}
             self.check_results(stats, expected)
 
             stats = self.send_and_sniff_pcap_file(pcap_file, frames_number,
                                                   0, 1, inter)
 
-            expected = {'tx': frames_number, 'rx': 0}
+            expected = {'rx0': 0, 'rx1': frames_number}
             self.check_results(stats, expected)
 
     def test_flow_management(self):
@@ -392,11 +431,6 @@ class TestIPPipeline(TestCase):
         pcap_file = 'ip_pipeline.pcap'
         frame_size = 64
 
-        default_setup = ['arp add 0 0.0.0.1 0a:0b:0c:0d:0e:0f',
-                         'arp add 1 0.128.0.1 1a:1b:1c:1d:1e:1f',
-                         'route add 0.0.0.0 9 0 0.0.0.1',
-                         'route add 0.128.0.0 9 1 0.128.0.1']
-
         ip_addrs = [
             '0.0.0.0', '0.0.0.1', '0.0.0.127', '0.0.0.128', '0.0.0.255',
             '0.0.1.0', '0.0.127.0', '0.0.128.0', '0.0.129.0', '0.0.255.0',
@@ -409,30 +443,32 @@ class TestIPPipeline(TestCase):
             frames.append(self.create_tcp_ipv4_frame(0, '0.0.0.0', addr,
                                                      frame_size))
 
+        self.create_flow_cfgfile()
         self.create_pcap_file_from_frames(pcap_file, frames)
         self.tester.session.copy_file_to(pcap_file)
 
         # Start ip_pipeline app and setup defaults
         self.start_ip_pipeline(ports=self.ports_mask)
-        for command in default_setup:
-            self.pipeline_command(command)
+
+        # default to SINK0
+        self.pipeline_command('p 1 flow add default 2')
 
         # Check that no traffic pass though
         stats = self.send_and_sniff_pcap_file(pcap_file, len(frames),
                                               1, 0, 0.2)
-        expected = {'tx': 0, 'rx': 0}
+        expected = {'rx0': 0, 'rx1': 0}
         self.check_results(stats, expected)
 
         # Add the flows
         flows_added = 0
         for addrs in ip_addrs:
-            self.pipeline_add_flow(1, '0.0.0.0', addrs, 0, 0)
+            self.pipeline_add_flow(0, '0.0.0.0', addrs, 0, 0, flows_added)
             flows_added += 1
 
             # Check that traffic matching flows pass though
             stats = self.send_and_sniff_pcap_file(pcap_file, len(frames),
                                                   1, 0, 0.2)
-            expected = {'tx': 0, 'rx': flows_added}
+            expected = {'rx0': flows_added, 'rx1': 0}
             self.check_results(stats, expected)
 
         # Remove flows
@@ -443,7 +479,7 @@ class TestIPPipeline(TestCase):
             # Check that traffic matching flows pass though
             stats = self.send_and_sniff_pcap_file(pcap_file, len(frames),
                                                   1, 0, 0.2)
-            expected = {'tx': 0, 'rx': flows_added}
+            expected = {'rx0': flows_added, 'rx1': 0}
             self.check_results(stats, expected)
 
         out = self.dut.send_expect('flow print', 'pipeline>')
@@ -452,7 +488,7 @@ class TestIPPipeline(TestCase):
         # Check that again no traffic pass though
         stats = self.send_and_sniff_pcap_file(pcap_file, len(frames),
                                               1, 0, 0.2)
-        expected = {'tx': 0, 'rx': 0}
+        expected = {'rx0': 0, 'rx1': 0}
         self.check_results(stats, expected)
 
         self.quit_ip_pipeline()
@@ -464,9 +500,8 @@ class TestIPPipeline(TestCase):
         pcap_file = 'ip_pipeline.pcap'
         frame_size = 64
 
-        default_setup = ['arp add 0 0.0.0.1 0a:0b:0c:0d:0e:0f',
-                         'arp add 1 0.128.0.1 1a:1b:1c:1d:1e:1f',
-                         'flow add all']
+        default_setup = ['p 1 arp add 0 0.0.0.1 0a:0b:0c:0d:0e:0f',
+                         'p 1 arp add 1 0.128.0.1 1a:1b:1c:1d:1e:1f']
 
         ip_addrs = [
             '0.0.0.0', '0.0.0.1', '0.0.0.127', '0.0.0.128', '0.0.0.255',
@@ -483,6 +518,7 @@ class TestIPPipeline(TestCase):
         self.create_pcap_file_from_frames(pcap_file, frames)
         self.tester.session.copy_file_to(pcap_file)
 
+        self.create_routing_cfgfile()
         # Start ip_pipeline app and setup defaults
         self.start_ip_pipeline(ports=self.ports_mask)
         for command in default_setup:
@@ -491,7 +527,7 @@ class TestIPPipeline(TestCase):
         # Check that no traffic pass though
         stats = self.send_and_sniff_pcap_file(pcap_file, len(frames),
                                               1, 0, 0.2)
-        expected = {'tx': 0, 'rx': 0}
+        expected = {'rx0': 0, 'rx1': 0}
         self.check_results(stats, expected)
 
         # Add the routes
@@ -504,7 +540,7 @@ class TestIPPipeline(TestCase):
             stats = self.send_and_sniff_pcap_file(pcap_file, len(frames),
                                                   1, 0, 0.2)
 
-            expected = {'tx': 0, 'rx': routes_added}
+            expected = {'rx0': routes_added, 'rx1': 0}
             self.check_results(stats, expected)
 
         # Remove routes
@@ -515,7 +551,7 @@ class TestIPPipeline(TestCase):
             # Check that traffic matching flows pass though
             stats = self.send_and_sniff_pcap_file(pcap_file, len(frames),
                                                   1, 0, 0.2)
-            expected = {'tx': 0, 'rx': routes_added}
+            expected = {'rx0': routes_added, 'rx1': 0}
             self.check_results(stats, expected)
 
         out = self.dut.send_expect('route print', 'pipeline>')
@@ -524,7 +560,7 @@ class TestIPPipeline(TestCase):
         # Check that again no traffic pass though
         stats = self.send_and_sniff_pcap_file(pcap_file, len(frames),
                                               1, 0, 0.2)
-        expected = {'tx': 0, 'rx': 0}
+        expected = {'rx0': 0, 'rx1': 0}
         self.check_results(stats, expected)
 
         self.quit_ip_pipeline()
@@ -539,5 +575,7 @@ class TestIPPipeline(TestCase):
         """
         Run after each test suite.
         """
+        self.dut.send_expect("rm -f /tmp/ip_pipeline.cfg", "#")
+        self.dut.send_expect("rm -f /tmp/ip_pipeline.cfg.out", "#")
         out = self.dut.build_dpdk_apps("./examples/ip_pipeline")
         self.verify("Error" not in out, "Compilation error")
-- 
1.9.1



More information about the dts mailing list