svn commit: r257022 - user/ae/inet6/sys/netinet6
Andrey V. Elsukov
ae at FreeBSD.org
Wed Oct 23 23:40:49 UTC 2013
Author: ae
Date: Wed Oct 23 23:40:49 2013
New Revision: 257022
URL: http://svnweb.freebsd.org/changeset/base/257022
Log:
Scope related cleanup in nd6_is_new_addr_neighbor():
* since we assume that addresses doesn't contains embedded zone ids,
link-local addresses are always neighbors. So, remove
sa6_recoverscope() and in6_setscope() calls;
* use in6_localip() to check that address matches one of our addresses;
* use in6ifa_ifpwithdstaddr() instead of ifa_ifwithdstaddr().
Modified:
user/ae/inet6/sys/netinet6/nd6.c
Modified: user/ae/inet6/sys/netinet6/nd6.c
==============================================================================
--- user/ae/inet6/sys/netinet6/nd6.c Wed Oct 23 23:21:11 2013 (r257021)
+++ user/ae/inet6/sys/netinet6/nd6.c Wed Oct 23 23:40:49 2013 (r257022)
@@ -874,34 +874,20 @@ static int
nd6_is_new_addr_neighbor(struct sockaddr_in6 *addr, struct ifnet *ifp)
{
struct nd_prefix *pr;
- struct ifaddr *dstaddr;
+ struct in6_ifaddr *ia6;
/*
* A link-local address is always a neighbor.
- * XXX: a link does not necessarily specify a single interface.
*/
- if (IN6_IS_ADDR_LINKLOCAL(&addr->sin6_addr)) {
- struct sockaddr_in6 sin6_copy;
- u_int32_t zone;
-
- /*
- * We need sin6_copy since sa6_recoverscope() may modify the
- * content (XXX).
- */
- sin6_copy = *addr;
- if (sa6_recoverscope(&sin6_copy))
- return (0); /* XXX: should be impossible */
- if (in6_setscope(&sin6_copy.sin6_addr, ifp, &zone))
- return (0);
- if (sin6_copy.sin6_scope_id == zone)
- return (1);
- else
- return (0);
- }
-
+ if (IN6_IS_ADDR_LINKLOCAL(&addr->sin6_addr))
+ return (1);
/*
* If the address matches one of our addresses,
* it should be a neighbor.
+ */
+ if (in6_localip(&addr->sin6_addr))
+ return (1);
+ /*
* If the address matches one of our on-link prefixes, it should be a
* neighbor.
*/
@@ -944,13 +930,10 @@ nd6_is_new_addr_neighbor(struct sockaddr
* If the address is assigned on the node of the other side of
* a p2p interface, the address should be a neighbor.
*/
- dstaddr = ifa_ifwithdstaddr((struct sockaddr *)addr);
- if (dstaddr != NULL) {
- if (dstaddr->ifa_ifp == ifp) {
- ifa_free(dstaddr);
- return (1);
- }
- ifa_free(dstaddr);
+ ia6 = in6ifa_ifpwithdstaddr(ifp, &addr->sin6_addr);
+ if (ia6 != NULL) {
+ ifa_free(&ia6->ia_ifa);
+ return (1);
}
/*
More information about the svn-src-user
mailing list