Commit 0e8e60e8 authored by Daniel Borkmann's avatar Daniel Borkmann Committed by Alexei Starovoitov
Browse files

selftests/bpf: Add test case for different expected_attach_type



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: default avatarDaniel Borkmann <daniel@iogearbox.net>
Link: https://lore.kernel.org/r/20250926171201.188490-2-daniel@iogearbox.net


Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent 4540aed5
Loading
Loading
Loading
Loading
+30 −1
Original line number Diff line number Diff line
@@ -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();
+29 −0
Original line number Diff line number Diff line
// 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;
}