get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 114536,
    "url": "https://patches.dpdk.org/api/patches/114536/?format=api",
    "web_url": "https://patches.dpdk.org/project/dts/patch/20220802190441.10272-1-songx.jiale@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": "<20220802190441.10272-1-songx.jiale@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dts/20220802190441.10272-1-songx.jiale@intel.com",
    "date": "2022-08-02T19:04:38",
    "name": "[V2,1/4] tests/ice_fdir_protocol_agnostic_flow: add test cases",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "b1bdb2ba211457656bacaa651a5cc94d401e621e",
    "submitter": {
        "id": 2352,
        "url": "https://patches.dpdk.org/api/people/2352/?format=api",
        "name": "Jiale, SongX",
        "email": "songx.jiale@intel.com"
    },
    "delegate": null,
    "mbox": "https://patches.dpdk.org/project/dts/patch/20220802190441.10272-1-songx.jiale@intel.com/mbox/",
    "series": [
        {
            "id": 24173,
            "url": "https://patches.dpdk.org/api/series/24173/?format=api",
            "web_url": "https://patches.dpdk.org/project/dts/list/?series=24173",
            "date": "2022-08-02T19:04:38",
            "name": "[V2,1/4] tests/ice_fdir_protocol_agnostic_flow: add test cases",
            "version": 2,
            "mbox": "https://patches.dpdk.org/series/24173/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/114536/comments/",
    "check": "pending",
    "checks": "https://patches.dpdk.org/api/patches/114536/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 13700A0545;\n\tTue,  2 Aug 2022 12:45:31 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 0476B40DF7;\n\tTue,  2 Aug 2022 12:45:31 +0200 (CEST)",
            "from mga06.intel.com (mga06b.intel.com [134.134.136.31])\n by mails.dpdk.org (Postfix) with ESMTP id 9582D400D7\n for <dts@dpdk.org>; Tue,  2 Aug 2022 12:45:28 +0200 (CEST)",
            "from orsmga006.jf.intel.com ([10.7.209.51])\n by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 02 Aug 2022 03:45:27 -0700",
            "from unknown (HELO cvl_tetser_105.icx.intel.com) ([10.239.252.94])\n by orsmga006-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 02 Aug 2022 03:45:25 -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=1659437128; x=1690973128;\n h=from:to:cc:subject:date:message-id;\n bh=tnR2NCcEBFyWB76yEeecjOutNW3f1XfjzND/wCea4T4=;\n b=aubtNyYzR5FUYNOj91wHD4YZw5BcAGAngNwbK1s3L+2XIFlOzpJZCgvl\n K0RB8TxGD3bQn+qELIeRhZo1FvxaWci7IQSH+xq2wv5JUqchONnDJ1cCt\n mnuINY9ZRZxvd6uRtSqJlEcgJaJDlp0S7Mp5TC0e/pnGTdiTnt5kgAhqD\n Sql/kc1q4a6TDSd29Uj7SmlT3RBPrpFfFLNawKLnpbHcNJ+ONHPDZLK2V\n ECfEj7wNCxm90dxiDww6nLQGGthIgbrt6BlFwx+thbVI/e4j2d8wriMks\n 1Re5pLMUJIch0yz2rrrbCiOUydGT+6MPLYi3uDaNftimoIqAR+G81c7vt A==;",
        "X-IronPort-AV": [
            "E=McAfee;i=\"6400,9594,10426\"; a=\"351087449\"",
            "E=Sophos;i=\"5.93,210,1654585200\"; d=\"scan'208\";a=\"351087449\"",
            "E=Sophos;i=\"5.93,210,1654585200\"; d=\"scan'208\";a=\"578173796\""
        ],
        "From": "Jiale Song <songx.jiale@intel.com>",
        "To": "dts@dpdk.org",
        "Cc": "Jiale Song <songx.jiale@intel.com>",
        "Subject": "[dts] [PATCH V2 1/4] tests/ice_fdir_protocol_agnostic_flow: add test\n cases",
        "Date": "Tue,  2 Aug 2022 19:04:38 +0000",
        "Message-Id": "<20220802190441.10272-1-songx.jiale@intel.com>",
        "X-Mailer": "git-send-email 2.17.1",
        "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 test cases for ice fdir protocol agnostic flow offloading.\n\nSigned-off-by: Jiale Song <songx.jiale@intel.com>\n---\n ...stSuite_ice_fdir_protocol_agnostic_flow.py | 1259 +++++++++++++++++\n 1 file changed, 1259 insertions(+)\n create mode 100644 tests/TestSuite_ice_fdir_protocol_agnostic_flow.py",
    "diff": "diff --git a/tests/TestSuite_ice_fdir_protocol_agnostic_flow.py b/tests/TestSuite_ice_fdir_protocol_agnostic_flow.py\nnew file mode 100644\nindex 00000000..df0979ec\n--- /dev/null\n+++ b/tests/TestSuite_ice_fdir_protocol_agnostic_flow.py\n@@ -0,0 +1,1259 @@\n+# SPDX-License-Identifier: BSD-3-Clause\n+# Copyright(c) 2022 Intel Corporation\n+#\n+\n+import copy\n+import re\n+import traceback\n+from collections import OrderedDict\n+\n+from framework.exception import VerifyFailure\n+from framework.packet import Packet\n+from framework.pmd_output import PmdOutput\n+from framework.test_case import TestCase, skip_unsupported_pkg\n+from framework.utils import GREEN, RED\n+\n+from .rte_flow_common import FdirProcessing\n+\n+MAC_IPv4_UDP = {\n+    \"match\": [\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.20\",dst=\"192.168.0.21\")/UDP(sport=22,dport=23)/Raw(\"x\" * 80)',\n+    ],\n+    \"mismatch\": [\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.1.20\",dst=\"192.168.0.21\")/UDP(sport=22,dport=23)/Raw(\"x\" * 80)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.20\",dst=\"192.168.0.22\")/UDP(sport=22,dport=23)/Raw(\"x\" * 80)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.20\",dst=\"192.168.0.21\")/UDP(sport=21,dport=23)/Raw(\"x\" * 80)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.20\",dst=\"192.168.0.21\")/UDP(sport=22,dport=24)/Raw(\"x\" * 80)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.20\",dst=\"192.168.0.21\")/TCP(sport=22,dport=23)/Raw(\"x\" * 80)',\n+    ],\n+}\n+\n+mac_ipv4_udp_queue = {\n+    \"sub_casename\": \"mac_ipv4_udp_queue\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 00112233445500000000000208004500001C0000000000110000C0A80014C0A800150016001700080000 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000000 / end actions queue index 1 / mark id 10 / end\",\n+    ],\n+    \"packet\": MAC_IPv4_UDP,\n+    \"check_param\": {\"port_id\": 0, \"mark_id\": 10, \"queue\": 1},\n+}\n+\n+mac_ipv4_udp_rss = {\n+    \"sub_casename\": \"mac_ipv4_udp_rss\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 00112233445500000000000208004500001C0000000000110000C0A80014C0A800150016001700080000 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000000 / end actions rss queues 0 1 2 3 end / mark id 4 / end\",\n+    ],\n+    \"packet\": MAC_IPv4_UDP,\n+    \"check_param\": {\"port_id\": 0, \"mark_id\": 4, \"queue\": [0, 1, 2, 3]},\n+}\n+\n+mac_ipv4_udp_passthru = {\n+    \"sub_casename\": \"mac_ipv4_udp_passthru\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 00112233445500000000000208004500001C0000000000110000C0A80014C0A800150016001700080000 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000000 / end actions passthru / mark id 1 / end\",\n+    ],\n+    \"packet\": MAC_IPv4_UDP,\n+    \"check_param\": {\"port_id\": 0, \"mark_id\": 1, \"rss\": True},\n+}\n+\n+mac_ipv4_udp_drop = {\n+    \"sub_casename\": \"mac_ipv4_udp_drop\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 00112233445500000000000208004500001C0000000000110000C0A80014C0A800150016001700080000 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000000 / end actions drop / end\",\n+    ],\n+    \"packet\": MAC_IPv4_UDP,\n+    \"check_param\": {\"port_id\": 0, \"drop\": True},\n+}\n+\n+# Test case 1: ICE_FDIR_MAC/IPv4/UDP\n+mac_ipv4_udp = [\n+    mac_ipv4_udp_queue,\n+    mac_ipv4_udp_rss,\n+    mac_ipv4_udp_passthru,\n+    mac_ipv4_udp_drop,\n+]\n+\n+MAC_IPv6_TCP = {\n+    \"match\": [\n+        'Ether(dst=\"00:11:22:33:44:55\")/IPv6(dst=\"CDCD:910A:2222:5498:8475:1111:3900:2020\", src=\"CDCD:910A:2222:5498:8475:1111:3900:1010\")/TCP(sport=22,dport=23)/(\"X\"*480)',\n+    ],\n+    \"mismatch\": [\n+        'Ether(dst=\"00:11:22:33:44:55\")/IPv6(dst=\"CDCD:910A:2222:5498:8475:1111:3900:2021\", src=\"CDCD:910A:2222:5498:8475:1111:3900:1010\")/TCP(sport=22,dport=23)/(\"X\"*480)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IPv6(dst=\"CDCD:910A:2222:5498:8475:1111:3900:2020\", src=\"CDCD:910A:2222:5498:8475:1111:3900:1011\")/TCP(sport=22,dport=23)/(\"X\"*480)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IPv6(dst=\"CDCD:910A:2222:5498:8475:1111:3900:2020\", src=\"CDCD:910A:2222:5498:8475:1111:3900:1010\")/TCP(sport=21,dport=23)/(\"X\"*480)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IPv6(dst=\"CDCD:910A:2222:5498:8475:1111:3900:2020\", src=\"CDCD:910A:2222:5498:8475:1111:3900:1010\")/TCP(sport=22,dport=24)/(\"X\"*480)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IPv6(dst=\"CDCD:910A:2222:5498:8475:1111:3900:2020\", src=\"CDCD:910A:2222:5498:8475:1111:3900:1010\")/UDP(sport=22,dport=23)/(\"X\"*480)',\n+    ],\n+}\n+\n+mac_ipv6_tcp_queue = {\n+    \"sub_casename\": \"mac_ipv6_tcp_queue\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 00112233445500000000000286DD6000000000140600CDCD910A222254988475111139001010CDCD910A2222549884751111390020200016001700000000000000005000000000000000 pattern mask 00000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 / end actions queue index 1 / mark id 10 / end\",\n+    ],\n+    \"packet\": MAC_IPv6_TCP,\n+    \"check_param\": {\"port_id\": 0, \"mark_id\": 10, \"queue\": 1},\n+}\n+\n+mac_ipv6_tcp_rss = {\n+    \"sub_casename\": \"mac_ipv6_tcp_rss\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 00112233445500000000000286DD6000000000140600CDCD910A222254988475111139001010CDCD910A2222549884751111390020200016001700000000000000005000000000000000 pattern mask 00000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 / end actions rss queues 0 1 2 3 end / mark id 4 / end\",\n+    ],\n+    \"packet\": MAC_IPv6_TCP,\n+    \"check_param\": {\"port_id\": 0, \"mark_id\": 4, \"queue\": [0, 1, 2, 3]},\n+}\n+\n+mac_ipv6_tcp_passthru = {\n+    \"sub_casename\": \"mac_ipv6_tcp_passthru\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 00112233445500000000000286DD6000000000140600CDCD910A222254988475111139001010CDCD910A2222549884751111390020200016001700000000000000005000000000000000 pattern mask 00000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 / end actions passthru / mark id 1 / end\",\n+    ],\n+    \"packet\": MAC_IPv6_TCP,\n+    \"check_param\": {\"port_id\": 0, \"mark_id\": 1, \"rss\": True},\n+}\n+\n+mac_ipv6_tcp_drop = {\n+    \"sub_casename\": \"mac_ipv6_tcp_drop\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 00112233445500000000000286DD6000000000140600CDCD910A222254988475111139001010CDCD910A2222549884751111390020200016001700000000000000005000000000000000 pattern mask 00000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 / end actions drop / end\",\n+    ],\n+    \"packet\": MAC_IPv6_TCP,\n+    \"check_param\": {\"port_id\": 0, \"drop\": True},\n+}\n+\n+# Test case 2: ICE_FDIR_MAC/IPv6/TCP\n+mac_ipv6_tcp = [\n+    mac_ipv6_tcp_queue,\n+    mac_ipv6_tcp_rss,\n+    mac_ipv6_tcp_passthru,\n+    mac_ipv6_tcp_drop,\n+]\n+\n+MAC_IPv4_UDP_VXLAN_MAC_IPv4_PAY = {\n+    \"match\": [\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP()/UDP()/VXLAN()/Ether()/IP(src=\"192.168.0.20\",dst=\"192.168.0.21\")/Raw(\"x\" * 80)',\n+    ],\n+    \"mismatch\": [\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP()/UDP()/VXLAN()/Ether()/IP(src=\"192.168.0.20\",dst=\"192.168.1.21\")/Raw(\"x\" * 80)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP()/UDP()/VXLAN()/Ether()/IP(src=\"192.168.1.20\",dst=\"192.168.0.21\")/Raw(\"x\" * 80)',\n+    ],\n+}\n+\n+mac_ipv4_udp_vxlan_mac_ipv4_pay_queue = {\n+    \"sub_casename\": \"mac_ipv4_udp_vxlan_mac_ipv4_pay_queue\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000460000000000110000C0A80014C0A80015000012B50032000008000000000000000000000000010000000000020800450000140000000000000000C0A80014C0A80015 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions queue index 1 / mark id 10 / end\",\n+    ],\n+    \"packet\": MAC_IPv4_UDP_VXLAN_MAC_IPv4_PAY,\n+    \"check_param\": {\"port_id\": 0, \"mark_id\": 10, \"queue\": 1},\n+}\n+\n+mac_ipv4_udp_vxlan_mac_ipv4_pay_rss = {\n+    \"sub_casename\": \"mac_ipv4_udp_vxlan_mac_ipv4_pay_rss\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000460000000000110000C0A80014C0A80015000012B50032000008000000000000000000000000010000000000020800450000140000000000000000C0A80014C0A80015 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions rss queues 0 1 2 3 end / mark id 4 / end\",\n+    ],\n+    \"packet\": MAC_IPv4_UDP_VXLAN_MAC_IPv4_PAY,\n+    \"check_param\": {\"port_id\": 0, \"mark_id\": 4, \"queue\": [0, 1, 2, 3]},\n+}\n+\n+mac_ipv4_udp_vxlan_mac_ipv4_pay_passthru = {\n+    \"sub_casename\": \"mac_ipv4_udp_vxlan_mac_ipv4_pay_passthru\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000460000000000110000C0A80014C0A80015000012B50032000008000000000000000000000000010000000000020800450000140000000000000000C0A80014C0A80015 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions passthru / mark id 1 / end\",\n+    ],\n+    \"packet\": MAC_IPv4_UDP_VXLAN_MAC_IPv4_PAY,\n+    \"check_param\": {\"port_id\": 0, \"mark_id\": 1, \"rss\": True},\n+}\n+\n+mac_ipv4_udp_vxlan_mac_ipv4_pay_drop = {\n+    \"sub_casename\": \"mac_ipv4_udp_vxlan_mac_ipv4_pay_drop\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000460000000000110000C0A80014C0A80015000012B50032000008000000000000000000000000010000000000020800450000140000000000000000C0A80014C0A80015 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions drop / end\",\n+    ],\n+    \"packet\": MAC_IPv4_UDP_VXLAN_MAC_IPv4_PAY,\n+    \"check_param\": {\"port_id\": 0, \"drop\": True},\n+}\n+\n+# Test case 3: ICE_FDIR_MAC/IPv4/UDP/VXLAN/MAC/IPv4/PAY\n+mac_ipv4_udp_vxlan_mac_ipv4_pay = [\n+    mac_ipv4_udp_vxlan_mac_ipv4_pay_queue,\n+    mac_ipv4_udp_vxlan_mac_ipv4_pay_rss,\n+    mac_ipv4_udp_vxlan_mac_ipv4_pay_passthru,\n+    mac_ipv4_udp_vxlan_mac_ipv4_pay_drop,\n+]\n+\n+MAC_IPv4_UDP_VXLAN_MAC_IPv4_UDP = {\n+    \"match\": [\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP()/UDP()/VXLAN()/Ether()/IP(src=\"192.168.0.20\",dst=\"192.168.0.21\")/UDP()/(\"X\"*480)',\n+    ],\n+    \"mismatch\": [\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP()/UDP()/VXLAN()/Ether()/IP(src=\"192.168.10.20\",dst=\"192.168.0.21\")/UDP()/(\"X\"*480)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP()/UDP()/VXLAN()/Ether()/IP(src=\"192.168.0.20\",dst=\"192.168.10.21\")/UDP()/(\"X\"*480)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP()/UDP()/VXLAN()/Ether()/IP(src=\"192.168.0.20\",dst=\"192.168.0.21\")/TCP()/(\"X\"*480)',\n+    ],\n+}\n+\n+mac_ipv4_udp_vxlan_mac_ipv4_udp_queue = {\n+    \"sub_casename\": \"mac_ipv4_udp_vxlan_mac_ipv4_udp_queue\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 00112233445500000000000208004500004E00000000001100000101010102020202000012B5003A0000080000000000000000000000000100000000000208004500001C0000000000110000C0A80014C0A800150000000000080000 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF0000000000000000 / end actions queue index 1 / mark id 10 / end\",\n+    ],\n+    \"packet\": MAC_IPv4_UDP_VXLAN_MAC_IPv4_UDP,\n+    \"check_param\": {\"port_id\": 0, \"mark_id\": 10, \"queue\": 1},\n+}\n+\n+mac_ipv4_udp_vxlan_mac_ipv4_udp_rss = {\n+    \"sub_casename\": \"mac_ipv4_udp_vxlan_mac_ipv4_udp_rss\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 00112233445500000000000208004500004E00000000001100000101010102020202000012B5003A0000080000000000000000000000000100000000000208004500001C0000000000110000C0A80014C0A800150000000000080000 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF0000000000000000 / end actions rss queues 0 1 2 3 end / mark id 4 / end\",\n+    ],\n+    \"packet\": MAC_IPv4_UDP_VXLAN_MAC_IPv4_UDP,\n+    \"check_param\": {\"port_id\": 0, \"mark_id\": 4, \"queue\": [0, 1, 2, 3]},\n+}\n+\n+mac_ipv4_udp_vxlan_mac_ipv4_udp_passthru = {\n+    \"sub_casename\": \"mac_ipv4_udp_vxlan_mac_ipv4_udp_passthru\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 00112233445500000000000208004500004E00000000001100000101010102020202000012B5003A0000080000000000000000000000000100000000000208004500001C0000000000110000C0A80014C0A800150000000000080000 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF0000000000000000 / end actions passthru / mark id 1 / end\",\n+    ],\n+    \"packet\": MAC_IPv4_UDP_VXLAN_MAC_IPv4_UDP,\n+    \"check_param\": {\"port_id\": 0, \"mark_id\": 1, \"rss\": True},\n+}\n+\n+mac_ipv4_udp_vxlan_mac_ipv4_udp_drop = {\n+    \"sub_casename\": \"mac_ipv4_udp_vxlan_mac_ipv4_udp_drop\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 00112233445500000000000208004500004E00000000001100000101010102020202000012B5003A0000080000000000000000000000000100000000000208004500001C0000000000110000C0A80014C0A800150000000000080000 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF0000000000000000 / end actions drop / end\",\n+    ],\n+    \"packet\": MAC_IPv4_UDP_VXLAN_MAC_IPv4_UDP,\n+    \"check_param\": {\"port_id\": 0, \"drop\": True},\n+}\n+\n+# Test case 4: ICE_FDIR_MAC/IPv4/UDP/VXLAN/MAC/IPv4/UDP\n+mac_ipv4_udp_vxlan_mac_ipv4_udp = [\n+    mac_ipv4_udp_vxlan_mac_ipv4_udp_queue,\n+    mac_ipv4_udp_vxlan_mac_ipv4_udp_rss,\n+    mac_ipv4_udp_vxlan_mac_ipv4_udp_passthru,\n+    mac_ipv4_udp_vxlan_mac_ipv4_udp_drop,\n+]\n+\n+MAC_IPv4_UDP_VXLAN_MAC_IPv4_vni = {\n+    \"match\": [\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP()/UDP()/VXLAN(vni=3)/Ether()/IP(src=\"192.168.0.20\",dst=\"192.168.0.21\")/(\"X\"*480)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP()/UDP()/VXLAN(vni=3)/Ether()/IP(src=\"192.168.10.20\",dst=\"192.168.0.21\")/(\"X\"*480)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP()/UDP()/VXLAN(vni=3)/Ether()/IP(src=\"192.168.0.20\",dst=\"192.168.10.21\")/(\"X\"*480)',\n+    ],\n+    \"mismatch\": [\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP()/UDP()/VXLAN(vni=13)/Ether()/IP(src=\"192.168.0.20\",dst=\"192.168.0.21\")/(\"X\"*480)',\n+    ],\n+}\n+\n+mac_ipv4_udp_vxlan_mac_ipv4_vni_queue = {\n+    \"sub_casename\": \"mac_ipv4_udp_vxlan_mac_ipv4_vni_queue\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 00112233445500000000000208004500004600000000001100000101010102020202000012B50032000008000000000003000000000000010000000000020800450000140000000000000000C0A80014C0A80015 pattern mask 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F0000000000000000000000000000000000000000000000000000000000000000000000 / end actions queue index 1 / mark id 10 / end\",\n+    ],\n+    \"packet\": MAC_IPv4_UDP_VXLAN_MAC_IPv4_vni,\n+    \"check_param\": {\"port_id\": 0, \"mark_id\": 10, \"queue\": 1},\n+}\n+\n+mac_ipv4_udp_vxlan_mac_ipv4_vni_rss = {\n+    \"sub_casename\": \"mac_ipv4_udp_vxlan_mac_ipv4_vni_rss\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 00112233445500000000000208004500004600000000001100000101010102020202000012B50032000008000000000003000000000000010000000000020800450000140000000000000000C0A80014C0A80015 pattern mask 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F0000000000000000000000000000000000000000000000000000000000000000000000 / end actions rss queues 0 1 2 3 end / mark id 4 / end\",\n+    ],\n+    \"packet\": MAC_IPv4_UDP_VXLAN_MAC_IPv4_vni,\n+    \"check_param\": {\"port_id\": 0, \"mark_id\": 4, \"queue\": [0, 1, 2, 3]},\n+}\n+\n+mac_ipv4_udp_vxlan_mac_ipv4_vni_passthru = {\n+    \"sub_casename\": \"mac_ipv4_udp_vxlan_mac_ipv4_vni_passthru\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 00112233445500000000000208004500004600000000001100000101010102020202000012B50032000008000000000003000000000000010000000000020800450000140000000000000000C0A80014C0A80015 pattern mask 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F0000000000000000000000000000000000000000000000000000000000000000000000 / end actions passthru / mark id 1 / end\",\n+    ],\n+    \"packet\": MAC_IPv4_UDP_VXLAN_MAC_IPv4_vni,\n+    \"check_param\": {\"port_id\": 0, \"mark_id\": 1, \"rss\": True},\n+}\n+\n+mac_ipv4_udp_vxlan_mac_ipv4_vni_drop = {\n+    \"sub_casename\": \"mac_ipv4_udp_vxlan_mac_ipv4_vni_drop\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 00112233445500000000000208004500004600000000001100000101010102020202000012B50032000008000000000003000000000000010000000000020800450000140000000000000000C0A80014C0A80015 pattern mask 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F0000000000000000000000000000000000000000000000000000000000000000000000 / end actions drop / end\",\n+    ],\n+    \"packet\": MAC_IPv4_UDP_VXLAN_MAC_IPv4_vni,\n+    \"check_param\": {\"port_id\": 0, \"drop\": True},\n+}\n+\n+# Test case 6: ICE_FDIR_MAC/IPv4/UDP/VXLAN/MAC/IPv4_vni\n+mac_ipv4_udp_vxlan_mac_ipv4_vni = [\n+    mac_ipv4_udp_vxlan_mac_ipv4_vni_queue,\n+    mac_ipv4_udp_vxlan_mac_ipv4_vni_rss,\n+    mac_ipv4_udp_vxlan_mac_ipv4_vni_passthru,\n+    mac_ipv4_udp_vxlan_mac_ipv4_vni_drop,\n+]\n+\n+MAC_IPv4_UDP_GTPU_IPv4 = {\n+    \"match\": [\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.20\", dst=\"192.168.0.21\")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(src=\"192.168.10.20\", dst=\"192.168.10.21\")/Raw(\"x\"*20)',\n+    ],\n+    \"mismatch\": [\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.30\", dst=\"192.168.0.21\")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(src=\"192.168.10.20\", dst=\"192.168.10.21\")/Raw(\"x\"*20)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.20\", dst=\"192.168.0.31\")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(src=\"192.168.10.20\", dst=\"192.168.10.21\")/Raw(\"x\"*20)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.20\", dst=\"192.168.0.21\")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(src=\"192.168.10.30\", dst=\"192.168.10.21\")/Raw(\"x\"*20)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.20\", dst=\"192.168.0.21\")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(src=\"192.168.10.20\", dst=\"192.168.10.31\")/Raw(\"x\"*20)',\n+    ],\n+}\n+\n+mac_ipv4_udp_gtpu_ipv4_queue = {\n+    \"sub_casename\": \"mac_ipv4_udp_gtpu_ipv4_queue\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000380000000000110000C0A80014C0A80015000008680024000030FF001400000000450000140000000000000000C0A80A14C0A80A15 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions queue index 1 / mark id 10 / end\",\n+    ],\n+    \"packet\": MAC_IPv4_UDP_GTPU_IPv4,\n+    \"check_param\": {\"port_id\": 0, \"mark_id\": 10, \"queue\": 1},\n+}\n+\n+mac_ipv4_udp_gtpu_ipv4_rss = {\n+    \"sub_casename\": \"mac_ipv4_udp_gtpu_ipv4_rss\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000380000000000110000C0A80014C0A80015000008680024000030FF001400000000450000140000000000000000C0A80A14C0A80A15 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions rss queues 0 1 2 3 end / mark id 4 / end\",\n+    ],\n+    \"packet\": MAC_IPv4_UDP_GTPU_IPv4,\n+    \"check_param\": {\"port_id\": 0, \"mark_id\": 4, \"queue\": [0, 1, 2, 3]},\n+}\n+\n+mac_ipv4_udp_gtpu_ipv4_passthru = {\n+    \"sub_casename\": \"mac_ipv4_udp_gtpu_ipv4_passthru\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000380000000000110000C0A80014C0A80015000008680024000030FF001400000000450000140000000000000000C0A80A14C0A80A15 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions passthru / mark id 1 / end\",\n+    ],\n+    \"packet\": MAC_IPv4_UDP_GTPU_IPv4,\n+    \"check_param\": {\"port_id\": 0, \"mark_id\": 1, \"rss\": True},\n+}\n+\n+mac_ipv4_udp_gtpu_ipv4_drop = {\n+    \"sub_casename\": \"mac_ipv4_udp_gtpu_ipv4_drop\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000380000000000110000C0A80014C0A80015000008680024000030FF001400000000450000140000000000000000C0A80A14C0A80A15 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions drop / end\",\n+    ],\n+    \"packet\": MAC_IPv4_UDP_GTPU_IPv4,\n+    \"check_param\": {\"port_id\": 0, \"drop\": True},\n+}\n+\n+# Test case 7: ICE_FDIR_MAC/IPv4/UDP/GTPU/IPv4\n+mac_ipv4_udp_gtpu_ipv4 = [\n+    mac_ipv4_udp_gtpu_ipv4_queue,\n+    mac_ipv4_udp_gtpu_ipv4_rss,\n+    mac_ipv4_udp_gtpu_ipv4_passthru,\n+    mac_ipv4_udp_gtpu_ipv4_drop,\n+]\n+\n+MAC_IPv4_UDP_GTPU_IPv6_UDP = {\n+    \"match\": [\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.20\", dst=\"192.168.0.21\")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1010\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2021\")/UDP()/Raw(\"x\"*20)',\n+    ],\n+    \"mismatch\": [\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.10.20\", dst=\"192.168.0.21\")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1010\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2021\")/UDP()/Raw(\"x\"*20)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.20\", dst=\"192.168.10.21\")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1010\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2021\")/UDP()/Raw(\"x\"*20)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.20\", dst=\"192.168.0.21\")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1011\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2021\")/UDP()/Raw(\"x\"*20)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.20\", dst=\"192.168.0.21\")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1010\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP()/Raw(\"x\"*20)',\n+    ],\n+}\n+\n+mac_ipv4_udp_gtpu_ipv6_udp_queue = {\n+    \"sub_casename\": \"mac_ipv4_udp_gtpu_ipv6_udp_queue\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000540000000000110000C0A80014C0A80015000008680040000030FF0030000000006000000000081100CDCD910A222254988475111139001010CDCD910A2222549884751111390020210000000000080000 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 / end actions queue index 1 / mark id 10 / end\",\n+    ],\n+    \"packet\": MAC_IPv4_UDP_GTPU_IPv6_UDP,\n+    \"check_param\": {\"port_id\": 0, \"mark_id\": 10, \"queue\": 1},\n+}\n+\n+mac_ipv4_udp_gtpu_ipv6_udp_rss = {\n+    \"sub_casename\": \"mac_ipv4_udp_gtpu_ipv6_udp_rss\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000540000000000110000C0A80014C0A80015000008680040000030FF0030000000006000000000081100CDCD910A222254988475111139001010CDCD910A2222549884751111390020210000000000080000 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 / end actions rss queues 0 1 2 3 end / mark id 4 / end\",\n+    ],\n+    \"packet\": MAC_IPv4_UDP_GTPU_IPv6_UDP,\n+    \"check_param\": {\"port_id\": 0, \"mark_id\": 4, \"queue\": [0, 1, 2, 3]},\n+}\n+\n+mac_ipv4_udp_gtpu_ipv6_udp_passthru = {\n+    \"sub_casename\": \"mac_ipv4_udp_gtpu_ipv6_udp_passthru\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000540000000000110000C0A80014C0A80015000008680040000030FF0030000000006000000000081100CDCD910A222254988475111139001010CDCD910A2222549884751111390020210000000000080000 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 / end actions passthru / mark id 1 / end\",\n+    ],\n+    \"packet\": MAC_IPv4_UDP_GTPU_IPv6_UDP,\n+    \"check_param\": {\"port_id\": 0, \"mark_id\": 1, \"rss\": True},\n+}\n+\n+mac_ipv4_udp_gtpu_ipv6_udp_drop = {\n+    \"sub_casename\": \"mac_ipv4_udp_gtpu_ipv6_udp_drop\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000540000000000110000C0A80014C0A80015000008680040000030FF0030000000006000000000081100CDCD910A222254988475111139001010CDCD910A2222549884751111390020210000000000080000 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 / end actions drop / end\",\n+    ],\n+    \"packet\": MAC_IPv4_UDP_GTPU_IPv6_UDP,\n+    \"check_param\": {\"port_id\": 0, \"drop\": True},\n+}\n+\n+# Test case 8: ICE_FDIR_MAC/IPv4/UDP/GTPU/IPv6/UDP\n+mac_ipv4_udp_gtpu_ipv6_udp = [\n+    mac_ipv4_udp_gtpu_ipv6_udp_queue,\n+    mac_ipv4_udp_gtpu_ipv6_udp_rss,\n+    mac_ipv4_udp_gtpu_ipv6_udp_passthru,\n+    mac_ipv4_udp_gtpu_ipv6_udp_drop,\n+]\n+\n+MAC_IPv6_UDP_GTPU_DL_IPv4 = {\n+    \"match\": [\n+        'Ether(dst=\"00:11:22:33:44:55\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1010\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2021\")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src=\"192.168.0.20\", dst=\"192.168.0.21\")/Raw(\"x\"*20)',\n+    ],\n+    \"mismatch\": [\n+        'Ether(dst=\"00:11:22:33:44:55\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1011\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2021\")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src=\"192.168.0.20\", dst=\"192.168.0.21\")/Raw(\"x\"*20)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1010\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src=\"192.168.0.20\", dst=\"192.168.0.21\")/Raw(\"x\"*20)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1010\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2021\")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src=\"192.168.10.20\", dst=\"192.168.0.21\")/Raw(\"x\"*20)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1010\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2021\")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src=\"192.168.0.20\", dst=\"192.168.10.21\")/Raw(\"x\"*20)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1010\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2021\")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IP(src=\"192.168.0.20\", dst=\"192.168.0.21\")/Raw(\"x\"*20)',\n+    ],\n+}\n+\n+mac_ipv6_udp_gtpu_dl_ipv4_queue = {\n+    \"sub_casename\": \"mac_ipv6_udp_gtpu_dl_ipv4_queue\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 00112233445500000000000286DD6000000000281100CDCD910A222254988475111139001010CDCD910A222254988475111139002021000008680028000034FF001C000000000000008501000000450000140000000000000000C0A80014C0A80015 pattern mask 00000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions queue index 1 / mark id 10 / end\",\n+    ],\n+    \"packet\": MAC_IPv6_UDP_GTPU_DL_IPv4,\n+    \"check_param\": {\"port_id\": 0, \"mark_id\": 10, \"queue\": 1},\n+}\n+\n+mac_ipv6_udp_gtpu_dl_ipv4_rss = {\n+    \"sub_casename\": \"mac_ipv6_udp_gtpu_dl_ipv4_rss\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 00112233445500000000000286DD6000000000281100CDCD910A222254988475111139001010CDCD910A222254988475111139002021000008680028000034FF001C000000000000008501000000450000140000000000000000C0A80014C0A80015 pattern mask 00000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions rss queues 0 1 2 3 end / mark id 4 / end\",\n+    ],\n+    \"packet\": MAC_IPv6_UDP_GTPU_DL_IPv4,\n+    \"check_param\": {\"port_id\": 0, \"mark_id\": 4, \"queue\": [0, 1, 2, 3]},\n+}\n+\n+mac_ipv6_udp_gtpu_dl_ipv4_passthru = {\n+    \"sub_casename\": \"mac_ipv6_udp_gtpu_dl_ipv4_passthru\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 00112233445500000000000286DD6000000000281100CDCD910A222254988475111139001010CDCD910A222254988475111139002021000008680028000034FF001C000000000000008501000000450000140000000000000000C0A80014C0A80015 pattern mask 00000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions passthru / mark id 1 / end\",\n+    ],\n+    \"packet\": MAC_IPv6_UDP_GTPU_DL_IPv4,\n+    \"check_param\": {\"port_id\": 0, \"mark_id\": 1, \"rss\": True},\n+}\n+\n+mac_ipv6_udp_gtpu_dl_ipv4_drop = {\n+    \"sub_casename\": \"mac_ipv6_udp_gtpu_dl_ipv4_drop\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 00112233445500000000000286DD6000000000281100CDCD910A222254988475111139001010CDCD910A222254988475111139002021000008680028000034FF001C000000000000008501000000450000140000000000000000C0A80014C0A80015 pattern mask 00000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions drop / end\",\n+    ],\n+    \"packet\": MAC_IPv6_UDP_GTPU_DL_IPv4,\n+    \"check_param\": {\"port_id\": 0, \"drop\": True},\n+}\n+\n+# Test case 9: ICE_FDIR_MAC/IPv6/UDP/GTPU/DL/IPv4\n+mac_ipv6_udp_gtpu_dl_ipv4 = [\n+    mac_ipv6_udp_gtpu_dl_ipv4_queue,\n+    mac_ipv6_udp_gtpu_dl_ipv4_rss,\n+    mac_ipv6_udp_gtpu_dl_ipv4_passthru,\n+    mac_ipv6_udp_gtpu_dl_ipv4_drop,\n+]\n+\n+MAC_IPv4_GTPU_UL_IPv4 = {\n+    \"match\": [\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.20\", dst=\"192.168.0.21\")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IP(src=\"192.168.1.20\", dst=\"192.168.1.21\")/Raw(\"x\"*20)',\n+    ],\n+    \"mismatch\": [\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.20\", dst=\"192.168.0.21\")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src=\"192.168.1.20\", dst=\"192.168.1.21\")/Raw(\"x\"*20)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.10.20\", dst=\"192.168.0.21\")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IP(src=\"192.168.1.20\", dst=\"192.168.1.21\")/Raw(\"x\"*20)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.20\", dst=\"192.168.10.21\")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IP(src=\"192.168.1.20\", dst=\"192.168.1.21\")/Raw(\"x\"*20)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.20\", dst=\"192.168.0.21\")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IP(src=\"192.168.11.20\", dst=\"192.168.1.21\")/Raw(\"x\"*20)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.20\", dst=\"192.168.0.21\")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IP(src=\"192.168.1.20\", dst=\"192.168.11.21\")/Raw(\"x\"*20)',\n+    ],\n+}\n+\n+mac_ipv4_gtpu_ul_ipv4_queue = {\n+    \"sub_casename\": \"mac_ipv4_gtpu_ul_ipv4_queue\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 00112233445500000000000208004500003C0000000000110000C0A80014C0A80015000008680028000034FF001C000000000000008501100000450000140000000000000000C0A80114C0A80115 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000F00000000000000000000000000000FFFFFFFFFFFFFFFF / end actions queue index 1 / mark id 10 / end\",\n+    ],\n+    \"packet\": MAC_IPv4_GTPU_UL_IPv4,\n+    \"check_param\": {\"port_id\": 0, \"mark_id\": 10, \"queue\": 1},\n+}\n+\n+mac_ipv4_gtpu_ul_ipv4_rss = {\n+    \"sub_casename\": \"mac_ipv4_gtpu_ul_ipv4_rss\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 00112233445500000000000208004500003C0000000000110000C0A80014C0A80015000008680028000034FF001C000000000000008501100000450000140000000000000000C0A80114C0A80115 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000F00000000000000000000000000000FFFFFFFFFFFFFFFF / end actions rss queues 0 1 2 3 end / mark id 4 / end\",\n+    ],\n+    \"packet\": MAC_IPv4_GTPU_UL_IPv4,\n+    \"check_param\": {\"port_id\": 0, \"mark_id\": 4, \"queue\": [0, 1, 2, 3]},\n+}\n+\n+mac_ipv4_gtpu_ul_ipv4_passthru = {\n+    \"sub_casename\": \"mac_ipv4_gtpu_ul_ipv4_passthru\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 00112233445500000000000208004500003C0000000000110000C0A80014C0A80015000008680028000034FF001C000000000000008501100000450000140000000000000000C0A80114C0A80115 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000F00000000000000000000000000000FFFFFFFFFFFFFFFF / end actions passthru / mark id 1 / end\",\n+    ],\n+    \"packet\": MAC_IPv4_GTPU_UL_IPv4,\n+    \"check_param\": {\"port_id\": 0, \"mark_id\": 1, \"rss\": True},\n+}\n+\n+mac_ipv4_gtpu_ul_ipv4_drop = {\n+    \"sub_casename\": \"mac_ipv4_gtpu_ul_ipv4_drop\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 00112233445500000000000208004500003C0000000000110000C0A80014C0A80015000008680028000034FF001C000000000000008501100000450000140000000000000000C0A80114C0A80115 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000F00000000000000000000000000000FFFFFFFFFFFFFFFF / end actions drop / end\",\n+    ],\n+    \"packet\": MAC_IPv4_GTPU_UL_IPv4,\n+    \"check_param\": {\"port_id\": 0, \"drop\": True},\n+}\n+\n+# Test case 10: ICE_FDIR_MAC/IPv4/UDP/GTPU/UL/IPv4\n+mac_ipv4_gtpu_ul_ipv4 = [\n+    mac_ipv4_gtpu_ul_ipv4_queue,\n+    mac_ipv4_gtpu_ul_ipv4_rss,\n+    mac_ipv4_gtpu_ul_ipv4_passthru,\n+    mac_ipv4_gtpu_ul_ipv4_drop,\n+]\n+\n+MAC_IPv4_UDP_GTPU_DL_IPv6 = {\n+    \"match\": [\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.20\", dst=\"192.168.0.21\")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:4000:1010\", dst=\"CDCD:910A:2222:5498:8475:1111:4000:2021\")/Raw(\"x\"*20)'\n+    ],\n+    \"mismatch\": [\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.20\", dst=\"192.168.0.21\")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:4000:1010\", dst=\"CDCD:910A:2222:5498:8475:1111:4000:2021\")/Raw(\"x\"*20)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.10.20\", dst=\"192.168.0.21\")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:4000:1010\", dst=\"CDCD:910A:2222:5498:8475:1111:4000:2021\")/Raw(\"x\"*20)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.20\", dst=\"192.168.10.21\")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:4000:1010\", dst=\"CDCD:910A:2222:5498:8475:1111:4000:2021\")/Raw(\"x\"*20)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.20\", dst=\"192.168.0.21\")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:4000:1011\", dst=\"CDCD:910A:2222:5498:8475:1111:4000:2021\")/Raw(\"x\"*20)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.20\", dst=\"192.168.0.21\")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:4000:1010\", dst=\"CDCD:910A:2222:5498:8475:1111:4000:2022\")/Raw(\"x\"*20)',\n+    ],\n+}\n+\n+mac_ipv4_udp_gtpu_dl_ipv6_queue = {\n+    \"sub_casename\": \"mac_ipv4_udp_gtpu_dl_ipv6_queue\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000500000000000110000C0A80014C0A8001500000868003C000034FF00300000000000000085010000006000000000000000CDCD910A222254988475111140001010CDCD910A222254988475111140002021 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000F000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF / end actions queue index 1 / mark id 10 / end\",\n+    ],\n+    \"packet\": MAC_IPv4_UDP_GTPU_DL_IPv6,\n+    \"check_param\": {\"port_id\": 0, \"mark_id\": 10, \"queue\": 1},\n+}\n+\n+mac_ipv4_udp_gtpu_dl_ipv6_rss = {\n+    \"sub_casename\": \"mac_ipv4_udp_gtpu_dl_ipv6_rss\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000500000000000110000C0A80014C0A8001500000868003C000034FF00300000000000000085010000006000000000000000CDCD910A222254988475111140001010CDCD910A222254988475111140002021 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000F000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF / end actions rss queues 0 1 2 3 end / mark id 4 / end\",\n+    ],\n+    \"packet\": MAC_IPv4_UDP_GTPU_DL_IPv6,\n+    \"check_param\": {\"port_id\": 0, \"mark_id\": 4, \"queue\": [0, 1, 2, 3]},\n+}\n+\n+mac_ipv4_udp_gtpu_dl_ipv6_passthru = {\n+    \"sub_casename\": \"mac_ipv4_udp_gtpu_dl_ipv6_passthru\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000500000000000110000C0A80014C0A8001500000868003C000034FF00300000000000000085010000006000000000000000CDCD910A222254988475111140001010CDCD910A222254988475111140002021 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000F000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF / end actions passthru / mark id 1 / end\",\n+    ],\n+    \"packet\": MAC_IPv4_UDP_GTPU_DL_IPv6,\n+    \"check_param\": {\"port_id\": 0, \"mark_id\": 1, \"rss\": True},\n+}\n+\n+mac_ipv4_udp_gtpu_dl_ipv6_drop = {\n+    \"sub_casename\": \"mac_ipv4_udp_gtpu_dl_ipv6_drop\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000500000000000110000C0A80014C0A8001500000868003C000034FF00300000000000000085010000006000000000000000CDCD910A222254988475111140001010CDCD910A222254988475111140002021 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000F000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF / end actions drop / end\",\n+    ],\n+    \"packet\": MAC_IPv4_UDP_GTPU_DL_IPv6,\n+    \"check_param\": {\"port_id\": 0, \"drop\": True},\n+}\n+\n+# Test case 11: ICE_FDIR_MAC/IPv4/UDP/GTPU/DL/IPv6\n+mac_ipv4_udp_gtpu_dl_ipv6 = [\n+    mac_ipv4_udp_gtpu_dl_ipv6_queue,\n+    mac_ipv4_udp_gtpu_dl_ipv6_rss,\n+    mac_ipv4_udp_gtpu_dl_ipv6_passthru,\n+    mac_ipv4_udp_gtpu_dl_ipv6_drop,\n+]\n+\n+MAC_IPv4_UDP_GTPU_UL_IPv4_TCP = {\n+    \"match\": [\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.20\", dst=\"192.168.0.21\")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IP(src=\"192.168.1.20\", dst=\"192.168.1.21\")/TCP()/Raw(\"x\"*20)',\n+    ],\n+    \"mismatch\": [\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.16.0.20\", dst=\"192.168.0.21\")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IP(src=\"192.168.1.20\", dst=\"192.168.1.21\")/TCP()/Raw(\"x\"*20)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.20\", dst=\"192.168.0.21\")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IP(src=\"192.168.1.20\", dst=\"192.168.10.21\")/TCP()/Raw(\"x\"*20)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.20\", dst=\"192.168.0.21\")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src=\"192.168.1.20\", dst=\"192.168.1.21\")/TCP()/Raw(\"x\"*20)',\n+    ],\n+}\n+\n+mac_ipv4_udp_gtpu_ul_ipv4_tcp_queue = {\n+    \"sub_casename\": \"mac_ipv4_udp_gtpu_ul_ipv4_tcp_queue\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000500000000000110000C0A80014C0A8001500000868003C000034FF0030000000000000008501100000450000280000000000060000C0A80114C0A801150000000000000000000000005000000000000000 pattern mask 000000000000000000000000000000000000000000000000000000FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FF000000000000000000000000000000000000000000 / end actions queue index 1 / mark id 10 / end\",\n+    ],\n+    \"packet\": MAC_IPv4_UDP_GTPU_UL_IPv4_TCP,\n+    \"check_param\": {\"port_id\": 0, \"mark_id\": 10, \"queue\": 1},\n+}\n+\n+mac_ipv4_udp_gtpu_ul_ipv4_tcp_rss = {\n+    \"sub_casename\": \"mac_ipv4_udp_gtpu_ul_ipv4_tcp_rss\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000500000000000110000C0A80014C0A8001500000868003C000034FF0030000000000000008501100000450000280000000000060000C0A80114C0A801150000000000000000000000005000000000000000 pattern mask 000000000000000000000000000000000000000000000000000000FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FF000000000000000000000000000000000000000000 / end actions rss queues 0 1 2 3 end / mark id 4 / end\",\n+    ],\n+    \"packet\": MAC_IPv4_UDP_GTPU_UL_IPv4_TCP,\n+    \"check_param\": {\"port_id\": 0, \"mark_id\": 4, \"queue\": [0, 1, 2, 3]},\n+}\n+\n+mac_ipv4_udp_gtpu_ul_ipv4_tcp_passthru = {\n+    \"sub_casename\": \"mac_ipv4_udp_gtpu_ul_ipv4_tcp_passthru\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000500000000000110000C0A80014C0A8001500000868003C000034FF0030000000000000008501100000450000280000000000060000C0A80114C0A801150000000000000000000000005000000000000000 pattern mask 000000000000000000000000000000000000000000000000000000FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FF000000000000000000000000000000000000000000 / end actions passthru / mark id 1 / end\",\n+    ],\n+    \"packet\": MAC_IPv4_UDP_GTPU_UL_IPv4_TCP,\n+    \"check_param\": {\"port_id\": 0, \"mark_id\": 1, \"rss\": True},\n+}\n+\n+mac_ipv4_udp_gtpu_ul_ipv4_tcp_drop = {\n+    \"sub_casename\": \"mac_ipv4_udp_gtpu_ul_ipv4_tcp_drop\",\n+    \"rule\": [\n+        \"flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000500000000000110000C0A80014C0A8001500000868003C000034FF0030000000000000008501100000450000280000000000060000C0A80114C0A801150000000000000000000000005000000000000000 pattern mask 000000000000000000000000000000000000000000000000000000FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FF000000000000000000000000000000000000000000 / end actions drop / end\",\n+    ],\n+    \"packet\": MAC_IPv4_UDP_GTPU_UL_IPv4_TCP,\n+    \"check_param\": {\"port_id\": 0, \"drop\": True},\n+}\n+\n+# Test case 12: ICE_FDIR_MAC/IPv4/UDP/GTPU/UL/IPv4/TCP_un-word-aligned key\n+mac_ipv4_udp_gtpu_ul_ipv4_tcp = [\n+    mac_ipv4_udp_gtpu_ul_ipv4_tcp_queue,\n+    mac_ipv4_udp_gtpu_ul_ipv4_tcp_rss,\n+    mac_ipv4_udp_gtpu_ul_ipv4_tcp_passthru,\n+    mac_ipv4_udp_gtpu_ul_ipv4_tcp_drop,\n+]\n+\n+\n+class TestIceFdirProtocolAgnosticFlow(TestCase):\n+    \"\"\"\n+    E810 enable Protocol agnostic flow offloading\n+    \"\"\"\n+\n+    def set_up_all(self):\n+        \"\"\"\n+        Run at the start of each test suite.\n+        \"\"\"\n+        self.skip_case(\"ICE\" in self.nic, \"%s nic not support this suite\" % self.nic)\n+        self.dports = self.dut.get_ports(self.nic)\n+        # Verify that enough ports are available\n+        self.verify(len(self.dports) >= 1, \"Insufficient ports\")\n+        self.pmd_output = PmdOutput(self.dut)\n+        self.tester_ifaces = [\n+            self.tester.get_interface(self.dut.ports_map[port]) for port in self.dports\n+        ]\n+        self.rxq = 16\n+        self.pkt = Packet()\n+        self.fdirpro = FdirProcessing(\n+            self, self.pmd_output, self.tester_ifaces, self.rxq\n+        )\n+        self.logfmt = \"*\" * 20\n+\n+    @skip_unsupported_pkg(\"os default\")\n+    def set_up(self):\n+        \"\"\"\n+        Run before each test case.\n+        \"\"\"\n+        self.launch_testpmd()\n+\n+    def launch_testpmd(self):\n+        \"\"\"\n+        launch testpmd with the command\n+        \"\"\"\n+        params = \"--rxq={0} --txq={0}\".format(self.rxq)\n+        eal_params = '--log-level=\"pmd,7\"'\n+        self.pmd_output.start_testpmd(\n+            param=params, eal_param=eal_params, ports=[self.dports[0]]\n+        )\n+        self.pmd_output.execute_cmd(\"set fwd rxonly\")\n+        self.pmd_output.execute_cmd(\"set verbose 1\")\n+        self.pmd_output.execute_cmd(\"rx_vxlan_port add 4789 0\")\n+        self.pmd_output.execute_cmd(\"start\")\n+        self.pmd_output.wait_link_status_up(0)\n+\n+    def get_pkt_statistic(self, out, **kwargs):\n+        \"\"\"\n+        :param out: information received by testpmd after sending packets and port statistics\n+        :return: rx statistic dict, eg: {'rx-packets':1, 'rx-dropped':0, 'rx-total':1}\n+        \"\"\"\n+        p = re.compile(\n+            r\"Forward\\sstatistics\\s+for\\s+port\\s+{}\\s+.*\\n.*RX-packets:\\s(\\d+)\\s+RX-dropped:\\s(\\d+)\\s+RX-total:\\s(\\d+)\\s\".format(\n+                kwargs.get(\"port_id\")\n+            )\n+        )\n+        item_name = [\"rx-packets\", \"rx-dropped\", \"rx-total\"]\n+        statistic = p.findall(out)\n+        if statistic:\n+            static_dict = {\n+                k: v for k, v in zip(item_name, list(map(int, list(statistic[0]))))\n+            }\n+            return static_dict\n+        else:\n+            raise Exception(\n+                \"got wrong output, not match pattern {}\".format(p.pattern).replace(\n+                    \"\\\\\\\\\", \"\\\\\"\n+                )\n+            )\n+\n+    def check_pkt_num(self, out, **kwargs):\n+        \"\"\"\n+        check number of received packets matches the expected value\n+        :param out: information received by testpmd after sending packets and port statistics\n+        :param kwargs: some specified parameters, such as: pkt_num, port_id\n+        :return: rx statistic dict\n+        \"\"\"\n+        self.logger.info(\n+            \"{0} check pkt num for port:{1} {0}\".format(\n+                self.logfmt, kwargs.get(\"port_id\")\n+            )\n+        )\n+        pkt_num = kwargs.get(\"pkt_num\")\n+        res = self.get_pkt_statistic(out, **kwargs)\n+        res_num = res[\"rx-total\"]\n+        self.verify(\n+            res_num == pkt_num,\n+            \"fail: got wrong number of packets, expect pakcet number {}, got {}\".format(\n+                pkt_num, res_num\n+            ),\n+        )\n+        self.logger.info(\n+            (GREEN(\"pass: pkt num is {} same as expected\".format(pkt_num)))\n+        )\n+        return res\n+\n+    def check_queue(self, out, check_param, **kwargs):\n+        \"\"\"\n+        verify that queue value matches the expected value\n+        :param out: information received by testpmd after sending packets and port statistics\n+        :param check_param: check item name and value, eg\n+                            \"check_param\": {\"port_id\": 0, \"queue\": 2}\n+        :param kwargs: some specified parameters, such as: pkt_num, port_id, stats\n+        :return:\n+        \"\"\"\n+        self.logger.info(\"{0} check queue {0}\".format(self.logfmt))\n+        queue = check_param[\"queue\"]\n+        if isinstance(check_param[\"queue\"], int):\n+            queue = [queue]\n+        patt = re.compile(\n+            r\"port\\s+{}/queue(.+?):\\s+received\\s+(\\d+)\\s+packets\".format(\n+                kwargs.get(\"port_id\")\n+            )\n+        )\n+        res = patt.findall(out)\n+        if res:\n+            pkt_queue = set([int(i[0]) for i in res])\n+            if kwargs.get(\"stats\"):\n+                self.verify(\n+                    all(q in queue for q in pkt_queue),\n+                    \"fail: queue id not matched, expect queue {}, got {}\".format(\n+                        queue, pkt_queue\n+                    ),\n+                )\n+                self.logger.info((GREEN(\"pass: queue id {} matched\".format(pkt_queue))))\n+            else:\n+                try:\n+                    self.verify(\n+                        not any(q in queue for q in pkt_queue),\n+                        \"fail: queue id should not matched, {} should not in {}\".format(\n+                            pkt_queue, queue\n+                        ),\n+                    )\n+                    self.logger.info(\n+                        (GREEN(\"pass: queue id {} not matched\".format(pkt_queue)))\n+                    )\n+                except VerifyFailure:\n+                    self.logger.info(\n+                        \"queue id {} contains the queue {} specified in rule, so need to check\"\n+                        \" whether the packet directed by rss or not\".format(\n+                            pkt_queue, queue\n+                        )\n+                    )\n+                    # for mismatch packet the 'stats' parameter is False, need to change to True\n+                    kwargs[\"stats\"] = True\n+                    self.check_rss(out, **kwargs)\n+\n+        else:\n+            raise Exception(\"got wrong output, not match pattern\")\n+\n+    def check_mark_id(self, out, check_param, **kwargs):\n+        \"\"\"\n+        verify that the mark ID matches the expected value\n+        :param out: information received by testpmd after sending packets\n+        :param check_param: check item name and value, eg\n+                            \"check_param\": {\"port_id\": 0, \"mark_id\": 1}\n+        :param kwargs: some specified parameters,eg: stats\n+        :return: None\n+        usage:\n+            check_mark_id(out, check_param, stats=stats)\n+        \"\"\"\n+        self.logger.info(\"{0} check mark id {0}\".format(self.logfmt))\n+        fdir_scanner = re.compile(\"FDIR matched ID=(0x\\w+)\")\n+        all_mark = fdir_scanner.findall(out)\n+        stats = kwargs.get(\"stats\")\n+        if stats:\n+            mark_list = set(int(i, 16) for i in all_mark)\n+            self.verify(\n+                all([i == check_param[\"mark_id\"] for i in mark_list]) and mark_list,\n+                \"failed: some packet mark id of {} not match expect {}\".format(\n+                    mark_list, check_param[\"mark_id\"]\n+                ),\n+            )\n+            self.logger.info((GREEN(\"pass: all packets mark id are matched \")))\n+        else:\n+            # for mismatch packet,verify no mark id in output of received packet\n+            self.verify(\n+                not all_mark, \"mark id {} in output, expect no mark id\".format(all_mark)\n+            )\n+            self.logger.info((GREEN(\"pass: no mark id in output\")))\n+\n+    def check_rss(self, out, **kwargs):\n+        \"\"\"\n+        check whether the packet directed by rss or not according to the specified parameters\n+        :param out: information received by testpmd after sending packets and port statistics\n+        :param kwargs: some specified parameters, such as: rxq, stats\n+        :return: queue value list\n+        usage:\n+            check_rss(out, rxq=rxq, stats=stats)\n+        \"\"\"\n+        self.logger.info(\"{0} check rss {0}\".format(self.logfmt))\n+        rxq = kwargs.get(\"rxq\")\n+        p = re.compile(\"RSS\\shash=(\\w+)\\s-\\sRSS\\squeue=(\\w+)\")\n+        pkt_info = p.findall(out)\n+        self.verify(\n+            pkt_info,\n+            \"no information matching the pattern was found,pattern:{}\".format(\n+                p.pattern\n+            ),\n+        )\n+        pkt_queue = set([int(i[1], 16) for i in pkt_info])\n+        if kwargs.get(\"stats\"):\n+            self.verify(\n+                all([int(i[0], 16) % rxq == int(i[1], 16) for i in pkt_info]),\n+                \"some pkt not directed by rss.\",\n+            )\n+            self.logger.info((GREEN(\"pass: all pkts directed by rss\")))\n+        else:\n+            self.verify(\n+                not any([int(i[0], 16) % rxq == int(i[1], 16) for i in pkt_info]),\n+                \"some pkt directed by rss, expect not directed by rss\",\n+            )\n+            self.logger.info((GREEN(\"pass: no pkt directed by rss\")))\n+        return pkt_queue\n+\n+    def check_drop(self, out, **kwargs):\n+        \"\"\"\n+        check the drop number of packets according to the specified parameters\n+        :param out: information received by testpmd after sending packets and port statistics\n+        :param kwargs: some specified parameters, such as: pkt_num, port_id, stats\n+        :return: None\n+        usage:\n+            chek_drop(out, pkt_num=pkt_num, port_id=portid, stats=stats)\n+        \"\"\"\n+        self.logger.info(\"{0} check drop {0}\".format(self.logfmt))\n+        pkt_num = kwargs.get(\"pkt_num\")\n+        stats = kwargs.get(\"stats\")\n+        if \"switch\" in self.__class__.__name__.lower() and stats:\n+            pkt_num = 0\n+        res = self.get_pkt_statistic(out, **kwargs)\n+        self.verify(\n+            pkt_num == res[\"rx-total\"],\n+            \"failed: get wrong amount of packet {}, expected {}\".format(\n+                res[\"rx-total\"], pkt_num\n+            ),\n+        )\n+        drop_packet_num = res[\"rx-dropped\"]\n+        if stats:\n+            self.verify(\n+                drop_packet_num == pkt_num,\n+                \"failed: {} packet dropped,expect {} dropped\".format(\n+                    drop_packet_num, pkt_num\n+                ),\n+            )\n+            self.logger.info(\n+                (\n+                    GREEN(\n+                        \"pass: drop packet number {} is matched\".format(drop_packet_num)\n+                    )\n+                )\n+            )\n+        else:\n+            self.verify(\n+                drop_packet_num == 0 and res[\"rx-packets\"] == pkt_num,\n+                \"failed: {} packet dropped, expect 0 packet dropped\".format(\n+                    drop_packet_num\n+                ),\n+            )\n+            self.logger.info(\n+                (\n+                    GREEN(\n+                        \"pass: drop packet number {} is matched\".format(drop_packet_num)\n+                    )\n+                )\n+            )\n+\n+    def check_with_param(self, out, pkt_num, check_param, stats=True):\n+        \"\"\"\n+        according to the key and value of the check parameter,\n+        perform the corresponding verification in the out information\n+        :param out: information received by testpmd after sending packets and port statistics\n+        :param pkt_num: number of packets sent\n+        :param check_param: check item name and value, eg:\n+                            \"check_param\": {\"port_id\": 0, \"mark_id\": 1, \"queue\": 1}\n+                            \"check_param\": {\"port_id\": 0, \"drop\": 1}\n+        :param stats: effective status of rule, True or False, default is True\n+        :return:\n+        usage:\n+            check_with_param(out, pkt_num, check_param, stats)\n+            check_with_param(out, pkt_num, check_param=check_param)\n+        \"\"\"\n+        rxq = self.rxq\n+        port_id = (\n+            check_param[\"port_id\"] if check_param.get(\"port_id\") is not None else 0\n+        )\n+        match_flag = True\n+        \"\"\"\n+        check_dict shows the supported check items,the key is item name and value represent the check priority,\n+        the smaller the value, the higher the priority, priority default value is 999. if need to add new check item,\n+        please add it to the dict and implement the corresponding method and named as 'check_itemname',eg: check_queue\n+        \"\"\"\n+        default_pri = 999\n+        check_dict = {\n+            \"queue\": default_pri,\n+            \"drop\": default_pri,\n+            \"mark_id\": 1,\n+            \"rss\": default_pri,\n+        }\n+        params = {\"port_id\": port_id, \"rxq\": rxq, \"pkt_num\": pkt_num, \"stats\": stats}\n+        # sort check_param order by priority, from high to low, set priority as 999 if key not in check_dict\n+        check_param = OrderedDict(\n+            sorted(\n+                check_param.items(),\n+                key=lambda item: check_dict.get(item[0], params[\"pkt_num\"]),\n+            )\n+        )\n+        if not check_param.get(\"drop\"):\n+            self.check_pkt_num(out, **params)\n+        for k in check_param:\n+            parameter = copy.deepcopy(params)\n+            if k not in check_dict:\n+                continue\n+            func_name = \"check_{}\".format(k)\n+            try:\n+                func = getattr(self, func_name)\n+            except AttributeError:\n+                emsg = \"{},this func is not implemented, please check!\".format(\n+                    traceback.format_exc()\n+                )\n+                raise Exception(emsg)\n+            else:\n+                # for mismatch packet, if the check item is 'rss',should also verify the packets are distributed by rss\n+                if k == \"rss\" and not stats:\n+                    parameter[\"stats\"] = True\n+                    match_flag = False\n+                res = func(out=out, check_param=check_param, **parameter)\n+                if k == \"rss\" and match_flag:\n+                    self.matched_queue.append(res)\n+\n+    def send_pkt_get_output_flow(\n+        self, pkts, port_id=0, count=1, interval=0, get_stats=False\n+    ):\n+        self.pmd_output.execute_cmd(\"clear port stats all\")\n+        tx_port = self.tester_ifaces[port_id] if port_id else self.tester_ifaces[0]\n+        self.logger.info(\"----------send packet-------------\")\n+        self.logger.info(\"{}\".format(pkts))\n+        if not isinstance(pkts, list):\n+            pkts = [pkts]\n+        self.pkt.update_pkt(pkts)\n+        self.pkt.send_pkt(\n+            crb=self.tester,\n+            tx_port=tx_port,\n+            count=count,\n+            interval=interval,\n+        )\n+        out1 = self.pmd_output.get_output(timeout=3)\n+        if get_stats:\n+            out2 = self.pmd_output.execute_cmd(\"show port stats all\")\n+            self.pmd_output.execute_cmd(\"stop\")\n+        else:\n+            out2 = self.pmd_output.execute_cmd(\"stop\")\n+        self.pmd_output.execute_cmd(\"start\")\n+        return \"\".join([out1, out2])\n+\n+    def flow_rule_operate(self, case):\n+        \"\"\"\n+        test steps of flow rule case:\n+            1. create rule\n+            2. send and check match packets\n+            3. send and check mismatch packets\n+            4. list and destroy rule\n+            5. send and check match packet are distributed by rss\n+        :param case: case dict info, eg:\n+            mac_ipv4_pay_queue_index = {\n+                \"sub_casename\": \"mac_ipv4_pay_queue_index\",\n+                \"rule\": \"flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 / end actions queue index 1 / end\",\n+                \"packet\": MAC_IPV4_PAY,\n+                \"check_param\": {\"port_id\": 0, \"queue\": 1}\n+            }\n+        :return: None\n+        \"\"\"\n+        check_param = case.get(\"check_param\")\n+        port_id = check_param.get(\"port_id\") if check_param.get(\"port_id\") else 0\n+        tport_id = check_param.get(\"tport_id\") if check_param.get(\"tport_id\") else 0\n+        # validate and create rule\n+        rule = case.get(\"rule\")\n+        extend_rule = case.get(\"extend_rule\")\n+        if extend_rule:\n+            self.fdirpro.create_rule(extend_rule)\n+        self.fdirpro.validate_rule(rule)\n+        rule_li = self.fdirpro.create_rule(rule)\n+        # send and check match packets\n+        self.logger.info(\"{0} send and check match packets {0}\".format(self.logfmt))\n+        match_pkts = case.get(\"packet\").get(\"match\")\n+        self.verify(match_pkts, \"no match packets in case info\")\n+        out1 = self.send_pkt_get_output_flow(pkts=match_pkts, port_id=tport_id)\n+        self.matched_queue = []\n+        self.check_with_param(\n+            out1,\n+            pkt_num=len(match_pkts),\n+            check_param=check_param,\n+        )\n+        # send and check mismatch packets\n+        self.logger.info(\"{0} send and check mismatch packets {0}\".format(self.logfmt))\n+        mismatch_pkts = case.get(\"packet\").get(\"mismatch\")\n+        self.verify(mismatch_pkts, \"no mismatch packets in case info\")\n+        out2 = self.send_pkt_get_output_flow(pkts=mismatch_pkts)\n+        self.check_with_param(\n+            out2,\n+            pkt_num=len(mismatch_pkts),\n+            check_param=check_param,\n+            stats=False,\n+        )\n+        # list and destroy rule\n+        self.logger.info(\"{0} list and destroy rule {0}\".format(self.logfmt))\n+        self.fdirpro.check_rule(port_id=port_id, rule_list=rule_li)\n+        self.fdirpro.destroy_rule(port_id=port_id, rule_id=rule_li)\n+        # send match packet\n+        self.logger.info(\n+            \"{0} send and check match packets after destroy rule {0}\".format(\n+                self.logfmt\n+            )\n+        )\n+        out3 = self.send_pkt_get_output_flow(pkts=match_pkts)\n+        self.check_with_param(\n+            out3,\n+            pkt_num=len(match_pkts),\n+            check_param=check_param,\n+            stats=False,\n+        )\n+        if check_param.get(\"rss\"):\n+            self.verify(\n+                self.matched_queue\n+                and self.matched_queue[0 : len(match_pkts)]\n+                == self.matched_queue[-len(match_pkts) :],\n+                \"send twice match packet, received in different queues\",\n+            )\n+        # check not rule exists\n+        self.fdirpro.check_rule(port_id=port_id, stats=False, rule_list=rule_li)\n+\n+    def rte_flow(self, case_list, func_name, **kwargs):\n+        \"\"\"\n+        main flow of case:\n+            1. iterate the case list and do the below steps:\n+                a. get the subcase name and init dict to save result\n+                b. call method by func name to execute case step\n+                c. record case result and err msg if case failed\n+                d. clear flow rule\n+            2. calculate the case passing rate according to the result dict\n+            3. record case result and pass rate in the case log file\n+            4. verify whether the case pass rate is equal to 100, if not, mark the case as failed and raise the err msg\n+        :param case_list: case list, each item is a subcase of case\n+        :param func_name: hadle case method name, eg:\n+                        'flow_rule_operate': a method of 'FlowRuleProcessing' class,\n+                        used to handle flow rule related suites,such as fdir and switch_filter\n+                        'handle_rss_distribute_cases': a method of 'RssProcessing' class,\n+                        used to handle rss related suites\n+        :return:\n+        usage:\n+        for flow rule related:\n+            rte_flow(caselist, flow_rule_operate)\n+        for rss related:\n+            rte_flow(caselist, handle_rss_distribute_cases)\n+        \"\"\"\n+        if not isinstance(case_list, list):\n+            case_list = [case_list]\n+        test_results = dict()\n+        for case in case_list:\n+            case_name = case.get(\"sub_casename\")\n+            test_results[case_name] = {}\n+            try:\n+                self.logger.info(\"{0} case_name:{1} {0}\".format(\"*\" * 20, case_name))\n+                case.update(kwargs)\n+                func_name(case)\n+            except Exception:\n+                test_results[case_name][\"result\"] = \"failed\"\n+                test_results[case_name][\"err\"] = re.sub(\n+                    r\"['\\r\\n]\", \"\", str(traceback.format_exc(limit=1))\n+                ).replace(\"\\\\\\\\\", \"\\\\\")\n+                self.logger.info(\n+                    (\n+                        RED(\n+                            \"case failed:{}, err:{}\".format(\n+                                case_name, traceback.format_exc()\n+                            )\n+                        )\n+                    )\n+                )\n+            else:\n+                test_results[case_name][\"result\"] = \"passed\"\n+                self.logger.info((GREEN(\"case passed: {}\".format(case_name))))\n+            finally:\n+                check_param = case.get(\"check_param\")\n+                if check_param:\n+                    port_id = check_param.get(\"port_id\")\n+                else:\n+                    port_id = case.get(\"port_id\") if case.get(\"port_id\") else 0\n+                self.pmd_output.execute_cmd(\"flow flush %s\" % port_id)\n+        pass_rate = (\n+            round(\n+                sum(1 for k in test_results if \"passed\" in test_results[k][\"result\"])\n+                / len(test_results),\n+                4,\n+            )\n+            * 100\n+        )\n+        self.logger.info(\n+            [\n+                \"{}:{}\".format(sub_name, test_results[sub_name][\"result\"])\n+                for sub_name in test_results\n+            ]\n+        )\n+        self.logger.info(\"pass rate is: {}\".format(pass_rate))\n+        msg = [\n+            \"subcase_name:{}:{},err:{}\".format(\n+                name, test_results[name].get(\"result\"), test_results[name].get(\"err\")\n+            )\n+            for name in test_results.keys()\n+            if \"failed\" in test_results[name][\"result\"]\n+        ]\n+        self.verify(\n+            int(pass_rate) == 100,\n+            \"some subcases failed, detail as below:{}\".format(msg),\n+        )\n+\n+    def test_multi_rules_mac_ipv6_udp_vxlan_ipv4(self):\n+        \"\"\"\n+        Test case 13: ICE_FDIR_multi-rules_MAC/IPv6/UDP/VXLAN/IPv4\n+        \"\"\"\n+        rules = [\n+            \"flow create 0 ingress pattern raw pattern spec 00112233445500000000000286DD6000000000241100CDCD910A222254988475111139001010CDCD910A222254988475111139002020000012B5002400000800000000000000450000140000000000000000C0A80014C0A80015 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions queue index 4 / mark id 11 / end\",\n+            \"flow create 0 ingress pattern raw pattern spec 00112233445500000000000286DD6000000000241100CDCD910A222254988475111139001010CDCD910A222254988475111139002020000012B5002400000800000000000000450000140000000000000000C0A80014C0A80015 pattern mask 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF0000000000000000 / end actions queue index 1 / mark id 1 / end\",\n+        ]\n+        packet = [\n+            'Ether(dst=\"00:11:22:33:44:55\")/IPv6()/UDP()/VXLAN()/IP(src=\"192.168.0.20\",dst=\"192.168.0.21\")/(\"X\"*480)',\n+        ]\n+        check_param = {\"port_id\": 0, \"mark_id\": 11, \"queue\": 4}\n+        # create rule\n+        self.fdirpro.create_rule(rules[0], check_stats=True)\n+        self.fdirpro.create_rule(rules[1], check_stats=False)\n+        out = self.send_pkt_get_output_flow(packet, port_id=check_param[\"port_id\"])\n+        # match rule 1\n+        self.check_with_param(out, len(packet), check_param=check_param)\n+\n+    def test_mac_ipv4_udp_gtpu_ul_ipv4_tcp(self):\n+        \"\"\"\n+        Test case 12: ICE_FDIR_MAC/IPv4/UDP/GTPU/UL/IPv4/TCP_un-word-aligned key\n+        \"\"\"\n+        func_name = self.flow_rule_operate\n+        self.rte_flow(mac_ipv4_udp_gtpu_ul_ipv4_tcp, func_name)\n+\n+    def test_mac_ipv4_udp_gtpu_dl_ipv6(self):\n+        \"\"\"\n+        Test case 11: ICE_FDIR_MAC/IPv4/UDP/GTPU/DL/IPv6\n+        \"\"\"\n+        func_name = self.flow_rule_operate\n+        self.rte_flow(mac_ipv4_udp_gtpu_dl_ipv6, func_name)\n+\n+    def test_mac_ipv4_gtpu_ul_ipv4(self):\n+        \"\"\"\n+        Test case 10: ICE_FDIR_MAC/IPv4/UDP/GTPU/UL/IPv4\n+        \"\"\"\n+        func_name = self.flow_rule_operate\n+        self.rte_flow(mac_ipv4_gtpu_ul_ipv4, func_name)\n+\n+    def test_mac_ipv6_udp_gtpu_dl_ipv4(self):\n+        \"\"\"\n+        Test case 9: ICE_FDIR_MAC/IPv6/UDP/GTPU/DL/IPv4\n+        \"\"\"\n+        func_name = self.flow_rule_operate\n+        self.rte_flow(mac_ipv6_udp_gtpu_dl_ipv4, func_name)\n+\n+    def test_mac_ipv4_udp_gtpu_ipv6_udp(self):\n+        \"\"\"\n+        Test case 8: ICE_FDIR_MAC/IPv4/UDP/GTPU/IPv6/UDP\n+        \"\"\"\n+        func_name = self.flow_rule_operate\n+        self.rte_flow(mac_ipv4_udp_gtpu_ipv6_udp, func_name)\n+\n+    def test_mac_ipv4_udp_gtpu_ipv4(self):\n+        \"\"\"\n+        Test case 7: ICE_FDIR_MAC/IPv4/GTPU/IPv4\n+        \"\"\"\n+        func_name = self.flow_rule_operate\n+        self.rte_flow(mac_ipv4_udp_gtpu_ipv4, func_name)\n+\n+    def test_mac_ipv4_udp_vxlan_mac_ipv4_vni(self):\n+        \"\"\"\n+        # Test case 6: ICE_FDIR_MAC/IPv4/UDP/VXLAN/MAC/IPv4_vni\n+        \"\"\"\n+        func_name = self.flow_rule_operate\n+        self.rte_flow(mac_ipv4_udp_vxlan_mac_ipv4_vni, func_name)\n+\n+    def test_mac_ipv4_udp_vxlan_mac_ipv4_udp(self):\n+        \"\"\"\n+        Test case 4: ICE_FDIR_MAC/IPv4/UDP/VXLAN/MAC/IPv4/UDP\n+        \"\"\"\n+        func_name = self.flow_rule_operate\n+        self.rte_flow(mac_ipv4_udp_vxlan_mac_ipv4_udp, func_name)\n+\n+    def test_mac_ipv4_udp_vxlan_mac_ipv4_pay(self):\n+        \"\"\"\n+        Test case 3: ICE_FDIR_MAC/IPv4/UDP/VXLAN/MAC/IPv4/PAY\n+        \"\"\"\n+        func_name = self.flow_rule_operate\n+        self.rte_flow(mac_ipv4_udp_vxlan_mac_ipv4_pay, func_name)\n+\n+    def test_mac_ipv6_tcp(self):\n+        \"\"\"\n+        Test case 2: ICE_FDIR_MAC/IPv6/TCP\n+        \"\"\"\n+        func_name = self.flow_rule_operate\n+        self.rte_flow(mac_ipv6_tcp, func_name)\n+\n+    def test_mac_ipv4_udp(self):\n+        \"\"\"\n+        Test case 1: ICE_FDIR_MAC/IPv4/UDP\n+        \"\"\"\n+        func_name = self.flow_rule_operate\n+        self.rte_flow(mac_ipv4_udp, func_name)\n+\n+    def tear_down(self):\n+        \"\"\"\n+        Run after each test case.\n+        \"\"\"\n+        try:\n+            self.pmd_output.quit()\n+        except:\n+            self.dut.kill_all()\n+\n+    def tear_down_all(self):\n+        \"\"\"\n+        Run after each test suite.\n+        \"\"\"\n+        self.dut.kill_all()\n",
    "prefixes": [
        "V2",
        "1/4"
    ]
}