get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 75971,
    "url": "https://patches.dpdk.org/api/patches/75971/?format=api",
    "web_url": "https://patches.dpdk.org/project/dts/patch/1598457930-768644-1-git-send-email-nannan.lu@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": "<1598457930-768644-1-git-send-email-nannan.lu@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dts/1598457930-768644-1-git-send-email-nannan.lu@intel.com",
    "date": "2020-08-26T16:05:30",
    "name": "[V1] test_plans: add cvl_advanced_rss_pppoe_vlan_esp_ah_l2tp_pfcp_test_plan.rst",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "683919235e0f30250545c0fac216c8c46ac74f21",
    "submitter": {
        "id": 1658,
        "url": "https://patches.dpdk.org/api/people/1658/?format=api",
        "name": "Lu, Nannan",
        "email": "nannan.lu@intel.com"
    },
    "delegate": null,
    "mbox": "https://patches.dpdk.org/project/dts/patch/1598457930-768644-1-git-send-email-nannan.lu@intel.com/mbox/",
    "series": [
        {
            "id": 11794,
            "url": "https://patches.dpdk.org/api/series/11794/?format=api",
            "web_url": "https://patches.dpdk.org/project/dts/list/?series=11794",
            "date": "2020-08-26T16:05:30",
            "name": "[V1] test_plans: add cvl_advanced_rss_pppoe_vlan_esp_ah_l2tp_pfcp_test_plan.rst",
            "version": 1,
            "mbox": "https://patches.dpdk.org/series/11794/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/75971/comments/",
    "check": "pending",
    "checks": "https://patches.dpdk.org/api/patches/75971/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 dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 56E52A04B1;\n\tWed, 26 Aug 2020 09:15:10 +0200 (CEST)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id B3BC31C0AC;\n\tWed, 26 Aug 2020 09:15:09 +0200 (CEST)",
            "from mga05.intel.com (mga05.intel.com [192.55.52.43])\n by dpdk.org (Postfix) with ESMTP id 0DA5C1C08E\n for <dts@dpdk.org>; Wed, 26 Aug 2020 09:15:05 +0200 (CEST)",
            "from fmsmga008.fm.intel.com ([10.253.24.58])\n by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 26 Aug 2020 00:15:03 -0700",
            "from dpdk-lunannan.sh.intel.com ([10.67.111.68])\n by fmsmga008.fm.intel.com with ESMTP; 26 Aug 2020 00:15:02 -0700"
        ],
        "IronPort-SDR": [
            "\n lBLtYRcaqlt5QtBWBUpVrUPFLap5RpR9I5yYRUyDOROgrn823j8EkPBBbP6dza83mNX6ZD+IXr\n 1ETMxxBC0dFg==",
            "\n SCCqaMuHD5sfI1rsIC64FLvBVAm5ngGFt9rOZYRasrK7aavuS9SHIzpr9lARCtQuVQa1rblQH2\n f3lUx924xp9A=="
        ],
        "X-IronPort-AV": [
            "E=McAfee;i=\"6000,8403,9724\"; a=\"241062524\"",
            "E=Sophos;i=\"5.76,354,1592895600\"; d=\"scan'208\";a=\"241062524\"",
            "E=Sophos;i=\"5.76,354,1592895600\"; d=\"scan'208\";a=\"281722801\""
        ],
        "X-Amp-Result": "SKIPPED(no attachment in message)",
        "X-Amp-File-Uploaded": "False",
        "X-ExtLoop1": "1",
        "From": "Nannan Lu <nannan.lu@intel.com>",
        "To": "dts@dpdk.org",
        "Cc": "Nannan Lu <nannan.lu@intel.com>",
        "Date": "Wed, 26 Aug 2020 16:05:30 +0000",
        "Message-Id": "<1598457930-768644-1-git-send-email-nannan.lu@intel.com>",
        "X-Mailer": "git-send-email 2.7.4",
        "Subject": "[dts] [PATCH V1] test_plans: add\n\tcvl_advanced_rss_pppoe_vlan_esp_ah_l2tp_pfcp_test_plan.rst",
        "X-BeenThere": "dts@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "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",
        "Sender": "\"dts\" <dts-bounces@dpdk.org>"
    },
    "content": "Enable RSS for PPPOE/VLAN/ESP/AH/L2TP/PFCP packets.\nSymmetric hash for PPPOE packets.\nSimple_xor hash for PPPOE packets.\n\nSigned-off-by: Nannan Lu <nannan.lu@intel.com>\n---\n ...d_rss_pppoe_vlan_esp_ah_l2tp_pfcp_test_plan.rst | 6139 ++++++++++++++++++++\n 1 file changed, 6139 insertions(+)\n create mode 100644 test_plans/cvl_advanced_rss_pppoe_vlan_esp_ah_l2tp_pfcp_test_plan.rst",
    "diff": "diff --git a/test_plans/cvl_advanced_rss_pppoe_vlan_esp_ah_l2tp_pfcp_test_plan.rst b/test_plans/cvl_advanced_rss_pppoe_vlan_esp_ah_l2tp_pfcp_test_plan.rst\nnew file mode 100644\nindex 0000000..c28f37b\n--- /dev/null\n+++ b/test_plans/cvl_advanced_rss_pppoe_vlan_esp_ah_l2tp_pfcp_test_plan.rst\n@@ -0,0 +1,6139 @@\n+.. Copyright (c) <2020>, Intel Corporation\n+   All rights reserved.\n+\n+   Redistribution and use in source and binary forms, with or without\n+   modification, are permitted provided that the following conditions\n+   are met:\n+\n+   - Redistributions of source code must retain the above copyright\n+     notice, this list of conditions and the following disclaimer.\n+\n+   - Redistributions in binary form must reproduce the above copyright\n+     notice, this list of conditions and the following disclaimer in\n+     the documentation and/or other materials provided with the\n+     distribution.\n+\n+   - Neither the name of Intel Corporation nor the names of its\n+     contributors may be used to endorse or promote products derived\n+     from this software without specific prior written permission.\n+\n+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+   \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n+   FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n+   COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n+   INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n+   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n+   SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n+   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,\n+   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n+   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n+   OF THE POSSIBILITY OF SUCH DAMAGE.\n+\n+=================================================\n+CVL: Advanced RSS FOR PPPOE/VLAN/ESP/AH/L2TP/PFCP\n+=================================================\n+\n+Description\n+===========\n+\n+* Enable RSS for PPPOE/VLAN/ESP/AH/L2TP/PFCP packets.\n+* Symmetric hash for PPPOE packets.\n+* Simple_xor hash for PPPOE packets.\n+\n+Pattern and input set\n+---------------------\n+.. table::\n+\n+    +-------------------------------+---------------------------+----------------------------------------------------------------------------------+\n+    | Hash function: toeplitz                                                                                                                      |\n+    +-------------------------------+---------------------------+----------------------------------------------------------------------------------+\n+    | Packet Type                   | Pattern                   | All the Input Set options in combination                                         |\n+    +===============================+===========================+==================================================================================+\n+    |                               | MAC_PPPOE_IPV4_PAY        | eth, l2-src-only, l2-dst-only, l3-src-only, l3-dst-only, ipv4                    |\n+    |                               +---------------------------+----------------------------------------------------------------------------------+\n+    |                               | MAC_PPPOE_IPV4_UDP_PAY    | eth, l2-src-only, l2-dst-only, l3-src-only, l3-dst-only,                         |\n+    |                               |                           | l4-src-only, l4-dst-only, ipv4-udp                                               |\n+    |                               +---------------------------+----------------------------------------------------------------------------------+\n+    |                               | MAC_PPPOE_IPV4_TCP_PAY    | eth, l2-src-only, l2-dst-only, l3-src-only, l3-dst-only,                         |\n+    |                               |                           | l4-src-only, l4-dst-only, ipv4-tcp                                               |\n+    |            PPPOE              +---------------------------+----------------------------------------------------------------------------------+\n+    |                               | MAC_PPPOE_IPV6_PAY        | eth, l2-src-only, l2-dst-only, l3-src-only, l3-dst-only, ipv6                    |\n+    |                               +---------------------------+----------------------------------------------------------------------------------+\n+    |                               | MAC_PPPOE_IPV6_UDP_PAY    | eth, l2-src-only, l2-dst-only, l3-src-only, l3-dst-only,                         |\n+    |                               |                           | l4-src-only, l4-dst-only, ipv6-udp                                               |\n+    |                               +---------------------------+----------------------------------------------------------------------------------+\n+    |                               | MAC_PPPOE_IPV6_TCP_PAY    | eth, l2-src-only, l2-dst-only, l3-src-only, l3-dst-only,                         |\n+    |                               |                           | l4-src-only, l4-dst-only, ipv6-tcp                                               |\n+    |                               +---------------------------+----------------------------------------------------------------------------------+\n+    |                               | MAC_PPPOE_PAY             | eth, l2-src-only, l2-dst-only, pppoe                                             |\n+    +-------------------------------+---------------------------+----------------------------------------------------------------------------------+\n+    |                               | MAC_VLAN_IPV4_PAY         | c-vlan                                                                           |\n+    |                               +---------------------------+----------------------------------------------------------------------------------+\n+    |                               | MAC_VLAN_IPV4_UDP_PAY     | c-vlan                                                                           |\n+    |                               +---------------------------+----------------------------------------------------------------------------------+\n+    |                               | MAC_VLAN_IPV4_TCP_PAY     | c-vlan                                                                           |\n+    |                               +---------------------------+----------------------------------------------------------------------------------+\n+    |                               | MAC_VLAN_IPV4_SCTP_PAY    | c-vlan                                                                           |\n+    |             VLAN              +---------------------------+----------------------------------------------------------------------------------+\n+    |                               | MAC_VLAN_IPV6_PAY         | c-vlan                                                                           |\n+    |                               +---------------------------+----------------------------------------------------------------------------------+\n+    |                               | MAC_VLAN_IPV6_UDP_PAY     | c-vlan                                                                           |\n+    |                               +---------------------------+----------------------------------------------------------------------------------+\n+    |                               | MAC_VLAN_IPV6_TCP_PAY     | c-vlan                                                                           |\n+    |                               +---------------------------+----------------------------------------------------------------------------------+\n+    |                               | MAC_VLAN_IPV6_SCTP_PAY    | c-vlan                                                                           |\n+    +-------------------------------+---------------------------+----------------------------------------------------------------------------------+\n+    |                               | MAC_IPV4_ESP              | esp                                                                              |\n+    |                               +---------------------------+----------------------------------------------------------------------------------+\n+    |                               | MAC_IPV4_UDP_ESP          | esp                                                                              |\n+    |             ESP               +---------------------------+----------------------------------------------------------------------------------+\n+    |                               | MAC_IPV6_ESP              | esp                                                                              |\n+    |                               +---------------------------+----------------------------------------------------------------------------------+\n+    |                               | MAC_IPV6_UDP_ESP          | esp                                                                              |\n+    +-------------------------------+---------------------------+----------------------------------------------------------------------------------+\n+    |                               | MAC_IPV4_AH               | ah                                                                               |\n+    |              AH               +---------------------------+----------------------------------------------------------------------------------+\n+    |                               | MAC_IPV6_AH               | ah                                                                               |\n+    +-------------------------------+---------------------------+----------------------------------------------------------------------------------+\n+    |                               | MAC_IPV4_L2TPv3           | l2tpv3                                                                           |\n+    |             L2TP              +---------------------------+----------------------------------------------------------------------------------+\n+    |                               | MAC_IPV6_L2TPv3           | l2tpv3                                                                           |\n+    +-------------------------------+---------------------------+----------------------------------------------------------------------------------+\n+    |                               | MAC_IPV4_PFCP_SESSION     | pfcp                                                                             |\n+    |             PFCP              +---------------------------+----------------------------------------------------------------------------------+\n+    |                               | MAC_IPV6_PFCP_SESSION     | pfcp                                                                             |\n+    +-------------------------------+---------------------------+----------------------------------------------------------------------------------+\n+\n+.. note::\n+\n+    The MAC_PPPOE_IPV4/IPV6_SCTP and MAC_VLAN_PPPOE patterns are not\n+    supported by 20.08.\n+\n+.. table::\n+\n+    +-------------------------------+---------------------------+-------------------+\n+    | Hash function: Symmetric_toeplitz                                             |\n+    +-------------------------------+---------------------------+-------------------+\n+    | Packet Type                   | Pattern                   | Input Set         |\n+    +===============================+===========================+===================+\n+    |                               | MAC_PPPOE_IPV4_PAY        | ipv4              |\n+    |                               +---------------------------+-------------------+\n+    |                               | MAC_PPPOE_IPV4_UDP_PAY    | ipv4-udp          |\n+    |                               +---------------------------+-------------------+\n+    |           PPPOE               | MAC_PPPOE_IPV4_TCP_PAY    | ipv4-tcp          |\n+    |                               +---------------------------+-------------------+\n+    |                               | MAC_PPPOE_IPV6_PAY        | ipv6              |\n+    |                               +---------------------------+-------------------+\n+    |                               | MAC_PPPOE_IPV6_UDP_PAY    | ipv6-udp          |\n+    |                               +---------------------------+-------------------+\n+    |                               | MAC_PPPOE_IPV6_TCP_PAY    | ipv6-tcp          |\n+    +-------------------------------+---------------------------+-------------------+\n+\n+Prerequisites\n+=============\n+\n+1. Hardware:\n+\n+   - Intel E810 series ethernet cards: columbiaville_25g/columbiaville_100g\n+\n+2. Software:\n+\n+   - dpdk: http://dpdk.org/git/dpdk\n+   - scapy: http://www.secdev.org/projects/scapy/\n+\n+3. Copy comm #1 package to /lib/firmware/intel/ice/ddp/ice.pkg,\n+   then load driver::\n+\n+     rmmod ice\n+     insmod ice.ko\n+\n+4. Bind pf to dpdk driver::\n+\n+     ./usertools/dpdk-devbind.py -b vfio-pci 0000:18:00.0\n+\n+5. Launch the testpmd in DUT for cases with toeplitz hash function::\n+\n+     ./x86_64-native-linuxapp-gcc/app/testpmd -c 0xf -n 4 -w 0000:18:00.0 -- -i --rxq=16 --txq=16 --disable-rss\n+     testpmd> port config 0 rss-hash-key ipv4 1b9d58a4b961d9cd1c56ad1621c3ad51632c16a5d16c21c3513d132c135d132c13ad1531c23a51d6ac49879c499d798a7d949c8a\n+     testpmd> set fwd rxonly\n+     testpmd> set verbose 1\n+     testpmd> start\n+\n+   Launch testpmd for cases with symmetric_toeplitz and simple_xor hash function::\n+\n+     ./x86_64-native-linuxapp-gcc/app/testpmd -c 0xf -n 4 -w 0000:18:00.0 -- -i --rxq=16 --txq=16\n+\n+6. on tester side, copy the layer python file to /root::\n+\n+      cp pfcp.py to /root\n+\n+    then import layers when start scapy::\n+\n+      >>> import sys\n+      >>> sys.path.append('/root')\n+      >>> from pfcp import PFCP\n+\n+Test case: MAC_IPV4_PFCP_SESSION\n+================================\n+\n+1. validate a rule for RSS type of MAC_IPV4_PFCP_SESSION::\n+\n+     testpmd> flow validate 0 ingress pattern eth / ipv4 / udp / pfcp / end actions rss types pfcp end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_IPV4_PFCP_SESSION::\n+\n+     testpmd> flow create 0 ingress pattern eth / ipv4 / udp / pfcp / end actions rss types pfcp end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_IPV4_PFCP_SESSION packet::\n+\n+       sendp([Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.20\",dst=\"192.168.0.21\")/UDP(sport=22,dport=8805)/PFCP(Sfield=1, SEID=1)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [SEID], send a packet::\n+\n+       sendp([Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.20\",dst=\"192.168.0.21\")/UDP(sport=22,dport=8805)/PFCP(Sfield=1, SEID=2)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash value is different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(dst=\"00:11:22:33:44:54\")/IP(src=\"192.168.0.25\",dst=\"192.168.0.23\")/UDP(sport=23,dport=8805)/PFCP(Sfield=1, SEID=1)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern::\n+\n+     sendp([Ether(dst=\"00:11:22:33:44:55\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=22,dport=8805)/PFCP(Sfield=1, SEID=1)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+     sendp([Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.20\",dst=\"192.168.0.21\")/UDP(sport=22,dport=25)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Test case: MAC_IPV6_PFCP_SESSION\n+================================\n+\n+1. validate a rule for RSS type of MAC_IPV6_PFCP_SESSION::\n+\n+     testpmd> flow validate 0 ingress pattern eth / ipv6 / udp / pfcp / end actions rss types pfcp end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_IPV6_PFCP_SESSION::\n+\n+     testpmd> flow create 0 ingress pattern eth / ipv6 / udp / pfcp / end actions rss types pfcp end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_IPV6_PFCP_SESSION packet::\n+\n+       sendp([Ether(dst=\"00:11:22:33:44:55\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=22,dport=8805)/PFCP(Sfield=1, SEID=1)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [SEID], send a packet::\n+\n+       sendp([Ether(dst=\"00:11:22:33:44:55\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=22,dport=8805)/PFCP(Sfield=1, SEID=2)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash value is different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(dst=\"00:11:22:33:44:53\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/UDP(sport=23,dport=8805)/PFCP(Sfield=1, SEID=1)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern::\n+\n+     sendp([Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.20\",dst=\"192.168.0.21\")/UDP(sport=22,dport=8805)/PFCP(Sfield=1, SEID=1)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+     sendp([Ether(dst=\"00:11:22:33:44:55\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=22,dport=25)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Test case: MAC_IPV4_L2TPv3\n+==========================\n+\n+1. validate a rule for RSS type of MAC_IPV4_L2TPv3::\n+\n+     testpmd> flow validate 0 ingress pattern eth / ipv4 / l2tpv3oip / end actions rss types l2tpv3 end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_IPV4_L2TPv3::\n+\n+     testpmd> flow create 0 ingress pattern eth / ipv4 / l2tpv3oip / end actions rss types l2tpv3 end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_IPV4_L2TPv3 packet::\n+\n+       sendp([Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.3\",dst=\"192.168.0.5\", proto=115)/L2TP('\\x00\\x00\\x00\\x11')/Raw(\"x\"*480)], iface=\"ens786f0\")\n+\n+     change the field [session_id], send a packet::\n+\n+       sendp([Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.3\",dst=\"192.168.0.4\", proto=115)/L2TP('\\x00\\x00\\x00\\x12')/Raw(\"x\"*480)], iface=\"ens786f0\")\n+\n+     check the hash value is different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(dst=\"00:11:22:33:44:53\")/IP(src=\"192.168.0.5\",dst=\"192.168.0.7\", proto=115)/L2TP('\\x00\\x00\\x00\\x11')/Raw(\"x\"*480)], iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern::\n+\n+     sendp([Ether(dst=\"00:11:22:33:44:55\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\", nh=115)/L2TP('\\x00\\x00\\x00\\x11')/Raw(\"x\"*480)], iface=\"ens786f0\")\n+     sendp([Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.20\",dst=\"192.168.0.21\")/UDP(sport=22,dport=25)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Test case: MAC_IPV6_L2TPv3\n+==========================\n+\n+1. validate a rule for RSS type of MAC_IPV6_L2TPv3::\n+\n+     testpmd> flow validate 0 ingress pattern eth / ipv6 / l2tpv3oip / end actions rss types l2tpv3 end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_IPV6_L2TPv3::\n+\n+     testpmd> flow create 0 ingress pattern eth / ipv6 / l2tpv3oip / end actions rss types l2tpv3 end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_IPV6_L2TPv3 packet::\n+\n+       sendp([Ether(dst=\"00:11:22:33:44:55\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\", nh=115)/L2TP('\\x00\\x00\\x00\\x11')/Raw(\"x\"*480)], iface=\"ens786f0\")\n+\n+     change the field [session_id], send a packet::\n+\n+       sendp([Ether(dst=\"00:11:22:33:44:55\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\", nh=115)/L2TP('\\x00\\x00\\x00\\x12')/Raw(\"x\"*480)], iface=\"ens786f0\")\n+\n+     check the hash value is different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(dst=\"00:11:22:33:44:53\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\", nh=115)/L2TP('\\x00\\x00\\x00\\x11')/Raw(\"x\"*480)], iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern::\n+\n+     sendp([Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.3\",dst=\"192.168.0.5\", proto=115)/L2TP('\\x00\\x00\\x00\\x11')/Raw(\"x\"*480)], iface=\"ens786f0\")\n+     sendp([Ether(dst=\"00:11:22:33:44:55\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=22,dport=25)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Test case: MAC_IPV4_ESP\n+=======================\n+\n+1. validate a rule for RSS type of MAC_IPV4_ESP::\n+\n+     testpmd> flow validate 0 ingress pattern eth / ipv4 / esp / end actions rss types esp end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_IPV4_ESP::\n+\n+     testpmd> flow create 0 ingress pattern eth / ipv4 / esp / end actions rss types esp end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list\n+\n+3. send matched packets\n+\n+   * MAC_IPV4_ESP packet::\n+\n+       sendp([Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.3\",dst=\"192.168.0.5\",proto=50)/ESP(spi=11)/Raw(\"x\"*480)], iface=\"ens786f0\")\n+\n+     change the field [spi], send a packet::\n+\n+       sendp([Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.3\",dst=\"192.168.0.5\",proto=50)/ESP(spi=12)/Raw(\"x\"*480)], iface=\"ens786f0\")\n+\n+     check the hash value is different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(dst=\"00:11:22:33:44:53\")/IP(src=\"192.168.0.4\",dst=\"192.168.0.7\",proto=50)/ESP(spi=11)/Raw(\"x\"*480)], iface=\"ens786f0\")\n+\n+   check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern::\n+\n+     sendp([Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.3\",dst=\"192.168.0.5\", proto=115)/L2TP('\\x00\\x00\\x00\\x11')/Raw(\"x\"*480)], iface=\"ens786f0\")\n+     sendp([Ether(dst=\"00:11:22:33:44:55\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\", nh=50)/ESP(spi=12)/Raw(\"x\"*480)], iface=\"ens786f0\")\n+\n+   check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Test case: MAC_IPV4_UDP_ESP\n+===========================\n+\n+1. validate a rule for RSS type of MAC_IPV4_UDP_ESP::\n+\n+     testpmd> flow validate 0 ingress pattern eth / ipv4 / udp / esp / end actions rss types esp end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_IPV4_UDP_ESP::\n+\n+     testpmd> flow create 0 ingress pattern eth / ipv4 / udp / esp / end actions rss types esp end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list\n+\n+3. send matched packets\n+\n+   * MAC_IPV4_UDP_ESP packet::\n+\n+       sendp([Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.3\",dst=\"192.168.0.5\")/UDP(dport=4500)/ESP(spi=11)/Raw(\"x\"*480)], iface=\"ens786f0\")\n+\n+     change the field [spi], send a packet::\n+\n+       sendp([Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.3\",dst=\"192.168.0.5\")/UDP(dport=4500)/ESP(spi=12)/Raw(\"x\"*480)], iface=\"ens786f0\")\n+\n+     check the hash value is different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(dst=\"00:11:22:33:44:53\")/IP(src=\"192.168.0.4\",dst=\"192.168.0.7\")/UDP(dport=4500)/ESP(spi=11)/Raw(\"x\"*480)], iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern::\n+\n+     sendp([Ether(dst=\"00:11:22:33:44:55\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(dport=4500)/ESP(spi=11)/Raw(\"x\"*480)], iface=\"ens786f0\")\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/IP(src=\"192.168.0.3\",dst=\"192.168.0.5\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+     sendp([Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.3\",dst=\"192.168.0.5\",proto=50)/ESP(spi=11)/Raw(\"x\"*480)], iface=\"ens786f0\")\n+\n+   check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Test case: MAC_IPV6_ESP\n+=======================\n+\n+1. validate a rule for RSS type of MAC_IPV6_ESP::\n+\n+     testpmd> flow validate 0 ingress pattern eth / ipv6 / esp / end actions rss types esp end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_IPV6_ESP::\n+\n+     testpmd> flow create 0 ingress pattern eth / ipv6 / esp / end actions rss types esp end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list\n+\n+3. send matched packets\n+\n+   * MAC_IPV6_ESP packet::\n+\n+       sendp([Ether(dst=\"00:11:22:33:44:55\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\", nh=50)/ESP(spi=11)/Raw(\"x\"*480)], iface=\"ens786f0\")\n+\n+     change the field [spi], send a packet::\n+\n+       sendp([Ether(dst=\"00:11:22:33:44:55\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\", nh=50)/ESP(spi=12)/Raw(\"x\"*480)], iface=\"ens786f0\")\n+\n+     check the hash value is different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(dst=\"00:11:22:33:44:53\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\", nh=50)/ESP(spi=11)/Raw(\"x\"*480)], iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern::\n+\n+     sendp([Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.3\",dst=\"192.168.0.5\",proto=50)/ESP(spi=11)/Raw(\"x\"*480)], iface=\"ens786f0\")\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Test case: MAC_IPV6_UDP_ESP\n+===========================\n+\n+1. validate a rule for RSS type of MAC_IPV6_UDP_ESP::\n+\n+     testpmd> flow validate 0 ingress pattern eth / ipv6 / udp / esp / end actions rss types esp end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_IPV6_UDP_ESP::\n+\n+     testpmd> flow create 0 ingress pattern eth / ipv6 / udp / esp / end actions rss types esp end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list\n+\n+3. send matched packets\n+\n+   * MAC_IPV6_UDP_ESP packet::\n+\n+       sendp([Ether(dst=\"00:11:22:33:44:55\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(dport=4500)/ESP(spi=11)/Raw(\"x\"*480)], iface=\"ens786f0\")\n+\n+     change the field [spi], send a packet::\n+\n+       sendp([Ether(dst=\"00:11:22:33:44:55\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(dport=4500)/ESP(spi=12)/Raw(\"x\"*480)], iface=\"ens786f0\")\n+\n+     check the hash value is different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(dst=\"00:11:22:33:44:53\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/UDP(dport=4500)/ESP(spi=11)/Raw(\"x\"*480)], iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern::\n+\n+     sendp([Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.3\",dst=\"192.168.0.5\")/UDP(dport=4500)/ESP(spi=11)/Raw(\"x\"*480)], iface=\"ens786f0\")\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+     sendp([Ether(dst=\"00:11:22:33:44:55\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\", nh=50)/ESP(spi=11)/Raw(\"x\"*480)], iface=\"ens786f0\")\n+\n+   check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Test case: MAC_IPV4_AH\n+======================\n+\n+1. validate a rule for RSS type of MAC_IPV4_AH::\n+\n+     testpmd> flow validate 0 ingress pattern eth / ipv4 / ah / end actions rss types ah end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_IPV4_AH::\n+\n+     testpmd> flow create 0 ingress pattern eth / ipv4 / ah / end actions rss types ah end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_IPV4_AH packet::\n+\n+       sendp([Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.3\",dst=\"192.168.0.5\",proto=51)/AH(spi=11)/Raw(\"x\"*480)], iface=\"ens786f0\")\n+\n+     change the field [spi], send a packet::\n+\n+       sendp([Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.3\",dst=\"192.168.0.5\",proto=51)/AH(spi=12)/Raw(\"x\"*480)], iface=\"ens786f0\")\n+\n+     check the hash value is different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(dst=\"00:11:22:33:44:53\")/IP(src=\"192.168.0.4\",dst=\"192.168.0.8\",proto=51)/AH(spi=11)/Raw(\"x\"*480)], iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern::\n+\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/IP(src=\"192.168.0.3\",dst=\"192.168.0.5\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+     sendp([Ether(dst=\"00:11:22:33:44:55\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\", nh=51)/AH(spi=11)/Raw(\"x\"*480)], iface=\"ens786f0\")\n+\n+   check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Test case: MAC_IPV6_AH\n+======================\n+\n+1. validate a rule for RSS type of MAC_IPV6_AH::\n+\n+     testpmd> flow validate 0 ingress pattern eth / ipv6 / ah / end actions rss types ah end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_IPV6_AH::\n+\n+     testpmd> flow create 0 ingress pattern eth / ipv6 / ah / end actions rss types ah end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_IPV6_AH packet::\n+\n+       sendp([Ether(dst=\"00:11:22:33:44:55\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\", nh=51)/AH(spi=11)/Raw(\"x\"*480)], iface=\"ens786f0\")\n+\n+     change the field [spi], send a packet::\n+\n+       sendp([Ether(dst=\"00:11:22:33:44:55\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\", nh=51)/AH(spi=12)/Raw(\"x\"*480)], iface=\"ens786f0\")\n+\n+     check the hash value is different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(dst=\"00:11:22:33:44:53\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\", nh=51)/AH(spi=11)/Raw(\"x\"*480)], iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern::\n+\n+     sendp([Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.3\",dst=\"192.168.0.5\",proto=51)/AH(spi=11)/Raw(\"x\"*480)], iface=\"ens786f0\")\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Test case: MAC_PPPOE_PAY\n+========================\n+\n+Note: For PPPOE control packets, the hash input set should be\n+src mac address + PPP session id, so only add LCP/IPCP packets to the\n+L2_SRC_ONLY and SESSION_ID subcases in the case.\n+\n+packets mismatched the pattern::\n+\n+  sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/IP(src=\"192.168.0.3\",dst=\"192.168.0.5\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+  sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+Subcase 1: MAC_PPPOE_PAY_L2_SRC_ONLY\n+------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_PAY_L2_SRC_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / end actions rss types eth l2-src-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_PAY_L2_SRC_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / end actions rss types eth l2-src-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Source MAC], send a packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash value is different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+   * MAC_PPPOE_LCP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\",type=0x8864)/PPPoE(sessionid=3)/PPP(proto=0xc021)/PPP_LCP()/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     change the field [Source MAC], send a packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:66\",type=0x8864)/PPPoE(sessionid=3)/PPP(proto=0xc021)/PPP_LCP()/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     check the hash value is different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:99\",type=0x8864)/PPPoE(sessionid=7)/PPP(proto=0xc021)/PPP_LCP()/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     check the hash values are the same as the first packet.\n+\n+   * MAC_PPPOE_IPCP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\",type=0x8864)/PPPoE(sessionid=3)/PPP(proto=0x8021)/PPP_IPCP()/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     change the field [Source MAC], send a packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:66\",type=0x8864)/PPPoE(sessionid=3)/PPP(proto=0x8021)/PPP_IPCP()/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     check the hash value is different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:99\",type=0x8864)/PPPoE(sessionid=7)/PPP(proto=0x8021)/PPP_IPCP()/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 2: MAC_PPPOE_PAY_L2_DST_ONLY\n+------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_PAY_L2_DST_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / end actions rss types eth l2-dst-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_PAY_L2_DST_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / end actions rss types eth l2-dst-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Dest MAC], send a packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=3)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash value is different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=7)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 3: MAC_PPPOE_PAY_L2_SRC_ONLY_L2_DST_ONLY\n+------------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_PAY_L2_SRC_ONLY_L2_DST_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / end actions rss types eth end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_PAY_L2_SRC_ONLY_L2_DST_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / end actions rss types eth end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the fields [Source MAC][Dest MAC], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=3)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=3)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=7)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 4: MAC_PPPOE_PAY_SESSION_ID\n+===================================\n+\n+1. validate a rule for RSS type of MAC_PPPOE_PAY_SESSION_ID::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / end actions rss types pppoe end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_PAY_SESSION_ID::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / end actions rss types pppoe end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_LCP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\",type=0x8864)/PPPoE(sessionid=3)/PPP(proto=0xc021)/PPP_LCP()/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     change the field [Session ID], send a packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\",type=0x8864)/PPPoE(sessionid=7)/PPP(proto=0xc021)/PPP_LCP()/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     check the hash value is different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\",type=0x8864)/PPPoE(sessionid=3)/PPP(proto=0xc021)/PPP_LCP()/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     check the hash values are the same as the first packet.\n+\n+   * MAC_PPPOE_IPCP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\",type=0x8864)/PPPoE(sessionid=3)/PPP(proto=0x8021)/PPP_IPCP()/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     change the field [Session ID], send a packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\",type=0x8864)/PPPoE(sessionid=7)/PPP(proto=0x8021)/PPP_IPCP()/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     check the hash value is different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\",type=0x8864)/PPPoE(sessionid=3)/PPP(proto=0x8021)/PPP_IPCP()/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 5: MAC_PPPOE_PAY_L2_SRC_ONLY_SESSION_ID\n+-----------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_PAY_L2_SRC_ONLY_SESSION_ID::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / end actions rss types eth l2-src-only pppoe end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_PAY_L2_SRC_ONLY_SESSION_ID::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / end actions rss types eth l2-src-only pppoe end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_LCP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\",type=0x8864)/PPPoE(sessionid=3)/PPP(proto=0xc021)/PPP_LCP()/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     change the fields [Source MAC][Session ID], send a packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:66\",type=0x8864)/PPPoE(sessionid=3)/PPP(proto=0xc021)/PPP_LCP()/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\",type=0x8864)/PPPoE(sessionid=7)/PPP(proto=0xc021)/PPP_LCP()/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:66\",type=0x8864)/PPPoE(sessionid=7)/PPP(proto=0xc021)/PPP_LCP()/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:99\",type=0x8864)/PPPoE(sessionid=3)/PPP(proto=0xc021)/PPP_LCP()/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     check the hash values are the same as the first packet.\n+\n+   * MAC_PPPOE_IPCP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\",type=0x8864)/PPPoE(sessionid=3)/PPP(proto=0x8021)/PPP_IPCP()/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     change the fields [Source MAC][Session ID], send a packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:66\",type=0x8864)/PPPoE(sessionid=3)/PPP(proto=0x8021)/PPP_IPCP()/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\",type=0x8864)/PPPoE(sessionid=7)/PPP(proto=0x8021)/PPP_IPCP()/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:66\",type=0x8864)/PPPoE(sessionid=7)/PPP(proto=0x8021)/PPP_IPCP()/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:99\",type=0x8864)/PPPoE(sessionid=3)/PPP(proto=0x8021)/PPP_IPCP()/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the rule, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Test case: MAC_PPPOE_IPV4_PAY\n+=============================\n+\n+packets mismatched the pattern::\n+\n+  sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+  sendp([Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.20\",dst=\"192.168.0.21\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+  sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/IPv6ExtHdrFragment()/Raw(\"x\"*80)],iface=\"ens786f0\")\n+  sendp([Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.20\",dst=\"192.168.0.21\", frag=5)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+Subcase 1: MAC_PPPOE_IPV4_PAY_L2_SRC_ONLY\n+-----------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV4_PAY_L2_SRC_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv4 / end actions rss types eth l2-src-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV4_PAY_L2_SRC_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / end actions rss types eth l2-src-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV4_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Source MAC], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=4)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.5\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+   * MAC_PPPOE_IPV4_FRAG packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\", frag=5)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Source MAC], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\", frag=5)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=4)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.5\", frag=3)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 2: MAC_PPPOE_IPV4_PAY_L2_DST_ONLY\n+-----------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV4_PAY_L2_DST_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv4 / end actions rss types eth l2-dst-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV4_PAY_L2_DST_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / end actions rss types eth l2-dst-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV4_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Dest MAC], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=4)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.5\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+   * MAC_PPPOE_IPV4_FRAG packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\", frag=5)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Dest MAC], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\", frag=5)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=4)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.5\", frag=3)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 3: MAC_PPPOE_IPV4_PAY_L2_SRC_ONLY_L2_DST_ONLY\n+-----------------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV4_PAY_L2_SRC_ONLY_L2_DST_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv4 / end actions rss types eth end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV4_PAY_L2_SRC_ONLY_L2_DST_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / end actions rss types eth end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV4_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the fields [Source MAC][Dest MAC], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=7)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.5\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+   * MAC_PPPOE_IPV4_FRAG packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\", frag=5)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the fields [Source MAC][Dest MAC], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\", frag=5)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\", frag=5)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\", frag=5)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=7)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.5\", frag=3)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 4: MAC_PPPOE_IPV4_PAY_L3_SRC_ONLY\n+-----------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV4_PAY_L3_SRC_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv4 / end actions rss types ipv4 l3-src-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV4_PAY_L3_SRC_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / end actions rss types ipv4 l3-src-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV4_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Source IP], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.2\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:54\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.7\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+   * MAC_PPPOE_IPV4_FRAG packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\", frag=5)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Source IP], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.2\", frag=5)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:54\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.7\", frag=3)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 5: MAC_PPPOE_IPV4_PAY_L3_DST_ONLY\n+-----------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV4_PAY_L3_DST_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv4 / end actions rss types ipv4 l3-dst-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV4_PAY_L3_DST_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / end actions rss types ipv4 l3-dst-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV4_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Dest IP], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.3\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0021)/IP(src=\"192.168.1.7\", dst=\"192.168.1.2\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+   * MAC_PPPOE_IPV4_FRAG packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\", frag=5)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Dest IP], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.3\", frag=5)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0021)/IP(src=\"192.168.1.7\", dst=\"192.168.1.2\", frag=3)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 6: MAC_PPPOE_IPV4_PAY_L3_SRC_ONLY_L3_DST_ONLY\n+-----------------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV4_PAY_L3_SRC_ONLY_L3_DST_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv4 / end actions rss types ipv4 end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV4_PAY_L3_SRC_ONLY_L3_DST_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / end actions rss types ipv4 end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV4_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\",dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the fields [Source IP][Dest IP], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.2\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.7\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.7\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\",dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+   * MAC_PPPOE_IPV4_FRAG packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\",dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\", frag=5)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the fields [Source IP][Dest IP], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.2\", frag=5)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.7\", frag=5)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.7\", frag=5)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\",dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\", frag=3)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Test case: MAC_PPPOE_IPV4_UDP_PAY\n+=================================\n+\n+packets mismatched the pattern::\n+\n+  sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+  sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+  sendp([Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.20\",dst=\"192.168.0.21\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+Subcase 1: MAC_PPPOE_IPV4_UDP_PAY_L2_SRC_ONLY\n+---------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV4_UDP_PAY_L2_SRC_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv4 / udp / end actions rss types eth l2-src-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV4_UDP_PAY_L2_SRC_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / udp / end actions rss types eth l2-src-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV4_UDP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Source MAC], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.5\")/UDP(sport=19,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 2: MAC_PPPOE_IPV4_UDP_PAY_L2_DST_ONLY\n+---------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV4_UDP_PAY_L2_DST_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv4 / udp / end actions rss types eth l2-dst-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV4_UDP_PAY_L2_DST_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / udp / end actions rss types eth l2-dst-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV4_UDP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Dest MAC], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=7)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.5\")/UDP(sport=19,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 3: MAC_PPPOE_IPV4_UDP_PAY_L2_SRC_ONLY_L2_DST_ONLY\n+---------------------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV4_UDP_PAY_L2_SRC_ONLY_L2_DST_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv4 / udp / end actions rss types eth end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV4_UDP_PAY_L2_SRC_ONLY_L2_DST_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / udp / end actions rss types eth end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV4_UDP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the fields [Source MAC][Dest MAC], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=7)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.5\")/UDP(sport=19,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 4: MAC_PPPOE_IPV4_UDP_PAY_L3_SRC_ONLY\n+---------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV4_UDP_PAY_L3_SRC_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv4 / udp / end actions rss types ipv4-udp l3-src-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV4_UDP_PAY_L3_SRC_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / udp / end actions rss types ipv4-udp l3-src-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV4_UDP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Source IP], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.7\")/UDP(sport=19,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 5: MAC_PPPOE_IPV4_UDP_PAY_L3_DST_ONLY\n+---------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV4_UDP_PAY_L3_DST_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv4 / udp / end actions rss types ipv4-udp l3-dst-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV4_UDP_PAY_L3_DST_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / udp / end actions rss types ipv4-udp l3-dst-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV4_UDP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Dest IP], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.7\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.2\")/UDP(sport=19,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 6: MAC_PPPOE_IPV4_UDP_PAY_L4_SRC_ONLY\n+---------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV4_UDP_PAY_L4_SRC_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv4 / udp / end actions rss types ipv4-udp l4-src-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV4_UDP_PAY_L4_SRC_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / udp / end actions rss types ipv4-udp l4-src-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV4_UDP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Source Port], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=9,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.7\")/UDP(sport=25,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 7: MAC_PPPOE_IPV4_UDP_PAY_L4_DST_ONLY\n+---------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV4_UDP_PAY_L4_DST_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv4 / udp / end actions rss types ipv4-udp l4-dst-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV4_UDP_PAY_L4_DST_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / udp / end actions rss types ipv4-udp l4-dst-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV4_UDP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Dest Port], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=25,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.7\")/UDP(sport=19,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 8: MAC_PPPOE_IPV4_UDP_PAY_L3_SRC_ONLY_L4_SRC_ONLY\n+---------------------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV4_UDP_PAY_L3_SRC_ONLY_L4_SRC_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv4 / udp / end actions rss types ipv4-udp l3-src-only l4-src-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV4_UDP_PAY_L3_SRC_ONLY_L4_SRC_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / udp / end actions rss types ipv4-udp l3-src-only l4-src-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV4_UDP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the fields [Source IP][Source Port], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=19,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.2\")/UDP(sport=19,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.9\")/UDP(sport=25,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 9: MAC_PPPOE_IPV4_UDP_PAY_L3_SRC_ONLY_L4_DST_ONLY\n+---------------------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV4_UDP_PAY_L3_SRC_ONLY_L4_DST_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv4 / udp / end actions rss types ipv4-udp l3-src-only l4-dst-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV4_UDP_PAY_L3_SRC_ONLY_L4_DST_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / udp / end actions rss types ipv4-udp l3-src-only l4-dst-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV4_UDP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the fields [Source IP][Dest Port], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=25,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.2\")/UDP(sport=25,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.7\")/UDP(sport=19,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 10: MAC_PPPOE_IPV4_UDP_PAY_L3_DST_ONLY_L4_SRC_ONLY\n+----------------------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV4_UDP_PAY_L3_DST_ONLY_L4_SRC_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv4 / udp / end actions rss types ipv4-udp l3-dst-only l4-src-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV4_UDP_PAY_L3_DST_ONLY_L4_SRC_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / udp / end actions rss types ipv4-udp l3-dst-only l4-src-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV4_UDP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the fields [Dest IP][Source Port], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.7\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=19,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.7\")/UDP(sport=19,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.2\")/UDP(sport=25,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 11: MAC_PPPOE_IPV4_UDP_PAY_L3_DST_ONLY_L4_DST_ONLY\n+----------------------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV4_UDP_PAY_L3_DST_ONLY_L4_DST_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv4 / udp / end actions rss types ipv4-udp l3-dst-only l4-dst-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV4_UDP_PAY_L3_DST_ONLY_L4_SRC_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / udp / end actions rss types ipv4-udp l3-dst-only l4-dst-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV4_UDP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the fields [Dest IP][Dest Port], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.3\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=25,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.3\")/UDP(sport=25,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.2\")/UDP(sport=19,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 12: MAC_PPPOE_IPV4_UDP_PAY_L3_SRC_ONLY_L3_DST_ONLY_L4_SRC_ONLY_L4_DST_ONLY\n+----------------------------------------------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV4_UDP_PAY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv4 / udp / end actions rss types ipv4-udp end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV4_UDP_PAY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / udp / end actions rss types ipv4-udp end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV4_UDP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the fields [Source IP][Dest IP][Source Port][Dest Port], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.7\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=19,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=25,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.7\")/UDP(sport=19,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Test case: MAC_PPPOE_IPV4_TCP_PAY\n+=================================\n+\n+packets mismatched the pattern::\n+\n+  sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+  sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+  sendp([Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.20\",dst=\"192.168.0.21\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+Subcase 1: MAC_PPPOE_IPV4_TCP_PAY_L2_SRC_ONLY\n+---------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV4_TCP_PAY_L2_SRC_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv4 / tcp / end actions rss types eth l2-src-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV4_TCP_PAY_L2_SRC_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / tcp / end actions rss types eth l2-src-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV4_TCP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Source MAC], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.5\")/TCP(sport=19,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 2: MAC_PPPOE_IPV4_TCP_PAY_L2_DST_ONLY\n+---------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV4_TCP_PAY_L2_DST_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv4 / tcp / end actions rss types eth l2-dst-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV4_TCP_PAY_L2_DST_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / tcp / end actions rss types eth l2-dst-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV4_TCP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Dest MAC], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=7)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.5\")/TCP(sport=19,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 3: MAC_PPPOE_IPV4_TCP_PAY_L2_SRC_ONLY_L2_DST_ONLY\n+---------------------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV4_TCP_PAY_L2_SRC_ONLY_L2_DST_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv4 / tcp / end actions rss types eth end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV4_TCP_PAY_L2_SRC_ONLY_L2_DST_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / tcp / end actions rss types eth end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV4_TCP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the fields [Source MAC][Dest MAC], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=7)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.5\")/TCP(sport=19,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 4: MAC_PPPOE_IPV4_TCP_PAY_L3_SRC_ONLY\n+---------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV4_TCP_PAY_L3_SRC_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv4 / tcp / end actions rss types ipv4-tcp l3-src-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV4_TCP_PAY_L3_SRC_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / tcp / end actions rss types ipv4-tcp l3-src-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV4_TCP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Source IP], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.2\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.7\")/TCP(sport=19,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 5: MAC_PPPOE_IPV4_TCP_PAY_L3_DST_ONLY\n+---------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV4_TCP_PAY_L3_DST_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv4 / tcp / end actions rss types ipv4-tcp l3-dst-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV4_TCP_PAY_L3_DST_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / tcp / end actions rss types ipv4-tcp l3-dst-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV4_TCP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the fields [Dest IP], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.3\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.2\")/TCP(sport=19,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 6: MAC_PPPOE_IPV4_TCP_PAY_L4_SRC_ONLY\n+---------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV4_TCP_PAY_L4_SRC_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv4 / tcp / end actions rss types ipv4-tcp l4-src-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV4_TCP_PAY_L4_SRC_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / tcp / end actions rss types ipv4-tcp l4-src-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV4_TCP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Source Port], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/TCP(sport=19,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.7\")/TCP(sport=25,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 7: MAC_PPPOE_IPV4_TCP_PAY_L4_DST_ONLY\n+---------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV4_TCP_PAY_L4_DST_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv4 / tcp / end actions rss types ipv4-tcp l4-dst-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV4_TCP_PAY_L4_DST_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / tcp / end actions rss types ipv4-tcp l4-dst-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV4_TCP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Dest Port], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/TCP(sport=25,dport=19)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.7\")/TCP(sport=19,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 8: MAC_PPPOE_IPV4_TCP_PAY_L3_SRC_ONLY_L4_SRC_ONLY\n+---------------------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV4_TCP_PAY_L3_SRC_ONLY_L4_SRC_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv4 / tcp / end actions rss types ipv4-tcp l3-src-only l4-src-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV4_TCP_PAY_L3_SRC_ONLY_L4_SRC_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / tcp / end actions rss types ipv4-tcp l3-src-only l4-src-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV4_TCP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the fields [Source IP][Source Port], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.2\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/TCP(sport=19,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.2\")/TCP(sport=19,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.9\")/TCP(sport=25,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 9: MAC_PPPOE_IPV4_TCP_PAY_L3_SRC_ONLY_L4_DST_ONLY\n+---------------------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV4_TCP_PAY_L3_SRC_ONLY_L4_DST_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv4 / tcp / end actions rss types ipv4-tcp l3-src-only l4-dst-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV4_TCP_PAY_L3_SRC_ONLY_L4_DST_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / tcp / end actions rss types ipv4-tcp l3-src-only l4-dst-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV4_TCP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the fields [Source IP][Dest Port], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.2\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/TCP(sport=25,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.2\")/TCP(sport=25,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.7\")/TCP(sport=19,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 10: MAC_PPPOE_IPV4_TCP_PAY_L3_DST_ONLY_L4_SRC_ONLY\n+----------------------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV4_TCP_PAY_L3_DST_ONLY_L4_SRC_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv4 / tcp / end actions rss types ipv4-tcp l3-dst-only l4-src-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV4_TCP_PAY_L3_DST_ONLY_L4_SRC_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / tcp / end actions rss types ipv4-tcp l3-dst-only l4-src-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV4_TCP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the fields [Dest IP][Source Port], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.7\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/TCP(sport=9,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.7\")/TCP(sport=9,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.2\")/TCP(sport=25,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 11: MAC_PPPOE_IPV4_TCP_PAY_L3_DST_ONLY_L4_DST_ONLY\n+----------------------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV4_TCP_PAY_L3_DST_ONLY_L4_DST_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv4 / tcp / end actions rss types ipv4-tcp l3-dst-only l4-dst-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV4_TCP_PAY_L3_DST_ONLY_L4_DST_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / tcp / end actions rss types ipv4-tcp l3-dst-only l4-dst-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV4_TCP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the fields [Dest IP][Dest Port], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.7\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/TCP(sport=25,dport=90)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.7\")/TCP(sport=25,dport=90)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.2\")/TCP(sport=19,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 12: MAC_PPPOE_IPV4_TCP_PAY_L3_SRC_ONLY_L3_DST_ONLY_L4_SRC_ONLY_L4_DST_ONLY\n+----------------------------------------------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV4_TCP_PAY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv4 / tcp / end actions rss types ipv4-tcp end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV4_TCP_PAY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / tcp / end actions rss types ipv4-tcp end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV4_TCP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the fields [Source IP][Dest IP][Source Port][Dest Port], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.2\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.5\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/TCP(sport=19,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/TCP(sport=25,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.5\")/TCP(sport=19,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Test case: MAC_PPPOE_IPV6_PAY\n+=============================\n+\n+packets mismatched the pattern::\n+\n+  sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+  sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\", frag=5)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+  sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+  sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/IPv6ExtHdrFragment()/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+Subcase 1: MAC_PPPOE_IPV6_PAY_L2_SRC_ONLY\n+-----------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV6_PAY_L2_SRC_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv6 / end actions rss types eth l2-src-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV6_PAY_L2_SRC_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv6 / end actions rss types eth l2-src-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV6_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Source MAC], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash value is different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+   * MAC_PPPOE_IPV6_FRAG packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/IPv6ExtHdrFragment()/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Source MAC], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/IPv6ExtHdrFragment()/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash value is different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/IPv6ExtHdrFragment()/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 2: MAC_PPPOE_IPV6_PAY_L2_DST_ONLY\n+-----------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV6_PAY_L2_DST_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv6 / end actions rss types eth l2-dst-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV6_PAY_L2_DST_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv6 / end actions rss types eth l2-dst-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV6_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Dest MAC], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash value is different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=7)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+   * MAC_PPPOE_IPV6_FRAG packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/IPv6ExtHdrFragment()/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Dest MAC], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/IPv6ExtHdrFragment()/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash value is different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=7)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/IPv6ExtHdrFragment()/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 3: MAC_PPPOE_IPV6_PAY_L2_SRC_ONLY_L2_DST_ONLY\n+-----------------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV6_PAY_L2_SRC_ONLY_L2_DST_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv6 / end actions rss types eth end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV6_PAY_L2_SRC_ONLY_L2_DST_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv6 / end actions rss types eth end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV6_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Source MAC][Dest MAC], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash value is different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=7)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+   * MAC_PPPOE_IPV6_FRAG packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/IPv6ExtHdrFragment()/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Source MAC][Dest MAC], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/IPv6ExtHdrFragment()/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/IPv6ExtHdrFragment()/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/IPv6ExtHdrFragment()/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash value is different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=7)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/IPv6ExtHdrFragment()/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 4: MAC_PPPOE_IPV6_PAY_L3_SRC_ONLY\n+-----------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV6_PAY_L3_SRC_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv6 / end actions rss types ipv6 l3-src-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV6_PAY_L3_SRC_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv6 / end actions rss types ipv6 l3-src-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV6_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Source IP], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash value is different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:54\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+   * MAC_PPPOE_IPV6_FRAG packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/IPv6ExtHdrFragment()/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Source IP], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/IPv6ExtHdrFragment()/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash value is different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:54\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/IPv6ExtHdrFragment()/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 5: MAC_PPPOE_IPV6_PAY_L3_DST_ONLY\n+-----------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV6_PAY_L3_DST_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv6 / end actions rss types ipv6 l3-dst-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV6_PAY_L3_DST_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv6 / end actions rss types ipv6 l3-dst-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV6_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Dest IP], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+   * MAC_PPPOE_IPV6_FRAG packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/IPv6ExtHdrFragment()/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Dest IP], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/IPv6ExtHdrFragment()/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/IPv6ExtHdrFragment()/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 6: MAC_PPPOE_IPV6_PAY_L3_SRC_ONLY_L3_DST_ONLY\n+-----------------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV6_PAY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv6 / end actions rss types ipv6 end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV6_PAY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv6 / end actions rss types ipv6 end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV6_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the fields [Source IP][Dest IP], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2025\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2025\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+   * MAC_PPPOE_IPV6_FRAG packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/IPv6ExtHdrFragment()/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the fields [Source IP][Dest IP], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/IPv6ExtHdrFragment()/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2025\")/IPv6ExtHdrFragment()/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2025\")/IPv6ExtHdrFragment()/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/IPv6ExtHdrFragment()/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Test case: MAC_PPPOE_IPV6_UDP_PAY\n+=================================\n+\n+packets mismatched the pattern::\n+\n+  sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+  sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+  sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+Subcase 1: MAC_PPPOE_IPV6_UDP_PAY_L2_SRC_ONLY\n+---------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV6_UDP_PAY_L2_SRC_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv6 / udp / end actions rss types eth l2-src-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV6_UDP_PAY_L2_SRC_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv6 / udp / end actions rss types eth l2-src-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV6_UDP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Source MAC], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/UDP(sport=19,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 2: MAC_PPPOE_IPV6_UDP_PAY_L2_DST_ONLY\n+---------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV6_UDP_PAY_L2_DST_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv6 / udp / end actions rss types eth l2-dst-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV6_UDP_PAY_L2_DST_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv6 / udp / end actions rss types eth l2-dst-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV6_UDP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Dest MAC], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=7)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/UDP(sport=19,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 3: MAC_PPPOE_IPV6_UDP_PAY_L2_SRC_ONLY_L2_DST_ONLY\n+---------------------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV6_UDP_PAY_L2_SRC_ONLY_L2_DST_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv6 / udp / end actions rss types eth end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV6_UDP_PAY_L2_SRC_ONLY_L2_DST_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv6 / udp / end actions rss types eth end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV6_UDP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the fields [Source MAC][Dest MAC], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=7)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/UDP(sport=19,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 4: MAC_PPPOE_IPV6_UDP_PAY_L3_SRC_ONLY\n+---------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV6_UDP_PAY_L3_SRC_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv6 / udp / end actions rss types ipv6-udp l3-src-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV6_UDP_PAY_L3_SRC_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv6 / udp / end actions rss types ipv6-udp l3-src-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV6_UDP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Source IP], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/UDP(sport=19,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 5: MAC_PPPOE_IPV6_UDP_PAY_L3_DST_ONLY\n+---------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV6_UDP_PAY_L3_DST_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv6 / udp / end actions rss types ipv6-udp l3-dst-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV6_UDP_PAY_L3_DST_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv6 / udp / end actions rss types ipv6-udp l3-dst-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV6_UDP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Dest IP], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=19,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 6: MAC_PPPOE_IPV6_UDP_PAY_L4_SRC_ONLY\n+---------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV6_UDP_PAY_L4_SRC_ONLY\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv6 / udp / end actions rss types ipv6-udp l4-src-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV6_UDP_PAY_L4_SRC_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv6 / udp / end actions rss types ipv6-udp l4-src-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV6_UDP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Source Port], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=19,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/UDP(sport=25,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 7: MAC_PPPOE_IPV6_UDP_PAY_L4_DST_ONLY\n+---------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV6_UDP_PAY_L4_DST_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv6 / udp / end actions rss types ipv6-udp l4-dst-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV6_UDP_PAY_L4_DST_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv6 / udp / end actions rss types ipv6-udp l4-dst-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV6_UDP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Dest Port], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/UDP(sport=19,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 8: MAC_PPPOE_IPV6_UDP_PAY_L3_SRC_ONLY_L4_SRC_ONLY\n+---------------------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV6_UDP_PAY_L3_SRC_ONLY_L4_SRC_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv6 / udp / end actions rss types ipv6-udp l3-src-only l4-src-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV6_UDP_PAY_L3_SRC_ONLY_L4_SRC_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv6 / udp / end actions rss types ipv6-udp l3-src-only l4-src-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV6_UDP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the fields [Source IP][Source Port], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=19,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=19,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/UDP(sport=25,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 9: MAC_PPPOE_IPV6_UDP_PAY_L3_SRC_ONLY_L4_DST_ONLY\n+---------------------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV6_UDP_PAY_L3_SRC_ONLY_L4_DST_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv6 / udp / end actions rss types ipv6-udp l3-src-only l4-dst-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV6_UDP_PAY_L3_SRC_ONLY_L4_DST_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv6 / udp / end actions rss types ipv6-udp l3-src-only l4-dst-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV6_UDP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the fields [Source IP][Dest Port], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/UDP(sport=19,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 10: MAC_PPPOE_IPV6_UDP_PAY_L3_DST_ONLY_L4_SRC_ONLY\n+----------------------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV6_UDP_PAY_L3_DST_ONLY_L4_SRC_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv6 / udp / end actions rss types ipv6-udp l3-dst-only l4-src-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV6_UDP_PAY_L3_DST_ONLY_L4_SRC_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv6 / udp / end actions rss types ipv6-udp l3-dst-only l4-src-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV6_UDP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the fields [Dest IP][Source Port], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=19,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/UDP(sport=19,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 11: MAC_PPPOE_IPV6_UDP_PAY_L3_DST_ONLY_L4_DST_ONLY\n+----------------------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV6_UDP_PAY_L3_DST_ONLY_L4_DST_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv6 / udp / end actions rss types ipv6-udp l3-dst-only l4-dst-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV6_UDP_PAY_L3_DST_ONLY_L4_DST_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv6 / udp / end actions rss types ipv6-udp l3-dst-only l4-dst-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV6_UDP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the fields [Dest IP][Dest Port], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/UDP(sport=25,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=19,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 12: MAC_PPPOE_IPV6_UDP_PAY_L3_SRC_ONLY_L3_DST_ONLY_L4_SRC_ONLY_L4_DST_ONLY\n+----------------------------------------------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV6_UDP_PAY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv6 / udp / end actions rss types ipv6-udp end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV6_UDP_PAY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv6 / udp / end actions rss types ipv6-udp end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV6_UDP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the fields [Source IP][Dest IP][Source Port][Dest Port], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2025\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=19,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2025\")/UDP(sport=19,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Test case: MAC_PPPOE_IPV6_TCP_PAY\n+=================================\n+\n+packets mismatched the pattern::\n+\n+  sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+  sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+  sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+Subcase 1: MAC_PPPOE_IPV6_TCP_PAY_L2_SRC_ONLY\n+---------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV6_TCP_PAY_L2_SRC_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv6 / tcp / end actions rss types eth l2-src-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV6_TCP_PAY_L2_SRC_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv6 / tcp / end actions rss types eth l2-src-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV6_TCP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Source MAC], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/TCP(sport=19,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 2: MAC_PPPOE_IPV6_TCP_PAY_L2_DST_ONLY\n+---------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV6_TCP_PAY_L2_DST_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv6 / tcp / end actions rss types eth l2-dst-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV6_TCP_PAY_L2_DST_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv6 / tcp / end actions rss types eth l2-dst-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV6_TCP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Dest MAC], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=7)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/TCP(sport=19,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 3: MAC_PPPOE_IPV6_TCP_PAY_L2_SRC_ONLY_L2_DST_ONLY\n+---------------------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV6_TCP_PAY_L2_SRC_ONLY_L2_DST_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv6 / tcp / end actions rss types eth end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV6_TCP_PAY_L2_SRC_ONLY_L2_DST_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv6 / tcp / end actions rss types eth end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV6_TCP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the fields [Source MAC][Dest MAC], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=7)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/TCP(sport=19,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 4: MAC_PPPOE_IPV6_TCP_PAY_L3_SRC_ONLY\n+---------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV6_TCP_PAY_L3_SRC_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv6 / tcp / end actions rss types ipv6-tcp l3-src-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV6_TCP_PAY_L3_SRC_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv6 / tcp / end actions rss types ipv6-tcp l3-src-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV6_TCP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Source IP], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/TCP(sport=19,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 5: MAC_PPPOE_IPV6_TCP_PAY_L3_DST_ONLY\n+---------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV6_TCP_PAY_L3_DST_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv6 / tcp / end actions rss types ipv6-tcp l3-dst-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV6_TCP_PAY_L3_DST_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv6 / tcp / end actions rss types ipv6-tcp l3-dst-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV6_TCP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Dest IP], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=19,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 6: MAC_PPPOE_IPV6_TCP_PAY_L4_SRC_ONLY\n+---------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV6_TCP_PAY_L4_SRC_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv6 / tcp / end actions rss types ipv6-tcp l4-src-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV6_TCP_PAY_L4_SRC_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv6 / tcp / end actions rss types ipv6-tcp l4-src-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV6_TCP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Source Port], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=19,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/TCP(sport=25,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 7: MAC_PPPOE_IPV6_TCP_PAY_L4_DST_ONLY\n+---------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV6_TCP_PAY_L4_DST_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv6 / tcp / end actions rss types ipv6-tcp l4-dst-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV6_TCP_PAY_L4_DST_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv6 / tcp / end actions rss types ipv6-tcp l4-dst-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV6_TCP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the field [Dest Port], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=25,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/TCP(sport=19,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 8: MAC_PPPOE_IPV6_TCP_PAY_L3_SRC_ONLY_L4_SRC_ONLY\n+---------------------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV6_TCP_PAY_L3_SRC_ONLY_L4_SRC_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv6 / tcp / end actions rss types ipv6-tcp l3-src-only l4-src-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV6_TCP_PAY_L3_SRC_ONLY_L4_SRC_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv6 / tcp / end actions rss types ipv6-tcp l3-src-only l4-src-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV6_TCP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the fields [Source IP][Source Port], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=19,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=19,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/TCP(sport=25,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 9: MAC_PPPOE_IPV6_TCP_PAY_L3_SRC_ONLY_L4_DST_ONLY\n+---------------------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV6_TCP_PAY_L3_SRC_ONLY_L4_DST_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv6 / tcp / end actions rss types ipv6-tcp l3-src-only l4-dst-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV6_TCP_PAY_L3_SRC_ONLY_L4_DST_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv6 / tcp / end actions rss types ipv6-tcp l3-src-only l4-dst-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV6_TCP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the fields [Source IP][Dest Port], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=25,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=25,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/TCP(sport=19,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 10: MAC_PPPOE_IPV6_TCP_PAY_L3_DST_ONLY_L4_SRC_ONLY\n+----------------------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV6_TCP_PAY_L3_DST_ONLY_L4_SRC_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv6 / tcp / end actions rss types ipv6-tcp l3-dst-only l4-src-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV6_TCP_PAY_L3_DST_ONLY_L4_SRC_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv6 / tcp / end actions rss types ipv6-tcp l3-dst-only l4-src-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV6_TCP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the fields [Dest IP][Source Port], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=19,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/TCP(sport=19,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=25,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 11: MAC_PPPOE_IPV6_TCP_PAY_L3_DST_ONLY_L4_DST_ONLY\n+----------------------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV6_TCP_PAY_L3_DST_ONLY_L4_DST_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv6 / tcp / end actions rss types ipv6-tcp l3-dst-only l4-dst-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV6_TCP_PAY_L3_DST_ONLY_L4_DST_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv6 / tcp / end actions rss types ipv6-tcp l3-dst-only l4-dst-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV6_TCP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the fields [Dest IP][Dest Port], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=25,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/TCP(sport=25,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=19,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Subcase 12: MAC_PPPOE_IPV6_TCP_PAY_L3_SRC_ONLY_L3_DST_ONLY_L4_SRC_ONLY_L4_DST_ONLY\n+----------------------------------------------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV6_TCP_PAY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv6 / tcp / end actions rss types ipv6-tcp end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV6_TCP_PAY::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv6 / tcp / end actions rss types ipv6-tcp end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV6_TCP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     change the fields [Source IP][Dest IP][Source Port][Dest Port], send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2025\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=19,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=25,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2025\")/TCP(sport=19,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern, check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Test case: MAC_VLAN_IPV4_PAY\n+============================\n+\n+1. validate a rule for RSS type of MAC_VLAN_IPV4_PAY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / vlan / ipv4 / end actions rss types c-vlan end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_VLAN_IPV4_PAY::\n+\n+     testpmd> flow create 0 ingress pattern eth / vlan / ipv4 / end actions rss types c-vlan end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_VLAN_IPV4_PAY packet::\n+\n+       sendp([Ether(src=\"10:22:33:44:55:66\", dst=\"00:11:22:33:44:55\",type=0x8100)/Dot1Q(vlan=1,type=0x0800)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     change the field [VLAN ID], send packets::\n+\n+       sendp([Ether(src=\"10:22:33:44:55:66\", dst=\"00:11:22:33:44:55\",type=0x8100)/Dot1Q(vlan=2,type=0x0800)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     check the hash value is different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"10:22:33:44:55:99\", dst=\"00:11:22:33:44:53\",type=0x8100)/Dot1Q(vlan=1,type=0x0800)/IP(src=\"192.168.1.3\", dst=\"192.168.1.4\")/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern::\n+\n+     sendp([Ether(src=\"10:22:33:44:55:66\", dst=\"00:11:22:33:44:55\",type=0x8100)/Dot1Q(vlan=1,type=0x86dd)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+  check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Test case: MAC_VLAN_IPV4_UDP_PAY\n+================================\n+\n+1. validate a rule for RSS type of MAC_VLAN_IPV4_UDP_PAY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / vlan / ipv4 / udp / end actions rss types c-vlan end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_VLAN_IPV4_UDP_PAY::\n+\n+     testpmd> flow create 0 ingress pattern eth / vlan / ipv4 / udp / end actions rss types c-vlan end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_VLAN_IPV4_UDP_PAY packet::\n+\n+       sendp([Ether(src=\"10:22:33:44:55:66\", dst=\"00:11:22:33:44:55\",type=0x8100)/Dot1Q(vlan=1,type=0x0800)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     change the field [VLAN ID], send packets::\n+\n+       sendp([Ether(src=\"10:22:33:44:55:66\", dst=\"00:11:22:33:44:55\",type=0x8100)/Dot1Q(vlan=2,type=0x0800)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"10:22:33:44:55:99\", dst=\"00:11:22:33:44:53\",type=0x8100)/Dot1Q(vlan=1,type=0x0800)/IP(src=\"192.168.1.3\", dst=\"192.168.1.4\")/UDP(sport=19,dport=99)/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     check the hash values are the same as as the first packet.\n+\n+4. send packets mismatched the pattern::\n+\n+     sendp([Ether(src=\"10:22:33:44:55:66\", dst=\"00:11:22:33:44:55\",type=0x8100)/Dot1Q(vlan=1,type=0x0800)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/TCP(sport=25,dport=23)/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+     sendp([Ether(src=\"10:22:33:44:55:66\", dst=\"00:11:22:33:44:55\",type=0x8100)/Dot1Q(vlan=1,type=0x86dd)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=23)/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+   check the hash values of the packets not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Test case: MAC_VLAN_IPV4_TCP_PAY\n+================================\n+\n+1. validate a rule for RSS type of MAC_VLAN_IPV4_TCP_PAY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / vlan / ipv4 / tcp / end actions rss types c-vlan end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_VLAN_IPV4_TCP_PAY::\n+\n+     testpmd> flow create 0 ingress pattern eth / vlan / ipv4 / tcp / end actions rss types c-vlan end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_VLAN_IPV4_TCP_PAY packet::\n+\n+       sendp([Ether(src=\"10:22:33:44:55:66\", dst=\"00:11:22:33:44:55\",type=0x8100)/Dot1Q(vlan=1,type=0x0800)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/TCP(sport=25,dport=23)/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     change the field [VLAN ID], send packets::\n+\n+       sendp([Ether(src=\"10:22:33:44:55:66\", dst=\"00:11:22:33:44:55\",type=0x8100)/Dot1Q(vlan=2,type=0x0800)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/TCP(sport=25,dport=23)/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"10:22:33:44:55:99\", dst=\"00:11:22:33:44:53\",type=0x8100)/Dot1Q(vlan=1,type=0x0800)/IP(src=\"192.168.1.3\", dst=\"192.168.1.4\")/TCP(sport=19,dport=99)/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     check the hash values are the same as as the first packet.\n+\n+4. send packets mismatched the pattern::\n+\n+     sendp([Ether(src=\"10:22:33:44:55:66\", dst=\"00:11:22:33:44:55\",type=0x8100)/Dot1Q(vlan=1,type=0x0800)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+     sendp([Ether(src=\"10:22:33:44:55:66\", dst=\"00:11:22:33:44:55\",type=0x8100)/Dot1Q(vlan=1,type=0x86dd)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=25,dport=23)/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+   check the hash values of the packets not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Test case: MAC_VLAN_IPV4_SCTP_PAY\n+=================================\n+\n+1. validate a rule for RSS type of MAC_VLAN_IPV4_SCTP_PAY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / vlan / ipv4 / sctp / end actions rss types c-vlan end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_VLAN_IPV4_SCTP_PAY::\n+\n+     testpmd> flow create 0 ingress pattern eth / vlan / ipv4 / sctp / end actions rss types c-vlan end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_VLAN_IPV4_SCTP_PAY packet::\n+\n+       sendp([Ether(src=\"10:22:33:44:55:66\", dst=\"00:11:22:33:44:55\",type=0x8100)/Dot1Q(vlan=1,type=0x0800)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/SCTP(sport=25,dport=23)/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     change the field [VLAN ID], send packets::\n+\n+       sendp([Ether(src=\"10:22:33:44:55:66\", dst=\"00:11:22:33:44:55\",type=0x8100)/Dot1Q(vlan=2,type=0x0800)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/SCTP(sport=25,dport=23)/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"10:22:33:44:55:99\", dst=\"00:11:22:33:44:53\",type=0x8100)/Dot1Q(vlan=1,type=0x0800)/IP(src=\"192.168.1.3\", dst=\"192.168.1.5\")/SCTP(sport=19,dport=99)/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     check the hash values are the same as as the first packet.\n+\n+4. send packets mismatched the pattern::\n+\n+     sendp([Ether(src=\"10:22:33:44:55:66\", dst=\"00:11:22:33:44:55\",type=0x8100)/Dot1Q(vlan=1,type=0x0800)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+     sendp([Ether(src=\"10:22:33:44:55:66\", dst=\"00:11:22:33:44:55\",type=0x8100)/Dot1Q(vlan=1,type=0x86dd)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/SCTP(sport=25,dport=23)/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+   check the hash values of the packets not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Test case: MAC_VLAN_IPV6_PAY\n+============================\n+\n+1. validate a rule for RSS type of MAC_VLAN_IPV6_PAY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / vlan / ipv6 / end actions rss types c-vlan end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_VLAN_IPV6_PAY::\n+\n+     testpmd> flow create 0 ingress pattern eth / vlan / ipv6 / end actions rss types c-vlan end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_VLAN_IPV6_PAY packet::\n+\n+       sendp([Ether(src=\"10:22:33:44:55:66\", dst=\"00:11:22:33:44:55\",type=0x8100)/Dot1Q(vlan=1,type=0x86dd)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     change the field [VLAN ID], send packets::\n+\n+       sendp([Ether(src=\"10:22:33:44:55:66\", dst=\"00:11:22:33:44:55\",type=0x8100)/Dot1Q(vlan=2,type=0x86dd)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"10:22:33:44:55:99\", dst=\"00:11:22:33:44:53\",type=0x8100)/Dot1Q(vlan=1,type=0x86dd)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/Raw(\"y\" * 80)],iface=\"ens786f0\",count=1)\n+\n+   check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern::\n+\n+     sendp([Ether(src=\"10:22:33:44:55:66\", dst=\"00:11:22:33:44:55\",type=0x8100)/Dot1Q(vlan=1,type=0x0800)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+  check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Test case: MAC_VLAN_IPV6_UDP_PAY\n+================================\n+\n+1. validate a rule for RSS type of MAC_VLAN_IPV6_UDP_PAY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / vlan / ipv6 / udp / end actions rss types c-vlan end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_VLAN_IPV6_UDP_PAY::\n+\n+     testpmd> flow create 0 ingress pattern eth / vlan / ipv6 / udp / end actions rss types c-vlan end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_VLAN_IPV6_UDP_PAY packet::\n+\n+       sendp([Ether(src=\"10:22:33:44:55:66\", dst=\"00:11:22:33:44:55\",type=0x8100)/Dot1Q(vlan=1,type=0x86dd)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=23)/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     change the field [VLAN ID], send packets::\n+\n+       sendp([Ether(src=\"10:22:33:44:55:66\", dst=\"00:11:22:33:44:55\",type=0x8100)/Dot1Q(vlan=2,type=0x86dd)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=23)/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"10:22:33:44:55:99\", dst=\"00:11:22:33:44:53\",type=0x8100)/Dot1Q(vlan=1,type=0x86dd)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/UDP(sport=23,dport=99)/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern::\n+\n+     sendp([Ether(src=\"10:22:33:44:55:66\", dst=\"00:11:22:33:44:55\",type=0x8100)/Dot1Q(vlan=1,type=0x0800)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+     sendp([Ether(src=\"10:22:33:44:55:66\", dst=\"00:11:22:33:44:55\",type=0x8100)/Dot1Q(vlan=1,type=0x86dd)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=25,dport=23)/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+  check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Test case: MAC_VLAN_IPV6_TCP_PAY\n+================================\n+\n+1. validate a rule for RSS type of MAC_VLAN_IPV6_TCP_PAY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / vlan / ipv6 / tcp / end actions rss types c-vlan end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_VLAN_IPV6_TCP_PAY::\n+\n+     testpmd> flow create 0 ingress pattern eth / vlan / ipv6 / tcp / end actions rss types c-vlan end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_VLAN_IPV6_TCP_PAY packet::\n+\n+       sendp([Ether(src=\"10:22:33:44:55:66\", dst=\"00:11:22:33:44:55\",type=0x8100)/Dot1Q(vlan=1,type=0x86dd)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=25,dport=23)/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     change the field [VLAN ID], send packets::\n+\n+       sendp([Ether(src=\"10:22:33:44:55:66\", dst=\"00:11:22:33:44:55\",type=0x8100)/Dot1Q(vlan=2,type=0x86dd)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=25,dport=23)/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"10:22:33:44:55:99\", dst=\"00:11:22:33:44:53\",type=0x8100)/Dot1Q(vlan=1,type=0x86dd)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/TCP(sport=19,dport=99)/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern::\n+\n+     sendp([Ether(src=\"10:22:33:44:55:66\", dst=\"00:11:22:33:44:55\",type=0x8100)/Dot1Q(vlan=1,type=0x0800)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/TCP(sport=25,dport=23)/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+     sendp([Ether(src=\"10:22:33:44:55:66\", dst=\"00:11:22:33:44:55\",type=0x8100)/Dot1Q(vlan=1,type=0x86dd)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=23)/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+  check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists.\n+   send the matched packets, check the hash values of the packets are not exist.\n+\n+Test case: MAC_VLAN_IPV6_SCTP_PAY\n+=================================\n+\n+1. validate a rule for RSS type of MAC_VLAN_IPV6_SCTP_PAY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / vlan / ipv6 / sctp / end actions rss types c-vlan end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_VLAN_IPV6_SCTP_PAY::\n+\n+     testpmd> flow create 0 ingress pattern eth / vlan / ipv6 / sctp / end actions rss types c-vlan end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_VLAN_IPV6_SCTP_PAY packet::\n+\n+       sendp([Ether(src=\"10:22:33:44:55:66\", dst=\"00:11:22:33:44:55\",type=0x8100)/Dot1Q(vlan=1,type=0x86dd)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/SCTP(sport=25,dport=23)/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     change the field [VLAN ID], send packets::\n+\n+       sendp([Ether(src=\"10:22:33:44:55:66\", dst=\"00:11:22:33:44:55\",type=0x8100)/Dot1Q(vlan=2,type=0x86dd)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/SCTP(sport=25,dport=23)/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     check the hash values are different from the first packet.\n+     change other fields, send packets::\n+\n+       sendp([Ether(src=\"10:22:33:44:55:99\", dst=\"00:11:22:33:44:53\",type=0x8100)/Dot1Q(vlan=1,type=0x86dd)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1537\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2023\")/SCTP(sport=25,dport=99)/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+     check the hash values are the same as the first packet.\n+\n+4. send packets mismatched the pattern::\n+\n+     sendp([Ether(src=\"10:22:33:44:55:66\", dst=\"00:11:22:33:44:55\",type=0x8100)/Dot1Q(vlan=1,type=0x0800)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/SCTP(sport=25,dport=23)/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+     sendp([Ether(src=\"10:22:33:44:55:66\", dst=\"00:11:22:33:44:55\",type=0x8100)/Dot1Q(vlan=1,type=0x86dd)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=23)/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+  check the hash values not exist.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists.\n+   send the matched packets, check the hash values the packets are not exist.\n+\n+Test case: MAC_VLAN_PPPOE_PAY (not supported in 20.08)\n+======================================================\n+\n+Subcase 1: MAC_VLAN_PPPOE_PAY_L2_SRC_ONLY\n+-----------------------------------------\n+\n+1. validate a rule for RSS type of MAC_VLAN_PPPOE_PAY_L2_SRC_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / vlan / pppoes / end actions rss types eth l2-src-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_VLAN_PPPOE_PAY_L2_SRC_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / vlan / pppoes / end actions rss types eth l2-src-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send a MAC_VLAN_PPPOE_PAY_L2_SRC_ONLY packet::\n+\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/Dot1Q(vlan=1,type=0x8864)/PPPoE(sessionid=3)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   get the hash value\n+   change the field [Source MAC], send a packet::\n+\n+     sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:66\")/Dot1Q(vlan=1,type=0x8864)/PPPoE(sessionid=3)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   get the hash value\n+   check the hash value is different from the first packet.\n+   change other fields, send packets::\n+\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:99\")/Dot1Q(vlan=1,type=0x8864)/PPPoE(sessionid=3)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/Dot1Q(vlan=2,type=0x8864)/PPPoE(sessionid=3)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/Dot1Q(vlan=1,type=0x8864)/PPPoE(sessionid=7)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   check the hash values are the same as the first packet.\n+\n+4. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the MAC_VLAN_PPPOE_PAY_L2_SRC_ONLY packet, and change the field [Source MAC],\n+   send the packet, check the hash values of the packets are not exist.\n+\n+Subcase 2: MAC_VLAN_PPPOE_PAY_L2_DST_ONLY\n+-----------------------------------------\n+\n+1. validate a rule for RSS type of MAC_VLAN_PPPOE_PAY_L2_DST_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / vlan / pppoes / end actions rss types eth l2-dst-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_VLAN_PPPOE_PAY_L2_DST_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / vlan / pppoes / end actions rss types eth l2-dst-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send a MAC_VLAN_PPPOE_PAY_L2_DST_ONLY packet::\n+\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/Dot1Q(vlan=1,type=0x8864)/PPPoE(sessionid=3)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   get the hash value\n+   change the field [Dest MAC], send a packet::\n+\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:99\")/Dot1Q(vlan=1,type=0x8864)/PPPoE(sessionid=3)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   get the hash value\n+   check the hash value is different from the first packet.\n+   change other fields, send packets::\n+\n+     sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:66\")/Dot1Q(vlan=1,type=0x8864)/PPPoE(sessionid=3)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/Dot1Q(vlan=2,type=0x8864)/PPPoE(sessionid=3)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/Dot1Q(vlan=1,type=0x8864)/PPPoE(sessionid=7)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   check the hash values are the same as the first packet.\n+\n+4. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the MAC_VLAN_PPPOE_PAY_L2_DST_ONLY packet, and change the field [Dest MAC],\n+   send the packet, check the hash values of the packets are not exist.\n+\n+Subcase 3: MAC_VLAN_PPPOE_PAY_L2_SRC_ONLY_L2_DST_ONLY\n+-----------------------------------------------------\n+\n+1. validate a rule for RSS type of MAC_VLAN_PPPOE_PAY_L2_SRC_ONLY_L2_DST_ONLY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / vlan / pppoes / end actions rss types eth l2-src-only l2-dst-only end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_VLAN_PPPOE_PAY_L2_SRC_ONLY_L2_DST_ONLY::\n+\n+     testpmd> flow create 0 ingress pattern eth / vlan / pppoes / end actions rss types eth l2-src-only l2-dst-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send a MAC_VLAN_PPPOE_PAY_L2_SRC_ONLY_L2_DST_ONLY packet::\n+\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/Dot1Q(vlan=1,type=0x8864)/PPPoE(sessionid=3)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   get the hash value\n+   change the fields [Source MAC][Dest MAC], send a packet::\n+\n+     sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:66\")/Dot1Q(vlan=1,type=0x8864)/PPPoE(sessionid=3)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:99\")/Dot1Q(vlan=1,type=0x8864)/PPPoE(sessionid=3)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+     sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/Dot1Q(vlan=1,type=0x8864)/PPPoE(sessionid=3)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   get the hash value\n+   check the hash value is different from the first packet.\n+   change other fields, send packets::\n+\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/Dot1Q(vlan=2,type=0x8864)/PPPoE(sessionid=3)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/Dot1Q(vlan=1,type=0x8864)/PPPoE(sessionid=7)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   check the hash values are the same as the first packet.\n+\n+4. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the MAC_VLAN_PPPOE_PAY_L2_SRC_ONLY_L2_DST_ONLY packet,\n+   and change the field [Source MAC][Dest MAC], send the packet,\n+   check the hash values of the packets are not exist.\n+\n+Subcase 4: MAC_VLAN_PPPOE_PAY_C_VLAN\n+------------------------------------\n+\n+1. validate a rule for RSS type of MAC_VLAN_PPPOE_PAY::\n+\n+     testpmd> flow validate 0 ingress pattern eth / vlan / pppoes / end actions rss types c-vlan end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_VLAN_PPPOE_PAY::\n+\n+     testpmd> flow create 0 ingress pattern eth / vlan / pppoes / end actions rss types c-vlan end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send a MAC_VLAN_PPPOE_PAY packet::\n+\n+     sendp([Ether(src=\"10:22:33:44:55:66\", dst=\"00:11:22:33:44:55\",type=0x8100)/Dot1Q(vlan=1,type=0x8864)/PPPoE(sessionid=3)/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+   get the hash value\n+   change the field [VLAN ID], send packets::\n+\n+     sendp([Ether(src=\"10:22:33:44:55:66\", dst=\"00:11:22:33:44:55\",type=0x8100)/Dot1Q(vlan=2,type=0x8864)/PPPoE(sessionid=3)/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+   check the hash values are different from the first packet.\n+   change other fields, send packets::\n+\n+     sendp([Ether(src=\"10:22:33:44:55:99\", dst=\"00:11:22:33:44:55\",type=0x8100)/Dot1Q(vlan=1,type=0x8864)/PPPoE(sessionid=3)/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+     sendp([Ether(src=\"10:22:33:44:55:66\", dst=\"00:11:22:33:44:53\",type=0x8100)/Dot1Q(vlan=1,type=0x8864)/PPPoE(sessionid=3)/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+     sendp([Ether(src=\"10:22:33:44:55:66\", dst=\"00:11:22:33:44:55\",type=0x8100)/Dot1Q(vlan=1,type=0x8864)/PPPoE(sessionid=7)/Raw(\"x\" * 80)],iface=\"ens786f0\",count=1)\n+\n+   check the hash values are the same as as the first packet.\n+\n+4. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   send the MAC_VLAN_PPPOE_PAY packet, and change the field\n+   [VLAN ID], send the packet, check the hash values are not\n+   changed.\n+\n+Test case: MAC_PPPOE_IPV4_PAY_symmetric\n+=======================================\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV4_PAY_symmetric::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv4 / end actions rss func symmetric_toeplitz types ipv4 end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV4_PAY_symmetric::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / end actions rss func symmetric_toeplitz types ipv4 end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV4_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\",dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     swap the values of [Source IP] and [Dest IP], send the packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\",dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.2\", dst=\"192.168.1.1\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash value is not changed.\n+\n+  * MAC_PPPOE_IPV4_FRAG packet::\n+\n+      sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\", frag=5)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+    swap the values of [Source IP] and [Dest IP], send the packet::\n+\n+      sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.2\", dst=\"192.168.1.1\", frag=5)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+    check the hash value is not changed.\n+\n+4. send packets mismatched the rule, and swap the [Source IP] and [Dest IP]\n+\n+   * MAC_PPPOE_IPV6_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:2022\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:1536\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values of the two packets are different.\n+\n+   * MAC_PPPOE_IPV6_FRAG packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/IPv6ExtHdrFragment()/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:2022\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:1536\")/IPv6ExtHdrFragment()/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values of the two packets are different.\n+\n+   * MAC_IPV4_PAY packet::\n+\n+       sendp([Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.20\",dst=\"192.168.0.21\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.21\",dst=\"192.168.0.20\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values of the two packets are different.\n+\n+   * MAC_IPV4_FRAG packet::\n+\n+       sendp([Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.20\",dst=\"192.168.0.21\", frag=5)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.21\",dst=\"192.168.0.20\", frag=5)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values of the two packets are different.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   repeat step 3, check the hash values not exist.\n+\n+Test case: MAC_PPPOE_IPV4_UDP_PAY_symmetric\n+===========================================\n+\n+1. turn on default RSS configure to make mismatched packets have hash values::\n+\n+     testpmd> port config all rss all\n+\n+2. validate a rule for RSS type of MAC_PPPOE_IPV4_UDP_PAY_symmetric::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv4 / udp / end actions rss func symmetric_toeplitz types ipv4-udp end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+3. create a rule for RSS type of MAC_PPPOE_IPV4_UDP_PAY_symmetric::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / udp / end actions rss func symmetric_toeplitz types ipv4-udp end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+4. send matched packets\n+\n+   * MAC_PPPOE_IPV4_UDP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     swap the values of [Source IP] and [Dest IP], send the packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.2\", dst=\"192.168.1.1\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash value is not changed.\n+     swap the values of [Source Port] and [Dest Port], send the packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=23,dport=25)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash value is not changed.\n+     swap the values of [Source IP] and [Dest IP], [Source Port] and [Dest Port], send the packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.2\", dst=\"192.168.1.1\")/UDP(sport=23,dport=25)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash value is not changed.\n+\n+5. send packets mismatched the rule, and swap the values of [Source IP] and [Dest IP], [Source Port] and [Dest Port]\n+\n+   * MAC_PPPOE_IPV4_TCP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.2\", dst=\"192.168.1.1\")/TCP(sport=19,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/TCP(sport=23,dport=19)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values of the two packets are different.\n+\n+   * MAC_PPPOE_IPV6_UDP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:2022\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:1536\")/UDP(sport=23,dport=25)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values of the two packets are different.\n+\n+    * MAC_PPPOE_IPV4_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.2\", dst=\"192.168.1.1\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values of the two packets are different.\n+\n+   * MAC_IPV4_UDP_PAY packet::\n+\n+       sendp([Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.20\",dst=\"192.168.0.21\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.21\",dst=\"192.168.0.20\")/UDP(sport=23,dport=25)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values of the two packets are different.\n+\n+6. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   repeat step 4, swap the values of [Source IP] and [Dest IP], [Source Port] and [Dest Port],\n+   check the hash value is changed.\n+\n+Test case: MAC_PPPOE_IPV4_TCP_PAY_symmetric\n+===========================================\n+\n+1. turn on default RSS configure to make mismatched packets have hash values::\n+\n+     testpmd> port config all rss all\n+\n+2. validate a rule for RSS type of MAC_PPPOE_IPV4_TCP_PAY_symmetric::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv4 / tcp / end actions rss func symmetric_toeplitz types ipv4-tcp end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+3. create a rule for RSS type of MAC_PPPOE_IPV4_TCP_PAY_symmetric::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / tcp / end actions rss func symmetric_toeplitz types ipv4-tcp end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+4. send matched packets\n+\n+   * MAC_PPPOE_IPV4_TCP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     swap the values of [Source IP] and [Dest IP], send the packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.2\", dst=\"192.168.1.1\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash value is not changed.\n+     swap the values of [Source Port] and [Dest Port], send the packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/TCP(sport=23,dport=25)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash value is not changed.\n+     swap the values of [Source IP] and [Dest IP], [Source Port] and [Dest Port], send the packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.2\", dst=\"192.168.1.1\")/TCP(sport=23,dport=25)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash value is not changed.\n+\n+5. send packets mismatched the rule, and swap the values of [Source IP] and [Dest IP], [Source Port] and [Dest Port]\n+\n+   * MAC_PPPOE_IPV4_UDP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.2\", dst=\"192.168.1.1\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=23,dport=25)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values of the two packets are different.\n+\n+   * MAC_PPPOE_IPV6_TCP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:2022\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:1536\")/TCP(sport=23,dport=25)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values of the two packets are different.\n+\n+    * MAC_PPPOE_IPV4_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.2\", dst=\"192.168.1.1\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values of the two packets are different.\n+\n+   * MAC_IPV4_TCP_PAY packet::\n+\n+       sendp([Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.20\",dst=\"192.168.0.21\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(dst=\"00:11:22:33:44:55\")/IP(src=\"192.168.0.21\",dst=\"192.168.0.20\")/TCP(sport=23,dport=25)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values of the two packets are different.\n+\n+6. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   repeat step 3, swap the values of [Source IP] and [Dest IP], [Source Port] and [Dest Port],\n+   check the hash value is changed.\n+\n+Test case: MAC_PPPOE_IPV6_PAY_symmetric\n+=======================================\n+\n+1. validate a rule for RSS type of MAC_PPPOE_IPV6_PAY_symmetric::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv6 / end actions rss func symmetric_toeplitz types ipv6 end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a rule for RSS type of MAC_PPPOE_IPV6_PAY_symmetric::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv6 / end actions rss func symmetric_toeplitz types ipv6 end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send matched packets\n+\n+   * MAC_PPPOE_IPV6_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     swap the values of [Source IP] and [Dest IP], send the packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:2022\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:1536\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash value is not changed.\n+\n+   * MAC_PPPOE_IPV6_FRAG packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/IPv6ExtHdrFragment()/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     swap the values of [Source IP] and [Dest IP], send the packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:2022\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:1536\")/IPv6ExtHdrFragment()/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash value is not changed.\n+\n+4. send packets mismatched the rule, and swap the values of [Source IP] and [Dest IP]\n+\n+   * MAC_PPPOE_IPV4_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.2\", dst=\"192.168.1.1\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values of the two packets are different.\n+\n+   * MAC_PPPOE_IPV4_FRAG packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\", frag=5)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.2\", dst=\"192.168.1.1\", frag=5)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values of the two packets are different.\n+\n+   * MAC_IPV6_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:2022\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:1536\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values of the two packets are different.\n+\n+   * MAC_IPV6_FRAG packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/IPv6ExtHdrFragment()/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:2022\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:1536\")/IPv6ExtHdrFragment()/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values of the two packets are different.\n+\n+5. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   repeat step 3, check the hash values not exist.\n+\n+Test case: MAC_PPPOE_IPV6_UDP_PAY_symmetric\n+===========================================\n+\n+1. turn on default RSS configure to make mismatched packets have hash values::\n+\n+     testpmd> port config all rss all\n+\n+2. validate a rule for RSS type of MAC_PPPOE_IPV6_UDP_PAY_symmetric::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv6 / udp / end actions rss func symmetric_toeplitz types ipv6-udp end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+3. create a rule for RSS type of MAC_PPPOE_IPV6_UDP_PAY_symmetric::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv6 / udp / end actions rss func symmetric_toeplitz types ipv6-udp end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+4. send matched packets\n+\n+   * MAC_PPPOE_IPV6_UDP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     swap the values of [Source IP] and [Dest IP], send the packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:2022\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:1536\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash value is not changed.\n+     swap the values of [Source Port] and [Dest Port], send the packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=23,dport=25)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash value is not changed.\n+     swap the values of [Source IP] and [Dest IP], [Source Port] and [Dest Port], send the packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:2022\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:1536\")/UDP(sport=23,dport=25)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash value is not changed.\n+\n+5. send packets mismatched the rule, and swap the values of [Source IP] and [Dest IP], [Source Port] and [Dest Port]\n+\n+   * MAC_PPPOE_IPV4_UDP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.2\", dst=\"192.168.1.1\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=23,dport=25)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values of the two packets are different.\n+\n+   * MAC_PPPOE_IPV6_TCP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:2022\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:1536\")/TCP(sport=23,dport=25)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values of the two packets are different.\n+\n+   * MAC_PPPOE_IPV6_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:2022\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:1536\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values of the two packets are different.\n+\n+   * MAC_IPV6_UDP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:2022\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:1536\")/UDP(sport=23,dport=25)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values of the two packets are different.\n+\n+6. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   repeat step 3, swap the values of [Source IP] and [Dest IP], [Source Port] and [Dest Port],\n+   check the hash values are changed.\n+\n+Test case: MAC_PPPOE_IPV6_TCP_PAY_symmetric\n+===========================================\n+\n+1. turn on default RSS configure to make mismatched packets have hash values::\n+\n+     testpmd> port config all rss all\n+\n+2. validate a rule for RSS type of MAC_PPPOE_IPV6_TCP_PAY_symmetric::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv6 / tcp / end actions rss func symmetric_toeplitz types ipv6-tcp end key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+3. create a rule for RSS type of MAC_PPPOE_IPV6_TCP_PAY_symmetric::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv6 / tcp / end actions rss func symmetric_toeplitz types ipv6-tcp end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+4. send matched packets\n+\n+   * MAC_PPPOE_IPV6_TCP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     swap the values of [Source IP] and [Dest IP], send the packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:2022\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:1536\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash value is not changed.\n+     swap the values of [Source Port] and [Dest Port], send the packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=23,dport=25)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash value is not changed.\n+     swap the values of [Source IP] and [Dest IP], [Source Port] and [Dest Port], send the packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:2022\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:1536\")/TCP(sport=23,dport=25)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash value is not changed.\n+\n+5. send packets mismatched the rule, and swap the values of [Source IP] and [Dest IP], [Source Port] and [Dest Port]\n+\n+   * MAC_PPPOE_IPV4_TCP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.2\", dst=\"192.168.1.1\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/TCP(sport=23,dport=25)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values of the two packets are different.\n+\n+   * MAC_PPPOE_IPV6_UDP_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:2022\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:1536\")/UDP(sport=23,dport=25)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values of the two packets are different.\n+\n+   * MAC_PPPOE_IPV6_PAY packet::\n+\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+       sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:2022\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:1536\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values of the two packets are different.\n+\n+   * MAC_IPV6_TCP_PAY packet::\n+\n+      sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+      sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:2022\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:1536\")/TCP(sport=23,dport=25)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+    check the hash values of the two packets are different.\n+\n+6. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   repeat step 3, swap the values of [Source IP] and [Dest IP], [Source Port] and [Dest Port],\n+   check the hash values are changed.\n+\n+Test case: simple_xor\n+=====================\n+\n+1. validate a simple_xor rule::\n+\n+     testpmd> flow validate 0 ingress pattern end actions rss func simple_xor key_len 0 queues end / end\n+\n+   get the message::\n+\n+     Flow rule validated\n+\n+   check the flow list::\n+\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+\n+2. create a simple_xor rule::\n+\n+     testpmd> flow create 0 ingress pattern end actions rss func simple_xor key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+3. send packets, and swap the values of [Source IP] and [Dest IP]\n+\n+   * MAC_PPPOE_IPV4_PAY packet::\n+\n+      sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.2\", dst=\"192.168.1.1\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+      sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   check the hash values of the two packets are the same.\n+\n+   * MAC_PPPOE_IPV4_UDP_PAY packet::\n+\n+      sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+      sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.2\", dst=\"192.168.1.1\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   check the hash values of the two packets are the same.\n+\n+   * MAC_PPPOE_IPV4_TCP_PAY packet::\n+\n+      sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+      sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.2\", dst=\"192.168.1.1\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   check the hash values of the two packets are the same.\n+\n+   * MAC_PPPOE_IPV6_PAY packet::\n+\n+      sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+      sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:2022\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:1536\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values of the two packets are the same.\n+\n+   * MAC_PPPOE_IPV6_UDP_PAY packet::\n+\n+      sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+      sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:2022\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:1536\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+     check the hash values of the two packets are the same.\n+\n+   * MAC_PPPOE_IPV6_TCP_PAY packet::\n+\n+      sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:1536\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:2022\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+      sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0057)/IPv6(src=\"CDCD:910A:2222:5498:8475:1111:3900:2022\", dst=\"CDCD:910A:2222:5498:8475:1111:3900:1536\")/TCP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   check the hash values of the two packets are the same.\n+\n+4. destroy the rule::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule not exists in the list.\n+   repeat step 3, check the hash values are changed.\n+\n+Test Case: multirules test\n+==========================\n+\n+Subcase 1: two rules with same pattern but different hash input set, not hit default profile\n+--------------------------------------------------------------------------------------------\n+\n+1. create a MAC_PPPOE_IPV4_UDP_PAY_L3_SRC_ONLY rule::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / udp / end actions rss types ipv4-udp l3-src-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+2. send a MAC_PPPOE_IPV4_UDP_PAY packet::\n+\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   change the field [Source IP], send a packet::\n+\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   check the hash value is different from the first packet.\n+\n+3. create a rule with same pattern but different hash input set::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / udp / end actions rss types ipv4-udp l3-dst-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+4. send a MAC_PPPOE_IPV4_UDP_PAY packet::\n+\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   change the field [Source IP], send a packet::\n+\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   check the hash value is the same as the first packet.\n+   change the field [Dest IP], send a packet::\n+\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.7\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   check the hash value is different from the first packet.\n+\n+5. destroy the rule 1::\n+\n+     testpmd> flow destroy 0 rule 1\n+     testpmd> flow list 0\n+\n+   check the rule 1 not exists in the list.\n+   send a MAC_PPPOE_IPV4_UDP_PAY packet, hit default pppoe_ipv4 profile::\n+\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   change the fields [Source IP][Dest IP], send a packet::\n+\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.7\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.7\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   check the hash values are different from the first packet.\n+   destroy the rule 0::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule 0 not exists in the list.\n+   send a MAC_PPPOE_IPV4_UDP_PAY packet, hit default pppoe_ipv4 profile::\n+\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   change the fields [Source IP][Dest IP], send a packet::\n+\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.7\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.7\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   check the hash values are different from the first packet.\n+\n+Subcase 2: two rules with same pattern but different hash input set, hit default profile\n+----------------------------------------------------------------------------------------\n+\n+1. create a MAC_PPPOE_IPV4_PAY_L3_SRC_ONLY rule::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / end actions rss types ipv4 l3-src-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+2. send a MAC_PPPOE_IPV4_PAY packet::\n+\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   change the field [Source IP], send a packet::\n+\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.2\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   check the hash value is different from the first packet.\n+   change the field [Dest IP], send a packet::\n+\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.5\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   check the hash value is the same as the first packet.\n+\n+3. create a rule with same pattern but different hash input set::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / end actions rss types ipv4 l3-dst-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+4. send a MAC_PPPOE_IPV4_PAY packet::\n+\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   change the field [Source IP], send a packet::\n+\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.2\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   check the hash value is the same as the first packet.\n+   change the field [Dest IP], send a packet::\n+\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.7\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   check the hash value is different from the first packet.\n+\n+5. destroy the rule 1::\n+\n+     testpmd> flow destroy 0 rule 1\n+     testpmd> flow list 0\n+\n+   check the rule 1 not exists in the list.\n+   send the MAC_PPPOE_IPV4_PAY packet::\n+\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   check the hash value not exists.\n+   destroy the rule 0::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   check the rule 0 not exists in the list.\n+   send the MAC_PPPOE_IPV4_PAY packet, check the hash value not exists.\n+\n+Subcase 3: two rules, scope smaller created first, and the larger one created later\n+-----------------------------------------------------------------------------------\n+\n+1. create a MAC_PPPOE_IPV4_UDP_PAY_L4_SRC_ONLY rule::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / udp / end actions rss types ipv4-udp l4-src-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+2. send a MAC_PPPOE_IPV4_UDP_PAY packet::\n+\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   change the field [Source Port], send a packet::\n+\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=19,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   check the hash value is different from the first packet.\n+   change other fields, send a packet::\n+\n+     sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.5\")/UDP(sport=25,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   check the hash value is the same as the first packet.\n+\n+3. create a MAC_PPPOE_IPV4_PAY_L3_SRC_ONLY rule::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / end actions rss types ipv4 l3-src-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+4. send a MAC_PPPOE_IPV4_UDP_PAY packet::\n+\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   change the field [Source IP], send a packet::\n+\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   check the hash value is different from the first packet.\n+   change other fields, send a packet::\n+\n+     sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.5\")/UDP(sport=19,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   check the hash value is the same as the first packet.\n+\n+5. destroy the rule 1::\n+\n+     testpmd> flow destroy 0 rule 1\n+     testpmd> flow list 0\n+\n+   check the rule 1 not exists in the list.\n+   repeat step 2, get the same result.\n+   destroy the rule 0::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   send a MAC_PPPOE_IPV4_UDP_PAY packet, check the hash values not exists.\n+\n+Subcase 4: two rules, scope larger created first, and the smaller one created later\n+-----------------------------------------------------------------------------------\n+\n+1. create a MAC_PPPOE_IPV4_PAY_L3_SRC_ONLY rule::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / end actions rss types ipv4 l3-src-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+2. send a MAC_PPPOE_IPV4_UDP_PAY packet::\n+\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   change the field [Source IP], send a packet::\n+\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   check the hash value is different from the first packet.\n+   change other fields, send a packet::\n+\n+     sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.5\")/UDP(sport=19,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   check the hash value is the same as the first packet.\n+\n+3. create a MAC_PPPOE_IPV4_UDP_PAY_L4_SRC_ONLY rule::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / udp / end actions rss types ipv4-udp l4-src-only end key_len 0 queues end / end\n+     testpmd> flow list 0\n+\n+   check the rule exists in the list.\n+\n+4. send a MAC_PPPOE_IPV4_UDP_PAY packet::\n+\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=25,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   change the field [Source Port], send a packet::\n+\n+     sendp([Ether(src=\"00:11:22:33:44:55\", dst=\"10:22:33:44:55:66\")/PPPoE(sessionid=3)/PPP(proto=0x0021)/IP(src=\"192.168.1.1\", dst=\"192.168.1.2\")/UDP(sport=19,dport=23)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   check the hash value is different from the first packet.\n+   change other fields, send a packet::\n+\n+     sendp([Ether(src=\"00:11:22:33:44:53\", dst=\"10:22:33:44:55:99\")/PPPoE(sessionid=7)/PPP(proto=0x0021)/IP(src=\"192.168.1.3\", dst=\"192.168.1.5\")/UDP(sport=25,dport=99)/Raw(\"x\"*80)],iface=\"ens786f0\")\n+\n+   check the hash value is the same as the first packet.\n+\n+5. destroy the rule 1::\n+\n+     testpmd> flow destroy 0 rule 1\n+     testpmd> flow list 0\n+\n+   check the rule 1 not exists in the list.\n+   repeat step 2, hit pppoe_ipv4 profile, get the same result.\n+   destroy the rule 0::\n+\n+     testpmd> flow destroy 0 rule 0\n+     testpmd> flow list 0\n+\n+   send a MAC_PPPOE_IPV4_UDP_PAY packet, check the hash values not exists.\n+\n+Test case: negative cases\n+=========================\n+\n+Subcase 1: wrong hash input set\n+-------------------------------\n+\n+1. validate a rule with wrong input set::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv4 / end actions rss types l2-src-only l2-dst-only end key_len 0 queues end / end\n+\n+   get the error message::\n+\n+     Invalid input set: Invalid argument\n+\n+   create a rule with wrong hash input set::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / end actions rss types l2-src-only l2-dst-only end key_len 0 queues end / end\n+\n+   Failed to create flow, report error message::\n+\n+     Invalid input set: Invalid argument\n+\n+2. validate a rule with wrong hash type::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv4 / udp / end actions rss types ipv4-tcp end key_len 0 queues end / end\n+\n+   get the error message::\n+\n+     Invalid input set: Invalid argument\n+\n+   create a rule with wrong hash type::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / udp / end actions rss types ipv4-tcp end key_len 0 queues end / end\n+\n+   Failed to create flow, report error message::\n+\n+     Invalid input set: Invalid argument\n+\n+3. validate a rule with wrong symmetric hash input set::\n+\n+     testpmd> flow validate 0 ingress pattern eth / pppoes / ipv4 / udp / end actions rss func symmetric_toeplitz types ipv4-udp l3-src-only end key_len 0 queues end / end\n+\n+   get the error message::\n+\n+     Invalid input set: Invalid argument\n+\n+   create a rule with wrong symmetric hash input set::\n+\n+     testpmd> flow create 0 ingress pattern eth / pppoes / ipv4 / udp / end actions rss func symmetric_toeplitz types ipv4-udp l3-src-only end key_len 0 queues end / end\n+\n+   Failed to create flow, report error message::\n+\n+     Invalid input set: Invalid argument\n+\n+4. check the rule list::\n+\n+     testpmd> flow list 0\n+\n+  there is no listed.\n+\n+Subcase 2: duplicated rules (not supported in 20.08)\n+----------------------------------------------------\n+\n+1. create a  PFCP rule::\n+\n+     testpmd> flow create 0 ingress pattern eth / ipv4 / udp / pfcp / end actions rss types pfcp end key_len 0 queues end / end\n+\n+   the rule is created successfully.\n+\n+2. create the same rule again, Failed to create flow, report message::\n+\n+  Add rule failed.: Operation not permitted\n+\n+3. check only the first rule exists in the list.\n+\n+Subcase 3: void action\n+----------------------\n+\n+1. validate a rule with void action::\n+\n+     testpmd> flow validate 0 ingress pattern eth / ipv4 / udp / pfcp / end actions end\n+\n+   get the error message::\n+\n+     NULL action.: Invalid argument\n+\n+   create a rule with void action::\n+\n+     testpmd> flow create 0 ingress pattern eth / ipv4 / udp / pfcp / end actions end\n+\n+   Failed to create flow, report message::\n+\n+     NULL action.: Invalid argument\n+\n+2. check the rule list::\n+\n+     testpmd> flow list 0\n+\n+   there is no rule listed.\n+\n+Subcase 4: delete a non-existing rule\n+-------------------------------------\n+\n+1. show the rule list of port 0::\n+\n+     testpmd> flow list 0\n+\n+   There is no rule listed.\n+\n+2. destroy rule 0 of port 0::\n+\n+     testpmd> flow destroy 0 rule 0\n+\n+   There is no error message reported.\n+\n+3. flush rules of port 0::\n+\n+     testpmd> flow flush 0\n+\n+   There is no error message reported.\n+\n+Subcase 5: unsupported pattern with OS default package\n+------------------------------------------------------\n+\n+1. load os default package and launch testpmd as step 3-5 in Prerequisites.\n+\n+2. validate unsupported patterns in OS default package::\n+\n+     testpmd> flow validate 0 ingress pattern eth / ipv4 / udp / pfcp / end actions rss types pfcp end key_len 0 queues end / end\n+     testpmd> flow validate 0 ingress pattern eth / ipv4 / l2tpv3oip / end actions rss types l2tpv3 end key_len 0 queues end / end\n+     testpmd> flow validate 0 ingress pattern eth / ipv4 / esp / end actions rss types esp end key_len 0 queues end / end\n+     testpmd> flow validate 0 ingress pattern eth / ipv4 / ah / end actions rss types ah end key_len 0 queues end / end\n+\n+   get the error message::\n+\n+     Invalid input pattern: Invalid argument\n+\n+3. create unsupported patterns in OS default package::\n+\n+     testpmd> flow create 0 ingress pattern eth / ipv4 / udp / pfcp / end actions rss types pfcp end key_len 0 queues end / end\n+     testpmd> flow create 0 ingress pattern eth / ipv4 / l2tpv3oip / end actions rss types l2tpv3 end key_len 0 queues end / end\n+     testpmd> flow create 0 ingress pattern eth / ipv4 / esp / end actions rss types esp end key_len 0 queues end / end\n+     testpmd> flow create 0 ingress pattern eth / ipv4 / ah / end actions rss types ah end key_len 0 queues end / end\n+\n+4. check the rule list::\n+\n+     testpmd> flow list 0\n+\n+   there is no rule listed.\n+\n+Subcase 6: invalid port\n+-----------------------\n+\n+1. create a rule with invalid port::\n+\n+     testpmd> flow create 1 ingress pattern eth / ipv4 / udp / pfcp / end actions rss types pfcp end key_len 0 queues end / end\n+\n+   Failed to create flow, report message::\n+\n+    No such device: No such device\n+\n+2. check the rule list on port 0::\n+\n+     testpmd> flow list 0\n+\n+   there is no rule listed.\n+   check on port 1::\n+\n+     testpmd> flow list 1\n+\n+   get the error message::\n+\n+     Invalid port 1\n",
    "prefixes": [
        "V1"
    ]
}