BPF socket filter

xiaoxiao2021-02-28  92

以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表示失败。 参考: http://blog.csdn.net/ljy1988123/article/details/50444693
转载请注明原文地址: https://www.6miu.com/read-22422.html

最新回复(0)