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: Martin KaFai Lau <martin.lau@kernel.org>
Link: https://lore.kernel.org/r/20251112232331.1566074-2-martin.lau@linux.dev
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
Martin KaFai Lau
2025-11-12 15:23:31 -08:00
committed by Alexei Starovoitov
parent d946f3c983
commit 6cc73f3540
2 changed files with 34 additions and 1 deletions

View File

@@ -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;

View File

@@ -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;
}