如何列出所有已加载到内核的bpf程序? (例如tc-bpf)

时间:2018-08-01 07:29:28

标签: linux networking bpf

我知道bpf程序可以通过tc / kprobe / socket的不同方式加载到内核中...

我想知道是否有接口或某种东西可以通过它获取我加载的所有bpf程序?如果没有,那么如果我留下一些可能会更改网络数据的bpf程序,是否有危险?

另一个小问题,如何卸载tc-bpf程序,我真的必须每次都删除qdisc吗?

1 个答案:

答案 0 :(得分:1)

为了列出系统上的所有BPF程序,并且从Linux内核4.13开始,您可以使用bpf()系统调用及其BPF_PROG_GET_NEXT_ID命令来获取第一个程序的ID,然后再次重复调用它以获得以下ID,直到获得系统上已加载的所有BPF程序的ID列表。然后,您可以使用同一系统调用及其BPF_PROG_GET_FD_BY_ID命令来检索每个程序的文件描述符,并第三次使用BPF_OBJ_GET_INFO_BY_FD来获取给定程序的信息(例如程序类型)。我通常会将您重定向到bpf(2) manual page,但是现在它已经严重过时,并且没有在我的系统上描述这些命令。

实际上,所有这些都已实现。您应该搜索 bpftool 程序:运行sudo bpftool prog将列出系统上的所有程序。

bpftool sources are within the Linux kernel tree,并且可以轻松进行编译。它是为Fedora 28打包的,但在撰写本文时,尚未打包为Debian / Ubuntu或其他发行版。 (您还可以从this page获得带有静态链接二进制文件的Debian .deb软件包。它也包含了一个指南,其中包含有关构建bpftool的详细说明。免责声明:我在该公司工作。)

对于删除作为tc过滤器附加的程序,您可以简单地删除过滤器,而不必删除整个qdisc,如下所示:

tc filter del dev eth0 ingress