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))