From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from foss.arm.com (foss.arm.com [217.140.101.70]) by dpdk.org (Postfix) with ESMTP id 220F029CA for ; Tue, 12 Sep 2017 05:32:32 +0200 (CEST) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 5B03980D; Mon, 11 Sep 2017 20:32:31 -0700 (PDT) Received: from ubuntu-jianbo.shanghai.arm.com (usa-sjc-imap-foss1.foss.arm.com [10.72.51.249]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id BD6EB3F578; Mon, 11 Sep 2017 20:32:30 -0700 (PDT) From: Jianbo Liu To: dts@dpdk.org, herbert.guan@arm.com Cc: Jianbo Liu Date: Tue, 12 Sep 2017 11:31:34 +0800 Message-Id: <1505187094-23452-1-git-send-email-jianbo.liu@linaro.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1503311443-26858-1-git-send-email-jianbo.liu@linaro.org> References: <1503311443-26858-1-git-send-email-jianbo.liu@linaro.org> Subject: [dts] [PATCH v3] 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: Tue, 12 Sep 2017 03:32:32 -0000 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 --- 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