get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 105764,
    "url": "http://patches.dpdk.org/api/patches/105764/?format=api",
    "web_url": "http://patches.dpdk.org/project/dts/patch/20220113150753.27031-3-zhiminx.huang@intel.com/",
    "project": {
        "id": 3,
        "url": "http://patches.dpdk.org/api/projects/3/?format=api",
        "name": "DTS",
        "link_name": "dts",
        "list_id": "dts.dpdk.org",
        "list_email": "dts@dpdk.org",
        "web_url": "",
        "scm_url": "git://dpdk.org/tools/dts",
        "webscm_url": "http://git.dpdk.org/tools/dts/",
        "list_archive_url": "https://inbox.dpdk.org/dts",
        "list_archive_url_format": "https://inbox.dpdk.org/dts/{}",
        "commit_url_format": ""
    },
    "msgid": "<20220113150753.27031-3-zhiminx.huang@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dts/20220113150753.27031-3-zhiminx.huang@intel.com",
    "date": "2022-01-13T15:07:51",
    "name": "[V2,2/4] tests/cvl_advanced_rss:add pf rss cases",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "0c9a5a29bc578669f93f40f9795d52582c6fdafe",
    "submitter": {
        "id": 1685,
        "url": "http://patches.dpdk.org/api/people/1685/?format=api",
        "name": "Huang, ZhiminX",
        "email": "zhiminx.huang@intel.com"
    },
    "delegate": null,
    "mbox": "http://patches.dpdk.org/project/dts/patch/20220113150753.27031-3-zhiminx.huang@intel.com/mbox/",
    "series": [
        {
            "id": 21144,
            "url": "http://patches.dpdk.org/api/series/21144/?format=api",
            "web_url": "http://patches.dpdk.org/project/dts/list/?series=21144",
            "date": "2022-01-13T15:07:49",
            "name": "cvl rss with checksum inputset automation",
            "version": 2,
            "mbox": "http://patches.dpdk.org/series/21144/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/105764/comments/",
    "check": "pending",
    "checks": "http://patches.dpdk.org/api/patches/105764/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dts-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 4FDD7A00C4;\n\tThu, 13 Jan 2022 07:38:44 +0100 (CET)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 49EBD4271B;\n\tThu, 13 Jan 2022 07:38:44 +0100 (CET)",
            "from mga11.intel.com (mga11.intel.com [192.55.52.93])\n by mails.dpdk.org (Postfix) with ESMTP id AB6DD40150\n for <dts@dpdk.org>; Thu, 13 Jan 2022 07:38:41 +0100 (CET)",
            "from fmsmga001.fm.intel.com ([10.253.24.23])\n by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 12 Jan 2022 22:38:41 -0800",
            "from unknown (HELO localhost.localdomain) ([10.239.251.93])\n by fmsmga001-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 12 Jan 2022 22:38:39 -0800"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple;\n d=intel.com; i=@intel.com; q=dns/txt; s=Intel;\n t=1642055921; x=1673591921;\n h=from:to:cc:subject:date:message-id:in-reply-to: references;\n bh=++mjNOO+TZK/AIkZ228KhnC79ZfAp23ABrr+PtMWUI8=;\n b=LHQzHNSvwDptzOwWlquRcqCRmmqueXYDV+bTacqVqO7Eeu6xEEJZKEuz\n 42PBB3XnpmGsPKu20NfjmgrHQ7dAquRS6W9QRxDEjshzvDDXA5mr6jZl3\n iAFjuCNLKcdTsJRKDaVwlqJ/WQd9EC41MJIcJdbhVTJOBMYShlu7DFwVa\n 3K1Et/mbT9Z9h0bZAUGmQ0mOCO34Sl6gWzFF6or3tHZePo+9TujD6zwQL\n 28BP4XXBYTlGTQ6VRk/vG56JbTHnbGeIIpeL9ZUK+2UWOJEFhY1AfvPKF\n /VZYhsM47ELDAj4kT9U09/7eXDETsFMCcFRvRhkSgzLCJAHsIkQWyuc3A w==;",
        "X-IronPort-AV": [
            "E=McAfee;i=\"6200,9189,10225\"; a=\"241501755\"",
            "E=Sophos;i=\"5.88,284,1635231600\"; d=\"scan'208\";a=\"241501755\"",
            "E=Sophos;i=\"5.88,284,1635231600\"; d=\"scan'208\";a=\"670419135\""
        ],
        "From": "Zhimin Huang <zhiminx.huang@intel.com>",
        "To": "dts@dpdk.org",
        "Cc": "Zhimin Huang <zhiminx.huang@intel.com>",
        "Subject": "[dts][PATCH V2 2/4] tests/cvl_advanced_rss:add pf rss cases",
        "Date": "Thu, 13 Jan 2022 23:07:51 +0800",
        "Message-Id": "<20220113150753.27031-3-zhiminx.huang@intel.com>",
        "X-Mailer": "git-send-email 2.17.1",
        "In-Reply-To": "<20220113150753.27031-1-zhiminx.huang@intel.com>",
        "References": "<20220113150753.27031-1-zhiminx.huang@intel.com>",
        "X-BeenThere": "dts@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "test suite reviews and discussions <dts.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dts>,\n <mailto:dts-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dts/>",
        "List-Post": "<mailto:dts@dpdk.org>",
        "List-Help": "<mailto:dts-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dts>,\n <mailto:dts-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dts-bounces@dpdk.org"
    },
    "content": "add pf rss test case with checksum as inputset.\n\nSigned-off-by: Zhimin Huang <zhiminx.huang@intel.com>\n---\n tests/TestSuite_cvl_advanced_rss.py | 454 +++++++++++++++++++++++++++-\n 1 file changed, 446 insertions(+), 8 deletions(-)",
    "diff": "diff --git a/tests/TestSuite_cvl_advanced_rss.py b/tests/TestSuite_cvl_advanced_rss.py\nindex d84ef395..0ab61f74 100644\n--- a/tests/TestSuite_cvl_advanced_rss.py\n+++ b/tests/TestSuite_cvl_advanced_rss.py\n@@ -37,7 +37,7 @@ from framework.packet import Packet\n from framework.pmd_output import PmdOutput\n from framework.test_case import TestCase\n \n-from .rte_flow_common import RssProcessing\n+from .rte_flow_common import RssProcessing, FdirProcessing, check_mark\n \n # toeplitz related data start\n mac_ipv4_toeplitz_basic_pkt = {\n@@ -683,6 +683,40 @@ mac_ipv4_all = {\n     ],\n }\n \n+mac_ipv4_ipv4_chksum = {\n+    'sub_casename': 'mac_ipv4_ipv4_chksum',\n+    'port_id': 0,\n+    'rule': 'flow create 0 ingress pattern eth / ipv4 / end actions rss types ipv4-chksum  end queues end / end',\n+    'test': [\n+        {\n+            'send_packet': eval(str(mac_ipv4_toeplitz_basic_pkt['ipv4-nonfrag']).replace('src=\"192.168.0.2\"',\n+                                                                                         'src=\"192.168.0.2\", chksum=0x1')),\n+            'action': 'save_hash',\n+        },\n+        {\n+            'send_packet': eval(str(mac_ipv4_toeplitz_basic_pkt['ipv4-nonfrag']).replace('src=\"192.168.0.2\"',\n+                                                                                         'src=\"192.168.0.2\", chksum=0xffff')),\n+            'action': 'check_hash_different',\n+        },\n+        {\n+            'send_packet': eval(str(mac_ipv4_toeplitz_basic_pkt['ipv4-nonfrag']).replace('dst=\"192.168.0.1\", src=\"192.168.0.2\"',\n+                                                                                         'dst=\"192.168.1.1\", src=\"192.168.1.2\", chksum=0x1')),\n+            'action': 'check_hash_same',\n+        },\n+        {\n+            'send_packet': mac_ipv6_toeplitz_basic_pkt['ipv6-nonfrag'],\n+            'action': 'check_no_hash',\n+        },\n+    ],\n+    'post-test': [\n+        {\n+            'send_packet': eval(str(mac_ipv4_toeplitz_basic_pkt['ipv4-nonfrag']).replace('src=\"192.168.0.2\"',\n+                                                                                         'src=\"192.168.0.2\", chksum=0x1')),\n+            'action': 'check_no_hash',\n+        },\n+    ],\n+}\n+\n #mac ipv4_udp\n mac_ipv4_udp_l2_src = {\n     'sub_casename': 'mac_ipv4_udp_l2_src',\n@@ -1146,6 +1180,72 @@ mac_ipv4_udp_ipv4 = {\n     ],\n }\n \n+mac_ipv4_udp_l4_chksum = {\n+    'sub_casename': 'mac_ipv4_udp_l4_chksum',\n+    'port_id': 0,\n+    'rule': 'flow create 0 ingress pattern eth / ipv4 / udp / end actions rss types l4-chksum  end queues end / end',\n+    'test': [\n+        {\n+            'send_packet': eval(str(mac_ipv4_udp_toeplitz_basic_pkt['ipv4-udp']).replace(\"dport=23\", \"dport=23,chksum=0xffff\")),\n+            'action': 'save_hash',\n+        },\n+        {\n+            'send_packet': eval(str(mac_ipv4_udp_toeplitz_basic_pkt['ipv4-udp']).replace(\"dport=23\", \"dport=23,chksum=0xfffe\")),\n+            'action': 'check_hash_different',\n+        },\n+        {\n+            'send_packet': eval(str(mac_ipv4_udp_toeplitz_basic_pkt['ipv4-udp']).replace('dst=\"192.168.0.1\", src=\"192.168.0.2\"',\n+                                                                                         'dst=\"192.168.1.1\", src=\"192.168.1.2\", chksum=0x3')\n+                                                                                .replace('sport=22,dport=23', 'sport=32,dport=33,chksum=0xffff')),\n+            'action': 'check_hash_same',\n+        },\n+        {\n+            'send_packet': 'Ether(dst=\"00:11:22:33:44:55\", src=\"52:00:00:00:00:00\")/IP(src=\"192.168.0.1\",dst=\"192.168.0.2\")/SCTP(sport=22, dport=23,chksum=0xffff)/(\"X\"*48)',\n+            'action': 'check_no_hash',\n+        },\n+    ],\n+    'post-test': [\n+        {\n+            'send_packet': eval(str(mac_ipv4_udp_toeplitz_basic_pkt['ipv4-udp']).replace(\"dport=23\", \"dport=23,chksum=0xffff\")),\n+            'action': 'check_no_hash',\n+        },\n+    ],\n+}\n+\n+mac_ipv4_udp_ipv4_chksum = {\n+    'sub_casename': 'mac_ipv4_udp_ipv4_chksum',\n+    'port_id': 0,\n+    'rule': 'flow create 0 ingress pattern eth / ipv4 / udp / end actions rss types ipv4-chksum  end queues end / end',\n+    'test': [\n+        {\n+            'send_packet': eval(str(mac_ipv4_udp_toeplitz_basic_pkt['ipv4-udp']).replace('src=\"192.168.0.2\"', 'src=\"192.168.0.2\",chksum=0xffff')),\n+            'action': 'save_hash',\n+        },\n+        {\n+            'send_packet': eval(str(mac_ipv4_udp_toeplitz_basic_pkt['ipv4-udp']).replace('src=\"192.168.0.2\"', 'src=\"192.168.0.2\",chksum=0xfffe')),\n+            'action': 'check_hash_different',\n+        },\n+        {\n+            'send_packet': eval(str(mac_ipv4_udp_toeplitz_basic_pkt['ipv4-udp']).replace('dst=\"192.168.0.1\", src=\"192.168.0.2\"',\n+                                                                                         'dst=\"192.168.1.1\", src=\"192.168.1.2\", chksum=0xffff')\n+                                                                                .replace('sport=22,dport=23', 'sport=32,dport=33,chksum=0xffff')),\n+            'action': 'check_hash_same',\n+        },\n+        {\n+            'send_packet': 'Ether(dst=\"00:11:22:33:44:55\", src=\"52:00:00:00:00:00\")/IP(src=\"192.168.0.1\",dst=\"192.168.0.2\")/SCTP(sport=22, dport=23,chksum=0xffff)/(\"X\"*48)',\n+            'action': 'check_no_hash',\n+        },\n+    ],\n+    'post-test': [\n+        {\n+            'send_packet': eval(str(mac_ipv4_udp_toeplitz_basic_pkt['ipv4-udp']).replace('src=\"192.168.0.2\"', 'src=\"192.168.0.2\",chksum=0xffff')),\n+            'action': 'check_no_hash',\n+        },\n+    ],\n+}\n+\n+mac_ipv4_udp_chksum = [mac_ipv4_udp_l4_chksum, mac_ipv4_udp_ipv4_chksum]\n+\n #mac ipv4_tcp\n mac_ipv4_tcp_l2_src = {\n     'sub_casename': 'mac_ipv4_tcp_l2_src',\n@@ -1609,6 +1709,11 @@ mac_ipv4_tcp_ipv4 = {\n     ],\n }\n \n+mac_ipv4_tcp_chksum = [eval(str(element).replace(\"mac_ipv4_udp\", \"mac_ipv4_tcp\")\n+                                        .replace(\"ipv4 / udp\", \"ipv4 / tcp\")\n+                                        .replace(\"/UDP(sport=\", \"/TCP(sport=\"))\n+                                    for element in mac_ipv4_udp_chksum]\n+\n #mac ipv4_sctp\n mac_ipv4_sctp_l2_src = {\n     'sub_casename': 'mac_ipv4_sctp_l2_src',\n@@ -2072,6 +2177,12 @@ mac_ipv4_sctp_ipv4 = {\n     ],\n }\n \n+mac_ipv4_sctp_chksum = [eval(str(element).replace(\"mac_ipv4_udp\", \"mac_ipv4_sctp\")\n+                                         .replace(\"SCTP(sport=\", \"TCP(sport=\")\n+                                         .replace(\"ipv4 / udp\", \"ipv4 / sctp\")\n+                                         .replace(\"/UDP(sport=\", \"/SCTP(sport=\"))\n+                                    for element in mac_ipv4_udp_chksum]\n+\n #mac_ipv6\n mac_ipv6_l2_src = {\n     'sub_casename': 'mac_ipv6_l2_src',\n@@ -2997,6 +3108,38 @@ mac_ipv6_udp_ipv6 = {\n     ],\n }\n \n+mac_ipv6_udp_l4_chksum = {\n+    'sub_casename': 'mac_ipv6_udp_l4_chksum',\n+    'port_id': 0,\n+    'rule': 'flow create 0 ingress pattern eth / ipv6 / udp / end actions rss types l4-chksum  end queues end / end',\n+    'test': [\n+        {\n+            'send_packet': eval(str(mac_ipv6_toeplitz_basic_pkt['ipv6-udp']).replace(\"dport=23\", \"dport=23, chksum=0x1\")),\n+            'action': 'save_hash',\n+        },\n+        {\n+            'send_packet': eval(str(mac_ipv6_toeplitz_basic_pkt['ipv6-udp']).replace(\"dport=23\", \"dport=23, chksum=0x2\")),\n+            'action': 'check_hash_different',\n+        },\n+        {\n+            'send_packet': eval(str(mac_ipv6_toeplitz_basic_pkt['ipv6-udp']).replace(\"sport=22,dport=23\", \"sport=22,dport=23,chksum=0x1\")\n+                                                                            .replace(\"1800:2929\", \"1800:3939\")\n+                                                                            .replace(\"2020\", \"3030\")),\n+            'action': 'check_hash_same',\n+        },\n+        {\n+            'send_packet': eval(str(mac_ipv6_toeplitz_basic_pkt['ipv6-udp']).replace(\"/UDP(sport=22,dport=23)\", \"/SCTP(sport=22,dport=23,chksum=0x1)\")),\n+            'action': 'check_no_hash',\n+        },\n+    ],\n+    'post-test': [\n+        {\n+            'send_packet': eval(str(mac_ipv6_toeplitz_basic_pkt['ipv6-udp']).replace(\"dport=23\", \"dport=23, chksum=0x1\")),\n+            'action': 'check_no_hash',\n+        },\n+    ],\n+}\n+\n #mac_ipv6_tcp\n mac_ipv6_tcp_l2_src = {\n     'sub_casename': 'mac_ipv6_tcp_l2_src',\n@@ -3444,6 +3587,10 @@ mac_ipv6_tcp_ipv6 = {\n     ],\n }\n \n+mac_ipv6_tcp_l4_chksum = eval(str(mac_ipv6_udp_l4_chksum).replace(\"mac_ipv6_udp\", \"mac_ipv6_tcp\")\n+                                                         .replace(\"ipv6 / udp\", \"ipv6 / tcp\")\n+                                                         .replace(\"/UDP(sport=\", \"/TCP(sport=\"))\n+\n #mac_ipv6_sctp\n mac_ipv6_sctp_l2_src = {\n     'sub_casename': 'mac_ipv6_sctp_l2_src',\n@@ -3891,42 +4038,47 @@ mac_ipv6_sctp_ipv6 = {\n     ],\n }\n \n+mac_ipv6_sctp_l4_chksum = eval(str(mac_ipv6_udp_l4_chksum).replace(\"mac_ipv6_udp\", \"mac_ipv6_sctp\")\n+                                                          .replace(\"/SCTP(sport=\", \"/TCP(sport=\")\n+                                                          .replace(\"ipv6 / udp\", \"ipv6 / sctp\")\n+                                                          .replace(\"/UDP(sport=\", \"/SCTP(sport=\"))\n+\n # toeplitz related data end\n \n-mac_ipv4_1 = [mac_ipv4_l2_src, mac_ipv4_l2_dst, mac_ipv4_l2src_l2dst]\n+mac_ipv4_1 = [mac_ipv4_l2_src, mac_ipv4_l2_dst, mac_ipv4_l2src_l2dst, mac_ipv4_ipv4_chksum]\n mac_ipv4_2 = [mac_ipv4_l3_src, mac_ipv4_l3_dst, mac_ipv4_all]\n \n mac_ipv4_udp = [mac_ipv4_udp_l2_src, mac_ipv4_udp_l2_dst, mac_ipv4_udp_l2src_l2dst,\n                 mac_ipv4_udp_l3_src, mac_ipv4_udp_l3_dst, mac_ipv4_udp_l3src_l4src,\n                 mac_ipv4_udp_l3src_l4dst, mac_ipv4_udp_l3dst_l4src, mac_ipv4_udp_l3dst_l4dst,\n-                mac_ipv4_udp_l4_src, mac_ipv4_udp_l4_dst, mac_ipv4_udp_all, mac_ipv4_udp_ipv4]\n+                mac_ipv4_udp_l4_src, mac_ipv4_udp_l4_dst, mac_ipv4_udp_all, mac_ipv4_udp_ipv4] + mac_ipv4_udp_chksum\n \n mac_ipv4_tcp = [mac_ipv4_tcp_l2_src, mac_ipv4_tcp_l2_dst, mac_ipv4_tcp_l2src_l2dst,\n                 mac_ipv4_tcp_l3_src, mac_ipv4_tcp_l3_dst, mac_ipv4_tcp_l3src_l4src,\n                 mac_ipv4_tcp_l3src_l4dst, mac_ipv4_tcp_l3dst_l4src, mac_ipv4_tcp_l3dst_l4dst,\n-                mac_ipv4_tcp_l4_src, mac_ipv4_tcp_l4_dst, mac_ipv4_tcp_all, mac_ipv4_tcp_ipv4]\n+                mac_ipv4_tcp_l4_src, mac_ipv4_tcp_l4_dst, mac_ipv4_tcp_all, mac_ipv4_tcp_ipv4] + mac_ipv4_tcp_chksum\n \n mac_ipv4_sctp = [mac_ipv4_sctp_l2_src, mac_ipv4_sctp_l2_dst, mac_ipv4_sctp_l2src_l2dst,\n                 mac_ipv4_sctp_l3_src, mac_ipv4_sctp_l3_dst, mac_ipv4_sctp_l3src_l4src,\n                 mac_ipv4_sctp_l3src_l4dst, mac_ipv4_sctp_l3dst_l4src, mac_ipv4_sctp_l3dst_l4dst,\n-                mac_ipv4_sctp_l4_src, mac_ipv4_sctp_l4_dst, mac_ipv4_sctp_all, mac_ipv4_sctp_ipv4]\n+                mac_ipv4_sctp_l4_src, mac_ipv4_sctp_l4_dst, mac_ipv4_sctp_all, mac_ipv4_sctp_ipv4] + mac_ipv4_sctp_chksum\n \n mac_ipv6 = [mac_ipv6_l2_src, mac_ipv6_l2_dst, mac_ipv6_l2src_l2dst, mac_ipv6_l3_src, mac_ipv6_l3_dst, mac_ipv6_all]\n \n mac_ipv6_udp = [mac_ipv6_udp_l2_src, mac_ipv6_udp_l2_dst, mac_ipv6_udp_l2src_l2dst,\n                 mac_ipv6_udp_l3_src, mac_ipv6_udp_l3_dst, mac_ipv6_udp_l3src_l4src,\n                 mac_ipv6_udp_l3src_l4dst, mac_ipv6_udp_l3dst_l4src, mac_ipv6_udp_l3dst_l4dst,\n-                mac_ipv6_udp_l4_src, mac_ipv6_udp_l4_dst, mac_ipv6_udp_all, mac_ipv6_udp_ipv6]\n+                mac_ipv6_udp_l4_src, mac_ipv6_udp_l4_dst, mac_ipv6_udp_all, mac_ipv6_udp_ipv6, mac_ipv6_udp_l4_chksum]\n \n mac_ipv6_tcp = [mac_ipv6_tcp_l2_src, mac_ipv6_tcp_l2_dst, mac_ipv6_tcp_l2src_l2dst,\n                 mac_ipv6_tcp_l3_src, mac_ipv6_tcp_l3_dst, mac_ipv6_tcp_l3src_l4src,\n                 mac_ipv6_tcp_l3src_l4dst, mac_ipv6_tcp_l3dst_l4src, mac_ipv6_tcp_l3dst_l4dst,\n-                mac_ipv6_tcp_l4_src, mac_ipv6_tcp_l4_dst, mac_ipv6_tcp_all, mac_ipv6_tcp_ipv6]\n+                mac_ipv6_tcp_l4_src, mac_ipv6_tcp_l4_dst, mac_ipv6_tcp_all, mac_ipv6_tcp_ipv6, mac_ipv6_tcp_l4_chksum]\n \n mac_ipv6_sctp = [mac_ipv6_sctp_l2_src, mac_ipv6_sctp_l2_dst, mac_ipv6_sctp_l2src_l2dst,\n                 mac_ipv6_sctp_l3_src, mac_ipv6_sctp_l3_dst, mac_ipv6_sctp_l3src_l4src,\n                 mac_ipv6_sctp_l3src_l4dst, mac_ipv6_sctp_l3dst_l4src, mac_ipv6_sctp_l3dst_l4dst,\n-                mac_ipv6_sctp_l4_src, mac_ipv6_sctp_l4_dst, mac_ipv6_sctp_all, mac_ipv6_sctp_ipv6]\n+                mac_ipv6_sctp_l4_src, mac_ipv6_sctp_l4_dst, mac_ipv6_sctp_all, mac_ipv6_sctp_ipv6, mac_ipv6_sctp_l4_chksum]\n \n # symmetric related data start\n mac_ipv4_symmetric = {\n@@ -5061,6 +5213,14 @@ class AdvancedRSSTest(TestCase):\n         for i in rules_val:\n             out = self.pmd_output.execute_cmd(i, timeout=1)\n             self.verify('Invalid argument' in out, \"rule %s validate successfully\" % i)\n+        \n+        rules_chksum = [\n+            'flow create 0 ingress pattern eth / ipv4 / end actions rss types l4-chksum end queues end / end',\n+            'flow create 0 ingress pattern eth / ipv6 / end actions rss types ipv6-chksum  end queues end / end'\n+        ]\n+        for i in rules_chksum:\n+            out = self.pmd_output.execute_cmd(i)\n+            self.verify('Invalid argument' in out or 'Bad arguments' in out, \"negative rules not support to create\")\n \n     def test_multirules(self):\n         self.switch_testpmd(symmetric=True)\n@@ -5236,6 +5396,284 @@ class AdvancedRSSTest(TestCase):\n         self.rssprocess.destroy_rule(port_id=0, rule_id=rule_id_0)\n         self.verify(not self.rssprocess.error_msgs, 'some subcases failed')\n \n+    def test_checksum_for_different_payload_length(self):\n+        self.rssprocess.error_msgs = []\n+        self.pmd_output.quit()\n+        self.pmd_output.start_testpmd(cores=\"1S/4C/1T\", param=\"--rxq={0} --txq={0}\".format(self.rxq),\n+                                      eal_param=f\"-a {self.pci0}\", socket=self.ports_socket)\n+        self.pmd_output.execute_cmd(\"set verbose 1\")\n+        self.pmd_output.execute_cmd(\"set fwd rxonly\")\n+        self.pmd_output.execute_cmd(\"start\")\n+        pkt_list = [\n+            'Ether(dst=\"00:11:22:33:44:55\", src=\"52:00:00:00:00:00\")/IP()/(\"X\"*48)',\n+            'Ether(dst=\"00:11:22:33:44:55\", src=\"52:00:00:00:00:00\")/IP()/(\"X\"*64)',\n+            'Ether(dst=\"00:11:22:33:44:55\", src=\"52:00:00:00:00:00\")/IP()/UDP()/(\"X\"*48)',\n+            'Ether(dst=\"00:11:22:33:44:55\", src=\"52:00:00:00:00:00\")/IP()/UDP()/(\"X\"*64)',\n+            'Ether(dst=\"00:11:22:33:44:55\", src=\"52:00:00:00:00:00\")/IP()/TCP()/(\"X\"*48)',\n+            'Ether(dst=\"00:11:22:33:44:55\", src=\"52:00:00:00:00:00\")/IP()/TCP()/(\"X\"*64)',\n+            'Ether(dst=\"00:11:22:33:44:55\", src=\"52:00:00:00:00:00\")/IP()/SCTP()/(\"X\"*48)',\n+            'Ether(dst=\"00:11:22:33:44:55\", src=\"52:00:00:00:00:00\")/IP()/SCTP()/(\"X\"*64)',\n+        ]\n+        rule_list = [\n+            'flow create 0 ingress pattern eth / ipv4 / udp / end actions rss types ipv4-udp  end queues end / end',\n+            'flow create 0 ingress pattern eth / ipv4 / tcp / end actions rss types ipv4-tcp  end queues end / end',\n+            'flow create 0 ingress pattern eth / ipv4 / sctp / end actions rss types ipv4-sctp  end queues end / end',\n+            'flow create 0 ingress pattern eth / ipv4 / udp / end actions rss types l4-chksum  end queues end / end',\n+            'flow create 0 ingress pattern eth / ipv4 / tcp / end actions rss types l4-chksum  end queues end / end',\n+            'flow create 0 ingress pattern eth / ipv4 / sctp / end actions rss types l4-chksum  end queues end / end'\n+        ]\n+        test_temp = {\n+                'send_packet': '',\n+                'action': '',\n+            }\n+        pre_test = []\n+        for i in range(len(pkt_list)):\n+            if i == 0:\n+                tests = eval(str(test_temp).replace(\"'send_packet': ''\", \"'send_packet': '{}'\".format(pkt_list[i]))\n+                             .replace(\"'action': ''\", \"'action': 'save_hash'\"))\n+            else:\n+                tests = eval(str(test_temp).replace(\"'send_packet': ''\", \"'send_packet': '{}'\".format(pkt_list[i]))\n+                             .replace(\"'action': ''\", \"'action': 'check_hash_same'\"))\n+            pre_test.append(tests)\n+        self.rssprocess.handle_tests(pre_test)\n+        test_5_tuple = []\n+        rules = self.rssprocess.create_rule(rule_list[0:3])\n+        self.rssprocess.check_rule(rule_list=rules)\n+        for i in range(len(pkt_list)):\n+            if i % 2 == 0:\n+                tests = eval(str(test_temp).replace(\"'send_packet': ''\", \"'send_packet': '{}'\".format(pkt_list[i]))\n+                             .replace(\"'action': ''\", \"'action': 'save_hash'\"))\n+            else:\n+                tests = eval(str(test_temp).replace(\"'send_packet': ''\", \"'send_packet': '{}'\".format(pkt_list[i]))\n+                             .replace(\"'action': ''\", \"'action': 'check_hash_same'\"))\n+            test_5_tuple.append(tests)\n+        self.rssprocess.handle_tests(test_5_tuple)\n+        test_l4_chksum = []\n+        rules = self.rssprocess.create_rule(rule_list[3:])\n+        self.rssprocess.check_rule(rule_list=rules)\n+        for i in range(2, len(pkt_list)):\n+            if i % 2 == 0:\n+                tests = eval(str(test_temp).replace(\"'send_packet': ''\", \"'send_packet': '{}'\".format(pkt_list[i]))\n+                             .replace(\"'action': ''\", \"'action': 'save_hash'\"))\n+            else:\n+                tests = eval(str(test_temp).replace(\"'send_packet': ''\", \"'send_packet': '{}'\".format(pkt_list[i]))\n+                             .replace(\"'action': ''\", \"'action': 'check_hash_different'\"))\n+            test_l4_chksum.append(tests)\n+        self.rssprocess.handle_tests(test_l4_chksum)\n+        test_ipv4_chksum = []\n+        ipv4_chksum_rule = eval(str(rule_list).replace(\"l4-chksum\", \"ipv4-chksum\"))\n+        rules = self.rssprocess.create_rule(ipv4_chksum_rule[3:] + [\"flow create 0 ingress pattern eth / ipv4 / end actions rss types ipv4-chksum  end queues end / end\"])\n+        self.rssprocess.check_rule(rule_list=rules)\n+        for i in range(len(pkt_list)):\n+            if i % 2 == 0:\n+                tests = eval(str(test_temp).replace(\"'send_packet': ''\", \"'send_packet': '{}'\".format(pkt_list[i]))\n+                             .replace(\"'action': ''\", \"'action': 'save_hash'\"))\n+            else:\n+                tests = eval(str(test_temp).replace(\"'send_packet': ''\", \"'send_packet': '{}'\".format(pkt_list[i]))\n+                             .replace(\"'action': ''\", \"'action': 'check_hash_different'\"))\n+            test_ipv4_chksum.append(tests)\n+        self.rssprocess.handle_tests(test_ipv4_chksum)\n+        self.verify(not self.rssprocess.error_msgs, 'some subcases failed')\n+\n+    def validate_packet_checksum(self, pkts, expect_pkts):\n+        expect_chksum = dict()\n+        checksum_pattern = re.compile(\"chksum.*=.*(0x[0-9a-z]+)\")\n+        self.tester.send_expect(\"scapy\", \">>> \")\n+        sniff_src = self.dut.get_mac_address(self.dut_ports[0])\n+        for pkt in expect_pkts:\n+            self.tester.send_expect(\"p = %s\" % expect_pkts[pkt], \">>>\")\n+            out = self.tester.send_expect(\"p.show2()\", \">>>\")\n+            chksums = checksum_pattern.findall(out)\n+            expect_chksum[pkt] = chksums\n+        self.logger.info(expect_chksum)\n+        self.tester.send_expect(\"exit()\", \"#\")\n+        for pkt in pkts:\n+            inst = self.tester.tcpdump_sniff_packets(intf=self.tester_iface0, count=len(pkts), filters=[{'layer': 'ether', 'config': {'src': sniff_src}}])\n+            out = self.rssprocess.send_pkt_get_output(pkts=pkts[pkt])\n+            rece_pkt = self.tester.load_tcpdump_sniff_packets(inst)\n+            rece_chksum = rece_pkt[0].sprintf(\"%IP.chksum%;%TCP.chksum%;%UDP.chksum%;%SCTP.chksum%\").split(\";\")\n+            self.logger.info(rece_chksum)\n+            test_chksum = []\n+            [test_chksum.append(i) for i in rece_chksum if i != '??']\n+            self.logger.info(\"expect_chksum:{} test_chksum:{}\".format(expect_chksum[pkt], test_chksum))\n+            self.verify(expect_chksum[pkt] == test_chksum, 'tx checksum is incorrect')\n+\n+    def test_flow_rule_not_impact_rx_tx_chksum(self):\n+        self.pmd_output.quit()\n+        self.pmd_output.start_testpmd(cores=\"1S/4C/1T\", param=\"--rxq={0} --txq={0}\".format(self.rxq),\n+                                      eal_param=f\"-a {self.pci0}\", socket=self.ports_socket)\n+        self.pmd_output.execute_cmd(\"set verbose 1\")\n+        self.pmd_output.execute_cmd(\"port stop all\")\n+        self.pmd_output.execute_cmd(\"set fwd csum\")\n+        self.pmd_output.execute_cmd(\"csum set ip hw 0\")\n+        self.pmd_output.execute_cmd(\"csum set udp hw 0\")\n+        self.pmd_output.execute_cmd(\"csum set tcp hw 0\")\n+        self.pmd_output.execute_cmd(\"csum set sctp hw 0\")\n+        self.pmd_output.execute_cmd(\"port start all\")\n+        self.pmd_output.execute_cmd(\"start\")\n+        self.tester.check_interfaces_link(self.tester_iface0)\n+        pkt_list = {\n+            'IP': 'Ether(dst=\"00:11:22:33:44:55\", src=\"52:00:00:00:00:00\")/IP(src=\"192.168.0.1\", chksum=0xfff3)/(\"X\"*48)',\n+            'IP/TCP': 'Ether(dst=\"00:11:22:33:44:55\", src=\"52:00:00:00:00:00\")/IP(src=\"192.168.0.1\")/TCP(sport=22, chksum=0xfff3)/(\"X\"*48)',\n+            'IP/UDP': 'Ether(dst=\"00:11:22:33:44:55\", src=\"52:00:00:00:00:00\")/IP(src=\"192.168.0.1\")/UDP(sport=22, chksum=0x1)/(\"X\"*48)',\n+            'IP/SCTP': 'Ether(dst=\"00:11:22:33:44:55\", src=\"52:00:00:00:00:00\")/IP(src=\"192.168.0.1\")/SCTP(sport=22, chksum=0x0)/(\"X\"*48)',\n+            'IPv6/TCP': 'Ether(dst=\"00:11:22:33:44:55\", src=\"52:00:00:00:00:00\")/IPv6()/TCP(sport=22, chksum=0xe38)/(\"X\"*48)',\n+            'IPv6/UDP': 'Ether(dst=\"00:11:22:33:44:55\", src=\"52:00:00:00:00:00\")/IPv6()/UDP(sport=22, chksum=0xe38)/(\"X\"*48)',\n+            'IPv6/SCTP': 'Ether(dst=\"00:11:22:33:44:55\", src=\"52:00:00:00:00:00\")/IPv6()/SCTP(sport=22, chksum=0x0)/(\"X\"*48)',\n+        }\n+        expect_pkt = {\n+            'IP': 'Ether(dst=\"00:11:22:33:44:55\", src=\"52:00:00:00:00:00\")/IP(src=\"192.168.0.1\")/(\"X\"*48)',\n+            'IP/TCP': 'Ether(dst=\"00:11:22:33:44:55\", src=\"52:00:00:00:00:00\")/IP(src=\"192.168.0.1\")/TCP(sport=22)/(\"X\"*48)',\n+            'IP/UDP': 'Ether(dst=\"00:11:22:33:44:55\", src=\"52:00:00:00:00:00\")/IP(src=\"192.168.0.1\")/UDP(sport=22)/(\"X\"*48)',\n+            'IP/SCTP': 'Ether(dst=\"00:11:22:33:44:55\", src=\"52:00:00:00:00:00\")/IP(src=\"192.168.0.1\")/SCTP(sport=22)/(\"X\"*48)',\n+            'IPv6/TCP': 'Ether(dst=\"00:11:22:33:44:55\", src=\"52:00:00:00:00:00\")/IPv6()/TCP(sport=22)/(\"X\"*48)',\n+            'IPv6/UDP': 'Ether(dst=\"00:11:22:33:44:55\", src=\"52:00:00:00:00:00\")/IPv6()/UDP(sport=22)/(\"X\"*48)',\n+            'IPv6/SCTP': 'Ether(dst=\"00:11:22:33:44:55\", src=\"52:00:00:00:00:00\")/IPv6()/SCTP(sport=22)/(\"X\"*48)',\n+        }\n+        rule_list = [\n+            'flow create 0 ingress pattern eth / ipv4 / end actions rss types ipv4-chksum end queues end / end',\n+            'flow create 0 ingress pattern eth / ipv4 / tcp / end actions rss types l4-chksum end queues end / end',\n+            'flow create 0 ingress pattern eth / ipv4 / udp / end actions rss types l4-chksum end queues end / end',\n+            'flow create 0 ingress pattern eth / ipv4 / sctp / end actions rss types l4-chksum end queues end / end',\n+            'flow create 0 ingress pattern eth / ipv6 / tcp / end actions rss types l4-chksum end queues end / end',\n+            'flow create 0 ingress pattern eth / ipv6 / udp / end actions rss types l4-chksum end queues end / end',\n+            'flow create 0 ingress pattern eth / ipv6 / sctp / end actions rss types l4-chksum end queues end / end',\n+        ]\n+        self.validate_packet_checksum(pkt_list, expect_pkt)\n+        rss_test = {\n+            'sub_casename': 'rss_test',\n+            'port_id': 0,\n+            'rule': rule_list,\n+            'pre-test': [\n+                {\n+                    'send_packet': pkt_list['IP'],\n+                    'action': {'save_hash': 'IP'},\n+                },\n+                {\n+                    'send_packet': pkt_list['IP/TCP'],\n+                    'action': {'save_hash': 'IP/TCP'},\n+                },\n+                {\n+                    'send_packet': pkt_list['IP/UDP'],\n+                    'action': {'save_hash': 'IP/UDP'},\n+                },\n+                {\n+                    'send_packet': pkt_list['IP/SCTP'],\n+                    'action': {'save_hash': 'IP/SCTP'},\n+                },\n+                {\n+                    'send_packet': pkt_list['IPv6/TCP'],\n+                    'action': {'save_hash': 'IPv6/TCP'},\n+                },\n+                {\n+                    'send_packet': pkt_list['IPv6/UDP'],\n+                    'action': {'save_hash': 'IPv6/UDP'},\n+                },\n+                {\n+                    'send_packet': pkt_list['IPv6/SCTP'],\n+                    'action': {'save_hash': 'IPv6/SCTP'},\n+                },\n+            ],\n+            'test': [\n+                {\n+                    'send_packet': pkt_list['IP'],\n+                    'action': {'check_hash_different': 'IP'},\n+                },\n+                {\n+                    'send_packet': pkt_list['IP/TCP'],\n+                    'action': {'check_hash_different': 'IP/TCP'},\n+                },\n+                {\n+                    'send_packet': pkt_list['IP/UDP'],\n+                    'action': {'check_hash_different': 'IP/UDP'},\n+                },\n+                {\n+                    'send_packet': pkt_list['IP/SCTP'],\n+                    'action': {'check_hash_different': 'IP/SCTP'},\n+                },\n+                {\n+                    'send_packet': pkt_list['IPv6/TCP'],\n+                    'action': {'check_hash_different': 'IPv6/TCP'},\n+                },\n+                {\n+                    'send_packet': pkt_list['IPv6/UDP'],\n+                    'action': {'check_hash_different': 'IPv6/UDP'},\n+                },\n+                {\n+                    'send_packet': pkt_list['IPv6/SCTP'],\n+                    'action': {'check_hash_different': 'IPv6/SCTP'},\n+                },\n+            ],\n+        }\n+        self.rssprocess.handle_rss_distribute_cases(rss_test)\n+        self.validate_packet_checksum(pkt_list, expect_pkt)\n+\n+    def test_combined_case_with_fdir_queue_group(self):\n+        fdirprocess = FdirProcessing(self, self.pmd_output, [self.tester_iface0, self.tester_iface1], self.rxq)\n+        hash_and_queue_list = []\n+        queue_group = re.compile(\"end actions rss queues (\\d+)\\s(\\d+)\")\n+        self.pmd_output.quit()\n+        self.pmd_output.start_testpmd(cores=\"1S/4C/1T\", param=\"--rxq={0} --txq={0}\".format(self.rxq),\n+                                      eal_param=f\"-a {self.pci0}\", socket=self.ports_socket)\n+        self.pmd_output.execute_cmd(\"set verbose 1\")\n+        self.pmd_output.execute_cmd(\"set fwd rxonly\")\n+        self.pmd_output.execute_cmd(\"start\")\n+        pkt_list = [\n+            'Ether(dst=\"00:11:22:33:44:55\", src=\"52:00:00:00:00:00\")/IP(src=\"192.168.0.1\", chksum=0xfff3)/(\"X\"*48)',\n+            'Ether(dst=\"00:11:22:33:44:55\", src=\"52:00:00:00:00:00\")/IP(src=\"192.168.0.1\")/TCP(sport=22, chksum=0xfff3)/(\"X\"*48)',\n+            'Ether(dst=\"00:11:22:33:44:55\", src=\"52:00:00:00:00:00\")/IP(src=\"192.168.0.1\")/UDP(sport=22, chksum=0x1)/(\"X\"*48)',\n+            'Ether(dst=\"00:11:22:33:44:55\", src=\"52:00:00:00:00:00\")/IP(src=\"192.168.0.1\")/SCTP(sport=22, chksum=0x1)/(\"X\"*48)',\n+            'Ether(dst=\"00:11:22:33:44:55\", src=\"52:00:00:00:00:00\")/IPv6()/TCP(sport=22, chksum=0xe38)/(\"X\"*48)',\n+            'Ether(dst=\"00:11:22:33:44:55\", src=\"52:00:00:00:00:00\")/IPv6()/UDP(sport=22, chksum=0xe38)/(\"X\"*48)',\n+            'Ether(dst=\"00:11:22:33:44:55\", src=\"52:00:00:00:00:00\")/IPv6(src=\"ABAB:910A:2222:5498:8475:1111:3900:1010\")/SCTP(sport=22, chksum=0xf)/(\"X\"*48)',\n+        ]\n+        rss_rule_list = [\n+            'flow create 0 ingress pattern eth / ipv4 / end actions rss types ipv4-chksum  end queues end / end',\n+            'flow create 0 ingress pattern eth / ipv4 / tcp / end actions rss types l4-chksum  end queues end / end',\n+            'flow create 0 ingress pattern eth / ipv4 / udp / end actions rss types l4-chksum  end queues end / end',\n+            'flow create 0 ingress pattern eth / ipv4 / sctp / end actions rss types l4-chksum  end queues end / end',\n+            'flow create 0 ingress pattern eth / ipv6 / tcp / end actions rss types l4-chksum  end queues end / end',\n+            'flow create 0 ingress pattern eth / ipv6 / udp / end actions rss types l4-chksum  end queues end / end',\n+            'flow create 0 ingress pattern eth / ipv6 / sctp / end actions rss types l4-chksum  end queues end / end',\n+        ]\n+        fdir_rule_list = [\n+            'flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv4 / tcp / end actions rss queues 4 5 end / mark / end',\n+            'flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv4 / udp / end actions rss queues 6 7 end / mark / end',\n+            'flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv4 / sctp / end actions rss queues 8 9 end / mark / end',\n+            'flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv6 / tcp / end actions rss queues 10 11 end / mark / end',\n+            'flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv6 / udp / end actions rss queues 12 13 end / mark / end',\n+            'flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv6 / sctp / end actions rss queues 14 15 end / mark / end',\n+        ]\n+        fdirprocess.create_rule(fdir_rule_list)\n+        fdir_rule_list.insert(0, \"\")\n+        for i in range(len(pkt_list)):\n+            out = fdirprocess.send_pkt_get_output(pkt_list[i])\n+            hash_and_queue_tuple = self.rssprocess.get_hash_and_queues(out)\n+            if i == 0:\n+                check_mark(out, pkt_num=1, check_param={\"port_id\": 0, \"rss\": True})\n+            else:\n+                queue_list = list(map(int, queue_group.search(fdir_rule_list[i]).groups()))\n+                check_mark(out, pkt_num=1, check_param={\"port_id\": 0, \"queue\": queue_list, \"mark_id\": 0})\n+            hash_and_queue_list.append(hash_and_queue_tuple)\n+        self.rssprocess.create_rule(rss_rule_list)\n+        for i in range(len(pkt_list)):\n+            out = fdirprocess.send_pkt_get_output(pkt_list[i])\n+            hashes, queues = self.rssprocess.get_hash_and_queues(out)\n+            if i == 0:\n+                check_mark(out, pkt_num=1, check_param={\"port_id\": 0, \"rss\": True})\n+                hashes_0 = hashes\n+            else:\n+                queue_list = list(map(int, queue_group.search(fdir_rule_list[i]).groups()))\n+                check_mark(out, pkt_num=1, check_param={\"port_id\": 0, \"queue\": queue_list, \"mark_id\": 0})\n+            self.logger.info(\"pre_hash: {}    test_hash: {}\".format(hash_and_queue_list[i][0], hashes))\n+            self.verify(hash_and_queue_list[i][0] != hashes, \"expect hash values changed\")\n+        self.rssprocess.create_rule(\"flow create 0 ingress pattern eth dst is 00:11:22:33:44:55 / ipv4 / end actions rss queues 0 1 2 3 end / end\")\n+        out = fdirprocess.send_pkt_get_output(pkt_list[0])\n+        hashes, queues = self.rssprocess.get_hash_and_queues(out)\n+        check_mark(out, pkt_num=1, check_param={\"port_id\": 0, \"queue\": [1, 2, 3, 4]})\n+        self.logger.info(\"test_hash: {}       post_hash: {}\".format(hashes_0, hashes))\n+        self.verify(hashes == hashes_0, \"expect hash values not changed\")\n+\n     def tear_down(self):\n         # destroy all flow rule on port 0\n         self.dut.send_command(\"flow flush 0\", timeout=1)\n",
    "prefixes": [
        "V2",
        "2/4"
    ]
}