selftests/bpf: Test attaching bpf qdisc to mq and non root
authorAmery Hung <ameryhung@gmail.com>
Wed, 9 Apr 2025 21:46:06 +0000 (14:46 -0700)
committerMartin KaFai Lau <martin.lau@kernel.org>
Thu, 17 Apr 2025 17:54:41 +0000 (10:54 -0700)
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
tools/testing/selftests/bpf/config
tools/testing/selftests/bpf/prog_tests/bpf_qdisc.c

index 6b0cab55bd2dc8a9135db04bb38e87d6b6a5750f..3201a962b3dcd9a16b12255cdffe88fba93743d4 100644 (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
index 230d8f935303b20d83799b3723f3d6b954772fb7..c9a54177c84edebd76d9cfcdeca340a7bf442e41 100644 (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);
 }