test suite reviews and discussions
 help / color / mirror / Atom feed
* Re: [dts] [PATCH V1 4/4] tests: add new suite enable_package_download_in_ice_driver
  2019-06-25 16:13 ` [dts] [PATCH V1 4/4] tests: add new suite enable_package_download_in_ice_driver Wenjie Li
@ 2019-06-25  9:00   ` Peng, Yuan
  0 siblings, 0 replies; 5+ messages in thread
From: Peng, Yuan @ 2019-06-25  9:00 UTC (permalink / raw)
  To: Li, WenjieX A, dts; +Cc: Peng, Yuan

Acked by Peng, Yuan <yuan.peng@intel.com>

-----Original Message-----
From: Li, WenjieX A 
Sent: Wednesday, June 26, 2019 12:13 AM
To: dts@dpdk.org
Cc: Li, WenjieX A <wenjiex.a.li@intel.com>
Subject: [dts][PATCH V1 4/4] tests: add new suite enable_package_download_in_ice_driver

add new suite enable_package_download_in_ice_driver.

Signed-off-by: Wenjie Li <wenjiex.a.li@intel.com>
---
 ...e_enable_package_download_in_ice_driver.py | 255 ++++++++++++++++++
 1 file changed, 255 insertions(+)
 create mode 100644 tests/TestSuite_enable_package_download_in_ice_driver.py

diff --git a/tests/TestSuite_enable_package_download_in_ice_driver.py b/tests/TestSuite_enable_package_download_in_ice_driver.py
new file mode 100644
index 0000000..d6d6634
--- /dev/null
+++ b/tests/TestSuite_enable_package_download_in_ice_driver.py
@@ -0,0 +1,255 @@
+# BSD LICENSE
+#
+# Copyright(c) 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.
+
+import time
+import re
+from test_case import TestCase
+from pmd_output import PmdOutput
+
+class TestEnable_Package_Download_In_Ice_Driver(TestCase):
+
+    def set_up_all(self):
+        self.verify(self.nic in ["columbiaville_100g", "columbiaville_25g"], "NIC Unsupported: " + str(self.nic))
+        self.dut_ports = self.dut.get_ports(self.nic)
+        self.verify(len(self.dut_ports) >= 2, "Insufficient ports")
+        self.PF_QUEUE = 16
+
+        localPort0 = self.tester.get_local_port(self.dut_ports[0])
+        localPort1 = self.tester.get_local_port(self.dut_ports[1])
+        self.tester_p0 = self.tester.get_interface(localPort0)
+        self.tester_p1 = self.tester.get_interface(localPort1)
+        self.tester.send_expect("ifconfig %s -promisc" % self.tester_p0, "#")
+        self.tester.send_expect("ifconfig %s -promisc" % 
+ self.tester_p1, "#")
+
+        self.dut_p0_mac = self.dut.get_mac_address(self.dut_ports[0])
+        self.tester_p0_mac = self.tester.get_mac(localPort0)
+        self.dut_testpmd = PmdOutput(self.dut)
+
+    def set_up(self):
+        pass
+
+    def copy_ice_pkg_to_lib(self, flag):
+        """
+        if flag == true: Copy dep/ice.pkg to DUT /lib/firmware/intel/ice/ddp/ice.pkg
+        else: touch a wrong /lib/firmware/intel/ice/ddp/ice.pkg
+        """
+        file = 'ice.pkg'
+        src_file = r'./dep/%s' % file
+        dst = '/lib/firmware/intel/ice/ddp'
+        self.dut.send_expect("rm -rf %s/%s" % (dst, file), "#")
+        if flag == "true":
+            self.dut.session.copy_file_to(src_file, dst)
+        else:
+            self.dut.send_expect("touch %s/%s" % (dst, file), "#")
+
+    def start_testpmd(self, flag="true"):
+        out = self.dut_testpmd.start_testpmd("all", "--nb-cores=8 --rxq=%s --txq=%s --port-topology=chained" % (self.PF_QUEUE, self.PF_QUEUE))
+        if flag != "true":
+            error_messages = ["ice_load_pkg(): failed to allocate buf of size 0 for package", \
+                    "ice_load_pkg(): failed to allocate buf of size 0 for package", \
+                    "ice_dev_init(): Failed to load the DDP package,Entering Safe Mode", \
+                    "ice_init_rss(): RSS is not supported in safe mode"]
+            for error_message in error_messages:
+                self.verify(error_message in out, "There should be error messages in out: %s" % out)
+        self.dut_testpmd.execute_cmd('set promisc all off')
+        self.dut_testpmd.execute_cmd('set verbose 1')
+
+    def tcpdump_start_sniffing(self, ifaces=[]):
+        """
+        Starts tcpdump in the background to sniff the tester interface where
+        the packets are transmitted to and from the self.dut.
+        All the captured packets are going to be stored in a file for a
+        post-analysis.
+        """
+
+        for iface in ifaces:
+            command = ('tcpdump -w tcpdump_{0}.pcap -i {0} 2>tcpdump_{0}.out &').format(iface)
+            del_cmd = ('rm -f tcpdump_{0}.pcap').format(iface)
+            self.tester.send_expect(del_cmd, '#')
+            self.tester.send_expect(command, '#')
+
+    def tcpdump_stop_sniff(self):
+        """
+        Stops the tcpdump process running in the background.
+        """
+        self.tester.send_expect('killall tcpdump', '#')
+        time.sleep(1)
+        self.tester.send_expect('echo "Cleaning buffer"', '#')
+        time.sleep(1)
+
+    def tcpdump_command(self, command):
+        """
+        Sends a tcpdump related command and returns an integer from the output
+        """
+        result = self.tester.send_expect(command, '#')
+        print result
+        return int(result.strip())
+
+    def number_of_packets(self, iface):
+        """
+        By reading the file generated by tcpdump it counts how many packets were
+        forwarded by the sample app and received in the self.tester. The sample app
+        will add a known MAC address for the test to look for.
+        """
+        command = ('tcpdump -A -nn -e -v -r tcpdump_{iface}.pcap 2>/dev/null | ' +
+                   'grep -c "IPv4"')
+        return self.tcpdump_command(command.format(**locals()))
+
+    def tcpdump_scanner(self, scanner):
+        """
+        Execute scanner to return results
+        """
+        scanner_result = self.tester.send_expect(scanner, '#')
+        fially_result = re.findall(r'length( \d+)', scanner_result)
+        return list(fially_result)
+
+    def send_packet(self, tran_type, flag):
+        """
+        Sends packets.
+        """
+        self.loading_size = 30
+        self.tester.scapy_foreground()
+        self.tester.scapy_append('sys.path.append("./")')
+        self.tester.scapy_append('from sctp import *')
+        if tran_type == "ipv4-other":
+            for i in range(1):
+                packet = r'sendp([Ether(dst="%s", src="%s")/IP(src="192.168.0.%d", dst="192.168.0.%d")/("X"*%s)], iface="%s")' % (
+                    self.dut_p0_mac, self.tester_p0_mac, i + 1, i + 2, self.loading_size, self.tester_p0)
+                self.tester.scapy_append(packet)
+            self.tester.scapy_execute()
+            time.sleep(.5)
+        elif tran_type == "ipv4-tcp":
+            for i in range(16):
+                packet = r'sendp([Ether(dst="%s", src="%s")/IP(src="192.168.0.%d", dst="192.168.0.%d")/TCP(sport=1024,dport=1024)], iface="%s")' % (
+                    self.dut_p0_mac, self.tester_p0_mac, i + 1, i + 2, self.tester_p0)
+                self.tester.scapy_append(packet)
+            self.tester.scapy_execute()
+            time.sleep(.5)
+        elif tran_type == "ipv4-udp":
+            for i in range(16):
+                packet = r'sendp([Ether(dst="%s", src="%s")/IP(src="192.168.0.%d", dst="192.168.0.%d")/UDP(sport=1024,dport=1024)], iface="%s")' % (
+                    self.dut_p0_mac, self.tester_p0_mac, i + 1, i + 2, self.tester_p0)
+                self.tester.scapy_append(packet)
+            self.tester.scapy_execute()
+            time.sleep(.5)
+        elif tran_type == "ipv4-sctp":
+            for i in range(16):
+                packet = r'sendp([Ether(dst="%s", src="%s")/IP(src="192.168.0.%d", dst="192.168.0.%d")/SCTP(sport=1024,dport=1024)], iface="%s")' % (
+                    self.dut_p0_mac, self.tester_p0_mac, i + 1, i + 2, self.tester_p0)
+                self.tester.scapy_append(packet)
+            self.tester.scapy_execute()
+            time.sleep(.5)
+        elif tran_type == "ipv6-tcp":
+            for i in range(16):
+                packet = r'sendp([Ether(dst="%s", src="%s")/IPv6(src="::%d", dst="::%d")/TCP(sport=1024,dport=1024)], iface="%s")' % (
+                    self.dut_p0_mac, self.tester_p0_mac, i + 1, i + 2, self.tester_p0)
+                self.tester.scapy_append(packet)
+            self.tester.scapy_execute()
+            time.sleep(.5)
+        elif tran_type == "ipv6-udp":
+            for i in range(16):
+                packet = r'sendp([Ether(dst="%s", src="%s")/IPv6(src="::%d", dst="::%d")/UDP(sport=1024,dport=1024)], iface="%s")' % (
+                    self.dut_p0_mac, self.tester_p0_mac, i + 1, i + 2, self.tester_p0)
+                self.tester.scapy_append(packet)
+            self.tester.scapy_execute()
+            time.sleep(.5)
+        elif tran_type == "ipv6-sctp":
+            for i in range(16):
+                packet = r'sendp([Ether(dst="%s", src="%s")/IPv6(src="::%d", dst="::%d",nh=132)/SCTP(sport=1024,dport=1024)], iface="%s")' % (
+                    self.dut_p0_mac, self.tester_p0_mac, i + 1, i + 2, self.tester_p0)
+                self.tester.scapy_append(packet)
+            self.tester.scapy_execute()
+            time.sleep(.5)
+        else:
+            print "\ntran_type error!\n"
+
+        self.verifyResult(tran_type=tran_type, flag=flag)
+
+    def verifyResult(self, tran_type, flag):
+        """
+        Verify whether or not the result passes.
+        """
+        if tran_type == "ipv4-other":
+            self.tcpdump_stop_sniff()
+            p0_stats = self.number_of_packets(self.tester_p0)
+            p1_stats = self.number_of_packets(self.tester_p1)
+            self.verify(p0_stats == p1_stats, "tester p0 and p1: packet number match")
+        else:
+            out = self.dut.get_session_output()
+            queue_list = []
+            lines = out.split("\r\n")
+            for line in lines:
+                line = line.strip()
+                if len(line) != 0 and line.startswith(("port 0/queue ",)):
+                    for item in line.split(":"):
+                        item = item.strip()
+                        if(item.startswith("port 0/queue ")):
+                            queue_id = item.split(" ", 2)[-1]
+                            queue_list.append(queue_id)
+            print list(set(queue_list))
+            if flag == "true":
+                self.verify(len(list(set(queue_list))) > 1, "All packets enter the same queue: %s" % queue_list)
+            else:
+                self.verify(len(list(set(queue_list))) == 1, "All 
+ packets should enter queue 0, but entered %s" % queue_list)
+
+    def download_the_package(self, flag):
+        """
+        if flag == true: use the correct ice.pkg file; in rxonly mode, all packets should enter different queues of port 0
+        else: use wrong ice.pkg, all packets enter queue 0 of port 0
+        """
+        self.copy_ice_pkg_to_lib(flag=flag)
+        self.start_testpmd(flag=flag)
+        self.dut_testpmd.execute_cmd('set fwd mac')
+        self.dut_testpmd.execute_cmd('start')
+        self.tcpdump_start_sniffing([self.tester_p0, self.tester_p1])
+        self.send_packet(tran_type="ipv4-other", flag=flag)
+
+        self.dut_testpmd.execute_cmd('stop')
+        self.dut_testpmd.execute_cmd('set fwd rxonly')
+        self.dut_testpmd.execute_cmd('start')
+        for tran_types in ["ipv4-tcp", "ipv4-udp", "ipv4-sctp", "ipv6-tcp", "ipv6-udp", "ipv6-sctp"]:
+            print tran_types
+            self.send_packet(tran_type=tran_types, flag=flag)
+
+    def test_download_the_package_successfully(self):
+        self.download_the_package(flag="true")
+
+    def test_download_the_package_failed(self):
+        self.download_the_package(flag="false")
+
+    def tear_down(self):
+        self.dut_testpmd.quit()
+
+    def tear_down_all(self):
+        """
+        After test, apply the correct ice.pkg
+        """
+        self.copy_ice_pkg_to_lib(flag='true')
--
2.17.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [dts] [PATCH V1 1/4] framework/settings: append cvl 25g and 100g
@ 2019-06-25 16:13 Wenjie Li
  2019-06-25 16:13 ` [dts] [PATCH V1 2/4] conf/supportlist: append suite enable_package_download_in_ice_driver Wenjie Li
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Wenjie Li @ 2019-06-25 16:13 UTC (permalink / raw)
  To: dts; +Cc: Wenjie Li

append cvl 25g and 100g.

Signed-off-by: Wenjie Li <wenjiex.a.li@intel.com>
---
 framework/settings.py | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/framework/settings.py b/framework/settings.py
index 34d49f7..b0bcd4b 100644
--- a/framework/settings.py
+++ b/framework/settings.py
@@ -100,6 +100,8 @@ NICS = {
     'hi1822': '19e5:1822',
     'fortvile_bdw_de': '8086:15ac',
     'cavium_a063': '177d:a063',
+    'columbiaville_100g': '8086:1592',
+    'columbiaville_25g': '8086:1593',
 }
 
 DRIVERS = {
@@ -154,6 +156,8 @@ DRIVERS = {
     'hi1822': 'hinic',
     'fortvile_bdw_de': 'ixgbe',
     'cavium_a063': 'octeontx2-nicpf',
+    'columbiaville_100g': 'ice',
+    'columbiaville_25g': 'ice',
 }
 
 """
-- 
2.17.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [dts] [PATCH V1 2/4] conf/supportlist: append suite enable_package_download_in_ice_driver
  2019-06-25 16:13 [dts] [PATCH V1 1/4] framework/settings: append cvl 25g and 100g Wenjie Li
@ 2019-06-25 16:13 ` Wenjie Li
  2019-06-25 16:13 ` [dts] [PATCH V1 3/4] dep: add ice.pkg for cvl nics Wenjie Li
  2019-06-25 16:13 ` [dts] [PATCH V1 4/4] tests: add new suite enable_package_download_in_ice_driver Wenjie Li
  2 siblings, 0 replies; 5+ messages in thread
From: Wenjie Li @ 2019-06-25 16:13 UTC (permalink / raw)
  To: dts; +Cc: Wenjie Li

Below 2 cases in enable_package_download_in_ice_driver only support cvl nics.
1. download_the_package_successfully
2. download_the_package_failed

Signed-off-by: Wenjie Li <wenjiex.a.li@intel.com>
---
 conf/test_case_supportlist.json | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/conf/test_case_supportlist.json b/conf/test_case_supportlist.json
index e8c2a43..e7944ad 100644
--- a/conf/test_case_supportlist.json
+++ b/conf/test_case_supportlist.json
@@ -1365,5 +1365,37 @@
             "Bug ID": "",
             "Comments": "This case currently support for cavium_a063 "
         }
