Module Name: src Committed By: christos Date: Sun Sep 17 17:35:10 UTC 2017
Modified Files: src/sys/netinet6: in6_src.c Log Message: Skip the scope test for loopback addresses in non-loopback interfaces. While this test is also done in in6_setscope, testing here allows us to log an error for other callers. To generate a diff of this commit: cvs rdiff -u -r1.80 -r1.81 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.80 src/sys/netinet6/in6_src.c:1.81 --- src/sys/netinet6/in6_src.c:1.80 Sun Aug 27 08:34:21 2017 +++ src/sys/netinet6/in6_src.c Sun Sep 17 13:35:10 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: in6_src.c,v 1.80 2017/08/27 12:34:21 christos Exp $ */ +/* $NetBSD: in6_src.c,v 1.81 2017/09/17 17:35:10 christos 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.80 2017/08/27 12:34:21 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: in6_src.c,v 1.81 2017/09/17 17:35:10 christos Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -204,6 +204,12 @@ in6_select_best_ia(struct sockaddr_in6 * continue; } src = ia->ia_addr.sin6_addr; + + /* Skip the scope test in impossible cases */ + if (!(ifp->if_flags & IFF_LOOPBACK) && + IN6_IS_ADDR_LOOPBACK(&src)) + continue; + if (in6_setscope(&src, ifp, &osrczone) || in6_setscope(&src, ifp1, &srczone) || osrczone != srczone) { @@ -614,11 +620,11 @@ in6_selectroute(struct sockaddr_in6 *dst dstsock->sin6_addr.s6_addr32[1] == 0 && !IN6_IS_ADDR_LOOPBACK(&dstsock->sin6_addr)) { char ip6buf[INET6_ADDRSTRLEN]; - printf("in6_selectroute: strange destination %s\n", + printf("%s: strange destination %s\n", __func__, IN6_PRINT(ip6buf, &dstsock->sin6_addr)); } else { char ip6buf[INET6_ADDRSTRLEN]; - printf("in6_selectroute: destination = %s%%%d\n", + printf("%s: destination = %s%%%d\n", __func__, IN6_PRINT(ip6buf, &dstsock->sin6_addr), dstsock->sin6_scope_id); /* for debug */ }