当我们使用nf_register_hook在内核中注册好hook之后,内核是如何来引用的呢?
当设备的硬件接收帧以后,会使用中断事件通知CPU,该帧已经可用了,CPU接收到终端事件之后,会执行do_IRQ函数,IRQ编号会引发正确的处理函数被启用,在该过程中,内核会把帧拷贝到sk_buff数据结构中进行处理。按照IP数据包接收流程
内核会调用ip_rcv函数,此函数内会调用NF_HOOK
return NF_HOOK(NFPROTO_IPV4, NF_INET_PRE_ROUTING, skb, dev, NULL,ip_rcv_finish);
在NF_HOOK函数中会调用到nf_hook_slow函数,在nf_hook_slow函数中调用了nf_iterate,代码如下:
unsigned int nf_iterate(struct list_head *head,
struct sk_buff *skb,
unsigned int hook,
const struct net_device *indev,
co