get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 133684,
    "url": "http://patches.dpdk.org/api/patches/133684/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20231031220921.96023-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": "<20231031220921.96023-3-stephen@networkplumber.org>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20231031220921.96023-3-stephen@networkplumber.org",
    "date": "2023-10-31T22:08:12",
    "name": "[2/3] net/tap: Fixed RSS algorithm to support fragmented packets",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "563386191877ff19bfd50b4e4def350210e7fa2d",
    "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/20231031220921.96023-3-stephen@networkplumber.org/mbox/",
    "series": [
        {
            "id": 30081,
            "url": "http://patches.dpdk.org/api/series/30081/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=30081",
            "date": "2023-10-31T22:08:10",
            "name": "net/tap: update and fix the BPF program",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/30081/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/133684/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/133684/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 70C8E43256;\n\tTue, 31 Oct 2023 23:09:41 +0100 (CET)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 1A6C14113D;\n\tTue, 31 Oct 2023 23:09:29 +0100 (CET)",
            "from mail-pg1-f175.google.com (mail-pg1-f175.google.com\n [209.85.215.175])\n by mails.dpdk.org (Postfix) with ESMTP id 69014410D3\n for <dev@dpdk.org>; Tue, 31 Oct 2023 23:09:27 +0100 (CET)",
            "by mail-pg1-f175.google.com with SMTP id\n 41be03b00d2f7-5b9a453d3d3so1970771a12.0\n for <dev@dpdk.org>; Tue, 31 Oct 2023 15:09:27 -0700 (PDT)",
            "from fedora.. ([38.142.2.14]) by smtp.gmail.com with ESMTPSA id\n ey2-20020a056a0038c200b0065a1b05193asm100750pfb.185.2023.10.31.15.09.25\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Tue, 31 Oct 2023 15:09:25 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=networkplumber-org.20230601.gappssmtp.com; s=20230601; t=1698790166;\n x=1699394966; 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=Y5erbmDsBMkX+RUS8JiHrd4gA2b3+xKGIg8G9ryNZZg=;\n b=DUfMTw2g8yNT9bFBknviThbiHMF5YtfcE5kFGRDxXV/AZs+9vctmUyOuoZ91cGvd4t\n MolwG4kxL43ivMGAfD/rvzjPhGeI1Ra+y/qRLXNESlEvnEFGoqpfR9Sjr9uzy5QfJlfP\n efcFl7BB+n+eLkl+oQL+wBpFPcvCGpvH+tuT9tTVMUduoOu4cAT+/C9F8vo1SjgJHHri\n hWYuVUj6mdMeorI0Re2vEOqBw9icuCwkRtwOe3NTT5K80wYahPZKhafH7EY7Bg4OfCmE\n hXUn8SStlc5KknoSfp34NoUzpniAWCSJE5YzMIftic+DxnElchHJh5RECVj9kBlg2ijY\n nQSA==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20230601; t=1698790166; x=1699394966;\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=Y5erbmDsBMkX+RUS8JiHrd4gA2b3+xKGIg8G9ryNZZg=;\n b=ebSRvbzZKfPhRzTzRIW6+Hb5UAhUVNWOUh8CEN6ZC9aQgTaHGrx70/FKHTKHcyZCjF\n DenCMw2cNlHXJK4okfmQfO6MkN2tqZSMwGHOwie+PgphHJ7ocHyOE6uXa0CNCv77EBmV\n R0loCOpbAWluXDnLsybDwgLV6fY3rDKf0W7F2ZlrqFnmzwZ6EGO5SfRcFyKhfPRvLpU+\n jvUeWJ5KC548FyNaAdKHScWsZGghjxLrS3CZId2UTmTwFVfdaUW/DSBwv83T9i0TAbH6\n 5ix0jpaFrv7oLXbJvTMA4p33Dp0P5UuysE8bgxdXPSMfjndh+ldBygD6UBfRbapX7/KD\n bdGA==",
        "X-Gm-Message-State": "AOJu0YzvVZ8Et6Lf5YBRNDp2bj94uvL9RYXDxLqLPATD/SKbqhsfHIQw\n ZzO0+FpUhfJXE/71DzhHjiU2wSSNIDuDlwwloRlTXeBz",
        "X-Google-Smtp-Source": "\n AGHT+IF7suuS116dQ1s9peACX1HMhdGQRvZ8yZwVVDwcMTzNmO8DXIG3X9mOA7AWZZs/a4OjGQCs+w==",
        "X-Received": "by 2002:a05:6a20:a206:b0:174:d189:2f93 with SMTP id\n u6-20020a056a20a20600b00174d1892f93mr9426885pzk.59.1698790166198;\n Tue, 31 Oct 2023 15:09:26 -0700 (PDT)",
        "From": "Stephen Hemminger <stephen@networkplumber.org>",
        "To": "dev@dpdk.org",
        "Cc": "Madhuker Mythri <madhuker.mythri@oracle.com>,\n Stephen Hemminger <stephen@networkplumber.org>",
        "Subject": "[PATCH 2/3] net/tap: Fixed RSS algorithm to support fragmented\n packets",
        "Date": "Tue, 31 Oct 2023 15:08:12 -0700",
        "Message-ID": "<20231031220921.96023-3-stephen@networkplumber.org>",
        "X-Mailer": "git-send-email 2.41.0",
        "In-Reply-To": "<20231031220921.96023-1-stephen@networkplumber.org>",
        "References": "<20230716212544.5625-1-stephen@networkplumber.org>\n <20231031220921.96023-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": "From: Madhuker Mythri <madhuker.mythri@oracle.com>\n\nAs per analysis on Tap PMD, the existing RSS algorithm considering\n4-tuple(Src-IP, Dst-IP, Src-port and Dst-port) and identification of\nfragment packets is not done, thus we are seeing all the fragmented\nchunks of single packet differs in RSS hash value and distributed across\nmultiple queues.\nThe RSS algorithm assumes that, all the incoming IP packets are based on\nL4-protocol(UDP/TCP) and trying to fetch the L4 fields(Src-port and\nDst-port) for each incoming packet, but for the fragmented chunks these\nL4-header will not be present(except for first packet) and should not\nconsider in RSS hash for L4 header fields in-case of fragmented chunks.\nWhich is a bug in the RSS algorithm implemented in the BPF functionality\nunder TAP PMD.\n\nSo, modified the RSS eBPF C-program and generated the structure of\nC-array in the 'tap_bpf_insns.h' file, which is in eBPF byte-code\ninstructions format.\n\nBugzilla Id: 870\n\nSigned-off-by: Madhuker Mythri <madhuker.mythri@oracle.com>\nSigned-off-by: Stephen Hemminger <stephen@networkplumber.org>\n---\n drivers/net/tap/bpf/tap_bpf_program.c | 47 ++++++++++++++++++++++-----\n 1 file changed, 39 insertions(+), 8 deletions(-)",
    "diff": "diff --git a/drivers/net/tap/bpf/tap_bpf_program.c b/drivers/net/tap/bpf/tap_bpf_program.c\nindex ff6f1606fb..3d431dfa43 100644\n--- a/drivers/net/tap/bpf/tap_bpf_program.c\n+++ b/drivers/net/tap/bpf/tap_bpf_program.c\n@@ -19,6 +19,8 @@\n #include \"bpf_elf.h\"\n #include \"../tap_rss.h\"\n \n+#include \"bpf_api.h\"\n+\n /** Create IPv4 address */\n #define IPv4(a, b, c, d) ((__u32)(((a) & 0xff) << 24) | \\\n \t\t(((b) & 0xff) << 16) | \\\n@@ -132,6 +134,8 @@ rss_l3_l4(struct __sk_buff *skb)\n \t__u8 *key = 0;\n \t__u32 len;\n \t__u32 queue = 0;\n+\tbool mf = 0;\n+\t__u16 frag_off = 0;\n \n \trsskey = map_lookup_elem(&map_keys, &key_idx);\n \tif (!rsskey) {\n@@ -156,6 +160,8 @@ rss_l3_l4(struct __sk_buff *skb)\n \t\t\treturn TC_ACT_OK;\n \n \t\t__u8 *src_dst_addr = data + off + offsetof(struct iphdr, saddr);\n+\t\t__u8 *frag_off_addr = data + off + offsetof(struct iphdr, frag_off);\n+\t\t__u8 *prot_addr = data + off + offsetof(struct iphdr, protocol);\n \t\t__u8 *src_dst_port = data + off + sizeof(struct iphdr);\n \t\tstruct ipv4_l3_l4_tuple v4_tuple = {\n \t\t\t.src_addr = IPv4(*(src_dst_addr + 0),\n@@ -166,11 +172,25 @@ rss_l3_l4(struct __sk_buff *skb)\n \t\t\t\t\t*(src_dst_addr + 5),\n \t\t\t\t\t*(src_dst_addr + 6),\n \t\t\t\t\t*(src_dst_addr + 7)),\n-\t\t\t.sport = PORT(*(src_dst_port + 0),\n-\t\t\t\t\t*(src_dst_port + 1)),\n-\t\t\t.dport = PORT(*(src_dst_port + 2),\n-\t\t\t\t\t*(src_dst_port + 3)),\n+\t\t\t.sport = 0,\n+\t\t\t.dport = 0,\n \t\t};\n+\t\t/** Fetch the L4-payer port numbers only in-case of TCP/UDP\n+\t\t ** and also if the packet is not fragmented. Since fragmented\n+\t\t ** chunks do not have L4 TCP/UDP header.\n+\t\t **/\n+\t\tif (*prot_addr == IPPROTO_UDP || *prot_addr == IPPROTO_TCP) {\n+\t\t\tfrag_off = PORT(*(frag_off_addr + 0),\n+\t\t\t\t\t*(frag_off_addr + 1));\n+\t\t\tmf = frag_off & 0x2000;\n+\t\t\tfrag_off = frag_off & 0x1fff;\n+\t\t\tif (mf == 0 && frag_off == 0) {\n+\t\t\t\tv4_tuple.sport = PORT(*(src_dst_port + 0),\n+\t\t\t\t\t\t*(src_dst_port + 1));\n+\t\t\t\tv4_tuple.dport = PORT(*(src_dst_port + 2),\n+\t\t\t\t\t\t*(src_dst_port + 3));\n+\t\t\t}\n+\t\t}\n \t\t__u8 input_len = sizeof(v4_tuple) / sizeof(__u32);\n \t\tif (rsskey->hash_fields & (1 << HASH_FIELD_IPV4_L3))\n \t\t\tinput_len--;\n@@ -183,6 +203,9 @@ rss_l3_l4(struct __sk_buff *skb)\n \t\t\t\t\toffsetof(struct ipv6hdr, saddr);\n \t\t__u8 *src_dst_port = data + off +\n \t\t\t\t\tsizeof(struct ipv6hdr);\n+\t\t__u8 *next_hdr = data + off +\n+\t\t\t\t\toffsetof(struct ipv6hdr, nexthdr);\n+\n \t\tstruct ipv6_l3_l4_tuple v6_tuple;\n \t\tfor (j = 0; j < 4; j++)\n \t\t\t*((uint32_t *)&v6_tuple.src_addr + j) =\n@@ -192,10 +215,18 @@ rss_l3_l4(struct __sk_buff *skb)\n \t\t\t*((uint32_t *)&v6_tuple.dst_addr + j) =\n \t\t\t\t__builtin_bswap32(*((uint32_t *)\n \t\t\t\t\t\tsrc_dst_addr + 4 + j));\n-\t\tv6_tuple.sport = PORT(*(src_dst_port + 0),\n-\t\t\t      *(src_dst_port + 1));\n-\t\tv6_tuple.dport = PORT(*(src_dst_port + 2),\n-\t\t\t      *(src_dst_port + 3));\n+\n+\t\t/** Fetch the L4 header port-numbers only if next-header\n+\t\t * is TCP/UDP **/\n+\t\tif (*next_hdr == IPPROTO_UDP || *next_hdr == IPPROTO_TCP) {\n+\t\t\tv6_tuple.sport = PORT(*(src_dst_port + 0),\n+\t\t\t\t      *(src_dst_port + 1));\n+\t\t\tv6_tuple.dport = PORT(*(src_dst_port + 2),\n+\t\t\t\t      *(src_dst_port + 3));\n+\t\t} else {\n+\t\t\tv6_tuple.sport = 0;\n+\t\t\tv6_tuple.dport = 0;\n+\t\t}\n \n \t\t__u8 input_len = sizeof(v6_tuple) / sizeof(__u32);\n \t\tif (rsskey->hash_fields & (1 << HASH_FIELD_IPV6_L3))\n",
    "prefixes": [
        "2/3"
    ]
}