Index: ntpd/ntp_io.c
--- ntpd/ntp_io.c.orig	2009-12-09 08:36:37 +0100
+++ ntpd/ntp_io.c	2009-12-17 09:15:19 +0100
@@ -64,6 +64,12 @@
 #define SETSOCKOPT_ARG_CAST
 #endif
 
+#ifdef INCLUDE_IPV6_SUPPORT
+#include <netinet/in.h>
+#include <net/if_var.h>
+#include <netinet/in_var.h>
+#endif /* !INCLUDE_IPV6_SUPPORT */
+
 extern int listen_to_virtual_ips;
 
 /*
@@ -1470,6 +1476,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 +1628,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
