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

Jianbo Liu jianbo.liu at linaro.org
Mon Sep 4 11:33:22 CEST 2017


Oh, the default flow (SINK0) is 2. I will fix that in a new version. Thanks!

On 4 September 2017 at 16:50, Liu, Yong <yong.liu at intel.com> wrote:
> Hi Jianbo,
> I met one issue when trying to validate your patch. Sorry for late response, we're working on remaining issues in test suites these weeks.
>
> 04/09/2017 23:38:39        SUITE_DUT_CMD: [10.67.119.120] p 1 flow add default 3
> 04/09/2017 23:38:39     SUITE_DUT_OUTPUT: [10.67.119.120] p 1 flow add default 3^M^M
> Command "flow add default" failed
>
>
> Thanks,
> Marvin
>
>> -----Original Message-----
>> From: Jianbo Liu [mailto:jianbo.liu at linaro.org]
>> Sent: Monday, September 04, 2017 2:32 PM
>> To: dts at dpdk.org; Herbert Guan <herbert.guan at arm.com>
>> Cc: Xu, Qian Q <qian.q.xu at intel.com>; Liu, Yong <yong.liu at intel.com>
>> Subject: Re: [PATCH] tests/ip_pipeline: fix test failures
>>
>> Hi Yong and Qian,
>>
>> Have you reviewed this patch, any comments?
>>
>> Thanks!
>> Jianbo
>>
>>
>> On 21 August 2017 at 18:30, Jianbo Liu <jianbo.liu at linaro.org> wrote:
>> > The ip_pipeline was changed a lot, and the configuration and commands
>> > are different from those in this testing case.
>> >
>> > Signed-off-by: Jianbo Liu <jianbo.liu at linaro.org>
>> > ---
>> >  tests/TestSuite_ip_pipeline.py | 157 +++++++++++++++++++++++-----------
>> -------
>> >  1 file changed, 90 insertions(+), 67 deletions(-)
>> >
>> > diff --git a/tests/TestSuite_ip_pipeline.py
>> b/tests/TestSuite_ip_pipeline.py
>> > index 90dba31..300b1de 100644
>> > --- a/tests/TestSuite_ip_pipeline.py
>> > +++ b/tests/TestSuite_ip_pipeline.py
>> > @@ -124,11 +124,47 @@ class TestIPPipeline(TestCase):
>> >
>> >          writer.close()
>> >
>> > +    def create_passthrough_cfgfile(self):
>> > +        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):
>> > +        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):
>> > +        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 +186,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 +236,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 +259,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 +319,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 +346,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 +365,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 +382,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 +400,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 +416,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 +428,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 3')
>> >
>> >          # 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 +464,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 +473,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 +485,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 +503,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 +512,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 +525,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 +536,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 +545,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 +560,7 @@ class TestIPPipeline(TestCase):
>> >          """
>> >          Run after each test suite.
>> >          """
>> > +        self.dut.send_expect("rm /tmp/ip_pipeline.cfg", "#")
>> > +        self.dut.send_expect("rm /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