1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2014 Kay Sievers
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
29 #include <arpa/inet.h>
30 #include <netinet/in.h>
31 #include <netinet/ip.h>
32 #include <sys/timerfd.h>
33 #include <sys/timex.h>
34 #include <sys/socket.h>
38 #include "sparse-endian.h"
41 #include "sd-daemon.h"
43 #define TIME_T_MAX (time_t)((1UL << ((sizeof(time_t) << 3) - 1)) - 1)
46 #define ADJ_SETOFFSET 0x0100 /* add 'time' to current time */
49 /* expected accuracy of time synchronization; used to adjust the poll interval */
50 #define NTP_ACCURACY_SEC 0.2
53 * "A client MUST NOT under any conditions use a poll interval less
56 #define NTP_POLL_INTERVAL_MIN_SEC 32
57 #define NTP_POLL_INTERVAL_MAX_SEC 2048
60 * Maximum delta in seconds which the system clock is gradually adjusted
61 * (slew) to approach the network time. Deltas larger that this are set by
62 * letting the system time jump. The kernel's limit for adjtime is 0.5s.
64 #define NTP_MAX_ADJUST 0.4
66 /* NTP protocol, packet header */
67 #define NTP_LEAP_PLUSSEC 1
68 #define NTP_LEAP_MINUSSEC 2
69 #define NTP_LEAP_NOTINSYNC 3
70 #define NTP_MODE_CLIENT 3
71 #define NTP_MODE_SERVER 4
72 #define NTP_FIELD_LEAP(f) (((f) >> 6) & 3)
73 #define NTP_FIELD_VERSION(f) (((f) >> 3) & 7)
74 #define NTP_FIELD_MODE(f) ((f) & 7)
75 #define NTP_FIELD(l, v, m) (((l) << 6) | ((v) << 3) | (m))
78 * "NTP timestamps are represented as a 64-bit unsigned fixed-point number,
79 * in seconds relative to 0h on 1 January 1900."
81 #define OFFSET_1900_1970 2208988800UL
98 struct ntp_ts_short root_delay;
99 struct ntp_ts_short root_dispersion;
101 struct ntp_ts reference_time;
102 struct ntp_ts origin_time;
103 struct ntp_ts recv_time;
104 struct ntp_ts trans_time;
107 typedef struct Manager Manager;
112 sd_event_source *event_receive;
114 struct sockaddr_in server_addr;
116 uint64_t packet_count;
118 /* last sent packet */
119 struct timespec trans_time_mon;
120 struct timespec trans_time;
121 usec_t retry_interval;
125 sd_event_source *event_timer;
126 usec_t poll_interval_usec;
134 unsigned int samples_idx;
135 double samples_jitter;
140 /* watch for time changes */
141 sd_event_source *event_clock_watch;
145 static void manager_free(Manager *m);
146 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
147 #define _cleanup_manager_free_ _cleanup_(manager_freep)
149 static int sntp_arm_timer(Manager *m, usec_t next);
150 static int sntp_clock_watch_setup(Manager *m);
151 static void sntp_server_disconnect(Manager *m);
153 static double ntp_ts_to_d(const struct ntp_ts *ts) {
154 return be32toh(ts->sec) + ((double)be32toh(ts->frac) / UINT_MAX);
157 static double tv_to_d(const struct timeval *tv) {
158 return tv->tv_sec + (1.0e-6 * tv->tv_usec);
161 static double ts_to_d(const struct timespec *ts) {
162 return ts->tv_sec + (1.0e-9 * ts->tv_nsec);
165 static void d_to_tv(double d, struct timeval *tv) {
166 tv->tv_sec = (long)d;
167 tv->tv_usec = (d - tv->tv_sec) * 1000 * 1000;
169 /* the kernel expects -0.3s as {-1, 7000.000} */
170 if (tv->tv_usec < 0) {
172 tv->tv_usec += 1000 * 1000;
176 static double square(double d) {
180 static int sntp_send_request(Manager *m) {
181 struct ntp_msg ntpmsg = {};
182 struct sockaddr_in addr = {};
187 * "The client initializes the NTP message header, sends the request
188 * to the server, and strips the time of day from the Transmit
189 * Timestamp field of the reply. For this purpose, all the NTP
190 * header fields are set to 0, except the Mode, VN, and optional
191 * Transmit Timestamp fields."
193 ntpmsg.field = NTP_FIELD(0, 4, NTP_MODE_CLIENT);
196 * Set transmit timestamp, remember it; the server will send that back
197 * as the origin timestamp and we have an indication that this is the
198 * matching answer to our request.
200 * The actual value does not matter, We do not care about the correct
201 * NTP UINT_MAX fraction; we just pass the plain nanosecond value.
203 clock_gettime(CLOCK_MONOTONIC, &m->trans_time_mon);
204 clock_gettime(CLOCK_REALTIME, &m->trans_time);
205 ntpmsg.trans_time.sec = htobe32(m->trans_time.tv_sec + OFFSET_1900_1970);
206 ntpmsg.trans_time.frac = htobe32(m->trans_time.tv_nsec);
208 addr.sin_family = AF_INET;
209 addr.sin_port = htobe16(123);
210 addr.sin_addr.s_addr = inet_addr(m->server);
211 len = sendto(m->server_socket, &ntpmsg, sizeof(ntpmsg), MSG_DONTWAIT, &addr, sizeof(addr));
212 if (len == sizeof(ntpmsg)) {
214 log_debug("Sent NTP request to: %s", m->server);
216 log_debug("Sending NTP request to %s failed: %m", m->server);
218 /* re-arm timer with incresing timeout, in case the packets never arrive back */
219 if (m->retry_interval > 0) {
220 if (m->retry_interval < NTP_POLL_INTERVAL_MAX_SEC * USEC_PER_SEC)
221 m->retry_interval *= 2;
223 m->retry_interval = NTP_POLL_INTERVAL_MIN_SEC * USEC_PER_SEC;
224 r = sntp_arm_timer(m, m->retry_interval);
231 static int sntp_timer(sd_event_source *source, usec_t usec, void *userdata) {
232 Manager *m = userdata;
236 sntp_send_request(m);
240 static int sntp_arm_timer(Manager *m, usec_t next) {
244 assert(m->event_receive);
247 m->event_timer = sd_event_source_unref(m->event_timer);
251 if (m->event_timer) {
252 r = sd_event_source_set_time(m->event_timer, now(CLOCK_MONOTONIC) + next);
256 return sd_event_source_set_enabled(m->event_timer, SD_EVENT_ONESHOT);
259 r = sd_event_add_time(
263 now(CLOCK_MONOTONIC) + next, 0,
271 static int sntp_clock_watch(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
272 Manager *m = userdata;
275 assert(m->event_receive);
278 sntp_clock_watch_setup(m);
280 /* skip our own jumps */
287 log_info("System time changed. Resyncing.");
288 m->poll_resync = true;
289 sntp_send_request(m);
294 /* wake up when the system time changes underneath us */
295 static int sntp_clock_watch_setup(Manager *m) {
296 struct itimerspec its = { .it_value.tv_sec = TIME_T_MAX };
297 _cleanup_close_ int fd = -1;
299 sd_event_source *source;
303 assert(m->event_receive);
305 fd = timerfd_create(CLOCK_REALTIME, TFD_NONBLOCK|TFD_CLOEXEC);
307 log_error("Failed to create timerfd: %m");
311 if (timerfd_settime(fd, TFD_TIMER_ABSTIME|TFD_TIMER_CANCEL_ON_SET, &its, NULL) < 0) {
312 log_error("Failed to set up timerfd: %m");
316 e = sd_event_source_get_event(m->event_receive);
317 r = sd_event_add_io(e, &source, fd, EPOLLIN, sntp_clock_watch, m);
319 log_error("Failed to create clock watch event source: %s", strerror(-r));
323 sd_event_source_unref(m->event_clock_watch);
324 m->event_clock_watch = source;
326 if (m->clock_watch_fd >= 0)
327 close(m->clock_watch_fd);
328 m->clock_watch_fd = fd;
334 static int sntp_adjust_clock(Manager *m, double offset, int leap_sec) {
335 struct timex tmx = {};
339 * For small deltas, tell the kernel to gradually adjust the system
340 * clock to the NTP time, larger deltas are just directly set.
342 * Clear STA_UNSYNC, it will enable the kernel's 11-minute mode, which
343 * syncs the system time periodically to the hardware clock.
345 if (fabs(offset) < NTP_MAX_ADJUST) {
346 tmx.modes = ADJ_STATUS | ADJ_OFFSET | ADJ_TIMECONST | ADJ_MAXERROR | ADJ_ESTERROR;
347 tmx.status = STA_PLL;
348 tmx.offset = offset * USEC_PER_SEC;
349 tmx.constant = log2i(m->poll_interval_usec / USEC_PER_SEC) - 6;
352 log_debug(" adjust (slew): %+.3f sec\n", (double)tmx.offset / USEC_PER_SEC);
354 tmx.modes = ADJ_SETOFFSET;
355 d_to_tv(offset, &tmx.time);
358 log_debug(" adjust (jump): %+.3f sec\n", tv_to_d(&tmx.time));
363 tmx.status |= STA_INS;
366 tmx.status |= STA_DEL;
370 r = clock_adjtime(CLOCK_REALTIME, &tmx);
374 log_debug(" status : %04i %s\n"
375 " time now : %li.%03lli\n"
377 " offset : %+.3f sec\n"
378 " freq offset : %+li (%+.3f ppm)\n",
379 tmx.status, tmx.status & STA_UNSYNC ? "" : "sync",
380 tmx.time.tv_sec, tmx.time.tv_usec / USEC_PER_MSEC,
382 (double)tmx.offset / USEC_PER_SEC,
383 tmx.freq, (double)tmx.freq / 65536);
388 static bool sntp_sample_spike_detection(Manager *m, double offset, double delay) {
389 unsigned int i, idx_cur, idx_new, idx_min;
395 /* ignore initial sample */
396 if (m->packet_count == 1)
399 /* store the current data in our samples array */
400 idx_cur = m->samples_idx;
401 idx_new = (idx_cur + 1) % ELEMENTSOF(m->samples);
402 m->samples_idx = idx_new;
403 m->samples[idx_new].offset = offset;
404 m->samples[idx_new].delay = delay;
406 /* calculate new jitter value from the RMS differences relative to the lowest delay sample */
407 jitter = m->samples_jitter;
408 for (idx_min = idx_cur, i = 0; i < ELEMENTSOF(m->samples); i++)
409 if (m->samples[i].delay > 0 && m->samples[i].delay < m->samples[idx_min].delay)
413 for (i = 0; i < ELEMENTSOF(m->samples); i++)
414 j += square(m->samples[i].offset - m->samples[idx_min].offset);
415 m->samples_jitter = sqrt(j / (ELEMENTSOF(m->samples) - 1));
417 /* ignore samples when resyncing */
421 /* always accept offset if we are farther off than the round-trip delay */
422 if (fabs(offset) > delay)
425 /* we need a few samples before looking at them */
426 if (m->packet_count < 4)
429 /* do not accept anything worse than the maximum possible error of the best sample */
430 if (fabs(offset) > m->samples[idx_min].delay)
433 /* compare the difference between the current offset to the previous offset and jitter */
434 return fabs(offset - m->samples[idx_cur].offset) > 3 * jitter;
437 static void sntp_adjust_poll(Manager *m, double offset, bool spike) {
438 if (m->poll_resync) {
439 m->poll_interval_usec = NTP_POLL_INTERVAL_MIN_SEC * USEC_PER_SEC;
440 m->poll_resync = false;
444 /* set to minimal poll interval */
445 if (!spike && fabs(offset) > NTP_ACCURACY_SEC) {
446 m->poll_interval_usec = NTP_POLL_INTERVAL_MIN_SEC * USEC_PER_SEC;
450 /* increase polling interval */
451 if (fabs(offset) < NTP_ACCURACY_SEC * 0.25) {
452 if (m->poll_interval_usec < NTP_POLL_INTERVAL_MAX_SEC * USEC_PER_SEC)
453 m->poll_interval_usec *= 2;
457 /* decrease polling interval */
458 if (spike || fabs(offset) > NTP_ACCURACY_SEC * 0.75) {
459 if (m->poll_interval_usec > NTP_POLL_INTERVAL_MIN_SEC * USEC_PER_SEC)
460 m->poll_interval_usec /= 2;
465 static int sntp_receive_response(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
466 Manager *m = userdata;
467 unsigned char buf[sizeof(struct ntp_msg)];
470 .iov_len = sizeof(buf),
473 struct cmsghdr cmsghdr;
474 uint8_t buf[CMSG_SPACE(sizeof(struct timeval))];
476 struct sockaddr_in server_addr;
477 struct msghdr msghdr = {
480 .msg_control = &control,
481 .msg_controllen = sizeof(control),
482 .msg_name = &server_addr,
483 .msg_namelen = sizeof(server_addr),
485 struct cmsghdr *cmsg;
486 struct timespec now_ts;
487 struct timeval *recv_time;
489 struct ntp_msg *ntpmsg;
490 double origin, receive, trans, dest;
491 double delay, offset;
496 if (revents & (EPOLLHUP|EPOLLERR)) {
497 log_debug("Server connection returned error. Closing.");
498 sntp_server_disconnect(m);
502 len = recvmsg(fd, &msghdr, MSG_DONTWAIT);
504 log_debug("Error receiving message. Disconnecting.");
508 if (iov.iov_len < sizeof(struct ntp_msg)) {
509 log_debug("Invalid response from server. Disconnecting.");
513 if (m->server_addr.sin_addr.s_addr != server_addr.sin_addr.s_addr) {
514 log_debug("Response from unknown server. Disconnecting.");
519 for (cmsg = CMSG_FIRSTHDR(&msghdr); cmsg; cmsg = CMSG_NXTHDR(&msghdr, cmsg)) {
520 if (cmsg->cmsg_level != SOL_SOCKET)
523 switch (cmsg->cmsg_type) {
525 recv_time = (struct timeval *) CMSG_DATA(cmsg);
530 log_debug("Invalid packet timestamp. Disconnecting.");
534 ntpmsg = iov.iov_base;
536 log_debug("Unexpected reply. Ignoring.");
540 /* check our "time cookie" (we just stored nanoseconds in the fraction field) */
541 if (be32toh(ntpmsg->origin_time.sec) != m->trans_time.tv_sec + OFFSET_1900_1970 ||
542 be32toh(ntpmsg->origin_time.frac) != m->trans_time.tv_nsec) {
543 log_debug("Invalid reply; not our transmit time. Ignoring.");
547 if (NTP_FIELD_LEAP(ntpmsg->field) == NTP_LEAP_NOTINSYNC) {
548 log_debug("Server is not synchronized. Disconnecting.");
552 if (NTP_FIELD_VERSION(ntpmsg->field) != 4) {
553 log_debug("Response NTPv%d. Disconnecting.", NTP_FIELD_VERSION(ntpmsg->field));
557 if (NTP_FIELD_MODE(ntpmsg->field) != NTP_MODE_SERVER) {
558 log_debug("Unsupported mode %d. Disconnecting.", NTP_FIELD_MODE(ntpmsg->field));
564 m->retry_interval = 0;
566 /* announce leap seconds */
567 if (NTP_FIELD_LEAP(ntpmsg->field) & NTP_LEAP_PLUSSEC)
569 else if (NTP_FIELD_LEAP(ntpmsg->field) & NTP_LEAP_MINUSSEC)
575 * "Timestamp Name ID When Generated
576 * ------------------------------------------------------------
577 * Originate Timestamp T1 time request sent by client
578 * Receive Timestamp T2 time request received by server
579 * Transmit Timestamp T3 time reply sent by server
580 * Destination Timestamp T4 time reply received by client
582 * The round-trip delay, d, and system clock offset, t, are defined as:
583 * d = (T4 - T1) - (T3 - T2) t = ((T2 - T1) + (T3 - T4)) / 2"
585 clock_gettime(CLOCK_MONOTONIC, &now_ts);
586 origin = tv_to_d(recv_time) - (ts_to_d(&now_ts) - ts_to_d(&m->trans_time_mon)) + OFFSET_1900_1970;
587 receive = ntp_ts_to_d(&ntpmsg->recv_time);
588 trans = ntp_ts_to_d(&ntpmsg->trans_time);
589 dest = tv_to_d(recv_time) + OFFSET_1900_1970;
591 offset = ((receive - origin) + (trans - dest)) / 2;
592 delay = (dest - origin) - (trans - receive);
594 spike = sntp_sample_spike_detection(m, offset, delay);
596 sntp_adjust_poll(m, offset, spike);
598 log_debug("NTP response:\n"
603 " precision : %.3f sec (%d)\n"
604 " reference : %.4s\n"
609 " offset : %+.3f sec\n"
610 " delay : %+.3f sec\n"
611 " packet count : %"PRIu64"\n"
613 " poll interval: %llu\n",
614 NTP_FIELD_LEAP(ntpmsg->field),
615 NTP_FIELD_VERSION(ntpmsg->field),
616 NTP_FIELD_MODE(ntpmsg->field),
618 exp2(ntpmsg->precision), ntpmsg->precision,
619 ntpmsg->stratum == 1 ? ntpmsg->refid : "n/a",
620 origin - OFFSET_1900_1970,
621 receive - OFFSET_1900_1970,
622 trans - OFFSET_1900_1970,
623 dest - OFFSET_1900_1970,
626 m->samples_jitter, spike ? " spike" : "",
627 m->poll_interval_usec / USEC_PER_SEC);
629 log_info("%s: interval/delta/delay/jitter %llu/%+.3f/%.3f/%.3f%s",
630 m->server, m->poll_interval_usec / USEC_PER_SEC, offset, delay, m->samples_jitter, spike ? " (ignored)" : "");
633 r = sntp_adjust_clock(m, offset, leap_sec);
635 log_error("Failed to call clock_adjtime(): %m");
638 r = sntp_arm_timer(m, m->poll_interval_usec);
645 static int sntp_server_connect(Manager *m, const char *server) {
646 _cleanup_free_ char *s = NULL;
650 assert(m->server_socket >= 0);
660 zero(m->server_addr);
661 m->server_addr.sin_family = AF_INET;
662 m->server_addr.sin_addr.s_addr = inet_addr(server);
664 m->poll_interval_usec = NTP_POLL_INTERVAL_MIN_SEC * USEC_PER_SEC;
666 return sntp_send_request(m);
669 static void sntp_server_disconnect(Manager *m) {
673 m->event_timer = sd_event_source_unref(m->event_timer);
675 m->event_clock_watch = sd_event_source_unref(m->event_clock_watch);
676 if (m->clock_watch_fd > 0)
677 close(m->clock_watch_fd);
678 m->clock_watch_fd = -1;
680 m->event_receive = sd_event_source_unref(m->event_receive);
681 if (m->server_socket > 0)
682 close(m->server_socket);
683 m->server_socket = -1;
685 zero(m->server_addr);
690 static int sntp_listen_setup(Manager *m) {
691 _cleanup_close_ int fd = -1;
692 struct sockaddr_in addr;
694 const int tos = IPTOS_LOWDELAY;
697 fd = socket(PF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
702 addr.sin_family = AF_INET;
703 r = bind(fd, (struct sockaddr *)&addr, sizeof(addr));
707 r = setsockopt(fd, SOL_SOCKET, SO_TIMESTAMP, &on, sizeof(on));
711 r = setsockopt(fd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
715 r = sd_event_add_io(m->event, &m->event_receive, fd, EPOLLIN, sntp_receive_response, m);
719 m->server_socket = fd;
725 static int manager_new(Manager **ret) {
726 _cleanup_manager_free_ Manager *m = NULL;
729 m = new0(Manager, 1);
733 r = sd_event_default(&m->event);
737 r = sntp_listen_setup(m);
741 r = sntp_clock_watch_setup(m);
751 static void manager_free(Manager *m) {
756 sd_event_unref(m->event);
760 int main(int argc, char *argv[]) {
761 _cleanup_manager_free_ Manager *m = NULL;
765 log_set_target(LOG_TARGET_AUTO);
766 log_parse_environment();
773 server = "216.239.32.15"; /* time1.google.com */
777 "STATUS=Connecting to %s", server);
779 r = sntp_server_connect(m, server);
784 "STATUS=Connected to %s", server);
786 r = sd_event_loop(m->event);
791 return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;