From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wr0-f171.google.com (mail-wr0-f171.google.com [209.85.128.171]) by dpdk.org (Postfix) with ESMTP id 8A7057CA9 for ; Mon, 4 Sep 2017 11:39:53 +0200 (CEST) Received: by mail-wr0-f171.google.com with SMTP id n33so3028406wrn.4 for ; Mon, 04 Sep 2017 02:39:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=semihalf-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=ask11cZaDojSwfQps0RfB1R/aHTDiMKt6NHiLSokQPA=; b=LrL3K0hVOUJZ5EVHtiq197TXIRSatRq8e2WgSkjb01Y3hRLq6wFA1M3Ntaic/9SsPF fWGYgpWxNwtVnZqbUqWc6T1G2i3zfSxYGYiyZyl3KQYTdtAYIs7XZJ+dDcXNSIi/vkWG YQQsvnItIzLIQs2NtsmFeGbKC60+v+Lv7VFshloA8nyKevfvVxwTfhvkxcKLAAEyMb6C pQ664qgk07aBq26rNrMrask2hZ9HjownVyVPd2MAXku0n6FMQq7yP+p3q4cXDsDpKhvJ QSt0MURCK4QyfFBb8DCDNBiVk42sp8Ti19REv3b7JqNME9nTHRG4M68F8TzFaUGGgchE czXA== 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=ask11cZaDojSwfQps0RfB1R/aHTDiMKt6NHiLSokQPA=; b=ovZsYr1Mmx7m/fGCcIkwg4jruFw70iZpK8aHMHJOPO5SrWgsqY2jCsCjZsKaRRt0x0 8VMBhCn6CYnlU8VxYyHbcEBrGMp09leInDvod/VVL00F/B/0ABIpuY0MqjB6tuFK3xtH ZeJWGpuSmYI5XBe818r0QnJpbLvZSNrMhUxDemmBAYCzc0udHk6irpQvdlkDROvYq+bf IW9mJu3Ra4gF/ezlq9zwROMUX1wJXbatgKsAXgUTJI+68oSs+YhMvuWWjsR3rsJSmaIp 1tOKt+qDLI3k73961lmqfWcIl1dEetn2gOFLFgVXMB6sFs9xqyidQsMJE6MaQyIuTJT4 IeNg== X-Gm-Message-State: AHPjjUjMDPuH/6MqnIXPRXv85h+lZXGL4e6t3+/sjuS/P1EirAuWM64R Y1Ha7u5/Ns8tOiJ0lp3mVawpOumUYD7uE93flw== X-Google-Smtp-Source: ADKCNb7fHjBIFg331Ku2UBOaV7bugoGG1OHMONVsNo6xQ7GDI0bSYi1L+qwiGEFfaI2Ewvm0pH1nhLOZ/ITVTLrf8A0= X-Received: by 10.223.131.35 with SMTP id 32mr2236194wrd.40.1504517992572; Mon, 04 Sep 2017 02:39:52 -0700 (PDT) MIME-Version: 1.0 Received: by 10.223.196.15 with HTTP; Mon, 4 Sep 2017 02:39:32 -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: =?UTF-8?Q?Rados=C5=82aw_Biernacki?= Date: Mon, 4 Sep 2017 11:39:32 +0200 Message-ID: To: Jianbo Liu Cc: dts@dpdk.org, herbert.guan@arm.com Content-Type: multipart/alternative; boundary="94eb2c0d0cd681af0e055859e46a" 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 09:39:53 -0000 --94eb2c0d0cd681af0e055859e46a Content-Type: text/plain; charset="UTF-8" 2017-08-21 12:30 GMT+02:00 Jianbo Liu : > 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") > 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? > > 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 > > --94eb2c0d0cd681af0e055859e46a Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
2017= -08-21 12:30 GMT+02:00 Jianbo Liu <jianbo.liu@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 <jian= bo.liu@linaro.org>
---
=C2=A0tests/TestSuite_ip_pipeline.py | 157 +++++++++++++++++++++++------------------
=C2=A01 file changed, 90 insertions(+), 67 deletions(-)

diff --git a/tests/TestSuite_ip_pipeline.py b/tests/TestSuite_ip_pipel= ine.py
index 90dba31..300b1de 100644
--- a/tests/TestSuite_ip_pipeline.py
+++ b/tests/TestSuite_ip_pipeline.py
@@ -124,11 +124,47 @@ class TestIPPipeline(TestCase):

