Use embedded scope zone id to determine outgoing interface for link-local

and node-local addresses.
This commit is contained in:
Andrey V. Elsukov 2014-11-09 22:54:40 +00:00
parent fb5780def8
commit ea455de91d
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=274334

View File

@ -555,6 +555,7 @@ selectroute(struct sockaddr_in6 *dstsock, struct ip6_pktopts *opts,
struct sockaddr_in6 *sin6_next;
struct in6_pktinfo *pi = NULL;
struct in6_addr *dst = &dstsock->sin6_addr;
uint32_t zoneid;
#if 0
char ip6buf[INET6_ADDRSTRLEN];
@ -585,7 +586,18 @@ selectroute(struct sockaddr_in6 *dstsock, struct ip6_pktopts *opts,
} else
goto getroute;
}
/*
* If destination address is LLA or link- or node-local multicast,
* use it's embedded scope zone id to determine outgoing interface.
*/
if (IN6_IS_SCOPE_LINKLOCAL(dst) ||
IN6_IS_ADDR_MC_NODELOCAL(dst)) {
zoneid = ntohs(in6_getscope(dst));
if (zoneid > 0) {
ifp = in6_getlinkifnet(zoneid);
goto done;
}
}
/*
* If the destination address is a multicast address and the outgoing
* interface for the address is specified by the caller, use it.