亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標題: 注冊了hook鉤子為什么還要用NF_HOOK調(diào)用一次呢? [打印本頁]

作者: jiahehao01    時間: 2012-08-17 11:27
標題: 注冊了hook鉤子為什么還要用NF_HOOK調(diào)用一次呢?
  我自己做實驗,在nf_register_hooks將自己定義的、包含了hook函數(shù),hook點的nf_hook_ops結(jié)構(gòu)體注冊到系統(tǒng)中后,一旦有符合條件的包出現(xiàn),系統(tǒng)都會打印出相應的語句。

  但是在看源碼的時候,經(jīng)?吹接腥缦碌恼{(diào)用方法:       
    return NF_HOOK(PF_INET, NF_INET_PRE_ROUTING, skb, dev, NULL, ip_rcv_finish);

  很不理解。難道 ip_rcv_finish 沒有用 nf_register_hooks 注冊進系統(tǒng)嗎?
  如果注冊了,應該就直接到了hook點,該函數(shù)就會來檢查一次數(shù)據(jù)包,不用再用NF_HOOK再調(diào)用一次。

  多謝各位大俠賜教!
作者: Godbach    時間: 2012-08-17 13:22
回復 1# jiahehao01

ip_rcv_finish 是數(shù)據(jù)包必經(jīng)的處理函數(shù)。有 hook 函數(shù)了就先走 hook,沒有的話,就直接到 ip_rcv_finish 了

   
作者: jiahehao01    時間: 2012-08-17 13:44
Godbach 發(fā)表于 2012-08-17 13:22
回復 1# jiahehao01

ip_rcv_finish 是數(shù)據(jù)包必經(jīng)的處理函數(shù)。有 hook 函數(shù)了就先走 hook,沒有的話,就 ...


  那如果沒有NF_HOOK這一句,也是象版主說的那個效果啊。到了NF_INET_PRE_ROUTING點,就會把這個點上掛著的hook函數(shù)全都過一遍。
  其中自然會包括ip_rcv_finish 函數(shù)。
  我是覺得NF_HOOK這句很多余啊。
作者: Godbach    時間: 2012-08-17 14:46
回復 3# jiahehao01
return 的那一句是必須的。
如果你的內(nèi)核配置文件沒有配置 Netfilter 的話,NF_HOOK 的定義應該是下面這樣子的
  1. #else /* !CONFIG_NETFILTER */
  2. #define NF_HOOK(pf, hook, skb, indev, outdev, okfn) (okfn)(skb)
復制代碼
這樣就相當于直接調(diào)用 ip_rcv_finish 了


   
作者: jiahehao01    時間: 2012-08-17 15:42
    版主,我覺得你上面的說法有點問題。
 我做了一次全局搜索,發(fā)現(xiàn)ip_rcv_finish函數(shù)只有兩個地方有引用,一個是聲明的時候,一個是NF_HOOK。
 這就說明,它根本沒有用nf_register_hooks將自己注冊到系統(tǒng)中去。
 那么,到了NF_INET_PRE_ROUTING這個hook點,ip_rcv_finish函數(shù)是不會被調(diào)用的。所以在上文是用NF_HOOK做了一次顯示調(diào)用。

 那這種NF_HOOK調(diào)用和直接調(diào)用有啥區(qū)別呢?我想大概是用NF_HOOK調(diào)用,能利用linux已有的一些框架的功能吧。。。。。。
作者: Godbach    時間: 2012-08-17 23:02
jiahehao01 發(fā)表于 2012-08-17 15:42
版主,我覺得你上面的說法有點問題。
 我做了一次全局搜索,發(fā)現(xiàn)ip_rcv_finish函數(shù)只有兩個地方有引用 ...

建議你深入看一下 NF_HOOK 的實現(xiàn),這是基本的 C 語言的知識。

作者: jiahehao01    時間: 2012-08-20 09:48
#define NF_HOOK(pf, hook, skb, indev, outdev, okfn) (okfn)(skb)

   很慚愧,我開始認為是這一個函數(shù)指針。。。。但又覺得這不符合正常的函數(shù)指針的聲明方式。
 正常的應該是這樣:
  typedef int (*fun_ptr)(int,int);

 所以,我對NF_HOOK的定義并不理解。。。。。請各位兄臺賜教。
 學藝不精,讓大家見笑了。




歡迎光臨 Chinaunix (http://72891.cn/) Powered by Discuz! X3.2