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 統計任務每秒中都會呼叫這個函式,此函...