Chinaunix

标题: 请问 NF_IP_LOCAL_OUT [打印本页]

作者: Arthur_    时间: 2009-09-23 08:59
标题: 请问 NF_IP_LOCAL_OUT
err = nf_hook(PF_INET, NF_IP_LOCAL_OUT, &skb, NULL,
                              skb->dst->dev, dst_output);
                if (unlikely(err != 1))
                        break;

遇到上面的代码 , 最后它使用unlikely判断err《》1, , nf_hook在什么情况下能返回1呢?这种情况出现的几率大?
作者: Arthur_    时间: 2009-09-23 09:21
修改下问题:

NF_HOOK和nf_hook有什么区别 对okfn nf_hook是如何处理的?
作者: Arthur_    时间: 2009-09-23 09:24
是不是nf_hook不会执行okfn也就是上面的dst_output
作者: Godbach    时间: 2009-09-23 10:07
原帖由 Arthur_ 于 2009-9-23 09:24 发表
是不是nf_hook不会执行okfn也就是上面的dst_output


执行完对应hook点上所有hook函数,并且都返回NF_ACCEPT, 就可以执行okfn了
作者: Arthur_    时间: 2009-09-23 11:01
可是 :

static inline int nf_hook(int pf, unsigned int hook, struct sk_buff **pskb,
                          struct net_device *indev, struct net_device *outdev,
                          int (*okfn)(struct sk_buff *))
{
        return nf_hook_thresh(pf, hook, pskb, indev, outdev, okfn, INT_MIN, 1);
}


static inline int nf_hook_thresh(int pf, unsigned int hook,
                                 struct sk_buff **pskb,
                                 struct net_device *indev,
                                 struct net_device *outdev,
                                 int (*okfn)(struct sk_buff *), int thresh,
                                 int cond)
{
        if (!cond)
                return 1;
#ifndef CONFIG_NETFILTER_DEBUG
        if (list_empty(&nf_hooks[pf][hook]))
                return 1;
#endif
        return nf_hook_slow(pf, hook, pskb, indev, outdev, okfn, thresh);
}


其中nf_hook_slow也不会执行okfn

我感觉 小写的nf_hook只是执行hook函数并不会执行okfn
作者: Arthur_    时间: 2009-09-23 12:09
究竟大写的NF_HOOK和小写的nf_hook有啥区别啥啥啥

[ 本帖最后由 Arthur_ 于 2009-9-23 12:18 编辑 ]
作者: Arthur_    时间: 2009-09-23 12:29
我自己 总结下: 小写的nf_hook不会执行okfn.


nf_hook作用如下: 仅仅重新执行一次该hook点的hook练。

nf_hook只在XFRM代码中有见。 使用它是因为报文经过封装(tunnelmode)esp/ah处理后,报文的3,4层内容发生了变化(相当新的报文),所以要nf_reset然后再次执行一次该点的hook
作者: Godbach    时间: 2009-09-23 14:16
说一下内核版本吧。我这里2.6.18的
我这里看到的是这样的:
#define NF_HOOK(pf, hook, skb, indev, outdev, okfn) \
        NF_HOOK_THRESH(pf, hook, skb, indev, outdev, okfn, INT_MIN)
作者: Godbach    时间: 2009-09-23 14:17
NF_HOOK_THRESH宏有定义如下,最后要判断一下,进一步好调用okfn
#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;})

作者: emmoblin    时间: 2009-09-23 15:47
一般都是用NF_HOOK的,nf_hook是底层函数
作者: Godbach    时间: 2009-09-23 15:52
nf_hook函数用的地方不多哈,应该是不会调用okfn的

[ 本帖最后由 Godbach 于 2009-9-23 15:55 编辑 ]
作者: Arthur_    时间: 2009-09-23 16:11
主要最近要使用OCF 要将XFRM分成异步执行方式, 其中看到xfrm使用了nf_hook感觉很奇怪, 以为它使用了递归, 仔细看看发现nf_hook并不执行okfn, 但自己怕搞错了, 所以冒泡请教各位神人。
作者: smalloc    时间: 2009-09-23 16:52
恩,确实是的,小写不会调用最后的okfn
作者: Godbach    时间: 2009-09-23 17:40
标题: 回复 #12 Arthur_ 的帖子
恩,我刚刚搜的时候,也就是发现在这块调用了。可能他就只需要执行hook函数吧。不需要okfn的调用。但是为了接口统一就这么实现了。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2