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

Radosław Biernacki rad at semihalf.com
Tue Sep 5 13:27:52 CEST 2017


I understand that. But do we also understand why this table was coded in
first place?
What was the reason of deal with those nics differently even if always
access both ports?

Yong Liu is an author of this test and Ravi Kerur added the change for nics
which require only 1 port.
Lets ask them for opinion.


2017-09-05 3:58 GMT+02:00 Jianbo Liu <jianbo.liu at linaro.org>:

> On 4 September 2017 at 17:39, Radosław Biernacki <rad at semihalf.com> wrote:
> > 2017-08-21 12:30 GMT+02:00 Jianbo Liu <jianbo.liu at linaro.org>:
> >>
> >> 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")
> >
> >
> > If we access both ports from remain parts of the code, than why we check
> for
> > single port for specific platforms.
> > In other words what was was the purpose of those removed lines?
> >
>
> I saw that 2 ports were used in the tests, so I think it's better to
> remove them.
>
> >>
> >>
> >>          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
> >>
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://dpdk.org/ml/archives/dts/attachments/20170905/80db60c0/attachment.html>


More information about the dts mailing list