高考特长写什么:BPF的使用

来源:百度文库 编辑:九乡新闻网 时间:2024/04/27 10:46:03

BPF(Berkeley Packets Filter)的使用

作者:bobdai,

              

              

    4.4BSD和其他源自Berkeley的实现使用BPF作为访问数据链路层的手段。SCO OpenServer虽然源自SVR3,但他采取了BPF的思想,BPF可以作为一个可加载模块随时加载到内核。BPF所做的事情,无非就是读入数据,按照规则检查数据,符合要求则向上层模块传递数据(可指定大小,比如我只对包的前100字节感兴趣则可让其只传前100字节),不符合要求的数据就抛弃。规则的设定较为麻烦一些,下面将简单介绍。对BPF的详细介绍可参见<< TCP/IP Illustrated, Volume 2 >>    [Gary R. Wright(Contributor)]

    BPF定义了一个伪机器。这个伪机器可以执行代码,有一个累加器,寄存器,和赋值、算术、跳转指令。一条指令由一个定义好的结构 struct bpf_insn 表示,与真正的机器代码很相似,若干个这样的结构组成的数组,就成为BPF的指令序列。下图给出了一段BPF“程序”的例子。为了方便“编程”起见,BPF的

struct bpf_insn insns[] =

{

        BPF_STMT( BPF_LD + BPF_H + BPF_ABS, 12 ),

        BPF_JUMP( BPF_JMP + BPF_JEQ + BPF_K, ETHERTYPE_IP, 0, 3 ),

        BPF_STMT( BPF_LD + BPF_W + BPF_ABS, 30 ),

        BPF_JUMP( BPF_JMP + BPF_JEQ + BPF_K, 0xc0a80001, 0, 1 ),

        BPF_STMT( BPF_RET + BPF_K, 60 ),

        BPF_STMT( BPF_RET + BPF_K, 0 ),

};

            图 2.3

设计者用两个宏BPF_STMT和BPF_JUMP来直观代替了结构赋值操作,这两个宏展开后,其实都是一个赋了值的struct bpf_insn结构。BPF的主要指令有BPF_LD,BPF_ALU,BPF_JMP,BPF_RET等。BPF_LD将数据装入累加器,BPF_ALU对累加器执行算术命令,BPF_JMP是跳转指令,BPF_RET是程序返回指令。现在,让我们看看图2.3的BPF程序。这段程序执行这样的过滤功能:首先判断收到的帧是否携带IP包,是则继续,否则返回0字节(即丢弃该包);然后判断IP包的目的地址是否 192.168.0.1(转换为32位整型值为0xc0a80001),是则返回此帧的头60字节,否则返回0字节。

第一句BPF_STMT( BPF_LD + BPF_H + BPF_ABS, 12 ),表示将帧的第12字节(从第0字节开始计算)开始处的两个字节作为一个字送入累加器。BPF_H表示按字传送,另外还有BPF_W和BPF_B分别表示传双字和单个字节;BPF_ABS表示12为相对于帧头的绝对偏移,另外BPF_IND表示相对偏移。

第二句BPF_JUMP( BPF_JMP + BPF_JEQ + BPF_K, ETHERTYPE_IP, 0, 3 ),表示将累加器的内容与常数 ETHERTYPE_IP 比较,相等则PC(Program Counter)加0(相当于继续执行第三句),否则PC加3,即跳到第六句。BPF_JEQ表示“相等则转移”,另外还有BPF_JA和BPF_JGT等,与汇编语言的语义几乎完全相同。而硬件帧的第12、13字节正是ETHER_HEADER结构中ETHER_TYPE成员所在空间。

第三句BPF_STMT( BPF_LD + BPF_W + BPF_ABS, 30 ),与第一句类似,将帧的第30字节处开始的4个字节传入累加器,这32位数据正是IP包的目的地址。

第四句BPF_JUMP( BPF_JMP + BPF_JEQ + BPF_K, 0xc0a80001, 0, 1 ),类似于第二句,将累加器的内容与数0xc0a80001比较,相等则执行第五句,否则执行第六句。

第五句BPF_STMT( BPF_RET + BPF_K, 60 ),表示结束程序,并输出收到帧的前60字节。

第六句BPF_STMT( BPF_RET + BPF_K, 0 ),表示结束程序,不输出数据。

有关BPF程序的简介到此为止,更详细的资料可以参见<< TCP/IP Illustrated, Volume 2 (TCPv2) >> [Gary R. Wright(Contributor)] 的第三十一章。