BPF_PROG_TYPE_SOCKET_FILTER 功能实现

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

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    
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值