最近正在看网络代码,书中说内核子系统在初始化时候会注册到自己感兴趣事件的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);
}
阅读(4696) | 评论(0) | 转发(0) |