Re: operations on nd_prefix list must take rdomain into account
On 26/11/14(Wed) 18:24, Mike Belopuhov wrote: More rdomain checks are needed to be able to use the same subnet in a back to back connection between IPv6 rdomains as pointed out by mpi@. OK? ok mpi@ diff --git sys/netinet6/nd6.c sys/netinet6/nd6.c index 9616187..d704cd6 100644 --- sys/netinet6/nd6.c +++ sys/netinet6/nd6.c @@ -1264,10 +1264,13 @@ nd6_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp) s = splsoftnet(); /* First purge the addresses referenced by a prefix. */ LIST_FOREACH_SAFE(pr, nd_prefix, ndpr_entry, npr) { struct in6_ifaddr *ia6, *ia6_next; + if (pr-ndpr_ifp-if_rdomain != ifp-if_rdomain) + continue; + if (IN6_IS_ADDR_LINKLOCAL(pr-ndpr_prefix.sin6_addr)) continue; /* XXX */ /* do we really have to remove addresses as well? */ TAILQ_FOREACH_SAFE(ia6, in6_ifaddr, ia_list, ia6_next) { @@ -1282,10 +1285,13 @@ nd6_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp) * Purging the addresses might remove the prefix as well. * So run the loop again to access only prefixes that have * not been freed already. */ LIST_FOREACH_SAFE(pr, nd_prefix, ndpr_entry, npr) { + if (pr-ndpr_ifp-if_rdomain != ifp-if_rdomain) + continue; + if (IN6_IS_ADDR_LINKLOCAL(pr-ndpr_prefix.sin6_addr)) continue; /* XXX */ prelist_remove(pr); } diff --git sys/netinet6/nd6_rtr.c sys/netinet6/nd6_rtr.c index bfc9c9f..e46b3b4 100644 --- sys/netinet6/nd6_rtr.c +++ sys/netinet6/nd6_rtr.c @@ -1690,10 +1690,13 @@ nd6_prefix_onlink(struct nd_prefix *pr) * interface, and the prefix has already installed the interface route. * Although such a configuration is expected to be rare, we explicitly * allow it. */ LIST_FOREACH(opr, nd_prefix, ndpr_entry) { + if (opr-ndpr_ifp-if_rdomain != ifp-if_rdomain) + continue; + if (opr == pr) continue; if ((opr-ndpr_stateflags NDPRF_ONLINK) == 0) continue; @@ -1826,10 +1829,13 @@ nd6_prefix_offlink(struct nd_prefix *pr) * the interface route (see comments in nd6_prefix_onlink). * If there's one, try to make the prefix on-link on the * interface. */ LIST_FOREACH(opr, nd_prefix, ndpr_entry) { + if (opr-ndpr_ifp-if_rdomain != ifp-if_rdomain) + continue; + if (opr == pr) continue; if ((opr-ndpr_stateflags NDPRF_ONLINK) != 0) continue;
Re: operations on nd_prefix list must take rdomain into account
Ping. On Fri, Nov 28, 2014 at 13:40 +0100, Mike Belopuhov wrote: Still looking for OK's. On Wed, Nov 26, 2014 at 18:24 +0100, Mike Belopuhov wrote: More rdomain checks are needed to be able to use the same subnet in a back to back connection between IPv6 rdomains as pointed out by mpi@. OK? diff --git sys/netinet6/nd6.c sys/netinet6/nd6.c index 9616187..d704cd6 100644 --- sys/netinet6/nd6.c +++ sys/netinet6/nd6.c @@ -1264,10 +1264,13 @@ nd6_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp) s = splsoftnet(); /* First purge the addresses referenced by a prefix. */ LIST_FOREACH_SAFE(pr, nd_prefix, ndpr_entry, npr) { struct in6_ifaddr *ia6, *ia6_next; + if (pr-ndpr_ifp-if_rdomain != ifp-if_rdomain) + continue; + if (IN6_IS_ADDR_LINKLOCAL(pr-ndpr_prefix.sin6_addr)) continue; /* XXX */ /* do we really have to remove addresses as well? */ TAILQ_FOREACH_SAFE(ia6, in6_ifaddr, ia_list, ia6_next) { @@ -1282,10 +1285,13 @@ nd6_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp) * Purging the addresses might remove the prefix as well. * So run the loop again to access only prefixes that have * not been freed already. */ LIST_FOREACH_SAFE(pr, nd_prefix, ndpr_entry, npr) { + if (pr-ndpr_ifp-if_rdomain != ifp-if_rdomain) + continue; + if (IN6_IS_ADDR_LINKLOCAL(pr-ndpr_prefix.sin6_addr)) continue; /* XXX */ prelist_remove(pr); } diff --git sys/netinet6/nd6_rtr.c sys/netinet6/nd6_rtr.c index bfc9c9f..e46b3b4 100644 --- sys/netinet6/nd6_rtr.c +++ sys/netinet6/nd6_rtr.c @@ -1690,10 +1690,13 @@ nd6_prefix_onlink(struct nd_prefix *pr) * interface, and the prefix has already installed the interface route. * Although such a configuration is expected to be rare, we explicitly * allow it. */ LIST_FOREACH(opr, nd_prefix, ndpr_entry) { + if (opr-ndpr_ifp-if_rdomain != ifp-if_rdomain) + continue; + if (opr == pr) continue; if ((opr-ndpr_stateflags NDPRF_ONLINK) == 0) continue; @@ -1826,10 +1829,13 @@ nd6_prefix_offlink(struct nd_prefix *pr) * the interface route (see comments in nd6_prefix_onlink). * If there's one, try to make the prefix on-link on the * interface. */ LIST_FOREACH(opr, nd_prefix, ndpr_entry) { + if (opr-ndpr_ifp-if_rdomain != ifp-if_rdomain) + continue; + if (opr == pr) continue; if ((opr-ndpr_stateflags NDPRF_ONLINK) != 0) continue;
operations on nd_prefix list must take rdomain into account
More rdomain checks are needed to be able to use the same subnet in a back to back connection between IPv6 rdomains as pointed out by mpi@. OK? diff --git sys/netinet6/nd6.c sys/netinet6/nd6.c index 9616187..d704cd6 100644 --- sys/netinet6/nd6.c +++ sys/netinet6/nd6.c @@ -1264,10 +1264,13 @@ nd6_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp) s = splsoftnet(); /* First purge the addresses referenced by a prefix. */ LIST_FOREACH_SAFE(pr, nd_prefix, ndpr_entry, npr) { struct in6_ifaddr *ia6, *ia6_next; + if (pr-ndpr_ifp-if_rdomain != ifp-if_rdomain) + continue; + if (IN6_IS_ADDR_LINKLOCAL(pr-ndpr_prefix.sin6_addr)) continue; /* XXX */ /* do we really have to remove addresses as well? */ TAILQ_FOREACH_SAFE(ia6, in6_ifaddr, ia_list, ia6_next) { @@ -1282,10 +1285,13 @@ nd6_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp) * Purging the addresses might remove the prefix as well. * So run the loop again to access only prefixes that have * not been freed already. */ LIST_FOREACH_SAFE(pr, nd_prefix, ndpr_entry, npr) { + if (pr-ndpr_ifp-if_rdomain != ifp-if_rdomain) + continue; + if (IN6_IS_ADDR_LINKLOCAL(pr-ndpr_prefix.sin6_addr)) continue; /* XXX */ prelist_remove(pr); } diff --git sys/netinet6/nd6_rtr.c sys/netinet6/nd6_rtr.c index bfc9c9f..e46b3b4 100644 --- sys/netinet6/nd6_rtr.c +++ sys/netinet6/nd6_rtr.c @@ -1690,10 +1690,13 @@ nd6_prefix_onlink(struct nd_prefix *pr) * interface, and the prefix has already installed the interface route. * Although such a configuration is expected to be rare, we explicitly * allow it. */ LIST_FOREACH(opr, nd_prefix, ndpr_entry) { + if (opr-ndpr_ifp-if_rdomain != ifp-if_rdomain) + continue; + if (opr == pr) continue; if ((opr-ndpr_stateflags NDPRF_ONLINK) == 0) continue; @@ -1826,10 +1829,13 @@ nd6_prefix_offlink(struct nd_prefix *pr) * the interface route (see comments in nd6_prefix_onlink). * If there's one, try to make the prefix on-link on the * interface. */ LIST_FOREACH(opr, nd_prefix, ndpr_entry) { + if (opr-ndpr_ifp-if_rdomain != ifp-if_rdomain) + continue; + if (opr == pr) continue; if ((opr-ndpr_stateflags NDPRF_ONLINK) != 0) continue;