Commit 6cc73f35 authored by Martin KaFai Lau's avatar Martin KaFai Lau Committed by Alexei Starovoitov
Browse files

selftests/bpf: Test bpf_skb_check_mtu(BPF_MTU_CHK_SEGS) when transport_header is not set



Add a test to check that bpf_skb_check_mtu(BPF_MTU_CHK_SEGS) is
rejected (-EINVAL) if skb->transport_header is not set. The test
needs to lower the MTU of the loopback device. Thus, take this
opportunity to run the test in a netns by adding "ns_" to the test
name. The "serial_" prefix can then be removed.

Signed-off-by: default avatarMartin KaFai Lau <martin.lau@kernel.org>
Link: https://lore.kernel.org/r/20251112232331.1566074-2-martin.lau@linux.dev


Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent d946f3c9
Loading
Loading
Loading
Loading
+22 −1
Original line number Diff line number Diff line
@@ -153,6 +153,26 @@ static void test_check_mtu_run_tc(struct test_check_mtu *skel,
	ASSERT_EQ(mtu_result, mtu_expect, "MTU-compare-user");
}

static void test_chk_segs_flag(struct test_check_mtu *skel, __u32 mtu)
{
	int err, prog_fd = bpf_program__fd(skel->progs.tc_chk_segs_flag);
	struct __sk_buff skb = {
		.gso_size = 10,
	};
	LIBBPF_OPTS(bpf_test_run_opts, topts,
		    .data_in = &pkt_v4,
		    .data_size_in = sizeof(pkt_v4),
		    .ctx_in = &skb,
		    .ctx_size_in = sizeof(skb),
	);

	/* Lower the mtu to test the BPF_MTU_CHK_SEGS */
	SYS_NOFAIL("ip link set dev lo mtu 10");
	err = bpf_prog_test_run_opts(prog_fd, &topts);
	SYS_NOFAIL("ip link set dev lo mtu %u", mtu);
	ASSERT_OK(err, "test_run");
	ASSERT_EQ(topts.retval, BPF_OK, "retval");
}

static void test_check_mtu_tc(__u32 mtu, __u32 ifindex)
{
@@ -177,11 +197,12 @@ static void test_check_mtu_tc(__u32 mtu, __u32 ifindex)
	test_check_mtu_run_tc(skel, skel->progs.tc_minus_delta, mtu);
	test_check_mtu_run_tc(skel, skel->progs.tc_input_len, mtu);
	test_check_mtu_run_tc(skel, skel->progs.tc_input_len_exceed, mtu);
	test_chk_segs_flag(skel, mtu);
cleanup:
	test_check_mtu__destroy(skel);
}

void serial_test_check_mtu(void)
void test_ns_check_mtu(void)
{
	int mtu_lo;

+12 −0
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@

#include <stddef.h>
#include <stdint.h>
#include <errno.h>

char _license[] SEC("license") = "GPL";

@@ -288,3 +289,14 @@ int tc_input_len_exceed(struct __sk_buff *ctx)
	global_bpf_mtu_xdp = mtu_len;
	return retval;
}

SEC("tc")
int tc_chk_segs_flag(struct __sk_buff *ctx)
{
	__u32 mtu_len = 0;
	int err;

	err = bpf_check_mtu(ctx, GLOBAL_USER_IFINDEX, &mtu_len, 0, BPF_MTU_CHK_SEGS);

	return err == -EINVAL ? BPF_OK : BPF_DROP;
}