BPF socket filter

以dhcpc过滤udp port 68为例,进行一下说明
X = 表示index reg.也就是文件定位器。目前X=0,X=skb->data. skb->data指定的ip hdr.
A表示加速reg.保存临时变量
static const struct sock_filter filter_instr[] = {
/* load 9th byte (protocol) */
BPF_STMT(BPF_LD|BPF_B|BPF_ABS, 9), //报文0位置+9位置中读出一字节放到A reg中。//BPF_LD=load. BPF_B = byte(1字节); BPF_ABS表示是绝对值=skb->data
/* jump to L1 if it is IPPROTO_UDP, else to L4 */
//A的值与IPPROTO_UDP相比,相等则jump到本行(本行为-1)的下一行(就是0行),不相等则jump到本行的offset=6的一行。
//BPF_JMP,BPF_JEQ = if jump的意思。
BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, IPPROTO_UDP, 0, 6),
/* 从IP头(index=0)定位到6,并读出(BPF_H表示)两个字节。这是IP的分片标志。 */
/* L1: load halfword from offset 6 (flags and frag offset) */
BPF_STMT(BPF_LD|BPF_H|BPF_ABS, 6),
/* jump to L4 if any bits in frag offset field are set, else to L2 */
/* */
BPF_JUMP(BPF_JMP|BPF_JSET|BPF_K, 0x1fff, 4, 0),
/* L2: skip IP header (load index reg with header len) */
/* 移动X,X+=*(X+k);本行中k=0; 也就是从IPhdr中读出一字节,把此字节的数据赋值给X
BPF_MSH就是移动X的意思。*/
BPF_STMT(BPF_LDX|BPF_B|BPF_MSH, 0),
/* load udp destination port from halfword[header_len + 2] */
/* BPF_IND从相对值X开始,加上k(2),在此位置取出一个16bit数据放到A中。 */
BPF_STMT(BPF_LD|BPF_H|BPF_IND, 2),
/* jump to L3 if udp dport is CLIENT_PORT, else to L4 */
/* A的值==68? yes,则jump 0行(本行号=-1)no 则jump (本行号-1)第一行。 */
BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, 68, 0, 1),
/* L3: accept packet ("accept 0x7fffffff bytes") */
/* Accepting 0xffffffff works too but kernel 2.6.19 is buggy */
BPF_STMT(BPF_RET|BPF_K, 0x7fffffff),//返回FF,表示成功。
/* L4: discard packet ("accept zero bytes") */
BPF_STMT(BPF_RET|BPF_K, 0),//返回0表示失败。

参考:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值