get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 111589,
    "url": "https://patches.dpdk.org/api/patches/111589/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20220523023138.3777313-6-junfeng.guo@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": "<20220523023138.3777313-6-junfeng.guo@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20220523023138.3777313-6-junfeng.guo@intel.com",
    "date": "2022-05-23T02:31:38",
    "name": "[v6,3/3] net/iavf: support Protocol Agnostic Flow Offloading VF RSS",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "4a38413b140cab3995a5b5fb2aba20b085368cff",
    "submitter": {
        "id": 1785,
        "url": "https://patches.dpdk.org/api/people/1785/?format=api",
        "name": "Junfeng Guo",
        "email": "junfeng.guo@intel.com"
    },
    "delegate": {
        "id": 1540,
        "url": "https://patches.dpdk.org/api/users/1540/?format=api",
        "username": "qzhan15",
        "first_name": "Qi",
        "last_name": "Zhang",
        "email": "qi.z.zhang@intel.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20220523023138.3777313-6-junfeng.guo@intel.com/mbox/",
    "series": [
        {
            "id": 23081,
            "url": "https://patches.dpdk.org/api/series/23081/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=23081",
            "date": "2022-05-23T02:31:33",
            "name": "Enable Protocol Agnostic Flow Offloading in AVF",
            "version": 6,
            "mbox": "https://patches.dpdk.org/series/23081/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/111589/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/111589/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 78CA9A04FD;\n\tMon, 23 May 2022 04:31:51 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id D5BB5427EB;\n\tMon, 23 May 2022 04:31:25 +0200 (CEST)",
            "from mga11.intel.com (mga11.intel.com [192.55.52.93])\n by mails.dpdk.org (Postfix) with ESMTP id 771A0427EB\n for <dev@dpdk.org>; Mon, 23 May 2022 04:31:24 +0200 (CEST)",
            "from fmsmga007.fm.intel.com ([10.253.24.52])\n by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 22 May 2022 19:31:24 -0700",
            "from dpdk-jf-ntb-v2.sh.intel.com ([10.67.119.111])\n by fmsmga007.fm.intel.com with ESMTP; 22 May 2022 19:31:22 -0700"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple;\n d=intel.com; i=@intel.com; q=dns/txt; s=Intel;\n t=1653273084; x=1684809084;\n h=from:to:cc:subject:date:message-id:in-reply-to:\n references:mime-version:content-transfer-encoding;\n bh=ciPsB/6QxJUkMg9fSH1PxHoiZ7gJKAdqjZHCj6svUME=;\n b=lJ9s1KpoqqlfKtZkPGmzpwpiiOyAu8YU3zkyX/LCfsjmw2bbLucX4r26\n +1S04gFDdgL09u+KNE4K2xTGE43Ig/EEO6sMGgz7w89vnjYkKdUH/xH7x\n jCWBFcUfue3W4zD0T/79PH78FF4ooRCKzOJZ6ZpLPFHSSXxZTUiQfE/Eh\n FBlIWazns+po1KF7VzHsiUU89zUc7Z4V+tCLrNnsdnp/LJboYD+sEZBd0\n 2C1gNNz8lK6vmeCzUzjBAzkzfm4tyIhnvdF6ew1aNTBz1T7bRhY9DHELV\n AQUnmf3IvmuxKB/iXUU5/paL6K/dx+jrn9s5Qh6nvtiIG0t0+68arlIS1 g==;",
        "X-IronPort-AV": [
            "E=McAfee;i=\"6400,9594,10355\"; a=\"270651636\"",
            "E=Sophos;i=\"5.91,245,1647327600\"; d=\"scan'208\";a=\"270651636\"",
            "E=Sophos;i=\"5.91,245,1647327600\"; d=\"scan'208\";a=\"577169781\""
        ],
        "X-ExtLoop1": "1",
        "From": "Junfeng Guo <junfeng.guo@intel.com>",
        "To": "qi.z.zhang@intel.com,\n\tjingjing.wu@intel.com,\n\tbeilei.xing@intel.com",
        "Cc": "dev@dpdk.org,\n\tting.xu@intel.com,\n\tjunfeng.guo@intel.com",
        "Subject": "[PATCH v6 3/3] net/iavf: support Protocol Agnostic Flow Offloading VF\n RSS",
        "Date": "Mon, 23 May 2022 10:31:38 +0800",
        "Message-Id": "<20220523023138.3777313-6-junfeng.guo@intel.com>",
        "X-Mailer": "git-send-email 2.25.1",
        "In-Reply-To": "<20220523023138.3777313-1-junfeng.guo@intel.com>",
        "References": "<20220520091648.3524540-2-junfeng.guo@intel.com>\n <20220523023138.3777313-1-junfeng.guo@intel.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "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"
    },
    "content": "From: Ting Xu <ting.xu@intel.com>\n\nEnable Protocol Agnostic Flow Offloading for RSS hash in VF. It supports\nraw pattern flow rule creation in VF based on Parser Library feature. VF\nparses the spec and mask input of raw pattern, and passes it to kernel\ndriver to create the flow rule. Current rte_flow raw API is utilized.\n\ncommand example:\nRSS hash for ipv4-src-dst:\nflow create 0 ingress pattern raw pattern spec\n00000000000000000000000008004500001400004000401000000000000000000000\npattern mask\n0000000000000000000000000000000000000000000000000000ffffffffffffffff /\nend actions rss queues end / end\n\nSigned-off-by: Ting Xu <ting.xu@intel.com>\n---\n drivers/net/iavf/iavf_hash.c | 96 ++++++++++++++++++++++++++++++++++++\n 1 file changed, 96 insertions(+)",
    "diff": "diff --git a/drivers/net/iavf/iavf_hash.c b/drivers/net/iavf/iavf_hash.c\nindex 278e75117d..42df7c4e48 100644\n--- a/drivers/net/iavf/iavf_hash.c\n+++ b/drivers/net/iavf/iavf_hash.c\n@@ -37,6 +37,8 @@\n /* L2TPv2 */\n #define IAVF_PHINT_L2TPV2\t\t\tBIT_ULL(9)\n #define IAVF_PHINT_L2TPV2_LEN\t\t\tBIT_ULL(10)\n+/* Raw */\n+#define IAVF_PHINT_RAW\t\t\t\tBIT_ULL(11)\n \n #define IAVF_PHINT_GTPU_MSK\t(IAVF_PHINT_GTPU\t| \\\n \t\t\t\t IAVF_PHINT_GTPU_EH\t| \\\n@@ -58,6 +60,7 @@ struct iavf_hash_match_type {\n struct iavf_rss_meta {\n \tstruct virtchnl_proto_hdrs proto_hdrs;\n \tenum virtchnl_rss_algorithm rss_algorithm;\n+\tbool raw_ena;\n };\n \n struct iavf_hash_flow_cfg {\n@@ -532,6 +535,7 @@ struct virtchnl_proto_hdrs ipv6_l2tpv2_ppp_tmplt = {\n  */\n static struct iavf_pattern_match_item iavf_hash_pattern_list[] = {\n \t/* IPv4 */\n+\t{iavf_pattern_raw,\t\t\t\tIAVF_INSET_NONE,\t\tNULL},\n \t{iavf_pattern_eth_ipv4,\t\t\t\tIAVF_RSS_TYPE_OUTER_IPV4,\t&outer_ipv4_tmplt},\n \t{iavf_pattern_eth_ipv4_udp,\t\t\tIAVF_RSS_TYPE_OUTER_IPV4_UDP,\t&outer_ipv4_udp_tmplt},\n \t{iavf_pattern_eth_ipv4_tcp,\t\t\tIAVF_RSS_TYPE_OUTER_IPV4_TCP,\t&outer_ipv4_tcp_tmplt},\n@@ -804,6 +808,9 @@ iavf_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 |= IAVF_PHINT_RAW;\n+\t\t\tbreak;\n \t\tcase RTE_FLOW_ITEM_TYPE_IPV4:\n \t\t\tif (!(*phint & IAVF_PHINT_GTPU_MSK) &&\n \t\t\t    !(*phint & IAVF_PHINT_GRE) &&\n@@ -873,6 +880,80 @@ iavf_hash_parse_pattern(const struct rte_flow_item pattern[], uint64_t *phint,\n \treturn 0;\n }\n \n+static int\n+iavf_hash_parse_raw_pattern(const struct rte_flow_item *item,\n+\t\t\tstruct iavf_rss_meta *meta)\n+{\n+\tconst struct rte_flow_item_raw *raw_spec, *raw_mask;\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+\trte_memcpy(meta->proto_hdrs.raw.spec, pkt_buf, pkt_len);\n+\trte_memcpy(meta->proto_hdrs.raw.mask, msk_buf, pkt_len);\n+\tmeta->proto_hdrs.raw.pkt_len = pkt_len;\n+\n+\trte_free(pkt_buf);\n+\trte_free(msk_buf);\n+\n+\treturn 0;\n+}\n+\n #define REFINE_PROTO_FLD(op, fld) \\\n \tVIRTCHNL_##op##_PROTO_HDR_FIELD(hdr, VIRTCHNL_PROTO_HDR_##fld)\n #define REPALCE_PROTO_FLD(fld_1, fld_2) \\\n@@ -1387,6 +1468,10 @@ iavf_hash_parse_action(struct iavf_pattern_match_item *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 == IAVF_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@@ -1453,6 +1538,17 @@ iavf_hash_parse_pattern_action(__rte_unused struct iavf_adapter *ad,\n \tif (ret)\n \t\tgoto error;\n \n+\tif (phint == IAVF_PHINT_RAW) {\n+\t\trss_meta_ptr->raw_ena = true;\n+\t\tret = iavf_hash_parse_raw_pattern(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 \tret = iavf_hash_parse_action(pattern_match_item, actions, phint,\n \t\t\t\t     rss_meta_ptr, error);\n \n",
    "prefixes": [
        "v6",
        "3/3"
    ]
}