]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
selftests/bpf: Test bpf_skb_check_mtu(BPF_MTU_CHK_SEGS) when transport_header is...
authorMartin KaFai Lau <martin.lau@kernel.org>
Wed, 12 Nov 2025 23:23:31 +0000 (15:23 -0800)
committerAlexei Starovoitov <ast@kernel.org>
Sat, 15 Nov 2025 02:49:18 +0000 (18:49 -0800)
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>
tools/testing/selftests/bpf/prog_tests/check_mtu.c
tools/testing/selftests/bpf/progs/test_check_mtu.c

index 2a9a30650350edd7ca2e2e39fb1a30c4f7db4304..65b4512967e746b8858579325aace8295f508f16 100644 (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;
 
index 2ec1de11a3ae4aae5b349b3fada2140468d9efe5..7b6b2b342c1de1bf3eface0bf44f37f9e070e8bd 100644 (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;
+}