免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6108 | 回复: 2
打印 上一主题 下一主题

NF_HOOK怎么理解? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-28 17:39 |只看该作者 |倒序浏览
NF_HOOK(PF_BRIDGE, NF_BR_PRE_ROUTING, skb, skb->dev, NULL,
                        br_handle_frame_finish);
我一直认为此只进入okfn处理只br_handle_frame_finish,不想到在br_nf_ops中的hook也会处理,如下
static struct nf_hook_ops br_nf_ops[] = {
        { .hook = br_nf_pre_routing,
          .owner = THIS_MODULE,
          .pf = PF_BRIDGE,
          .hooknum = NF_BR_PRE_ROUTING,
          .priority = NF_BR_PRI_BRNF, },
        。。。

但是也不能确定就是在NF_NOOK处处理,有点迷,另外关于优先级也不是很清清楚楚,大家怎么看?

#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;})
#define NF_HOOK_THRESH(pf, hook, skb, indev, outdev, okfn, thresh)               \
({int __ret;                                                                       \
if (list_empty(&nf_hooks[pf][hook]) ||                                               \
    (__ret=nf_hook_slow(pf, hook, &(skb), indev, outdev, okfn, thresh)) == 1)  \
        __ret = (okfn)(skb);                                                       \
__ret;})

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
2 [报告]
发表于 2009-12-28 20:11 |只看该作者
#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;})

这个不就相当于从该hook点优先级数值最小,也就是优先级最高的hook函数开始执行,也就是要遍历注册在该hook点的所有hook函数。

这个说法也解释了你的第1个问题

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
3 [报告]
发表于 2009-12-28 20:14 |只看该作者
NF_HOOK(PF_BRIDGE, NF_BR_PRE_ROUTING, skb, skb->dev, NULL,
                        br_handle_frame_finish);

这个是首先要执行挂载在 hook点 NF_BR_PRE_ROUTING上的所有hook函数。
当且仅当该hook点注册的所有hook函数都对数据包返回NF_ACCEPT,才会调用br_handle_frame_finish函数。

也就是你问题中的okfn是满足一定条件之后,才有可能被调用的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP