2012-12-08 10 views
0

我我的模塊中加入了netdevice通知: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地址的代碼在哪裏從系統註銷?

謝謝! 馬克

回答

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); 
}