]> git.ipfire.org Git - thirdparty/ntp.git/commitdiff
Fixes for scope ID
authorDanny Mayer <mayer@ntp.org>
Wed, 4 Aug 2004 22:10:22 +0000 (18:10 -0400)
committerDanny Mayer <mayer@ntp.org>
Wed, 4 Aug 2004 22:10:22 +0000 (18:10 -0400)
bk: 41115eceXiKUwHhHfw_4UDD4DWgsMQ

libisc/interfaceiter.c
ntpd/ntp_io.c

index b2870b4e1fe7c71d4be9bbb1f9f0ba5cde77f5e1..2bb25d6d95f01a8a332bcd93ea2c630723ce3064 100644 (file)
@@ -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;
index dc454e2d0f4b881509969681a5e35fd5895d3743..4e9c37fb939ebf9ce549405a15a4d37d5ee96f4d 100644 (file)
@@ -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;