0

我在我的模块中添加了一个网络设备通知程序:

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/硬件地址的代码在哪里,因为它从系统中注销?

谢谢 !标记

4

1 回答 1

1

在 NETDEV_UNREGISTER 时,设备并未完全从系统中删除,至少此时引用计数仍不为零。设备至少已经关闭,因此可以在此处使用 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);
}
于 2012-12-08T07:04:43.607 回答