svn commit: r257104 - user/ae/inet6/sys/netinet6
Andrey V. Elsukov
ae at FreeBSD.org
Fri Oct 25 06:15:24 UTC 2013
Author: ae
Date: Fri Oct 25 06:15:23 2013
New Revision: 257104
URL: http://svnweb.freebsd.org/changeset/base/257104
Log:
Don't do route lookup for link-local addresses.
Modified:
user/ae/inet6/sys/netinet6/in6.c
Modified: user/ae/inet6/sys/netinet6/in6.c
==============================================================================
--- user/ae/inet6/sys/netinet6/in6.c Fri Oct 25 06:11:12 2013 (r257103)
+++ user/ae/inet6/sys/netinet6/in6.c Fri Oct 25 06:15:23 2013 (r257104)
@@ -2381,16 +2381,17 @@ in6_lltable_prefix_free(struct lltable *
}
static int
-in6_lltable_rtcheck(struct ifnet *ifp,
- u_int flags,
- const struct sockaddr *l3addr)
+in6_lltable_rtcheck(struct ifnet *ifp, u_int flags,
+ const struct sockaddr_in6 *l3addr)
{
struct rtentry *rt;
char ip6buf[INET6_ADDRSTRLEN];
- KASSERT(l3addr->sa_family == AF_INET6,
- ("sin_family %d", l3addr->sa_family));
+ KASSERT(l3addr->sin6_family == AF_INET6,
+ ("sin_family %d", l3addr->sin6_family));
+ if (IN6_IS_ADDR_LINKLOCAL(&l3addr->sin6_addr))
+ return (0);
/* Our local addresses are always only installed on the default FIB. */
/* XXX rtalloc1 should take a const param */
rt = in6_rtalloc1(__DECONST(struct sockaddr *, l3addr), 0, 0,
@@ -2410,7 +2411,7 @@ in6_lltable_rtcheck(struct ifnet *ifp,
return 0;
}
log(LOG_INFO, "IPv6 address: \"%s\" is not on the network\n",
- ip6_sprintf(ip6buf, &((const struct sockaddr_in6 *)l3addr)->sin6_addr));
+ ip6_sprintf(ip6buf, &l3addr->sin6_addr));
if (rt != NULL)
RTFREE_LOCKED(rt);
return EINVAL;
@@ -2453,7 +2454,7 @@ in6_lltable_lookup(struct lltable *llt,
* verify this.
*/
if (!(flags & LLE_IFADDR) &&
- in6_lltable_rtcheck(ifp, flags, l3addr) != 0)
+ in6_lltable_rtcheck(ifp, flags, sin6) != 0)
return NULL;
lle = in6_lltable_new(l3addr, flags);
More information about the svn-src-user
mailing list