get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 2225115,
    "url": "http://patchwork.ozlabs.org/api/1.1/patches/2225115/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/netfilter-devel/patch/20260420105816.72168-6-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-6-mahe.tardy@gmail.com>",
    "date": "2026-04-20T10:58:15",
    "name": "[bpf-next,v4,5/6] selftests/bpf: add icmp_send_unreach kfunc IPv6 tests",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "cc79d580aae939382628722a1041a191ad1219a7",
    "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-6-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/2225115/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2225115/checks/",
    "tags": {},
    "headers": {
        "Return-Path": "\n <netfilter-devel+bounces-12044-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=bFMEIcKf;\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-12044-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=\"bFMEIcKf\"",
            "smtp.subspace.kernel.org;\n arc=none smtp.client-ip=209.85.128.47",
            "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)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fzjGh65gBz1yCv\n\tfor <incoming@patchwork.ozlabs.org>; Mon, 20 Apr 2026 21:01:32 +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 178FC30532A3\n\tfor <incoming@patchwork.ozlabs.org>; Mon, 20 Apr 2026 10:59:02 +0000 (UTC)",
            "from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id B6B7A39E193;\n\tMon, 20 Apr 2026 10:58:37 +0000 (UTC)",
            "from mail-wm1-f47.google.com (mail-wm1-f47.google.com\n [209.85.128.47])\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 C0CF639C017\n\tfor <netfilter-devel@vger.kernel.org>; Mon, 20 Apr 2026 10:58:34 +0000 (UTC)",
            "by mail-wm1-f47.google.com with SMTP id\n 5b1f17b1804b1-48334ee0aeaso28785005e9.1\n        for <netfilter-devel@vger.kernel.org>;\n Mon, 20 Apr 2026 03:58:34 -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.32\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=1776682717; cv=none;\n b=WI5fdpagQp6ttEVTbOMUxf0MUQKsiPYB65/8jVk4BkjxID882Lsy0A+t84j2jHaLgHe0pYnxkRPNdnp7T/PfknVBp9/NSsh1BtD8YoG9jnySA1Az2yVZlPieFKsOBhbw2qnB6vp107F3RzZJyCC9FFuQ9xUcpyFe2RghwyuVNqU=",
        "ARC-Message-Signature": "i=1; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1776682717; c=relaxed/simple;\n\tbh=Fh6CaK0fZ1D4tkPanUSklUgF2rVts3ajN/VQbFpxIVo=;\n\th=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References:\n\t MIME-Version;\n b=eWDhvzR3r++hPqGhtg3OYEtQZUXed0gQZ11jqZWYSeuqQy5ib+qJKFP/Rx0YTAj8Tqnz/mxN6b/qmWFl3Krr7qNpTBzfM3PbA8c40BKOwquvrczZ9dHjBLUWPrttKNdJAMkrvAMpaCSaA51VrW+JozLCzolynemkPCCtT8pYF98=",
        "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=bFMEIcKf; arc=none smtp.client-ip=209.85.128.47",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n        d=gmail.com; s=20251104; t=1776682713; x=1777287513;\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=twOlZoOTygDkYCis+uEjGUkEKcF5nE7RCevCUCi1CAg=;\n        b=bFMEIcKfEFDFYKHh5fcs7LMKJ4yUAEOOjzb7mIXfMGjt1iHw4woR/cln8dgwN0sVTf\n         BeqwihBOqinUj2u59ntDp4VIig4yPbc+EVxD/SRfexx2x8Xf2OHRCpdt+al0P3HCwfP7\n         YEA8K+pYFhLHl/wD5j5x7Ax5GyDPNQkK27AhFx2xA5gGs+GMD5o0Da7ZSJ5cl3pDjmtp\n         J1rF29/8OV7Eg9A/mTOnRJzINVSpS2nBPyYGqoVFzococAHoMFS9vBs5c+RGajJtSbyC\n         3DCuH0OM1McFfOL4BrSSD9b7/k8za3s1PELQRx1bdHfrQbI6uXzq9jnuNGfbED4aOiTG\n         jzxw==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n        d=1e100.net; s=20251104; t=1776682713; x=1777287513;\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=twOlZoOTygDkYCis+uEjGUkEKcF5nE7RCevCUCi1CAg=;\n        b=hVFfK11YFNFumMckrlmzTqUZa2QcN3As3Dm1zozYkLBrGImwshAlgU4AOpvnmvEMQw\n         CpR3IVwxvpvi09h13xT0qxSryCcIyJnoLjUllsufHzyfkfmqjpsfN6hv1/RJN1Ag/YOI\n         VFQhC8ogFYTAvSuVndxE1mLH1w7bzw58RcVj63W+DoyRone0ZaIusPoqg95TBUxgqGW4\n         xdOi/MDpag+8c+mcDJ2DL0wUqXiKDWuM+N4j8XF5mteXks6SXwS82M0Uukry8efH9E30\n         jO4DWuElM5VuB2IrewQDCeLsQ/yc3gRwpj2vBctY9EKZtf5coYd/7wtMHn6Kp4I72U57\n         scxQ==",
        "X-Forwarded-Encrypted": "i=1;\n AFNElJ+cfMiNHIkL314qyrwCl1k9GUGgvPWdH9I9mFKw8EXmD1Cw5LvTTHZjTw7hyx4d7ZcDsSotSS4/x1z11Coc/Ik=@vger.kernel.org",
        "X-Gm-Message-State": "AOJu0YzCC0tLce70jr5j3xBw+dHh8/FmjnSW3zYz12SZ4XNJGFWC4gAx\n\toXa9rP775MG7VTHZGsgtgOwmBLJAOZ6N9orjjqMMQCgyIEUgURyLpbWQ",
        "X-Gm-Gg": "AeBDievHCff0/GaEwxwizBmBbfOY9tLGsM0KKoioYllpttOIHR7uIG5fNYo5XRFLf0d\n\tLt+FVJZYsstD/dRaBqy9Ma78BcHVHhk/QlKdM12E9oVANdU7fRBMBWVtakE9pv35128tVMNEo4X\n\t5iV7PTsILhyd+Wh+6OHC1Qh5frlEViMriVIoJ527oCgk7vYwrfAzxw2P6m/oY+4QKtqk6oXOu2l\n\tksrltV71wncqQgVgEC39pmRHsbxXKDB1BQhtEnkBt+r5meGIeYcDA/bSUxnTbRT1r1u00faqnAe\n\tAjIecBlR7gpwBceBJ+KCb5sXiP/koOVMVsQ2YVUiFuA5FRl0QZLnJ7i/FYMq+26qBPBZgI/99rj\n\tHRcQxXhoff6TOufKx6NOc22E98vfR2xR2ZEYr0jGb86ByBLwWljb3244uM6UHi0PhtUVwo60DIP\n\tY+UPh4oqw4Dwem7gY2Q8fnW+oY2wKDsAjhNgjCTg==",
        "X-Received": "by 2002:a05:600c:6296:b0:483:64b4:79da with SMTP id\n 5b1f17b1804b1-488fb7923a9mr178493405e9.26.1776682713015;\n        Mon, 20 Apr 2026 03:58:33 -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 5/6] selftests/bpf: add icmp_send_unreach kfunc\n IPv6 tests",
        "Date": "Mon, 20 Apr 2026 10:58:15 +0000",
        "Message-Id": "<20260420105816.72168-6-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 extend the existing IPv4 tests to IPv6.\n\nNote that we need to set IP_RECVERR on the socket for IPv6 in\nconnect_to_fd_nonblock otherwise the error will be ignored even if we\nare in the middle of the TCP handshake. See in\nnet/ipv6/datagram.c:ipv6_icmp_error line 313 for more details.\n\nSigned-off-by: Mahe Tardy <mahe.tardy@gmail.com>\n---\n .../bpf/prog_tests/icmp_send_unreach_kfunc.c  | 83 ++++++++++++-------\n .../selftests/bpf/progs/icmp_send_unreach.c   | 46 ++++++++--\n 2 files changed, 93 insertions(+), 36 deletions(-)\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\nindex 24d5e01cfe80..047bfd4d80f7 100644\n--- a/tools/testing/selftests/bpf/prog_tests/icmp_send_unreach_kfunc.c\n+++ b/tools/testing/selftests/bpf/prog_tests/icmp_send_unreach_kfunc.c\n@@ -8,15 +8,17 @@\n #define SRV_PORT 54321\n\n #define ICMP_DEST_UNREACH 3\n+#define ICMPV6_DEST_UNREACH 1\n\n #define ICMP_FRAG_NEEDED 4\n #define NR_ICMP_UNREACH 15\n+#define NR_ICMPV6_UNREACH 6\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+\tint fd, err, on = 1;\n\n \tif (getsockname(server_fd, (struct sockaddr *)&addr, &len))\n \t\treturn -1;\n@@ -25,6 +27,12 @@ static int connect_to_fd_nonblock(int server_fd)\n \tif (fd < 0)\n \t\treturn -1;\n\n+\tif (addr.ss_family == AF_INET6 &&\n+\t    setsockopt(fd, IPPROTO_IPV6, IPV6_RECVERR, &on, sizeof(on)) < 0) {\n+\t\tclose(fd);\n+\t\treturn -1;\n+\t}\n+\n \terr = connect(fd, (struct sockaddr *)&addr, len);\n \tif (err < 0 && errno != EINPROGRESS) {\n \t\tclose(fd);\n@@ -34,7 +42,7 @@ static int connect_to_fd_nonblock(int server_fd)\n \treturn fd;\n }\n\n-static void read_icmp_errqueue(int sockfd, int expected_code)\n+static void read_icmp_errqueue(int sockfd, int expected_code, int af)\n {\n \tssize_t n;\n \tstruct sock_extended_err *sock_err;\n@@ -44,6 +52,12 @@ static void read_icmp_errqueue(int sockfd, int expected_code)\n \t\t.msg_control = ctrl_buf,\n \t\t.msg_controllen = sizeof(ctrl_buf),\n \t};\n+\tint expected_level = (af == AF_INET) ? IPPROTO_IP : IPPROTO_IPV6;\n+\tint expected_type = (af == AF_INET) ? IP_RECVERR : IPV6_RECVERR;\n+\tint expected_origin = (af == AF_INET) ? SO_EE_ORIGIN_ICMP :\n+\t\t\t\t\t\tSO_EE_ORIGIN_ICMP6;\n+\tint expected_ee_type = (af == AF_INET) ? ICMP_DEST_UNREACH :\n+\t\t\t\t\t\t ICMPV6_DEST_UNREACH;\n\n \tn = recvmsg(sockfd, &msg, MSG_ERRQUEUE);\n \tif (!ASSERT_GE(n, 0, \"recvmsg_errqueue\"))\n@@ -54,28 +68,27 @@ static void read_icmp_errqueue(int sockfd, int expected_code)\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\tif (!ASSERT_EQ(cm->cmsg_level, expected_level, \"cmsg_level\") ||\n+\t\t    !ASSERT_EQ(cm->cmsg_type, expected_type, \"cmsg_type\"))\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\tif (!ASSERT_EQ(sock_err->ee_origin, expected_origin,\n+\t\t\t       \"sock_err_origin\"))\n \t\t\treturn;\n-\t\tif (!ASSERT_EQ(sock_err->ee_type, ICMP_DEST_UNREACH,\n+\t\tif (!ASSERT_EQ(sock_err->ee_type, expected_ee_type,\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+static void trigger_prog_read_icmp_errqueue(int *code, int af, const char *addr)\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+\tsrv_fd = start_server(af, SOCK_STREAM, addr, SRV_PORT, TIMEOUT_MS);\n \tif (!ASSERT_GE(srv_fd, 0, \"start_server\"))\n \t\treturn;\n\n@@ -86,18 +99,40 @@ static void trigger_prog_read_icmp_errqueue(int *code)\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+\tif (*code >= 0 && ((af == AF_INET && *code <= NR_ICMP_UNREACH) ||\n+\t\t\t   (af == AF_INET6 && *code <= NR_ICMPV6_UNREACH)))\n+\t\tread_icmp_errqueue(client_fd, *code, af);\n\n-\tclose(srv_fd);\n \tclose(client_fd);\n+\tclose(srv_fd);\n+}\n+\n+static void run_icmp_test(struct icmp_send_unreach *skel, int af,\n+\t\t\t  const char *addr, int max_code)\n+{\n+\tint *code = &skel->bss->unreach_code;\n+\n+\tfor (*code = 0; *code <= max_code; (*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 (af == AF_INET && *code == ICMP_FRAG_NEEDED)\n+\t\t\tcontinue;\n+\n+\t\ttrigger_prog_read_icmp_errqueue(code, af, addr);\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, af, addr);\n+\tASSERT_EQ(skel->data->kfunc_ret, -EINVAL, \"kfunc_ret\");\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@@ -112,23 +147,11 @@ void test_icmp_send_unreach_kfunc(void)\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+\tif (test__start_subtest(\"ipv4\"))\n+\t\trun_icmp_test(skel, AF_INET, \"127.0.0.1\", NR_ICMP_UNREACH);\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+\tif (test__start_subtest(\"ipv6\"))\n+\t\trun_icmp_test(skel, AF_INET6, \"::1\", NR_ICMPV6_UNREACH);\n\n cleanup:\n \ticmp_send_unreach__destroy(skel);\ndiff --git a/tools/testing/selftests/bpf/progs/icmp_send_unreach.c b/tools/testing/selftests/bpf/progs/icmp_send_unreach.c\nindex 6fc5595f08aa..112b9cbfab6f 100644\n--- a/tools/testing/selftests/bpf/progs/icmp_send_unreach.c\n+++ b/tools/testing/selftests/bpf/progs/icmp_send_unreach.c\n@@ -6,6 +6,11 @@\n #define SERVER_PORT 54321\n /* 127.0.0.1 in network byte order */\n #define SERVER_IP 0x7F000001\n+/* ::1 in network byte order */\n+#define SERVER_IP6_0 0x00000000\n+#define SERVER_IP6_1 0x00000000\n+#define SERVER_IP6_2 0x00000000\n+#define SERVER_IP6_3 0x01000000\n\n int unreach_code = 0;\n int kfunc_ret = -1;\n@@ -16,17 +21,46 @@ int egress(struct __sk_buff *skb)\n \tvoid *data = (void *)(long)skb->data;\n \tvoid *data_end = (void *)(long)skb->data_end;\n \tstruct iphdr *iph;\n+\tstruct ipv6hdr *ip6h;\n \tstruct tcphdr *tcph;\n+\t__u8 version;\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+\tif (data + 1 > data_end)\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+\tversion = (*((__u8 *)data)) >> 4;\n+\n+\tif (version == 4) {\n+\t\tiph = data;\n+\t\tif ((void *)(iph + 1) > data_end ||\n+\t\t    iph->protocol != IPPROTO_TCP ||\n+\t\t    iph->daddr != bpf_htonl(SERVER_IP))\n+\t\t\treturn SK_PASS;\n+\n+\t\ttcph = (void *)iph + iph->ihl * 4;\n+\t\tif ((void *)(tcph + 1) > data_end ||\n+\t\t    tcph->dest != bpf_htons(SERVER_PORT))\n+\t\t\treturn SK_PASS;\n+\n+\t} else if (version == 6) {\n+\t\tip6h = data;\n+\t\tif ((void *)(ip6h + 1) > data_end ||\n+\t\t    ip6h->nexthdr != IPPROTO_TCP)\n+\t\t\treturn SK_PASS;\n+\n+\t\tif (ip6h->daddr.in6_u.u6_addr32[0] != SERVER_IP6_0 ||\n+\t\t    ip6h->daddr.in6_u.u6_addr32[1] != SERVER_IP6_1 ||\n+\t\t    ip6h->daddr.in6_u.u6_addr32[2] != SERVER_IP6_2 ||\n+\t\t    ip6h->daddr.in6_u.u6_addr32[3] != SERVER_IP6_3)\n+\t\t\treturn SK_PASS;\n+\n+\t\ttcph = (void *)(ip6h + 1);\n+\t\tif ((void *)(tcph + 1) > data_end ||\n+\t\t    tcph->dest != bpf_htons(SERVER_PORT))\n+\t\t\treturn SK_PASS;\n+\t} else {\n \t\treturn SK_PASS;\n+\t}\n\n \tkfunc_ret = bpf_icmp_send_unreach(skb, unreach_code);\n\n",
    "prefixes": [
        "bpf-next",
        "v4",
        "5/6"
    ]
}