我在我的模块中添加了一个netdevice通知程序:
int os_netdevice_notifier_cb (struct notifier_block *, unsigned long, void *);
...
static struct notifier_block os_netdevice_notifier =
{
os_netdevice_notifier_cb,
NULL,
0
};
register_netdevice_notifier(&os_netdevice_notifier);
我希望能够看到的是已注册/未注册的设备,即我必须监视事件NETDEV_UNREGISTER。收到此事件后,是否保证设备已从系统中删除,或者仅表示已安排将其删除,实际工作将在以后完成?
查看net / core / dev.c中的代码,看起来事件是在设备清理后立即发送的,但可能是我遗漏了什么?
第二个问题 - 在系统未注册的情况下删除分配给接口的IP / hw地址的代码在哪里?
谢谢! 标记
答案 0 :(得分:1)
在NETDEV_UNREGISTER点,设备没有完全从系统中移除,至少此时ref参数仍然不为零。设备至少已经关闭,所以可以在这里使用NETDEV_UNREGISTER,因为此时RTM_DELLINK也会被发送到用户空间。
删除IP地址由net / ipv4 / devinet.c中的inet_del_ifa()完成。取消注册网络接口时,在NETDEV_UNREGISTER事件时,会调用inetdev_destroy():
static void inetdev_destroy(struct in_device *in_dev)
{
struct in_ifaddr *ifa;
struct net_device *dev;
ASSERT_RTNL();
dev = in_dev->dev;
in_dev->dead = 1;
ip_mc_destroy_dev(in_dev);
while ((ifa = in_dev->ifa_list) != NULL) {
inet_del_ifa(in_dev, &in_dev->ifa_list, 0);
inet_free_ifa(ifa);
}
RCU_INIT_POINTER(dev->ip_ptr, NULL);
devinet_sysctl_unregister(in_dev);
neigh_parms_release(&arp_tbl, in_dev->arp_parms);
arp_ifdown(dev);
call_rcu(&in_dev->rcu_head, in_dev_rcu_put);
}