On 06/03/14(Thu) 09:35, Martin Pieuchot wrote:
> 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...
Anybody?
> >
> > 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);
> >
>