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

Reply via email to