本文主要是介绍NF_HOOK,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
……
我们暂且忽略用于调试作用的语句,把 #else中NF_HOOK的定义提取出来:
#define NF_HOOK(pf, hook, skb, indev, outdev, okfn) \
({int __ret; \
if (list_empty(&nf_hooks[pf][hook]) || \
(__ret=nf_hook_slow(pf, hook, &(skb), indev, outdev, okfn, INT_MIN)) == 1) \
__ret = (okfn)(skb); \
__ret;})
首先来看这个宏里边的二维数组nf_hooks[pf][hook] ,其中pf对应协议簇,hook对应了某个hook点,比如ipv4 协议簇(PF_INET)下有一个钩子NF_IP_PRE_ROUTING(路由查找之前),那么这个Hook点对应的这个二维数组中的元素就是nf_hooks[PF_INET][ NF_IP_PRE_ROUTING]。
nf_hooks数组是一个struct nf_hooks_ops 结构,这个结构有一个hook成员,指向这个hook点的hook函数。另一方面,同一个hook点,可能同时注册了多个hook,所以,结构struct nf_hooks_ops 中有一个list成员,用来维护一个hook点的链表。该结构定义如下:
struct nf_hook_ops
{
struct list_head list; //链表成员
/* User fills in from here down. */
nf_hookfn *hook; //链子函数指针
这篇关于NF_HOOK的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!