On 22/01/14(Wed) 11:46, Martin Pieuchot wrote: > Network addresses added to the interface local list thought ifa_add() > are the link-local address and the IPv4/6 ones. > > Since if_detach() now calls in_ifdetach(), there should be no address > left on the list apart from the link-layer one at this stage. So the > diff below removes it directly, there's no need for a loop anymore. > > I left a check for safety afterward... > > ok?
Still looking for oks... > > Index: net/if.c > =================================================================== > RCS file: /home/ncvs/src/sys/net/if.c,v > retrieving revision 1.279 > diff -u -p -r1.279 if.c > --- net/if.c 28 Nov 2013 10:16:44 -0000 1.279 > +++ net/if.c 7 Jan 2014 11:57:09 -0000 > @@ -359,12 +359,10 @@ if_free_sadl(struct ifnet *ifp) > > s = splnet(); > rtinit(ifa, RTM_DELETE, 0); > -#if 0 > ifa_del(ifp, ifa); > + ifafree(ifp->if_lladdr); > ifp->if_lladdr = NULL; > -#endif > ifp->if_sadl = NULL; > - > splx(s); > } > > @@ -587,27 +585,22 @@ do { \ > if (ISSET(ifp->if_xflags, IFXF_TXREADY)) > TAILQ_REMOVE(&iftxlist, ifp, if_txlist); > > - /* > - * Deallocate private resources. > - */ > - while ((ifa = TAILQ_FIRST(&ifp->if_addrlist)) != NULL) { > - ifa_del(ifp, ifa); > - /* XXX if_free_sadl needs this */ > - if (ifa == ifp->if_lladdr) > - continue; > - > - ifa->ifa_ifp = NULL; > - ifafree(ifa); > - } > - > while ((ifg = TAILQ_FIRST(&ifp->if_groups)) != NULL) > if_delgroup(ifp, ifg->ifgl_group->ifg_group); > > if_free_sadl(ifp); > > - ifp->if_lladdr->ifa_ifp = NULL; > - ifafree(ifp->if_lladdr); > - ifp->if_lladdr = NULL; > + /* We should not have any address left at this point. */ > + if (!TAILQ_EMPTY(&ifp->if_addrlist)) { > +#ifdef DIAGNOSTIC > + printf("%s: address list non empty\n", ifp->if_xname); > +#endif > + while ((ifa = TAILQ_FIRST(&ifp->if_addrlist)) != NULL) { > + ifa_del(ifp, ifa); > + ifa->ifa_ifp = NULL; > + ifafree(ifa); > + } > + } > > free(ifp->if_addrhooks, M_TEMP); > free(ifp->if_linkstatehooks, M_TEMP); >