Chinaunix首页 | 论坛 | 博客
  • 博客访问: 30658
  • 博文数量: 54
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 480
  • 用 户 组: 普通用户
  • 注册时间: 2018-03-29 14:38
文章分类
文章存档

2019年(53)

我的朋友

分类: LINUX

2019-11-13 15:02:26

最近正在看网络代码,书中说内核子系统在初始化时候会注册到自己感兴趣事件的notification chains上。

然后在events发生时候,由notifier_call_chain()函数产生,并遍历所有回调函数,调用此event回调函数来处理事件的变化对该子系统的影响。

但是当事件发生的时候,谁来触发调用notifier_call_chain()函数呢?具体是怎么调用的?

|
当事件发生时,由处理事件的驱动负责触发通知链,用的是
 int call_netdevice_notifiers(unsigned long val, struct net_device *dev);

例如ifconfig eth0 up
最终会被网络核心的dev_ifsioc 处理
switch (cmd) {
case SIOCSIFFLAGS: /* Set interface flags */
return dev_change_flags(dev, ifr->ifr_flags);
.....


dev_change_flags 调用 __dev_notify_flags
最后__dev_notify_flags触发事件
void __dev_notify_flags(struct net_device *dev, unsigned int old_flags)
{
unsigned int changes = dev->flags ^ old_flags;

if (changes & IFF_UP) {
if (dev->flags & IFF_UP)
call_netdevice_notifiers(NETDEV_UP, dev);
else
call_netdevice_notifiers(NETDEV_DOWN, dev);
}

if (dev->flags & IFF_UP &&
    (changes & ~(IFF_UP | IFF_PROMISC | IFF_ALLMULTI | IFF_VOLATILE)))
call_netdevice_notifiers(NETDEV_CHANGE, dev);
}

阅读(2872) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册