get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 103328,
    "url": "https://patches.dpdk.org/api/patches/103328/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20211101110209.17306-2-ting.xu@intel.com/",
    "project": {
        "id": 1,
        "url": "https://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20211101110209.17306-2-ting.xu@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20211101110209.17306-2-ting.xu@intel.com",
    "date": "2021-11-01T11:02:07",
    "name": "[v2,1/3] net/ice: enable protocol agnostic flow offloading in RSS",
    "commit_ref": null,
    "pull_url": null,
    "state": "rejected",
    "archived": true,
    "hash": "51c4f5252e9c19b90b0febd001ceb7572f19aa46",
    "submitter": {
        "id": 1363,
        "url": "https://patches.dpdk.org/api/people/1363/?format=api",
        "name": "Xu, Ting",
        "email": "ting.xu@intel.com"
    },
    "delegate": null,
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20211101110209.17306-2-ting.xu@intel.com/mbox/",
    "series": [
        {
            "id": 20169,
            "url": "https://patches.dpdk.org/api/series/20169/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=20169",
            "date": "2021-11-01T11:02:06",
            "name": "enable protocol agnostic flow offloading in RSS",
            "version": 2,
            "mbox": "https://patches.dpdk.org/series/20169/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/103328/comments/",
    "check": "warning",
    "checks": "https://patches.dpdk.org/api/patches/103328/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-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 250FFA0C4E;\n\tMon,  1 Nov 2021 12:00:14 +0100 (CET)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 2C85041120;\n\tMon,  1 Nov 2021 12:00:04 +0100 (CET)",
            "from mga14.intel.com (mga14.intel.com [192.55.52.115])\n by mails.dpdk.org (Postfix) with ESMTP id 6100D40DF6\n for <dev@dpdk.org>; Mon,  1 Nov 2021 12:00:02 +0100 (CET)",
            "from orsmga006.jf.intel.com ([10.7.209.51])\n by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 01 Nov 2021 04:00:01 -0700",
            "from dpdk-xuting-second.sh.intel.com ([10.67.116.150])\n by orsmga006.jf.intel.com with ESMTP; 01 Nov 2021 03:59:59 -0700"
        ],
        "X-IronPort-AV": [
            "E=McAfee;i=\"6200,9189,10154\"; a=\"231255488\"",
            "E=Sophos;i=\"5.87,199,1631602800\"; d=\"scan'208\";a=\"231255488\"",
            "E=Sophos;i=\"5.87,199,1631602800\"; d=\"scan'208\";a=\"448914888\""
        ],
        "X-ExtLoop1": "1",
        "From": "Ting Xu <ting.xu@intel.com>",
        "To": "dev@dpdk.org",
        "Cc": "qi.z.zhang@intel.com, qiming.yang@intel.com, Ting Xu <ting.xu@intel.com>",
        "Date": "Mon,  1 Nov 2021 19:02:07 +0800",
        "Message-Id": "<20211101110209.17306-2-ting.xu@intel.com>",
        "X-Mailer": "git-send-email 2.17.1",
        "In-Reply-To": "<20211101110209.17306-1-ting.xu@intel.com>",
        "References": "<20211008070934.6956-1-ting.xu@intel.com>\n <20211101110209.17306-1-ting.xu@intel.com>",
        "Subject": "[dpdk-dev] [PATCH v2 1/3] net/ice: enable protocol agnostic flow\n offloading in RSS",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Enable protocol agnostic flow offloading to support raw pattern input\nfor RSS hash flow rule creation. It is based on Parser Libary feature.\nCurrent rte_flow raw API is utilized.\n\nSigned-off-by: Ting Xu <ting.xu@intel.com>\n---\n drivers/net/ice/ice_hash.c | 182 ++++++++++++++++++++++++++++++++-----\n 1 file changed, 160 insertions(+), 22 deletions(-)",
    "diff": "diff --git a/drivers/net/ice/ice_hash.c b/drivers/net/ice/ice_hash.c\nindex 20a3204fab..eade5f996c 100644\n--- a/drivers/net/ice/ice_hash.c\n+++ b/drivers/net/ice/ice_hash.c\n@@ -32,6 +32,7 @@\n #define ICE_PHINT_GTPU_EH\t\t\tBIT_ULL(3)\n #define\tICE_PHINT_GTPU_EH_DWN\t\t\tBIT_ULL(4)\n #define\tICE_PHINT_GTPU_EH_UP\t\t\tBIT_ULL(5)\n+#define ICE_PHINT_RAW\t\t\t\tBIT_ULL(6)\n \n #define ICE_GTPU_EH_DWNLINK\t0\n #define ICE_GTPU_EH_UPLINK\t1\n@@ -71,6 +72,7 @@\n struct ice_rss_meta {\n \tuint8_t hash_function;\n \tstruct ice_rss_hash_cfg cfg;\n+\tstruct ice_rss_raw_cfg raw;\n };\n \n struct ice_hash_flow_cfg {\n@@ -492,6 +494,7 @@ struct ice_rss_hash_cfg eth_tmplt = {\n  */\n static struct ice_pattern_match_item ice_hash_pattern_list[] = {\n \t/* IPV4 */\n+\t{pattern_raw,\t\t\t\tICE_INSET_NONE,\t\t\t\tICE_INSET_NONE,\tNULL},\n \t{pattern_eth_ipv4,\t\t\tICE_RSS_TYPE_ETH_IPV4,\t\tICE_INSET_NONE,\t&ipv4_tmplt},\n \t{pattern_eth_ipv4_udp,\t\t\tICE_RSS_TYPE_ETH_IPV4_UDP,\tICE_INSET_NONE,\t&ipv4_udp_tmplt},\n \t{pattern_eth_ipv4_tcp,\t\t\tICE_RSS_TYPE_ETH_IPV4_TCP,\tICE_INSET_NONE,\t&ipv4_tcp_tmplt},\n@@ -612,6 +615,9 @@ ice_hash_parse_pattern(const struct rte_flow_item pattern[], uint64_t *phint,\n \t\t}\n \n \t\tswitch (item->type) {\n+\t\tcase RTE_FLOW_ITEM_TYPE_RAW:\n+\t\t\t*phint |= ICE_PHINT_RAW;\n+\t\t\tbreak;\n \t\tcase RTE_FLOW_ITEM_TYPE_VLAN:\n \t\t\t*phint |= ICE_PHINT_VLAN;\n \t\t\tbreak;\n@@ -639,6 +645,91 @@ ice_hash_parse_pattern(const struct rte_flow_item pattern[], uint64_t *phint,\n \treturn 0;\n }\n \n+static int\n+ice_hash_parse_raw_pattern(struct ice_adapter *ad,\n+\t\t\t\tconst struct rte_flow_item *item,\n+\t\t\t\tstruct ice_rss_meta *meta)\n+{\n+\tconst struct rte_flow_item_raw *raw_spec, *raw_mask;\n+\tstruct ice_parser_profile prof;\n+\tstruct ice_parser_result rslt;\n+\tstruct ice_parser *psr;\n+\tuint8_t *pkt_buf, *msk_buf;\n+\tuint8_t spec_len, pkt_len;\n+\tuint8_t tmp_val = 0;\n+\tuint8_t tmp_c = 0;\n+\tint i, j;\n+\n+\traw_spec = item->spec;\n+\traw_mask = item->mask;\n+\n+\tspec_len = strlen((char *)(uintptr_t)raw_spec->pattern);\n+\tif (strlen((char *)(uintptr_t)raw_mask->pattern) !=\n+\t\tspec_len)\n+\t\treturn -rte_errno;\n+\n+\tpkt_len = spec_len / 2;\n+\n+\tpkt_buf = rte_zmalloc(NULL, pkt_len, 0);\n+\tif (!pkt_buf)\n+\t\treturn -ENOMEM;\n+\n+\tmsk_buf = rte_zmalloc(NULL, pkt_len, 0);\n+\tif (!msk_buf)\n+\t\treturn -ENOMEM;\n+\n+\t/* convert string to int array */\n+\tfor (i = 0, j = 0; i < spec_len; i += 2, j++) {\n+\t\ttmp_c = raw_spec->pattern[i];\n+\t\tif (tmp_c >= 'a' && tmp_c <= 'f')\n+\t\t\ttmp_val = tmp_c - 'a' + 10;\n+\t\tif (tmp_c >= 'A' && tmp_c <= 'F')\n+\t\t\ttmp_val = tmp_c - 'A' + 10;\n+\t\tif (tmp_c >= '0' && tmp_c <= '9')\n+\t\t\ttmp_val = tmp_c - '0';\n+\n+\t\ttmp_c = raw_spec->pattern[i + 1];\n+\t\tif (tmp_c >= 'a' && tmp_c <= 'f')\n+\t\t\tpkt_buf[j] = tmp_val * 16 + tmp_c - 'a' + 10;\n+\t\tif (tmp_c >= 'A' && tmp_c <= 'F')\n+\t\t\tpkt_buf[j] = tmp_val * 16 + tmp_c - 'A' + 10;\n+\t\tif (tmp_c >= '0' && tmp_c <= '9')\n+\t\t\tpkt_buf[j] = tmp_val * 16 + tmp_c - '0';\n+\n+\t\ttmp_c = raw_mask->pattern[i];\n+\t\tif (tmp_c >= 'a' && tmp_c <= 'f')\n+\t\t\ttmp_val = tmp_c - 0x57;\n+\t\tif (tmp_c >= 'A' && tmp_c <= 'F')\n+\t\t\ttmp_val = tmp_c - 0x37;\n+\t\tif (tmp_c >= '0' && tmp_c <= '9')\n+\t\t\ttmp_val = tmp_c - '0';\n+\n+\t\ttmp_c = raw_mask->pattern[i + 1];\n+\t\tif (tmp_c >= 'a' && tmp_c <= 'f')\n+\t\t\tmsk_buf[j] = tmp_val * 16 + tmp_c - 'a' + 10;\n+\t\tif (tmp_c >= 'A' && tmp_c <= 'F')\n+\t\t\tmsk_buf[j] = tmp_val * 16 + tmp_c - 'A' + 10;\n+\t\tif (tmp_c >= '0' && tmp_c <= '9')\n+\t\t\tmsk_buf[j] = tmp_val * 16 + tmp_c - '0';\n+\t}\n+\n+\tif (ice_parser_create(&ad->hw, &psr))\n+\t\treturn -rte_errno;\n+\tif (ice_parser_run(psr, pkt_buf, pkt_len, &rslt))\n+\t\treturn -rte_errno;\n+\tice_parser_destroy(psr);\n+\n+\tif (ice_parser_profile_init(&rslt, pkt_buf, msk_buf,\n+\t\tpkt_len, ICE_BLK_RSS, true, &prof))\n+\t\treturn -rte_errno;\n+\n+\trte_memcpy(&meta->raw.prof, &prof, sizeof(prof));\n+\n+\trte_free(pkt_buf);\n+\trte_free(msk_buf);\n+\treturn 0;\n+}\n+\n static void\n ice_refine_hash_cfg_l234(struct ice_rss_hash_cfg *hash_cfg,\n \t\t\t uint64_t rss_type)\n@@ -999,7 +1090,10 @@ ice_hash_parse_action(struct ice_pattern_match_item *pattern_match_item,\n \t\t\t\t   RTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ) {\n \t\t\t\trss_meta->hash_function =\n \t\t\t\tRTE_ETH_HASH_FUNCTION_SYMMETRIC_TOEPLITZ;\n-\t\t\t\tcfg->symm = true;\n+\t\t\t\tif (pattern_hint == ICE_PHINT_RAW)\n+\t\t\t\t\trss_meta->raw.symm = true;\n+\t\t\t\telse\n+\t\t\t\t\tcfg->symm = true;\n \t\t\t}\n \n \t\t\tif (rss->level)\n@@ -1017,6 +1111,10 @@ ice_hash_parse_action(struct ice_pattern_match_item *pattern_match_item,\n \t\t\t\t\tRTE_FLOW_ERROR_TYPE_ACTION, action,\n \t\t\t\t\t\"a non-NULL RSS queue is not supported\");\n \n+\t\t\t/* If pattern type is raw, no need to refine rss type */\n+\t\t\tif (pattern_hint == ICE_PHINT_RAW)\n+\t\t\t\tbreak;\n+\n \t\t\t/**\n \t\t\t * Check simultaneous use of SRC_ONLY and DST_ONLY\n \t\t\t * of the same level.\n@@ -1085,6 +1183,17 @@ ice_hash_parse_pattern_action(__rte_unused struct ice_adapter *ad,\n \tif (ret)\n \t\tgoto error;\n \n+\tif (phint == ICE_PHINT_RAW) {\n+\t\trss_meta_ptr->raw.raw_ena = true;\n+\t\tret = ice_hash_parse_raw_pattern(ad, pattern, rss_meta_ptr);\n+\t\tif (ret) {\n+\t\t\trte_flow_error_set(error, EINVAL,\n+\t\t\t\t\t   RTE_FLOW_ERROR_TYPE_ITEM, NULL,\n+\t\t\t\t\t   \"Parse raw pattern failed\");\n+\t\t\tgoto error;\n+\t\t}\n+\t}\n+\n \t/* Check rss action. */\n \tret = ice_hash_parse_action(pattern_match_item, actions, phint,\n \t\t\t\t    (void **)&rss_meta_ptr, error);\n@@ -1134,15 +1243,30 @@ ice_hash_create(struct ice_adapter *ad,\n \n \t\tgoto out;\n \t} else {\n-\t\tmemcpy(&filter_ptr->rss_cfg.hash, &rss_meta->cfg,\n-\t\t       sizeof(struct ice_rss_hash_cfg));\n-\t\tret = ice_add_rss_cfg_wrap(pf, vsi->idx,\n-\t\t\t\t\t   &filter_ptr->rss_cfg.hash);\n-\t\tif (ret) {\n-\t\t\trte_flow_error_set(error, EINVAL,\n-\t\t\t\t\tRTE_FLOW_ERROR_TYPE_HANDLE, NULL,\n-\t\t\t\t\t\"rss flow create fail\");\n-\t\t\tgoto error;\n+\t\tif (rss_meta->raw.raw_ena) {\n+\t\t\tmemcpy(&filter_ptr->rss_cfg.raw, &rss_meta->raw,\n+\t\t\t       sizeof(struct ice_rss_raw_cfg));\n+\t\t\tret = ice_add_rss_raw_cfg(hw, &rss_meta->raw,\n+\t\t\t\t\t\t  pf->main_vsi->idx);\n+\t\t\tif (ret) {\n+\t\t\t\trte_flow_error_set(error, EINVAL,\n+\t\t\t\t\t\t   RTE_FLOW_ERROR_TYPE_HANDLE,\n+\t\t\t\t\t\t   NULL,\n+\t\t\t\t\t\t   \"rss flow create fail\");\n+\t\t\t\tgoto error;\n+\t\t\t}\n+\t\t} else {\n+\t\t\tmemcpy(&filter_ptr->rss_cfg.hash, &rss_meta->cfg,\n+\t\t\t       sizeof(struct ice_rss_hash_cfg));\n+\t\t\tret = ice_add_rss_cfg_wrap(pf, vsi->idx,\n+\t\t\t\t\t\t   &filter_ptr->rss_cfg.hash);\n+\t\t\tif (ret) {\n+\t\t\t\trte_flow_error_set(error, EINVAL,\n+\t\t\t\t\t\t   RTE_FLOW_ERROR_TYPE_HANDLE,\n+\t\t\t\t\t\t   NULL,\n+\t\t\t\t\t\t   \"rss flow create fail\");\n+\t\t\t\tgoto error;\n+\t\t\t}\n \t\t}\n \t}\n \n@@ -1178,18 +1302,32 @@ ice_hash_destroy(struct ice_adapter *ad,\n \t\t\t(1 << VSIQF_HASH_CTL_HASH_SCHEME_S);\n \t\tICE_WRITE_REG(hw, VSIQF_HASH_CTL(vsi->vsi_id), reg);\n \t} else {\n-\t\tret = ice_rem_rss_cfg_wrap(pf, vsi->idx,\n-\t\t\t\t\t   &filter_ptr->rss_cfg.hash);\n-\t\t/* Fixme: Ignore the error if a rule does not exist.\n-\t\t * Currently a rule for inputset change or symm turn on/off\n-\t\t * will overwrite an exist rule, while application still\n-\t\t * have 2 rte_flow handles.\n-\t\t **/\n-\t\tif (ret && ret != ICE_ERR_DOES_NOT_EXIST) {\n-\t\t\trte_flow_error_set(error, EINVAL,\n-\t\t\t\t\tRTE_FLOW_ERROR_TYPE_HANDLE, NULL,\n-\t\t\t\t\t\"rss flow destroy fail\");\n-\t\t\tgoto error;\n+\t\tif (filter_ptr->rss_cfg.raw.raw_ena) {\n+\t\t\tret =\n+\t\t\tice_rem_rss_raw_cfg(hw, &filter_ptr->rss_cfg.raw.prof,\n+\t\t\t\t\t    pf->main_vsi->idx);\n+\t\t\tif (ret) {\n+\t\t\t\trte_flow_error_set(error, EINVAL,\n+\t\t\t\t\t\t   RTE_FLOW_ERROR_TYPE_HANDLE,\n+\t\t\t\t\t\t   NULL,\n+\t\t\t\t\t\t   \"rss flow destroy fail\");\n+\t\t\t\tgoto error;\n+\t\t\t}\n+\t\t} else {\n+\t\t\tret = ice_rem_rss_cfg_wrap(pf, vsi->idx,\n+\t\t\t\t\t\t   &filter_ptr->rss_cfg.hash);\n+\t\t\t/* Fixme: Ignore the error if a rule does not exist.\n+\t\t\t * Currently a rule for inputset change or symm turn\n+\t\t\t * on/off will overwrite an exist rule, while\n+\t\t\t * application still have 2 rte_flow handles.\n+\t\t\t **/\n+\t\t\tif (ret && ret != ICE_ERR_DOES_NOT_EXIST) {\n+\t\t\t\trte_flow_error_set(error, EINVAL,\n+\t\t\t\t\t\t   RTE_FLOW_ERROR_TYPE_HANDLE,\n+\t\t\t\t\t\t   NULL,\n+\t\t\t\t\t\t   \"rss flow destroy fail\");\n+\t\t\t\tgoto error;\n+\t\t\t}\n \t\t}\n \t}\n \n",
    "prefixes": [
        "v2",
        "1/3"
    ]
}