0

モジュールにnetdevicenotifierを追加しています。

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のコードを見ると、デバイスがクリーンアップされた直後にイベントが送信されているように見えますが、何かが足りない可能性がありますか?

そして2番目の質問-インターフェースがシステムから登録解除されたときにインターフェースに割り当てられたIP/hwアドレスを削除するコードはどこにありますか?

ありがとう !マーク

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 に答える