免费注册 查看新帖 |

Chinaunix

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

[内核入门] 注册了hook钩子为什么还要用NF_HOOK调用一次呢? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-08-17 11:27 |只看该作者 |倒序浏览
  我自己做实验,在nf_register_hooks将自己定义的、包含了hook函数,hook点的nf_hook_ops结构体注册到系统中后,一旦有符合条件的包出现,系统都会打印出相应的语句。

  但是在看源码的时候,经常看到有如下的调用方法:       
    return NF_HOOK(PF_INET, NF_INET_PRE_ROUTING, skb, dev, NULL, ip_rcv_finish);

  很不理解。难道 ip_rcv_finish 没有用 nf_register_hooks 注册进系统吗?
  如果注册了,应该就直接到了hook点,该函数就会来检查一次数据包,不用再用NF_HOOK再调用一次啊?

  多谢各位大侠赐教!

论坛徽章:
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 [报告]
发表于 2012-08-17 13:22 |只看该作者
回复 1# jiahehao01

ip_rcv_finish 是数据包必经的处理函数。有 hook 函数了就先走 hook,没有的话,就直接到 ip_rcv_finish 了

   

论坛徽章:
0
3 [报告]
发表于 2012-08-17 13:44 |只看该作者
Godbach 发表于 2012-08-17 13:22
回复 1# jiahehao01

ip_rcv_finish 是数据包必经的处理函数。有 hook 函数了就先走 hook,没有的话,就 ...


  那如果没有NF_HOOK这一句,也是象版主说的那个效果啊。到了NF_INET_PRE_ROUTING点,就会把这个点上挂着的hook函数全都过一遍。
  其中自然会包括ip_rcv_finish 函数。
  我是觉得NF_HOOK这句很多余啊。

论坛徽章:
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
4 [报告]
发表于 2012-08-17 14:46 |只看该作者
回复 3# jiahehao01
return 的那一句是必须的。
如果你的内核配置文件没有配置 Netfilter 的话,NF_HOOK 的定义应该是下面这样子的
  1. #else /* !CONFIG_NETFILTER */
  2. #define NF_HOOK(pf, hook, skb, indev, outdev, okfn) (okfn)(skb)
复制代码
这样就相当于直接调用 ip_rcv_finish 了


   

论坛徽章:
0
5 [报告]
发表于 2012-08-17 15:42 |只看该作者
    版主,我觉得你上面的说法有点问题。
 我做了一次全局搜索,发现ip_rcv_finish函数只有两个地方有引用,一个是声明的时候,一个是NF_HOOK。
 这就说明,它根本没有用nf_register_hooks将自己注册到系统中去。
 那么,到了NF_INET_PRE_ROUTING这个hook点,ip_rcv_finish函数是不会被调用的。所以在上文是用NF_HOOK做了一次显示调用。

 那这种NF_HOOK调用和直接调用有啥区别呢?我想大概是用NF_HOOK调用,能利用linux已有的一些框架的功能吧。。。。。。

论坛徽章:
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
6 [报告]
发表于 2012-08-17 23:02 |只看该作者
jiahehao01 发表于 2012-08-17 15:42
版主,我觉得你上面的说法有点问题。
 我做了一次全局搜索,发现ip_rcv_finish函数只有两个地方有引用 ...

建议你深入看一下 NF_HOOK 的实现,这是基本的 C 语言的知识。

论坛徽章:
0
7 [报告]
发表于 2012-08-20 09:48 |只看该作者
#define NF_HOOK(pf, hook, skb, indev, outdev, okfn) (okfn)(skb)

   很惭愧,我开始认为是这一个函数指针。。。。但又觉得这不符合正常的函数指针的声明方式。
 正常的应该是这样:
  typedef int (*fun_ptr)(int,int);

 所以,我对NF_HOOK的定义并不理解。。。。。请各位兄台赐教。
 学艺不精,让大家见笑了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP