get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/128417/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 128417,
    "url": "http://patches.dpdk.org/api/patches/128417/?format=api",
    "web_url": "http://patches.dpdk.org/project/dts/patch/20230608182742.360594-3-zhiminx.huang@intel.com/",
    "project": {
        "id": 3,
        "url": "http://patches.dpdk.org/api/projects/3/?format=api",
        "name": "DTS",
        "link_name": "dts",
        "list_id": "dts.dpdk.org",
        "list_email": "dts@dpdk.org",
        "web_url": "",
        "scm_url": "git://dpdk.org/tools/dts",
        "webscm_url": "http://git.dpdk.org/tools/dts/",
        "list_archive_url": "https://inbox.dpdk.org/dts",
        "list_archive_url_format": "https://inbox.dpdk.org/dts/{}",
        "commit_url_format": ""
    },
    "msgid": "<20230608182742.360594-3-zhiminx.huang@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dts/20230608182742.360594-3-zhiminx.huang@intel.com",
    "date": "2023-06-08T18:27:38",
    "name": "[V1,2/6] tests/kernelpf_vf:add new suite to cover most of the basic vf cases",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "8fc90db9dfa0620844e04a4cbae8e9cd8664d2c0",
    "submitter": {
        "id": 1685,
        "url": "http://patches.dpdk.org/api/people/1685/?format=api",
        "name": "Huang, ZhiminX",
        "email": "zhiminx.huang@intel.com"
    },
    "delegate": null,
    "mbox": "http://patches.dpdk.org/project/dts/patch/20230608182742.360594-3-zhiminx.huang@intel.com/mbox/",
    "series": [
        {
            "id": 28418,
            "url": "http://patches.dpdk.org/api/series/28418/?format=api",
            "web_url": "http://patches.dpdk.org/project/dts/list/?series=28418",
            "date": "2023-06-08T18:27:36",
            "name": "add new common module and add new suites",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/28418/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/128417/comments/",
    "check": "pending",
    "checks": "http://patches.dpdk.org/api/patches/128417/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dts-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 7DACD42C5C;\n\tThu,  8 Jun 2023 12:16:00 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 7A496406B5;\n\tThu,  8 Jun 2023 12:16:00 +0200 (CEST)",
            "from mga06.intel.com (mga06b.intel.com [134.134.136.31])\n by mails.dpdk.org (Postfix) with ESMTP id E7ECB40042\n for <dts@dpdk.org>; Thu,  8 Jun 2023 12:15:57 +0200 (CEST)",
            "from orsmga003.jf.intel.com ([10.7.209.27])\n by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 08 Jun 2023 03:15:56 -0700",
            "from unknown (HELO localhost.localdomain) ([10.239.252.96])\n by orsmga003-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 08 Jun 2023 03:15:16 -0700"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple;\n d=intel.com; i=@intel.com; q=dns/txt; s=Intel;\n t=1686219358; x=1717755358;\n h=from:to:cc:subject:date:message-id:in-reply-to:\n references:mime-version:content-transfer-encoding;\n bh=C9mJ/apop7qDz3riF6iMo051JE5jGYkagbKyzdPpmUI=;\n b=NNSXd8FTqdQ2tY8SJB3zg9IvzYbczuiPiNqcOoEdM/nbYRLfJqa42b4H\n tcqryww6o9wiXQwYeMmQGCEzRjjUJgJ9JSw2toSy87ln5+9RLSx/R+oTd\n BMPxdHuCBwqSZkA0FXQHUAjgg3nzQ9YCerutKfysriJ+COQlyKNbL+n5T\n qYENi3Pi2g7fK8EFLQKlL9NyDQWbMcZWc4YAXENzjpo2BmDFHb3g3WYMB\n +MnhAB0LLcS72PFm8oa5/7VEjlglHP+rYQvUiZF6bN5UVPxB7MamoeBcB\n oEkZIFgMwsxKHsx8+nlSBeK+bNDUAp4iaxy2lHvBaQAf6eMCq58SxcQ90 w==;",
        "X-IronPort-AV": [
            "E=McAfee;i=\"6600,9927,10734\"; a=\"420832729\"",
            "E=Sophos;i=\"6.00,226,1681196400\"; d=\"scan'208\";a=\"420832729\"",
            "E=McAfee;i=\"6600,9927,10734\"; a=\"660327198\"",
            "E=Sophos;i=\"6.00,226,1681196400\"; d=\"scan'208\";a=\"660327198\""
        ],
        "X-ExtLoop1": "1",
        "From": "Zhimin Huang <zhiminx.huang@intel.com>",
        "To": "dts@dpdk.org",
        "Cc": "Zhimin Huang <zhiminx.huang@intel.com>",
        "Subject": "[dts][PATCH V1 2/6] tests/kernelpf_vf:add new suite to cover most of\n the basic vf cases",
        "Date": "Thu,  8 Jun 2023 18:27:38 +0000",
        "Message-Id": "<20230608182742.360594-3-zhiminx.huang@intel.com>",
        "X-Mailer": "git-send-email 2.25.1",
        "In-Reply-To": "<20230608182742.360594-1-zhiminx.huang@intel.com>",
        "References": "<20230608182742.360594-1-zhiminx.huang@intel.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "X-BeenThere": "dts@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "test suite reviews and discussions <dts.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dts>,\n <mailto:dts-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dts/>",
        "List-Post": "<mailto:dts@dpdk.org>",
        "List-Help": "<mailto:dts-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dts>,\n <mailto:dts-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dts-bounces@dpdk.org"
    },
    "content": "add kernelpf_vf new suite and refactor with func_test_base common module:\ncover kernelpf_iavf/vf_vlan/vf_macfilter/vf_rss/vf_xstats_check.\n\nSigned-off-by: Zhimin Huang <zhiminx.huang@intel.com>\n---\n tests/TestSuite_kernelpf_vf.py | 1007 ++++++++++++++++++++++++++++++++\n 1 file changed, 1007 insertions(+)\n create mode 100644 tests/TestSuite_kernelpf_vf.py",
    "diff": "diff --git a/tests/TestSuite_kernelpf_vf.py b/tests/TestSuite_kernelpf_vf.py\nnew file mode 100644\nindex 00000000..cbecea14\n--- /dev/null\n+++ b/tests/TestSuite_kernelpf_vf.py\n@@ -0,0 +1,1007 @@\n+# SPDX-License-Identifier: BSD-3-Clause\n+# Copyright(c) 2023 Intel Corporation\n+#\n+\n+import random\n+\n+from framework.exception import VerifyFailure\n+from framework.settings import DPDK_RXMODE_SETTING, ETH_800_SERIES, load_global_setting\n+from framework.test_case import TestCase, check_supported_nic\n+\n+from .func_test_base import *\n+\n+VF_MAC_ADDR = \"00:01:23:45:67:89\"\n+VF_WRONG_MAC_ADDR = \"00:01:23:45:67:99\"\n+MULTICAST_MAC_ADDR = \"01:80:C2:00:00:08\"\n+BROADCAST_MAC_ADDR = \"FF:FF:FF:FF:FF:FF\"\n+\n+MAX_VLAN_ID = 4095\n+RANDOM_VLAN_ID = random.randint(2, MAX_VLAN_ID)\n+OUTER_VLAN_ID = 1\n+INNTER_VLAN_ID = 2\n+\n+MATCHED_VLAN_PKT = FuncTestBase.generate_using_packets(\n+    pkt_type=\"VLAN_UDP\", vlan_id=RANDOM_VLAN_ID, dst_mac=VF_MAC_ADDR\n+)\n+UNMATCHED_VLAN_PKT = FuncTestBase.generate_using_packets(\n+    pkt_type=\"VLAN_UDP\", vlan_id=RANDOM_VLAN_ID - 1, dst_mac=VF_MAC_ADDR\n+)\n+\n+MATCHED_DOUBLE_VLAN_PKT = [\n+    FuncTestBase.generate_using_packets(pkt_str=_pkt)\n+    for _pkt in [\n+        'Ether(dst=\"%s\",type=0x8100)/Dot1Q(vlan=%d,type=0x8100,prio=1)/Dot1Q(vlan=%d,type=0x0800,prio=2)/IP('\n+        'src=\"196.222.232.221\")/(\"X\"*480)'\n+        % (VF_MAC_ADDR, OUTER_VLAN_ID, INNTER_VLAN_ID),\n+        'Ether(dst=\"%s\",type=0x8100)/Dot1Q(vlan=%d,type=0x0800)/IP('\n+        'src=\"196.222.232.221\")/(\"X\"*480)' % (VF_MAC_ADDR, OUTER_VLAN_ID),\n+    ]\n+]\n+\n+UNMATCHED_DOUBLE_VLAN_PKT = [\n+    FuncTestBase.generate_using_packets(pkt_str=_pkt)\n+    for _pkt in [\n+        'Ether(dst=\"%s\",type=0x8100)/Dot1Q(vlan=%d,type=0x8100,prio=1)/Dot1Q(vlan=%d,type=0x0800,prio=2)/IP('\n+        'src=\"196.222.232.221\")/(\"X\"*480)'\n+        % (VF_MAC_ADDR, OUTER_VLAN_ID + 10, INNTER_VLAN_ID),\n+        'Ether(dst=\"%s\",type=0x8100)/Dot1Q(vlan=%d,type=0x0800)/IP('\n+        'src=\"196.222.232.221\")/(\"X\"*480)' % (VF_MAC_ADDR, OUTER_VLAN_ID + 10),\n+    ]\n+]\n+\n+\n+class TestKernelpfVf(TestCase):\n+    def set_up_all(self):\n+        self.dut_port = self.dut.get_ports(self.nic)\n+        self.used_dut_tx_port = self.dut_port[0]\n+        self.used_dut_rx_port = self.dut_port[1]\n+        self.port_obj = [self.dut.ports_info[port][\"port\"] for port in self.dut_port]\n+        self.tester_tx_interface = self.tester.get_interface(\n+            self.tester.get_local_port(self.used_dut_tx_port)\n+        )\n+        self.tester_rx_interface = self.tester.get_interface(\n+            self.tester.get_local_port(self.used_dut_rx_port)\n+        )\n+        self.rxtx_base = RxTxBaseTest(\n+            self, self.tester_tx_interface, self.tester_rx_interface\n+        )\n+        self.vlan_func = VlanFuncBaseTest(\n+            self, self.tester_tx_interface, self.tester_rx_interface\n+        )\n+        self.rxtx_base.check_port_num_for_test(2)\n+        self.setup_env_configuration()\n+        self.rx_mode = load_global_setting(DPDK_RXMODE_SETTING)\n+\n+    def set_up(self):\n+        pass\n+\n+    def pf_config(self):\n+        self.flag = \"vf-vlan-pruning\"\n+        self.dut.bind_interfaces_linux(self.kdriver)\n+        self.default_stats = self.dut.get_priv_flags_state(\n+            self.port_obj[self.used_dut_tx_port].get_interface_name(), self.flag\n+        )\n+        if not self.default_stats:\n+            self.logger.warning(\n+                f\"{self.kdriver + '_' + self.nic_obj.driver_version} driver does not have vf-vlan-pruning flag.\"\n+            )\n+        if (\n+            any([self.is_eth_series_nic(800), self.kdriver == \"i40e\"])\n+            and self.default_stats\n+        ):\n+            self.dut.send_expect(\n+                \"ethtool --set-priv-flags %s %s on\"\n+                % (\n+                    self.port_obj[self.used_dut_tx_port].get_interface_name(),\n+                    self.flag,\n+                ),\n+                \"# \",\n+            )\n+            self.dut.send_expect(\n+                \"ethtool --set-priv-flags %s %s on\"\n+                % (\n+                    self.port_obj[self.used_dut_rx_port].get_interface_name(),\n+                    self.flag,\n+                ),\n+                \"# \",\n+            )\n+\n+    def vf_config(self):\n+        self.orig_vf_mac = self.rxtx_base.get_vf_mac_through_pf(\n+            self.port_obj[self.used_dut_tx_port].get_interface_name()\n+        )\n+        self.port_obj[self.used_dut_tx_port].set_vf_mac_addr(mac=VF_MAC_ADDR)\n+        self.dut.send_expect(\n+            \"ip link set %s vf 0 spoofchk off\"\n+            % (self.port_obj[self.used_dut_tx_port].get_interface_name()),\n+            \"# \",\n+        )\n+        self.dut.send_expect(\n+            \"ip link set %s vf 0 spoofchk off\"\n+            % (self.port_obj[self.used_dut_rx_port].get_interface_name()),\n+            \"# \",\n+        )\n+\n+    def setup_env_configuration(self):\n+        self.vm_obj, self.vm_dut = self.rxtx_base.vf_test_preset_env_vm(\n+            pf_port=[self.used_dut_tx_port, self.used_dut_rx_port],\n+            vfs_num=1,\n+            vm_name=\"vm0\",\n+        )\n+        self.rxtx_base.init_pmd_session(self.vm_dut)\n+        self.vlan_func.init_pmd_session(self.vm_dut)\n+\n+    def test_vf_basic_rxtx(self):\n+        self.rxtx_base.launch_testpmd()\n+        self.rxtx_base.basic_rx_check(packets_num=100, packet_dst_mac=VF_MAC_ADDR)\n+        self.rxtx_base.basic_tx_check()\n+\n+    def test_vf_promisc_mode(self):\n+        try:\n+            self.rxtx_base.execute_host_cmd(\n+                \"ip link set dev %s vf 0 trust on\"\n+                % self.port_obj[self.used_dut_tx_port].get_interface_name()\n+            )\n+            self.rxtx_base.launch_testpmd()\n+            self.rxtx_base.basic_promisc_check(\n+                match_mac=VF_MAC_ADDR, unmatch_mac=VF_WRONG_MAC_ADDR\n+            )\n+        except Exception as e:\n+            raise VerifyFailure(e)\n+        finally:\n+            self.rxtx_base.pmd_session.quit()\n+            self.rxtx_base.execute_host_cmd(\n+                \"ip link set dev %s vf 0 trust off\"\n+                % self.port_obj[self.used_dut_tx_port].get_interface_name()\n+            )\n+            self.vf_config()\n+\n+    def test_vf_multicast(self):\n+        self.rxtx_base.launch_testpmd()\n+        self.rxtx_base.basic_multicast_check(\n+            normal_mac=VF_MAC_ADDR, multicast_mac=MULTICAST_MAC_ADDR\n+        )\n+\n+    def test_vf_broadcast(self):\n+        self.rxtx_base.launch_testpmd()\n+        self.rxtx_base.basic_rx_check(packets_num=1, packet_dst_mac=BROADCAST_MAC_ADDR)\n+\n+    def test_vf_queue_start_stop(self):\n+        self.rxtx_base.launch_testpmd()\n+        self.rxtx_base.basic_macfwd_check(\n+            packet_num=4, dst_mac=VF_MAC_ADDR, rx_port=self.used_dut_rx_port\n+        )\n+        packets_captured, _, stats = self.rxtx_base.execute_fwd_check_process(\n+            packets=self.rxtx_base.generate_random_packets(\n+                dstmac=VF_MAC_ADDR, pktnum=4\n+            ),\n+            rx_port=self.used_dut_rx_port,\n+            pmd_commands=[\"stop\", \"port 0 rxq 0 stop\", \"start\"],\n+        )\n+        self.verify(\n+            len(packets_captured) == 0\n+            and stats[self.used_dut_rx_port][\"TX-packets\"] == 0,\n+            \"receive packet num is not match\",\n+        )\n+        packets_captured, _, stats = self.rxtx_base.execute_fwd_check_process(\n+            packets=self.rxtx_base.generate_random_packets(\n+                dstmac=VF_MAC_ADDR, pktnum=4\n+            ),\n+            rx_port=self.used_dut_rx_port,\n+            pmd_commands=[\"stop\", \"port 0 rxq 0 start\", \"port 1 txq 0 stop\", \"start\"],\n+        )\n+        self.verify(\n+            len(packets_captured) == 0\n+            and stats[self.used_dut_rx_port][\"TX-packets\"] == 0,\n+            \"receive packet num is not match\",\n+        )\n+        self.rxtx_base.basic_macfwd_check(\n+            packet_num=4,\n+            dst_mac=VF_MAC_ADDR,\n+            rx_port=self.used_dut_rx_port,\n+            pmd_commands=[\"stop\", \"port 1 txq 0 start\", \"start\"],\n+        )\n+\n+    def test_vf_rss(self):\n+        rss_type = [\"ip\", \"tcp\", \"udp\"]\n+        rss_reta = [3, 2, 1, 0] * 16\n+        self.rxtx_base.launch_testpmd(param=\"--rxq=4 --txq=4\")\n+        self.rxtx_base.rss_reta_config_check(rss_reta)\n+        for _rss in rss_type:\n+            hash_table = self.rxtx_base.basic_rss_check(\n+                dst_mac=VF_MAC_ADDR, rss_type=_rss, queue_num=4\n+            )\n+            self.rxtx_base.rss_reta_hit_check(hash_table, rss_reta)\n+            self.rxtx_base.execute_pmd_cmd(\"stop\")\n+\n+    def test_vf_rss_hash_key(self):\n+        update_hash_key = \"1b9d58a4b961d9cd1c56ad1621c3ad51632c16a5d16c21c3513d132c135d132c13ad1531c23a51d6ac49879c499d798a7d949c8a\"\n+        self.rxtx_base.launch_testpmd(param=\"--rxq=4 --txq=4\")\n+        self.rxtx_base.basic_rss_hash_key_check(\n+            dst_mac=VF_MAC_ADDR, hash_key=update_hash_key\n+        )\n+\n+    def test_vf_rss_rxq_txq_inconsistent(self):\n+        params = [\n+            \"--rxq=4 --txq=8\",\n+            \"--rxq=6 --txq=8\",\n+            \"--rxq=3 --txq=9\",\n+            \"--rxq=4 --txq=16\",\n+        ]\n+        if self.kdriver == \"ixgbe\":\n+            params = [\n+                \"--rxq=2 --txq=4\",\n+                \"--rxq=1 --txq=2\",\n+            ]\n+        for param in params:\n+            try:\n+                queue_num = re.search(r\"--rxq=(\\d+)\", param).group(1)\n+                self.rxtx_base.launch_testpmd(param=param)\n+                self.rxtx_base.basic_rss_check(\n+                    dst_mac=VF_MAC_ADDR, rss_type=\"ip\", queue_num=queue_num\n+                )\n+            except Exception as e:\n+                raise VerifyFailure(e)\n+            finally:\n+                self.rxtx_base.pmd_session.quit()\n+\n+    def test_vf_port_start_stop(self):\n+        self.rxtx_base.launch_testpmd()\n+        for i in range(10):\n+            self.rxtx_base.execute_pmd_cmd(\"port stop all\")\n+            self.rxtx_base.execute_pmd_cmd(\"port start all\")\n+        self.rxtx_base.basic_macfwd_check(\n+            packet_num=100, dst_mac=VF_MAC_ADDR, rx_port=self.used_dut_rx_port\n+        )\n+\n+    def test_vf_statistic_reset(self):\n+        self.rxtx_base.launch_testpmd()\n+        out = self.rxtx_base.execute_pmd_cmd(\"show port stats all\")\n+        self.verify(\n+            \"RX-packets: 0\" in out and \"TX-packets: 0\" in out,\n+            \"receive some misc packet\",\n+        )\n+        self.rxtx_base.basic_macfwd_check(\n+            packet_num=100, dst_mac=VF_MAC_ADDR, rx_port=self.used_dut_rx_port\n+        )\n+        self.rxtx_base.execute_pmd_cmd(\"clear port stats all\")\n+        out = self.rxtx_base.execute_pmd_cmd(\"show port stats all\")\n+        self.verify(\n+            \"RX-packets: 0\" in out and \"TX-packets: 0\" in out,\n+            \"clear port stats fail\",\n+        )\n+\n+    def test_vf_information(self):\n+        self.rxtx_base.launch_testpmd()\n+        self.rxtx_base.basic_pmd_info_check(self.port_obj[0])\n+        self.rxtx_base.basic_macfwd_check(\n+            packet_num=100, dst_mac=VF_MAC_ADDR, rx_port=self.used_dut_rx_port\n+        )\n+\n+    def test_vf_xstats_check(self):\n+        try:\n+            self.tester.send_expect(\n+                \"ifconfig {} mtu {}\".format(self.tester_tx_interface, 3000), \"# \"\n+            )\n+            if self.kdriver == \"ixgbe\":\n+                self.rxtx_base.execute_host_cmd(\n+                    \"ifconfig {} mtu 3000\".format(\n+                        self.port_obj[self.used_dut_tx_port].get_interface_name()\n+                    )\n+                )\n+            self.rxtx_base.launch_testpmd(param=\"--rxq=4 --txq=4 --max-pkt-len=9000\")\n+            for _payload_size in [64, 128, 256, 512, 1024, 1523]:\n+\n+                stats_table, xstats_table = self.rxtx_base.basic_xstats_check(\n+                    packet_num=100,\n+                    dst_mac=VF_MAC_ADDR,\n+                    rx_port=self.used_dut_rx_port,\n+                    payload_size=_payload_size,\n+                )\n+                self.verify(\n+                    xstats_table[self.used_dut_tx_port][\"rx_good_packets\"]\n+                    == stats_table[self.used_dut_tx_port][\"RX-packets\"]\n+                    == xstats_table[self.used_dut_rx_port][\"tx_good_packets\"]\n+                    == stats_table[self.used_dut_rx_port][\"TX-packets\"]\n+                    == 100,\n+                    \"pkt recieve or transport count error!\",\n+                )\n+                self.verify(\n+                    xstats_table[self.used_dut_tx_port][\"rx_good_bytes\"]\n+                    == stats_table[self.used_dut_tx_port][\"RX-bytes\"]\n+                    == xstats_table[self.used_dut_rx_port][\"tx_good_bytes\"]\n+                    == stats_table[self.used_dut_rx_port][\"TX-bytes\"],\n+                    \"pkt recieve or transport bytes error!\",\n+                )\n+        except Exception as e:\n+            raise VerifyFailure(e)\n+        finally:\n+            self.tester.send_expect(\n+                \"ifconfig {} mtu {}\".format(self.tester_tx_interface, 1500), \"# \"\n+            )\n+            if self.kdriver == \"ixgbe\":\n+                self.rxtx_base.execute_host_cmd(\n+                    \"ifconfig {} mtu 1500\".format(\n+                        self.port_obj[self.used_dut_tx_port].get_interface_name()\n+                    )\n+                )\n+\n+    def test_vf_unicast(self):\n+        self.rxtx_base.launch_testpmd()\n+        self.rxtx_base.basic_macfwd_check(\n+            packet_num=10,\n+            dst_mac=VF_WRONG_MAC_ADDR,\n+            check_miss=True,\n+            pmd_commands=[\n+                \"set promisc all off\",\n+                \"set allmulti all off\",\n+                \"set verbose 1\",\n+                \"set fwd mac\",\n+                \"start\",\n+            ],\n+            rx_port=self.used_dut_rx_port,\n+        )\n+        self.rxtx_base.basic_macfwd_check(\n+            packet_num=10, dst_mac=VF_MAC_ADDR, rx_port=self.used_dut_rx_port\n+        )\n+\n+    def test_vf_mac_add_filter(self):\n+        try:\n+            self.port_obj[self.used_dut_tx_port].set_vf_mac_addr(\n+                mac=self.orig_vf_mac[0]\n+            )\n+            self.rxtx_base.launch_testpmd()\n+            default_vf_mac = self.rxtx_base.get_vf_mac_through_pf(\n+                self.port_obj[self.used_dut_tx_port].get_interface_name()\n+            )\n+            self.rxtx_base.basic_macfwd_check(\n+                packet_num=100,\n+                dst_mac=VF_MAC_ADDR,\n+                rx_port=self.used_dut_rx_port,\n+                pmd_commands=[\n+                    \"port stop all\",\n+                    \"port config all crc-strip on\",\n+                    \"port start all\",\n+                    \"set promisc all off\",\n+                    \"mac_addr add 0 {}\".format(VF_MAC_ADDR),\n+                    \"set verbose 1\",\n+                    \"set fwd mac\",\n+                    \"start\",\n+                ],\n+            )\n+            self.rxtx_base.basic_macfwd_check(\n+                packet_num=100,\n+                dst_mac=default_vf_mac[0],\n+                rx_port=self.used_dut_rx_port,\n+                pmd_commands=[\"clear port stats all\"],\n+            )\n+            self.rxtx_base.basic_macfwd_check(\n+                packet_num=100,\n+                dst_mac=VF_MAC_ADDR,\n+                rx_port=self.used_dut_rx_port,\n+                check_miss=True,\n+                pmd_commands=[\n+                    \"clear port stats all\",\n+                    \"mac_addr remove 0 {}\".format(VF_MAC_ADDR),\n+                ],\n+            )\n+            self.rxtx_base.basic_macfwd_check(\n+                packet_num=100,\n+                dst_mac=VF_WRONG_MAC_ADDR,\n+                rx_port=self.used_dut_rx_port,\n+                check_miss=True,\n+                pmd_commands=[\n+                    \"clear port stats all\",\n+                ],\n+            )\n+        except Exception as e:\n+            raise VerifyFailure(e)\n+        finally:\n+            self.port_obj[self.used_dut_tx_port].set_vf_mac_addr(mac=VF_MAC_ADDR)\n+\n+    def test_vf_vlan_filter(self):\n+        self.vlan_func.launch_testpmd()\n+        self.vlan_func.basic_vlan_filter_check(\n+            vlan_id=RANDOM_VLAN_ID,\n+            match_pkt=MATCHED_VLAN_PKT,\n+            unmatch_pkt=UNMATCHED_VLAN_PKT,\n+            pmd_commands=[\n+                \"set promisc all off\",\n+                \"vlan set filter on 0\",\n+                \"vlan set strip off 0\",\n+                \"rx_vlan add %d 0\" % RANDOM_VLAN_ID,\n+                \"set verbose 1\",\n+                \"set fwd mac\",\n+                \"start\",\n+            ],\n+            rx_port=self.used_dut_rx_port,\n+        )\n+        _, _, _, vlan_id_list = self.vlan_func.vlan_pkts_fwd_check(\n+            pkts=MATCHED_VLAN_PKT,\n+            pmd_commands=[\n+                \"rx_vlan rm %d 0\" % RANDOM_VLAN_ID,\n+                \"vlan set filter off 0\",\n+            ],\n+        )\n+        if (\n+            (self.kdriver == \"i40e\" and self.nic_obj.driver_version < \"2.13.10\")\n+            or (self.kdriver == \"i40e\" and not self.default_stats)\n+            or (self.kdriver == \"ice\" and not self.default_stats)\n+        ):\n+            self.verify(len(vlan_id_list) == 1, \"Failed to received vlan packet!!!\")\n+        else:\n+            self.verify(len(vlan_id_list) == 0, \"Failed to received vlan packet!!!\")\n+\n+    def test_vf_vlan_strip(self):\n+        self.vlan_func.launch_testpmd()\n+        self.vlan_func.basic_vlan_strip_check(\n+            vlan_id=RANDOM_VLAN_ID,\n+            match_pkt=MATCHED_VLAN_PKT,\n+            pmd_commands=[\n+                \"set promisc all off\",\n+                \"vlan set filter on 0\",\n+                \"rx_vlan add %d 0\" % RANDOM_VLAN_ID,\n+                \"vlan set strip on 0\",\n+                \"set verbose 1\",\n+                \"set fwd mac\",\n+                \"start\",\n+            ],\n+            rx_port=self.used_dut_rx_port,\n+        )\n+\n+    def test_vf_vlan_insertion(self):\n+        self.vlan_func.launch_testpmd()\n+        self.vlan_func.basic_vlan_insert_check(\n+            vlan_id=RANDOM_VLAN_ID,\n+            insert_vlan=RANDOM_VLAN_ID,\n+            match_pkt=self.vlan_func.generate_using_packets(\n+                pkt_type=\"UDP\", dst_mac=VF_MAC_ADDR\n+            ),\n+            pmd_commands=[\n+                \"port stop all\",\n+                \"set promisc all off\",\n+                \"vlan set filter on 0\",\n+                \"tx_vlan set 1 %s\" % RANDOM_VLAN_ID,\n+                \"rx_vlan add %s 0\" % RANDOM_VLAN_ID,\n+                \"port start all\",\n+                \"set verbose 1\",\n+                \"set fwd mac\",\n+                \"start\",\n+            ],\n+        )\n+\n+    def test_vf_vlan_pvid_base_tx(self):\n+        try:\n+            self.vlan_func.set_pvid_from_pf(\n+                pf_intf=self.port_obj[self.used_dut_tx_port].get_interface_name(),\n+                vlan_id=RANDOM_VLAN_ID,\n+            )\n+            self.vlan_func.launch_testpmd()\n+            packets_captured, _, _ = self.vlan_func.execute_fwd_check_process(\n+                packets=self.vlan_func.generate_using_packets(\n+                    pkt_type=\"UDP\",\n+                    dst_mac=self.vlan_func.get_vf_mac_through_pf(\n+                        pf_intf=self.port_obj[\n+                            self.used_dut_rx_port\n+                        ].get_interface_name()\n+                    ),\n+                ),\n+                tx_port=1,\n+                tester_tx_interface=self.tester_rx_interface,\n+                tester_rx_interface=self.tester_tx_interface,\n+                pmd_commands=[\"set fwd mac\", \"set verbose 1\", \"start\"],\n+            )\n+            self.verify(len(packets_captured) == 1, \"Not receive expected packet\")\n+        except Exception as e:\n+            raise VerifyFailure(e)\n+        finally:\n+            self.vlan_func.execute_host_cmd(\n+                \"ip link set {} vf 0 vlan 0\".format(\n+                    self.port_obj[self.used_dut_tx_port].get_interface_name()\n+                )\n+            )\n+\n+    def test_vf_vlan_pvid_base_rx(self):\n+        try:\n+            self.vlan_func.set_pvid_from_pf(\n+                pf_intf=self.port_obj[self.used_dut_tx_port].get_interface_name(),\n+                vlan_id=RANDOM_VLAN_ID,\n+            )\n+            self.vlan_func.launch_testpmd()\n+            rece_num, _, _, _ = self.vlan_func.vlan_pkts_fwd_check(\n+                pkts=[MATCHED_VLAN_PKT, UNMATCHED_VLAN_PKT],\n+                pmd_commands=[\n+                    \"set fwd rxonly\",\n+                    \"set verbose 1\",\n+                    \"start\",\n+                ],\n+            )\n+            self.verify(rece_num == 1, \"Failed to received matched vlan pkt\")\n+            rece_num, _, _, _ = self.vlan_func.vlan_pkts_fwd_check(\n+                pkts=self.vlan_func.generate_using_packets(\n+                    pkt_type=\"UDP\", dst_mac=VF_MAC_ADDR\n+                ),\n+                rx_port=self.used_dut_rx_port,\n+            )\n+            self.verify(rece_num == 0, \"Failed to received udp pkt without vlan\")\n+            self.vlan_func.pmd_session.quit()\n+            self.vlan_func.set_pvid_from_pf(\n+                pf_intf=self.port_obj[self.used_dut_tx_port].get_interface_name(),\n+                vlan_id=0,\n+            )\n+            self.vlan_func.launch_testpmd()\n+            rece_num, _, _, _ = self.vlan_func.vlan_pkts_fwd_check(\n+                pkts=MATCHED_VLAN_PKT,\n+                rx_port=self.used_dut_rx_port,\n+                pmd_commands=[\n+                    \"set fwd rxonly\",\n+                    \"set verbose 1\",\n+                    \"start\",\n+                ],\n+            )\n+            if (\n+                (self.kdriver == \"i40e\" and self.nic_obj.driver_version < \"2.13.10\")\n+                or (self.kdriver == \"i40e\" and not self.default_stats)\n+                or (self.kdriver == \"ice\" and not self.default_stats)\n+            ):\n+                self.verify(rece_num == 1, \"Failed to received vlan packet!!!\")\n+            else:\n+                self.verify(rece_num == 0, \"Failed to received vlan packet!!!\")\n+\n+            rece_num, _, _, _ = self.vlan_func.vlan_pkts_fwd_check(\n+                pkts=[\n+                    self.vlan_func.generate_using_packets(\n+                        pkt_type=\"VLAN_UDP\", vlan_id=0, dst_mac=VF_MAC_ADDR\n+                    ),\n+                    self.vlan_func.generate_using_packets(\n+                        pkt_type=\"UDP\", dst_mac=VF_MAC_ADDR\n+                    ),\n+                ],\n+                rx_port=self.used_dut_rx_port,\n+            )\n+            self.verify(rece_num == 2, \"Not received expect packet\")\n+        except Exception as e:\n+            raise VerifyFailure(e)\n+        finally:\n+            self.vlan_func.execute_host_cmd(\n+                \"ip link set {} vf 0 vlan 0\".format(\n+                    self.port_obj[self.used_dut_tx_port].get_interface_name()\n+                )\n+            )\n+\n+    def test_vf_vlan_rx_combination(self):\n+        rx_vlans = [1, RANDOM_VLAN_ID, MAX_VLAN_ID]\n+        param = \"--enable-hw-vlan\" if self.kdriver != \"ixgbe\" else \"\"\n+        self.rxtx_base.launch_testpmd(param=param)\n+        rece_num, _, _, _ = self.vlan_func.vlan_pkts_fwd_check(\n+            pkts=self.vlan_func.generate_using_packets(\n+                pkt_type=\"UDP\", dst_mac=VF_MAC_ADDR\n+            ),\n+            rx_port=self.used_dut_rx_port,\n+            pmd_commands=[\n+                \"set fwd rxonly\",\n+                \"set verbose 1\",\n+                \"vlan set strip on 0\",\n+                \"vlan set filter on 0\",\n+                \"set promisc all off\",\n+                \"start\",\n+            ],\n+        )\n+        self.verify(rece_num == 1, \"Not received normal packet as default\")\n+        _, pmdout, _ = self.vlan_func.execute_fwd_check_process(\n+            packets=self.vlan_func.generate_using_packets(\n+                pkt_type=\"VLAN_UDP\", vlan_id=0, dst_mac=VF_MAC_ADDR\n+            ),\n+            rx_port=self.used_dut_rx_port,\n+        )\n+        self.verify(\"VLAN tci=0x0\" in pmdout, \"Not received vlan 0 packet as default\")\n+        for rx_vlan in rx_vlans:\n+            _, pmdout, _ = self.vlan_func.execute_fwd_check_process(\n+                packets=self.vlan_func.generate_using_packets(\n+                    pkt_type=\"VLAN_UDP\", vlan_id=rx_vlan, dst_mac=VF_MAC_ADDR\n+                ),\n+                rx_port=self.used_dut_rx_port,\n+                pmd_commands=\"rx_vlan add {} 0\".format(rx_vlan),\n+            )\n+            self.verify(\n+                \"VLAN tci={}\".format(hex(rx_vlan)) in pmdout,\n+                \"Not received expected vlan packet\",\n+            )\n+            if rx_vlan == MAX_VLAN_ID:\n+                continue\n+            rece_num, _, _, _ = self.vlan_func.vlan_pkts_fwd_check(\n+                pkts=self.vlan_func.generate_using_packets(\n+                    pkt_type=\"VLAN_UDP\", vlan_id=rx_vlan + 1, dst_mac=VF_MAC_ADDR\n+                ),\n+                rx_port=self.used_dut_rx_port,\n+            )\n+            self.verify(rece_num == 0, \"failed to receive unmatch vlan pkt\")\n+        for rx_vlan in rx_vlans:\n+            self.vlan_func.execute_pmd_cmd(\"rx_vlan rm {} 0\".format(rx_vlan))\n+        _, pmdout, _ = self.vlan_func.execute_fwd_check_process(\n+            packets=self.vlan_func.generate_using_packets(\n+                pkt_type=\"VLAN_UDP\", vlan_id=0, dst_mac=VF_MAC_ADDR\n+            ),\n+            rx_port=self.used_dut_rx_port,\n+        )\n+        self.verify(\"VLAN tci=0x0\" in pmdout, \"Not received vlan 0 packet as default\")\n+        rece_num, _, _, _ = self.vlan_func.vlan_pkts_fwd_check(\n+            pkts=self.vlan_func.generate_using_packets(\n+                pkt_type=\"UDP\", dst_mac=VF_MAC_ADDR\n+            ),\n+            rx_port=self.used_dut_rx_port,\n+        )\n+        self.verify(\n+            rece_num == 1, \"Not received normal packet after remove vlan filter\"\n+        )\n+        rece_num, _, _, _ = self.vlan_func.vlan_pkts_fwd_check(\n+            pkts=MATCHED_VLAN_PKT,\n+            rx_port=self.used_dut_rx_port,\n+        )\n+        if (\n+            (self.kdriver == \"i40e\" and self.nic_obj.driver_version < \"2.13.10\")\n+            or (self.kdriver == \"i40e\" and not self.default_stats)\n+            or (self.kdriver == \"ice\" and not self.default_stats)\n+        ):\n+            self.verify(rece_num == 1, \"Failed to received vlan packet!!!\")\n+        else:\n+            self.verify(rece_num == 0, \"Failed to received vlan packet!!!\")\n+\n+    def test_vf_vlan_promisc(self):\n+        self.vlan_func.launch_testpmd()\n+        rece_num, _, _, _ = self.vlan_func.vlan_pkts_fwd_check(\n+            pkts=[\n+                self.vlan_func.generate_using_packets(\n+                    pkt_str=[\n+                        'Ether(dst=\"{}\",type=0x8100)/Dot1Q(vlan=100,type=0x0800)/IP(src=\"196.222.232.{}\")/(\"X\"*480)'.format(\n+                            VF_MAC_ADDR, i\n+                        )\n+                        for i in range(10)\n+                    ]\n+                )\n+            ],\n+            pmd_commands=[\n+                \"port stop all\",\n+                \"set promisc all on\",\n+                \"set fwd mac\",\n+                \"set verbose 1\",\n+                \"vlan set filter off 0\",\n+                \"vlan set strip off 0\",\n+                \"port start all\",\n+                \"start\",\n+            ],\n+        )\n+        if (\n+            (self.kdriver == \"i40e\" and self.nic_obj.driver_version < \"2.13.10\")\n+            or (self.kdriver == \"i40e\" and not self.default_stats)\n+            or (self.kdriver == \"ice\" and not self.default_stats)\n+        ):\n+            self.verify(rece_num == 10, \"Not receive expected packet\")\n+        else:\n+            self.verify(rece_num == 0, \"Receive expected packet\")\n+        rece_num, _, _, _ = self.vlan_func.vlan_pkts_fwd_check(\n+            pkts=[\n+                self.vlan_func.generate_using_packets(\n+                    pkt_str=[\n+                        'Ether(dst=\"{}\")/IP(src=\"196.222.232.{}\")/(\"X\"*480)'.format(\n+                            VF_MAC_ADDR, i\n+                        )\n+                        for i in range(10)\n+                    ]\n+                )\n+            ],\n+        )\n+        self.verify(rece_num == 10, \"Not receive expected packet\")\n+\n+    def test_iavf_dual_vlan_filter(self):\n+        self.vlan_func.launch_testpmd()\n+        rece_num, _, _, _ = self.vlan_func.vlan_pkts_fwd_check(\n+            pkts=MATCHED_DOUBLE_VLAN_PKT,\n+            pmd_commands=[\n+                \"vlan set filter on 0\",\n+                \"set verbose 1\",\n+                \"set fwd mac\",\n+                \"start\",\n+            ],\n+        )\n+        self.vlan_func.vlan_offload_flag_check(filter=\"on\")\n+        if self.default_stats:\n+            self.verify(rece_num == 0, \"Failed received vlan packet!\")\n+        else:\n+            self.verify(\n+                rece_num == len(MATCHED_DOUBLE_VLAN_PKT),\n+                \"Failed received vlan packet!\",\n+            )\n+        self.vlan_func.basic_vlan_filter_check(\n+            vlan_id=OUTER_VLAN_ID,\n+            match_pkt=MATCHED_DOUBLE_VLAN_PKT[0],\n+            unmatch_pkt=UNMATCHED_DOUBLE_VLAN_PKT[0],\n+            pmd_commands=[\n+                \"rx_vlan add %d 0\" % OUTER_VLAN_ID,\n+            ],\n+            double_vlan=True,\n+            rx_port=self.used_dut_rx_port,\n+        )\n+        self.vlan_func.vlan_prio_check(\n+            pkts=MATCHED_DOUBLE_VLAN_PKT[0], outer=1, inner=2\n+        )\n+        self.vlan_func.basic_vlan_filter_check(\n+            vlan_id=OUTER_VLAN_ID,\n+            match_pkt=MATCHED_DOUBLE_VLAN_PKT[1],\n+            unmatch_pkt=UNMATCHED_DOUBLE_VLAN_PKT[1],\n+            double_vlan=False,\n+            rx_port=self.used_dut_rx_port,\n+        )\n+        rece_num, _, _, _ = self.vlan_func.vlan_pkts_fwd_check(\n+            pkts=MATCHED_DOUBLE_VLAN_PKT,\n+            pmd_commands=[\n+                \"rx_vlan rm %d 0\" % OUTER_VLAN_ID,\n+            ],\n+        )\n+        if self.default_stats:\n+            self.verify(rece_num == 0, \"Failed error received vlan packet!\")\n+        else:\n+            self.verify(rece_num == 2, \"Failed error received vlan packet!\")\n+\n+    def test_iavf_dual_vlan_strip(self):\n+        self.vlan_func.launch_testpmd()\n+        rece_num, _, _, vlan_id_list = self.vlan_func.vlan_pkts_fwd_check(\n+            pkts=MATCHED_DOUBLE_VLAN_PKT,\n+            pmd_commands=[\n+                \"vlan set filter on 0\",\n+                \"rx_vlan add %d 0\" % OUTER_VLAN_ID,\n+                \"vlan set strip on 0\",\n+                \"set verbose 1\",\n+                \"set fwd mac\",\n+                \"start\",\n+            ],\n+        )\n+        self.vlan_func.vlan_offload_flag_check(filter=\"on\", strip=\"on\")\n+        self.verify(\n+            rece_num == len(MATCHED_DOUBLE_VLAN_PKT)\n+            and len(vlan_id_list) == 1\n+            and INNTER_VLAN_ID in vlan_id_list,\n+            \"Failed to receive vlan pkts with vlan tag\",\n+        )\n+        rece_num, _, _, vlan_id_list = self.vlan_func.vlan_pkts_fwd_check(\n+            pkts=MATCHED_DOUBLE_VLAN_PKT,\n+            pmd_commands=[\n+                \"vlan set strip off 0\",\n+            ],\n+        )\n+        self.vlan_func.vlan_offload_flag_check(strip=\"off\")\n+        self.verify(\n+            rece_num == len(MATCHED_DOUBLE_VLAN_PKT) and len(vlan_id_list) == 3,\n+            \"Failed to receive vlan pkts with vlan tag\",\n+        )\n+\n+    def test_iavf_dual_vlan_insert(self):\n+        \"\"\"\n+        Test case: IAVF DUAL VLAN header insertion\n+        \"\"\"\n+\n+        \"\"\"\n+        according to dpdk commit d048a0aaae27809523969904c2f7b71fe3cc1bb6,\n+        when the ice driver version newer than 1.8.9, avx512 tx path not support\n+        insert correct vlag tag(outer of QinQ)\n+        \"\"\"\n+        if self.rx_mode == \"avx512\" and self.vlan_func.convert_driver_version_value(\n+            self.nic_obj.driver_version\n+        ) > self.vlan_func.convert_driver_version_value(\"1.8.9\"):\n+            self.skip_case(False, \"avx512 tx path not support insert correct vlan tag\")\n+        self.vlan_func.launch_testpmd()\n+        self.vlan_func.basic_vlan_insert_check(\n+            vlan_id=RANDOM_VLAN_ID,\n+            insert_vlan=INNTER_VLAN_ID,\n+            match_pkt=MATCHED_VLAN_PKT,\n+            pmd_commands=[\n+                \"vlan set filter on 0\",\n+                \"rx_vlan add {} 0\".format(RANDOM_VLAN_ID),\n+                \"port stop 1\",\n+                \"tx_vlan set 1 {}\".format(INNTER_VLAN_ID),\n+                \"port start 1\",\n+                \"set verbose 1\",\n+                \"set fwd mac\",\n+                \"start\",\n+            ],\n+            rx_port=self.used_dut_rx_port,\n+            double_vlan=INNTER_VLAN_ID,\n+        )\n+        self.vlan_func.basic_vlan_insert_check(\n+            vlan_id=RANDOM_VLAN_ID,\n+            insert_vlan=INNTER_VLAN_ID,\n+            match_pkt=self.vlan_func.generate_using_packets(\n+                pkt_type=\"UDP\", dst_mac=VF_MAC_ADDR\n+            ),\n+            rx_port=self.used_dut_rx_port,\n+        )\n+\n+    @check_supported_nic(ETH_800_SERIES)\n+    def test_enable_disable_iavf_crc_strip(self):\n+        \"\"\"\n+        Test case: Enable/disable AVF CRC stripping\n+        \"\"\"\n+        self.rxtx_base.launch_testpmd(param=\"--disable-crc-strip\")\n+        packets_captured, pmdout, stats = self.rxtx_base.execute_fwd_check_process(\n+            packets=self.rxtx_base.generate_random_packets(\n+                dstmac=VF_MAC_ADDR, pktnum=1\n+            ),\n+            rx_port=self.used_dut_rx_port,\n+            pmd_commands=[\"set verbose 1\", \"set fwd mac\", \"start\"],\n+        )\n+        pkt_len_list = self.rxtx_base.get_pmd_rece_pkt_len(pmdout)\n+        self.verify(\n+            int(pkt_len_list[0]) + 4 == stats[self.used_dut_tx_port][\"RX-bytes\"],\n+            \"CRC strip off failed\",\n+        )\n+\n+        packets_captured, pmdout, stats = self.rxtx_base.execute_fwd_check_process(\n+            packets=self.rxtx_base.generate_random_packets(\n+                dstmac=VF_MAC_ADDR, pktnum=1\n+            ),\n+            rx_port=self.used_dut_rx_port,\n+            pmd_commands=[\n+                \"stop\",\n+                \"port stop 0\",\n+                \"port config 0 rx_offload keep_crc off\",\n+                \"port start 0\",\n+                \"start\",\n+            ],\n+        )\n+        pkt_len_list = self.rxtx_base.get_pmd_rece_pkt_len(pmdout)\n+        self.verify(\n+            int(pkt_len_list[0]) == stats[self.used_dut_tx_port][\"RX-bytes\"],\n+            \"CRC strip off failed\",\n+        )\n+\n+        packets_captured, pmdout, stats = self.rxtx_base.execute_fwd_check_process(\n+            packets=self.rxtx_base.generate_random_packets(\n+                dstmac=VF_MAC_ADDR, pktnum=1\n+            ),\n+            rx_port=self.used_dut_rx_port,\n+            pmd_commands=[\n+                \"stop\",\n+                \"port stop 0\",\n+                \"port config 0 rx_offload keep_crc on\",\n+                \"port start 0\",\n+                \"start\",\n+            ],\n+        )\n+        pkt_len_list = self.rxtx_base.get_pmd_rece_pkt_len(pmdout)\n+        self.verify(\n+            int(pkt_len_list[0]) + 4 == stats[self.used_dut_tx_port][\"RX-bytes\"],\n+            \"CRC strip off failed\",\n+        )\n+\n+        self.rxtx_base.pmd_session.quit()\n+        self.rxtx_base.launch_testpmd()\n+        packets_captured, pmdout, stats = self.rxtx_base.execute_fwd_check_process(\n+            packets=self.rxtx_base.generate_random_packets(\n+                dstmac=VF_MAC_ADDR, pktnum=1\n+            ),\n+            rx_port=self.used_dut_rx_port,\n+            pmd_commands=[\n+                \"set verbose 1\",\n+                \"set fwd mac\",\n+                \"start\",\n+            ],\n+        )\n+        pkt_len_list = self.rxtx_base.get_pmd_rece_pkt_len(pmdout)\n+        self.verify(\n+            int(pkt_len_list[0]) == stats[self.used_dut_tx_port][\"RX-bytes\"],\n+            \"CRC strip off failed\",\n+        )\n+\n+    @check_supported_nic(ETH_800_SERIES)\n+    def test_crc_strip_iavf_vlan_strip_coexists(self):\n+        \"\"\"\n+        Test case: IAVF CRC strip and Vlan strip co-exists\n+        \"\"\"\n+        self.vlan_func.launch_testpmd()\n+        self.vlan_func.set_pmd_fwd_mode(\"mac\")\n+        self.vlan_func.vlan_offload_flag_check(strip=\"off\")\n+        # vlan strip off, CRC strip on\n+        self.vlan_func.execute_pmd_cmd([\"stop\", \"vlan set strip off 0\"])\n+        self.vlan_func.vlan_offload_flag_check(strip=\"off\")\n+        packets_captured, pmdout, stats = self.vlan_func.execute_fwd_check_process(\n+            packets=MATCHED_DOUBLE_VLAN_PKT[0],\n+            rx_port=self.used_dut_rx_port,\n+            pmd_commands=[\n+                \"vlan set filter on 0\",\n+                \"rx_vlan add %d 0\" % OUTER_VLAN_ID,\n+                \"start\",\n+            ],\n+        )\n+        _, vlan_id_list = self.vlan_func.get_pkts_vlan_layer(packets_captured, \"vlan\")\n+        pkt_len_list = self.vlan_func.get_pmd_rece_pkt_len(pmdout)\n+        self.verify(\n+            len(vlan_id_list) == 2\n+            and stats[self.used_dut_tx_port][\"RX-bytes\"]\n+            == stats[self.used_dut_rx_port][\"TX-bytes\"]\n+            == int(pkt_len_list[0]),\n+            \"CRC strip on and vlan strip off should have same values for rx/tx bytes and pkt_len\",\n+        )\n+        compare_pkt_len = int(pkt_len_list[0])\n+        # vlan strip on, CRC strip on\n+        self.vlan_func.execute_pmd_cmd(\"vlan set strip on 0\")\n+        self.vlan_func.vlan_offload_flag_check(strip=\"on\")\n+        packets_captured, pmdout, stats = self.vlan_func.execute_fwd_check_process(\n+            packets=MATCHED_DOUBLE_VLAN_PKT[0],\n+            rx_port=self.used_dut_rx_port,\n+        )\n+        _, vlan_id_list = self.vlan_func.get_pkts_vlan_layer(packets_captured, \"vlan\")\n+        pkt_len_list = self.vlan_func.get_pmd_rece_pkt_len(pmdout)\n+        self.verify(\n+            stats[self.used_dut_tx_port][\"RX-bytes\"] == int(pkt_len_list[0]) + 4\n+            and int(pkt_len_list[0]) + 4 == compare_pkt_len\n+            and len(vlan_id_list) == 1,\n+            \"CRC strip on, vlan strip on, coexists test failed\",\n+        )\n+        # vlan strip off, CRC strip off\n+        self.vlan_func.execute_pmd_cmd(\"vlan set strip off 0\")\n+        self.vlan_func.vlan_offload_flag_check(strip=\"off\")\n+        packets_captured, pmdout, stats = self.vlan_func.execute_fwd_check_process(\n+            packets=MATCHED_DOUBLE_VLAN_PKT[0],\n+            rx_port=self.used_dut_rx_port,\n+            pmd_commands=[\n+                \"stop\",\n+                \"port stop 0\",\n+                \"port config 0 rx_offload keep_crc on\",\n+                \"port start 0\",\n+                \"start\",\n+            ],\n+        )\n+        _, vlan_id_list = self.vlan_func.get_pkts_vlan_layer(packets_captured, \"vlan\")\n+        pkt_len_list = self.vlan_func.get_pmd_rece_pkt_len(pmdout)\n+        self.verify(\n+            stats[self.used_dut_tx_port][\"RX-bytes\"] == int(pkt_len_list[0]) + 4\n+            and int(pkt_len_list[0]) == compare_pkt_len\n+            and len(vlan_id_list) == 2,\n+            \"CRC strip off, vlan strip off, coexists test failed\",\n+        )\n+        # vlan strip on, CRC strip off\n+        out = self.vlan_func.execute_pmd_cmd(\"vlan set strip on 0\")\n+        self.verify(\n+            \"iavf_config_vlan_strip_v2(): fail to execute command VIRTCHNL_OP_ENABLE_VLAN_STRIPPING_V2\"\n+            in out,\n+            \"set vlan strip on successfully\",\n+        )\n+        packets_captured, pmdout, stats = self.vlan_func.execute_fwd_check_process(\n+            packets=MATCHED_DOUBLE_VLAN_PKT[0],\n+            rx_port=self.used_dut_rx_port,\n+        )\n+        _, vlan_id_list = self.vlan_func.get_pkts_vlan_layer(packets_captured, \"vlan\")\n+        pkt_len_list = self.vlan_func.get_pmd_rece_pkt_len(pmdout)\n+        self.verify(\n+            stats[self.used_dut_tx_port][\"RX-bytes\"] == int(pkt_len_list[0]) + 4\n+            and int(pkt_len_list[0]) == compare_pkt_len\n+            and len(vlan_id_list) == 2,\n+            \"CRC strip off, vlan strip off, coexists test failed\",\n+        )\n+        # vlan strip off, CRC strip on\n+        self.vlan_func.execute_pmd_cmd(\"vlan set strip off 0\")\n+        self.vlan_func.vlan_offload_flag_check(strip=\"off\")\n+        packets_captured, pmdout, stats = self.vlan_func.execute_fwd_check_process(\n+            packets=MATCHED_DOUBLE_VLAN_PKT[0],\n+            rx_port=self.used_dut_rx_port,\n+            pmd_commands=[\n+                \"stop\",\n+                \"port stop 0\",\n+                \"port config 0 rx_offload keep_crc off\",\n+                \"port start 0\",\n+                \"start\",\n+            ],\n+        )\n+        self.verify(\n+            stats[self.used_dut_tx_port][\"RX-bytes\"] == int(pkt_len_list[0])\n+            and int(pkt_len_list[0]) == compare_pkt_len\n+            and len(vlan_id_list) == 2,\n+            \"CRC strip on, vlan strip off, coexists test failed\",\n+        )\n+\n+    def tear_down(self):\n+        self.rxtx_base.pmd_session.quit()\n+\n+    def tear_down_all(self):\n+        self.rxtx_base.destroy_vm_env()\n+        self.rxtx_base.destroy_vf()\n",
    "prefixes": [
        "V1",
        "2/6"
    ]
}