=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0writer.close()

+=C2=A0 =C2=A0 def create_passthrough_cfgfile(self):
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('echo [PIPELINE0] >= ; /tmp/ip_pipeline.cfg', '#')
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('echo type =3D MASTER= >> /tmp/ip_pipeline.cfg', '#')
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('echo core =3D 0 >= > /tmp/ip_pipeline.cfg', '#')
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('echo [PIPELINE1] >= ;> /tmp/ip_pipeline.cfg', '#')
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('echo type =3D PASS-T= HROUGH >> /tmp/ip_pipeline.cfg', '#')
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('echo core =3D 1 >= > /tmp/ip_pipeline.cfg', '#')
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('echo pktq_in =3D RXQ= 0.0 RXQ1.0 >> /tmp/ip_pipeline.cfg', '#')
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('echo pktq_out =3D TX= Q1.0 TXQ0.0 >> /tmp/ip_pipeline.cfg', '#')
+
+=C2=A0 =C2=A0 def create_routing_cfgfile(self):
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('echo [PIPELINE0] >= ; /tmp/ip_pipeline.cfg', '#')
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('echo type =3D MASTER= >> /tmp/ip_pipeline.cfg', '#')
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('echo core =3D 0 >= > /tmp/ip_pipeline.cfg', '#')
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('echo [PIPELINE1] >= ;> /tmp/ip_pipeline.cfg', '#')
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('echo type =3D ROUTIN= G >> /tmp/ip_pipeline.cfg', '#')
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('echo core =3D 1 >= > /tmp/ip_pipeline.cfg', '#')
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('echo pktq_in =3D RXQ= 0.0 RXQ1.0 >> /tmp/ip_pipeline.cfg', '#')
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('echo pktq_out =3D TX= Q0.0 TXQ1.0 >> /tmp/ip_pipeline.cfg', '#')
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('echo encap =3D ether= net >> /tmp/ip_pipeline.cfg', '#')
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('echo ip_hdr_offset = =3D 270 >> /tmp/ip_pipeline.cfg', '#')
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('echo arp_key_offset = =3D 128 >> /tmp/ip_pipeline.cfg', '#')
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('echo n_arp_entries = =3D 1000 >> /tmp/ip_pipeline.cfg', '#')
+
+=C2=A0 =C2=A0 def create_flow_cfgfile(self):
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('echo [PIPELINE0] >= ; /tmp/ip_pipeline.cfg', '#')
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('echo type =3D MASTER= >> /tmp/ip_pipeline.cfg', '#')
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('echo core =3D 0 >= > /tmp/ip_pipeline.cfg', '#')
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('echo [PIPELINE1] >= ;> /tmp/ip_pipeline.cfg', '#')
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('echo type =3D FLOW_C= LASSIFICATION >> /tmp/ip_pipeline.cfg', '#')
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('echo core =3D 1 >= > /tmp/ip_pipeline.cfg', '#')
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('echo pktq_in =3D RXQ= 0.0 RXQ1.0 >> /tmp/ip_pipeline.cfg', '#')
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('echo pktq_out =3D TX= Q0.0 TXQ1.0 SINK0 >> /tmp/ip_pipeline.cfg', '#')
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('echo n_flows =3D 655= 36 >> /tmp/ip_pipeline.cfg', '#')
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('echo key_size =3D 16= >> /tmp/ip_pipeline.cfg', '#')
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('echo key_offset =3D = 278 >> /tmp/ip_pipeline.cfg', '#')
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('echo key_mask =3D 00= FF0000FFFFFFFFFFFFFFFFFFFFFFFF >> /tmp/ip_pipeline.cfg', = 9;#')
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('echo flowid_offset = =3D 128 >> /tmp/ip_pipeline.cfg', '#')
+
=C2=A0 =C2=A0 =C2=A0def start_ip_pipeline(self, ports):
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 command_line =3D "./examples/ip_pipeline/= build/ip_pipeline -c %s -n %d -- -p %s" % \
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (self.coremask,
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0self.dut.get_memory_channe= ls(),
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ports)
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 command_line =3D "./examples/ip_pipeline/= build/ip_pipeline -p %s -f /tmp/ip_pipeline.cfg" % ports

=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0out =3D self.dut.send_expect(command_line, 'pipeline>', 60)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0sleep(5)=C2=A0 =C2=A0 # 'Initializati= on completed' is not the last output, some
@@ -150,10 +186,10 @@ class TestIPPipeline(TestCase):
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"""

=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0for iface in ifaces:
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 command =3D ('rm -f tcpdump_= {0}.pcap').format(iface)
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.tester.send_expect(com= mand, '#')
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0command =3D (
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'tcpdump = -w tcpdump_{0}.pcap -i {0} 2>tcpdump_{0}.out &').format(iface) -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.tester.send_expect(
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'rm -f tcpdump= _{0}.pcap', '#').format(iface)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0self.tester.send_expect(command, '#')

=C2=A0 =C2=A0 =C2=A0def tcpdump_stop_sniff(self):
@@ -200,15 +236,13 @@ class TestIPPipeline(TestCase):

=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0tx_port =3D self.tester.get_local_port(self.dut_ports[from_port])
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0rx_port =3D self.tester.get_local_port(self.dut_ports[to_port])
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 port0 =3D self.tester.get_local_port(self= .dut_ports[0])

=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0tx_interface =3D self.tester.get_interfac= e(tx_port)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0rx_interface =3D self.tester.get_interfac= e(rx_port)

=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0self.tcpdump_start_sniffing([tx_inte= rface, rx_interface])

-=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('link 0 up', '= ;pipeline>')
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('link 1 up', '= ;pipeline>')
-
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0timeout =3D frames_number * inter + 2
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0inter =3D ", inter=3D%d" % inte= r

@@ -225,64 +259,58 @@ class TestIPPipeline(TestCase):

=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0self.tcpdump_stop_sniff()

-=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('link 0 down', &#= 39;pipeline>')
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('link 1 down', &#= 39;pipeline>')
-
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0rx_stats =3D self.number_of_packets('= tcpdump_%s.pcap' % rx_interface)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0tx_stats =3D self.number_of_packets('= tcpdump_%s.pcap' % tx_interface)

=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0# Do not count the sent frames in the tx_= interface
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0tx_stats =3D tx_stats - frames_number

-=C2=A0 =C2=A0 =C2=A0 =C2=A0 return {'rx': rx_stats, 'tx': = tx_stats}
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 if port0 =3D=3D tx_port:
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return {'rx0': tx_stats,= 'rx1': rx_stats}
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 else:
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return {'rx0': rx_stats,= 'rx1': tx_stats}

=C2=A0 =C2=A0 =C2=A0def check_results(self, stats, expected):
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"""
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 This function check that the Rx and Tx stats m= atches the expected.
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 expected =3D [Rx, Tx]
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 This function check that the received packet n= umbers of port0 and port1 match the expected.
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 expected =3D [Rx0, Rx1]
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"""

-=C2=A0 =C2=A0 =C2=A0 =C2=A0 for port in ['rx', 'tx']:
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 for port in ['rx0', 'rx1']: =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0self.verify(stats[port] =3D= =3D expected[port],
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0'Frames expected (%s) and received (%s) mismatch on %s= port' % (
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0expected[port= ], stats[port], port))

=C2=A0 =C2=A0 =C2=A0def pipeline_command(self, command):
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0out =3D self.dut.send_expect(command, = 9;pipeline>')
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.verify("Illegal" not in out, &q= uot;Pipeline command error 1: '%s'" % command)
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.verify("Bad" not in out, "= Pipeline command error 2: '%s'" % command)
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.verify("arguments" not in out, = "Incorrect arguments: '%s'" % command)
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.verify("Invalid" not in out, &q= uot;Invalid argument: '%s'" % command)
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.verify("Syntax error" not in ou= t, "Syntax error: '%s'" % command)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0return out

-=C2=A0 =C2=A0 def pipeline_add_flow(self, port, src_ip, dst_ip, src_port, = dst_port,
+=C2=A0 =C2=A0 def pipeline_add_flow(self, port, src_ip, dst_ip, src_port, = dst_port, flowid,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0protocol=3D6):
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 command =3D 'flow add %s %s %d %d %d %d= 9; % (src_ip, dst_ip, src_port,
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 dst_port, protocol, port)
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 command =3D 'p 1 flow add ipv4 %s %s %d %d= %d port %d id %d' % (src_ip, dst_ip, src_port,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 dst_port, protocol, port, flowid)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0out =3D self.pipeline_command(command) -=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.verify("Adding flow" in out, &q= uot;Add flow error")
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.verify("failed" not in out, &qu= ot;Add flow error")

=C2=A0 =C2=A0 =C2=A0def pipeline_del_flow(self, src_ip, dst_ip, src_port, d= st_port,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0protocol=3D6):
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 command =3D 'flow del %s %s %d %d %d' = % (src_ip, dst_ip, src_port,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 command =3D 'p 1 flow del ipv4 %s %s %d %d= %d' % (src_ip, dst_ip, src_port,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 dst_port, protocol)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0out =3D self.pipeline_command(command) -=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.verify("Deleting flow" in out, = "Del flow error")
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.verify("failed" not in out, &qu= ot;Del flow error")

=C2=A0 =C2=A0 =C2=A0def pipeline_add_route(self, port, src_ip, netmask, gw_= ip):
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 command =3D 'route add %s %d %d %s' % = (src_ip, netmask, port, gw_ip)
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 command =3D 'p 1 route add %s %d port %d e= ther %s' % (src_ip, netmask, port, gw_ip)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0out =3D self.pipeline_command(command) -=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.verify("Adding route" in out, &= quot;Add route error")
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.verify("failed" not in out, &qu= ot;Add route error")

=C2=A0 =C2=A0 =C2=A0def pipeline_del_route(self, src_ip, netmask):
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 command =3D 'route del %s %d' % (src_i= p, netmask)
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 command =3D 'p 1 route del %s %d' % (s= rc_ip, netmask)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0out =3D self.pipeline_command(command) -=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.verify("Deleting route" in out,= "Del route error")
-
-=C2=A0 =C2=A0 def pipeline_traffic_burst(self):
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('link 0 up', '= ;pipeline>')
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('link 1 up', '= ;pipeline>')
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 sleep(0.1)
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('link 0 down', &#= 39;pipeline>')
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect('link 1 down', &#= 39;pipeline>')
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.verify("failed" not in out, &qu= ot;Del route error")

=C2=A0 =C2=A0 =C2=A0def set_up_all(self):
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"""
@@ -291,14 +319,8 @@ class TestIPPipeline(TestCase):
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0PMD prerequisites.
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"""

-=C2=A0 =C2=A0 =C2=A0 =C2=A0 # Check for port availability
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.needed_ports =3D {"niantic": 2,=
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"I217V": 1,
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"I217LM": 1,
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"I218V": 1,
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"I218LM": 1}
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0self.dut_ports =3D self.dut.get_ports() -=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.verify(len(self.dut_ports) >=3D s= elf.needed_ports[self.nic],
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.verify(len(self.dut_ports) >=3D 2= ,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0"Insufficient ports for speed testing")
<= br>
If we access both ports from remain parts of the code, than w= hy we check for single port for specific platforms.
In other = words what was was the purpose of those removed lines?
=C2=A0

=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0out =3D self.dut.build_dpdk_apps("./= examples/ip_pipeline")
@@ -324,9 +346,10 @@ class TestIPPipeline(TestCase):
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pcap_file =3D 'ip_pipeline.pcap'<= br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0frame_size =3D 64

+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.create_passthrough_cfgfile()
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0self.start_ip_pipeline(ports=3Dself.= ports_mask)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0self.dut.send_expect(
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'run examples/ip_pipeline/ip= _pipeline.sh', 'pipeline>', 10)
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'run examples/ip_pipeline/co= nfig/ip_pipeline.sh', 'pipeline>', 10)

=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0# Create a PCAP file containing the maxim= um frames_number of frames needed
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0# with fixed size and incremental IP
@@ -342,13 +365,13 @@ class TestIPPipeline(TestCase):
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0stats =3D sel= f.send_and_sniff_pcap_file(pcap_file, frames_number,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A01, 0, inter)

-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 expected =3D {'= ;tx': 0, 'rx': frames_number}
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 expected =3D {'= ;rx0': frames_number, 'rx1': 0}
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0self.check_re= sults(stats, expected)

=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0stats =3D sel= f.send_and_sniff_pcap_file(pcap_file, frames_number,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A00, 1, inter)

-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 expected =3D {'= ;tx': frames_number, 'rx': 0}
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 expected =3D {'= ;rx0': 0, 'rx1': frames_number}
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0self.check_re= sults(stats, expected)

=C2=A0 =C2=A0 =C2=A0def test_frame_sizes(self):
@@ -359,9 +382,10 @@ class TestIPPipeline(TestCase):
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0frames_number =3D 100
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0inter =3D 0.5

+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.create_passthrough_cfgfile()
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0self.start_ip_pipeline(ports=3Dself.= ports_mask)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0self.dut.send_expect(
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'run examples/ip_pipeline/ip= _pipeline.sh', 'pipeline>', 10)
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'run examples/ip_pipeline/co= nfig/ip_pipeline.sh', 'pipeline>', 10)

=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0for frame_size in TestIPPipeline.frame_si= zes:

@@ -376,13 +400,13 @@ class TestIPPipeline(TestCase):
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0stats =3D self.send_and_sni= ff_pcap_file(pcap_file, frames_number,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A01, 0, inter)

-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 expected =3D {'tx': 0, &= #39;rx': frames_number}
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 expected =3D {'rx0': fra= mes_number, 'rx1': 0}
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0self.check_results(stats, e= xpected)

=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0stats =3D self.send_and_sni= ff_pcap_file(pcap_file, frames_number,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A00, 1, inter)

-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 expected =3D {'tx': fram= es_number, 'rx': 0}
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 expected =3D {'rx0': 0, = 'rx1': frames_number}
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0self.check_results(stats, e= xpected)

=C2=A0 =C2=A0 =C2=A0def test_flow_management(self):
@@ -392,11 +416,6 @@ class TestIPPipeline(TestCase):
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pcap_file =3D 'ip_pipeline.pcap'<= br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0frame_size =3D 64

-=C2=A0 =C2=A0 =C2=A0 =C2=A0 default_setup =3D ['arp add 0 0.0.0.1 0a:0= b:0c:0d:0e:0f',
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0'arp add 1 0.128.0.1 1a:1b:1c:1d:1e:1f',
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0'route add 0.0.0.0 9 0 0.0.0.1',
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0'route add 0.128.0.0 9 1 0.128.0.1']
-
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ip_addrs =3D [
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'0.0.0.0', '0.0= .0.1', '0.0.0.127', '0.0.0.128', '0.0.0.255', =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'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):
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0frames.append(self.create_t= cp_ipv4_frame(0, '0.0.0.0', addr,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 frame_size))

+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.create_flow_cfgfile()
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0self.create_pcap_file_from_frames(pc= ap_file, frames)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0self.tester.session.copy_file_to(pca= p_file)

=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0# Start ip_pipeline app and setup default= s
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0self.start_ip_pipeline(ports=3Dself.= ports_mask)
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 for command in default_setup:
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.pipeline_command(command) +
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 # default to SINK0
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.pipeline_command('p 1 flow add defaul= t 3')

=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0# Check that no traffic pass though
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0stats =3D self.send_and_sniff_pcap_file(<= wbr>pcap_file, len(frames),
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A01, 0, 0.2)
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 expected =3D {'tx': 0, 'rx': 0= }
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 expected =3D {'rx0': 0, 'rx1':= 0}
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0self.check_results(stats, expected)

=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0# Add the flows
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0flows_added =3D 0
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0for addrs in ip_addrs:
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.pipeline_add_flow(1, '0= .0.0.0', addrs, 0, 0)
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.pipeline_add_flow(0, '0= .0.0.0', addrs, 0, 0, flows_added)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0flows_added +=3D 1

=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0# Check that traffic matchi= ng flows pass though
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0stats =3D self.send_and_sni= ff_pcap_file(pcap_file, len(frames),
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A01, 0, 0.2)
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 expected =3D {'tx': 0, &= #39;rx': flows_added}
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 expected =3D {'rx0': flo= ws_added, 'rx1': 0}
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0self.check_results(stats, e= xpected)

=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0# Remove flows
@@ -443,7 +464,7 @@ class TestIPPipeline(TestCase):
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0# Check that traffic matchi= ng flows pass though
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0stats =3D self.send_and_sni= ff_pcap_file(pcap_file, len(frames),
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A01, 0, 0.2)
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 expected =3D {'tx': 0, &= #39;rx': flows_added}
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 expected =3D {'rx0': flo= ws_added, 'rx1': 0}
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0self.check_results(stats, e= xpected)

=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0out =3D self.dut.send_expect('flow pr= int', 'pipeline>')
@@ -452,7 +473,7 @@ class TestIPPipeline(TestCase):
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0# Check that again no traffic pass though=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0stats =3D self.send_and_sniff_pcap_file(<= wbr>pcap_file, len(frames),
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A01, 0, 0.2)
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 expected =3D {'tx': 0, 'rx': 0= }
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 expected =3D {'rx0': 0, 'rx1':= 0}
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0self.check_results(stats, expected)

=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0self.quit_ip_pipeline()
@@ -464,9 +485,8 @@ class TestIPPipeline(TestCase):
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pcap_file =3D 'ip_pipeline.pcap'<= br> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0frame_size =3D 64

-=C2=A0 =C2=A0 =C2=A0 =C2=A0 default_setup =3D ['arp add 0 0.0.0.1 0a:0= b:0c:0d:0e:0f',
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0'arp add 1 0.128.0.1 1a:1b:1c:1d:1e:1f',
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0'flow add all']
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 default_setup =3D ['p 1 arp add 0 0.0.0.1 = 0a:0b:0c:0d:0e:0f',
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0'p 1 arp add 1 0.128.0.1 1a:1b:1c:1d:1e:1f']

=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ip_addrs =3D [
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0'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):
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0self.create_pcap_file_from_frames(pc= ap_file, frames)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0self.tester.session.copy_file_to(pca= p_file)

+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.create_routing_cfgfile()
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0# Start ip_pipeline app and setup default= s
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0self.start_ip_pipeline(ports=3Dself.= ports_mask)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0for command in default_setup:
@@ -491,7 +512,7 @@ class TestIPPipeline(TestCase):
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0# Check that no traffic pass though
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0stats =3D self.send_and_sniff_pcap_file(<= wbr>pcap_file, len(frames),
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A01, 0, 0.2)
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 expected =3D {'tx': 0, 'rx': 0= }
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 expected =3D {'rx0': 0, 'rx1':= 0}
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0self.check_results(stats, expected)

=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0# Add the routes
@@ -504,7 +525,7 @@ class TestIPPipeline(TestCase):
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0stats =3D self.send_and_sni= ff_pcap_file(pcap_file, len(frames),
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A01, 0, 0.2)

-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 expected =3D {'tx': 0, &= #39;rx': routes_added}
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 expected =3D {'rx0': rou= tes_added, 'rx1': 0}
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0self.check_results(stats, e= xpected)

=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0# Remove routes
@@ -515,7 +536,7 @@ class TestIPPipeline(TestCase):
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0# Check that traffic matchi= ng flows pass though
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0stats =3D self.send_and_sni= ff_pcap_file(pcap_file, len(frames),
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A01, 0, 0.2)
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 expected =3D {'tx': 0, &= #39;rx': routes_added}
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 expected =3D {'rx0': rou= tes_added, 'rx1': 0}
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0self.check_results(stats, e= xpected)

=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0out =3D self.dut.send_expect('route p= rint', 'pipeline>')
@@ -524,7 +545,7 @@ class TestIPPipeline(TestCase):
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0# Check that again no traffic pass though=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0stats =3D self.send_and_sniff_pcap_file(<= wbr>pcap_file, len(frames),
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A01, 0, 0.2)
-=C2=A0 =C2=A0 =C2=A0 =C2=A0 expected =3D {'tx': 0, 'rx': 0= }
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 expected =3D {'rx0': 0, 'rx1':= 0}
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0self.check_results(stats, expected)

=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0self.quit_ip_pipeline()
@@ -539,5 +560,7 @@ class TestIPPipeline(TestCase):
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"""
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Run after each test suite.
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"""
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect("rm /tmp/ip_pipeline= .cfg", "#")
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect("rm /tmp/ip_pipeline= .cfg.out", "#")
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0out =3D self.dut.build_dpdk_apps("./= examples/ip_pipeline")
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0self.verify("Error" not in out,= "Compilation error")
--
1.9.1


--94eb2c0d0cd681af0e055859e46a--