通知链是一份函数列表,当给定事件发生时予以执行。列表中的每一个函数都让另外一个子系统知道,调用此函数的子系统内所发生的一个事件或子系统所侦测到个一个事件。网络
通知链使用发布-订阅(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; }