BPF_PROG_TYPE_SOCKET_FILTER,从宏字面意思比较容易想到实现的是socket filter功能,它区别于sockops和tracepoint等功能,需要额外借助setsockopt能力将功能函数和socket绑定,功能才能真正生效。
如何定该类型
在内核态功能函数中定义SEC("socketxxxx"),则会被解析为BPF_PROG_TYPE_SOCKET_FILTER类型功能。
比如内核中实现的三个example程序:
samples/bpf/sockex1_kern.c --->SEC("socket1")
samples/bpf/sockex1_user.c
samples/bpf/sockex2_kern.c --->SEC("socket2")
samples/bpf/sockex2_user.c
samples/bpf/sockex3_kern.c --->SEC("socket3")
samples/bpf/sockex3_user.c
功能程序加载
这个没什么好讲的,程序肯定是装载到了内核,内核定义了一个数据结构
478 struct bpf_prog {
479 u16 pages; /* Number of allocated pages */
480 u16 jited:1, /* Is our filter JIT'ed? */
481 jit_requested:1,/* archs need to JIT the prog */
482 undo_set_mem:1, /* Passed set_memory_ro() checkpoint */
483 gpl_compatible:1, /* Is filter GPL compatible? */
484 cb_access:1, /* Is control block accessed? */
485 dst_needed:1, /* Do we need dst entry? */
486 blinded:1, /* Was blinded */
487 is_func:1, /* program is a bpf function */
488 kprobe_override:1, /* Do we override a kprobe? */
489

本文详细阐述了BPF_PROG_TYPE_SOCKET_FILTER的作用,如何在内核态通过SEC(socketxxxx)定义功能函数,并通过setsockopt与socket关联。涉及内核数据结构bpf_prog的初始化过程,以及如何通过文件fd操作获取和关联structbpf_prog。重点讲解了功能函数与sock的关联机制和执行流程。
最低0.47元/天 解锁文章
2073

被折叠的 条评论
为什么被折叠?



