如何自主获取BPF_PROG_TYPE_SOCKET_FILTER等eBPF程序类型相关知识
自主探索eBPF程序类型的内核源码指南
核心结论
是的,要掌握自主分析新eBPF程序类型的能力,阅读内核源码是最直接可靠的途径——毕竟所有eBPF程序的行为逻辑最终都由内核实现定义。
具体入手步骤
1. 定位程序类型的定义与基础元数据
首先在内核源码中搜索目标程序类型的宏定义,比如BPF_PROG_TYPE_SOCKET_FILTER:
- 这类宏通常定义在
include/uapi/linux/bpf.h里,你能看到它的枚举值,以及同类型的其他程序类型分组。 - 同时查看同文件中的
struct bpf_prog_type_info相关定义,部分程序类型会在这里附带基础说明(比如预期的attach类型)。
2. 查找挂载(attach)逻辑
eBPF程序的挂载方式对应内核中的bpf_prog_attach或特定的attach入口:
- 搜索目标程序类型关联的attach处理函数,比如
BPF_PROG_TYPE_SOCKET_FILTER的挂载逻辑和sock_bpf_attach相关,代码位于net/core/filter.c。 - 关注
bpf_prog_type_to_expected_attach_type函数,它定义了该程序类型允许的attach类型,直接对应用户空间的挂载方式(比如通过bpf()系统调用的BPF_PROG_ATTACH命令)。
3. 追踪运行时机与触发路径
要找到程序何时被调用:
- 搜索程序类型对应的
bpf_prog_run调用点,比如socket filter会在数据包经过socket时触发,相关逻辑在sk_filter函数中,分布在net/core/sock.c或协议栈具体文件里。 - 查看内核调用
bpf_prog_run时的上下文传递,这能帮你确定程序运行时的输入参数。
4. 明确上下文数据结构
eBPF程序的上下文由内核传入,对应的数据结构是关键:
- 对于
BPF_PROG_TYPE_SOCKET_FILTER,上下文是struct __sk_buff,定义在include/uapi/linux/bpf.h中。 - 搜索程序类型对应的
bpf_get_func_proto函数实现,比如bpf_sk_filter_func_proto,这里会列出该程序类型允许调用的eBPF辅助函数,同时也能侧面验证上下文类型。
5. 辅助验证:结合内核测试用例
内核源码的tools/testing/selftests/bpf/目录下有各类eBPF程序的测试用例,你可以对照看用户空间如何挂载、调用目标类型程序,反向验证内核逻辑。比如socket filter的测试用例通常会用到setsockopt或者bpf()系统调用挂载,再通过发送数据包触发程序运行。
总结
从程序类型的宏定义出发,顺着挂载逻辑、运行触发路径、上下文结构的顺序逐层深挖,再结合内核测试用例验证,就能完整掌握任意新eBPF程序类型的核心信息,无需依赖外部博客即可自主跟进内核新增的eBPF特性。
内容的提问来源于stack exchange,提问作者newSun
相关产品推荐
相关产品推荐

