通知鏈是一份函數列表,當給定事件發生時予以執行。列表中的每一個函數都讓另外一個子系統知道,調用此函數的子系統內所發生的一個事件或子系統所偵測到個一個事件。網絡
通知鏈使用發佈-訂閱(publish-and-subcribe)模型:函數
通知鏈列表元素的類型是notifier_block,定義:spa
/* * notifier_call 要執行的函數 * next 連接列表的元素 * priority 優先級 */ struct notifier_block{ int (*notifier_call)(struct notifier_block *self, unsigned long, void *); struct notifier_block *next; int priority; }
網絡子系統通知鏈:code
/*struct nofitier_block **list 爲通知鏈*/ /*註冊*/ int notifier_chain_register(struct nofitier_block **list, struct notifier_block *n); /*除名*/ int notifier_chain_unregister(struct nofitier_block **list, struct notifier_block *n);
回調函數:接口
註冊 | 除名 | |
---|---|---|
inetaddr_chain | register_inetaddr_notifier | unregister_inetaddr_notifier |
inet6addr_chain | register_inet6addr_notifier | unregister_inet6addr_notifier |
netdev_chain | register_netdevice_notifier | unregister_netdevice_notifier |
通知:事件
/* * n 通知鏈 * val事件類型 * v 輸入參數 * 返回值: NOTIFY_OK-通知信息被正確處理 NOTIFY_DONE - 對通知信息不敢興趣 NOTIFY_BAD - 有些事情出錯,中止調用此事件的回調函數 NOTIFY_STOP - 函數被正確調用,此事件不須要進一步調用其餘回調函數 NOTIFY_STOP_MASK - 由notifier_call_chain檢查,以瞭解是否中止調用回調函數,或者繼續調用下去 */ int notifier_call_chain(struct notifier_block **n, unsigned long val, void *v) { int ret = NOTIFY_DONE; struct notifier_block *nb = *n; while(nb) { ret = nb->notifier_call(list,val,v); if(ret&NOTIFY_STOP_MASK) { return ret; } nb = nb->next; } return ret; }