diff options
author | ume <ume@FreeBSD.org> | 2009-12-15 15:01:52 +0000 |
---|---|---|
committer | ume <ume@FreeBSD.org> | 2009-12-15 15:01:52 +0000 |
commit | 1dc2e89eaf4813007ad1e8cc90bef6725e56e421 (patch) | |
tree | be6dccbdaf88b1ef3493726cbb4b58788915000f /contrib/ntp | |
parent | d4e374306e888f9cef137fb98bb4823eca3f8297 (diff) | |
download | FreeBSD-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.c | 41 |
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 |