BPF socket filter

来源:互联网 发布:阿里云总裁胡晓明辞职 编辑:程序博客网 时间:2024/06/09 13:42
以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中读出一字节,把此字节的数据赋值给XBPF_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表示失败。

参考:
http://blog.csdn.net/ljy1988123/article/details/50444693

原创粉丝点击