基于嵌入式Linux的3G无线视频终端的设计与实现
内核netfilter结构在/usr/src/inelude/linux/netfilter.h中定义,类似如下:

参数是:
list
Netfilter本身是一个钩子链;它指向netfilter钩子的头部,通常设置为{NULL,NULL}。
hook
该函数在数据包碰到钩子点时被调用。该函数与前面描述的函数相同,它必须返回NF_ACCEPT、NF_DROP或NF_QUEUE。如果返回NF_ACCEPT,则下一个钩子将被附加到将要调用的点。如果返回NF_DROP,则数据包被丢弃。如果返回NF_QUEUE,则对数据包进行排队。sK_buff指针被传递到该函数中,并用数据包信息如IP报头、TCP报头等进行填充,可以使用sk_buff结构指针来操作或删除数据包(要删除数据包,只需将skb指针设置为空即可)。
pf
协议簇;例如,适用于IPv4的PF_INET。
hooknum
钩子的挂载点,由于本系统不需要在本地对数据包进行任何处理,因此选择的挂在点为NF_IP_PRE_ROUTING,在对数据包进行正确性校验后就调用钩子函数处理数据包。Priority表明钩子的优先级,在本系统中采用高优先级处理NF_IP_PRI_FIRST。
内核数据处理的关键是钩子函数的编写,此函数规定了数据包在到达时需要进行的处理过程。
钩子函数框架如下:

设定好特定的钩子函数之后,调用函数
int nf_register_hook(struct nf_hook_ops*req);
将钩子函数注册至内核。一旦该结构注册到内核中,Linux将调用这里定义的函数来处理数据包。
使用函数
void nf_unregister_hook(struct nf_hook_ops*req);
可以将已经注册入内核的钩子函数取消,此时,接收到数据包将按照内核的默认规则来进行处理。流程如图3所示。本文引用地址:https://www.eepw.com.cn/article/150415.htm
评论