chiark / gitweb /
timedatectl: clear ADJ_MAXERROR to make sure we keep STA_SYNC set
[elogind.git] / src / timedate / timedate-sntp.c
index 7e34e93ca62ab8503d9ee5d595090afe5f81f765..e4aad36cc5499f42e410bbe0a59a227bf972f8c8 100644 (file)
@@ -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) {
@@ -345,14 +347,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;
@@ -626,9 +626,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 +722,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;