diff options
Diffstat (limited to 'sys/netinet6/in6_ifattach.c')
-rw-r--r-- | sys/netinet6/in6_ifattach.c | 25 |
1 files changed, 5 insertions, 20 deletions
diff --git a/sys/netinet6/in6_ifattach.c b/sys/netinet6/in6_ifattach.c index ebfdf6e..3069c46 100644 --- a/sys/netinet6/in6_ifattach.c +++ b/sys/netinet6/in6_ifattach.c @@ -784,7 +784,7 @@ in6_ifdetach(struct ifnet *ifp) { INIT_VNET_INET(ifp->if_vnet); INIT_VNET_INET6(ifp->if_vnet); - struct in6_ifaddr *ia, *oia; + struct in6_ifaddr *ia; struct ifaddr *ifa, *next; struct radix_node_head *rnh; struct rtentry *rt; @@ -832,27 +832,12 @@ in6_ifdetach(struct ifnet *ifp) /* remove from the linked list */ IF_ADDR_LOCK(ifp); - TAILQ_REMOVE(&ifp->if_addrhead, (struct ifaddr *)ia, ifa_link); + TAILQ_REMOVE(&ifp->if_addrhead, ifa, ifa_link); IF_ADDR_UNLOCK(ifp); - ifa_free(&ia->ia_ifa); - - /* also remove from the IPv6 address chain(itojun&jinmei) */ - oia = ia; - if (oia == (ia = V_in6_ifaddr)) - V_in6_ifaddr = ia->ia_next; - else { - while (ia->ia_next && (ia->ia_next != oia)) - ia = ia->ia_next; - if (ia->ia_next) - ia->ia_next = oia->ia_next; - else { - nd6log((LOG_ERR, - "%s: didn't unlink in6ifaddr from list\n", - if_name(ifp))); - } - } + ifa_free(ifa); /* if_addrhead */ - ifa_free(&oia->ia_ifa); + TAILQ_REMOVE(&V_in6_ifaddrhead, ia, ia_link); + ifa_free(ifa); } in6_pcbpurgeif0(&V_udbinfo, ifp); |