From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-yw0-f174.google.com (mail-yw0-f174.google.com [209.85.161.174]) by dpdk.org (Postfix) with ESMTP id 32CDF58F6 for ; Mon, 4 Sep 2017 08:31:49 +0200 (CEST) Received: by mail-yw0-f174.google.com with SMTP id s187so21041198ywf.2 for ; Sun, 03 Sep 2017 23:31:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=21cY71R7XLCxKz07862Oi1fRktMltQYENt93huc4qo4=; b=AXk0FqeH64IIaxH3hoswAqJUbxU6cHYhMczv/1WnfUosZgo0T59YTeR6sP225c850E TONu+h7rftfSFkdt6qwDuD0Udqx7nQuZsp17lWHVBZxql/3zIw5kH1AEpK3xY8GKLaqL pNG6qrCSduWaBkrX6jO3Vqi0rIncGJ/rvbQ9g= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=21cY71R7XLCxKz07862Oi1fRktMltQYENt93huc4qo4=; b=sWqlvoVZzgRuCXuhA79HG2un/CSn7ZstItqc32+JzmBbFCiE6PzhLU4F7wHU++GSS/ lhQgY1QW08d+roRl9E+Xr0fp1XPKy3kGqzIaXeL+PjEjF6+Kj+jWUhWtZE6jzef00GNA FUeWMGfeprQ+DkdinZgUDjZHjJ3+DcFokipAxk7JxmVMv3V1KhfkA7ZYd0J0FFJByW4D xfc2znD9E84pVV0YtLruV3efLaOo8IVbRaIj0K7cAGYhlFzO9w7CTQsV2UbJJv1Ptx9q MRid2mOR3qjNv3fMOwanIZHx3TQN5kYBOXpCAL+vou057RpXtGvroHsElAEpwCx7cRmV 0dXQ== X-Gm-Message-State: AHPjjUg4n/Np95fxHcKWNdqfY5HAJAQNQhUNAgK9mDmF2LTLIxAg2Z04 uYdJQH+I2GgmDKsqShTzgvWdtGa2JxMH32o= X-Google-Smtp-Source: ADKCNb41nCfunJJ91UbKGg41bl36wrFL7Rz6UdPQQFxQjJYNau5NIQ8S943aQZFr1ptrMC32kDUYYxbC10LQBVBT9Ig= X-Received: by 10.129.222.2 with SMTP id k2mr6349105ywj.225.1504506708190; Sun, 03 Sep 2017 23:31:48 -0700 (PDT) MIME-Version: 1.0 Received: by 10.37.183.73 with HTTP; Sun, 3 Sep 2017 23:31:47 -0700 (PDT) In-Reply-To: <1503311443-26858-1-git-send-email-jianbo.liu@linaro.org> References: <1503311443-26858-1-git-send-email-jianbo.liu@linaro.org> From: Jianbo Liu Date: Mon, 4 Sep 2017 14:31:47 +0800 Message-ID: To: dts@dpdk.org, Herbert Guan Cc: "Xu, Qian Q" , "cc: Liu, Yong" Content-Type: text/plain; charset="UTF-8" Subject: Re: [dts] [PATCH] tests/ip_pipeline: fix test failures X-BeenThere: dts@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: test suite reviews and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 04 Sep 2017 06:31:49 -0000 Hi Yong and Qian, Have you reviewed this patch, any comments? Thanks! Jianbo On 21 August 2017 at 18:30, Jianbo Liu 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 > --- > 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 >