Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 9 Jan 2013 18:18:08 +0000 (UTC)
From:      Hajimu UMEMOTO <ume@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r245230 - in head: sbin/ifconfig sys/netinet6 usr.sbin/ndp
Message-ID:  <201301091818.r09II8vn074784@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ume
Date: Wed Jan  9 18:18:08 2013
New Revision: 245230
URL: http://svnweb.freebsd.org/changeset/base/245230

Log:
  Add no_prefer_iface option.
  It stops treating the address on the interface as special by source
  address selection rule even when the interface is outgoing interface.
  This is desired in some situation.
  
  Requested by:	hrs
  Reviewed by:	IHANet folks including hrs
  MFC after:	1 week

Modified:
  head/sbin/ifconfig/af_inet6.c
  head/sbin/ifconfig/af_nd6.c
  head/sbin/ifconfig/ifconfig.8
  head/sys/netinet6/in6_src.c
  head/sys/netinet6/nd6.h
  head/usr.sbin/ndp/ndp.8
  head/usr.sbin/ndp/ndp.c

Modified: head/sbin/ifconfig/af_inet6.c
==============================================================================
--- head/sbin/ifconfig/af_inet6.c	Wed Jan  9 17:09:06 2013	(r245229)
+++ head/sbin/ifconfig/af_inet6.c	Wed Jan  9 18:18:08 2013	(r245230)
@@ -473,6 +473,8 @@ static struct cmd inet6_cmds[] = {
 	DEF_CMD("-nud",		-ND6_IFF_PERFORMNUD,	setnd6flags),
 	DEF_CMD("auto_linklocal",ND6_IFF_AUTO_LINKLOCAL,setnd6flags),
 	DEF_CMD("-auto_linklocal",-ND6_IFF_AUTO_LINKLOCAL,setnd6flags),
+	DEF_CMD("no_prefer_iface",ND6_IFF_NO_PREFER_IFACE,setnd6flags),
+	DEF_CMD("-no_prefer_iface",-ND6_IFF_NO_PREFER_IFACE,setnd6flags),
 	DEF_CMD_ARG("pltime",        			setip6pltime),
 	DEF_CMD_ARG("vltime",        			setip6vltime),
 	DEF_CMD("eui64",	0,			setip6eui64),

Modified: head/sbin/ifconfig/af_nd6.c
==============================================================================
--- head/sbin/ifconfig/af_nd6.c	Wed Jan  9 17:09:06 2013	(r245229)
+++ head/sbin/ifconfig/af_nd6.c	Wed Jan  9 18:18:08 2013	(r245230)
@@ -58,7 +58,7 @@ static const char rcsid[] =
 #define	MAX_SYSCTL_TRY	5
 #define	ND6BITS	"\020\001PERFORMNUD\002ACCEPT_RTADV\003PREFER_SOURCE" \
 		"\004IFDISABLED\005DONT_SET_IFROUTE\006AUTO_LINKLOCAL" \
-		"\007NO_RADR\020DEFAULTIF"
+		"\007NO_RADR\010NO_PREFER_IFACE\020DEFAULTIF"
 
 static int isnd6defif(int);
 void setnd6flags(const char *, int, int, const struct afswtch *);

Modified: head/sbin/ifconfig/ifconfig.8
==============================================================================
--- head/sbin/ifconfig/ifconfig.8	Wed Jan  9 17:09:06 2013	(r245229)
+++ head/sbin/ifconfig/ifconfig.8	Wed Jan  9 18:18:08 2013	(r245230)
@@ -28,7 +28,7 @@
 .\"     From: @(#)ifconfig.8	8.3 (Berkeley) 1/5/94
 .\" $FreeBSD$
 .\"
-.Dd November 7, 2012
+.Dd January 10, 2013
 .Dt IFCONFIG 8
 .Os
 .Sh NAME
@@ -716,6 +716,13 @@ Set a flag to enable Neighbor Unreachabi
 .It Cm -nud
 Clear a flag
 .Cm nud .
+.It Cm no_prefer_iface
+Set a flag to not prefer address on the interface as candidates of the
+source address for outgoing packets, even when the interface is
+outgoing interface.
+.It Cm -no_prefer_iface
+Clear a flag
+.Cm no_prefer_iface .
 .El
 .Pp
 The following parameters are specific to cloning

Modified: head/sys/netinet6/in6_src.c
==============================================================================
--- head/sys/netinet6/in6_src.c	Wed Jan  9 17:09:06 2013	(r245229)
+++ head/sys/netinet6/in6_src.c	Wed Jan  9 18:18:08 2013	(r245230)
@@ -383,10 +383,12 @@ in6_selectsrc(struct sockaddr_in6 *dstso
 		 */
 
 		/* Rule 5: Prefer outgoing interface */
-		if (ia_best->ia_ifp == ifp && ia->ia_ifp != ifp)
-			NEXT(5);
-		if (ia_best->ia_ifp != ifp && ia->ia_ifp == ifp)
-			REPLACE(5);
+		if (!(ND_IFINFO(ifp)->flags & ND6_IFF_NO_PREFER_IFACE)) {
+			if (ia_best->ia_ifp == ifp && ia->ia_ifp != ifp)
+				NEXT(5);
+			if (ia_best->ia_ifp != ifp && ia->ia_ifp == ifp)
+				REPLACE(5);
+		}
 
 		/*
 		 * Rule 6: Prefer matching label

Modified: head/sys/netinet6/nd6.h
==============================================================================
--- head/sys/netinet6/nd6.h	Wed Jan  9 17:09:06 2013	(r245229)
+++ head/sys/netinet6/nd6.h	Wed Jan  9 18:18:08 2013	(r245230)
@@ -86,6 +86,7 @@ struct nd_ifinfo {
 #define ND6_IFF_DONT_SET_IFROUTE	0x10
 #define ND6_IFF_AUTO_LINKLOCAL	0x20
 #define	ND6_IFF_NO_RADR		0x40
+#define ND6_IFF_NO_PREFER_IFACE	0x80 /* XXX: not related to ND. */
 
 #define	ND6_CREATE		LLE_CREATE
 #define	ND6_EXCLUSIVE		LLE_EXCLUSIVE

Modified: head/usr.sbin/ndp/ndp.8
==============================================================================
--- head/usr.sbin/ndp/ndp.8	Wed Jan  9 17:09:06 2013	(r245229)
+++ head/usr.sbin/ndp/ndp.8	Wed Jan  9 18:18:08 2013	(r245230)
@@ -29,7 +29,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd July 9, 2012
+.Dd Jan 10, 2013
 .Dt NDP 8
 .Os
 .\"
@@ -192,6 +192,15 @@ on
 This flag is set by
 .Va net.inet6.ip6.auto_linklocal
 sysctl variable.
+.It Ic no_prefer_iface
+The address on the outgoing interface is preferred by source addess
+selection rule.
+If this flag is set, stop treating the address on the
+.Ar interface
+as special even when the
+.Ar interface
+is outgoing interface.
+The default value of this flag is off.
 .It Ic disabled
 Disable IPv6 operation on the interface.
 When disabled, the interface discards any IPv6 packets

Modified: head/usr.sbin/ndp/ndp.c
==============================================================================
--- head/usr.sbin/ndp/ndp.c	Wed Jan  9 17:09:06 2013	(r245229)
+++ head/usr.sbin/ndp/ndp.c	Wed Jan  9 18:18:08 2013	(r245230)
@@ -982,6 +982,9 @@ ifinfo(ifname, argc, argv)
 #ifdef ND6_IFF_AUTO_LINKLOCAL
 		SETFLAG("auto_linklocal", ND6_IFF_AUTO_LINKLOCAL);
 #endif
+#ifdef ND6_IFF_NO_PREFER_IFACE
+		SETFLAG("no_prefer_iface", ND6_IFF_NO_PREFER_IFACE);
+#endif
 		SETVALUE("basereachable", ND.basereachable);
 		SETVALUE("retrans", ND.retrans);
 		SETVALUE("curhlim", ND.chlim);
@@ -1055,6 +1058,10 @@ ifinfo(ifname, argc, argv)
 		if ((ND.flags & ND6_IFF_AUTO_LINKLOCAL))
 			printf("auto_linklocal ");
 #endif
+#ifdef ND6_IFF_NO_PREFER_IFACE
+		if ((ND.flags & ND6_IFF_NO_PREFER_IFACE))
+			printf("no_prefer_iface ");
+#endif
 	}
 	putc('\n', stdout);
 #undef ND



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201301091818.r09II8vn074784>