用netfilter的钩子函数时需要注意的一个细节。
时间:2009-08-11 来源:gaozhenbo1985
当需要用到netfilter的钩子函数的时候,一般的流程是这样的:
在五个挂接点中的某个挂接点把数据包截取出来,然后送到数据包处理模块,然后在返回到钩子函数中,然后调用NF_ACCEPTF返回或者drop掉。
这里在数据包的处理模块中需要注意两件事情:
1:原skb不能kfree掉。因为在钩到数据之前,skb应该在系统的发送队列中,而skb是在一个双向链表中,如果此时把skb kfree掉,那么原来的发送队列在发送的时候,发到这个数据包的时候由于数据包已经被我们kfree掉了,所以next指针变成野指针,造成系统崩溃,死机。
2:原skb也不能调用netif_rx来交由上层处理,原因同1的原因差不多,如果数据包从系统发送队列移动到接收队列,指针域的pre和next肯定就错误了,此时也会引起系统崩溃,导致死机。如果需要,这个时候可以构造一个新的skb,copy原来的skb。然后调用netif_rx将新的skb发送到协议栈的上层,原数据包返回。
返回到:虚拟网络接口(can0)战斗总结
相关阅读 更多 +