get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 2225113,
    "url": "http://patchwork.ozlabs.org/api/1.1/patches/2225113/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/netfilter-devel/patch/20260420105816.72168-5-mahe.tardy@gmail.com/",
    "project": {
        "id": 26,
        "url": "http://patchwork.ozlabs.org/api/1.1/projects/26/?format=api",
        "name": "Netfilter Development",
        "link_name": "netfilter-devel",
        "list_id": "netfilter-devel.vger.kernel.org",
        "list_email": "netfilter-devel@vger.kernel.org",
        "web_url": null,
        "scm_url": null,
        "webscm_url": null
    },
    "msgid": "<20260420105816.72168-5-mahe.tardy@gmail.com>",
    "date": "2026-04-20T10:58:14",
    "name": "[bpf-next,v4,4/6] selftests/bpf: add icmp_send_unreach kfunc tests",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "c794e0084dbe98e39c3edc9dbbfee89dafbbb7ba",
    "submitter": {
        "id": 91349,
        "url": "http://patchwork.ozlabs.org/api/1.1/people/91349/?format=api",
        "name": "Mahe Tardy",
        "email": "mahe.tardy@gmail.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/netfilter-devel/patch/20260420105816.72168-5-mahe.tardy@gmail.com/mbox/",
    "series": [
        {
            "id": 500597,
            "url": "http://patchwork.ozlabs.org/api/1.1/series/500597/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/netfilter-devel/list/?series=500597",
            "date": "2026-04-20T10:58:10",
            "name": "bpf: add icmp_send_unreach kfunc",
            "version": 4,
            "mbox": "http://patchwork.ozlabs.org/series/500597/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2225113/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2225113/checks/",
    "tags": {},
    "headers": {
        "Return-Path": "\n <netfilter-devel+bounces-12043-incoming=patchwork.ozlabs.org@vger.kernel.org>",
        "X-Original-To": [
            "incoming@patchwork.ozlabs.org",
            "netfilter-devel@vger.kernel.org"
        ],
        "Delivered-To": "patchwork-incoming@legolas.ozlabs.org",
        "Authentication-Results": [
            "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256\n header.s=20251104 header.b=p29QGp/J;\n\tdkim-atps=neutral",
            "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=2600:3c04:e001:36c::12fc:5321; helo=tor.lore.kernel.org;\n envelope-from=netfilter-devel+bounces-12043-incoming=patchwork.ozlabs.org@vger.kernel.org;\n receiver=patchwork.ozlabs.org)",
            "smtp.subspace.kernel.org;\n\tdkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com\n header.b=\"p29QGp/J\"",
            "smtp.subspace.kernel.org;\n arc=none smtp.client-ip=209.85.128.42",
            "smtp.subspace.kernel.org;\n dmarc=pass (p=none dis=none) header.from=gmail.com",
            "smtp.subspace.kernel.org;\n spf=pass smtp.mailfrom=gmail.com"
        ],
        "Received": [
            "from tor.lore.kernel.org (tor.lore.kernel.org\n [IPv6:2600:3c04:e001:36c::12fc:5321])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fzjFx0jyZz1yCv\n\tfor <incoming@patchwork.ozlabs.org>; Mon, 20 Apr 2026 21:00:53 +1000 (AEST)",
            "from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby tor.lore.kernel.org (Postfix) with ESMTP id 63B943037C2F\n\tfor <incoming@patchwork.ozlabs.org>; Mon, 20 Apr 2026 10:58:54 +0000 (UTC)",
            "from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id D5CDB39B964;\n\tMon, 20 Apr 2026 10:58:36 +0000 (UTC)",
            "from mail-wm1-f42.google.com (mail-wm1-f42.google.com\n [209.85.128.42])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits))\n\t(No client certificate requested)\n\tby smtp.subspace.kernel.org (Postfix) with ESMTPS id 1131839BFEA\n\tfor <netfilter-devel@vger.kernel.org>; Mon, 20 Apr 2026 10:58:34 +0000 (UTC)",
            "by mail-wm1-f42.google.com with SMTP id\n 5b1f17b1804b1-488e1a8ac40so38967825e9.2\n        for <netfilter-devel@vger.kernel.org>;\n Mon, 20 Apr 2026 03:58:33 -0700 (PDT)",
            "from mtardy-friendly-lvh-runner.local ([2600:1900:4010:1a8::])\n        by smtp.googlemail.com with ESMTPSA id\n 5b1f17b1804b1-488fc1cfbf2sm290929495e9.15.2026.04.20.03.58.31\n        (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n        Mon, 20 Apr 2026 03:58:32 -0700 (PDT)"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1776682716; cv=none;\n b=ew0KkLLok75jrzzuzoTE3CIszuPxOo7cdR9rQnPUIwNo+u+xL1VuzcjnKeERm3HfYXgivdhkmXP4fuTEQdwDJTBHM3r/5oR8OhkXyOtS0BAZBLM9K+w+i7Et+R5q/rpc9vzTjlWH65Jr97EO9XBj7l/KiYRVfuYm4CvwUWUz5QA=",
        "ARC-Message-Signature": "i=1; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1776682716; c=relaxed/simple;\n\tbh=CaSk3WjxQ4BTCU8oH0q4f4ER0ZZvGK9z0YdkAWP2Vf4=;\n\th=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References:\n\t MIME-Version;\n b=t4jOxLZcXXCwWwIVZ8SALELNeBC489lTtONLo0mSTLnAHhbAegyQqXnwVzM33sLuJtu8aob1CCQbfVnfIyviDrbCwQl/TgAqu9j/yrI5vu9Tu4nQ0nfnNsssQEL9Xp528WcIuc8s80nUVHS0981GymL1gnzkmtiPzwFeJ/u3B/Y=",
        "ARC-Authentication-Results": "i=1; smtp.subspace.kernel.org;\n dmarc=pass (p=none dis=none) header.from=gmail.com;\n spf=pass smtp.mailfrom=gmail.com;\n dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com\n header.b=p29QGp/J; arc=none smtp.client-ip=209.85.128.42",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n        d=gmail.com; s=20251104; t=1776682712; x=1777287512;\n darn=vger.kernel.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=1/eX958hSrcjpsF7S2eDJscZseiSjiPgSY/nig0UcIA=;\n        b=p29QGp/JYk+dKQ8znasXmu7odw3VjChsFme1N8GkIi7H+UAIAbSnzlgUBsBF5uz3vA\n         xBgdLaiL0JlCSMIHw+EOKrUtLSP5oT0NIkbVxa0UYBkxWtrqfx4sTLi5/XnIKzzCLPm7\n         daB7Fc0svmn7Awk6N/0QLwBagatq95/NfMcUJZi/3hBTix7ki5domDUalwlfnLOECBnh\n         IUD8Fc5kbGaEVif+dHjE8P2i9bg4crEsbopt6wiRUphN6BgVMkCC9o7RcmGmHmE04tTU\n         H9+pAMP1LKVlji+/qh5zlJik7Pk9/sLz08jx2qwkNH3WXW3hEYLPUBhCl7Xl84E908Qy\n         hYJw==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n        d=1e100.net; s=20251104; t=1776682712; x=1777287512;\n        h=content-transfer-encoding:mime-version:references:in-reply-to\n         :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from\n         :to:cc:subject:date:message-id:reply-to;\n        bh=1/eX958hSrcjpsF7S2eDJscZseiSjiPgSY/nig0UcIA=;\n        b=EQE2NavOZOR8mu1rN6yibnHI1Be/YxIuTuMNtlLelIiUBiz8/6t8gT+8iqSIXcCPvJ\n         B0wjMrc5UEQxNSxiyyTpDRzcEeZTdTiF48HRwH+5ekOH9/HcnbL2zQ8sSpl5NJkdS8kp\n         N0ooOg1fYLHTQLsbwsA4rAZoAVSBTrpu7OnnQSrOCiIIY5iQ8Rxilmj2kii4Zt58V1Em\n         1ptRlEO02xeFdQrLfdSh0vSis1cLxMpPVggE/6RbSRgtGLhtudJyThTn/bjyG+O/51Um\n         7NGfKC89UqeTxoIamExHrmx98kCqlkPRcP6QLxscUGwl6ji0iJE+5jr/nhqO5L2R+Ayb\n         S5xg==",
        "X-Forwarded-Encrypted": "i=1;\n AFNElJ/iaFogHMdOkvihjQFZ9/H9kPeYrBDeVBGxtZHq+2ANltweMCv3hP1qr8jut6qiECiHe0V8SOM4dmSG+UbV2wQ=@vger.kernel.org",
        "X-Gm-Message-State": "AOJu0YxoWFBMVglkBCN2jcs2h1B89eo7h4U+Q6soO7CXcTlJ8lfUlSo3\n\tyEEV1wUZ8EovU/blGcejMC+MeYjTlMJIwmK8Y25W77JZ+Hw7pCAnJ4BO",
        "X-Gm-Gg": "AeBDievrI8p4qxWkyXATLwNysxOyAF8/iivwh1ASzI3j0v1doPtqk0/6lpCrrBuXsK5\n\tt4MA8IP9xQ9H2jd2Z3XFC0UvLl0SM99g967FDNN2px6tjn9ZQXdBPoaXsc8rghf0m5/V1OpQgGn\n\tEIACrIDhaJxhBR2Gx4KDvNNFdGQmszYeg1QmgRlw9zFTaSp9F6acP1jaPxJ1hZ8igPvDoshJHPy\n\tJhf3aqbS80XGNHl10+IRKOk0HruXg8r7lTG9WrL+OhCzKX09Py/sXuREHPcWkyjS3rr/nM3ER0q\n\tVXqE/jgwQ9wNaXYJCoOelCjt6UjWt/bAnflAy29BuwAB3GCHY2RfSQ8r+MDnNMkfafNBIbmIL3m\n\tXZgOUaiWOtUFW4BXzjpg1AzZ6gukUAaVYggy5HBxqt0H+JCoPlQWpVpcicZtQDF99m3UTWry2qA\n\t7srJPd3qyotLEPoFS9CWUB7+BiwyCM5S3qJcmoMQ==",
        "X-Received": "by 2002:a05:600c:a318:b0:485:3fd1:9936 with SMTP id\n 5b1f17b1804b1-488fb746a0cmr146403945e9.5.1776682712449;\n        Mon, 20 Apr 2026 03:58:32 -0700 (PDT)",
        "From": "Mahe Tardy <mahe.tardy@gmail.com>",
        "To": "mahe.tardy@gmail.com",
        "Cc": "alexei.starovoitov@gmail.com,\n\tandrii@kernel.org,\n\tast@kernel.org,\n\tbpf@vger.kernel.org,\n\tcoreteam@netfilter.org,\n\tdaniel@iogearbox.net,\n\tfw@strlen.de,\n\tjohn.fastabend@gmail.com,\n\tlkp@intel.com,\n\tmartin.lau@linux.dev,\n\tnetdev@vger.kernel.org,\n\tnetfilter-devel@vger.kernel.org,\n\toe-kbuild-all@lists.linux.dev,\n\tpablo@netfilter.org",
        "Subject": "[PATCH bpf-next v4 4/6] selftests/bpf: add icmp_send_unreach kfunc\n tests",
        "Date": "Mon, 20 Apr 2026 10:58:14 +0000",
        "Message-Id": "<20260420105816.72168-5-mahe.tardy@gmail.com>",
        "X-Mailer": "git-send-email 2.34.1",
        "In-Reply-To": "<20260420105816.72168-1-mahe.tardy@gmail.com>",
        "References": "<aI0MkNvWlE4FXMV8@gmail.com>\n <20260420105816.72168-1-mahe.tardy@gmail.com>",
        "Precedence": "bulk",
        "X-Mailing-List": "netfilter-devel@vger.kernel.org",
        "List-Id": "<netfilter-devel.vger.kernel.org>",
        "List-Subscribe": "<mailto:netfilter-devel+subscribe@vger.kernel.org>",
        "List-Unsubscribe": "<mailto:netfilter-devel+unsubscribe@vger.kernel.org>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit"
    },
    "content": "This test opens a server and client, enters a new cgroup, attach a\ncgroup_skb program on egress and calls the icmp_send_unreach function\nfrom the client egress so that an ICMP unreach control message is sent\nback to the client.  It then fetches the message from the error queue to\nconfirm the correct ICMP unreach code has been sent.\n\nNote that, for the client, we have to connect in non-blocking mode to\nlet the test execute faster. Otherwise, we need to wait for the TCP\nthree-way handshake to timeout in the kernel before reading the errno.\n\nAlso note that we don't set IP_RECVERR on the socket in\nconnect_to_fd_nonblock since the error will be transferred anyway in our\ntest because the connection is rejected at the beginning of the TCP\nhandshake. See in net/ipv4/tcp_ipv4.c:tcp_v4_err line 615 to 655 for\nmore details.\n\nSigned-off-by: Mahe Tardy <mahe.tardy@gmail.com>\n---\n .../bpf/prog_tests/icmp_send_unreach_kfunc.c  | 136 ++++++++++++++++++\n .../selftests/bpf/progs/icmp_send_unreach.c   |  36 +++++\n 2 files changed, 172 insertions(+)\n create mode 100644 tools/testing/selftests/bpf/prog_tests/icmp_send_unreach_kfunc.c\n create mode 100644 tools/testing/selftests/bpf/progs/icmp_send_unreach.c\n\n--\n2.34.1",
    "diff": "diff --git a/tools/testing/selftests/bpf/prog_tests/icmp_send_unreach_kfunc.c b/tools/testing/selftests/bpf/prog_tests/icmp_send_unreach_kfunc.c\nnew file mode 100644\nindex 000000000000..24d5e01cfe80\n--- /dev/null\n+++ b/tools/testing/selftests/bpf/prog_tests/icmp_send_unreach_kfunc.c\n@@ -0,0 +1,136 @@\n+// SPDX-License-Identifier: GPL-2.0\n+#include <test_progs.h>\n+#include <network_helpers.h>\n+#include <linux/errqueue.h>\n+#include \"icmp_send_unreach.skel.h\"\n+\n+#define TIMEOUT_MS 1000\n+#define SRV_PORT 54321\n+\n+#define ICMP_DEST_UNREACH 3\n+\n+#define ICMP_FRAG_NEEDED 4\n+#define NR_ICMP_UNREACH 15\n+\n+static int connect_to_fd_nonblock(int server_fd)\n+{\n+\tstruct sockaddr_storage addr;\n+\tsocklen_t len = sizeof(addr);\n+\tint fd, err;\n+\n+\tif (getsockname(server_fd, (struct sockaddr *)&addr, &len))\n+\t\treturn -1;\n+\n+\tfd = socket(addr.ss_family, SOCK_STREAM | SOCK_NONBLOCK, 0);\n+\tif (fd < 0)\n+\t\treturn -1;\n+\n+\terr = connect(fd, (struct sockaddr *)&addr, len);\n+\tif (err < 0 && errno != EINPROGRESS) {\n+\t\tclose(fd);\n+\t\treturn -1;\n+\t}\n+\n+\treturn fd;\n+}\n+\n+static void read_icmp_errqueue(int sockfd, int expected_code)\n+{\n+\tssize_t n;\n+\tstruct sock_extended_err *sock_err;\n+\tstruct cmsghdr *cm;\n+\tchar ctrl_buf[512];\n+\tstruct msghdr msg = {\n+\t\t.msg_control = ctrl_buf,\n+\t\t.msg_controllen = sizeof(ctrl_buf),\n+\t};\n+\n+\tn = recvmsg(sockfd, &msg, MSG_ERRQUEUE);\n+\tif (!ASSERT_GE(n, 0, \"recvmsg_errqueue\"))\n+\t\treturn;\n+\n+\tcm = CMSG_FIRSTHDR(&msg);\n+\tif (!ASSERT_NEQ(cm, NULL, \"cm_firsthdr_null\"))\n+\t\treturn;\n+\n+\tfor (; cm; cm = CMSG_NXTHDR(&msg, cm)) {\n+\t\tif (!ASSERT_EQ(cm->cmsg_level, IPPROTO_IP, \"cmsg_type\") ||\n+\t\t    !ASSERT_EQ(cm->cmsg_type, IP_RECVERR, \"cmsg_level\"))\n+\t\t\tcontinue;\n+\n+\t\tsock_err = (struct sock_extended_err *)CMSG_DATA(cm);\n+\n+\t\tif (!ASSERT_EQ(sock_err->ee_origin, SO_EE_ORIGIN_ICMP,\n+\t\t\t       \"sock_err_origin_icmp\"))\n+\t\t\treturn;\n+\t\tif (!ASSERT_EQ(sock_err->ee_type, ICMP_DEST_UNREACH,\n+\t\t\t       \"sock_err_type_dest_unreach\"))\n+\t\t\treturn;\n+\t\tASSERT_EQ(sock_err->ee_code, expected_code, \"sock_err_code\");\n+\t}\n+}\n+\n+static void trigger_prog_read_icmp_errqueue(int *code)\n+{\n+\tint srv_fd = -1, client_fd = -1;\n+\n+\tsrv_fd = start_server(AF_INET, SOCK_STREAM, \"127.0.0.1\", SRV_PORT,\n+\t\t\t      TIMEOUT_MS);\n+\tif (!ASSERT_GE(srv_fd, 0, \"start_server\"))\n+\t\treturn;\n+\n+\tclient_fd = connect_to_fd_nonblock(srv_fd);\n+\tif (!ASSERT_GE(client_fd, 0, \"client_connect_nonblock\")) {\n+\t\tclose(srv_fd);\n+\t\treturn;\n+\t}\n+\n+\t/* Skip reading ICMP error queue if code is invalid */\n+\tif (*code >= 0 && *code <= NR_ICMP_UNREACH)\n+\t\tread_icmp_errqueue(client_fd, *code);\n+\n+\tclose(srv_fd);\n+\tclose(client_fd);\n+}\n+\n+void test_icmp_send_unreach_kfunc(void)\n+{\n+\tstruct icmp_send_unreach *skel;\n+\tint cgroup_fd = -1;\n+\tint *code;\n+\n+\tskel = icmp_send_unreach__open_and_load();\n+\tif (!ASSERT_OK_PTR(skel, \"skel_open\"))\n+\t\tgoto cleanup;\n+\n+\tcgroup_fd = test__join_cgroup(\"/icmp_send_unreach_cgroup\");\n+\tif (!ASSERT_GE(cgroup_fd, 0, \"join_cgroup\"))\n+\t\tgoto cleanup;\n+\n+\tskel->links.egress =\n+\t\tbpf_program__attach_cgroup(skel->progs.egress, cgroup_fd);\n+\tif (!ASSERT_OK_PTR(skel->links.egress, \"prog_attach_cgroup\"))\n+\t\tgoto cleanup;\n+\n+\tcode = &skel->bss->unreach_code;\n+\n+\tfor (*code = 0; *code <= NR_ICMP_UNREACH; (*code)++) {\n+\t\t/* The TCP stack reacts differently when asking for\n+\t\t * fragmentation, let's ignore it for now.\n+\t\t */\n+\t\tif (*code == ICMP_FRAG_NEEDED)\n+\t\t\tcontinue;\n+\n+\t\ttrigger_prog_read_icmp_errqueue(code);\n+\t\tASSERT_EQ(skel->data->kfunc_ret, 0, \"kfunc_ret\");\n+\t}\n+\n+\t/* Test an invalid code */\n+\t*code = -1;\n+\ttrigger_prog_read_icmp_errqueue(code);\n+\tASSERT_EQ(skel->data->kfunc_ret, -EINVAL, \"kfunc_ret\");\n+\n+cleanup:\n+\ticmp_send_unreach__destroy(skel);\n+\tclose(cgroup_fd);\n+}\ndiff --git a/tools/testing/selftests/bpf/progs/icmp_send_unreach.c b/tools/testing/selftests/bpf/progs/icmp_send_unreach.c\nnew file mode 100644\nindex 000000000000..6fc5595f08aa\n--- /dev/null\n+++ b/tools/testing/selftests/bpf/progs/icmp_send_unreach.c\n@@ -0,0 +1,36 @@\n+// SPDX-License-Identifier: GPL-2.0\n+#include \"vmlinux.h\"\n+#include <bpf/bpf_helpers.h>\n+#include <bpf/bpf_endian.h>\n+\n+#define SERVER_PORT 54321\n+/* 127.0.0.1 in network byte order */\n+#define SERVER_IP 0x7F000001\n+\n+int unreach_code = 0;\n+int kfunc_ret = -1;\n+\n+SEC(\"cgroup_skb/egress\")\n+int egress(struct __sk_buff *skb)\n+{\n+\tvoid *data = (void *)(long)skb->data;\n+\tvoid *data_end = (void *)(long)skb->data_end;\n+\tstruct iphdr *iph;\n+\tstruct tcphdr *tcph;\n+\n+\tiph = data;\n+\tif ((void *)(iph + 1) > data_end || iph->version != 4 ||\n+\t    iph->protocol != IPPROTO_TCP || iph->daddr != bpf_htonl(SERVER_IP))\n+\t\treturn SK_PASS;\n+\n+\ttcph = (void *)iph + iph->ihl * 4;\n+\tif ((void *)(tcph + 1) > data_end ||\n+\t    tcph->dest != bpf_htons(SERVER_PORT))\n+\t\treturn SK_PASS;\n+\n+\tkfunc_ret = bpf_icmp_send_unreach(skb, unreach_code);\n+\n+\treturn SK_DROP;\n+}\n+\n+char LICENSE[] SEC(\"license\") = \"Dual BSD/GPL\";\n",
    "prefixes": [
        "bpf-next",
        "v4",
        "4/6"
    ]
}