get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 129265,
    "url": "https://patches.dpdk.org/api/patches/129265/?format=api",
    "web_url": "https://patches.dpdk.org/project/dts/patch/20230705105344.1031168-3-zhiminx.huang@intel.com/",
    "project": {
        "id": 3,
        "url": "https://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": "<20230705105344.1031168-3-zhiminx.huang@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dts/20230705105344.1031168-3-zhiminx.huang@intel.com",
    "date": "2023-07-05T10:53:40",
    "name": "[V2,2/6] tests/kernelpf_vf:add new suite to cover most of the basic vf cases",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "629cbfa18866657e5e4574bb9f45b1938746add6",
    "submitter": {
        "id": 1685,
        "url": "https://patches.dpdk.org/api/people/1685/?format=api",
        "name": "Huang, ZhiminX",
        "email": "zhiminx.huang@intel.com"
    },
    "delegate": null,
    "mbox": "https://patches.dpdk.org/project/dts/patch/20230705105344.1031168-3-zhiminx.huang@intel.com/mbox/",
    "series": [
        {
            "id": 28816,
            "url": "https://patches.dpdk.org/api/series/28816/?format=api",
            "web_url": "https://patches.dpdk.org/project/dts/list/?series=28816",
            "date": "2023-07-05T10:53:38",
            "name": "add new common module and add new suites",
            "version": 2,
            "mbox": "https://patches.dpdk.org/series/28816/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/129265/comments/",
    "check": "pending",
    "checks": "https://patches.dpdk.org/api/patches/129265/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 222B742DAB;\n\tWed,  5 Jul 2023 04:38:28 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 1CC4D40FAE;\n\tWed,  5 Jul 2023 04:38:28 +0200 (CEST)",
            "from mga12.intel.com (mga12.intel.com [192.55.52.136])\n by mails.dpdk.org (Postfix) with ESMTP id 51633406BC\n for <dts@dpdk.org>; Wed,  5 Jul 2023 04:38:26 +0200 (CEST)",
            "from fmsmga008.fm.intel.com ([10.253.24.58])\n by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 04 Jul 2023 19:38:25 -0700",
            "from unknown (HELO localhost.localdomain) ([10.239.252.96])\n by fmsmga008-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 04 Jul 2023 19:38:17 -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=1688524706; x=1720060706;\n h=from:to:cc:subject:date:message-id:in-reply-to:\n references:mime-version:content-transfer-encoding;\n bh=HoyPgx1JgsO1h9PYWtDOk9MmiDlBn7FlfmW7Spf9q6g=;\n b=MUcDflUjYTpfyvIPE+MARAY4FDvi/TskCdbo56kZAFanKnAbGgHs8ZX2\n spwdbGd36+65Wtx5FJboJNugepjBec56Lv4y+sDvom+K4iIrBpELhwoQm\n oRTLWGCJ15dsa4I/xnBcmmBQsCK7yeG4nDrbaQ3VHW9fp3xmpqYBoqXzg\n 1rz038FummrkjP/yHMgQyedeyWdNlKsjQrbOlJmsB6NT1xV7Qx7QVUP3S\n i9p/GDqd15HH45SVlAYXMooqRW7AFqZkA3OqxED2FfJVy8n+aZU1MkHIN\n khVlKe1CifHytwu4g+e1wYuVkI1c5VljZy12axV5hkNVqNRPQAGCdta/O Q==;",
        "X-IronPort-AV": [
            "E=McAfee;i=\"6600,9927,10761\"; a=\"342821693\"",
            "E=Sophos;i=\"6.01,181,1684825200\"; d=\"scan'208\";a=\"342821693\"",
            "E=McAfee;i=\"6600,9927,10761\"; a=\"784364021\"",
            "E=Sophos;i=\"6.01,181,1684825200\"; d=\"scan'208\";a=\"784364021\""
        ],
        "X-ExtLoop1": "1",
        "From": "Zhimin Huang <zhiminx.huang@intel.com>",
        "To": "dts@dpdk.org",
        "Cc": "Zhimin Huang <zhiminx.huang@intel.com>",
        "Subject": "[dts][PATCH V2 2/6] tests/kernelpf_vf:add new suite to cover most of\n the basic vf cases",
        "Date": "Wed,  5 Jul 2023 10:53:40 +0000",
        "Message-Id": "<20230705105344.1031168-3-zhiminx.huang@intel.com>",
        "X-Mailer": "git-send-email 2.25.1",
        "In-Reply-To": "<20230705105344.1031168-1-zhiminx.huang@intel.com>",
        "References": "<20230705105344.1031168-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---\nv2:\nadjust test case to use same testpmd\n\n tests/TestSuite_kernelpf_vf.py | 1055 ++++++++++++++++++++++++++++++++\n 1 file changed, 1055 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..2d9d1b6b\n--- /dev/null\n+++ b/tests/TestSuite_kernelpf_vf.py\n@@ -0,0 +1,1055 @@\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+        self.testpmd_flag = False\n+        self.launch_testpmd()\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 launch_testpmd(self, **kwargs):\n+        if not self.testpmd_flag:\n+            self.rxtx_base.launch_testpmd(**kwargs)\n+            self.testpmd_flag = True\n+\n+    def quit_testpmd(self):\n+        if self.testpmd_flag:\n+            self.rxtx_base.pmd_session.quit()\n+            self.testpmd_flag = False\n+\n+    def restart_testpmd(self, **kwargs):\n+        self.quit_testpmd()\n+        self.launch_testpmd(**kwargs)\n+\n+    def test_vf_basic_rxtx(self):\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+        self.quit_testpmd()\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.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.quit_testpmd()\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+            self.launch_testpmd()\n+\n+    def test_vf_multicast(self):\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.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.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+        try:\n+            self.restart_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+        except Exception as e:\n+            raise VerifyFailure(e)\n+        finally:\n+            self.restart_testpmd()\n+\n+    def test_vf_rss_hash_key(self):\n+        update_hash_key = \"1b9d58a4b961d9cd1c56ad1621c3ad51632c16a5d16c21c3513d132c135d132c13ad1531c23a51d6ac49879c499d798a7d949c8a\"\n+        try:\n+            self.restart_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+        except Exception as e:\n+            raise VerifyFailure(e)\n+        finally:\n+            self.restart_testpmd()\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+        try:\n+            for param in params:\n+                queue_num = re.search(r\"--rxq=(\\d+)\", param).group(1)\n+                self.restart_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.restart_testpmd()\n+\n+    def test_vf_port_start_stop(self):\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+        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.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+        self.quit_testpmd()\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.launch_testpmd(param=\"--rxq=4 --txq=4 --max-pkt-len=9000\")\n+            for _payload_size in [64, 128, 256, 512, 1024, 1523]:\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.quit_testpmd()\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+            self.launch_testpmd()\n+\n+    def test_vf_unicast(self):\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+        self.quit_testpmd()\n+        try:\n+            # reset vf mac\n+            self.port_obj[self.used_dut_tx_port].set_vf_mac_addr(\n+                mac=\"00:00:00:00:00:00\"\n+            )\n+            self.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.quit_testpmd()\n+            self.port_obj[self.used_dut_tx_port].set_vf_mac_addr(mac=VF_MAC_ADDR)\n+            self.launch_testpmd()\n+\n+    def test_vf_vlan_filter(self):\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.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+        try:\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+        except Exception as e:\n+            raise VerifyFailure(e)\n+        finally:\n+            self.restart_testpmd()\n+\n+    def test_vf_vlan_pvid_base_tx(self):\n+        self.quit_testpmd()\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.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.quit_testpmd()\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+            self.launch_testpmd()\n+\n+    def test_vf_vlan_pvid_base_rx(self):\n+        self.quit_testpmd()\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.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.quit_testpmd()\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.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.quit_testpmd()\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+            self.launch_testpmd()\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+        try:\n+            self.restart_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(\n+                \"VLAN tci=0x0\" in pmdout, \"Not received vlan 0 packet as default\"\n+            )\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(\n+                \"VLAN tci=0x0\" in pmdout, \"Not received vlan 0 packet as default\"\n+            )\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+        except Exception as e:\n+            raise VerifyFailure(e)\n+        finally:\n+            self.restart_testpmd()\n+\n+    def test_vf_vlan_promisc(self):\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+        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+        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+        try:\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+        except Exception as e:\n+            raise VerifyFailure(e)\n+        finally:\n+            self.restart_testpmd()\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+        try:\n+            self.restart_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.restart_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+        except Exception as e:\n+            raise VerifyFailure(e)\n+        finally:\n+            self.restart_testpmd()\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.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.execute_pmd_cmd(\"stop\")\n+\n+    def tear_down_all(self):\n+        self.quit_testpmd()\n+        self.rxtx_base.destroy_vm_env()\n+        self.rxtx_base.destroy_vf()\n",
    "prefixes": [
        "V2",
        "2/6"
    ]
}