* [dts] [PATCH v2 0/4] add pipeline suite
@ 2020-11-13 8:03 Churchill Khangar
2020-11-13 8:03 ` [dts] [PATCH v2 1/4] dep: add pipeline test suite dependencies Churchill Khangar
` (4 more replies)
0 siblings, 5 replies; 6+ messages in thread
From: Churchill Khangar @ 2020-11-13 8:03 UTC (permalink / raw)
To: dts
Cc: cristian.dumitrescu, venkata.suresh.kumar.p, churchill.khangar,
yogesh.jangra
This patch series adds a new test suite for pipeline application.
Pipeline example is an application for improved Software Switch (SWX) pipeline type that supports
dynamically-defined packet headers, meta-data, actions and pipelines.
Actions and pipelines are defined through instructions.
New pipeline test suites aims to verify the all supported instructions by using required
input, spec and cli files which are part of dependences directory(dep/pipeline.tar.gz).
Patch details
1. Patch1 adds the pipeline dependencies archive and compressed file pipeline.tar.gz
2. Patch2 adds the details of pipeline test plan details pipeline_test_plan.rst
3. Patch3 adds the pipeline new test suite implementation file TestSuite_pipeline.py
4. Patch4 adds new pipeline application configuration in app_name.cfg file
Churchill Khangar (4):
dep: add pipeline test suite dependencies
test_plans: add pipeline test plan document
tests: add pipeline test suite
conf/app_name: add pipeline app name config
conf/app_name.cfg | 2 +
dep/pipeline.tar.gz | Bin 0 -> 119666 bytes
test_plans/pipeline_test_plan.rst | 122 +
tests/TestSuite_pipeline.py | 5833 +++++++++++++++++++++++++++++++++++++
4 files changed, 5957 insertions(+)
create mode 100644 dep/pipeline.tar.gz
create mode 100644 test_plans/pipeline_test_plan.rst
create mode 100644 tests/TestSuite_pipeline.py
--
1.8.3.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* [dts] [PATCH v2 1/4] dep: add pipeline test suite dependencies
2020-11-13 8:03 [dts] [PATCH v2 0/4] add pipeline suite Churchill Khangar
@ 2020-11-13 8:03 ` Churchill Khangar
2020-11-13 8:03 ` [dts] [PATCH v2 2/4] test_plans: add pipeline test plan document Churchill Khangar
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Churchill Khangar @ 2020-11-13 8:03 UTC (permalink / raw)
To: dts
Cc: cristian.dumitrescu, venkata.suresh.kumar.p, churchill.khangar,
yogesh.jangra
This patch has the pipeline test suite dependencies
required to run all test cases.
Signed-off-by: Yogesh Jangra <yogesh.jangra@intel.com>
Signed-off-by: Churchill Khangar <churchill.khangar@intel.com>
Tested-by: Venkata Suresh Kumar P <venkata.suresh.kumar.p@intel.com>
---
dep/pipeline.tar.gz | Bin 0 -> 119666 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 dep/pipeline.tar.gz
diff --git a/dep/pipeline.tar.gz b/dep/pipeline.tar.gz
new file mode 100644
index 0000000000000000000000000000000000000000..dae46a130d9ff222e77d5a767ce91582b49a252e
GIT binary patch
literal 119666
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
Vc@{8u^7Z6@{<-=V(F_}e82~Gz5h(xw
literal 0
HcmV?d00001
--
1.8.3.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* [dts] [PATCH v2 2/4] test_plans: add pipeline test plan document
2020-11-13 8:03 [dts] [PATCH v2 0/4] add pipeline suite Churchill Khangar
2020-11-13 8:03 ` [dts] [PATCH v2 1/4] dep: add pipeline test suite dependencies Churchill Khangar
@ 2020-11-13 8:03 ` Churchill Khangar
2020-11-13 8:03 ` [dts] [PATCH v2 3/4] tests: add pipeline test suite Churchill Khangar
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Churchill Khangar @ 2020-11-13 8:03 UTC (permalink / raw)
To: dts
Cc: cristian.dumitrescu, venkata.suresh.kumar.p, churchill.khangar,
yogesh.jangra
Add pipeline test plan document pipeline_test_plan.rst
Signed-off-by: Yogesh Jangra <yogesh.jangra@intel.com>
Signed-off-by: Churchill Khangar <churchill.khangar@intel.com>
Tested-by: Venkata Suresh Kumar P <venkata.suresh.kumar.p@intel.com>
---
test_plans/pipeline_test_plan.rst | 122 ++++++++++++++++++++++++++++++++++++++
1 file changed, 122 insertions(+)
create mode 100644 test_plans/pipeline_test_plan.rst
diff --git a/test_plans/pipeline_test_plan.rst b/test_plans/pipeline_test_plan.rst
new file mode 100644
index 0000000..c492fd6
--- /dev/null
+++ b/test_plans/pipeline_test_plan.rst
@@ -0,0 +1,122 @@
+.. Copyright (c) <2020>, Intel Corporation
+ 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.
+
+=============================
+Pipeline Tests
+=============================
+
+Description
+===========
+The "examples/pipeline" application is the main DPDK Packet Framework
+application.
+
+Prerequisites
+==============
+The DUT must have four 10G Ethernet ports connected to four ports on
+Tester that are controlled by the Scapy packet generator::
+
+ dut_port_0 <---> tester_port_0
+ dut_port_1 <---> tester_port_1
+ dut_port_2 <---> tester_port_2
+ dut_port_3 <---> tester_port_3
+
+Assume four DUT 10G Ethernet ports' pci device id is as the following::
+
+ dut_port_0 : "0000:00:04.0"
+ dut_port_1 : "0000:00:05.0"
+ dut_port_2 : "0000:00:06.0"
+ dut_port_3 : "0000:00:07.0"
+
+Bind them to dpdk igb_uio driver::
+
+ ./usertools/dpdk-devbind.py -b igb_uio 0000:00:04.0 0000:00:05.0 0000:00:06.0 0000:00:07.0
+
+Supporting Files
+================
+All the supporting files for this test suite are maintained in a tar file named "pipeline.tar.gz"
+present in the {DTS_SRC_DIR}/dep directory.
+
+Directory Structure of Each Test Case
+=====================================
+Within {DTS_SRC_DIR}/dep/pipeline.tar.gz, all files related to a particular test case are maintained
+in a separate directory of which the directory structure is shown below:
+
+ test_case_name [directory]
+ test_case_name.spec
+ test_case_name.cli
+ table.txt [applicable for test cases requiring it]
+ readme.txt
+ pcap_files [subdirectory]
+ in_x.txt [x: 1-4; depending on test case]
+ out_x.txt [x: 1-4; depending on test case]
+
+For an example, files related to mov_001 test case are maintained as shown below:
+
+ mov_001 [directory]
+ mov_001.spec
+ mov_001.cli
+ readme.txt
+ pcap_files [subdirectory]
+ in_1.txt
+ out_1.txt
+
+Template of each Test Case
+===========================
+1. Edit test_case_name/test_case_name.cli:
+ change pci device id of LINK0, LINK1, LINK2, LINK3 to pci device id of
+ dut_port_0, dut_port_1, dut_port_2, dut_port_3
+
+2. Run pipeline app as the following::
+
+ x86_64-native-linuxapp-gcc/examples/dpdk-pipeline -c 0x3 -n 4 -- -s /tmp/pipeline/test_case_name/test_case_name.cli
+
+3. Send packets at tester side using scapy. The packets to be sent are maintained in pipeline/test_case_name/pcap_files/in_x.txt
+
+4. Verify the packets received using tcpdump. The expected packets are maintained in pipeline/test_case_name/pcap_files/out_x.txt
+
+5. Test case is considered as successful if the received packets and the expected packets match for all the port combinations used.
+
+Example Test Case: test_mov_001
+=========================================
+1. Edit mov_001/mov_001.cli:
+ change pci device id of LINK0, LINK1, LINK2, LINK3 to pci device id of
+ dut_port_0, dut_port_1, dut_port_2, dut_port_3
+
+2. Run pipeline app as the following::
+
+ x86_64-native-linuxapp-gcc/examples/dpdk-pipeline -c 0x3 -n 4 -- -s /tmp/pipeline/mov_001/mov_001.cli
+
+3. Send packets at tester side using scapy. The packets to be sent are maintained in pipeline/mov_001/pcap_files/in_1.txt
+
+4. Verify the packets received using tcpdump. The expected packets are maintained in pipeline/mov_001/pcap_files/out_1.txt
+
+5. test_mov_001 is considered as successful if the received packets and the expected packets match for all 4 port combinations used.
--
1.8.3.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* [dts] [PATCH v2 3/4] tests: add pipeline test suite
2020-11-13 8:03 [dts] [PATCH v2 0/4] add pipeline suite Churchill Khangar
2020-11-13 8:03 ` [dts] [PATCH v2 1/4] dep: add pipeline test suite dependencies Churchill Khangar
2020-11-13 8:03 ` [dts] [PATCH v2 2/4] test_plans: add pipeline test plan document Churchill Khangar
@ 2020-11-13 8:03 ` Churchill Khangar
2020-11-13 8:03 ` [dts] [PATCH v2 4/4] conf/app_name: add pipeline app name config Churchill Khangar
2020-11-18 3:29 ` [dts] [PATCH v2 0/4] add pipeline suite Tu, Lijuan
4 siblings, 0 replies; 6+ messages in thread
From: Churchill Khangar @ 2020-11-13 8:03 UTC (permalink / raw)
To: dts
Cc: cristian.dumitrescu, venkata.suresh.kumar.p, churchill.khangar,
yogesh.jangra
Add new test suite for pipeline TestSuite_pipeline.py
Signed-off-by: Yogesh Jangra <yogesh.jangra@intel.com>
Signed-off-by: Churchill Khangar <churchill.khangar@intel.com>
Tested-by: Venkata Suresh Kumar P <venkata.suresh.kumar.p@intel.com>
---
tests/TestSuite_pipeline.py | 5833 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 5833 insertions(+)
create mode 100644 tests/TestSuite_pipeline.py
diff --git a/tests/TestSuite_pipeline.py b/tests/TestSuite_pipeline.py
new file mode 100644
index 0000000..9b13575
--- /dev/null
+++ b/tests/TestSuite_pipeline.py
@@ -0,0 +1,5833 @@
+# BSD LICENSE
+#
+# Copyright(c) 2020 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
+
+import itertools
+
+TIMESTAMP = re.compile(r'\d{2}\:\d{2}\:\d{2}\.\d{6}')
+PAYLOAD = re.compile(r'\t0x([0-9a-fA-F]+): ([0-9a-fA-F ]+)')
+
+FILE_DIR = os.path.dirname(os.path.abspath(__file__)).split(os.path.sep)
+DEP_DIR = os.path.sep.join(FILE_DIR[:-1]) + '/dep/'
+
+
+class TestPipeline(TestCase):
+
+ def pair_hex_digits(self, iterable, count, fillvalue=None):
+ args = [iter(iterable)] * count
+ return itertools.zip_longest(*args, fillvalue=fillvalue)
+
+ def convert_tcpdump_to_text2pcap(self, in_filename, out_filename):
+ with open(in_filename) as input, open(out_filename, 'w') as output:
+ output.write('# SPDX-License-Identifier: BSD-3-Clause\n')
+ output.write('# Copyright(c) 2020 Intel Corporation\n')
+ output.write('#\n\n')
+ output.write('# text to pcap: text2pcap packet.txt packet.pcap\n')
+ output.write('# pcap to text: tcpdump -r packet.pcap -xx\n\n')
+
+ i = 0
+ flag_line_completed = 0
+ for line in input:
+ time = TIMESTAMP.match(line)
+ if time:
+ # print("time match")
+ if flag_line_completed == 1:
+ flag_line_completed = 0
+ output.write('\n# Packet {}\n'.format(i))
+ else:
+ output.write('# Packet {}\n'.format(i))
+ i += 1
+ continue
+ payload = PAYLOAD.match(line)
+ if payload:
+ # print("payload match")
+ address = payload.group(1)
+ hex_data = payload.group(2).replace(' ', '')
+ hex_data = ' '.join(''.join(part) for part in self.pair_hex_digits(hex_data, 2, ' '))
+ # print('{} {}'.format(address, hex_data))
+ # print(len(hex_data))
+ if (len(hex_data) < 47):
+ output.write('{:0>6} {:<47}\n'.format(address, hex_data))
+ output.write('\n')
+ flag_line_completed = 0
+ else:
+ output.write('{:0>6} {:<47}\n'.format(address, hex_data))
+ flag_line_completed = 1
+
+ if flag_line_completed == 1:
+ output.write('\n')
+
+ def get_flow_direction_param_of_tcpdump(self):
+ """
+ get flow dirction param depend on tcpdump version
+ """
+ param = ""
+ direct_param = r"(\s+)\[ (\S+) in\|out\|inout \]"
+ out = self.tester.send_expect('tcpdump -h', '# ')
+ for line in out.split('\n'):
+ m = re.match(direct_param, line)
+ if m:
+ opt = re.search("-Q", m.group(2))
+ if opt:
+ param = "-Q" + " in"
+ else:
+ opt = re.search("-P", m.group(2))
+ if opt:
+ param = "-P" + " in"
+ if len(param) == 0:
+ self.logger.info("tcpdump not support direction choice!!!")
+ return param
+
+ def tcpdump_start_sniff(self, interface, filters=""):
+ """
+ Starts tcpdump in the background to sniff packets that received by interface.
+ """
+ command = 'rm -f /tmp/tcpdump_{0}.pcap'.format(interface)
+ self.tester.send_expect(command, '#')
+ command = 'tcpdump -nn -e {0} -w /tmp/tcpdump_{1}.pcap -i {1} {2} 2>/tmp/tcpdump_{1}.out &'\
+ .format(self.param_flow_dir, 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 process
+ 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 = []
+ try:
+ pcap_pkts = rdpcap(pcap_file)
+ except:
+ raise Exception("write pcap error")
+
+ return pcap_pkts
+
+ def send_and_sniff_pkts(self, from_port, to_port, in_pcap_file, out_pcap_file, filters=""):
+ """
+ Sent pkts that read from the pcap_file.
+ Return the sniff pkts.
+ """
+ tx_port = self.tester.get_local_port(self.dut_ports[from_port])
+ rx_port = self.tester.get_local_port(self.dut_ports[to_port])
+
+ tx_interface = self.tester.get_interface(tx_port)
+ rx_interface = self.tester.get_interface(rx_port)
+
+ self.tester.send_expect('rm -f /tmp/*.txt /tmp/*.pcap /tmp/*.out', '# ')
+ self.tcpdump_start_sniff(rx_interface, filters)
+
+ # Prepare the pkts to be sent
+ self.tester.scapy_foreground()
+ self.tester.send_expect('text2pcap -q {} /tmp/packet_tx.pcap'.format('/tmp/' + in_pcap_file), '# ')
+ self.tester.scapy_append('pkt = rdpcap("/tmp/packet_tx.pcap")')
+ self.tester.scapy_append('sendp(pkt, iface="{}", count=1)'.format(tx_interface))
+ self.tester.scapy_execute()
+ self.tcpdump_stop_sniff()
+ self.tester.send_expect(
+ 'tcpdump -n -r /tmp/tcpdump_{}.pcap -xx > /tmp/packet_rx.txt'.format(rx_interface), '# ')
+ self.convert_tcpdump_to_text2pcap('/tmp/packet_rx.txt', '/tmp/packet_rx_rcv.txt')
+ out = self.tester.send_command(
+ 'diff -sqw /tmp/packet_rx_rcv.txt {}'.format('/tmp/' + out_pcap_file), timeout=0.5)
+ if "differ" in out:
+ self.dut.send_expect('^C', '# ')
+ self.verify("are identical" in out, "Output pcap files mismatch error")
+
+ def setup_env(self, port_nums, driver):
+ """
+ This is to set up vf environment.
+ The pf is bound to dpdk driver.
+ """
+ self.dut.send_expect("modprobe vfio-pci", "# ")
+ if driver == 'default':
+ for port_id in self.dut_ports:
+ port = 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_port'])
+ if driver == 'default':
+ self.dut.send_expect("ip link set %s vf 0 mac %s" % (self.pf0_interface, self.vf0_mac), "# ", 3)
+ self.dut.send_expect("ip link set %s vf 0 mac %s" % (self.pf1_interface, self.vf1_mac), "# ", 3)
+ self.dut.send_expect("ip link set %s vf 0 mac %s" % (self.pf2_interface, self.vf2_mac), "# ", 3)
+ self.dut.send_expect("ip link set %s vf 0 mac %s" % (self.pf3_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="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 = "^C"
+ self.session_secondary.send_expect(cmd, "# ", 20)
+ time.sleep(5)
+ if driver == 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 = self.dut.get_ports()
+ self.port_nums = 4
+ self.verify(len(self.dut_ports) >= self.port_nums,
+ "Insufficient ports for speed testing")
+
+ self.dut_p0_pci = self.dut.get_port_pci(self.dut_ports[0])
+ self.dut_p1_pci = self.dut.get_port_pci(self.dut_ports[1])
+ self.dut_p2_pci = self.dut.get_port_pci(self.dut_ports[2])
+ self.dut_p3_pci = self.dut.get_port_pci(self.dut_ports[3])
+
+ self.dut_p0_mac = self.dut.get_mac_address(self.dut_ports[0])
+ self.dut_p1_mac = self.dut.get_mac_address(self.dut_ports[1])
+ self.dut_p2_mac = self.dut.get_mac_address(self.dut_ports[2])
+ self.dut_p3_mac = self.dut.get_mac_address(self.dut_ports[3])
+
+ self.pf0_interface = self.dut.ports_info[self.dut_ports[0]]['intf']
+ self.pf1_interface = self.dut.ports_info[self.dut_ports[1]]['intf']
+ self.pf2_interface = self.dut.ports_info[self.dut_ports[2]]['intf']
+ self.pf3_interface = self.dut.ports_info[self.dut_ports[3]]['intf']
+
+ self.vf0_mac = "00:11:22:33:44:55"
+ self.vf1_mac = "00:11:22:33:44:56"
+ self.vf2_mac = "00:11:22:33:44:57"
+ self.vf3_mac = "00:11:22:33:44:58"
+
+ self.sriov_vfs_port = []
+ self.session_secondary = self.dut.new_session()
+
+ out = self.dut.build_dpdk_apps("./examples/pipeline")
+ self.verify("Error" not in out, "Compilation error")
+ self.app_pipeline_path = self.dut.apps_name['pipeline']
+ self.app_testpmd_path = self.dut.apps_name['test-pmd']
+ self.param_flow_dir = self.get_flow_direction_param_of_tcpdump()
+
+ # update the ./dep/pipeline.tar.gz file for any new changes
+ P4_PIPILINE_TAR_FILE = DEP_DIR + 'pipeline.tar.gz'
+ self.tester.send_expect('rm -rf /tmp/pipeline', '# ')
+ self.tester.send_expect('tar -zxf {} --directory /tmp'.format(P4_PIPILINE_TAR_FILE), "# ", 20)
+
+ # copy the ./dep/pipeline.tar.gz file to DUT
+ self.dut.send_expect('rm -rf /tmp/pipeline.tar.gz /tmp/pipeline', "# ", 20)
+ self.session_secondary.copy_file_to('dep/pipeline.tar.gz', '/tmp/')
+ self.dut.send_expect('tar -zxf /tmp/pipeline.tar.gz --directory /tmp', "# ", 20)
+
+ def set_up(self):
+ """
+ Run before each test case.
+ """
+ pass
+
+ def test_rx_tx_001(self):
+ """
+ rx_tx_001: revert the received packet on the same port without any change
+ """
+ cli_file = '/tmp/pipeline/rx_tx_001/rx_tx_001.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/rx_tx_001/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/rx_tx_001/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_extract_emit_001(self):
+ """
+ extract_emit_001: revert the received packet on the same port without any change
+ """
+ cli_file = '/tmp/pipeline/extract_emit_001/extract_emit_001.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/extract_emit_001/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/extract_emit_001/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_extract_emit_002(self):
+
+ cli_file = '/tmp/pipeline/extract_emit_002/extract_emit_002.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/extract_emit_002/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/extract_emit_002/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_extract_emit_003(self):
+
+ cli_file = '/tmp/pipeline/extract_emit_003/extract_emit_003.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/extract_emit_003/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/extract_emit_003/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_extract_emit_004(self):
+
+ cli_file = '/tmp/pipeline/extract_emit_004/extract_emit_004.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/extract_emit_004/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/extract_emit_004/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_extract_emit_005(self):
+
+ cli_file = '/tmp/pipeline/extract_emit_005/extract_emit_005.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/extract_emit_005/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/extract_emit_005/pcap_files/out_1.txt'
+ filters = "vlan"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_extract_emit_006(self):
+
+ cli_file = '/tmp/pipeline/extract_emit_006/extract_emit_006.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/extract_emit_006/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/extract_emit_006/pcap_files/out_1.txt'
+ filters = "udp port 4789"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_extract_emit_007(self):
+
+ cli_file = '/tmp/pipeline/extract_emit_007/extract_emit_007.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/extract_emit_007/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/extract_emit_007/pcap_files/out_1.txt'
+ filters = "udp port 4789"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_extract_emit_008(self):
+
+ cli_file = '/tmp/pipeline/extract_emit_008/extract_emit_008.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/extract_emit_008/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/extract_emit_008/pcap_files/out_1.txt'
+ filters = "udp port 4789"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_extract_emit_009(self):
+
+ cli_file = '/tmp/pipeline/extract_emit_009/extract_emit_009.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/extract_emit_009/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/extract_emit_009/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_and_001(self):
+
+ cli_file = '/tmp/pipeline/and_001/and_001.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/and_001/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/and_001/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_and_002(self):
+
+ cli_file = '/tmp/pipeline/and_002/and_002.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/and_002/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/and_002/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 0, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_and_003(self):
+
+ cli_file = '/tmp/pipeline/and_003/and_003.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/and_003/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/and_003/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_and_004(self):
+
+ cli_file = '/tmp/pipeline/and_004/and_004.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/and_004/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/and_004/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_and_005(self):
+
+ cli_file = '/tmp/pipeline/and_005/and_005.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/and_005/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/and_005/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_and_006(self):
+
+ cli_file = '/tmp/pipeline/and_006/and_006.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/and_006/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/and_006/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_and_007(self):
+
+ cli_file = '/tmp/pipeline/and_007/and_007.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/and_007/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/and_007/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_and_008(self):
+
+ cli_file = '/tmp/pipeline/and_008/and_008.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/and_008/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/and_008/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_or_001(self):
+
+ cli_file = '/tmp/pipeline/or_001/or_001.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/or_001/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/or_001/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_or_002(self):
+
+ cli_file = '/tmp/pipeline/or_002/or_002.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/or_002/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/or_002/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_or_003(self):
+
+ cli_file = '/tmp/pipeline/or_003/or_003.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/or_003/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/or_003/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_or_004(self):
+
+ cli_file = '/tmp/pipeline/or_004/or_004.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/or_004/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/or_004/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_or_005(self):
+
+ cli_file = '/tmp/pipeline/or_005/or_005.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/or_005/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/or_005/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_or_006(self):
+
+ cli_file = '/tmp/pipeline/or_006/or_006.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/or_006/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/or_006/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_or_007(self):
+
+ cli_file = '/tmp/pipeline/or_007/or_007.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/or_007/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/or_007/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_or_008(self):
+
+ cli_file = '/tmp/pipeline/or_008/or_008.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/or_008/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/or_008/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 3, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_xor_001(self):
+
+ cli_file = '/tmp/pipeline/xor_001/xor_001.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/xor_001/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/xor_001/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 3, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 2, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_xor_002(self):
+
+ cli_file = '/tmp/pipeline/xor_002/xor_002.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/xor_002/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/xor_002/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_xor_003(self):
+
+ cli_file = '/tmp/pipeline/xor_003/xor_003.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/xor_003/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/xor_003/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_xor_004(self):
+
+ cli_file = '/tmp/pipeline/xor_004/xor_004.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/xor_004/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/xor_004/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_xor_005(self):
+
+ cli_file = '/tmp/pipeline/xor_005/xor_005.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/xor_005/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/xor_005/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_xor_006(self):
+ """
+ find entry in the table based on the des mac address,
+ then update the src mac address to the mac address in the table.
+ """
+
+ cli_file = '/tmp/pipeline/xor_006/xor_006.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ in_pcap_file = 'pipeline/xor_006/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/xor_006/pcap_files/out_1.txt'
+ filters = "tcp"
+
+ # rule 0 test
+ sniff_pkts = self.send_and_sniff_pkts(0, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 3, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 2, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_xor_007(self):
+ """
+ find entry in the table based on the des mac address,
+ then update the src mac address to the mac address in the table.
+ """
+
+ cli_file = '/tmp/pipeline/xor_007/xor_007.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ in_pcap_file = 'pipeline/xor_007/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/xor_007/pcap_files/out_1.txt'
+ filters = "tcp"
+
+ # rule 0 test
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_xor_008(self):
+
+ cli_file = '/tmp/pipeline/xor_008/xor_008.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/xor_008/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/xor_008/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_add_001(self):
+
+ cli_file = '/tmp/pipeline/add_001/add_001.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/add_001/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/add_001/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_add_002(self):
+
+ cli_file = '/tmp/pipeline/add_002/add_002.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/add_002/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/add_002/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_add_003(self):
+
+ cli_file = '/tmp/pipeline/add_003/add_003.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/add_003/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/add_003/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_add_004(self):
+
+ cli_file = '/tmp/pipeline/add_004/add_004.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/add_004/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/add_004/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_add_005(self):
+
+ cli_file = '/tmp/pipeline/add_005/add_005.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/add_005/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/add_005/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_add_006(self):
+
+ cli_file = '/tmp/pipeline/add_006/add_006.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/add_006/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/add_006/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_add_007(self):
+
+ cli_file = '/tmp/pipeline/add_007/add_007.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/add_007/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/add_007/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_add_008(self):
+
+ cli_file = '/tmp/pipeline/add_008/add_008.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/add_008/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/add_008/pcap_files/out_1.txt'
+ filters = "udp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_shl_001(self):
+
+ cli_file = '/tmp/pipeline/shl_001/shl_001.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/shl_001/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/shl_001/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_shl_002(self):
+
+ cli_file = '/tmp/pipeline/shl_002/shl_002.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/shl_002/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/shl_002/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_shl_003(self):
+
+ cli_file = '/tmp/pipeline/shl_003/shl_003.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/shl_003/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/shl_003/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_shl_004(self):
+
+ cli_file = '/tmp/pipeline/shl_004/shl_004.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/shl_004/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/shl_004/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_shl_005(self):
+
+ cli_file = '/tmp/pipeline/shl_005/shl_005.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/shl_005/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/shl_005/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_shl_006(self):
+
+ cli_file = '/tmp/pipeline/shl_006/shl_006.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/shl_006/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/shl_006/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_shl_007(self):
+
+ cli_file = '/tmp/pipeline/shl_007/shl_007.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/shl_007/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/shl_007/pcap_files/out_1.txt'
+ filters = "udp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_shl_008(self):
+
+ cli_file = '/tmp/pipeline/shl_008/shl_008.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/shl_008/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/shl_008/pcap_files/out_1.txt'
+ filters = "udp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_shr_001(self):
+
+ cli_file = '/tmp/pipeline/shr_001/shr_001.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/shr_001/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/shr_001/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_shr_002(self):
+
+ cli_file = '/tmp/pipeline/shr_002/shr_002.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/shr_002/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/shr_002/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_shr_003(self):
+
+ cli_file = '/tmp/pipeline/shr_003/shr_003.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/shr_003/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/shr_003/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_shr_004(self):
+
+ cli_file = '/tmp/pipeline/shr_004/shr_004.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/shr_004/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/shr_004/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_shr_005(self):
+
+ cli_file = '/tmp/pipeline/shr_005/shr_005.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/shr_005/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/shr_005/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_shr_006(self):
+
+ cli_file = '/tmp/pipeline/shr_006/shr_006.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/shr_006/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/shr_006/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_shr_007(self):
+
+ cli_file = '/tmp/pipeline/shr_007/shr_007.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/shr_007/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/shr_007/pcap_files/out_1.txt'
+ filters = "udp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_shr_008(self):
+
+ cli_file = '/tmp/pipeline/shr_008/shr_008.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/shr_008/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/shr_008/pcap_files/out_1.txt'
+ filters = "udp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_sub_001(self):
+
+ cli_file = '/tmp/pipeline/sub_001/sub_001.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/sub_001/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/sub_001/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_sub_002(self):
+
+ cli_file = '/tmp/pipeline/sub_002/sub_002.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/sub_002/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/sub_002/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_sub_003(self):
+
+ cli_file = '/tmp/pipeline/sub_003/sub_003.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/sub_003/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/sub_003/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_sub_004(self):
+
+ cli_file = '/tmp/pipeline/sub_004/sub_004.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/sub_004/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/sub_004/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_sub_005(self):
+
+ cli_file = '/tmp/pipeline/sub_005/sub_005.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/sub_005/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/sub_005/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_sub_006(self):
+
+ cli_file = '/tmp/pipeline/sub_006/sub_006.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/sub_006/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/sub_006/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_sub_007(self):
+
+ cli_file = '/tmp/pipeline/sub_007/sub_007.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/sub_007/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/sub_007/pcap_files/out_1.txt'
+ filters = "udp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_sub_008(self):
+
+ cli_file = '/tmp/pipeline/sub_008/sub_008.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/sub_008/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/sub_008/pcap_files/out_1.txt'
+ filters = "udp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_mov_001(self):
+
+ cli_file = '/tmp/pipeline/mov_001/mov_001.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/mov_001/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/mov_001/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_mov_002(self):
+ """
+ mov_002: swap destination and source MAC address of packets received on port
+ """
+ cli_file = '/tmp/pipeline/mov_002/mov_002.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/mov_002/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/mov_002/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_mov_003(self):
+
+ cli_file = '/tmp/pipeline/mov_003/mov_003.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/mov_003/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/mov_003/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_mov_004(self):
+ """
+ find entry in the table based on the des mac address,
+ then update the src mac address to the mac address in the table.
+ """
+
+ cli_file = '/tmp/pipeline/mov_004/mov_004.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ in_pcap_file = 'pipeline/mov_004/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/mov_004/pcap_files/out_1.txt'
+ filters = "tcp"
+
+ # rule 0 test
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_mov_005(self):
+ """
+ find entry in the table based on the des mac address,
+ then update the src mac address to the mac address in the table.
+ """
+
+ cli_file = '/tmp/pipeline/mov_005/mov_005.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ in_pcap_file = 'pipeline/mov_005/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/mov_005/pcap_files/out_1.txt'
+ filters = "tcp"
+
+ # rule 0 test
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 0, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_mov_007(self):
+ """
+ find entry in the table based on the des mac address,
+ then update the src mac address to the mac address in the table.
+ """
+
+ cli_file = '/tmp/pipeline/mov_007/mov_007.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ in_pcap_file = 'pipeline/mov_007/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/mov_007/pcap_files/out_1.txt'
+ filters = "tcp"
+
+ # rule 0 test
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 0, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_mov_008(self):
+ """
+ find entry in the table based on the des mac address,
+ then update the src mac address to the mac address in the table.
+ """
+
+ cli_file = '/tmp/pipeline/mov_008/mov_008.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ in_pcap_file = 'pipeline/mov_008/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/mov_008/pcap_files/out_1.txt'
+ filters = "tcp"
+
+ # rule 0 test
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_table_001(self):
+
+ cli_file = '/tmp/pipeline/table_001/table_001.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/table_001/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/table_001/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_vxlan_001(self):
+ """
+ example application: vxlan pipeline
+ """
+ cli_file = '/tmp/pipeline/vxlan_001/vxlan_001.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/vxlan_001/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/vxlan_001/pcap_files/out_1.txt'
+ filters = "udp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ in_pcap_file = 'pipeline/vxlan_001/pcap_files/in_2.txt'
+ out_pcap_file = 'pipeline/vxlan_001/pcap_files/out_2.txt'
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ in_pcap_file = 'pipeline/vxlan_001/pcap_files/in_3.txt'
+ out_pcap_file = 'pipeline/vxlan_001/pcap_files/out_3.txt'
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ in_pcap_file = 'pipeline/vxlan_001/pcap_files/in_4.txt'
+ out_pcap_file = 'pipeline/vxlan_001/pcap_files/out_4.txt'
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_dma_001(self):
+ """
+ example application: vxlan pipeline
+ """
+ cli_file = '/tmp/pipeline/dma_001/dma_001.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/dma_001/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/dma_001/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_dma_002(self):
+
+ cli_file = '/tmp/pipeline/dma_002/dma_002.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/dma_002/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/dma_002/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_dma_003(self):
+
+ cli_file = '/tmp/pipeline/dma_003/dma_003.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/dma_003/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/dma_003/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_dma_004(self):
+
+ cli_file = '/tmp/pipeline/dma_004/dma_004.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/dma_004/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/dma_004/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_dma_005(self):
+
+ cli_file = '/tmp/pipeline/dma_005/dma_005.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/dma_005/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/dma_005/pcap_files/out_1.txt'
+ filters = "vlan"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_dma_006(self):
+
+ cli_file = '/tmp/pipeline/dma_006/dma_006.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/dma_006/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/dma_006/pcap_files/out_1.txt'
+ filters = "udp port 4532"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_dma_007(self):
+
+ cli_file = '/tmp/pipeline/dma_007/dma_007.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/dma_007/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/dma_007/pcap_files/out_1.txt'
+ filters = "udp port 4532"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_dma_008(self):
+
+ cli_file = '/tmp/pipeline/dma_008/dma_008.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/dma_008/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/dma_008/pcap_files/out_1.txt'
+ filters = "udp port 4532"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_001(self):
+
+ cli_file = '/tmp/pipeline/jump_001/jump_001.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_001/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_001/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_002(self):
+
+ cli_file = '/tmp/pipeline/jump_002/jump_002.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_002/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_002/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_003(self):
+
+ cli_file = '/tmp/pipeline/jump_003/jump_003.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_003/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_003/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_004(self):
+
+ cli_file = '/tmp/pipeline/jump_004/jump_004.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_004/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_004/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_005(self):
+
+ cli_file = '/tmp/pipeline/jump_005/jump_005.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_005/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_005/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_006(self):
+
+ cli_file = '/tmp/pipeline/jump_006/jump_006.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_006/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_006/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_007(self):
+
+ cli_file = '/tmp/pipeline/jump_007/jump_007.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_007/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_007/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_008(self):
+
+ cli_file = '/tmp/pipeline/jump_008/jump_008.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_008/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_008/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_009(self):
+
+ cli_file = '/tmp/pipeline/jump_009/jump_009.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_009/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_009/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_010(self):
+
+ cli_file = '/tmp/pipeline/jump_010/jump_010.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_010/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_010/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_011(self):
+
+ cli_file = '/tmp/pipeline/jump_011/jump_011.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_011/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_011/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_012(self):
+
+ cli_file = '/tmp/pipeline/jump_012/jump_012.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_012/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_012/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_013(self):
+
+ cli_file = '/tmp/pipeline/jump_013/jump_013.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_013/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_013/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_014(self):
+
+ cli_file = '/tmp/pipeline/jump_014/jump_014.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_014/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_014/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_015(self):
+
+ cli_file = '/tmp/pipeline/jump_015/jump_015.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_015/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_015/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_016(self):
+
+ cli_file = '/tmp/pipeline/jump_016/jump_016.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_016/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_016/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_017(self):
+
+ cli_file = '/tmp/pipeline/jump_017/jump_017.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_017/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_017/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_018(self):
+
+ cli_file = '/tmp/pipeline/jump_018/jump_018.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_018/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_018/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_019(self):
+
+ cli_file = '/tmp/pipeline/jump_019/jump_019.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_019/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_019/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_020(self):
+
+ cli_file = '/tmp/pipeline/jump_020/jump_020.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_020/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_020/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_021(self):
+
+ cli_file = '/tmp/pipeline/jump_021/jump_021.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_021/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_021/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_022(self):
+
+ cli_file = '/tmp/pipeline/jump_022/jump_022.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_022/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_022/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_023(self):
+
+ cli_file = '/tmp/pipeline/jump_023/jump_023.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_023/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_023/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_024(self):
+
+ cli_file = '/tmp/pipeline/jump_024/jump_024.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_024/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_024/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_025(self):
+
+ cli_file = '/tmp/pipeline/jump_025/jump_025.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_025/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_025/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_026(self):
+
+ cli_file = '/tmp/pipeline/jump_026/jump_026.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_026/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_026/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_027(self):
+
+ cli_file = '/tmp/pipeline/jump_027/jump_027.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_027/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_027/pcap_files/out_1.txt'
+ filters = ""
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_028(self):
+
+ cli_file = '/tmp/pipeline/jump_028/jump_028.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_028/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_028/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_029(self):
+
+ cli_file = '/tmp/pipeline/jump_029/jump_029.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_029/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_029/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_030(self):
+
+ cli_file = '/tmp/pipeline/jump_030/jump_030.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_030/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_030/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_031(self):
+
+ cli_file = '/tmp/pipeline/jump_031/jump_031.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_031/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_031/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_032(self):
+
+ cli_file = '/tmp/pipeline/jump_032/jump_032.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_032/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_032/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_033(self):
+
+ cli_file = '/tmp/pipeline/jump_033/jump_033.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_033/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_033/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_034(self):
+
+ cli_file = '/tmp/pipeline/jump_034/jump_034.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_034/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_034/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_035(self):
+
+ cli_file = '/tmp/pipeline/jump_035/jump_035.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_035/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_035/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_036(self):
+
+ cli_file = '/tmp/pipeline/jump_036/jump_036.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_036/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_036/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_037(self):
+
+ cli_file = '/tmp/pipeline/jump_037/jump_037.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_037/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_037/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_038(self):
+
+ cli_file = '/tmp/pipeline/jump_038/jump_038.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_038/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_038/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_039(self):
+
+ cli_file = '/tmp/pipeline/jump_039/jump_039.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_039/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_039/pcap_files/out_1.txt'
+ filters = ""
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_040(self):
+
+ cli_file = '/tmp/pipeline/jump_040/jump_040.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_040/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_040/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_041(self):
+
+ cli_file = '/tmp/pipeline/jump_041/jump_041.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_041/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_041/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_042(self):
+
+ cli_file = '/tmp/pipeline/jump_042/jump_042.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_042/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_042/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_043(self):
+
+ cli_file = '/tmp/pipeline/jump_043/jump_043.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_043/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_043/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_044(self):
+
+ cli_file = '/tmp/pipeline/jump_044/jump_044.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_044/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_044/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_045(self):
+
+ cli_file = '/tmp/pipeline/jump_045/jump_045.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_045/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_045/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_046(self):
+
+ cli_file = '/tmp/pipeline/jump_046/jump_046.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_046/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_046/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_047(self):
+
+ cli_file = '/tmp/pipeline/jump_047/jump_047.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_047/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_047/pcap_files/out_1.txt'
+ filters = ""
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_048(self):
+
+ cli_file = '/tmp/pipeline/jump_048/jump_048.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_048/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_048/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_049(self):
+
+ cli_file = '/tmp/pipeline/jump_049/jump_049.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_049/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_049/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_050(self):
+
+ cli_file = '/tmp/pipeline/jump_050/jump_050.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_050/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_050/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_051(self):
+
+ cli_file = '/tmp/pipeline/jump_051/jump_051.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_051/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_051/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_052(self):
+
+ cli_file = '/tmp/pipeline/jump_052/jump_052.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_052/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_052/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_053(self):
+
+ cli_file = '/tmp/pipeline/jump_053/jump_053.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_053/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_053/pcap_files/out_1.txt'
+ filters = ""
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_054(self):
+
+ cli_file = '/tmp/pipeline/jump_054/jump_054.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_054/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_054/pcap_files/out_1.txt'
+ filters = ""
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_jump_055(self):
+
+ cli_file = '/tmp/pipeline/jump_055/jump_055.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/jump_055/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/jump_055/pcap_files/out_1.txt'
+ filters = ""
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_ckadd_001(self):
+
+ cli_file = '/tmp/pipeline/ckadd_001/ckadd_001.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/ckadd_001/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/ckadd_001/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_ckadd_009(self):
+
+ cli_file = '/tmp/pipeline/ckadd_009/ckadd_009.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/ckadd_009/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/ckadd_009/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_ckadd_010(self):
+
+ cli_file = '/tmp/pipeline/ckadd_010/ckadd_010.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/ckadd_010/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/ckadd_010/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_cksub_001(self):
+
+ cli_file = '/tmp/pipeline/cksub_001/cksub_001.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/cksub_001/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/cksub_001/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_invalidate_001(self):
+
+ cli_file = '/tmp/pipeline/invalidate_001/invalidate_001.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/invalidate_001/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/invalidate_001/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^C"
+ self.dut.send_expect(cmd, "# ", 20)
+
+ def test_validate_001(self):
+
+ cli_file = '/tmp/pipeline/validate_001/validate_001.cli'
+
+ cmd = "sed -i -e 's/0000:00:04.0/%s/' {}".format(cli_file) % self.dut_p0_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:05.0/%s/' {}".format(cli_file) % self.dut_p1_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:06.0/%s/' {}".format(cli_file) % self.dut_p2_pci
+ self.dut.send_expect(cmd, "# ", 20)
+ cmd = "sed -i -e 's/0000:00:07.0/%s/' {}".format(cli_file) % self.dut_p3_pci
+ self.dut.send_expect(cmd, "# ", 20)
+
+ DUT_PORTS = " -w {0} -w {1} -w {2} -w {3} "\
+ .format(self.dut_p0_pci, self.dut_p1_pci, self.dut_p2_pci, self.dut_p3_pci)
+
+ cmd = "{0} -c 0x3 -n 4 {1} -- -s {2}".format(self.app_pipeline_path, DUT_PORTS, cli_file)
+ self.dut.send_expect(cmd, "PIPELINE0 enable", 60)
+
+ # rule 0 test
+ in_pcap_file = 'pipeline/validate_001/pcap_files/in_1.txt'
+ out_pcap_file = 'pipeline/validate_001/pcap_files/out_1.txt'
+ filters = "tcp"
+ sniff_pkts = self.send_and_sniff_pkts(0, 0, in_pcap_file, out_pcap_file, filters)
+
+ # rule 1 test
+ sniff_pkts = self.send_and_sniff_pkts(1, 1, in_pcap_file, out_pcap_file, filters)
+
+ # rule 2 test
+ sniff_pkts = self.send_and_sniff_pkts(2, 2, in_pcap_file, out_pcap_file, filters)
+
+ # rule 3 test
+ sniff_pkts = self.send_and_sniff_pkts(3, 3, in_pcap_file, out_pcap_file, filters)
+
+ sleep(1)
+ cmd = "^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()
+
--
1.8.3.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* [dts] [PATCH v2 4/4] conf/app_name: add pipeline app name config
2020-11-13 8:03 [dts] [PATCH v2 0/4] add pipeline suite Churchill Khangar
` (2 preceding siblings ...)
2020-11-13 8:03 ` [dts] [PATCH v2 3/4] tests: add pipeline test suite Churchill Khangar
@ 2020-11-13 8:03 ` Churchill Khangar
2020-11-18 3:29 ` [dts] [PATCH v2 0/4] add pipeline suite Tu, Lijuan
4 siblings, 0 replies; 6+ messages in thread
From: Churchill Khangar @ 2020-11-13 8:03 UTC (permalink / raw)
To: dts
Cc: cristian.dumitrescu, venkata.suresh.kumar.p, churchill.khangar,
yogesh.jangra
Add pipeline app name config in meson and makefile configurations
Signed-off-by: Yogesh Jangra <yogesh.jangra@intel.com>
Signed-off-by: Churchill Khangar <churchill.khangar@intel.com>
Tested-by: Venkata Suresh Kumar P <venkata.suresh.kumar.p@intel.com>
---
conf/app_name.cfg | 2 ++
1 file changed, 2 insertions(+)
diff --git a/conf/app_name.cfg b/conf/app_name.cfg
index e1d78d6..1de492b 100644
--- a/conf/app_name.cfg
+++ b/conf/app_name.cfg
@@ -43,6 +43,7 @@ l3fwd-thread=target/examples/dpdk-l3fwd-thread
link_status_interrupt=target/examples/dpdk-link_status_interrupt
ntb=target/examples/dpdk-ntb
packet_ordering=target/examples/dpdk-packet_ordering
+pipeline=target/examples/dpdk-pipeline
ptpclient=target/examples/dpdk-ptpclient
qos_meter=target/examples/dpdk-qos_meter
qos_sched=target/examples/dpdk-qos_sched
@@ -108,6 +109,7 @@ l3fwd-thread=examples/performance-thread/l3fwd-thread/build/app/l3fwd-thread
link_status_interrupt=examples/link_status_interrupt/build/app/link_status_interrupt
ntb=examples/ntb/build/app/ntb_fwd
packet_ordering=examples/packet_ordering/build/app/packet_ordering
+pipeline=examples/pipeline/build/app/pipeline
ptpclient=examples/ptpclient/build/app/ptpclient
qos_meter=examples/qos_meter/build/app/qos_meter
qos_sched=examples/qos_sched/build/app/qos_sched
--
1.8.3.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [dts] [PATCH v2 0/4] add pipeline suite
2020-11-13 8:03 [dts] [PATCH v2 0/4] add pipeline suite Churchill Khangar
` (3 preceding siblings ...)
2020-11-13 8:03 ` [dts] [PATCH v2 4/4] conf/app_name: add pipeline app name config Churchill Khangar
@ 2020-11-18 3:29 ` Tu, Lijuan
4 siblings, 0 replies; 6+ messages in thread
From: Tu, Lijuan @ 2020-11-18 3:29 UTC (permalink / raw)
To: Khangar, Churchill, dts
Cc: Dumitrescu, Cristian, P, Venkata Suresh Kumar, Khangar,
Churchill, Jangra, Yogesh
> This patch series adds a new test suite for pipeline application.
> Pipeline example is an application for improved Software Switch (SWX)
> pipeline type that supports dynamically-defined packet headers, meta-data,
> actions and pipelines.
> Actions and pipelines are defined through instructions.
>
> New pipeline test suites aims to verify the all supported instructions by
> using required input, spec and cli files which are part of dependences
> directory(dep/pipeline.tar.gz).
>
> Patch details
> 1. Patch1 adds the pipeline dependencies archive and compressed file
> pipeline.tar.gz
> 2. Patch2 adds the details of pipeline test plan details
> pipeline_test_plan.rst
> 3. Patch3 adds the pipeline new test suite implementation file
> TestSuite_pipeline.py
> 4. Patch4 adds new pipeline application configuration in app_name.cfg
> file
>
> Churchill Khangar (4):
> dep: add pipeline test suite dependencies
> test_plans: add pipeline test plan document
> tests: add pipeline test suite
> conf/app_name: add pipeline app name config
>
> conf/app_name.cfg | 2 +
> dep/pipeline.tar.gz | Bin 0 -> 119666 bytes
> test_plans/pipeline_test_plan.rst | 122 +
> tests/TestSuite_pipeline.py | 5833
> +++++++++++++++++++++++++++++++++++++
> 4 files changed, 5957 insertions(+)
> create mode 100644 dep/pipeline.tar.gz
> create mode 100644 test_plans/pipeline_test_plan.rst create mode 100644
> tests/TestSuite_pipeline.py
>
> --
> 1.8.3.1
Applied
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2020-11-18 3:29 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-11-13 8:03 [dts] [PATCH v2 0/4] add pipeline suite Churchill Khangar
2020-11-13 8:03 ` [dts] [PATCH v2 1/4] dep: add pipeline test suite dependencies Churchill Khangar
2020-11-13 8:03 ` [dts] [PATCH v2 2/4] test_plans: add pipeline test plan document Churchill Khangar
2020-11-13 8:03 ` [dts] [PATCH v2 3/4] tests: add pipeline test suite Churchill Khangar
2020-11-13 8:03 ` [dts] [PATCH v2 4/4] conf/app_name: add pipeline app name config Churchill Khangar
2020-11-18 3:29 ` [dts] [PATCH v2 0/4] add pipeline suite Tu, Lijuan
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).