Module Name:    src
Committed By:   roy
Date:           Wed Dec  6 14:17:42 UTC 2017

Modified Files:
        src/sys/netinet6: in6_src.c

Log Message:
Treat unvalidated addresses as deprecated in rule 3.


To generate a diff of this commit:
cvs rdiff -u -r1.83 -r1.84 src/sys/netinet6/in6_src.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/netinet6/in6_src.c
diff -u src/sys/netinet6/in6_src.c:1.83 src/sys/netinet6/in6_src.c:1.84
--- src/sys/netinet6/in6_src.c:1.83	Fri Nov 24 14:03:25 2017
+++ src/sys/netinet6/in6_src.c	Wed Dec  6 14:17:42 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: in6_src.c,v 1.83 2017/11/24 14:03:25 roy Exp $	*/
+/*	$NetBSD: in6_src.c,v 1.84 2017/12/06 14:17:42 roy Exp $	*/
 /*	$KAME: in6_src.c,v 1.159 2005/10/19 01:40:32 t-momose Exp $	*/
 
 /*
@@ -66,7 +66,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in6_src.c,v 1.83 2017/11/24 14:03:25 roy Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in6_src.c,v 1.84 2017/12/06 14:17:42 roy Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -135,6 +135,9 @@ static int walk_addrsel_policy(int (*)(s
 static int dump_addrsel_policyent(struct in6_addrpolicy *, void *);
 static struct in6_addrpolicy *match_addrsel_policy(struct sockaddr_in6 *);
 
+#define	IFA6_IS_VALIDATED(ia) \
+	(((ia)->ia6_flags & (IN6_IFF_TENTATIVE | IN6_IFF_DETACHED)) == 0)
+
 /*
  * Return an IPv6 address, which is the most appropriate for a given
  * destination and user specified options.
@@ -219,12 +222,6 @@ in6_select_best_ia(struct sockaddr_in6 *
 		/* avoid unusable addresses */
 		if ((ia->ia6_flags & (IN6_IFF_DUPLICATED | IN6_IFF_ANYCAST)))
 			continue;
-		/* Prefer validated addresses */
-		if (!(ia->ia6_flags & (IN6_IFF_TENTATIVE | IN6_IFF_DETACHED)) &&
-		    ia_best != NULL &&
-		    ia_best->ia6_flags & (IN6_IFF_TENTATIVE | IN6_IFF_DETACHED))
-			REPLACE(0);
-
 		if (!ip6_use_deprecated && IFA6_IS_DEPRECATED(ia))
 			continue;
 
@@ -261,7 +258,12 @@ in6_select_best_ia(struct sockaddr_in6 *
 		/*
 		 * Rule 3: Avoid deprecated addresses.  Note that the case of
 		 * !ip6_use_deprecated is already rejected above.
+		 * Treat unvalidated addresses as deprecated here.
 		 */
+		if (IFA6_IS_VALIDATED(ia_best) && !IFA6_IS_VALIDATED(ia))
+			NEXT(3);
+		if (!IFA6_IS_VALIDATED(ia_best) && IFA6_IS_VALIDATED(ia))
+			REPLACE(3);
 		if (!IFA6_IS_DEPRECATED(ia_best) && IFA6_IS_DEPRECATED(ia))
 			NEXT(3);
 		if (IFA6_IS_DEPRECATED(ia_best) && !IFA6_IS_DEPRECATED(ia))

Reply via email to