summaryrefslogtreecommitdiffstats
path: root/contrib/ntp
diff options
context:
space:
mode:
authorume <ume@FreeBSD.org>2009-12-15 15:01:52 +0000
committerume <ume@FreeBSD.org>2009-12-15 15:01:52 +0000
commit1dc2e89eaf4813007ad1e8cc90bef6725e56e421 (patch)
treebe6dccbdaf88b1ef3493726cbb4b58788915000f /contrib/ntp
parentd4e374306e888f9cef137fb98bb4823eca3f8297 (diff)
downloadFreeBSD-src-1dc2e89eaf4813007ad1e8cc90bef6725e56e421.zip
FreeBSD-src-1dc2e89eaf4813007ad1e8cc90bef6725e56e421.tar.gz
MFC r199995:
Don't try to bind to an anycast address. The KAME IPv6 stack doesn't allow bind to an anycast address. It does away with an annoying message.
Diffstat (limited to 'contrib/ntp')
-rw-r--r--contrib/ntp/ntpd/ntp_io.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/contrib/ntp/ntpd/ntp_io.c b/contrib/ntp/ntpd/ntp_io.c
index faa4646..d3e909d 100644
--- a/contrib/ntp/ntpd/ntp_io.c
+++ b/contrib/ntp/ntpd/ntp_io.c
@@ -65,6 +65,12 @@
#endif /* IPV6 Multicast Support */
#endif /* IPv6 Support */
+#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;
extern const char *specific_interface;
@@ -1137,6 +1143,36 @@ set_wildcard_reuse(int family, int on)
}
#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
*
@@ -1276,6 +1312,11 @@ update_interfaces(
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
OpenPOWER on IntegriCloud