From: Danny Mayer Date: Wed, 4 Aug 2004 22:10:22 +0000 (-0400) Subject: Fixes for scope ID X-Git-Tag: NTP_4_2_3~142 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=97669a3cf40e055cb1c5572967e0357fed8a1ee2;p=thirdparty%2Fntp.git Fixes for scope ID bk: 41115eceXiKUwHhHfw_4UDD4DWgsMQ --- diff --git a/libisc/interfaceiter.c b/libisc/interfaceiter.c index b2870b4e1f..2bb25d6d95 100644 --- a/libisc/interfaceiter.c +++ b/libisc/interfaceiter.c @@ -106,12 +106,17 @@ get_scopeid(unsigned int family, struct sockaddr *src) { 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; diff --git a/ntpd/ntp_io.c b/ntpd/ntp_io.c index dc454e2d0f..4e9c37fb93 100644 --- a/ntpd/ntp_io.c +++ b/ntpd/ntp_io.c @@ -396,6 +396,7 @@ convert_isc_if(isc_interface_t *isc_if, struct interface *itf, u_short port) { &(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), @@ -740,7 +741,7 @@ socket_multicast_enable(struct interface *iface, int ind, struct sockaddr_storag 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; @@ -805,7 +806,7 @@ socket_multicast_disable(struct interface *iface, int ind, struct sockaddr_stora 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;