Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 9 Oct 2014 02:49:34 +0000 (UTC)
From:      "Andrey V. Elsukov" <ae@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r272790 - in stable/10: sbin/ifconfig sys/netinet6 usr.bin/netstat
Message-ID:  <201410090249.s992nYeJ076135@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ae
Date: Thu Oct  9 02:49:33 2014
New Revision: 272790
URL: https://svnweb.freebsd.org/changeset/base/272790

Log:
  MFC r271307:
    Add the ability to set `prefer_source' flag to an IPv6 address.
    It affects the IPv6 source address selection algorithm (RFC 6724)
    and allows override the last rule ("longest matching prefix") for
    choosing among equivalent addresses. The address with `prefer_source'
    will be preferred source address.

Modified:
  stable/10/sbin/ifconfig/af_inet6.c
  stable/10/sbin/ifconfig/ifconfig.8
  stable/10/sys/netinet6/in6_src.c
  stable/10/sys/netinet6/in6_var.h
  stable/10/usr.bin/netstat/inet6.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sbin/ifconfig/af_inet6.c
==============================================================================
--- stable/10/sbin/ifconfig/af_inet6.c	Thu Oct  9 02:30:38 2014	(r272789)
+++ stable/10/sbin/ifconfig/af_inet6.c	Thu Oct  9 02:49:33 2014	(r272790)
@@ -254,6 +254,8 @@ in6_status(int s __unused, const struct 
 		printf("autoconf ");
 	if ((flags6 & IN6_IFF_TEMPORARY) != 0)
 		printf("temporary ");
+	if ((flags6 & IN6_IFF_PREFER_SOURCE) != 0)
+		printf("prefer_source ");
 
 	if (((struct sockaddr_in6 *)(ifa->ifa_addr))->sin6_scope_id)
 		printf("scopeid 0x%x ",
@@ -465,6 +467,8 @@ static struct cmd inet6_cmds[] = {
 	DEF_CMD("-deprecated", -IN6_IFF_DEPRECATED,	setip6flags),
 	DEF_CMD("autoconf",	IN6_IFF_AUTOCONF,	setip6flags),
 	DEF_CMD("-autoconf",	-IN6_IFF_AUTOCONF,	setip6flags),
+	DEF_CMD("prefer_source",IN6_IFF_PREFER_SOURCE,	setip6flags),
+	DEF_CMD("-prefer_source",-IN6_IFF_PREFER_SOURCE,setip6flags),
 	DEF_CMD("accept_rtadv",	ND6_IFF_ACCEPT_RTADV,	setnd6flags),
 	DEF_CMD("-accept_rtadv",-ND6_IFF_ACCEPT_RTADV,	setnd6flags),
 	DEF_CMD("no_radr",	ND6_IFF_NO_RADR,	setnd6flags),

Modified: stable/10/sbin/ifconfig/ifconfig.8
==============================================================================
--- stable/10/sbin/ifconfig/ifconfig.8	Thu Oct  9 02:30:38 2014	(r272789)
+++ stable/10/sbin/ifconfig/ifconfig.8	Thu Oct  9 02:49:33 2014	(r272790)
@@ -28,7 +28,7 @@
 .\"     From: @(#)ifconfig.8	8.3 (Berkeley) 1/5/94
 .\" $FreeBSD$
 .\"
-.Dd October 21, 2013
+.Dd September 9, 2014
 .Dt IFCONFIG 8
 .Os
 .Sh NAME
@@ -725,6 +725,19 @@ Clear a flag
 .Cm no_prefer_iface .
 .El
 .Pp
+The following parameters are specific for IPv6 addresses.
+Note that the address family keyword
+.Dq Li inet6
+is needed for them:
+.Bl -tag -width indent
+.It Cm prefer_source
+Set a flag to prefer address as a candidate of the source address for
+outgoing packets.
+.It Cm -prefer_source
+Clear a flag
+.Cm prefer_source .
+.El
+.Pp
 The following parameters are specific to cloning
 IEEE 802.11 wireless interfaces with the
 .Cm create

Modified: stable/10/sys/netinet6/in6_src.c
==============================================================================
--- stable/10/sys/netinet6/in6_src.c	Thu Oct  9 02:30:38 2014	(r272789)
+++ stable/10/sys/netinet6/in6_src.c	Thu Oct  9 02:49:33 2014	(r272790)
@@ -451,6 +451,16 @@ in6_selectsrc(struct sockaddr_in6 *dstso
 			NEXT(9);
 
 		/*
+		 * Rule 10: prefer address with `prefer_source' flag.
+		 */
+		if ((ia_best->ia6_flags & IN6_IFF_PREFER_SOURCE) == 0 &&
+		    (ia->ia6_flags & IN6_IFF_PREFER_SOURCE) != 0)
+			REPLACE(10);
+		if ((ia_best->ia6_flags & IN6_IFF_PREFER_SOURCE) != 0 &&
+		    (ia->ia6_flags & IN6_IFF_PREFER_SOURCE) == 0)
+			NEXT(10);
+
+		/*
 		 * Rule 14: Use longest matching prefix.
 		 * Note: in the address selection draft, this rule is
 		 * documented as "Rule 8".  However, since it is also

Modified: stable/10/sys/netinet6/in6_var.h
==============================================================================
--- stable/10/sys/netinet6/in6_var.h	Thu Oct  9 02:30:38 2014	(r272789)
+++ stable/10/sys/netinet6/in6_var.h	Thu Oct  9 02:49:33 2014	(r272790)
@@ -503,6 +503,7 @@ struct	in6_rrenumreq {
 					 */
 #define IN6_IFF_AUTOCONF	0x40	/* autoconfigurable address. */
 #define IN6_IFF_TEMPORARY	0x80	/* temporary (anonymous) address. */
+#define	IN6_IFF_PREFER_SOURCE	0x0100	/* preferred address for SAS */
 #define IN6_IFF_NOPFX		0x8000	/* skip kernel prefix management.
 					 * XXX: this should be temporary.
 					 */

Modified: stable/10/usr.bin/netstat/inet6.c
==============================================================================
--- stable/10/usr.bin/netstat/inet6.c	Thu Oct  9 02:30:38 2014	(r272789)
+++ stable/10/usr.bin/netstat/inet6.c	Thu Oct  9 02:49:33 2014	(r272790)
@@ -346,7 +346,7 @@ static const char *srcrule_str[] = {
 	"public/temporary address",
 	"alive interface",
 	"better virtual status",
-	"rule #10",
+	"preferred source",
 	"rule #11",
 	"rule #12",
 	"rule #13",



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