static void inetdev_destroy(struct in_device *in_dev) { struct in_ifaddr *ifa; ASSERT_RTNL(); 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); } #ifdef CONFIG_SYSCTL devinet_sysctl_unregister(&in_dev->cnf); #endif write_lock_bh(&inetdev_lock); in_dev->dev->ip_ptr = NULL; /* in_dev_put following below will kill the in_device */ write_unlock_bh(&inetdev_lock); neigh_parms_release(&arp_tbl, in_dev->arp_parms); in_dev_put(in_dev); }
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); } 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); }
static void inetdev_destroy(struct in_device *in_dev) { struct in_ifaddr *ifa; struct net_device *dev; ASSERT_RTNL(); dev = in_dev->dev; if (dev == &loopback_dev) return; 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); } #ifdef CONFIG_SYSCTL devinet_sysctl_unregister(&in_dev->cnf); #endif dev->ip_ptr = NULL; #ifdef CONFIG_SYSCTL neigh_sysctl_unregister(in_dev->arp_parms); #endif neigh_parms_release(&arp_tbl, in_dev->arp_parms); arp_ifdown(dev); call_rcu(&in_dev->rcu_head, in_dev_rcu_put); }