BSD分组过滤程序(BPF)是一种软件设备,用于过滤网络接口的数据流,即给网络接口加上开关。应用进程打开/dev/bpf0、
/dev/bpf1等等后,可以读取BPF设备,每个应用进程一次只能打开一个BPF设备。
通过若干ioctl命令,可以配置BPF设备,把它与某个网络接口相关联,并安装过滤程序,从而能够选择性地接收输入的分组。
BPF设备打开后,应用进程通过读写设备来接收分组,或将分组放入网络接口队列中。
BPF设备工作的前提是网络接口必须能够支持BPF。之前提到的以太网和环回接口的驱动程序都调用了bpfattach,用于配置
读取BPF设备的接口。
1.bpf_if结构
BPF维护一个链表,包含所有支持BPF的网络接口,每个接口都有一个bpf_if结构描述,全局指针bpf_iflist指向表中的第一个
结构,下图给出了BPF接口结构。
bif_next指向链表中的下一个BPF接口结构。
bif_dlist指向另一个链表,包括所有已打开并配置过的BPF设备。
如果某个网络接口已配置了BPF设备,即被加上了开关,则bif_driverp为空。为某个网络接口配置BPF设备是时,*bif_driverp
将指向bif_if结构,从而告诉接口可以开始向BPF传递分组。
接口类型保存在bif_dlt中。下图列出了几个接口所对应的常量值。
下图给出了每个输入分组中附加的bpf_hdr结构。