NF_HOOK()宏在2.6中和2.4相比作了稍许变化:
2.6.17.11的定义:
#define NF_HOOK_THRESH(pf, hook, skb, indev, outdev, okfn, thresh) \
({int __ret; \
if ((__ret=nf_hook_thresh(pf, hook, &(skb), indev, outdev, okfn, thresh, 1)) == 1)\
__ret = (okfn)(skb); \
__ret;})
#define NF_HOOK(pf, hook, skb, indev, outdev, okfn) \
NF_HOOK_THRESH(pf, hook, skb, indev, outdev, okfn, INT_MIN)
2.4.26的定义:
#define NF_HOOK(pf, hook, skb, indev, outdev, okfn) \
(list_empty(&nf_hooks[(pf)][(hook)]) \
? (okfn)(skb) \
: nf_hook_slow((pf), (hook), (skb), (indev), (outdev), (okfn)))
一个主要差别就是在2.6的nf_hook_thresh()函数中不再调用okfn(),而是等nf_hook_thresh()函数执行成功后再单独调用okfn(),函数参数中的okfn()已经只是个摆设而已; 而在2.4中, 在nf_hook_slow()函数中如果该skb允许通过的话会主动调用okfn()。
此外2.6中的NF动作增加了NF_STOP,功能和NF_ACCEPT类似但强于NF_ACCEPT,一旦挂接链表中某个hook节点返回NF_STOP,该skb包就立即结束检查而接受,不再进入链表中后续的hook节点,而NF_ACCEPT则还需要进入后续hook点检查。