diff -up ntp-4.2.6p5/ntpd/ntp_io.c.mcastjoin ntp-4.2.6p5/ntpd/ntp_io.c --- ntp-4.2.6p5/ntpd/ntp_io.c.mcastjoin 2015-04-13 14:41:59.108323479 +0200 +++ ntp-4.2.6p5/ntpd/ntp_io.c 2015-04-13 14:43:46.468637433 +0200 @@ -2038,6 +2038,32 @@ update_interfaces( if (sys_bclient) io_setbclient(); + /* + * Check multicast interfaces and try to join multicast groups if + * not joined yet. + */ + for (ep = ep_list; ep != NULL; ep = ep->elink) { + remaddr_t *entry; + + if (!(INT_MCASTIF & ep->flags) || (INT_MCASTOPEN & ep->flags)) + continue; + + /* Find remote address that was linked to this interface */ + for (entry = remoteaddr_list; + entry != NULL; + entry = entry->link) { + if (entry->ep == ep) { + if (socket_multicast_enable(ep, &entry->addr)) { + msyslog(LOG_INFO, + "Joined %s socket to multicast group %s", + stoa(&ep->sin), + stoa(&entry->addr)); + } + break; + } + } + } + return new_interface_found; } @@ -2467,12 +2493,12 @@ socket_multicast_enable( IP_ADD_MEMBERSHIP, (char *)&mreq, sizeof(mreq))) { - msyslog(LOG_ERR, + DPRINTF(2, ( "setsockopt IP_ADD_MEMBERSHIP failed: %m on socket %d, addr %s for %x / %x (%s)", iface->fd, stoa(&iface->sin), mreq.imr_multiaddr.s_addr, mreq.imr_interface.s_addr, - stoa(maddr)); + stoa(maddr))); return ISC_FALSE; } DPRINTF(4, ("Added IPv4 multicast membership on socket %d, addr %s for %x / %x (%s)\n", @@ -2497,10 +2523,10 @@ socket_multicast_enable( if (setsockopt(iface->fd, IPPROTO_IPV6, IPV6_JOIN_GROUP, (char *)&mreq6, sizeof(mreq6))) { - msyslog(LOG_ERR, + DPRINTF(2, ( "setsockopt IPV6_JOIN_GROUP failed: %m on socket %d, addr %s for interface %u (%s)", iface->fd, stoa(&iface->sin), - mreq6.ipv6mr_interface, stoa(maddr)); + mreq6.ipv6mr_interface, stoa(maddr))); return ISC_FALSE; } DPRINTF(4, ("Added IPv6 multicast group on socket %d, addr %s for interface %u (%s)\n", @@ -2793,11 +2819,6 @@ io_multicast_add( "Joined %s socket to multicast group %s", stoa(&ep->sin), stoa(addr)); - else - msyslog(LOG_ERR, - "Failed to join %s socket to multicast group %s", - stoa(&ep->sin), - stoa(addr)); } add_addr_to_list(addr, one_ep);