selftests/bpf: Test attaching bpf qdisc to mq and non root

Until we are certain that existing classful qdiscs work with bpf qdisc,
make sure we don't allow attaching a bpf qdisc to non root. Meanwhile,
attaching to mq is allowed.

Signed-off-by: Amery Hung <ameryhung@gmail.com>
Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>
Acked-by: Toke Høiland-Jørgensen <toke@redhat.com>
Link: https://patch.msgid.link/20250409214606.2000194-11-ameryhung@gmail.com
This commit is contained in:
Amery Hung
2025-04-09 14:46:06 -07:00
committed by Martin KaFai Lau
parent 2b59bd9e4e
commit 2b7b5b7f10
2 changed files with 76 additions and 0 deletions

View File

@@ -74,6 +74,7 @@ CONFIG_NET_MPLS_GSO=y
CONFIG_NET_SCH_BPF=y
CONFIG_NET_SCH_FQ=y
CONFIG_NET_SCH_INGRESS=y
CONFIG_NET_SCH_HTB=y
CONFIG_NET_SCHED=y
CONFIG_NETDEVSIM=y
CONFIG_NETFILTER=y

View File

@@ -88,6 +88,77 @@ static void test_fq(void)
bpf_qdisc_fq__destroy(fq_skel);
}
static void test_qdisc_attach_to_mq(void)
{
DECLARE_LIBBPF_OPTS(bpf_tc_hook, hook,
.attach_point = BPF_TC_QDISC,
.parent = TC_H_MAKE(1 << 16, 1),
.handle = 0x11 << 16,
.qdisc = "bpf_fifo");
struct bpf_qdisc_fifo *fifo_skel;
struct bpf_link *link;
int err;
fifo_skel = bpf_qdisc_fifo__open_and_load();
if (!ASSERT_OK_PTR(fifo_skel, "bpf_qdisc_fifo__open_and_load"))
return;
link = bpf_map__attach_struct_ops(fifo_skel->maps.fifo);
if (!ASSERT_OK_PTR(link, "bpf_map__attach_struct_ops")) {
bpf_qdisc_fifo__destroy(fifo_skel);
return;
}
SYS(out, "ip link add veth0 type veth peer veth1");
hook.ifindex = if_nametoindex("veth0");
SYS(out, "tc qdisc add dev veth0 root handle 1: mq");
err = bpf_tc_hook_create(&hook);
ASSERT_OK(err, "attach qdisc");
bpf_tc_hook_destroy(&hook);
SYS(out, "tc qdisc delete dev veth0 root mq");
out:
bpf_link__destroy(link);
bpf_qdisc_fifo__destroy(fifo_skel);
}
static void test_qdisc_attach_to_non_root(void)
{
DECLARE_LIBBPF_OPTS(bpf_tc_hook, hook, .ifindex = LO_IFINDEX,
.attach_point = BPF_TC_QDISC,
.parent = TC_H_MAKE(1 << 16, 1),
.handle = 0x11 << 16,
.qdisc = "bpf_fifo");
struct bpf_qdisc_fifo *fifo_skel;
struct bpf_link *link;
int err;
fifo_skel = bpf_qdisc_fifo__open_and_load();
if (!ASSERT_OK_PTR(fifo_skel, "bpf_qdisc_fifo__open_and_load"))
return;
link = bpf_map__attach_struct_ops(fifo_skel->maps.fifo);
if (!ASSERT_OK_PTR(link, "bpf_map__attach_struct_ops")) {
bpf_qdisc_fifo__destroy(fifo_skel);
return;
}
SYS(out, "tc qdisc add dev lo root handle 1: htb");
SYS(out_del_htb, "tc class add dev lo parent 1: classid 1:1 htb rate 75Kbit");
err = bpf_tc_hook_create(&hook);
if (!ASSERT_ERR(err, "attach qdisc"))
bpf_tc_hook_destroy(&hook);
out_del_htb:
SYS(out, "tc qdisc delete dev lo root htb");
out:
bpf_link__destroy(link);
bpf_qdisc_fifo__destroy(fifo_skel);
}
void test_bpf_qdisc(void)
{
struct netns_obj *netns;
@@ -100,6 +171,10 @@ void test_bpf_qdisc(void)
test_fifo();
if (test__start_subtest("fq"))
test_fq();
if (test__start_subtest("attach to mq"))
test_qdisc_attach_to_mq();
if (test__start_subtest("attach to non root"))
test_qdisc_attach_to_non_root();
netns_free(netns);
}