|
|
|
Index: ntpd/ntp_io.c
|
|
|
|
--- ntpd/ntp_io.c.orig 2009-12-09 08:36:37 +0100
|
|
|
|
+++ ntpd/ntp_io.c 2010-01-05 23:39:27 +0100
|
|
|
|
@@ -64,6 +64,14 @@
|
|
|
|
#define SETSOCKOPT_ARG_CAST
|
|
|
|
#endif
|
|
|
|
|
|
|
|
+#ifdef INCLUDE_IPV6_SUPPORT
|
|
|
|
+#include <netinet/in.h>
|
|
|
|
+#ifdef __FreeBSD__
|
|
|
|
+#include <net/if_var.h>
|
|
|
|
+#include <netinet/in_var.h>
|
|
|
|
+#endif
|
|
|
|
+#endif /* !INCLUDE_IPV6_SUPPORT */
|
|
|
|
+
|
|
|
|
extern int listen_to_virtual_ips;
|
|
|
|
|
|
|
|
/*
|
|
|
|
@@ -1470,6 +1478,36 @@
|
|
|
|
}
|
|
|
|
#endif /* OS_NEEDS_REUSEADDR_FOR_IFADDRBIND */
|
|
|
|
|
|
|
|
+#ifdef INCLUDE_IPV6_SUPPORT
|
|
|
|
+static isc_boolean_t
|
|
|
|
+is_anycast(struct sockaddr *sa, char *name)
|
|
|
|
+{
|
|
|
|
+#if defined(SIOCGIFAFLAG_IN6) && defined(IN6_IFF_ANYCAST)
|
|
|
|
+ struct in6_ifreq ifr6;
|
|
|
|
+ int fd;
|
|
|
|
+ u_int32_t flags6;
|
|
|
|
+
|
|
|
|
+ if (sa->sa_family != AF_INET6)
|
|
|
|
+ return ISC_FALSE;
|
|
|
|
+ if ((fd = socket(AF_INET6, SOCK_DGRAM, 0)) < 0)
|
|
|
|
+ return ISC_FALSE;
|
|
|
|
+ memset(&ifr6, 0, sizeof(ifr6));
|
|
|
|
+ memcpy(&ifr6.ifr_addr, (struct sockaddr_in6 *)sa,
|
|
|
|
+ sizeof(struct sockaddr_in6));
|
|
|
|
+ strlcpy(ifr6.ifr_name, name, IF_NAMESIZE);
|
|
|
|
+ if (ioctl(fd, SIOCGIFAFLAG_IN6, &ifr6) < 0) {
|
|
|
|
+ close(fd);
|
|
|
|
+ return ISC_FALSE;
|
|
|
|
+ }
|
|
|
|
+ close(fd);
|
|
|
|
+ flags6 = ifr6.ifr_ifru.ifru_flags6;
|
|
|
|
+ if ((flags6 & IN6_IFF_ANYCAST) != 0)
|
|
|
|
+ return ISC_TRUE;
|
|
|
|
+#endif /* !SIOCGIFAFLAG_IN6 || !IN6_IFF_ANYCAST */
|
|
|
|
+ return ISC_FALSE;
|
|
|
|
+}
|
|
|
|
+#endif /* !INCLUDE_IPV6_SUPPORT */
|
|
|
|
+
|
|
|
|
/*
|
|
|
|
* update_interface strategy
|
|
|
|
*
|
|
|
|
@@ -1592,6 +1630,11 @@
|
|
|
|
if (is_wildcard_addr(&interface.sin))
|
|
|
|
continue;
|
|
|
|
|
|
|
|
+#ifdef INCLUDE_IPV6_SUPPORT
|
|
|
|
+ if (is_anycast((struct sockaddr *)&interface.sin, isc_if.name))
|
|
|
|
+ continue;
|
|
|
|
+#endif /* !INCLUDE_IPV6_SUPPORT */
|
|
|
|
+
|
|
|
|
/*
|
|
|
|
* map to local *address* in order to map all duplicate
|
|
|
|
* interfaces to an interface structure with the
|