get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 128419,
    "url": "http://patches.dpdk.org/api/patches/128419/?format=api",
    "web_url": "http://patches.dpdk.org/project/dts/patch/20230608182742.360594-5-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-5-zhiminx.huang@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dts/20230608182742.360594-5-zhiminx.huang@intel.com",
    "date": "2023-06-08T18:27:40",
    "name": "[V1,4/6] tests/ice_kernelpf_dcf:add new suite to cover dcf pmd function",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "545604de9a40e66a2405652693c0522f6d912afa",
    "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-5-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/128419/comments/",
    "check": "pending",
    "checks": "http://patches.dpdk.org/api/patches/128419/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 D858642C5E;\n\tThu,  8 Jun 2023 12:16:22 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id D6DAB410D7;\n\tThu,  8 Jun 2023 12:16:22 +0200 (CEST)",
            "from mga06.intel.com (mga06b.intel.com [134.134.136.31])\n by mails.dpdk.org (Postfix) with ESMTP id 6196540042\n for <dts@dpdk.org>; Thu,  8 Jun 2023 12:16:21 +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:16:18 -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:16:10 -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=1686219381; x=1717755381;\n h=from:to:cc:subject:date:message-id:in-reply-to:\n references:mime-version:content-transfer-encoding;\n bh=oLaoogR/ha0XgYq3NFOKzDblPVYvbEf/kG58d42H2V4=;\n b=aLPQNqDwh7ki0MIDCEx+YA/JjDXnig7+EkCnK2mJqEzg+U5uBrPrV+ev\n 4wF6FH1HrRzRBAHUtdJSRtsXcVX5K44kcwx+7wyIg/q7yIb/TOgGnVp0w\n vEkqCqHcdPWQHsUQPQuSoAHM4jtx3zK9vchIF7F8vEnQPp9gBOPCAmKpq\n AKu9TkJGzQlMpmEc1t7wQRHAvn76GKIBULrx1NAh5vsbkBoQUrnGC6lDR\n ZcI2Xgn+z4UooIHUAYHQVNu/IbHnm7RIckLXgIuCz+N0LNr9toBk9xkgB\n ib14zsyH0fHiLHECmyIdcfF5lhbI/0JYuHSziZQnkUxhrpFJ6zzyw7Bbk w==;",
        "X-IronPort-AV": [
            "E=McAfee;i=\"6600,9927,10734\"; a=\"420832843\"",
            "E=Sophos;i=\"6.00,226,1681196400\"; d=\"scan'208\";a=\"420832843\"",
            "E=McAfee;i=\"6600,9927,10734\"; a=\"660327277\"",
            "E=Sophos;i=\"6.00,226,1681196400\"; d=\"scan'208\";a=\"660327277\""
        ],
        "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 4/6] tests/ice_kernelpf_dcf:add new suite to cover dcf\n pmd function",
        "Date": "Thu,  8 Jun 2023 18:27:40 +0000",
        "Message-Id": "<20230608182742.360594-5-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 new test suite to test dcf pmd function, and use func_test_base to\nrefactor test cases.\n\nSigned-off-by: Zhimin Huang <zhiminx.huang@intel.com>\n---\n tests/TestSuite_ice_kernelpf_dcf.py | 732 ++++++++++++++++++++++++++++\n 1 file changed, 732 insertions(+)\n create mode 100644 tests/TestSuite_ice_kernelpf_dcf.py",
    "diff": "diff --git a/tests/TestSuite_ice_kernelpf_dcf.py b/tests/TestSuite_ice_kernelpf_dcf.py\nnew file mode 100644\nindex 00000000..d248baaa\n--- /dev/null\n+++ b/tests/TestSuite_ice_kernelpf_dcf.py\n@@ -0,0 +1,732 @@\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 ETH_800_SERIES\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+\n+class TestIceKernelpfDcf(TestCase):\n+    @check_supported_nic(ETH_800_SERIES)\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+\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+        else:\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 trust on\"\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+        self.dut.send_expect(\n+            \"ip link set %s vf 0 trust on\"\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.vm_pci = [\n+            self.vm_obj.pci_maps[i][\"guestpci\"]\n+            for i in range(len(self.vm_obj.pci_maps))\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_dcf_basic_rxtx(self):\n+        self.rxtx_base.launch_testpmd(\n+            ports=self.vm_pci,\n+            port_options={self.vm_pci[0]: \"cap=dcf\", self.vm_pci[1]: \"cap=dcf\"},\n+        )\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_dcf_promisc_mode(self):\n+        self.rxtx_base.launch_testpmd(\n+            ports=self.vm_pci,\n+            port_options={self.vm_pci[0]: \"cap=dcf\", self.vm_pci[1]: \"cap=dcf\"},\n+        )\n+        self.rxtx_base.basic_promisc_check(\n+            match_mac=VF_MAC_ADDR, unmatch_mac=VF_WRONG_MAC_ADDR\n+        )\n+\n+    def test_dcf_multicast(self):\n+        self.rxtx_base.launch_testpmd(\n+            ports=self.vm_pci,\n+            port_options={self.vm_pci[0]: \"cap=dcf\", self.vm_pci[1]: \"cap=dcf\"},\n+        )\n+        self.rxtx_base.basic_multicast_check(\n+            normal_mac=VF_MAC_ADDR, multicast_mac=MULTICAST_MAC_ADDR\n+        )\n+\n+    def test_dcf_broadcast(self):\n+        self.rxtx_base.launch_testpmd(\n+            ports=self.vm_pci,\n+            port_options={self.vm_pci[0]: \"cap=dcf\", self.vm_pci[1]: \"cap=dcf\"},\n+        )\n+        self.rxtx_base.basic_rx_check(packets_num=1, packet_dst_mac=BROADCAST_MAC_ADDR)\n+\n+    def test_dcf_queue_start_stop(self):\n+        self.rxtx_base.launch_testpmd(\n+            ports=self.vm_pci,\n+            port_options={self.vm_pci[0]: \"cap=dcf\", self.vm_pci[1]: \"cap=dcf\"},\n+        )\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_dcf_rss(self):\n+        rss_type = [\"ip\", \"tcp\", \"udp\"]\n+        rss_reta = [3, 2, 1, 0] * 16\n+        self.rxtx_base.launch_testpmd(\n+            ports=self.vm_pci,\n+            port_options={self.vm_pci[0]: \"cap=dcf\", self.vm_pci[1]: \"cap=dcf\"},\n+            param=\"--rxq=4 --txq=4\",\n+        )\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_dcf_rss_hash_key(self):\n+        update_hash_key = \"1b9d58a4b961d9cd1c56ad1621c3ad51632c16a5d16c21c3513d132c135d132c13ad1531c23a51d6ac49879c499d798a7d949c8a\"\n+        self.rxtx_base.launch_testpmd(\n+            ports=self.vm_pci,\n+            port_options={self.vm_pci[0]: \"cap=dcf\", self.vm_pci[1]: \"cap=dcf\"},\n+            param=\"--rxq=4 --txq=4\",\n+        )\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_dcf_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(\n+                    ports=self.vm_pci,\n+                    port_options={self.vm_pci[0]: \"cap=dcf\", self.vm_pci[1]: \"cap=dcf\"},\n+                    param=param,\n+                )\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_dcf_port_start_stop(self):\n+        self.rxtx_base.launch_testpmd(\n+            ports=self.vm_pci,\n+            port_options={self.vm_pci[0]: \"cap=dcf\", self.vm_pci[1]: \"cap=dcf\"},\n+        )\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_dcf_statistic_reset(self):\n+        self.rxtx_base.launch_testpmd(\n+            ports=self.vm_pci,\n+            port_options={self.vm_pci[0]: \"cap=dcf\", self.vm_pci[1]: \"cap=dcf\"},\n+        )\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_dcf_information(self):\n+        self.rxtx_base.launch_testpmd(\n+            ports=self.vm_pci,\n+            port_options={self.vm_pci[0]: \"cap=dcf\", self.vm_pci[1]: \"cap=dcf\"},\n+        )\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_dcf_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(\n+                ports=self.vm_pci,\n+                port_options={self.vm_pci[0]: \"cap=dcf\", self.vm_pci[1]: \"cap=dcf\"},\n+                param=\"--rxq=4 --txq=4 --max-pkt-len=9000\",\n+            )\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_dcf_unicast(self):\n+        self.rxtx_base.launch_testpmd(\n+            ports=self.vm_pci,\n+            port_options={self.vm_pci[0]: \"cap=dcf\", self.vm_pci[1]: \"cap=dcf\"},\n+        )\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_dcf_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+                ports=self.vm_pci,\n+                port_options={self.vm_pci[0]: \"cap=dcf\", self.vm_pci[1]: \"cap=dcf\"},\n+            )\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_dcf_vlan_filter(self):\n+        self.vlan_func.launch_testpmd(\n+            ports=self.vm_pci,\n+            port_options={self.vm_pci[0]: \"cap=dcf\", self.vm_pci[1]: \"cap=dcf\"},\n+        )\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 not self.default_stats:\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_dcf_vlan_strip(self):\n+        self.vlan_func.launch_testpmd(\n+            ports=self.vm_pci,\n+            port_options={self.vm_pci[0]: \"cap=dcf\", self.vm_pci[1]: \"cap=dcf\"},\n+        )\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_dcf_vlan_insertion(self):\n+        self.vlan_func.launch_testpmd(\n+            ports=self.vm_pci,\n+            port_options={self.vm_pci[0]: \"cap=dcf\", self.vm_pci[1]: \"cap=dcf\"},\n+        )\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_dcf_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+                ports=self.vm_pci,\n+                port_options={self.vm_pci[0]: \"cap=dcf\", self.vm_pci[1]: \"cap=dcf\"},\n+            )\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_dcf_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+                ports=self.vm_pci,\n+                port_options={self.vm_pci[0]: \"cap=dcf\", self.vm_pci[1]: \"cap=dcf\"},\n+            )\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+                    \"set promisc all off\",\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+                ports=self.vm_pci,\n+                port_options={self.vm_pci[0]: \"cap=dcf\", self.vm_pci[1]: \"cap=dcf\"},\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+                pmd_commands=[\n+                    \"set fwd rxonly\",\n+                    \"set verbose 1\",\n+                    \"set promisc all off\",\n+                    \"start\",\n+                ],\n+            )\n+            if not self.default_stats:\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_dcf_vlan_rx_combination(self):\n+        rx_vlans = [1, RANDOM_VLAN_ID, MAX_VLAN_ID]\n+        \"\"\"\n+        the dcf not support '--enable-hw-vlan', So change to scalar path to test dcf vlan offload.\n+        \"\"\"\n+        self.rxtx_base.launch_testpmd(\n+            ports=self.vm_pci,\n+            eal_param=\"--force-max-simd-bitwidth=64\",\n+            port_options={self.vm_pci[0]: \"cap=dcf\", self.vm_pci[1]: \"cap=dcf\"},\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+            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 not self.default_stats:\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_dcf_vlan_promisc(self):\n+        self.vlan_func.launch_testpmd(\n+            ports=self.vm_pci,\n+            port_options={self.vm_pci[0]: \"cap=dcf\", self.vm_pci[1]: \"cap=dcf\"},\n+        )\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+        self.verify(rece_num == 10, \"Not 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 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",
        "4/6"
    ]
}