本文转自http://eslxf.blog.51cto.com/918801/249589
我们现在给出一些实例来解释如何用BPF指令集来表示数据包过滤器(在所有的实例中,我们假设链路层的协议头为以太网的典型帧格式)
实例1 接收所有ip数据包,执行命令tcpdump -d ip,获得如下BPF指令
(000) ldh [12] //加载数据包的协议类型值
(001) jeq #0x800 jt 2 jf 3 //检查是否为ip协议
(002) ret #96 //返回TRUE
(003) ret #0 //返回FALSE
第一条指令加载以太网类型字段,即帧结构除去前导码的第12、13字节。
把该值与IP类型值(0x0800)比较,如果比较失败,返回0,丢弃该数据包。
如果比较成功,返回TRUE(96,TRUE为一些非0值,表示需要存储数据包的字节数),接收该数据包。
实例2 接收所有ip数据包或arp数据包(图10-3中的CFG的实现),执行命令tcpdump -d ip or arp,获得如下BPF指令:
(000) ldh [12] //加载数据包的协议类型值
(001) jeq #0x800 jt 3 jf 2 //检查是否为ip协议
(002) jeq #0x806 jt 3 jf 4 //检查是否为arp协议
(003) ret #96 //返回TRUE
(004) ret #0 //返回FALSE
说明:第1条指令装载以太网数据包封装的上层协议类型值,在数据包中的偏移值为12字节。第2条指令将该值与IP类型值(0x0800)比较,如果相等,跳转到(003)处返回TRUE并接受该数据包;如果不相等,跳转到(002)。第3条语句将数据包的类型值与ARP类型值(0x0806)比较,如果相等,跳转至(003)处返回TRUE并接受该数据包;否则跳转至(004)处,返回FALSE并丢弃该数据包。