]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
selftests/bpf: Add test case for different expected_attach_type
authorDaniel Borkmann <daniel@iogearbox.net>
Fri, 26 Sep 2025 17:12:01 +0000 (19:12 +0200)
committerAlexei Starovoitov <ast@kernel.org>
Sat, 27 Sep 2025 13:24:27 +0000 (06:24 -0700)
Add a small test case which adds two programs - one calling the other
through a tailcall - and check that BPF rejects them in case of different
expected_attach_type values:

  # ./vmtest.sh -- ./test_progs -t xdp_devmap
  [...]
  #641/1   xdp_devmap_attach/DEVMAP with programs in entries:OK
  #641/2   xdp_devmap_attach/DEVMAP with frags programs in entries:OK
  #641/3   xdp_devmap_attach/Verifier check of DEVMAP programs:OK
  #641/4   xdp_devmap_attach/DEVMAP with programs in entries on veth:OK
  #641     xdp_devmap_attach:OK
  Summary: 2/4 PASSED, 0 SKIPPED, 0 FAILED

Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Link: https://lore.kernel.org/r/20250926171201.188490-2-daniel@iogearbox.net
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/testing/selftests/bpf/prog_tests/xdp_devmap_attach.c
tools/testing/selftests/bpf/progs/test_xdp_devmap_tailcall.c [new file with mode: 0644]

index 461ab18705d5c0f15ad0b0f4e8869d1e92de2854..a8ab05216c38533617d0b741779254ee28fe990f 100644 (file)
@@ -7,6 +7,7 @@
 #include <test_progs.h>
 
 #include "test_xdp_devmap_helpers.skel.h"
+#include "test_xdp_devmap_tailcall.skel.h"
 #include "test_xdp_with_devmap_frags_helpers.skel.h"
 #include "test_xdp_with_devmap_helpers.skel.h"
 
@@ -107,6 +108,29 @@ static void test_neg_xdp_devmap_helpers(void)
        }
 }
 
+static void test_xdp_devmap_tailcall(enum bpf_attach_type prog_dev,
+                                    enum bpf_attach_type prog_tail,
+                                    bool expect_reject)
+{
+       struct test_xdp_devmap_tailcall *skel;
+       int err;
+
+       skel = test_xdp_devmap_tailcall__open();
+       if (!ASSERT_OK_PTR(skel, "test_xdp_devmap_tailcall__open"))
+               return;
+
+       bpf_program__set_expected_attach_type(skel->progs.xdp_devmap, prog_dev);
+       bpf_program__set_expected_attach_type(skel->progs.xdp_entry, prog_tail);
+
+       err = test_xdp_devmap_tailcall__load(skel);
+       if (expect_reject)
+               ASSERT_ERR(err, "test_xdp_devmap_tailcall__load");
+       else
+               ASSERT_OK(err, "test_xdp_devmap_tailcall__load");
+
+       test_xdp_devmap_tailcall__destroy(skel);
+}
+
 static void test_xdp_with_devmap_frags_helpers(void)
 {
        struct test_xdp_with_devmap_frags_helpers *skel;
@@ -238,8 +262,13 @@ void serial_test_xdp_devmap_attach(void)
        if (test__start_subtest("DEVMAP with frags programs in entries"))
                test_xdp_with_devmap_frags_helpers();
 
-       if (test__start_subtest("Verifier check of DEVMAP programs"))
+       if (test__start_subtest("Verifier check of DEVMAP programs")) {
                test_neg_xdp_devmap_helpers();
+               test_xdp_devmap_tailcall(BPF_XDP_DEVMAP, BPF_XDP_DEVMAP, false);
+               test_xdp_devmap_tailcall(0, 0, true);
+               test_xdp_devmap_tailcall(BPF_XDP_DEVMAP, 0, true);
+               test_xdp_devmap_tailcall(0, BPF_XDP_DEVMAP, true);
+       }
 
        if (test__start_subtest("DEVMAP with programs in entries on veth"))
                test_xdp_with_devmap_helpers_veth();
diff --git a/tools/testing/selftests/bpf/progs/test_xdp_devmap_tailcall.c b/tools/testing/selftests/bpf/progs/test_xdp_devmap_tailcall.c
new file mode 100644 (file)
index 0000000..814e2a9
--- /dev/null
@@ -0,0 +1,29 @@
+// SPDX-License-Identifier: GPL-2.0
+
+#include "vmlinux.h"
+#include <bpf/bpf_helpers.h>
+#include <bpf/bpf_tracing.h>
+
+SEC("xdp")
+int xdp_devmap(struct xdp_md *ctx)
+{
+       return ctx->egress_ifindex;
+}
+
+struct {
+       __uint(type, BPF_MAP_TYPE_PROG_ARRAY);
+       __uint(max_entries, 1);
+       __uint(key_size, sizeof(__u32));
+       __array(values, int (void *));
+} xdp_map SEC(".maps") = {
+       .values = {
+               [0] = (void *)&xdp_devmap,
+       },
+};
+
+SEC("xdp")
+int xdp_entry(struct xdp_md *ctx)
+{
+       bpf_tail_call(ctx, &xdp_map, 0);
+       return 0;
+}