[dts] [PATCH V1] Add testsuite of eventdev_pipeline
Zhang, Yuwei1
yuwei1.zhang at intel.com
Thu Apr 11 08:47:40 CEST 2019
Acked by: Yuwei Zhang (yuwei1.zhang at intel.com)
-----Original Message-----
From: Ma, LihongX
Sent: Thursday, April 11, 2019 5:58 AM
To: dts at dpdk.org; Zhang, Yuwei1 <yuwei1.zhang at intel.com>
Cc: Ma, LihongX <lihongx.ma at intel.com>
Subject: [dts][PATCH V1] Add testsuite of eventdev_pipeline
Add keep ordered test cases about eventdev pipeline
Signed-off-by: lihong <lihongx.ma at intel.com>
---
tests/TestSuite_eventdev_pipeline.py | 219 +++++++++++++++++++++++++++++++++++
1 file changed, 219 insertions(+)
create mode 100644 tests/TestSuite_eventdev_pipeline.py
diff --git a/tests/TestSuite_eventdev_pipeline.py b/tests/TestSuite_eventdev_pipeline.py
new file mode 100644
index 0000000..cee636a
--- /dev/null
+++ b/tests/TestSuite_eventdev_pipeline.py
@@ -0,0 +1,219 @@
+# BSD LICENSE
+#
+# Copyright(c) 2010-2019 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.
+
+"""
+DPDK Test suite.
+Test eventdev pipeline
+"""
+
+import utils
+import time
+import re
+from test_case import TestCase
+import scapy.layers.inet
+from scapy.utils import rdpcap
+
+
+class TestEventdevPipeline(TestCase):
+
+ def set_up_all(self):
+ """
+ Run at the start of each test suite.
+ """
+ self.works = 4
+ self.packet_num = 96
+ self.core_config = "1S/7C/1T"
+ self.build_eventdev_app()
+
+ self.dut_ports = self.dut.get_ports()
+ self.verify(len(self.dut_ports) >= 1, "Insufficient ports for
+ testing")
+
+ self.ports_socket = self.dut.get_numa_id(self.dut_ports[0])
+ self.core_list = self.dut.get_core_list(
+ self.core_config, socket=self.ports_socket)
+ self.core_list_rx = self.core_list[0:1]
+ self.core_list_tx = self.core_list[1:2]
+ self.core_list_sd = self.core_list[2:3]
+ self.core_list_wk = self.core_list[3:7]
+ self.core_mask_rx = utils.create_mask(self.core_list_rx)
+ self.core_mask_tx = utils.create_mask(self.core_list_tx)
+ self.core_mask_sd = utils.create_mask(self.core_list_sd)
+ self.core_mask_wk = utils.create_mask(self.core_list_wk)
+
+ self.core_list = ",".join(self.core_list)
+ pre = int(self.core_list[0]) - 1
+ self.core_list = str(pre) + "," + self.core_list
+
+ self.rx_port = self.tester.get_local_port(self.dut_ports[0])
+ self.tx_port = self.rx_port
+ self.rx_interface = self.tester.get_interface(self.rx_port)
+ self.tx_interface = self.tester.get_interface(self.tx_port)
+ self.d_mac = self.dut.get_mac_address(self.dut_ports[0])
+
+ def set_up(self):
+ """
+ Run before each test case.
+ """
+ self.dut.send_expect("killall -s INT eventdev_pipeline", "#")
+
+ def build_eventdev_app(self):
+ self.app_command = "examples/eventdev_pipeline"
+ out = self.dut.build_dpdk_apps(self.app_command)
+ self.verify('make: Leaving directory' in out, "Compilation failed")
+ self.verify("Error" not in out, "compilation error 1")
+ self.verify("No such file" not in out, "compilation error 2")
+
+ def lanuch_eventdev_pipeline(self, cmd_type):
+ """
+ run eventdev_pipeline command
+ """
+ command_line = "taskset -c %s " + self.app_command + \
+ "/build/app/eventdev_pipeline " + \
+ "--vdev event_sw0 -- -r%s -t%s -e%s -w %s -s1 -n0 -c32 -W1000 %s -D"
+ command_line = command_line % (
+ self.core_list, self.core_mask_rx, self.core_mask_tx,
+ self.core_mask_sd, self.core_mask_wk, cmd_type)
+ self.dut.send_expect(command_line, "Port 0", 30)
+
+ out = self.dut.get_session_output()
+ self.verify("executing NIC Rx" in out, "lcore of rx not right")
+ self.verify("executing NIC Tx" in out, "lcore of tx not right")
+ self.verify("executing scheduler" in out, "lcore of scheduler not right")
+ self.verify("executing worker" in out, "lcore of worker not
+ right")
+
+ def remove_dhcp_from_revpackets(self, inst):
+ pkts = self.tester.load_tcpdump_sniff_packets(inst)
+ i = 0
+ while len(pkts) != 0 and i <= len(pkts) - 1:
+ if pkts[i].pktgen.pkt.haslayer('DHCP'):
+ pkts.remove(pkts[i])
+ i = i - 1
+ i = i + 1
+ return pkts
+
+ def send_ordered_packet(self):
+ """
+ send the packets with ordered of src-ip info
+ worker dequeue depth of 32, so the packet number is multiple of 32 is better
+ compose the pcap file, each queue has same 5 tuple and diff load info
+ eg:
+ if only one flow, the pcap has same 5 tuple and the load info from 000001 to 000096
+ if has eight flow, the pcap has 8 couples with diff 5 tuple, and each couple load info from
+ 000001 to 000012
+ """
+ for queue in range(self.queues):
+ src_ip = "11.12.13.%d" % (queue+1)
+ pay_load = "000001"
+ flow_info = 'flow1 = [Ether(dst="%s",src="%s")/IP(src="%s")/UDP(sport=123, dport=12)/("%s")]'
+ self.tester.scapy_append(flow_info % (self.d_mac, self.s_mac, src_ip, pay_load))
+ for i in range(1, self.packet_num/self.queues):
+ pay_load = "0000%.2d" % (i+1)
+ self.tester.scapy_append('flow_temp = [Ether(dst="%s", src="%s")/IP(src="%s")/UDP(sport=123, dport=12)/("%s")]'
+ % (self.d_mac, self.s_mac, src_ip, pay_load))
+ if i == 1:
+ self.tester.scapy_append('flow2 = flow_temp')
+ else:
+ self.tester.scapy_append('flow2 = flow2 + flow_temp')
+ if queue == 0:
+ self.tester.scapy_append('flow = flow1 + flow2')
+ else:
+ self.tester.scapy_append('flow = flow + flow1 + flow2')
+
+ self.tester.scapy_append('wrpcap("pipeline.pcap", flow)')
+ self.tester.scapy_execute()
+ time.sleep(5)
+
+ filt = [{'layer': 'ether', 'config': {'src': '%s' % self.s_mac}}]
+ inst = self.tester.tcpdump_sniff_packets(self.rx_interface, timeout=15, filters=filt)
+ self.tester.scapy_append('pkt=rdpcap("pipeline.pcap")')
+ self.tester.scapy_append('sendp(pkt, iface="%s")' % self.tx_interface)
+ self.tester.scapy_execute()
+ time.sleep(5)
+ self.pkts = self.remove_dhcp_from_revpackets(inst)
+
+ def check_packet_order(self):
+ """
+ observe the packets sended by scapy, check the packets order
+ """
+ self.send_ordered_packet()
+ for queue in range(self.queues):
+ src_ip = "11.12.13.%d" % (queue+1)
+ packet_index = 0
+ for i in range(len(self.pkts)):
+ pay_load = "0000%.2d" % (packet_index)
+ if self.pkts[i].pktgen.pkt['IP'].src == src_ip:
+ print self.pkts[i].pktgen.pkt.show
+ # get the start index load info of each queue
+ if packet_index == 0:
+ packet_index = int(self.pkts[i].pktgen.pkt['Raw'].load[-2:])
+ pay_load = "0000%.2d" % (packet_index)
+ self.verify(self.pkts[i].pktgen.pkt['Raw'].load == pay_load,
+ "The packets not ordered")
+ packet_index = packet_index + 1
+
+ def test_keep_packet_order_with_ordered_stage(self):
+ """
+ keep the packets order with one ordered stage in single-flow and multi-flow
+ according to the tcpdump may be capture the packets whitch not belong current
+ flow, so set different src_mac of flow to identify the packets
+ """
+ self.lanuch_eventdev_pipeline("-o")
+ self.queues = 1
+ self.s_mac = "00:00:00:00:00:00"
+ self.check_packet_order()
+ self.s_mac = "00:00:00:00:00:01"
+ self.queues = 8
+ self.check_packet_order()
+
+ def test_keep_packet_order_with_default_stage(self):
+ """
+ keep the packets order with atomic stage in single-flow and multi-flow
+ """
+ self.lanuch_eventdev_pipeline(" ")
+ self.queues = 1
+ self.s_mac = "00:00:00:00:00:02"
+ self.check_packet_order()
+ self.s_mac = "00:00:00:00:00:03"
+ self.queues = 8
+ self.check_packet_order()
+
+ def tear_down(self):
+ """
+ Run after each test case.
+ """
+ self.dut.send_expect("^c", "#", 10)
+ self.dut.send_expect("killall -s INT eventdev_pipeline", "#")
+ time.sleep(5)
+
+ def tear_down_all(self):
+ """
+ Run after each test suite.
+ """
--
2.7.4
More information about the dts
mailing list