mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-04-05 04:46:54 -04:00
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:
committed by
Alexei Starovoitov
parent
d946f3c983
commit
6cc73f3540
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user