linux内核网络源码分析--定义链

通知列表元素类型notifier_block, 定义如下

struct notifier_block

{

int (*notifier_call)(struct notifer_block *self, unsigned long, void *);

struct notifier_block *next;

int priority;

};

notifier_call 是要执行函数next用于链接列表元素priority 代表函数优先级较高优先级的函数执行但是实际注册几乎都不理会notifer_block定义priority. 意味着获得默认值0因此执行次序仅仅依赖于注册次序notifier_call 返回值列在后面一节通知事件

notifier_block实例常见名称xxx_chain, xxx_notifier_chain 以及xxx_notifier_list.

注册

一个内核组件给定通知事件感兴趣可以通用函数notifier_chain_register予以注册内核也提供一组内含notifier_chain_register包裹函数其中一部分4-1

4-1列出了主要API以及相关包裹函数可用于三条链inetaddr_chain, inet6addr_chain以及netdev_chain注册以及删除

4-1 一些链条所用主要函数包裹函数

操作 函数原型

注册 int notifier_chain_register(struct notifier_block **list, struct notifier_block *n)

包裹函数

inetaddr_chain register_inetaddr_notifier

inet6addr_chain register_inet6addr_notifier

netdev_chain register_netdevice_notifier

除名 int notifier_chain_unregister(struct notifier_block **nl, struct notifier_block *n)

4-1 一些链条所用主要函数包裹函数

操作 函数原型

包裹函数

inetaddr_chain unregister_inetaddr_notifier

inet6addr_chain unregister_inet6addr_notifier

netdev_chain unregister_netdevice_notifier

通知

int notifier_call_chain(struct notifier_block **n, unsigned long val, void *v)

对于每条链条而言那些notifier_block 实体插入到一个按照优先级顺序列表中相同优先级元素插入实践排序新的元素末尾

通知访问收到notifier_lock保护所有通知只用一个并不是什么大不了限制而且也不影响性嫩因为子系统通常只是引导模块加载时候注册notifier_call函数然后那时起列表访问都是只读

因为调用notifier_chain_register 函数就是把回调函数插入到所有列表因此必须列表指定输入参数然而函数很少直接调用通常改用通用包裹函数

int notifier_chain_register(struct notifier_block **list, struct notifier_block *n)

{

write_lock(&notifier_lock);

while (*list)

{

if (n->priority > (*list)->priority)

break;

list = &(*list)->next

    }

n->next = *list;

*list = n;

write_unlock(&notifier_lock);

return 0;

}

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值