svn commit: r258730 - user/ae/inet6/sys/net
Andrey V. Elsukov
ae at FreeBSD.org
Fri Nov 29 04:29:02 UTC 2013
Author: ae
Date: Fri Nov 29 04:29:01 2013
New Revision: 258730
URL: http://svnweb.freebsd.org/changeset/base/258730
Log:
When we are trying to find ifaddr for the specific network, and this
network has link-local scope, use its sin6_scope_id to determine
corresponding ifnet. Then just take its first link-local address.
This helps to go away from the embedded form of LLA.
Modified:
user/ae/inet6/sys/net/if.c
Modified: user/ae/inet6/sys/net/if.c
==============================================================================
--- user/ae/inet6/sys/net/if.c Fri Nov 29 04:18:36 2013 (r258729)
+++ user/ae/inet6/sys/net/if.c Fri Nov 29 04:29:01 2013 (r258730)
@@ -84,6 +84,7 @@
#ifdef INET6
#include <netinet6/in6_var.h>
#include <netinet6/in6_ifattach.h>
+#include <netinet6/scope6_var.h>
#endif /* INET6 */
#endif /* INET || INET6 */
@@ -1703,7 +1704,20 @@ ifa_ifwithnet(struct sockaddr *addr, int
if (sdl->sdl_index && sdl->sdl_index <= V_if_index)
return (ifaddr_byindex(sdl->sdl_index));
}
+#ifdef INET6
+ if (af == AF_INET6) {
+ struct sockaddr_in6 *sin6;
+ sin6 = (struct sockaddr_in6 *)addr;
+ if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr) &&
+ sin6->sin6_scope_id != 0) {
+ ifp = in6_getlinkifnet(sin6->sin6_scope_id);
+ if (ifp != NULL)
+ return ((struct ifaddr *)
+ in6ifa_ifpforlinklocal(ifp, 0));
+ }
+ }
+#endif
/*
* Scan though each interface, looking for ones that have addresses
* in this address family. Maintain a reference on ifa_maybe once
More information about the svn-src-user
mailing list