鉤子函式的呼叫

2021-04-22 19:35:39 字數 2694 閱讀 7968

1、nf_hook_slow函式

hook被註冊後,它就會在那裡守株待兔,等待自動送上門的資料報,那麼核心是如何呼叫到註冊的hook的呢?在分析nf_hook的時候說過,如果指定協議的指定鉤子型別上註冊了鉤子函式數,會呼叫nf_hook_slow函式:

[copy to clipboard]

[ - ]

code:

/* returns 1 if okfn() needs to be executed by the caller,

* -eperm for nf_drop, 0 otherwise. */

int nf_hook_slow(int pf, unsigned int hook, struct sk_buff **pskb,

struct net_device *indev,

struct net_device *outdev,

int (*okfn)(struct sk_buff *),

int hook_thresh)

(*pskb)->nf_debug |= (1 << hook);

#endif

/*取得對應的鍊錶首部*/

elem = &nf_hooks[pf][hook];

next_hook:

/*呼叫對應的鉤子函式*/

verdict = nf_iterate(&nf_hooks[pf][hook], pskb, hook, indev,

outdev, &elem, okfn, hook_thresh);

/*判斷返回值,做相應的處理*/

if (verdict == nf_accept || verdict == nf_stop) else if (verdict == nf_drop) else if (verdict == nf_queue)

unlock:

rcu_read_unlock();

return ret; }

核心的資料**函式,呼叫巨集nf_hook時,會告訴它協議簇和hook型別,nf_hook_slow函式根據這兩個要素,可以很輕易地從nf_hooks 中取得對應的前面註冊好的hook鍊錶的首部:

elem = &nf_hooks[pf][hook];

然後,就呼叫函式nf_iterate ,遍歷hook鍊錶,呼叫鏈用上所有的hook函式

2、nf_iterate 函式

[copy to clipboard]

[ - ]

code:

static unsigned int nf_iterate(struct list_head *head,

struct sk_buff **skb,

int hook,

const struct net_device *indev,

const struct net_device *outdev,

struct list_head **i,

int (*okfn)(struct sk_buff *),

int hook_thresh)

#endif

if (verdict != nf_repeat)

return verdict;

*i = (*i)->prev; }

}return nf_accept; }

我們可以看到,函式在乙個鍊錶的遍歷過程中,不斷地呼叫對應的hook函式:

verdict = elem->hook(hook, skb, indev, outdev, okfn);

以執行我們註冊好的hook,對資料報進行我們想要的處理。函式的返回值verdict決定了封包的命令,接受或丟棄,netfilter共有6 個值:

[copy to clipboard]

[ - ]

code:

/* responses from hook functions. */

#define nf_drop 0                                 丟棄該資料報

#define nf_accept 1                                 保留該資料報

#define nf_stolen 2                                 記掉該資料報

#define nf_queue 3                                 將該資料報插入到使用者空間

#define nf_repeat 4              再次呼叫該hook函式

#define nf_stop 5                                 停止檢測,不再進行下乙個hook函式

逐 個分析每乙個hook函式,就可以了解整個netfilter的執行機理,這是我後面的重點內容。現在需要回答的問題是,如果同時註冊了n個hook,它 們對封包的處理,有的是accept,有的是drop,那麼如果前乙個drop了它,後面的hook函式還會被執行嗎?來看返回值的處理**:

[copy to clipboard]

[ - ]

code:

if (verdict != nf_accept)

很明顯,如果是accept動作,那麼還會繼續呼叫下乙個hook,否則,當是repeat時,再返回前乙個hook,至於其它動作,則直接返回,不再斷續呼叫下乙個hook,換句話講,就是如果資料報已經被前乙個hook函式丟棄,當然不會再被交給下乙個hook函式。

mounted鉤子函式 對vue中鉤子函式的理解

1 beforecreate 鉤子 該階段元件例項剛建立,元件屬性計算之前 可理解為元件屬性還未初始化,未繫結,未掛載元素el 比如 el,data,methods等,如果你試圖在beforecreated鉤子中獲取這些屬性值,會得到ubdefined 的結果,但是 可以獲取到this物件,因為此時...

mysql 鉤子函式 Flask鉤子函式是什麼

flask鉤子函式 在flask中鉤子函式是使用特定的裝飾器的函式。為什麼叫做鉤子函式呢,是因為鉤子函式可以在正常執行的 中,插入一段自己想要執行的 那麼這種函式就叫做鉤子函式。before first request flask專案第一次部署後會執行的鉤子函式。before request 請求已...

UCOS III 鉤子函式

鉤子函式一般主要是用來擴充套件其他函式 任務 功能的,鉤子函式有如下幾個 1 osidletaskhook 空閒任務呼叫這個函式,可以用來讓 cpu進入低功耗模式2 osinithook 系統初始化函式 osinit 呼叫此函式。3 osstattaskhook 統計任務每秒中都會呼叫這個函式,此函...