get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 136563,
    "url": "http://patches.dpdk.org/api/patches/136563/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20240208190827.332368-3-stephen@networkplumber.org/",
    "project": {
        "id": 1,
        "url": "http://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": "<20240208190827.332368-3-stephen@networkplumber.org>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20240208190827.332368-3-stephen@networkplumber.org",
    "date": "2024-02-08T19:05:50",
    "name": "[v4,2/7] net/tap: validate and setup parameters for BPF RSS",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "c1e188a12924a3d24abca13e92925bb0a395f0e7",
    "submitter": {
        "id": 27,
        "url": "http://patches.dpdk.org/api/people/27/?format=api",
        "name": "Stephen Hemminger",
        "email": "stephen@networkplumber.org"
    },
    "delegate": {
        "id": 319,
        "url": "http://patches.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20240208190827.332368-3-stephen@networkplumber.org/mbox/",
    "series": [
        {
            "id": 31058,
            "url": "http://patches.dpdk.org/api/series/31058/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=31058",
            "date": "2024-02-08T19:05:48",
            "name": "net/tap: queue flow action RSS using BPF redo",
            "version": 4,
            "mbox": "http://patches.dpdk.org/series/31058/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/136563/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/136563/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 EBA5043AB4;\n\tThu,  8 Feb 2024 20:08:43 +0100 (CET)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 4A1DB42E61;\n\tThu,  8 Feb 2024 20:08:34 +0100 (CET)",
            "from mail-pf1-f169.google.com (mail-pf1-f169.google.com\n [209.85.210.169])\n by mails.dpdk.org (Postfix) with ESMTP id 18F1B402D1\n for <dev@dpdk.org>; Thu,  8 Feb 2024 20:08:31 +0100 (CET)",
            "by mail-pf1-f169.google.com with SMTP id\n d2e1a72fcca58-6e07532ff1aso156529b3a.1\n for <dev@dpdk.org>; Thu, 08 Feb 2024 11:08:31 -0800 (PST)",
            "from hermes.lan (204-195-123-141.wavecable.com. [204.195.123.141])\n by smtp.gmail.com with ESMTPSA id\n z1-20020aa79901000000b006e053e98e1csm79951pff.136.2024.02.08.11.08.29\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Thu, 08 Feb 2024 11:08:29 -0800 (PST)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=networkplumber-org.20230601.gappssmtp.com; s=20230601; t=1707419310;\n x=1708024110; darn=dpdk.org;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:from:to:cc:subject:date\n :message-id:reply-to;\n bh=klwclTwCg/MXy6mC0AM+H8Mght/ByiOBM7aYphZ4FYI=;\n b=odLPNq+efjHe6Yd/VJGYB05O1n6WLQFe5y1RCOUvsii+AkTw1dVrOviwj/wqlTC1yf\n SLcPWfoklKzqp1H6uhnwAVQ/m1/AcHlMzntMqdqwoPNNfXT9FbksffeVwS9qRW5DRh26\n 0ONy+xoV9/MHsrl5LT9JzWL7aV2TAhv26ZN/42AOASRv+h9Ctp3UOJhQKtLVuC7cRv7r\n FwJtnGk3lNHLFS79EuZSRnRlzRgfOmk3CkV6FfX6JkxMMxcZp/VRIXc8KvYmrMcdFf4X\n 0zLtmUY2JGJyLG4f3fF9/lqyQkx1Jg4fVq8B0HTeSQjBTMy/WODHLFda+q6KrCaVRoY1\n uXKg==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20230601; t=1707419310; x=1708024110;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc\n :subject:date:message-id:reply-to;\n bh=klwclTwCg/MXy6mC0AM+H8Mght/ByiOBM7aYphZ4FYI=;\n b=inrBArRkg0Q3jguRJjEum6c0WNqmD8OII4zE4jgNmMZtW312KXxNlwVTgkzI7IAszQ\n kz3Gdba6/tgU1RkLVzeP4P0ZiHqLgU7XxYc4gygcndMskp7RiBntGyPPW8WauX49n4+7\n A+wNHZD4Zits4lUhErUY18lEyQKO7pkzAp/KtRBxTk0P+0B5Qj3bsX2nBcOAFNRY+5ak\n W9yQkcTNvG9NNFU7dsGptyP3OtgrGT7HbH1vcVdYWX0m7uwNB/MqSimYN3eIsqNEewBe\n v9yBrAFGB1XSoO/llgddB1bJYuc5JO2fZnooZ01JFUMVXocx+5Mnrf5Mf7v11Ds8uYOJ\n S4uw==",
        "X-Gm-Message-State": "AOJu0YwXp9SMf9cfCQHB48Mn10PSNI6cFyBF/M6rzqALyYK80AoNTdM5\n FeK5XvBhN+j46cKoOwtJinWwU8eLHvUaCMszXbeBbplPCpSd/5On7BKnkQ0JG2myWqgzr993uTU\n ZWuM=",
        "X-Google-Smtp-Source": "\n AGHT+IHNjyhaLVr6sz8TtgsnWcoTdpryP1dWfK5Z7OlrlLJvxe9M7208sgcO0nP89pqIaia9a2Nl5A==",
        "X-Received": "by 2002:a05:6a00:1d28:b0:6dd:dc11:8dc2 with SMTP id\n a40-20020a056a001d2800b006dddc118dc2mr166036pfx.31.1707419310258;\n Thu, 08 Feb 2024 11:08:30 -0800 (PST)",
        "From": "Stephen Hemminger <stephen@networkplumber.org>",
        "To": "dev@dpdk.org",
        "Cc": "Stephen Hemminger <stephen@networkplumber.org>",
        "Subject": "[PATCH v4 2/7] net/tap: validate and setup parameters for BPF RSS",
        "Date": "Thu,  8 Feb 2024 11:05:50 -0800",
        "Message-ID": "<20240208190827.332368-3-stephen@networkplumber.org>",
        "X-Mailer": "git-send-email 2.43.0",
        "In-Reply-To": "<20240208190827.332368-1-stephen@networkplumber.org>",
        "References": "<20240130034925.44869-1-stephen@networkplumber.org>\n <20240208190827.332368-1-stephen@networkplumber.org>",
        "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": "The flow RSS support via BPF was not using the key, or\nhash type parameters. Which is good because they were never\nproperly setup.\n\nFix the setup and validate the flow parameters, the BPF\nside gets fixed later.\n\nSigned-off-by: Stephen Hemminger <stephen@networkplumber.org>\n---\n drivers/net/tap/tap_bpf_insns.h | 16 ++++----\n drivers/net/tap/tap_flow.c      | 65 ++++++++++++++++++++++++++++++---\n drivers/net/tap/tap_rss.h       |  5 +--\n 3 files changed, 70 insertions(+), 16 deletions(-)",
    "diff": "diff --git a/drivers/net/tap/tap_bpf_insns.h b/drivers/net/tap/tap_bpf_insns.h\nindex 53fa76c4e6b0..ee26cf885ed7 100644\n--- a/drivers/net/tap/tap_bpf_insns.h\n+++ b/drivers/net/tap/tap_bpf_insns.h\n@@ -1709,13 +1709,13 @@ static struct bpf_insn l3_l4_hash_insns[] = {\n \t{0x57,    1,    0,        0, 0x00000001},\n \t{0x15,    1,    0,        1, 0x00000000},\n \t{0xa7,    3,    0,        0, 0xfe0fee15},\n-\t{0x71,    1,    0,      201, 0x00000000},\n+\t{0x71,    1,    0,       45, 0x00000000},\n \t{0x67,    1,    0,        0, 0x00000008},\n-\t{0x71,    2,    0,      200, 0x00000000},\n+\t{0x71,    2,    0,       44, 0x00000000},\n \t{0x4f,    1,    2,        0, 0x00000000},\n-\t{0x71,    2,    0,      202, 0x00000000},\n+\t{0x71,    2,    0,       46, 0x00000000},\n \t{0x67,    2,    0,        0, 0x00000010},\n-\t{0x71,    4,    0,      203, 0x00000000},\n+\t{0x71,    4,    0,       47, 0x00000000},\n \t{0x67,    4,    0,        0, 0x00000018},\n \t{0x4f,    4,    2,        0, 0x00000000},\n \t{0x4f,    4,    1,        0, 0x00000000},\n@@ -1725,13 +1725,13 @@ static struct bpf_insn l3_l4_hash_insns[] = {\n \t{0x57,    3,    0,        0, 0x0000000f},\n \t{0x67,    3,    0,        0, 0x00000002},\n \t{0x0f,    0,    3,        0, 0x00000000},\n-\t{0x71,    1,    0,      137, 0x00000000},\n+\t{0x71,    1,    0,       49, 0x00000000},\n \t{0x67,    1,    0,        0, 0x00000008},\n-\t{0x71,    2,    0,      136, 0x00000000},\n+\t{0x71,    2,    0,       48, 0x00000000},\n \t{0x4f,    1,    2,        0, 0x00000000},\n-\t{0x71,    2,    0,      138, 0x00000000},\n+\t{0x71,    2,    0,       50, 0x00000000},\n \t{0x67,    2,    0,        0, 0x00000010},\n-\t{0x71,    3,    0,      139, 0x00000000},\n+\t{0x71,    3,    0,       51, 0x00000000},\n \t{0x67,    3,    0,        0, 0x00000018},\n \t{0x4f,    3,    2,        0, 0x00000000},\n \t{0x4f,    3,    1,        0, 0x00000000},\ndiff --git a/drivers/net/tap/tap_flow.c b/drivers/net/tap/tap_flow.c\nindex ed4d42f92f9f..cd49aa51c8b0 100644\n--- a/drivers/net/tap/tap_flow.c\n+++ b/drivers/net/tap/tap_flow.c\n@@ -11,8 +11,10 @@\n \n #include <rte_byteorder.h>\n #include <rte_jhash.h>\n+#include <rte_thash.h>\n #include <rte_malloc.h>\n #include <rte_eth_tap.h>\n+\n #include <tap_flow.h>\n #include <tap_autoconf.h>\n #include <tap_tcmsgs.h>\n@@ -2053,6 +2055,21 @@ static int bpf_rss_key(enum bpf_rss_key_e cmd, __u32 *key_idx)\n \treturn err;\n }\n \n+\n+/* Default RSS hash key also used by mlx devices */\n+static const uint8_t rss_hash_default_key[] = {\n+\t0x2c, 0xc6, 0x81, 0xd1,\n+\t0x5b, 0xdb, 0xf4, 0xf7,\n+\t0xfc, 0xa2, 0x83, 0x19,\n+\t0xdb, 0x1a, 0x3e, 0x94,\n+\t0x6b, 0x9e, 0x38, 0xd9,\n+\t0x2c, 0x9c, 0x03, 0xd1,\n+\t0xad, 0x99, 0x44, 0xa7,\n+\t0xd9, 0x56, 0x3d, 0x59,\n+\t0x06, 0x3c, 0x25, 0xf3,\n+\t0xfc, 0x1f, 0xdc, 0x2a,\n+};\n+\n /**\n  * Add RSS hash calculations and queue selection\n  *\n@@ -2071,11 +2088,11 @@ static int rss_add_actions(struct rte_flow *flow, struct pmd_internals *pmd,\n \t\t\t   const struct rte_flow_action_rss *rss,\n \t\t\t   struct rte_flow_error *error)\n {\n-\t/* 4096 is the maximum number of instructions for a BPF program */\n+\tstruct rss_key rss_entry = { };\n+\tconst uint8_t *key_in;\n+\tuint32_t hash_type = 0;\n \tunsigned int i;\n \tint err;\n-\tstruct rss_key rss_entry = { .hash_fields = 0,\n-\t\t\t\t     .key_size = 0 };\n \n \t/* Check supported RSS features */\n \tif (rss->func != RTE_ETH_HASH_FUNCTION_DEFAULT)\n@@ -2087,6 +2104,41 @@ static int rss_add_actions(struct rte_flow *flow, struct pmd_internals *pmd,\n \t\t\t(error, ENOTSUP, RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL,\n \t\t\t \"a nonzero RSS encapsulation level is not supported\");\n \n+\tif (rss->queue_num == 0 || rss->queue_num >= TAP_MAX_QUEUES)\n+\t\treturn rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL,\n+\t\t\t\t\t  \"invalid number of queues\");\n+\n+\t/* allow RSS key_len 0 in case of NULL (default) RSS key. */\n+\tif (rss->key_len == 0) {\n+\t\tif (rss->key != NULL)\n+\t\t\treturn rte_flow_error_set(error, ENOTSUP,\n+\t\t\t\t\t\t  RTE_FLOW_ERROR_TYPE_ACTION_CONF,\n+\t\t\t\t\t\t  &rss->key_len, \"RSS hash key length 0\");\n+\t\tkey_in = rss_hash_default_key;\n+\t} else {\n+\t\tif (rss->key_len != TAP_RSS_HASH_KEY_SIZE)\n+\t\t\treturn rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_UNSPECIFIED,\n+\t\t\t\t\t\t  NULL, \"RSS hash invalid key length\");\n+\t\tif (rss->key == NULL)\n+\t\t\treturn rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_UNSPECIFIED,\n+\t\t\t\t\t\t  NULL, \"RSS hash key is NULL\");\n+\t\tkey_in = rss->key;\n+\t}\n+\n+\tif (rss->types & TAP_RSS_HF_MASK)\n+\t\treturn rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_UNSPECIFIED,\n+\t\t\t\t\t  NULL, \"RSS hash type not supported\");\n+\n+\tif (rss->types & (RTE_ETH_RSS_NONFRAG_IPV4_UDP | RTE_ETH_RSS_NONFRAG_IPV4_TCP))\n+\t\thash_type |= RTE_BIT32(HASH_FIELD_IPV4_L3_L4);\n+\telse if (rss->types & (RTE_ETH_RSS_IPV4 | RTE_ETH_RSS_FRAG_IPV4))\n+\t\thash_type |= RTE_BIT32(HASH_FIELD_IPV4_L3);\n+\n+\tif (rss->types & (RTE_ETH_RSS_NONFRAG_IPV6_UDP | RTE_ETH_RSS_NONFRAG_IPV6_TCP))\n+\t\thash_type |= RTE_BIT32(HASH_FIELD_IPV6_L3_L4);\n+\telse if (rss->types & (RTE_ETH_RSS_IPV6 | RTE_ETH_RSS_FRAG_IPV6 | RTE_ETH_RSS_IPV6_EX))\n+\t\thash_type |= RTE_BIT32(HASH_FIELD_IPV6_L3);\n+\n \t/* Get a new map key for a new RSS rule */\n \terr = bpf_rss_key(KEY_CMD_GET, &flow->key_idx);\n \tif (err < 0) {\n@@ -2101,8 +2153,11 @@ static int rss_add_actions(struct rte_flow *flow, struct pmd_internals *pmd,\n \trss_entry.nb_queues = rss->queue_num;\n \tfor (i = 0; i < rss->queue_num; i++)\n \t\trss_entry.queues[i] = rss->queue[i];\n-\trss_entry.hash_fields =\n-\t\t(1 << HASH_FIELD_IPV4_L3_L4) | (1 << HASH_FIELD_IPV6_L3_L4);\n+\n+\trss_entry.hash_fields = hash_type;\n+\trte_convert_rss_key((const uint32_t *)key_in, (uint32_t *)rss_entry.key,\n+\t\t\t    TAP_RSS_HASH_KEY_SIZE);\n+\n \n \t/* Add this RSS entry to map */\n \terr = tap_flow_bpf_update_rss_elem(pmd->map_fd,\ndiff --git a/drivers/net/tap/tap_rss.h b/drivers/net/tap/tap_rss.h\nindex 8766ffc244f6..6009be7031b0 100644\n--- a/drivers/net/tap/tap_rss.h\n+++ b/drivers/net/tap/tap_rss.h\n@@ -24,11 +24,10 @@ enum hash_field {\n };\n \n struct rss_key {\n-\t __u8 key[128];\n \t__u32 hash_fields;\n-\t__u32 key_size;\n-\t__u32 queues[TAP_MAX_QUEUES];\n+\t__u8 key[TAP_RSS_HASH_KEY_SIZE];\n \t__u32 nb_queues;\n+\t__u32 queues[TAP_MAX_QUEUES];\n } __attribute__((packed));\n \n #endif /* _TAP_RSS_H_ */\n",
    "prefixes": [
        "v4",
        "2/7"
    ]
}