{"id":2225116,"url":"http://patchwork.ozlabs.org/api/1.1/patches/2225116/?format=json","web_url":"http://patchwork.ozlabs.org/project/netfilter-devel/patch/20260420105816.72168-7-mahe.tardy@gmail.com/","project":{"id":26,"url":"http://patchwork.ozlabs.org/api/1.1/projects/26/?format=json","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-7-mahe.tardy@gmail.com>","date":"2026-04-20T10:58:16","name":"[bpf-next,v4,6/6] selftests/bpf: add icmp_send_unreach_recursion test","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"b1c97ebb76d3c8ef1f15366d6516e0e071860806","submitter":{"id":91349,"url":"http://patchwork.ozlabs.org/api/1.1/people/91349/?format=json","name":"Mahe Tardy","email":"mahe.tardy@gmail.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/netfilter-devel/patch/20260420105816.72168-7-mahe.tardy@gmail.com/mbox/","series":[{"id":500597,"url":"http://patchwork.ozlabs.org/api/1.1/series/500597/?format=json","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/2225116/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2225116/checks/","tags":{},"headers":{"Return-Path":"\n <netfilter-devel+bounces-12045-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=AMGOhbbb;\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-12045-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=\"AMGOhbbb\"","smtp.subspace.kernel.org;\n arc=none smtp.client-ip=209.85.128.54","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 4fzjHJ2kHjz1yCv\n\tfor <incoming@patchwork.ozlabs.org>; Mon, 20 Apr 2026 21:02:04 +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 D3ED5305831E\n\tfor <incoming@patchwork.ozlabs.org>; Mon, 20 Apr 2026 10:59:07 +0000 (UTC)","from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id 567D139B97D;\n\tMon, 20 Apr 2026 10:58:38 +0000 (UTC)","from mail-wm1-f54.google.com (mail-wm1-f54.google.com\n [209.85.128.54])\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 8FA3939D6F3\n\tfor <netfilter-devel@vger.kernel.org>; Mon, 20 Apr 2026 10:58:35 +0000 (UTC)","by mail-wm1-f54.google.com with SMTP id\n 5b1f17b1804b1-488b0e1b870so44705465e9.2\n        for <netfilter-devel@vger.kernel.org>;\n Mon, 20 Apr 2026 03:58:35 -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.33\n        (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n        Mon, 20 Apr 2026 03:58:33 -0700 (PDT)"],"ARC-Seal":"i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1776682717; cv=none;\n b=bFTQNksbifoICuO9ai/zPbdxlxJ2oPIL7A/Df94FXVx5uYB3h6DFlI1IbdR+CzAToUJzdIjwLtAOmTnQpO6TxkVnKtLMxavYPpwqkyJMup8Onog/aQKCigv1sWt42xtq7iOFXHYgghESWwFcUOkXSGIuSFQM3geA1YDSoCR92CM=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1776682717; c=relaxed/simple;\n\tbh=oDrClojuOmoFQWD8kdi7OYjx+xfYmqROcI/D6DoFoI0=;\n\th=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References:\n\t MIME-Version;\n b=mT/hchKQbqafkLYmLEJ4kIm7Glcr+XEiT+kIhretwdqE717JjOAEkAlAKIBnRwtcFw6ERnqXqWL59QakKSyoVtndTqggv5eJzlljc1Gqw/3MVos+ZY6vaLB9eHQCoDe5JcWrF1iTI3xhbIZQgcRgT7ODfblE8ZBNaTNvESg+bGc=","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=AMGOhbbb; arc=none smtp.client-ip=209.85.128.54","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n        d=gmail.com; s=20251104; t=1776682714; x=1777287514;\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=xJxI2HSQPAxVmr77kvDE3un+rWp4GINOCWCL47TtY40=;\n        b=AMGOhbbbPawejQreqA6zT8b5PPyCdN1n01uciSzHdG4MjndS+/mvJUJ5OeaasEiINm\n         MyLOAXF9Ja72hTlG1bQ8QfIsVVC6jyrh/KtQyQShuSpVHN71HyXxui+pVrPeCt8niRI2\n         86JnBAaCpWcXdXr4tskcyD//sHQIrD9FU0bra+imVlpcNFYBE/j/mAxzURltT6/8Mu3p\n         gNsb642EcDthOSUEwDuu86HSlrOER5p53j+0YePNNNDm/i9dWF4nZR0d5mLC1a6GeKrW\n         eTfDLar7l59+McnZkOy2uQJVCsuFfS4e1x+ln1ubCKKTPpnF6eOCBRJpYBlBhLm2qqbP\n         ivkA==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n        d=1e100.net; s=20251104; t=1776682714; x=1777287514;\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=xJxI2HSQPAxVmr77kvDE3un+rWp4GINOCWCL47TtY40=;\n        b=St6mluM6cnMFpEUJTaGw7Qi8tQC0HxoJsaT1zoC8l4rORy110oA0b7u1O4ltoGC6/t\n         GUSGQAoTZHskBr2l9z4e6dVLLL02Bu/CTapQV0+ZthnvFSHheGEoaEBYKKnN4yLgT+fM\n         6lY5xp9Y0eLdFQp473FjIEevmjJORV4xiBdc/w/YH26YzU1Fllpe3hVr4AydjYhthSpX\n         kCRLeOq4r85pg7d6jAEdw6rgf1svDkAs+DIggRVk5z8rIPxuLZwMVeHuk2Yy7h200PoZ\n         0mNCwaZmGF2G0lgainAMhYSoZjKjfrKXBIb6VncXdWH1eLbTvzodoTkN65ij5rk0wadM\n         9Aew==","X-Forwarded-Encrypted":"i=1;\n AFNElJ+V4uwHLKh6oe14NxocuKCUW4WqUc+y7ihGY8JFw3g9EM8ELlt26nwReV7JKhbu27rxRa53T7o1Gxmr65BhaB4=@vger.kernel.org","X-Gm-Message-State":"AOJu0YwEtPomoFQ08UudExyjMIvEOSuz02zox5pJ3+8ZCvCbH/05WXDi\n\tGhLvjayfdMv645Qt6YEesoldEpyMezcYGB9c2QXZ6XfWGwhE2m+OlnzT","X-Gm-Gg":"AeBDiet7LTYHUYLw4ntON7+2QdlA+QtigTXwiE0y2nDPEWTfh/oGKQ4skLeTmai2qJ+\n\tqOL2BsFQZ8pVrYzK77oJlzpFhwcZWig1vpr8+2rMf+qkTw0SJl9kf+zIc6BSDTq0acJNXzdGCbW\n\t+RzTDQZ7PnkjUHMgtSPW7XcrSf0/E2oRlAAwjmnHXSrcAKzEaaoNSV5HiXYI6VXCWkcu6pTWR7G\n\tGe9soewI273Z/phkztDO0uDV5LTD2SoX+KWhM0z7CCkdINSdNFPC0euLnCFxCdz1BtlMRVCaaHQ\n\tRE07TutVXYlZ7NNYByKuP1XNDujztNwnm/cbuKmSTnLfLi6VjKZhfoxjMKP0uPezfR7OUzZQt9w\n\tOECYrV4fsQwKNNEJUern7bnhAVH21NLeeoOziZanW6K1NHKyJsSBR7XRyoE4t6yiu2f0YiUWwSh\n\t+UT85Ozpr0WyT0A6taKx18sTpq7JJmkjj3esb0QA==","X-Received":"by 2002:a05:600c:1da1:b0:488:f453:b976 with SMTP id\n 5b1f17b1804b1-488fb7844c5mr207471835e9.27.1776682713605;\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 6/6] selftests/bpf: add\n icmp_send_unreach_recursion test","Date":"Mon, 20 Apr 2026 10:58:16 +0000","Message-Id":"<20260420105816.72168-7-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 is similar to icmp_send_unreach_kfunc but checks that, in case\nof recursion, meaning that the BPF program calling the kfunc was\nre-triggered by the icmp_send done by the kfunc, the kfunc will stop\nearly and return -EBUSY.\n\nSigned-off-by: Mahe Tardy <mahe.tardy@gmail.com>\n---\n .../bpf/prog_tests/icmp_send_unreach_kfunc.c  | 43 +++++++++++++++++++\n .../selftests/bpf/progs/icmp_send_unreach.c   | 30 +++++++++++++\n 2 files changed, 73 insertions(+)\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 047bfd4d80f7..a4f4324b2b99 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@@ -1,6 +1,7 @@\n // SPDX-License-Identifier: GPL-2.0\n #include <test_progs.h>\n #include <network_helpers.h>\n+#include <cgroup_helpers.h>\n #include <linux/errqueue.h>\n #include \"icmp_send_unreach.skel.h\"\n\n@@ -10,6 +11,7 @@\n #define ICMP_DEST_UNREACH 3\n #define ICMPV6_DEST_UNREACH 1\n\n+#define ICMP_HOST_UNREACH 1\n #define ICMP_FRAG_NEEDED 4\n #define NR_ICMP_UNREACH 15\n #define NR_ICMPV6_UNREACH 6\n@@ -157,3 +159,44 @@ void test_icmp_send_unreach_kfunc(void)\n \ticmp_send_unreach__destroy(skel);\n \tclose(cgroup_fd);\n }\n+\n+void test_icmp_send_unreach_recursion(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+\tif (setup_cgroup_environment()) {\n+\t\tfprintf(stderr, \"Failed to setup cgroup environment\\n\");\n+\t\tgoto cleanup;\n+\t}\n+\n+\tcgroup_fd = get_root_cgroup();\n+\tif (!ASSERT_GE(cgroup_fd, 0, \"get_root_cgroup\"))\n+\t\tgoto cleanup;\n+\n+\tskel->links.recursion =\n+\t\tbpf_program__attach_cgroup(skel->progs.recursion, cgroup_fd);\n+\tif (!ASSERT_OK_PTR(skel->links.recursion, \"prog_attach_cgroup\"))\n+\t\tgoto cleanup;\n+\n+\tcode = &skel->bss->unreach_code;\n+\t*code = ICMP_HOST_UNREACH;\n+\n+\ttrigger_prog_read_icmp_errqueue(code, AF_INET, \"127.0.0.1\");\n+\n+\t/* Because there's recursion involved, the first call will return at\n+\t * index 1 since it will return the second, and the second call will\n+\t * return at index 0 since it will return the first.\n+\t */\n+\tASSERT_EQ(skel->data->rec_kfunc_rets[1], 0, \"kfunc_rets[1]\");\n+\tASSERT_EQ(skel->data->rec_kfunc_rets[0], -EBUSY, \"kfunc_rets[0]\");\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\nindex 112b9cbfab6f..9aca7c0b12e1 100644\n--- a/tools/testing/selftests/bpf/progs/icmp_send_unreach.c\n+++ b/tools/testing/selftests/bpf/progs/icmp_send_unreach.c\n@@ -15,6 +15,9 @@\n int unreach_code = 0;\n int kfunc_ret = -1;\n\n+uint rec_count = 0;\n+int rec_kfunc_rets[] = { -1, -1 };\n+\n SEC(\"cgroup_skb/egress\")\n int egress(struct __sk_buff *skb)\n {\n@@ -67,4 +70,31 @@ int egress(struct __sk_buff *skb)\n \treturn SK_DROP;\n }\n\n+SEC(\"cgroup_skb/egress\")\n+int recursion(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+\n+\tiph = data;\n+\tif ((void *)(iph + 1) > data_end || iph->version != 4)\n+\t\treturn SK_PASS;\n+\n+\t/* This call will provoke a recursion: the ICMP package generated by the\n+\t * kfunc will re-trigger this program since we are in the root cgroup in\n+\t * which the kernel ICMP socket belongs. However when re-entering the\n+\t * kfunc, it should return EBUSY.\n+\t */\n+\trec_kfunc_rets[rec_count & 1] =\n+\t\tbpf_icmp_send_unreach(skb, unreach_code);\n+\t__sync_fetch_and_add(&rec_count, 1);\n+\n+\t/* Let the first ICMP error message pass */\n+\tif (iph->protocol == IPPROTO_ICMP)\n+\t\treturn SK_PASS;\n+\n+\treturn SK_DROP;\n+}\n+\n char LICENSE[] SEC(\"license\") = \"Dual BSD/GPL\";\n","prefixes":["bpf-next","v4","6/6"]}