diff options
Diffstat (limited to 'ntpd/ntp_io.c')
| -rw-r--r-- | ntpd/ntp_io.c | 58 |
1 files changed, 39 insertions, 19 deletions
diff --git a/ntpd/ntp_io.c b/ntpd/ntp_io.c index c0dcea598121..bb35ffd68511 100644 --- a/ntpd/ntp_io.c +++ b/ntpd/ntp_io.c @@ -2011,7 +2011,7 @@ update_interfaces( */ refresh_all_peerinterfaces(); - if (broadcast_client_enabled || sys_bclient) + if (sys_bclient) io_setbclient(); #ifdef MCAST @@ -2604,19 +2604,17 @@ io_setbclient(void) { #ifdef OPEN_BCAST_SOCKET endpt * ep; - unsigned int nif, ni4, ni6; + unsigned int nif, ni4; - nif = ni4 = ni6 = 0; + nif = ni4 = 0; set_reuseaddr(1); for (ep = ep_list; ep != NULL; ep = ep->elink) { - /* count IPv6 vs IPv4 interfaces. Needed later to decide + /* count IPv4 interfaces. Needed later to decide * if we should log an error or not. */ - switch (ep->family) { - case AF_INET : ++ni4; break; - case AF_INET6: ++ni6; break; - default : break; + if (AF_INET == ep->family) { + ++ni4; } if (ep->flags & (INT_WILDCARD | INT_LOOPBACK)) @@ -2696,7 +2694,7 @@ io_setbclient(void) * and no IPv4 interfaces at all. We suppress the error * log in that case... everything else should work! */ - if (ni4 && !ni6) { + if (ni4) { msyslog(LOG_ERR, "Unable to listen for broadcasts, no broadcast interfaces available"); } @@ -3240,7 +3238,8 @@ sendpkt( PKT_MODE(pkt->li_vn_mode), pkt->stratum, pkt->ppoll, pkt->precision, - pkt->rootdelay, pkt->rootdisp, pkt->refid, + FPTOD(NTOHS_FP(pkt->rootdelay)), + FPTOD(NTOHS_FP(pkt->rootdisp)), pkt->refid, len - MIN_V4_PKT_LEN, (u_char *)&pkt->exten); return; @@ -3403,7 +3402,7 @@ fetch_timestamp( nts.l_uf = (unsigned long)(ticks * (unsigned long)(sys_tick * FRAC)); } DPRINTF(4, ("fetch_timestamp: system bintime network time stamp: %ld.%09lu\n", - pbt.sec, (unsigned long)((nts.l_uf / FRAC) * 1e9))); + (long)pbt.sec, (u_long)((nts.l_uf / FRAC) * 1e9))); } break; #endif /* HAVE_BINTIME */ @@ -3444,7 +3443,7 @@ fetch_timestamp( break; #endif /* HAVE_TIMESTAMP */ } - fuzz = ntp_random() * 2. / FRAC * sys_fuzz; + fuzz = ntp_uurandom() * sys_fuzz; DTOLFP(fuzz, &lfpfuzz); L_ADD(&nts, &lfpfuzz); #ifdef DEBUG_TIMING @@ -4512,7 +4511,7 @@ kill_asyncio( /* - * Add and delete functions for the list of open sockets + * Add and delete functions for the list of input file descriptors */ static void add_fd_to_list( @@ -4702,14 +4701,16 @@ localaddrtoa( #ifdef HAS_ROUTING_SOCKET # ifndef UPDATE_GRACE -# define UPDATE_GRACE 2 /* wait UPDATE_GRACE seconds before scanning */ +# define UPDATE_GRACE 3 /* min. UPDATE_GRACE - 1 seconds before scanning */ # endif static void process_routing_msgs(struct asyncio_reader *reader) { - char buffer[5120]; - int cnt, msg_type; + static char * buffer; + static size_t buffsz = 8192; + int cnt, new, msg_type; + socklen_t len; #ifdef HAVE_RTNETLINK struct nlmsghdr *nh; #else @@ -4727,15 +4728,34 @@ process_routing_msgs(struct asyncio_reader *reader) return; } - cnt = read(reader->fd, buffer, sizeof(buffer)); + if (NULL == buffer) { + buffer = emalloc(buffsz); + } + + cnt = read(reader->fd, buffer, buffsz); if (cnt < 0) { if (errno == ENOBUFS) { - msyslog(LOG_ERR, - "routing socket reports: %m"); + /* increase socket buffer by 25% */ + len = sizeof cnt; + if (0 > getsockopt(reader->fd, SOL_SOCKET, SO_RCVBUF, &cnt, &len) || + sizeof cnt != len) { + msyslog(LOG_ERR, + "routing getsockopt SO_RCVBUF %u %u: %m - disabling", + (u_int)cnt, (u_int)sizeof cnt); + goto disable; + } + new = cnt + (cnt / 4); + if (0 > setsockopt(reader->fd, SOL_SOCKET, SO_RCVBUF, &new, sizeof new)) { + msyslog(LOG_ERR, + "routing setsockopt SO_RCVBUF %d -> %d: %m - disabling", + cnt, new); + goto disable; + } } else { msyslog(LOG_ERR, "routing socket reports: %m - disabling"); + disable: remove_asyncio_reader(reader); delete_asyncio_reader(reader); } |
