From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by dpdk.org (Postfix) with ESMTP id B21C31B3B9 for ; Thu, 31 Jan 2019 03:15:25 +0100 (CET) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 30 Jan 2019 18:15:24 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.56,542,1539673200"; d="scan'208";a="140300639" Received: from fmsmsx105.amr.corp.intel.com ([10.18.124.203]) by fmsmga004.fm.intel.com with ESMTP; 30 Jan 2019 18:15:24 -0800 Received: from shsmsx153.ccr.corp.intel.com (10.239.6.53) by FMSMSX105.amr.corp.intel.com (10.18.124.203) with Microsoft SMTP Server (TLS) id 14.3.408.0; Wed, 30 Jan 2019 18:15:24 -0800 Received: from shsmsx101.ccr.corp.intel.com ([169.254.1.110]) by SHSMSX153.ccr.corp.intel.com ([169.254.12.190]) with mapi id 14.03.0415.000; Thu, 31 Jan 2019 10:15:22 +0800 From: "Tu, Lijuan" To: "Peng, Yuan" , "dts@dpdk.org" CC: "Peng, Yuan" , "Pei, Yulong" Thread-Topic: [dts] [PATCH v2]tests: add TestSuite_ip_pipeline.py Thread-Index: AQHUt7dyBp7Px5jf90yEyb2aSMzVP6XIpimg Date: Thu, 31 Jan 2019 02:15:21 +0000 Message-ID: <8CE3E05A3F976642AAB0F4675D0AD20E0BA1F2E0@SHSMSX101.ccr.corp.intel.com> References: <1548755338-41836-1-git-send-email-yuan.peng@intel.com> In-Reply-To: <1548755338-41836-1-git-send-email-yuan.peng@intel.com> Accept-Language: zh-CN, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-product: dlpe-windows dlp-version: 11.0.400.15 dlp-reaction: no-action x-ctpclassification: CTP_NT x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiZWY1MmU5ZmQtZDY4YS00MzkzLWJmY2EtYjI2YTRjZTlmMjVmIiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX05UIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE3LjEwLjE4MDQuNDkiLCJUcnVzdGVkTGFiZWxIYXNoIjoiNlwvRWNNcmc5UFdYTjBtMytobGVlS2RIbDRFTEhHa2ltUGhGTk43VW55VytYUzhJUWpuczFkd3ZzamhBZ0dyR3IifQ== x-originating-ip: [10.239.127.40] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Subject: Re: [dts] [PATCH v2]tests: add TestSuite_ip_pipeline.py 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: Thu, 31 Jan 2019 02:15:26 -0000 Applied, thanks > -----Original Message----- > From: dts [mailto:dts-bounces@dpdk.org] On Behalf Of Peng Yuan > Sent: Tuesday, January 29, 2019 5:49 PM > To: dts@dpdk.org > Cc: Peng, Yuan ; Pei, Yulong > Subject: [dts] [PATCH v2]tests: add TestSuite_ip_pipeline.py >=20 > Add new script of TestSuite_ip_pipeline.py. >=20 > Signed-off-by: Pei Yulong Peng Yuan > >=20 > diff --git a/tests/TestSuite_ip_pipeline.py b/tests/TestSuite_ip_pipeline= .py new > file mode 100644 index 0000000..37f5e3f > --- /dev/null > +++ b/tests/TestSuite_ip_pipeline.py > @@ -0,0 +1,773 @@ > +# BSD LICENSE > +# > +# Copyright(c) 2010-2018 Intel Corporation. All rights reserved. > +# All rights reserved. > +# > +# Redistribution and use in source and binary forms, with or without # > +modification, are permitted provided that the following conditions # > +are met: > +# > +# * Redistributions of source code must retain the above copyright > +# notice, this list of conditions and the following disclaimer. > +# * Redistributions in binary form must reproduce the above copyright > +# notice, this list of conditions and the following disclaimer in > +# the documentation and/or other materials provided with the > +# distribution. > +# * Neither the name of Intel Corporation nor the names of its > +# contributors may be used to endorse or promote products derived > +# from this software without specific prior written permission. > +# > +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND > CONTRIBUTORS # > +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # > +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS > FOR # > +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE > COPYRIGHT # > +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, > INCIDENTAL, # > +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT > # > +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF > USE, # > +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON > ANY # > +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # > +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE > USE # > +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. > + > +import utils > +import re > +import time > + > +from settings import HEADER_SIZE > +from test_case import TestCase > +from pmd_output import PmdOutput > +from settings import DRIVERS > +from crb import Crb > + > +from virt_dut import VirtDut > +from project_dpdk import DPDKdut > +from dut import Dut > +from packet import Packet > + > +import os > +import random > +from exception import VerifyFailure > +import scapy.layers.inet > +from scapy.utils import rdpcap > + > +from time import sleep > +#from scapy.all import conf > +from scapy.utils import wrpcap, rdpcap, hexstr from scapy.layers.inet > +import Ether, IP, TCP, UDP, ICMP from scapy.layers.l2 import Dot1Q, > +ARP, GRE from scapy.layers.sctp import SCTP, SCTPChunkData from > +scapy.route import * from scapy.packet import bind_layers, Raw from > +scapy.arch import get_if_hwaddr from scapy.sendrecv import sniff from > +scapy.sendrecv import sendp > + > +class TestIPPipeline(TestCase): > + > + def tcpdump_start_sniff(self, interface, filters=3D""): > + """ > + Starts tcpdump in the background to sniff packets that received = by > interface. > + """ > + command =3D 'rm -f /tmp/tcpdump_{0}.pcap'.format(interface) > + self.tester.send_expect(command, '#') > + command =3D 'tcpdump -n -e -Q in -w /tmp/tcpdump_{0}.pcap -i {0}= {1} > 2>/tmp/tcpdump_{0}.out &'\ > + .format(interface, filters) > + self.tester.send_expect(command, '# ') > + > + def tcpdump_stop_sniff(self): > + """ > + Stops the tcpdump process running in the background. > + """ > + self.tester.send_expect('killall tcpdump', '# ') > + # For the [pid]+ Done tcpdump... message after killing the proce= ss > + sleep(1) > + self.tester.send_expect('echo "Cleaning buffer"', '# ') > + sleep(1) > + > + def write_pcap_file(self, pcap_file, pkts): > + try: > + wrpcap(pcap_file, pkts) > + except: > + raise Exception("write pcap error") > + > + def read_pcap_file(self, pcap_file): > + pcap_pkts =3D [] > + try: > + pcap_pkts =3D rdpcap(pcap_file) > + except: > + raise Exception("write pcap error") > + > + return pcap_pkts > + > + def send_and_sniff_pkts(self, from_port, to_port, pcap_file, filters= =3D"", > count=3D1): > + """ > + Sent pkts that read from the pcap_file. > + Return the sniff pkts. > + """ > + tx_port =3D self.tester.get_local_port(self.dut_ports[from_port]= ) > + rx_port =3D self.tester.get_local_port(self.dut_ports[to_port]) > + > + tx_interface =3D self.tester.get_interface(tx_port) > + rx_interface =3D self.tester.get_interface(rx_port) > + > + self.tcpdump_start_sniff(rx_interface, filters) > + > + # Prepare the pkts to be sent > + self.tester.scapy_foreground() > + self.tester.scapy_append('pkt =3D rdpcap("%s")' % (pcap_file)) > + self.tester.scapy_append('sendp(pkt, iface=3D"%s", count=3D%d)' = % > (tx_interface, count)) > + self.tester.scapy_execute() > + > + self.tcpdump_stop_sniff() > + > + return self.read_pcap_file('/tmp/tcpdump_%s.pcap' % > + rx_interface) > + > + def setup_env(self, port_nums, driver): > + """ > + This is to set up vf environment. > + The pf is bound to dpdk driver. > + """ > + if driver =3D=3D 'default': > + for port_id in self.dut_ports: > + port =3D self.dut.ports_info[port_id]['port'] > + port.bind_driver() > + # one PF generate one VF > + for port_num in range(port_nums): > + self.dut.generate_sriov_vfs_by_port(self.dut_ports[port_num]= , 1, driver) > + > self.sriov_vfs_port.append(self.dut.ports_info[self.dut_ports[port_num]][= 'vfs_p > ort']) > + if driver =3D=3D 'default': > + self.dut.send_expect("ip link set %s vf 0 mac %s" % (self.pf= 0_interface, > self.vf0_mac), "# ", 3) > + self.dut.send_expect("ip link set %s vf 0 mac %s" % (self.pf= 1_interface, > self.vf1_mac), "# ", 3) > + self.dut.send_expect("ip link set %s vf 0 mac %s" % (self.pf= 2_interface, > self.vf2_mac), "# ", 3) > + self.dut.send_expect("ip link set %s vf 0 mac %s" % (self.pf= 3_interface, > self.vf3_mac), "# ", 3) > + self.dut.send_expect("ip link set %s vf 0 spoofchk off" % > self.pf0_interface, "# ", 3) > + self.dut.send_expect("ip link set %s vf 0 spoofchk off" % > self.pf1_interface, "# ", 3) > + self.dut.send_expect("ip link set %s vf 0 spoofchk off" % > self.pf2_interface, "# ", 3) > + self.dut.send_expect("ip link set %s vf 0 spoofchk off" % > + self.pf3_interface, "# ", 3) > + > + try: > + for port_num in range(port_nums): > + for port in self.sriov_vfs_port[port_num]: > + port.bind_driver(driver=3D"vfio-pci") > + except Exception as e: > + self.destroy_env(port_nums, driver) > + raise Exception(e) > + > + def destroy_env(self, port_nums, driver): > + """ > + This is to stop testpmd and destroy vf environment. > + """ > + cmd =3D "^C" > + self.session_secondary.send_expect(cmd, "# ", 20) > + time.sleep(5) > + if driver =3D=3D self.drivername: > + self.dut.send_expect("quit", "# ") > + time.sleep(5) > + for port_num in range(port_nums): > + > + self.dut.destroy_sriov_vfs_by_port(self.dut_ports[port_num]) > + > + def set_up_all(self): > + """ > + Run at the start of each test suite. > + """ > + self.dut_ports =3D self.dut.get_ports() > + self.port_nums =3D 4 > + self.verify(len(self.dut_ports) >=3D self.port_nums, > + "Insufficient ports for speed testing") > + > + self.dut_p0_pci =3D self.dut.get_port_pci(self.dut_ports[0]) > + self.dut_p1_pci =3D self.dut.get_port_pci(self.dut_ports[1]) > + self.dut_p2_pci =3D self.dut.get_port_pci(self.dut_ports[2]) > + self.dut_p3_pci =3D self.dut.get_port_pci(self.dut_ports[3]) > + > + self.dut_p0_mac =3D self.dut.get_mac_address(self.dut_ports[0]) > + self.dut_p1_mac =3D self.dut.get_mac_address(self.dut_ports[1]) > + self.dut_p2_mac =3D self.dut.get_mac_address(self.dut_ports[2]) > + self.dut_p3_mac =3D self.dut.get_mac_address(self.dut_ports[3]) > + > + self.pf0_interface =3D self.dut.ports_info[self.dut_ports[0]]['i= ntf'] > + self.pf1_interface =3D self.dut.ports_info[self.dut_ports[1]]['i= ntf'] > + self.pf2_interface =3D self.dut.ports_info[self.dut_ports[2]]['i= ntf'] > + self.pf3_interface =3D > + self.dut.ports_info[self.dut_ports[3]]['intf'] > + > + self.vf0_mac =3D "00:11:22:33:44:55" > + self.vf1_mac =3D "00:11:22:33:44:56" > + self.vf2_mac =3D "00:11:22:33:44:57" > + self.vf3_mac =3D "00:11:22:33:44:58" > + > + self.sriov_vfs_port =3D [] > + self.session_secondary =3D self.dut.new_session() > + > + out =3D self.dut.build_dpdk_apps("./examples/ip_pipeline") > + self.verify("Error" not in out, "Compilation error") > + > + def set_up(self): > + """ > + Run before each test case. > + """ > + pass > + > + def test_routing_pipeline(self): > + """ > + routing pipeline > + """ > + cmd =3D "sed -i -e > 's/0000:02:00.0/%s/' ./examples/ip_pipeline/examples/route.cli" % > self.dut_p0_pci > + self.dut.send_expect(cmd, "# ", 20) > + cmd =3D "sed -i -e > 's/0000:02:00.1/%s/' ./examples/ip_pipeline/examples/route.cli" % > self.dut_p1_pci > + self.dut.send_expect(cmd, "# ", 20) > + cmd =3D "sed -i -e > 's/0000:06:00.0/%s/' ./examples/ip_pipeline/examples/route.cli" % > self.dut_p2_pci > + self.dut.send_expect(cmd, "# ", 20) > + cmd =3D "sed -i -e > 's/0000:06:00.1/%s/' ./examples/ip_pipeline/examples/route.cli" % > self.dut_p3_pci > + self.dut.send_expect(cmd, "# ", 20) > + > + IP_PIPELINE =3D "./examples/ip_pipeline/build/ip_pipeline" > + DUT_PORTS =3D " -w {0} -w {1} -w {2} -w {3} "\ > + .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p= 2_pci, > self.dut_p3_pci) > + SCRIPT_FILE =3D "./examples/ip_pipeline/examples/route.cli" > + > + cmd =3D "{0} -c 0x3 -n 4 {1} -- -s {2}".format(IP_PIPELINE, DUT_= PORTS, > SCRIPT_FILE) > + self.dut.send_expect(cmd, "30:31:32:33:34:35", 60) > + > + #rule 0 test > + pcap_file =3D '/tmp/route_0.pcap' > + pkt =3D [Ether(dst=3Dself.dut_p0_mac)/IP(dst=3D"100.0.0.1")/Raw(= load=3D"X"*26)] > + self.write_pcap_file(pcap_file, pkt) > + filters =3D "dst host 100.0.0.1" > + sniff_pkts =3D self.send_and_sniff_pkts(0, 0, pcap_file, filters= ) > + dst_mac_list =3D [] > + for packet in sniff_pkts: > + dst_mac_list.append(packet.getlayer(0).dst) > + self.verify( "a0:a1:a2:a3:a4:a5" in dst_mac_list, "rule 0 test > + fail") > + > + #rule 1 test > + pcap_file =3D '/tmp/route_1.pcap' > + pkt =3D [Ether(dst=3Dself.dut_p0_mac)/IP(dst=3D"100.64.0.1")/Raw= (load=3D"X"*26)] > + self.write_pcap_file(pcap_file, pkt) > + filters =3D "dst host 100.64.0.1" > + sniff_pkts =3D self.send_and_sniff_pkts(0, 1, pcap_file, filters= ) > + dst_mac_list =3D [] > + for packet in sniff_pkts: > + dst_mac_list.append(packet.getlayer(0).dst) > + self.verify( "b0:b1:b2:b3:b4:b5" in dst_mac_list, "rule 1 test > + fail") > + > + #rule 2 test > + pcap_file =3D '/tmp/route_2.pcap' > + pkt =3D > [Ether(dst=3Dself.dut_p0_mac)/IP(dst=3D"100.128.0.1")/Raw(load=3D"X"*26)] > + self.write_pcap_file(pcap_file, pkt) > + filters =3D "dst host 100.128.0.1" > + sniff_pkts =3D self.send_and_sniff_pkts(0, 2, pcap_file, filters= ) > + dst_mac_list =3D [] > + for packet in sniff_pkts: > + dst_mac_list.append(packet.getlayer(0).dst) > + self.verify( "c0:c1:c2:c3:c4:c5" in dst_mac_list, "rule 2 test > + fail") > + > + #rule 3 test > + pcap_file =3D '/tmp/route_3.pcap' > + pkt =3D > [Ether(dst=3Dself.dut_p0_mac)/IP(dst=3D"100.192.0.1")/Raw(load=3D"X"*26)] > + self.write_pcap_file(pcap_file, pkt) > + filters =3D "dst host 100.192.0.1" > + sniff_pkts =3D self.send_and_sniff_pkts(0, 3, pcap_file, filters= ) > + dst_mac_list =3D [] > + for packet in sniff_pkts: > + dst_mac_list.append(packet.getlayer(0).dst) > + self.verify( "d0:d1:d2:d3:d4:d5" in dst_mac_list, "rule 3 test > + fail") > + > + sleep(1) > + cmd =3D "^C" > + self.dut.send_expect(cmd, "# ", 20) > + > + def test_firewall_pipeline(self): > + """ > + firewall pipeline > + """ > + cmd =3D "sed -i -e > 's/0000:02:00.0/%s/' ./examples/ip_pipeline/examples/firewall.cli" % > self.dut_p0_pci > + self.dut.send_expect(cmd, "# ", 20) > + cmd =3D "sed -i -e > 's/0000:02:00.1/%s/' ./examples/ip_pipeline/examples/firewall.cli" % > self.dut_p1_pci > + self.dut.send_expect(cmd, "# ", 20) > + cmd =3D "sed -i -e > 's/0000:06:00.0/%s/' ./examples/ip_pipeline/examples/firewall.cli" % > self.dut_p2_pci > + self.dut.send_expect(cmd, "# ", 20) > + cmd =3D "sed -i -e > 's/0000:06:00.1/%s/' ./examples/ip_pipeline/examples/firewall.cli" % > self.dut_p3_pci > + self.dut.send_expect(cmd, "# ", 20) > + > + IP_PIPELINE =3D "./examples/ip_pipeline/build/ip_pipeline" > + DUT_PORTS =3D " -w {0} -w {1} -w {2} -w {3} "\ > + .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p= 2_pci, > self.dut_p3_pci) > + SCRIPT_FILE =3D "./examples/ip_pipeline/examples/firewall.cli" > + > + cmd =3D "{0} -c 0x3 -n 4 {1} -- -s {2}".format(IP_PIPELINE, DUT_= PORTS, > SCRIPT_FILE) > + self.dut.send_expect(cmd, "fwd port 3", 60) > + > + #rule 0 test > + pcap_file =3D '/tmp/fw_0.pcap' > + pkt =3D > [Ether(dst=3Dself.dut_p0_mac)/IP(dst=3D"100.0.0.1")/TCP(sport=3D100,dport= =3D200)/Ra > w(load=3D"X"*6)] > + self.write_pcap_file(pcap_file, pkt) > + filters =3D "dst host 100.0.0.1" > + sniff_pkts =3D self.send_and_sniff_pkts(0, 0, pcap_file, filters= ) > + dst_ip_list =3D [] > + for packet in sniff_pkts: > + dst_ip_list.append(packet.getlayer(1).dst) > + self.verify( "100.0.0.1" in dst_ip_list, "rule 0 test fail") > + > + #rule 1 test > + pcap_file =3D '/tmp/fw_1.pcap' > + pkt =3D > [Ether(dst=3Dself.dut_p0_mac)/IP(dst=3D"100.64.0.1")/TCP(sport=3D100,dpor= t=3D200)/Ra > w(load=3D"X"*6)] > + self.write_pcap_file(pcap_file, pkt) > + filters =3D "dst host 100.64.0.1" > + sniff_pkts =3D self.send_and_sniff_pkts(0, 1, pcap_file, filters= ) > + dst_ip_list =3D [] > + for packet in sniff_pkts: > + dst_ip_list.append(packet.getlayer(1).dst) > + self.verify( "100.64.0.1" in dst_ip_list, "rule 1 test fail") > + > + #rule 2 test > + pcap_file =3D '/tmp/fw_2.pcap' > + pkt =3D > [Ether(dst=3Dself.dut_p0_mac)/IP(dst=3D"100.128.0.1")/TCP(sport=3D100,dpo= rt=3D200)/R > aw(load=3D"X"*6)] > + self.write_pcap_file(pcap_file, pkt) > + filters =3D "dst host 100.128.0.1" > + sniff_pkts =3D self.send_and_sniff_pkts(0, 2, pcap_file, filters= ) > + dst_ip_list =3D [] > + for packet in sniff_pkts: > + dst_ip_list.append(packet.getlayer(1).dst) > + self.verify( "100.128.0.1" in dst_ip_list, "rule 2 test fail") > + > + #rule 3 test > + pcap_file =3D '/tmp/fw_3.pcap' > + pkt =3D > [Ether(dst=3Dself.dut_p0_mac)/IP(dst=3D"100.192.0.1")/TCP(sport=3D100,dpo= rt=3D200)/R > aw(load=3D"X"*6)] > + self.write_pcap_file(pcap_file, pkt) > + filters =3D "dst host 100.192.0.1" > + sniff_pkts =3D self.send_and_sniff_pkts(0, 3, pcap_file, filters= ) > + dst_ip_list =3D [] > + for packet in sniff_pkts: > + dst_ip_list.append(packet.getlayer(1).dst) > + self.verify( "100.192.0.1" in dst_ip_list, "rule 3 test fail") > + > + sleep(1) > + cmd =3D "^C" > + self.dut.send_expect(cmd, "# ", 20) > + > + def test_flow_pipeline(self): > + """ > + flow pipeline > + """ > + cmd =3D "sed -i -e > 's/0000:02:00.0/%s/' ./examples/ip_pipeline/examples/flow.cli" % > self.dut_p0_pci > + self.dut.send_expect(cmd, "# ", 20) > + cmd =3D "sed -i -e > 's/0000:02:00.1/%s/' ./examples/ip_pipeline/examples/flow.cli" % > self.dut_p1_pci > + self.dut.send_expect(cmd, "# ", 20) > + cmd =3D "sed -i -e > 's/0000:06:00.0/%s/' ./examples/ip_pipeline/examples/flow.cli" % > self.dut_p2_pci > + self.dut.send_expect(cmd, "# ", 20) > + cmd =3D "sed -i -e > 's/0000:06:00.1/%s/' ./examples/ip_pipeline/examples/flow.cli" % > self.dut_p3_pci > + self.dut.send_expect(cmd, "# ", 20) > + > + IP_PIPELINE =3D "./examples/ip_pipeline/build/ip_pipeline" > + DUT_PORTS =3D " -w {0} -w {1} -w {2} -w {3} "\ > + .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p= 2_pci, > self.dut_p3_pci) > + SCRIPT_FILE =3D "./examples/ip_pipeline/examples/flow.cli" > + > + cmd =3D "{0} -c 0x3 -n 4 {1} -- -s {2}".format(IP_PIPELINE, DUT_= PORTS, > SCRIPT_FILE) > + self.dut.send_expect(cmd, "fwd port 3", 60) > + > + #rule 0 test > + pcap_file =3D '/tmp/fl_0.pcap' > + pkt =3D > [Ether(dst=3Dself.dut_p0_mac)/IP(src=3D"100.0.0.10",dst=3D"200.0.0.10")/T= CP(sport=3D1 > 00,dport=3D200)/Raw(load=3D"X"*6)] > + self.write_pcap_file(pcap_file, pkt) > + filters =3D "tcp" > + sniff_pkts =3D self.send_and_sniff_pkts(0, 0, pcap_file, filters= ) > + dst_ip_list =3D [] > + for packet in sniff_pkts: > + dst_ip_list.append(packet.getlayer(1).dst) > + self.verify( "200.0.0.10" in dst_ip_list, "rule 0 test fail") > + > + #rule 1 test > + pcap_file =3D '/tmp/fl_1.pcap' > + pkt =3D > [Ether(dst=3Dself.dut_p0_mac)/IP(src=3D"100.0.0.11",dst=3D"200.0.0.11")/T= CP(sport=3D1 > 01,dport=3D201)/Raw(load=3D"X"*6)] > + self.write_pcap_file(pcap_file, pkt) > + filters =3D "tcp" > + sniff_pkts =3D self.send_and_sniff_pkts(0, 1, pcap_file, filters= ) > + dst_ip_list =3D [] > + for packet in sniff_pkts: > + dst_ip_list.append(packet.getlayer(1).dst) > + self.verify( "200.0.0.11" in dst_ip_list, "rule 1 test fail") > + > + #rule 2 test > + pcap_file =3D '/tmp/fl_2.pcap' > + pkt =3D > [Ether(dst=3Dself.dut_p0_mac)/IP(src=3D"100.0.0.12",dst=3D"200.0.0.12")/T= CP(sport=3D1 > 02,dport=3D202)/Raw(load=3D"X"*6)] > + self.write_pcap_file(pcap_file, pkt) > + filters =3D "tcp" > + sniff_pkts =3D self.send_and_sniff_pkts(0, 2, pcap_file, filters= ) > + dst_ip_list =3D [] > + for packet in sniff_pkts: > + dst_ip_list.append(packet.getlayer(1).dst) > + self.verify( "200.0.0.12" in dst_ip_list, "rule 2 test fail") > + > + #rule 3 test > + pcap_file =3D '/tmp/fl_3.pcap' > + pkt =3D > [Ether(dst=3Dself.dut_p0_mac)/IP(src=3D"100.0.0.13",dst=3D"200.0.0.13")/T= CP(sport=3D1 > 03,dport=3D203)/Raw(load=3D"X"*6)] > + self.write_pcap_file(pcap_file, pkt) > + filters =3D "tcp" > + sniff_pkts =3D self.send_and_sniff_pkts(0, 3, pcap_file, filters= ) > + dst_ip_list =3D [] > + for packet in sniff_pkts: > + dst_ip_list.append(packet.getlayer(1).dst) > + self.verify( "200.0.0.13" in dst_ip_list, "rule 3 test fail") > + > + sleep(1) > + cmd =3D "^C" > + self.dut.send_expect(cmd, "# ", 20) > + > + def test_l2fwd_pipeline(self): > + """ > + l2fwd pipeline > + """ > + cmd =3D "sed -i -e > 's/0000:02:00.0/%s/' ./examples/ip_pipeline/examples/l2fwd.cli" % > self.dut_p0_pci > + self.dut.send_expect(cmd, "# ", 20) > + cmd =3D "sed -i -e > 's/0000:02:00.1/%s/' ./examples/ip_pipeline/examples/l2fwd.cli" % > self.dut_p1_pci > + self.dut.send_expect(cmd, "# ", 20) > + cmd =3D "sed -i -e > 's/0000:06:00.0/%s/' ./examples/ip_pipeline/examples/l2fwd.cli" % > self.dut_p2_pci > + self.dut.send_expect(cmd, "# ", 20) > + cmd =3D "sed -i -e > 's/0000:06:00.1/%s/' ./examples/ip_pipeline/examples/l2fwd.cli" % > self.dut_p3_pci > + self.dut.send_expect(cmd, "# ", 20) > + > + IP_PIPELINE =3D "./examples/ip_pipeline/build/ip_pipeline" > + DUT_PORTS =3D " -w {0} -w {1} -w {2} -w {3} "\ > + .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p= 2_pci, > self.dut_p3_pci) > + SCRIPT_FILE =3D "./examples/ip_pipeline/examples/l2fwd.cli" > + > + cmd =3D "{0} -c 0x3 -n 4 {1} -- -s {2}".format(IP_PIPELINE, DUT_= PORTS, > SCRIPT_FILE) > + self.dut.send_expect(cmd, "fwd port 2", 60) > + > + #rule 0 test > + pcap_file =3D '/tmp/pt_0.pcap' > + pkt =3D > [Ether(dst=3Dself.dut_p0_mac)/IP(src=3D"100.0.0.10",dst=3D"200.0.0.10")/T= CP(sport=3D1 > 00,dport=3D200)/Raw(load=3D"X"*6)] > + self.write_pcap_file(pcap_file, pkt) > + filters =3D "tcp" > + sniff_pkts =3D self.send_and_sniff_pkts(0, 1, pcap_file, filters= ) > + dst_ip_list =3D [] > + for packet in sniff_pkts: > + dst_ip_list.append(packet.getlayer(1).dst) > + self.verify( "200.0.0.10" in dst_ip_list, "rule 0 test fail") > + > + #rule 1 test > + pcap_file =3D '/tmp/pt_1.pcap' > + pkt =3D > [Ether(dst=3Dself.dut_p1_mac)/IP(src=3D"100.0.0.11",dst=3D"200.0.0.11")/T= CP(sport=3D1 > 01,dport=3D201)/Raw(load=3D"X"*6)] > + self.write_pcap_file(pcap_file, pkt) > + filters =3D "tcp" > + sniff_pkts =3D self.send_and_sniff_pkts(1, 0, pcap_file, filters= ) > + dst_ip_list =3D [] > + for packet in sniff_pkts: > + dst_ip_list.append(packet.getlayer(1).dst) > + self.verify( "200.0.0.11" in dst_ip_list, "rule 1 test fail") > + > + #rule 2 test > + pcap_file =3D '/tmp/pt_2.pcap' > + pkt =3D > [Ether(dst=3Dself.dut_p2_mac)/IP(src=3D"100.0.0.12",dst=3D"200.0.0.12")/T= CP(sport=3D1 > 02,dport=3D202)/Raw(load=3D"X"*6)] > + self.write_pcap_file(pcap_file, pkt) > + filters =3D "tcp" > + sniff_pkts =3D self.send_and_sniff_pkts(2, 3, pcap_file, filters= ) > + dst_ip_list =3D [] > + for packet in sniff_pkts: > + dst_ip_list.append(packet.getlayer(1).dst) > + self.verify( "200.0.0.12" in dst_ip_list, "rule 2 test fail") > + > + #rule 3 test > + pcap_file =3D '/tmp/pt_3.pcap' > + pkt =3D > [Ether(dst=3Dself.dut_p3_mac)/IP(src=3D"100.0.0.13",dst=3D"200.0.0.13")/T= CP(sport=3D1 > 03,dport=3D203)/Raw(load=3D"X"*6)] > + self.write_pcap_file(pcap_file, pkt) > + filters =3D "tcp" > + sniff_pkts =3D self.send_and_sniff_pkts(3, 2, pcap_file, filters= ) > + dst_ip_list =3D [] > + for packet in sniff_pkts: > + dst_ip_list.append(packet.getlayer(1).dst) > + self.verify( "200.0.0.13" in dst_ip_list, "rule 3 test fail") > + > + sleep(1) > + cmd =3D "^C" > + self.dut.send_expect(cmd, "# ", 20) > + > + def test_pfdpdk_vf_l2fwd_pipeline(self): > + """ > + VF l2fwd pipeline, PF bound to DPDK driver > + """ > + self.setup_env(self.port_nums, driver=3Dself.drivername) > + cmd =3D "sed -i -e > 's/0000:02:00.0/%s/' ./examples/ip_pipeline/examples/l2fwd.cli" % > self.sriov_vfs_port[0][0].pci > + self.dut.send_expect(cmd, "# ", 20) > + cmd =3D "sed -i -e > 's/0000:02:00.1/%s/' ./examples/ip_pipeline/examples/l2fwd.cli" % > self.sriov_vfs_port[1][0].pci > + self.dut.send_expect(cmd, "# ", 20) > + cmd =3D "sed -i -e > 's/0000:06:00.0/%s/' ./examples/ip_pipeline/examples/l2fwd.cli" % > self.sriov_vfs_port[2][0].pci > + self.dut.send_expect(cmd, "# ", 20) > + cmd =3D "sed -i -e > 's/0000:06:00.1/%s/' ./examples/ip_pipeline/examples/l2fwd.cli" % > self.sriov_vfs_port[3][0].pci > + self.dut.send_expect(cmd, "# ", 20) > + > + TESTPMD =3D "./%s/app/testpmd" % self.target > + IP_PIPELINE =3D "./examples/ip_pipeline/build/ip_pipeline" > + DUT_PF_PORTS =3D " -w {0} -w {1} -w {2} -w {3} "\ > + .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p= 2_pci, > self.dut_p3_pci) > + PF_SCRIPT_FILE =3D "--file-prefix=3Dpf --socket-mem 1024,1024" > + > + DUT_VF_PORTS =3D " -w {0} -w {1} -w {2} -w {3} "\ > + .format(self.sriov_vfs_port[0][0].pci, self.sriov_vf= s_port[1][0].pci, > self.sriov_vfs_port[2][0].pci, self.sriov_vfs_port[3][0].pci) > + VF_SCRIPT_FILE =3D "./examples/ip_pipeline/examples/l2fwd.cli" > + > + pf_cmd =3D "{0} -c 0xf0 -n 4 {1} {2} -- -i".format(TESTPMD, DUT_= PF_PORTS, > PF_SCRIPT_FILE) > + self.dut.send_expect(pf_cmd, "testpmd> ", 60) > + self.dut.send_expect("set vf mac addr 0 0 %s" % self.vf0_mac, "t= estpmd> ", > 30) > + self.dut.send_expect("set vf mac addr 1 0 %s" % self.vf1_mac, "t= estpmd> ", > 30) > + self.dut.send_expect("set vf mac addr 2 0 %s" % self.vf2_mac, "t= estpmd> ", > 30) > + self.dut.send_expect("set vf mac addr 3 0 %s" % self.vf3_mac, > + "testpmd> ", 30) > + > + vf_cmd =3D "{0} -c 0x3 -n 4 {1} -- -s {2}".format(IP_PIPELINE, D= UT_VF_PORTS, > VF_SCRIPT_FILE) > + self.session_secondary.send_expect(vf_cmd, "fwd port 2", 60) > + > + #rule 0 test > + pcap_file =3D '/tmp/pt_0.pcap' > + pkt =3D > [Ether(dst=3Dself.vf0_mac)/IP(src=3D"100.0.0.10",dst=3D"200.0.0.10")/TCP(= sport=3D100, > dport=3D200)/Raw(load=3D"X"*6)] > + self.write_pcap_file(pcap_file, pkt) > + filters =3D "tcp" > + sniff_pkts =3D self.send_and_sniff_pkts(0, 1, pcap_file, filters= ) > + dst_ip_list =3D [] > + for packet in sniff_pkts: > + dst_ip_list.append(packet.getlayer(1).dst) > + self.verify( "200.0.0.10" in dst_ip_list, "rule 0 test fail") > + > + #rule 1 test > + pcap_file =3D '/tmp/pt_1.pcap' > + pkt =3D > [Ether(dst=3Dself.vf1_mac)/IP(src=3D"100.0.0.11",dst=3D"200.0.0.11")/TCP(= sport=3D101, > dport=3D201)/Raw(load=3D"X"*6)] > + self.write_pcap_file(pcap_file, pkt) > + filters =3D "tcp" > + sniff_pkts =3D self.send_and_sniff_pkts(1, 0, pcap_file, filters= ) > + dst_ip_list =3D [] > + for packet in sniff_pkts: > + dst_ip_list.append(packet.getlayer(1).dst) > + self.verify( "200.0.0.11" in dst_ip_list, "rule 1 test fail") > + > + #rule 2 test > + pcap_file =3D '/tmp/pt_2.pcap' > + pkt =3D > [Ether(dst=3Dself.vf2_mac)/IP(src=3D"100.0.0.12",dst=3D"200.0.0.12")/TCP(= sport=3D102, > dport=3D202)/Raw(load=3D"X"*6)] > + self.write_pcap_file(pcap_file, pkt) > + filters =3D "tcp" > + sniff_pkts =3D self.send_and_sniff_pkts(2, 3, pcap_file, filters= ) > + dst_ip_list =3D [] > + for packet in sniff_pkts: > + dst_ip_list.append(packet.getlayer(1).dst) > + self.verify( "200.0.0.12" in dst_ip_list, "rule 2 test fail") > + > + #rule 3 test > + pcap_file =3D '/tmp/pt_3.pcap' > + pkt =3D > [Ether(dst=3Dself.vf3_mac)/IP(src=3D"100.0.0.13",dst=3D"200.0.0.13")/TCP(= sport=3D103, > dport=3D203)/Raw(load=3D"X"*6)] > + self.write_pcap_file(pcap_file, pkt) > + filters =3D "tcp" > + sniff_pkts =3D self.send_and_sniff_pkts(3, 2, pcap_file, filters= ) > + dst_ip_list =3D [] > + for packet in sniff_pkts: > + dst_ip_list.append(packet.getlayer(1).dst) > + self.verify( "200.0.0.13" in dst_ip_list, "rule 3 test fail") > + > + sleep(1) > + self.destroy_env(self.port_nums, driver=3Dself.drivername) > + > + def test_pfkernel_vf_l2fwd_pipeline(self): > + """ > + VF l2fwd pipeline, PF bound to kernel driver > + """ > + self.setup_env(self.port_nums, driver=3D'default') > + cmd =3D "sed -i -e > 's/0000:02:00.0/%s/' ./examples/ip_pipeline/examples/l2fwd.cli" % > self.sriov_vfs_port[0][0].pci > + self.dut.send_expect(cmd, "# ", 20) > + cmd =3D "sed -i -e > 's/0000:02:00.1/%s/' ./examples/ip_pipeline/examples/l2fwd.cli" % > self.sriov_vfs_port[1][0].pci > + self.dut.send_expect(cmd, "# ", 20) > + cmd =3D "sed -i -e > 's/0000:06:00.0/%s/' ./examples/ip_pipeline/examples/l2fwd.cli" % > self.sriov_vfs_port[2][0].pci > + self.dut.send_expect(cmd, "# ", 20) > + cmd =3D "sed -i -e > 's/0000:06:00.1/%s/' ./examples/ip_pipeline/examples/l2fwd.cli" % > self.sriov_vfs_port[3][0].pci > + self.dut.send_expect(cmd, "# ", 20) > + > + IP_PIPELINE =3D "./examples/ip_pipeline/build/ip_pipeline" > + DUT_VF_PORTS =3D " -w {0} -w {1} -w {2} -w {3} "\ > + .format(self.sriov_vfs_port[0][0].pci, self.sriov_vf= s_port[1][0].pci, > self.sriov_vfs_port[2][0].pci, self.sriov_vfs_port[3][0].pci) > + VF_SCRIPT_FILE =3D "./examples/ip_pipeline/examples/l2fwd.cli" > + > + vf_cmd =3D "{0} -c 0x3 -n 4 {1} -- -s {2}".format(IP_PIPELINE, D= UT_VF_PORTS, > VF_SCRIPT_FILE) > + self.session_secondary.send_expect(vf_cmd, "fwd port 2", 60) > + > + #rule 0 test > + pcap_file =3D '/tmp/pt_0.pcap' > + pkt =3D > [Ether(dst=3Dself.vf0_mac)/IP(src=3D"100.0.0.10",dst=3D"200.0.0.10")/TCP(= sport=3D100, > dport=3D200)/Raw(load=3D"X"*6)] > + self.write_pcap_file(pcap_file, pkt) > + filters =3D "tcp" > + sniff_pkts =3D self.send_and_sniff_pkts(0, 1, pcap_file, filters= ) > + dst_ip_list =3D [] > + for packet in sniff_pkts: > + dst_ip_list.append(packet.getlayer(1).dst) > + self.verify( "200.0.0.10" in dst_ip_list, "rule 0 test fail") > + > + #rule 1 test > + pcap_file =3D '/tmp/pt_1.pcap' > + pkt =3D > [Ether(dst=3Dself.vf1_mac)/IP(src=3D"100.0.0.11",dst=3D"200.0.0.11")/TCP(= sport=3D101, > dport=3D201)/Raw(load=3D"X"*6)] > + self.write_pcap_file(pcap_file, pkt) > + filters =3D "tcp" > + sniff_pkts =3D self.send_and_sniff_pkts(1, 0, pcap_file, filters= ) > + dst_ip_list =3D [] > + for packet in sniff_pkts: > + dst_ip_list.append(packet.getlayer(1).dst) > + self.verify( "200.0.0.11" in dst_ip_list, "rule 1 test fail") > + > + #rule 2 test > + pcap_file =3D '/tmp/pt_2.pcap' > + pkt =3D > [Ether(dst=3Dself.vf2_mac)/IP(src=3D"100.0.0.12",dst=3D"200.0.0.12")/TCP(= sport=3D102, > dport=3D202)/Raw(load=3D"X"*6)] > + self.write_pcap_file(pcap_file, pkt) > + filters =3D "tcp" > + sniff_pkts =3D self.send_and_sniff_pkts(2, 3, pcap_file, filters= ) > + dst_ip_list =3D [] > + for packet in sniff_pkts: > + dst_ip_list.append(packet.getlayer(1).dst) > + self.verify( "200.0.0.12" in dst_ip_list, "rule 2 test fail") > + > + #rule 3 test > + pcap_file =3D '/tmp/pt_3.pcap' > + pkt =3D > [Ether(dst=3Dself.vf3_mac)/IP(src=3D"100.0.0.13",dst=3D"200.0.0.13")/TCP(= sport=3D103, > dport=3D203)/Raw(load=3D"X"*6)] > + self.write_pcap_file(pcap_file, pkt) > + filters =3D "tcp" > + sniff_pkts =3D self.send_and_sniff_pkts(3, 2, pcap_file, filters= ) > + dst_ip_list =3D [] > + for packet in sniff_pkts: > + dst_ip_list.append(packet.getlayer(1).dst) > + self.verify( "200.0.0.13" in dst_ip_list, "rule 3 test fail") > + > + sleep(1) > + self.destroy_env(self.port_nums, driver=3Dself.drivername) > + for port_id in self.dut_ports: > + port =3D self.dut.ports_info[port_id]['port'] > + port.bind_driver(driver=3Dself.drivername) > + > + def test_pipeline_with_tap(self): > + """ > + pipeline with tap > + """ > + cmd =3D "sed -i -e > 's/0000:02:00.0/%s/' ./examples/ip_pipeline/examples/tap.cli" % > self.dut_p0_pci > + self.dut.send_expect(cmd, "# ", 20) > + cmd =3D "sed -i -e > 's/0000:02:00.1/%s/' ./examples/ip_pipeline/examples/tap.cli" % > self.dut_p1_pci > + self.dut.send_expect(cmd, "# ", 20) > + > + IP_PIPELINE =3D "./examples/ip_pipeline/build/ip_pipeline" > + DUT_PORTS =3D " -w {0} -w {1} "\ > + .format(self.dut_p0_pci, self.dut_p1_pci) > + SCRIPT_FILE =3D "./examples/ip_pipeline/examples/tap.cli" > + > + cmd =3D "{0} -c 0x3 -n 4 {1} -- -s {2}".format(IP_PIPELINE, DUT_= PORTS, > SCRIPT_FILE) > + self.dut.send_expect(cmd, "fwd port 3", 60) > + > + tap_session =3D self.dut.new_session() > + cmd =3D "ip link set br1 down; brctl delbr br1" > + tap_session.send_expect(cmd, "# ", 20) > + cmd =3D "brctl addbr br1; brctl addif br1 TAP0; brctl addif br1 = TAP1" > + tap_session.send_expect(cmd, "# ", 20) > + cmd =3D "ifconfig TAP0 up; ifconfig TAP1 up; ifconfig br1 up" > + tap_session.send_expect(cmd, "# ", 20) > + #rule 0 test > + pcap_file =3D '/tmp/tap_0.pcap' > + pkt =3D > [Ether(dst=3Dself.dut_p0_mac)/IP(src=3D"100.0.0.10",dst=3D"200.0.0.10")/T= CP(sport=3D1 > 00,dport=3D200)/Raw(load=3D"X"*6)] > + self.write_pcap_file(pcap_file, pkt) > + filters =3D "tcp" > + sniff_pkts =3D self.send_and_sniff_pkts(0, 1, pcap_file, filters= ) > + dst_ip_list =3D [] > + for packet in sniff_pkts: > + dst_ip_list.append(packet.getlayer(1).dst) > + self.verify( "200.0.0.10" in dst_ip_list, "link 1 failed to > + receive packet") > + > + #rule 1 test > + pcap_file =3D '/tmp/tap_1.pcap' > + pkt =3D > [Ether(dst=3Dself.dut_p1_mac)/IP(src=3D"100.0.0.11",dst=3D"200.0.0.11")/T= CP(sport=3D1 > 01,dport=3D201)/Raw(load=3D"X"*6)] > + self.write_pcap_file(pcap_file, pkt) > + filters =3D "tcp" > + sniff_pkts =3D self.send_and_sniff_pkts(1, 0, pcap_file, filters= ) > + dst_ip_list =3D [] > + for packet in sniff_pkts: > + dst_ip_list.append(packet.getlayer(1).dst) > + self.verify( "200.0.0.11" in dst_ip_list, "link 0 failed to > + receive packet") > + > + sleep(1) > + cmd =3D "^C" > + self.dut.send_expect(cmd, "# ", 20) > + > + cmd =3D "ip link set br1 down; brctl delbr br1" > + tap_session.send_expect(cmd, "# ", 20) > + self.dut.close_session(tap_session) > + > + def test_rss_pipeline(self): > + """ > + rss pipeline > + """ > + cmd =3D "sed -i -e > 's/0000:02:00.0/%s/' ./examples/ip_pipeline/examples/rss.cli" % self.dut_= p0_pci > + self.dut.send_expect(cmd, "# ", 20) > + cmd =3D "sed -i -e > 's/0000:02:00.1/%s/' ./examples/ip_pipeline/examples/rss.cli" % self.dut_= p1_pci > + self.dut.send_expect(cmd, "# ", 20) > + cmd =3D "sed -i -e > 's/0000:06:00.0/%s/' ./examples/ip_pipeline/examples/rss.cli" % self.dut_= p2_pci > + self.dut.send_expect(cmd, "# ", 20) > + cmd =3D "sed -i -e > 's/0000:06:00.1/%s/' ./examples/ip_pipeline/examples/rss.cli" % self.dut_= p3_pci > + self.dut.send_expect(cmd, "# ", 20) > + > + IP_PIPELINE =3D "./examples/ip_pipeline/build/ip_pipeline" > + DUT_PORTS =3D " -w {0} -w {1} -w {2} -w {3} "\ > + .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p= 2_pci, > self.dut_p3_pci) > + SCRIPT_FILE =3D "./examples/ip_pipeline/examples/rss.cli" > + > + cmd =3D "{0} -c 0x1f -n 4 {1} -- -s {2}".format(IP_PIPELINE, DUT= _PORTS, > SCRIPT_FILE) > + self.dut.send_expect(cmd, "PIPELINE3 enable", 60) > + > + #rule 0 test > + pcap_file =3D '/tmp/rss_0.pcap' > + pkt =3D > [Ether(dst=3Dself.dut_p0_mac)/IP(src=3D"100.0.10.1",dst=3D"100.0.20.2")/R= aw(load=3D" > X"*6)] > + self.write_pcap_file(pcap_file, pkt) > + filters =3D "dst host 100.0.20.2" > + sniff_pkts =3D self.send_and_sniff_pkts(0, 0, pcap_file, filters= ) > + dst_ip_list =3D [] > + for packet in sniff_pkts: > + dst_ip_list.append(packet.getlayer(1).dst) > + self.verify( "100.0.20.2" in dst_ip_list, "rule 0 test fail") > + > + #rule 1 test > + pcap_file =3D '/tmp/rss_1.pcap' > + pkt =3D > [Ether(dst=3Dself.dut_p0_mac)/IP(src=3D"100.0.0.0",dst=3D"100.0.0.1")/Raw= (load=3D"X"* > 6)] > + self.write_pcap_file(pcap_file, pkt) > + filters =3D "dst host 100.0.0.1" > + sniff_pkts =3D self.send_and_sniff_pkts(0, 1, pcap_file, filters= ) > + dst_ip_list =3D [] > + for packet in sniff_pkts: > + dst_ip_list.append(packet.getlayer(1).dst) > + self.verify( "100.0.0.1" in dst_ip_list, "rule 1 test fail") > + > + #rule 2 test > + pcap_file =3D '/tmp/rss_2.pcap' > + pkt =3D > [Ether(dst=3Dself.dut_p0_mac)/IP(src=3D"100.0.10.1",dst=3D"100.0.0.2")/Ra= w(load=3D"X" > *6)] > + self.write_pcap_file(pcap_file, pkt) > + filters =3D "dst host 100.0.0.2" > + sniff_pkts =3D self.send_and_sniff_pkts(0, 2, pcap_file, filters= ) > + dst_ip_list =3D [] > + for packet in sniff_pkts: > + dst_ip_list.append(packet.getlayer(1).dst) > + self.verify( "100.0.0.2" in dst_ip_list, "rule 2 test fail") > + > + #rule 3 test > + pcap_file =3D '/tmp/rss_3.pcap' > + pkt =3D > [Ether(dst=3Dself.dut_p0_mac)/IP(src=3D"100.0.0.1",dst=3D"100.0.10.2")/Ra= w(load=3D"X" > *6)] > + self.write_pcap_file(pcap_file, pkt) > + filters =3D "dst host 100.0.10.2" > + sniff_pkts =3D self.send_and_sniff_pkts(0, 3, pcap_file, filters= ) > + dst_ip_list =3D [] > + for packet in sniff_pkts: > + dst_ip_list.append(packet.getlayer(1).dst) > + self.verify( "100.0.10.2" in dst_ip_list, "rule 3 test fail") > + > + sleep(1) > + cmd =3D "^C" > + self.dut.send_expect(cmd, "# ", 20) > + > + def tear_down(self): > + """ > + Run after each test case. > + """ > + pass > + > + def tear_down_all(self): > + """ > + Run after each test suite. > + """ > + self.dut.close_session(self.session_secondary) > + self.dut.kill_all() > -- > 2.5.0