From: Dave Hart Date: Tue, 8 Jun 2010 13:15:32 +0000 (+0000) Subject: [Bug 715] libisc Linux IPv6 interface iteration drops multicast flags. X-Git-Tag: NTP_4_2_6P2_RC6~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8192aba9abb93c48bd4574d02a8eb4c73b256798;p=thirdparty%2Fntp.git [Bug 715] libisc Linux IPv6 interface iteration drops multicast flags. bk: 4c0e4274Pcu01sWMa7syhkNo5W8jVA --- diff --git a/ChangeLog b/ChangeLog index 7fc156649..c69708cd2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +--- + +* [Bug 715] libisc Linux IPv6 interface iteration drops multicast flags. + --- (4.2.6p2-RC5) 2010/06/03 Released by Harlan Stenn diff --git a/lib/isc/unix/interfaceiter.c b/lib/isc/unix/interfaceiter.c index 4cfc82179..87af69e99 100644 --- a/lib/isc/unix/interfaceiter.c +++ b/lib/isc/unix/interfaceiter.c @@ -185,8 +185,10 @@ static isc_result_t linux_if_inet6_current(isc_interfaceiter_t *iter) { char address[33]; char name[IF_NAMESIZE+1]; + char strbuf[ISC_STRERRORSIZE]; struct in6_addr addr6; - int ifindex, prefix, flag3, flag4; + int ifindex, prefix, scope, flags; + struct ifreq ifreq; int res; unsigned int i; @@ -200,7 +202,7 @@ linux_if_inet6_current(isc_interfaceiter_t *iter) { } res = sscanf(iter->entry, "%32[a-f0-9] %x %x %x %x %16s\n", - address, &ifindex, &prefix, &flag3, &flag4, name); + address, &ifindex, &prefix, &scope, &flags, name); if (res != 6) { isc_log_write(isc_lctx, ISC_LOGCATEGORY_GENERAL, ISC_LOGMODULE_INTERFACE, ISC_LOG_ERROR, @@ -222,7 +224,34 @@ linux_if_inet6_current(isc_interfaceiter_t *iter) { addr6.s6_addr[i] = byte; } iter->current.af = AF_INET6; - iter->current.flags = INTERFACE_F_UP; + iter->current.flags = 0; + memset(&ifreq, 0, sizeof(ifreq)); + INSIST(sizeof(ifreq.ifr_name) <= sizeof(iter->current.name)); + strncpy(ifreq.ifr_name, name, sizeof(ifreq.ifr_name)); + + if (ioctl(iter->socket, SIOCGIFFLAGS, (char *) &ifreq) < 0) { + isc__strerror(errno, strbuf, sizeof(strbuf)); + UNEXPECTED_ERROR(__FILE__, __LINE__, + "%s: getting interface flags: %s", + ifreq.ifr_name, strbuf); + return (ISC_R_IGNORE); + } + + if ((ifreq.ifr_flags & IFF_UP) != 0) + iter->current.flags |= INTERFACE_F_UP; +#ifdef IFF_POINTOPOINT + if ((ifreq.ifr_flags & IFF_POINTOPOINT) != 0) + iter->current.flags |= INTERFACE_F_POINTTOPOINT; +#endif + if ((ifreq.ifr_flags & IFF_LOOPBACK) != 0) + iter->current.flags |= INTERFACE_F_LOOPBACK; + if ((ifreq.ifr_flags & IFF_BROADCAST) != 0) + iter->current.flags |= INTERFACE_F_BROADCAST; +#ifdef IFF_MULTICAST + if ((ifreq.ifr_flags & IFF_MULTICAST) != 0) + iter->current.flags |= INTERFACE_F_MULTICAST; +#endif + isc_netaddr_fromin6(&iter->current.address, &addr6); if (isc_netaddr_islinklocal(&iter->current.address)) { isc_netaddr_setzone(&iter->current.address,