The argument to setsockopt for IP_MULTICAST_LOOP depends on operating
system and is decided upon by configure and could be an u_int or a u_char. For FreeBSD it is a u_char. For IPv6 however RFC 3493, 5.2 defines the argument to IPV6_MULTICAST_LOOP to be an unsigned integer so make sure we always use that using a second variable for the IPV6 case. This is to get rid of these error messages every 5 minutes on some systems: ntpd[1530]: setsockopt IPV6_MULTICAST_LOOP failure: Invalid argument on socket 22, addr fe80::... for multicast address ff02::101 While here also fix the copy&paste error in the log message for IPV6_MULTICAST_LOOP. Reviewed by: roberto Sponsored by: The FreeBSD Foundation Sponsored by: iXsystems MFC after: 10 days Filed as: Bug 1936 on ntp.org
This commit is contained in:
parent
d7fa164fc4
commit
5cb7c50357
@ -1753,7 +1753,12 @@ void
|
||||
enable_multicast_if(struct interface *iface, struct sockaddr_storage *maddr)
|
||||
{
|
||||
#ifdef MCAST
|
||||
#ifdef IP_MULTICAST_LOOP
|
||||
/*u_char*/ TYPEOF_IP_MULTICAST_LOOP off = 0;
|
||||
#endif
|
||||
#ifdef IPV6_MULTICAST_LOOP
|
||||
u_int off6 = 0; /* RFC 3493, 5.2. defines type unsigned int */
|
||||
#endif
|
||||
|
||||
switch (maddr->ss_family)
|
||||
{
|
||||
@ -1797,9 +1802,9 @@ enable_multicast_if(struct interface *iface, struct sockaddr_storage *maddr)
|
||||
* Don't send back to itself, but allow it to fail to set it
|
||||
*/
|
||||
if (setsockopt(iface->fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP,
|
||||
(char *) &off, sizeof(off)) == -1) {
|
||||
(char *) &off6, sizeof(off6)) == -1) {
|
||||
netsyslog(LOG_ERR,
|
||||
"setsockopt IP_MULTICAST_LOOP failure: %m on socket %d, addr %s for multicast address %s",
|
||||
"setsockopt IPV6_MULTICAST_LOOP failure: %m on socket %d, addr %s for multicast address %s",
|
||||
iface->fd, stoa(&iface->sin), stoa(maddr));
|
||||
}
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user