Re: operations on nd_prefix list must take rdomain into account

2015-01-12 Thread Martin Pieuchot
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

2014-12-08 Thread Mike Belopuhov
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

2014-11-26 Thread Mike Belopuhov
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;