+    ],
+    "download_the_package_successfully": [
+        {
+            "OS": [
+                "ALL"
+            ],
+            "NIC": [
+                "columbiaville_100g",
+                "columbiaville_25g"
+            ],
+            "Target": [
+                "ALL"
+            ],
+            "Bug ID": "",
+            "Comments": "This case currently support for columbiaville"
+        }
+    ],
+    "download_the_package_failed": [
+        {
+            "OS": [
+                "ALL"
+            ],
+            "NIC": [
+                "columbiaville_100g",
+                "columbiaville_25g"
+            ],
+            "Target": [
+                "ALL"
+            ],
+            "Bug ID": "",
+            "Comments": "This case currently support for columbiaville"
+        }
     ]
 }
-- 
2.17.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [dts] [PATCH V1 3/4] dep: add ice.pkg for cvl nics
  2019-06-25 16:13 [dts] [PATCH V1 1/4] framework/settings: append cvl 25g and 100g Wenjie Li
  2019-06-25 16:13 ` [dts] [PATCH V1 2/4] conf/supportlist: append suite enable_package_download_in_ice_driver Wenjie Li
@ 2019-06-25 16:13 ` Wenjie Li
  2019-06-25 16:13 ` [dts] [PATCH V1 4/4] tests: add new suite enable_package_download_in_ice_driver Wenjie Li
  2 siblings, 0 replies; 5+ messages in thread
From: Wenjie Li @ 2019-06-25 16:13 UTC (permalink / raw)
  To: dts; +Cc: Wenjie Li

configuration file for cvl nics.

Signed-off-by: Wenjie Li <wenjiex.a.li@intel.com>
---
 dep/ice.pkg | Bin 0 -> 524560 bytes
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 dep/ice.pkg

diff --git a/dep/ice.pkg b/dep/ice.pkg
new file mode 100644
index 0000000000000000000000000000000000000000..1c51c14b8577309e43d507ae1f06e0d1709584cd
GIT binary patch
literal 524560
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%0AV1)AcVmPLlA}{$TtDV
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
U<)z*N-U8kN-U8kNhl&OMANDTACIA2c

literal 0
HcmV?d00001

-- 
2.17.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [dts] [PATCH V1 4/4] tests: add new suite enable_package_download_in_ice_driver
  2019-06-25 16:13 [dts] [PATCH V1 1/4] framework/settings: append cvl 25g and 100g Wenjie Li
  2019-06-25 16:13 ` [dts] [PATCH V1 2/4] conf/supportlist: append suite enable_package_download_in_ice_driver Wenjie Li
  2019-06-25 16:13 ` [dts] [PATCH V1 3/4] dep: add ice.pkg for cvl nics Wenjie Li
@ 2019-06-25 16:13 ` Wenjie Li
  2019-06-25  9:00   ` Peng, Yuan
  2 siblings, 1 reply; 5+ messages in thread
From: Wenjie Li @ 2019-06-25 16:13 UTC (permalink / raw)
  To: dts; +Cc: Wenjie Li

add new suite enable_package_download_in_ice_driver.

Signed-off-by: Wenjie Li <wenjiex.a.li@intel.com>
---
 ...e_enable_package_download_in_ice_driver.py | 255 ++++++++++++++++++
 1 file changed, 255 insertions(+)
 create mode 100644 tests/TestSuite_enable_package_download_in_ice_driver.py

diff --git a/tests/TestSuite_enable_package_download_in_ice_driver.py b/tests/TestSuite_enable_package_download_in_ice_driver.py
new file mode 100644
index 0000000..d6d6634
--- /dev/null
+++ b/tests/TestSuite_enable_package_download_in_ice_driver.py
@@ -0,0 +1,255 @@
+# BSD LICENSE
+#
+# Copyright(c) 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.
+
+import time
+import re
+from test_case import TestCase
+from pmd_output import PmdOutput
+
+class TestEnable_Package_Download_In_Ice_Driver(TestCase):
+
+    def set_up_all(self):
+        self.verify(self.nic in ["columbiaville_100g", "columbiaville_25g"], "NIC Unsupported: " + str(self.nic))
+        self.dut_ports = self.dut.get_ports(self.nic)
+        self.verify(len(self.dut_ports) >= 2, "Insufficient ports")
+        self.PF_QUEUE = 16
+
+        localPort0 = self.tester.get_local_port(self.dut_ports[0])
+        localPort1 = self.tester.get_local_port(self.dut_ports[1])
+        self.tester_p0 = self.tester.get_interface(localPort0)
+        self.tester_p1 = self.tester.get_interface(localPort1)
+        self.tester.send_expect("ifconfig %s -promisc" % self.tester_p0, "#")
+        self.tester.send_expect("ifconfig %s -promisc" % self.tester_p1, "#")
+
+        self.dut_p0_mac = self.dut.get_mac_address(self.dut_ports[0])
+        self.tester_p0_mac = self.tester.get_mac(localPort0)
+        self.dut_testpmd = PmdOutput(self.dut)
+
+    def set_up(self):
+        pass
+
+    def copy_ice_pkg_to_lib(self, flag):
+        """
+        if flag == true: Copy dep/ice.pkg to DUT /lib/firmware/intel/ice/ddp/ice.pkg
+        else: touch a wrong /lib/firmware/intel/ice/ddp/ice.pkg
+        """
+        file = 'ice.pkg'
+        src_file = r'./dep/%s' % file
+        dst = '/lib/firmware/intel/ice/ddp'
+        self.dut.send_expect("rm -rf %s/%s" % (dst, file), "#")
+        if flag == "true":
+            self.dut.session.copy_file_to(src_file, dst)
+        else:
+            self.dut.send_expect("touch %s/%s" % (dst, file), "#")
+
+    def start_testpmd(self, flag="true"):
+        out = self.dut_testpmd.start_testpmd("all", "--nb-cores=8 --rxq=%s --txq=%s --port-topology=chained" % (self.PF_QUEUE, self.PF_QUEUE))
+        if flag != "true":
+            error_messages = ["ice_load_pkg(): failed to allocate buf of size 0 for package", \
+                    "ice_load_pkg(): failed to allocate buf of size 0 for package", \
+                    "ice_dev_init(): Failed to load the DDP package,Entering Safe Mode", \
+                    "ice_init_rss(): RSS is not supported in safe mode"]
+            for error_message in error_messages:
+                self.verify(error_message in out, "There should be error messages in out: %s" % out)
+        self.dut_testpmd.execute_cmd('set promisc all off')
+        self.dut_testpmd.execute_cmd('set verbose 1')
+
+    def tcpdump_start_sniffing(self, ifaces=[]):
+        """
+        Starts tcpdump in the background to sniff the tester interface where
+        the packets are transmitted to and from the self.dut.
+        All the captured packets are going to be stored in a file for a
+        post-analysis.
+        """
+
+        for iface in ifaces:
+            command = ('tcpdump -w tcpdump_{0}.pcap -i {0} 2>tcpdump_{0}.out &').format(iface)
+            del_cmd = ('rm -f tcpdump_{0}.pcap').format(iface)
+            self.tester.send_expect(del_cmd, '#')
+            self.tester.send_expect(command, '#')
+
+    def tcpdump_stop_sniff(self):
+        """
+        Stops the tcpdump process running in the background.
+        """
+        self.tester.send_expect('killall tcpdump', '#')
+        time.sleep(1)
+        self.tester.send_expect('echo "Cleaning buffer"', '#')
+        time.sleep(1)
+
+    def tcpdump_command(self, command):
+        """
+        Sends a tcpdump related command and returns an integer from the output
+        """
+        result = self.tester.send_expect(command, '#')
+        print result
+        return int(result.strip())
+
+    def number_of_packets(self, iface):
+        """
+        By reading the file generated by tcpdump it counts how many packets were
+        forwarded by the sample app and received in the self.tester. The sample app
+        will add a known MAC address for the test to look for.
+        """
+        command = ('tcpdump -A -nn -e -v -r tcpdump_{iface}.pcap 2>/dev/null | ' +
+                   'grep -c "IPv4"')
+        return self.tcpdump_command(command.format(**locals()))
+
+    def tcpdump_scanner(self, scanner):
+        """
+        Execute scanner to return results
+        """
+        scanner_result = self.tester.send_expect(scanner, '#')
+        fially_result = re.findall(r'length( \d+)', scanner_result)
+        return list(fially_result)
+
+    def send_packet(self, tran_type, flag):
+        """
+        Sends packets.
+        """
+        self.loading_size = 30
+        self.tester.scapy_foreground()
+        self.tester.scapy_append('sys.path.append("./")')
+        self.tester.scapy_append('from sctp import *')
+        if tran_type == "ipv4-other":
+            for i in range(1):
+                packet = r'sendp([Ether(dst="%s", src="%s")/IP(src="192.168.0.%d", dst="192.168.0.%d")/("X"*%s)], iface="%s")' % (
+                    self.dut_p0_mac, self.tester_p0_mac, i + 1, i + 2, self.loading_size, self.tester_p0)
+                self.tester.scapy_append(packet)
+            self.tester.scapy_execute()
+            time.sleep(.5)
+        elif tran_type == "ipv4-tcp":
+            for i in range(16):
+                packet = r'sendp([Ether(dst="%s", src="%s")/IP(src="192.168.0.%d", dst="192.168.0.%d")/TCP(sport=1024,dport=1024)], iface="%s")' % (
+                    self.dut_p0_mac, self.tester_p0_mac, i + 1, i + 2, self.tester_p0)
+                self.tester.scapy_append(packet)
+            self.tester.scapy_execute()
+            time.sleep(.5)
+        elif tran_type == "ipv4-udp":
+            for i in range(16):
+                packet = r'sendp([Ether(dst="%s", src="%s")/IP(src="192.168.0.%d", dst="192.168.0.%d")/UDP(sport=1024,dport=1024)], iface="%s")' % (
+                    self.dut_p0_mac, self.tester_p0_mac, i + 1, i + 2, self.tester_p0)
+                self.tester.scapy_append(packet)
+            self.tester.scapy_execute()
+            time.sleep(.5)
+        elif tran_type == "ipv4-sctp":
+            for i in range(16):
+                packet = r'sendp([Ether(dst="%s", src="%s")/IP(src="192.168.0.%d", dst="192.168.0.%d")/SCTP(sport=1024,dport=1024)], iface="%s")' % (
+                    self.dut_p0_mac, self.tester_p0_mac, i + 1, i + 2, self.tester_p0)
+                self.tester.scapy_append(packet)
+            self.tester.scapy_execute()
+            time.sleep(.5)
+        elif tran_type == "ipv6-tcp":
+            for i in range(16):
+                packet = r'sendp([Ether(dst="%s", src="%s")/IPv6(src="::%d", dst="::%d")/TCP(sport=1024,dport=1024)], iface="%s")' % (
+                    self.dut_p0_mac, self.tester_p0_mac, i + 1, i + 2, self.tester_p0)
+                self.tester.scapy_append(packet)
+            self.tester.scapy_execute()
+            time.sleep(.5)
+        elif tran_type == "ipv6-udp":
+            for i in range(16):
+                packet = r'sendp([Ether(dst="%s", src="%s")/IPv6(src="::%d", dst="::%d")/UDP(sport=1024,dport=1024)], iface="%s")' % (
+                    self.dut_p0_mac, self.tester_p0_mac, i + 1, i + 2, self.tester_p0)
+                self.tester.scapy_append(packet)
+            self.tester.scapy_execute()
+            time.sleep(.5)
+        elif tran_type == "ipv6-sctp":
+            for i in range(16):
+                packet = r'sendp([Ether(dst="%s", src="%s")/IPv6(src="::%d", dst="::%d",nh=132)/SCTP(sport=1024,dport=1024)], iface="%s")' % (
+                    self.dut_p0_mac, self.tester_p0_mac, i + 1, i + 2, self.tester_p0)
+                self.tester.scapy_append(packet)
+            self.tester.scapy_execute()
+            time.sleep(.5)
+        else:
+            print "\ntran_type error!\n"
+
+        self.verifyResult(tran_type=tran_type, flag=flag)
+
+    def verifyResult(self, tran_type, flag):
+        """
+        Verify whether or not the result passes.
+        """
+        if tran_type == "ipv4-other":
+            self.tcpdump_stop_sniff()
+            p0_stats = self.number_of_packets(self.tester_p0)
+            p1_stats = self.number_of_packets(self.tester_p1)
+            self.verify(p0_stats == p1_stats, "tester p0 and p1: packet number match")
+        else:
+            out = self.dut.get_session_output()
+            queue_list = []
+            lines = out.split("\r\n")
+            for line in lines:
+                line = line.strip()
+                if len(line) != 0 and line.startswith(("port 0/queue ",)):
+                    for item in line.split(":"):
+                        item = item.strip()
+                        if(item.startswith("port 0/queue ")):
+                            queue_id = item.split(" ", 2)[-1]
+                            queue_list.append(queue_id)
+            print list(set(queue_list))
+            if flag == "true":
+                self.verify(len(list(set(queue_list))) > 1, "All packets enter the same queue: %s" % queue_list)
+            else:
+                self.verify(len(list(set(queue_list))) == 1, "All packets should enter queue 0, but entered %s" % queue_list)
+
+    def download_the_package(self, flag):
+        """
+        if flag == true: use the correct ice.pkg file; in rxonly mode, all packets should enter different queues of port 0
+        else: use wrong ice.pkg, all packets enter queue 0 of port 0
+        """
+        self.copy_ice_pkg_to_lib(flag=flag)
+        self.start_testpmd(flag=flag)
+        self.dut_testpmd.execute_cmd('set fwd mac')
+        self.dut_testpmd.execute_cmd('start')
+        self.tcpdump_start_sniffing([self.tester_p0, self.tester_p1])
+        self.send_packet(tran_type="ipv4-other", flag=flag)
+
+        self.dut_testpmd.execute_cmd('stop')
+        self.dut_testpmd.execute_cmd('set fwd rxonly')
+        self.dut_testpmd.execute_cmd('start')
+        for tran_types in ["ipv4-tcp", "ipv4-udp", "ipv4-sctp", "ipv6-tcp", "ipv6-udp", "ipv6-sctp"]:
+            print tran_types
+            self.send_packet(tran_type=tran_types, flag=flag)
+
+    def test_download_the_package_successfully(self):
+        self.download_the_package(flag="true")
+
+    def test_download_the_package_failed(self):
+        self.download_the_package(flag="false")
+
+    def tear_down(self):
+        self.dut_testpmd.quit()
+
+    def tear_down_all(self):
+        """
+        After test, apply the correct ice.pkg
+        """
+        self.copy_ice_pkg_to_lib(flag='true')
-- 
2.17.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2019-06-25  9:00 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-06-25 16:13 [dts] [PATCH V1 1/4] framework/settings: append cvl 25g and 100g Wenjie Li
2019-06-25 16:13 ` [dts] [PATCH V1 2/4] conf/supportlist: append suite enable_package_download_in_ice_driver Wenjie Li
2019-06-25 16:13 ` [dts] [PATCH V1 3/4] dep: add ice.pkg for cvl nics Wenjie Li
2019-06-25 16:13 ` [dts] [PATCH V1 4/4] tests: add new suite enable_package_download_in_ice_driver Wenjie Li
2019-06-25  9:00   ` Peng, Yuan

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).