On Thu, Mar 02, 2017 at 11:30:41AM +0100, Martin Pieuchot wrote:
> ok?
OK bluhm@
>
> Index: netinet6/nd6_rtr.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet6/nd6_rtr.c,v
> retrieving revision 1.155
> diff -u -p -r1.155 nd6_rtr.c
> --- netinet6/nd6_rtr.c 9 Feb 2017 15:23:35 -0000 1.155
> +++ netinet6/nd6_rtr.c 2 Mar 2017 10:23:04 -0000
> @@ -1519,8 +1519,10 @@ find_pfxlist_reachable_router(struct nd_
> void
> pfxlist_onlink_check(void)
> {
> + struct ifnet *ifp;
> + struct ifaddr *ifa;
> struct nd_prefix *pr;
> - struct in6_ifaddr *ia6;
> + struct in6_ifaddr *ia6, *pia6 = NULL;
> char addr[INET6_ADDRSTRLEN];
>
> /*
> @@ -1624,42 +1626,54 @@ pfxlist_onlink_check(void)
> * always be attached.
> * The precise detection logic is same as the one for prefixes.
> */
> - TAILQ_FOREACH(ia6, &in6_ifaddr, ia_list) {
> - if (!(ia6->ia6_flags & IN6_IFF_AUTOCONF))
> - continue;
> + TAILQ_FOREACH(ifp, &ifnet, if_list) {
> + TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) {
> + if (ifa->ifa_addr->sa_family != AF_INET6)
> + continue;
> +
> + ia6 = ifatoia6(ifa);
> + if ((ia6->ia6_flags & IN6_IFF_AUTOCONF) == 0)
> + continue;
>
> - if (ia6->ia6_ndpr == NULL) {
> /*
> * This can happen when we first configure the address
> * (i.e. the address exists, but the prefix does not).
> * XXX: complicated relationships...
> */
> - continue;
> + if (ia6->ia6_ndpr == NULL)
> + continue;
> +
> + if (find_pfxlist_reachable_router(ia6->ia6_ndpr)) {
> + pia6 = ia6;
> + break;
> + }
> }
>
> - if (find_pfxlist_reachable_router(ia6->ia6_ndpr))
> + if (pia6 != NULL)
> break;
> }
> - if (ia6) {
> - TAILQ_FOREACH(ia6, &in6_ifaddr, ia_list) {
> - if ((ia6->ia6_flags & IN6_IFF_AUTOCONF) == 0)
> - continue;
>
> - if (ia6->ia6_ndpr == NULL) /* XXX: see above. */
> + TAILQ_FOREACH(ifp, &ifnet, if_list) {
> + TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) {
> + if (ifa->ifa_addr->sa_family != AF_INET6)
> continue;
>
> - if (find_pfxlist_reachable_router(ia6->ia6_ndpr))
> - ia6->ia6_flags &= ~IN6_IFF_DETACHED;
> - else
> - ia6->ia6_flags |= IN6_IFF_DETACHED;
> - }
> - }
> - else {
> - TAILQ_FOREACH(ia6, &in6_ifaddr, ia_list) {
> + ia6 = ifatoia6(ifa);
> if ((ia6->ia6_flags & IN6_IFF_AUTOCONF) == 0)
> continue;
>
> - ia6->ia6_flags &= ~IN6_IFF_DETACHED;
> + if (pia6 != NULL) {
> + /* XXX: see above. */
> + if (ia6->ia6_ndpr == NULL)
> + continue;
> +
> + if
> (find_pfxlist_reachable_router(ia6->ia6_ndpr))
> + ia6->ia6_flags &= ~IN6_IFF_DETACHED;
> + else
> + ia6->ia6_flags |= IN6_IFF_DETACHED;
> + } else {
> + ia6->ia6_flags &= ~IN6_IFF_DETACHED;
> + }
> }
> }
> }