break;
case AF_INET6:
#ifdef __KAME__
- if (IN6_IS_ADDR_MC_LINKLOCAL( &((struct sockaddr_in6 *)src)->sin6_addr)) {
+ if (IN6_IS_ADDR_LINKLOCAL( &((struct sockaddr_in6 *)src)->sin6_addr)
+ && ((struct sockaddr_in6 *)src)->sin6_scope_id == 0) {
u_int8_t *p;
p = &((struct sockaddr_in6 *)src)->sin6_addr.s6_addr[0];
scopeid = ((u_int16_t)p[2] << 8) | p[3];
} else
+#ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID
+ scopeid = ((struct sockaddr_in6 *)src)->sin6_scope_id;
+#else
scopeid = 0;
+#endif
#else
#ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID
scopeid = ((struct sockaddr_in6 *)src)->sin6_scope_id;
&(isc_if->address.type.in6),
sizeof(struct in6_addr));
((struct sockaddr_in6 *)&itf->sin)->sin6_port = port;
+ ((struct sockaddr_in6 *)&itf->sin)->sin6_scope_id = isc_if->scopeid;
itf->mask.ss_family = itf->sin.ss_family;
memcpy(&(((struct sockaddr_in6 *)&itf->mask)->sin6_addr),
mreq6.ipv6mr_multiaddr = iaddr6;
#ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID
if (IN6_IS_ADDR_MC_LINKLOCAL(&iaddr6))
- mreq6.ipv6mr_interface = iface->scopeid;
+ mreq6.ipv6mr_interface = ((struct sockaddr_in6*)maddr)->sin6_scope_id;
else
#endif
mreq6.ipv6mr_interface = 0;
mreq6.ipv6mr_multiaddr = iaddr6;
#ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID
if (IN6_IS_ADDR_MC_LINKLOCAL(&iaddr6))
- mreq6.ipv6mr_interface = iface->scopeid;
+ mreq6.ipv6mr_interface = ((struct sockaddr_in6*)maddr)->sin6_scope_id;
else
#endif
mreq6.ipv6mr_interface = 0;