X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Ftimedate%2Ftimedate-sntp.c;h=880b467a8e6ffef9033e41ae59b2c2644e3e865e;hb=6a0f1f6d5af7c7300d3db7a0ba2b068f8abd222b;hp=fff02c79e5b3f241c050b04d19e9251585756cf9;hpb=3dbc7620030b7eacfe19d55f1bcd8237dd3230ef;p=elogind.git diff --git a/src/timedate/timedate-sntp.c b/src/timedate/timedate-sntp.c index fff02c79e..880b467a8 100644 --- a/src/timedate/timedate-sntp.c +++ b/src/timedate/timedate-sntp.c @@ -118,6 +118,8 @@ struct ntp_msg { } _packed_; struct SNTPContext { + void (*report)(usec_t poll, double offset, double delay, double jitter, bool spike); + /* peer */ sd_event_source *event_receive; char *server; @@ -218,7 +220,7 @@ static int sntp_send_request(SNTPContext *sntp) { sntp->pending = true; log_debug("Sent NTP request to: %s", sntp->server); } else - log_info("Sending NTP request to %s failed: %m", sntp->server); + log_debug("Sending NTP request to %s failed: %m", sntp->server); /* re-arm timer with incresing timeout, in case the packets never arrive back */ if (sntp->retry_interval > 0) { @@ -263,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; @@ -345,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; @@ -404,18 +409,6 @@ static bool sntp_sample_spike_detection(SNTPContext *sntp, double offset, double sntp->packet_count++; jitter = sntp->samples_jitter; - /* ignore samples when resyncing */ - if (sntp->poll_resync) - return false; - - /* we need a few samples before we calculate anything */ - if (sntp->packet_count < 3) - return false; - - /* always accept sample if we are farther off than the round trip delay */ - if (fabs(offset) > delay) - return false; - /* calculate new jitter value from the RMS differences relative to the lowest delay sample */ for (idx_min = idx_cur, i = 0; i < ELEMENTSOF(sntp->samples); i++) if (sntp->samples[i].delay > 0 && sntp->samples[i].delay < sntp->samples[idx_min].delay) @@ -426,8 +419,20 @@ static bool sntp_sample_spike_detection(SNTPContext *sntp, double offset, double j += square(sntp->samples[i].offset - sntp->samples[idx_min].offset); sntp->samples_jitter = sqrt(j / (ELEMENTSOF(sntp->samples) - 1)); + /* ignore samples when resyncing */ + if (sntp->poll_resync) + return false; + + /* always accept offset if we are farther off than the round-trip delay */ + if (fabs(offset) > delay) + return false; + + /* we need a few samples before looking at them */ + if (sntp->packet_count < 4) + return false; + /* do not accept anything worse than the maximum possible error of the best sample */ - if (abs(offset) > sntp->samples[idx_min].delay) + if (fabs(offset) > sntp->samples[idx_min].delay) return true; /* compare the difference between the current offset to the previous offset and jitter */ @@ -442,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; } @@ -626,9 +631,8 @@ static int sntp_receive_response(sd_event_source *source, int fd, uint32_t reven sntp->samples_jitter, spike ? " spike" : "", sntp->poll_interval_usec / USEC_PER_SEC); - log_info("%4llu %+10f %10f %10f%s", - sntp->poll_interval_usec / USEC_PER_SEC, offset, delay, - sntp->samples_jitter, spike ? " spike" : ""); + if (sntp->report) + sntp->report(sntp->poll_interval_usec, offset, delay, sntp->samples_jitter, spike); if (!spike) { r = sntp_adjust_clock(sntp, offset, leap_sec); @@ -723,6 +727,10 @@ static int sntp_listen_setup(SNTPContext *sntp, sd_event *e) { return 0; } +void sntp_report_register(SNTPContext *sntp, void (*report)(usec_t poll_usec, double offset, double delay, double jitter, bool spike)) { + sntp->report = report; +} + int sntp_new(SNTPContext **sntp, sd_event *e) { _cleanup_free_ SNTPContext *c; int r;