get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 114539,
    "url": "https://patches.dpdk.org/api/patches/114539/?format=api",
    "web_url": "https://patches.dpdk.org/project/dts/patch/20220802190441.10272-4-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-4-songx.jiale@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dts/20220802190441.10272-4-songx.jiale@intel.com",
    "date": "2022-08-02T19:04:41",
    "name": "[V2,4/4] tests/iavf_rss_protocol_agnostic_flow: add test cases",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "0dfc11fbc45c8a55c8f5e67fe2899b182feafbdd",
    "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-4-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/114539/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/114539/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 7D700A0547;\n\tTue,  2 Aug 2022 12:45:34 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 7528242B77;\n\tTue,  2 Aug 2022 12:45:34 +0200 (CEST)",
            "from mga06.intel.com (mga06b.intel.com [134.134.136.31])\n by mails.dpdk.org (Postfix) with ESMTP id 7224842B77\n for <dts@dpdk.org>; Tue,  2 Aug 2022 12:45:32 +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:31 -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:30 -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=1659437132; x=1690973132;\n h=from:to:cc:subject:date:message-id:in-reply-to: references;\n bh=ws/6agSPl4qE65EqSKiDO8HkcCDOd5pdU1VDrRVCP4s=;\n b=ZCSm3tgDA0MB0IHaoa7B9OLRaEmIDINUuNl5pM+Da9d/O2idhLm6v8pp\n ifFwlywqaLiIphEGmC2v4JRkE2djW0CAazC83o/+dKTaBmNBc2/wyWBs1\n pWDlprtGUSGQP5ZJLvc7Wwl8RbOE8Woj+XOuh5oJw8jVXX2rglNSmMf2e\n B7GzkQQ+jrYvIFpeXhfAmHtmuNqOVTeXeC1dEb+9Z1QUAwEeshJSV5sFC\n SXxTbJfRNbRa+iZteLiHLa7U2BdKze/EKIqwyKmcjnYW8snjmGoDbn1ep\n eFX5YtAxXDonMB1MOffnf9SS8gRY7LS6XQ9HWcXgAT0SILhlk6RW526F8 w==;",
        "X-IronPort-AV": [
            "E=McAfee;i=\"6400,9594,10426\"; a=\"351087457\"",
            "E=Sophos;i=\"5.93,210,1654585200\"; d=\"scan'208\";a=\"351087457\"",
            "E=Sophos;i=\"5.93,210,1654585200\"; d=\"scan'208\";a=\"578173832\""
        ],
        "From": "Jiale Song <songx.jiale@intel.com>",
        "To": "dts@dpdk.org",
        "Cc": "Jiale Song <songx.jiale@intel.com>",
        "Subject": "[dts] [PATCH V2 4/4] tests/iavf_rss_protocol_agnostic_flow: add test\n cases",
        "Date": "Tue,  2 Aug 2022 19:04:41 +0000",
        "Message-Id": "<20220802190441.10272-4-songx.jiale@intel.com>",
        "X-Mailer": "git-send-email 2.17.1",
        "In-Reply-To": "<20220802190441.10272-1-songx.jiale@intel.com>",
        "References": "<20220802190441.10272-1-songx.jiale@intel.com>",
        "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 iavf rss protocol agnostic flow offloading.\n\nSigned-off-by: Jiale Song <songx.jiale@intel.com>\n---\n ...stSuite_iavf_rss_protocol_agnostic_flow.py | 749 ++++++++++++++++++\n 1 file changed, 749 insertions(+)\n create mode 100644 tests/TestSuite_iavf_rss_protocol_agnostic_flow.py",
    "diff": "diff --git a/tests/TestSuite_iavf_rss_protocol_agnostic_flow.py b/tests/TestSuite_iavf_rss_protocol_agnostic_flow.py\nnew file mode 100644\nindex 00000000..54710d17\n--- /dev/null\n+++ b/tests/TestSuite_iavf_rss_protocol_agnostic_flow.py\n@@ -0,0 +1,749 @@\n+# SPDX-License-Identifier: BSD-3-Clause\n+# Copyright(c) 2022 Intel Corporation\n+#\n+\n+import re\n+import traceback\n+\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 RssProcessing\n+\n+MAC_IPv4_UDP = {\n+    \"basic\": [\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+# Test case 1: IAVF_RSS_MAC/IPv4/UDP\n+mac_ipv4_udp = {\n+    \"sub_casename\": \"mac_ipv4_udp\",\n+    \"rule\": \"flow create 1 ingress pattern raw pattern spec 00112233445500000000000208004500001C0000000000110000C0A80014C0A800150016001700080000 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000000 / end actions rss queues end / end\",\n+    \"test\": [\n+        {\n+            \"send_packet\": MAC_IPv4_UDP[\"basic\"],\n+            \"action\": {\"save_hash\": \"ipv4-udp\"},\n+        },\n+        {\n+            \"send_packet\": MAC_IPv4_UDP[\"mismatch\"],\n+            \"action\": {\"check_hash_different\": \"ipv4-udp\"},\n+        },\n+    ],\n+}\n+\n+MAC_IPv6_TCP_sysmetric = {\n+    \"basic\": [\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+    \"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=23,dport=22)/(\"X\"*480)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IPv6(dst=\"CDCD:910A:2222:5498:8475:1111:3900:1010\", src=\"CDCD:910A:2222:5498:8475:1111:3900:2020\")/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:1010\", src=\"CDCD:910A:2222:5498:8475:1111:3900:2020\")/TCP(sport=23,dport=22)/(\"X\"*480)',\n+    ],\n+}\n+# Test case 2: IAVF_RSS_MAC/IPv6/TCP_sysmetric\n+mac_ipv6_tcp_sysmetric = {\n+    \"sub_casename\": \"mac_ipv6_tcp_sysmetric\",\n+    \"rule\": \"flow create 1 ingress pattern raw pattern spec 00112233445500000000000286DD6000000000140600CDCD910A222254988475111139001010CDCD910A2222549884751111390020200016001700000000000000005000000000000000 pattern mask 00000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 / end actions rss func symmetric_toeplitz queues end / end\",\n+    \"test\": [\n+        {\n+            \"send_packet\": MAC_IPv6_TCP_sysmetric[\"basic\"],\n+            \"action\": {\"save_hash\": \"ipv6-tcp\"},\n+        },\n+        {\n+            \"send_packet\": MAC_IPv6_TCP_sysmetric[\"match\"],\n+            \"action\": {\"check_hash_same\": \"ipv6-tcp\"},\n+        },\n+    ],\n+}\n+\n+MAC_IPv4_UDP_VXLAN_MAC_IPv4_PAY = {\n+    \"basic\": [\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+    \"match\": [\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.10\")/UDP()/VXLAN()/Ether()/IP(src=\"192.168.0.20\",dst=\"192.168.0.21\")/Raw(\"x\" * 80)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP(dst=\"192.168.0.10\")/UDP()/VXLAN()/Ether()/IP(src=\"192.168.0.20\",dst=\"192.168.0.21\")/Raw(\"x\" * 80)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP()/UDP()/VXLAN(vni=33)/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.10.20\",dst=\"192.168.0.21\")/Raw(\"x\" * 80)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP()/UDP()/VXLAN()/Ether()/IP(src=\"192.168.0.20\",dst=\"192.168.10.21\")/Raw(\"x\" * 80)',\n+    ],\n+}\n+# Test case 3: IAVF_RSS_MAC/IPv4/UDP/VXLAN/MAC/IPv4/PAY\n+mac_ipv4_udp_vxlan_mac_ipv4_pay = {\n+    \"sub_casename\": \"mac_ipv4_udp_vxlan_mac_ipv4_pay\",\n+    \"rule\": \"flow create 1 ingress pattern raw pattern spec 00112233445500000000000208004500004600000000001100000101010102020202000012B50032000008000000000003000000000000010000000000020800450000140000000000000000C0A80014C0A80015 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions rss queues end / end\",\n+    \"test\": [\n+        {\n+            \"send_packet\": MAC_IPv4_UDP_VXLAN_MAC_IPv4_PAY[\"basic\"],\n+            \"action\": {\"save_hash\": \"ipv4_udp_vxlan_ipv4_pay\"},\n+        },\n+        {\n+            \"send_packet\": MAC_IPv4_UDP_VXLAN_MAC_IPv4_PAY[\"mismatch\"],\n+            \"action\": {\"check_hash_different\": \"ipv4_udp_vxlan_ipv4_pay\"},\n+        },\n+        {\n+            \"send_packet\": MAC_IPv4_UDP_VXLAN_MAC_IPv4_PAY[\"match\"],\n+            \"action\": {\"check_hash_same\": \"ipv4_udp_vxlan_ipv4_pay\"},\n+        },\n+    ],\n+}\n+\n+MAC_IPv4_UDP_VXLAN_MAC_IPv4_UDP = {\n+    \"basic\": [\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+    \"match\": [\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.10\")/UDP()/VXLAN()/Ether()/IP(src=\"192.168.0.20\",dst=\"192.168.0.21\")/UDP()/(\"X\"*480)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP(dst=\"192.168.0.10\")/UDP()/VXLAN()/Ether()/IP(src=\"192.168.0.20\",dst=\"192.168.0.21\")/UDP()/(\"X\"*480)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP()/UDP()/VXLAN(vni=33)/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+    ],\n+}\n+# Test case 4: IAVF_RSS_MAC/IPv4/UDP/VXLAN/MAC/IPv4/UDP\n+mac_ipv4_udp_vxlan_mac_ipv4_udp = {\n+    \"sub_casename\": \"mac_ipv4_udp_vxlan_mac_ipv4_udp\",\n+    \"rule\": \"flow create 1 ingress pattern raw pattern spec 00112233445500000000000208004500004E00000000001100000101010102020202000012B5003A0000080000000000000000000000000100000000000208004500001C0000000000110000C0A80014C0A800150000000000080000 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF0000000000000000 / end actions rss queues end / end\",\n+    \"test\": [\n+        {\n+            \"send_packet\": MAC_IPv4_UDP_VXLAN_MAC_IPv4_UDP[\"basic\"],\n+            \"action\": {\"save_hash\": \"ipv4_udp_vxlan_ipv6_pay\"},\n+        },\n+        {\n+            \"send_packet\": MAC_IPv4_UDP_VXLAN_MAC_IPv4_UDP[\"mismatch\"],\n+            \"action\": {\"check_hash_different\": \"ipv4_udp_vxlan_ipv6_pay\"},\n+        },\n+        {\n+            \"send_packet\": MAC_IPv4_UDP_VXLAN_MAC_IPv4_UDP[\"match\"],\n+            \"action\": {\"check_hash_same\": \"ipv4_udp_vxlan_ipv6_pay\"},\n+        },\n+    ],\n+}\n+\n+MAC_IPv4_UDP_VXLAN_MAC_IPv4_sysmetric = {\n+    \"basic\": [\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+    \"match\": [\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP()/UDP()/VXLAN()/Ether()/IP(src=\"192.168.0.21\",dst=\"192.168.0.20\")/Raw(\"x\" * 80)',\n+    ],\n+}\n+# Test case 5: IAVF_RSS_MAC/IPv4/UDP/VXLAN/MAC/IPv4_sysmetric\n+mac_ipv4_udp_vxlan_mac_ipv4_sysmetric = {\n+    \"sub_casename\": \"mac_ipv4_udp_vxlan_mac_ipv4_sysmetric\",\n+    \"rule\": \"flow create 1 ingress pattern raw pattern spec 00112233445500000000000208004500004600000000001100000101010102020202000012B50032000008000000000000000000000000010000000000020800450000140000000000000000C0A80014C0A80015 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions rss func symmetric_toeplitz queues end / end\",\n+    \"test\": [\n+        {\n+            \"send_packet\": MAC_IPv4_UDP_VXLAN_MAC_IPv4_sysmetric[\"basic\"],\n+            \"action\": {\"save_hash\": \"ipv6_udp_vxlan_ipv4_pay\"},\n+        },\n+        {\n+            \"send_packet\": MAC_IPv4_UDP_VXLAN_MAC_IPv4_sysmetric[\"match\"],\n+            \"action\": {\"check_hash_same\": \"ipv6_udp_vxlan_ipv4_pay\"},\n+        },\n+    ],\n+}\n+\n+MAC_IPv4_UDP_VXLAN_MAC_IPv4 = {\n+    \"basic\": [\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP()/UDP()/VXLAN()/Ether()/IP(src=\"192.168.0.20\",dst=\"192.168.0.21\")/(\"X\"*480)',\n+    ],\n+    \"match\": [\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP()/UDP()/VXLAN()/Ether()/IP(src=\"192.168.0.20\",dst=\"192.168.10.21\")/(\"X\"*480)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.10\")/UDP()/VXLAN()/Ether()/IP(src=\"192.168.0.20\",dst=\"192.168.0.21\")/(\"X\"*480)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP(dst=\"192.168.0.10\")/UDP()/VXLAN()/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=22)/Ether()/IP(src=\"192.168.0.20\",dst=\"192.168.0.21\")/(\"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\")/(\"X\"*480)',\n+    ],\n+}\n+# Test case 6: IAVF_RSS_MAC/IPv4/UDP/VXLAN/MAC/IPv4_inner-l3-src-only\n+mac_ipv4_udp_vxlan_mac_ipv4 = {\n+    \"sub_casename\": \"mac_ipv4_udp_vxlan_mac_ipv4\",\n+    \"rule\": \"flow create 1 ingress pattern raw pattern spec 00112233445500000000000208004500004600000000001100000101010102020202000012B50032000008000000000000000000000000010000000000020800450000140000000000000000C0A80014C0A80015 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFF00000000 / end actions rss queues end / end\",\n+    \"test\": [\n+        {\n+            \"send_packet\": MAC_IPv4_UDP_VXLAN_MAC_IPv4[\"basic\"],\n+            \"action\": {\"save_hash\": \"ipv4_udp_vxlan_ipv6_tcp\"},\n+        },\n+        {\n+            \"send_packet\": MAC_IPv4_UDP_VXLAN_MAC_IPv4[\"mismatch\"],\n+            \"action\": {\"check_hash_different\": \"ipv4_udp_vxlan_ipv6_tcp\"},\n+        },\n+        {\n+            \"send_packet\": MAC_IPv4_UDP_VXLAN_MAC_IPv4[\"match\"],\n+            \"action\": {\"check_hash_same\": \"ipv4_udp_vxlan_ipv6_tcp\"},\n+        },\n+    ],\n+}\n+\n+MAC_IPv4_UDP_GTPU_IPv4 = {\n+    \"basic\": [\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+    \"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=0x567)/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+# Test case 7: IAVF_RSS_MAC/IPv4/UDP/GTPU/IPv4\n+mac_ipv4_udp_gtpu_ipv4 = {\n+    \"sub_casename\": \"mac_ipv4_udp_gtpu_ipv4\",\n+    \"rule\": \"flow create 1 ingress pattern raw pattern spec 0011223344550000000000020800450000380000000000110000C0A80014C0A80015000008680024000030FF001400000000450000140000000000000000C0A80A14C0A80A15 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions rss queues end / end\",\n+    \"test\": [\n+        {\n+            \"send_packet\": MAC_IPv4_UDP_GTPU_IPv4[\"basic\"],\n+            \"action\": {\"save_hash\": \"ipv4_gtpu_ipv4\"},\n+        },\n+        {\n+            \"send_packet\": MAC_IPv4_UDP_GTPU_IPv4[\"mismatch\"],\n+            \"action\": {\"check_hash_different\": \"ipv4_gtpu_ipv4\"},\n+        },\n+        {\n+            \"send_packet\": MAC_IPv4_UDP_GTPU_IPv4[\"match\"],\n+            \"action\": {\"check_hash_same\": \"ipv4_gtpu_ipv4\"},\n+        },\n+    ],\n+}\n+\n+MAC_IPv4_UDP_GTPU_IPv6_UDP = {\n+    \"basic\": [\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+    \"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: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+        '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=0x12)/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.0.21\", 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.0.22\")/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+}\n+# Test case 8: IAVF_RSS_MAC/IPv4/UDP/GTPU/IPv6/UDP_outer-l3\n+mac_ipv4_udp_gtpu_ipv6_udp = {\n+    \"sub_casename\": \"mac_ipv4_udp_gtpu_ipv6_udp\",\n+    \"rule\": \"flow create 1 ingress pattern raw pattern spec 0011223344550000000000020800450000540000000000110000C0A80014C0A80015000008680040000030FF0030000000006000000000081100CDCD910A222254988475111139001010CDCD910A2222549884751111390020210000000000080000 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 / end actions rss queues end / end\",\n+    \"test\": [\n+        {\n+            \"send_packet\": MAC_IPv4_UDP_GTPU_IPv6_UDP[\"basic\"],\n+            \"action\": {\"save_hash\": \"ipv4_gtpu_ipv6_udp\"},\n+        },\n+        {\n+            \"send_packet\": MAC_IPv4_UDP_GTPU_IPv6_UDP[\"mismatch\"],\n+            \"action\": {\"check_hash_different\": \"ipv4_gtpu_ipv6_udp\"},\n+        },\n+        {\n+            \"send_packet\": MAC_IPv4_UDP_GTPU_IPv6_UDP[\"match\"],\n+            \"action\": {\"check_hash_same\": \"ipv4_gtpu_ipv6_udp\"},\n+        },\n+    ],\n+}\n+\n+MAC_IPv4_UDP_GTPU_EH_IPv4_UDP_sysmetric = {\n+    \"basic\": [\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(QFI=0x34)/IP(src=\"192.168.1.20\", dst=\"192.168.1.21\")/UDP()/Raw(\"x\"*20)',\n+    ],\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(QFI=0x34)/IP(src=\"192.168.1.21\", dst=\"192.168.1.20\")/UDP()/Raw(\"x\"*20)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.21\", dst=\"192.168.0.20\")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(QFI=0x34)/IP(src=\"192.168.1.20\", dst=\"192.168.1.21\")/UDP()/Raw(\"x\"*20)',\n+        'Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.21\", dst=\"192.168.0.20\")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(QFI=0x34)/IP(src=\"192.168.1.21\", dst=\"192.168.1.20\")/UDP()/Raw(\"x\"*20)',\n+    ],\n+}\n+# Test case 9: IAVF_RSS_MAC/IPv4/UDP/GTPU/EH/IPv4/UDP_innersysmetric\n+mac_ipv4_udp_gtpu_eh_ipv4_udp_sysmetric = {\n+    \"sub_casename\": \"mac_ipv4_udp_gtpu_eh_ipv4_udp_sysmetric \",\n+    \"rule\": \"flow create 1 ingress pattern raw pattern spec 0011223344550000000000020800450000440000000000110000C0A80014C0A80014000008680030000034FF00240000000000000085010000004500001C0000000000110000C0A80114C0A801150000000000080000 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF0000000000000000 / end actions rss func symmetric_toeplitz queues end / end\",\n+    \"test\": [\n+        {\n+            \"send_packet\": MAC_IPv4_UDP_GTPU_EH_IPv4_UDP_sysmetric[\"basic\"],\n+            \"action\": {\"save_hash\": \"ipv6_gtpu_eh_ipv4_tcp\"},\n+        },\n+        {\n+            \"send_packet\": MAC_IPv4_UDP_GTPU_EH_IPv4_UDP_sysmetric[\"match\"],\n+            \"action\": {\"check_hash_same\": \"ipv6_gtpu_eh_ipv4_tcp\"},\n+        },\n+    ],\n+}\n+\n+MAC_IPv4_UDP_GTPU_UL_IPv4 = {\n+    \"basic\": [\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+    \"match\": [\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.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+    \"mismatch\": [\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=0, P=1, QFI=0x34)/IP(src=\"192.168.1.20\", dst=\"192.168.1.21\")/Raw(\"x\"*20)',\n+    ],\n+}\n+# Test case 10: IAVF_RSS_MAC/IPv4/UDP/GTPU/UL/IPv4_inner-l3-dst-only\n+mac_ipv4_udp_gtpu_ul_ipv4 = {\n+    \"sub_casename\": \"mac_ipv4_udp_gtpu_ul_ipv4\",\n+    \"rule\": \"flow create 1 ingress pattern raw pattern spec 00112233445500000000000208004500003C0000000000110000C0A80014C0A80015000008680028000034FF001C000000000000008501100000450000140000000000000000C0A80114C0A80115 pattern mask 000000000000000000000000000000000000000000000000000000000000FFFFFFFF000000000000000000000000000000000000000000F000000000000000000000000000000000000000000000 / end actions rss queues end / end\",\n+    \"test\": [\n+        {\n+            \"send_packet\": MAC_IPv4_UDP_GTPU_UL_IPv4[\"basic\"],\n+            \"action\": {\"save_hash\": \"ipv4_gtpu_ul_ipv4\"},\n+        },\n+        {\n+            \"send_packet\": MAC_IPv4_UDP_GTPU_UL_IPv4[\"mismatch\"],\n+            \"action\": {\"check_hash_different\": \"ipv4_gtpu_ul_ipv4\"},\n+        },\n+        {\n+            \"send_packet\": MAC_IPv4_UDP_GTPU_UL_IPv4[\"match\"],\n+            \"action\": {\"check_hash_same\": \"ipv4_gtpu_ul_ipv4\"},\n+        },\n+    ],\n+}\n+\n+MAC_IPv4_UDP_GTPU_DL_IPv4_TCP = {\n+    \"basic\": [\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+    \"match\": [\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)/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.10.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+        '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.11.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=0, P=1, QFI=0x34)/IP(src=\"192.168.1.21\", 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=0, P=1, QFI=0x34)/IP(src=\"192.168.1.20\", dst=\"192.168.1.22\")/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=0x123)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src=\"192.168.1.20\", dst=\"192.168.1.22\")/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=0x123)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src=\"192.168.1.20\", dst=\"192.168.1.22\")/TCP()/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=\"191.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=0, P=1, QFI=0x34)/IP(src=\"192.161.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.1.21\")/TCP()/Raw(\"x\"*20)',\n+    ],\n+}\n+# Test case 11: IAVF_RSS_MAC/IPv4/UDP/GTPU/DL/IPv4/TCP_un-word-aligned key\n+mac_ipv4_udp_gtpu_dl_ipv4_tcp = {\n+    \"sub_casename\": \"mac_ipv4_udp_gtpu_dl_ipv4_tcp\",\n+    \"rule\": \"flow create 1 ingress pattern raw pattern spec 0011223344550000000000020800450000500000000000110000C0A80014C0A8001500000868003C000034FF0030000000000000008501000000450000280000000000060000C0A80114C0A801150000000000000000000000005000000000000000 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F00000000000000000000000000000FFFF0000000000000000000000000000000000000000000000000000 / end actions rss queues end / end\",\n+    \"test\": [\n+        {\n+            \"send_packet\": MAC_IPv4_UDP_GTPU_DL_IPv4_TCP[\"basic\"],\n+            \"action\": {\"save_hash\": \"ipv4_gtpu_dl_ipv4_tcp\"},\n+        },\n+        {\n+            \"send_packet\": MAC_IPv4_UDP_GTPU_DL_IPv4_TCP[\"mismatch\"],\n+            \"action\": {\"check_hash_different\": \"ipv4_gtpu_dl_ipv4_tcp\"},\n+        },\n+        {\n+            \"send_packet\": MAC_IPv4_UDP_GTPU_DL_IPv4_TCP[\"match\"],\n+            \"action\": {\"check_hash_same\": \"ipv4_gtpu_dl_ipv4_tcp\"},\n+        },\n+    ],\n+}\n+\n+vf1_mac = \"00:11:22:33:44:55\"\n+# tester send pcaket port\n+tPort = 0\n+# dut receive packet port\n+dPort = 1\n+port_topology = {\"port_id\": dPort, \"tport_id\": tPort}\n+\n+\n+class TestIavfRssProtocolAgnosticFlow(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.pf_interface = self.dut.ports_info[self.dports[0]][\"intf\"]\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.rsspro = RssProcessing(\n+            self, self.pmd_output, self.tester_ifaces, rxq=self.rxq\n+        )\n+        self.create_iavf()\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 create_iavf(self):\n+        self.dut.restore_interfaces()\n+        self.dut.generate_sriov_vfs_by_port(self.dports[0], 2)\n+        # set VF0 as trust\n+        self.dut.send_expect(\"ip link set %s vf 0 trust on\" % self.pf_interface, \"#\")\n+        self.sriov_vfs_port = self.dut.ports_info[self.dports[0]][\"vfs_port\"]\n+        self.vf_pci0 = self.sriov_vfs_port[0].pci\n+        self.vf_pci1 = self.sriov_vfs_port[1].pci\n+        try:\n+            for port in self.sriov_vfs_port:\n+                port.bind_driver(self.drivername)\n+            self.dut.send_expect(\"ifconfig %s up\" % self.pf_interface, \"# \")\n+            self.dut.send_expect(\n+                \"ip link set %s vf 1 mac %s\" % (self.pf_interface, vf1_mac), \"# \"\n+            )\n+        except Exception as e:\n+            self.destroy_iavf()\n+            raise Exception(e)\n+\n+    def launch_testpmd(self):\n+        \"\"\"\n+        launch testpmd with the command\n+        \"\"\"\n+        params = \"--rxq={0} --txq={0} --disable-rss --txd=384 --rxd=384\".format(\n+            self.rxq\n+        )\n+        eal_params = '-a {},cap=dcf -a {} --log-level=\"pmd,7\"'.format(\n+            self.vf_pci0, self.vf_pci1\n+        )\n+        self.pmd_output.start_testpmd(param=params, eal_param=eal_params)\n+        self.pmd_output.execute_cmd(\"set fwd rxonly\")\n+        self.pmd_output.execute_cmd(\"set verbose 1\")\n+        self.pmd_output.execute_cmd(\"port config 0 udp_tunnel_port add vxlan 0x12b5\")\n+        self.pmd_output.execute_cmd(\"start\")\n+        self.pmd_output.wait_link_status_up(0)\n+\n+    def destroy_iavf(self):\n+        self.dut.destroy_sriov_vfs_by_port(self.dports[0])\n+        self.dut.bind_interfaces_linux(self.drivername)\n+\n+    def send_pkt_get_output(self, pkts, port_id=0, tport_id=0, count=1, interval=0):\n+        tx_port = self.tester_ifaces[tport_id] if tport_id else self.tester_ifaces[0]\n+        self.logger.info(\"----------send packet-------------\")\n+        self.logger.info(\"{}\".format(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+        out = self.pmd_output.get_output(timeout=1)\n+        pkt_pattern = (\n+            \"port\\s%d/queue\\s\\d+:\\sreceived\\s(\\d+)\\spackets.+?\\n.*length=\\d{2,}\\s\"\n+            % port_id\n+        )\n+        reveived_data = re.findall(pkt_pattern, out)\n+        reveived_pkts = sum(map(int, [i[0] for i in reveived_data]))\n+        if isinstance(pkts, list):\n+            self.verify(\n+                reveived_pkts == len(pkts) * count,\n+                \"expect received %d pkts, but get %d instead\"\n+                % (len(pkts) * count, reveived_pkts),\n+            )\n+        else:\n+            self.verify(\n+                reveived_pkts == 1 * count,\n+                \"expect received %d pkts, but get %d instead\"\n+                % (1 * count, reveived_pkts),\n+            )\n+        return out\n+\n+    def handle_tests(self, tests, port_id=0, tport_id=0):\n+        out = \"\"\n+        for test in tests:\n+            if \"send_packet\" in test:\n+                out = self.send_pkt_get_output(\n+                    test[\"send_packet\"], port_id=port_id, tport_id=tport_id\n+                )\n+            if \"action\" in test:\n+                self.rsspro.handle_actions(out, test[\"action\"], port_id)\n+\n+    def handle_rss_case(self, case_info):\n+        # clear hash_records before each sub case\n+        self.hash_records = {}\n+        self.error_msgs = []\n+        self.current_saved_hash = \"\"\n+        sub_case_name = case_info.get(\"sub_casename\")\n+        self.logger.info(\n+            \"===================Test sub case: {}================\".format(sub_case_name)\n+        )\n+        # received packet port id\n+        port_id = case_info.get(\"port_id\") if case_info.get(\"port_id\") else 0\n+        # send packet port id\n+        tport_id = case_info.get(\"tport_id\") if case_info.get(\"tport_id\") else 0\n+        rules = case_info.get(\"rule\") if case_info.get(\"rule\") else []\n+        rule_ids = []\n+        if \"pre-test\" in case_info:\n+            self.logger.info(\"------------handle pre-test--------------\")\n+            self.handle_tests(case_info[\"pre-test\"], port_id=port_id, tport_id=tport_id)\n+\n+        # handle tests\n+        tests = case_info[\"test\"]\n+        self.logger.info(\"------------handle test--------------\")\n+        # validate rule\n+        if rules:\n+            self.rsspro.validate_rule(rule=rules, check_stats=True)\n+            rule_ids = self.rsspro.create_rule(rule=case_info[\"rule\"], check_stats=True)\n+            self.rsspro.check_rule(port_id=port_id, rule_list=rule_ids)\n+        self.handle_tests(tests, port_id=port_id, tport_id=tport_id)\n+\n+        # handle post-test\n+        if \"post-test\" in case_info:\n+            self.logger.info(\"------------handle post-test--------------\")\n+            self.rsspro.destroy_rule(port_id=port_id, rule_id=rule_ids)\n+            self.rsspro.check_rule(port_id=port_id, stats=False)\n+            self.rsspro.handle_tests(case_info[\"post-test\"], port_id=port_id)\n+        if self.error_msgs:\n+            self.verify(\n+                False,\n+                \" \".join([errs.replace(\"'\", \" \") for errs in self.error_msgs[:500]]),\n+            )\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_ipv4_udp_vxlan_ipv6(self):\n+        \"\"\"\n+        Test case 12: IAVF_RSS_multi-rules_MAC/IPv4/UDP/VXLAN/IPv6\n+        \"\"\"\n+        rules = [\n+            \"flow create 1 ingress pattern raw pattern spec 00112233445500000000000208004500004C00000000001100000101010102020202000012B50038000008000000000000006000000000000000CDCD910A222254988475111139001010CDCD910A222254988475111139002021 pattern mask 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF / end actions rss queues end / end\",\n+            \"flow create 1 ingress pattern raw pattern spec 00112233445500000000000208004500004C00000000001100000101010102020202000012B50038000008000000000000006000000000000000CDCD910A222254988475111139001010CDCD910A222254988475111139002021 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 / end actions rss queues end / end\",\n+        ]\n+        MAC_IPv4_UDP_VXLAN_IPv6 = {\n+            \"basic\": [\n+                'Ether(dst=\"00:11:22:33:44:55\")/IP()/UDP()/VXLAN()/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1010\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2021\")/(\"X\"*480)',\n+            ],\n+            \"match\": [\n+                'Ether(dst=\"00:11:22:33:44:55\")/IP()/UDP()/VXLAN()/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1010\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/(\"X\"*480)',\n+            ],\n+            \"mismatch\": [\n+                'Ether(dst=\"00:11:22:33:44:55\")/IP()/UDP()/VXLAN()/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1011\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2021\")/(\"X\"*480)',\n+            ],\n+        }\n+        tests = [\n+            {\n+                \"send_packet\": MAC_IPv4_UDP_VXLAN_IPv6[\"basic\"],\n+                \"action\": {\"save_hash\": \"ipv4_udp_vxlan_ipv6\"},\n+            },\n+            {\n+                \"send_packet\": MAC_IPv4_UDP_VXLAN_IPv6[\"mismatch\"],\n+                \"action\": {\"check_hash_different\": \"ipv4_udp_vxlan_ipv6\"},\n+            },\n+            {\n+                \"send_packet\": MAC_IPv4_UDP_VXLAN_IPv6[\"match\"],\n+                \"action\": {\"check_hash_same\": \"ipv4_udp_vxlan_ipv6\"},\n+            },\n+        ]\n+        # create rule\n+        self.rsspro.create_rule(rules, check_stats=True)\n+        self.rsspro.error_msgs = []\n+        self.rsspro.error_msgs = []\n+        self.handle_tests(tests, port_id=dPort, tport_id=tPort)\n+        if self.rsspro.error_msgs:\n+            self.verify(\n+                False,\n+                \" \".join(\n+                    [errs.replace(\"'\", \" \") for errs in self.rsspro.error_msgs[:500]]\n+                ),\n+            )\n+\n+    def test_mac_ipv4_udp_gtpu_dl_ipv4_tcp(self):\n+        \"\"\"\n+        Test case 11: IAVF_RSS_MAC/IPv4/UDP/GTPU/DL/IPv4/TCP_un-word-aligned key\n+        \"\"\"\n+        func_name = self.handle_rss_case\n+        self.rte_flow(mac_ipv4_udp_gtpu_dl_ipv4_tcp, func_name, **port_topology)\n+\n+    def test_mac_ipv4_udp_gtpu_ul_ipv4(self):\n+        \"\"\"\n+        Test case 10: IAVF_RSS_MAC/IPv4/UDP/GTPU/UL/IPv4_inner-l3-dst-only\n+        \"\"\"\n+        func_name = self.handle_rss_case\n+        self.rte_flow(mac_ipv4_udp_gtpu_ul_ipv4, func_name, **port_topology)\n+\n+    def test_mac_ipv4_udp_gtpu_eh_ipv4_udp_sysmetric(self):\n+        \"\"\"\n+        Test case 9: IAVF_RSS_MAC/IPv4/GTPU/EH/IPv4/DUP_innersysmetric\n+        \"\"\"\n+        func_name = self.handle_rss_case\n+        self.rte_flow(\n+            mac_ipv4_udp_gtpu_eh_ipv4_udp_sysmetric, func_name, **port_topology\n+        )\n+\n+    def test_mac_ipv4_udp_gtpu_ipv6_udp(self):\n+        \"\"\"\n+        # Test case 8: IAVF_RSS_MAC/IPv4/UDP/GTPU/IPv6/UDP_outer-l3\n+        \"\"\"\n+        func_name = self.handle_rss_case\n+        self.rte_flow(mac_ipv4_udp_gtpu_ipv6_udp, func_name, **port_topology)\n+\n+    def test_mac_ipv4_udp_gtpu_ipv4(self):\n+        \"\"\"\n+        Test case 7: IAVF_RSS_MAC/IPv4/UDP/GTPU/IPv4\n+        \"\"\"\n+        func_name = self.handle_rss_case\n+        self.rte_flow(mac_ipv4_udp_gtpu_ipv4, func_name, **port_topology)\n+\n+    def test_mac_ipv4_udp_vxlan_mac_ipv4(self):\n+        \"\"\"\n+        Test case 6: IAVF_RSS_MAC/IPv4/UDP/VXLAN/MAC/IPv4_inner-l3-src-only\n+        \"\"\"\n+        func_name = self.handle_rss_case\n+        self.rte_flow(mac_ipv4_udp_vxlan_mac_ipv4, func_name, **port_topology)\n+\n+    def test_mac_ipv4_udp_vxlan_mac_ipv4_sysmetric(self):\n+        \"\"\"\n+        Test case 5: IAVF_RSS_MAC/IPv4/UDP/VXLAN/MAC/IPv4_sysmetric\n+        \"\"\"\n+        func_name = self.handle_rss_case\n+        self.rte_flow(mac_ipv4_udp_vxlan_mac_ipv4_sysmetric, func_name, **port_topology)\n+\n+    def test_mac_ipv4_udp_vxlan_mac_ipv4_udp(self):\n+        \"\"\"\n+        Test case 4: IAVF_RSS_MAC/IPv4/UDP/VXLAN/MAC/IPv4/UDP\n+        \"\"\"\n+        func_name = self.handle_rss_case\n+        self.rte_flow(mac_ipv4_udp_vxlan_mac_ipv4_udp, func_name, **port_topology)\n+\n+    def test_mac_ipv4_udp_vxlan_mac_ipv4_pay(self):\n+        \"\"\"\n+        Test case 3: IAVF_RSS_MAC/IPv4/UDP/VXLAN/MAC/IPv4/PAY\n+        \"\"\"\n+        func_name = self.handle_rss_case\n+        self.rte_flow(mac_ipv4_udp_vxlan_mac_ipv4_pay, func_name, **port_topology)\n+\n+    def test_mac_ipv6_tcp_sysmetric(self):\n+        \"\"\"\n+        Test case 2: IAVF_RSS_MAC/IPv6/TCP_sysmetric\n+        \"\"\"\n+        func_name = self.handle_rss_case\n+        self.rte_flow(mac_ipv6_tcp_sysmetric, func_name, **port_topology)\n+\n+    def test_mac_ipv4_udp(self):\n+        \"\"\"\n+        Test case 1: IAVF_RSS_MAC/IPv4/UDP\n+        \"\"\"\n+        func_name = self.handle_rss_case\n+        self.rte_flow(mac_ipv4_udp, func_name, **port_topology)\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+        self.destroy_iavf()\n",
    "prefixes": [
        "V2",
        "4/4"
    ]
}