ep->notsent,
current_time - ep->starttime);
close_and_delete_fd_from_list(ep->fd);
+ ep->fd = INVALID_SOCKET;
}
if (ep->bfd != INVALID_SOCKET) {
msyslog(LOG_INFO,
- "Deleting broadcast address %s#%d from interface #%d %s",
- stoa(&ep->bcast), SRCPORT(&ep->bcast),
- ep->ifnum, ep->name);
+ "stop listening for broadcasts to %s on interface #%d %s",
+ stoa(&ep->bcast), ep->ifnum, ep->name);
close_and_delete_fd_from_list(ep->bfd);
+ ep->bfd = INVALID_SOCKET;
+ ep->flags &= ~INT_BCASTOPEN;
}
ninterfaces--;
{
#ifdef OS_MISSES_SPECIFIC_ROUTE_UPDATES
if (interface->fd != INVALID_SOCKET) {
+ int bcast = (interface->flags & INT_BCASTXMIT) != 0;
+ /* as we forcibly close() the socket remove the
+ broadcast permission indication */
+ if (bcast)
+ socket_broadcast_disable(interface, &interface->sin);
+
close_and_delete_fd_from_list(interface->fd);
+
+ /* create new socket picking up a new first hop binding
+ at connect() time */
interface->fd = open_socket(&interface->sin,
- 0, 0, interface);
+ bcast, 0, interface);
/*
* reset TTL indication so TTL is is set again
* next time around
/*
* phase 3 - re-configure as the world has changed if necessary
*/
+
+ if (broadcast_client_enabled)
+ io_setbclient();
+
if (refresh_peers) {
refresh_all_peerinterfaces();
msyslog(LOG_INFO, "peers refreshed");
DPRINTF(2, ("Broadcast enabled on socket %d for address %s\n",
fd, stoa(baddr)));
}
- iface->flags |= INT_BCASTOPEN;
- broadcast_client_enabled = ISC_TRUE;
+ iface->flags |= INT_BCASTXMIT;
return ISC_TRUE;
#else
return ISC_FALSE;
"setsockopt(SO_BROADCAST) disable failure on address %s: %m",
stoa(baddr));
- iface->flags &= ~INT_BCASTOPEN;
- broadcast_client_enabled = ISC_FALSE;
+ iface->flags &= ~INT_BCASTXMIT;
return ISC_TRUE;
#else
return ISC_FALSE;
#ifdef OPEN_BCAST_SOCKET
struct interface * interf;
int nif;
- isc_boolean_t jstatus;
- SOCKET fd;
- u_int32 prev_refid;
nif = 0;
set_reuseaddr(1);
* broadcast on the interface address
*/
if (interf->bfd != INVALID_SOCKET) {
- fd = interf->bfd;
- jstatus = ISC_TRUE;
- } else {
- fd = interf->fd;
- jstatus = socket_broadcast_enable(interf, fd,
- &interf->sin);
- }
-
- /* Enable Broadcast on socket */
- if (jstatus) {
nif++;
+ interf->flags |= INT_BCASTOPEN;
msyslog(LOG_INFO,
- "io_setbclient: Opened broadcast client on interface #%d %s",
- interf->ifnum, interf->name);
- /* hart suspects this is unneeded, verify */
- prev_refid = interf->addr_refid;
- interf->addr_refid = addr2refid(&interf->sin);
- if (prev_refid != interf->addr_refid)
- msyslog(LOG_NOTICE,
- "io_setbclient: code is not dead, addr_refid for %s updated %8.8x -> %8.8x, please email hart@ntp.org to remove this message",
- stoa(&interf->sin), prev_refid,
- interf->addr_refid);
+ "Listen for broadcasts to %s on interface #%d %s",
+ stoa(&interf->bcast), interf->ifnum, interf->name);
+ } else {
+ /* silently ignore EADDRINUSE as we probably opened
+ the socket already for an address in the same network */
+ if (errno != EADDRINUSE)
+ msyslog(LOG_INFO,
+ "failed to listen for broadcasts to %s on interface #%d %s",
+ stoa(&interf->bcast), interf->ifnum, interf->name);
}
}
set_reuseaddr(0);
- if (nif > 0)
- DPRINTF(1, ("io_setbclient: Opened broadcast clients\n"));
- else if (!nif)
+ if (nif > 0) {
+ broadcast_client_enabled = ISC_TRUE;
+ DPRINTF(1, ("io_setbclient: listening to %d broadcast addresses\n", nif));
+ }
+ else if (!nif) {
+ broadcast_client_enabled = ISC_FALSE;
msyslog(LOG_ERR,
"Unable to listen for broadcasts, no broadcast interfaces available");
+ }
#else
msyslog(LOG_ERR,
"io_setbclient: Broadcast Client disabled by build");
continue;
if (!(INT_BCASTOPEN & ep->flags))
continue;
- socket_broadcast_disable(ep, &ep->sin);
+
+ if (ep->bfd != INVALID_SOCKET) {
+ /* destroy broadcast listening socket */
+ msyslog(LOG_INFO,
+ "stop listening for broadcasts to %s on interface #%d %s",
+ stoa(&ep->bcast), ep->ifnum, ep->name);
+ close_and_delete_fd_from_list(ep->bfd);
+ ep->bfd = INVALID_SOCKET;
+ ep->flags &= ~INT_BCASTOPEN;
+ }
}
+ broadcast_client_enabled = ISC_FALSE;
}
/*