当前位置: 技术问答>linux和unix
关于notification chains的问题
来源: 互联网 发布时间:2016-09-27
本文导语: 最近正在看网络代码,书中说内核子系统在初始化时候会注册到自己感兴趣事件的notification chains上。 然后在events发生时候,由notifier_call_chain()函数产生,并遍历所有回调函数,调用此event回调函数来处理事件的变化...
最近正在看网络代码,书中说内核子系统在初始化时候会注册到自己感兴趣事件的notification chains上。
然后在events发生时候,由notifier_call_chain()函数产生,并遍历所有回调函数,调用此event回调函数来处理事件的变化对该子系统的影响。
但是当事件发生的时候,谁来触发调用notifier_call_chain()函数呢?具体是怎么调用的?
然后在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);
}
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);
}
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。