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.

Obtained from:	Yandex LLC
MFC after:	1 month
Sponsored by:	Yandex LLC
This commit is contained in:
Andrey V. Elsukov 2014-09-09 10:52:50 +00:00
parent 141aa3b93a
commit 5dbfa43f65
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=271307
5 changed files with 30 additions and 2 deletions

View File

@ -254,6 +254,8 @@ in6_status(int s __unused, const struct ifaddrs *ifa)
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),

View File

@ -28,7 +28,7 @@
.\" From: @(#)ifconfig.8 8.3 (Berkeley) 1/5/94
.\" $FreeBSD$
.\"
.Dd June 5, 2014
.Dd September 9, 2014
.Dt IFCONFIG 8
.Os
.Sh NAME
@ -689,6 +689,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

View File

@ -451,6 +451,16 @@ in6_selectsrc(struct sockaddr_in6 *dstsock, struct ip6_pktopts *opts,
if (ifa_preferred(&ia->ia_ifa, &ia_best->ia_ifa))
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

View File

@ -498,6 +498,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.
*/

View File

@ -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",