X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Ftimedate%2Ftimedate-sntp.c;h=e47a0865673185143efb5f3fab4c8abfab7c29cc;hb=2ad7561f9f658f8dee168a76654c7d918e2260c7;hp=36b2a1a1a5627c57151cc8cc5007f38d6f491009;hpb=9ec65868668839136ee10bcf6785938c3ad9a1a1;p=elogind.git diff --git a/src/timedate/timedate-sntp.c b/src/timedate/timedate-sntp.c index 36b2a1a1a..e47a08656 100644 --- a/src/timedate/timedate-sntp.c +++ b/src/timedate/timedate-sntp.c @@ -205,7 +205,7 @@ static int sntp_send_request(SNTPContext *sntp) { * matching answer to our request. * * The actual value does not matter, We do not care about the correct - * NTP UINT_MAX fraction, we just pass the plain nanosecond value. + * NTP UINT_MAX fraction; we just pass the plain nanosecond value. */ clock_gettime(CLOCK_MONOTONIC, &sntp->trans_time_mon); clock_gettime(CLOCK_REALTIME, &sntp->trans_time); @@ -265,7 +265,12 @@ static int sntp_arm_timer(SNTPContext *sntp, usec_t next) { } e = sd_event_source_get_event(sntp->event_receive); - r = sd_event_add_monotonic(e, &sntp->event_timer, now(CLOCK_MONOTONIC) + next, 0, sntp_timer, sntp); + r = sd_event_add_time( + e, + &sntp->event_timer, + CLOCK_MONOTONIC, + now(CLOCK_MONOTONIC) + next, 0, + sntp_timer, sntp); if (r < 0) return r; @@ -288,7 +293,7 @@ static int sntp_clock_watch(sd_event_source *source, int fd, uint32_t revents, v } /* resync */ - log_info("System time changed, resyncing."); + log_info("System time changed. Resyncing."); sntp->poll_resync = true; sntp_send_request(sntp); @@ -347,14 +352,12 @@ static int sntp_adjust_clock(SNTPContext *sntp, double offset, int leap_sec) { * syncs the system time periodically to the hardware clock. */ if (offset < NTP_MAX_ADJUST && offset > -NTP_MAX_ADJUST) { - int constant; - - constant = log2i(sntp->poll_interval_usec / USEC_PER_SEC) - 6; - - tmx.modes |= ADJ_STATUS | ADJ_OFFSET | ADJ_TIMECONST; + tmx.modes |= ADJ_STATUS | ADJ_OFFSET | ADJ_TIMECONST | ADJ_MAXERROR | ADJ_ESTERROR; tmx.status = STA_PLL; tmx.offset = offset * 1000 * 1000; - tmx.constant = constant; + tmx.constant = log2i(sntp->poll_interval_usec / USEC_PER_SEC) - 6; + tmx.maxerror = 0; + tmx.esterror = 0; log_debug(" adjust (slew): %+f sec\n", (double)tmx.offset / USEC_PER_SEC); } else { tmx.modes = ADJ_SETOFFSET; @@ -444,7 +447,7 @@ static void sntp_adjust_poll(SNTPContext *sntp, double offset, bool spike) { } /* set to minimal poll interval */ - if (fabs(offset) > NTP_ACCURACY_SEC) { + if (!spike && fabs(offset) > NTP_ACCURACY_SEC) { sntp->poll_interval_usec = NTP_POLL_INTERVAL_MIN_SEC * USEC_PER_SEC; return; } @@ -496,24 +499,24 @@ static int sntp_receive_response(sd_event_source *source, int fd, uint32_t reven int r; if (revents & (EPOLLHUP|EPOLLERR)) { - log_debug("Server connection returned error, closing."); + log_debug("Server connection returned error. Closing."); sntp_server_disconnect(sntp); return -ENOTCONN; } len = recvmsg(fd, &msghdr, MSG_DONTWAIT); if (len < 0) { - log_debug("Error receiving message, disconnecting"); + log_debug("Error receiving message. Disconnecting."); return -EINVAL; } if (iov.iov_len < sizeof(struct ntp_msg)) { - log_debug("Invalid response from server, disconnecting"); + log_debug("Invalid response from server. Disconnecting."); return -EINVAL; } if (sntp->server_addr.sin_addr.s_addr != server_addr.sin_addr.s_addr) { - log_debug("Response from unknown server, disconnecting"); + log_debug("Response from unknown server. Disconnecting."); return -EINVAL; } @@ -529,35 +532,35 @@ static int sntp_receive_response(sd_event_source *source, int fd, uint32_t reven } } if (!recv_time) { - log_debug("Invalid packet timestamp, disconnecting"); + log_debug("Invalid packet timestamp. Disconnecting."); return -EINVAL; } ntpmsg = iov.iov_base; if (!sntp->pending) { - log_debug("Unexpected reply, ignoring"); + log_debug("Unexpected reply. Ignoring."); return 0; } /* check our "time cookie" (we just stored nanoseconds in the fraction field) */ - if (be32toh(ntpmsg->origin_time.sec) != sntp->trans_time.tv_sec + OFFSET_1900_1970|| + if (be32toh(ntpmsg->origin_time.sec) != sntp->trans_time.tv_sec + OFFSET_1900_1970 || be32toh(ntpmsg->origin_time.frac) != sntp->trans_time.tv_nsec) { - log_debug("Invalid reply, not our transmit time, ignoring"); + log_debug("Invalid reply; not our transmit time. Ignoring."); return 0; } if (NTP_FIELD_LEAP(ntpmsg->field) == NTP_LEAP_NOTINSYNC) { - log_debug("Server is not synchronized, disconnecting"); + log_debug("Server is not synchronized. Disconnecting."); return -EINVAL; } if (NTP_FIELD_VERSION(ntpmsg->field) != 4) { - log_debug("Response NTPv%d, disconnecting", NTP_FIELD_VERSION(ntpmsg->field)); + log_debug("Response NTPv%d. Disconnecting.", NTP_FIELD_VERSION(ntpmsg->field)); return -EINVAL; } if (NTP_FIELD_MODE(ntpmsg->field) != NTP_MODE_SERVER) { - log_debug("Unsupported mode %d, disconnecting", NTP_FIELD_MODE(ntpmsg->field)); + log_debug("Unsupported mode %d. Disconnecting.", NTP_FIELD_MODE(ntpmsg->field)); return -EINVAL; } @@ -581,7 +584,7 @@ static int sntp_receive_response(sd_event_source *source, int fd, uint32_t reven * Transmit Timestamp T3 time reply sent by server * Destination Timestamp T4 time reply received by client * - * The roundtrip delay d and system clock offset t are defined as: + * The round-trip delay, d, and system clock offset, t, are defined as: * d = (T4 - T1) - (T3 - T2) t = ((T2 - T1) + (T3 - T4)) / 2" */ clock_gettime(CLOCK_MONOTONIC, &now_ts);