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"
40 #include "socket-util.h"
42 #include "sd-daemon.h"
44 #define TIME_T_MAX (time_t)((1UL << ((sizeof(time_t) << 3) - 1)) - 1)
47 #define ADJ_SETOFFSET 0x0100 /* add 'time' to current time */
50 /* expected accuracy of time synchronization; used to adjust the poll interval */
51 #define NTP_ACCURACY_SEC 0.2
54 * "A client MUST NOT under any conditions use a poll interval less
57 #define NTP_POLL_INTERVAL_MIN_SEC 32
58 #define NTP_POLL_INTERVAL_MAX_SEC 2048
61 * Maximum delta in seconds which the system clock is gradually adjusted
62 * (slew) to approach the network time. Deltas larger that this are set by
63 * letting the system time jump. The kernel's limit for adjtime is 0.5s.
65 #define NTP_MAX_ADJUST 0.4
67 /* NTP protocol, packet header */
68 #define NTP_LEAP_PLUSSEC 1
69 #define NTP_LEAP_MINUSSEC 2
70 #define NTP_LEAP_NOTINSYNC 3
71 #define NTP_MODE_CLIENT 3
72 #define NTP_MODE_SERVER 4
73 #define NTP_FIELD_LEAP(f) (((f) >> 6) & 3)
74 #define NTP_FIELD_VERSION(f) (((f) >> 3) & 7)
75 #define NTP_FIELD_MODE(f) ((f) & 7)
76 #define NTP_FIELD(l, v, m) (((l) << 6) | ((v) << 3) | (m))
79 * "NTP timestamps are represented as a 64-bit unsigned fixed-point number,
80 * in seconds relative to 0h on 1 January 1900."
82 #define OFFSET_1900_1970 2208988800UL
99 struct ntp_ts_short root_delay;
100 struct ntp_ts_short root_dispersion;
102 struct ntp_ts reference_time;
103 struct ntp_ts origin_time;
104 struct ntp_ts recv_time;
105 struct ntp_ts trans_time;
108 typedef struct Manager Manager;
113 sd_event_source *event_receive;
115 union sockaddr_union server_addr;
117 uint64_t packet_count;
119 /* last sent packet */
120 struct timespec trans_time_mon;
121 struct timespec trans_time;
122 usec_t retry_interval;
126 sd_event_source *event_timer;
127 usec_t poll_interval_usec;
135 unsigned int samples_idx;
136 double samples_jitter;
142 /* watch for time changes */
143 sd_event_source *event_clock_watch;
147 static void manager_free(Manager *m);
148 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
149 #define _cleanup_manager_free_ _cleanup_(manager_freep)
151 static int sntp_arm_timer(Manager *m, usec_t next);
152 static int sntp_clock_watch_setup(Manager *m);
153 static void sntp_server_disconnect(Manager *m);
155 static double ntp_ts_to_d(const struct ntp_ts *ts) {
156 return be32toh(ts->sec) + ((double)be32toh(ts->frac) / UINT_MAX);
159 static double ts_to_d(const struct timespec *ts) {
160 return ts->tv_sec + (1.0e-9 * ts->tv_nsec);
163 static double tv_to_d(const struct timeval *tv) {
164 return tv->tv_sec + (1.0e-6 * tv->tv_usec);
167 static double square(double d) {
171 static int sntp_send_request(Manager *m) {
172 struct ntp_msg ntpmsg = {
174 * "The client initializes the NTP message header, sends the request
175 * to the server, and strips the time of day from the Transmit
176 * Timestamp field of the reply. For this purpose, all the NTP
177 * header fields are set to 0, except the Mode, VN, and optional
178 * Transmit Timestamp fields."
180 .field = NTP_FIELD(0, 4, NTP_MODE_CLIENT),
183 union sockaddr_union addr = {
184 .in.sin_family = AF_INET,
185 .in.sin_port = htobe16(123),
192 * Set transmit timestamp, remember it; the server will send that back
193 * as the origin timestamp and we have an indication that this is the
194 * matching answer to our request.
196 * The actual value does not matter, We do not care about the correct
197 * NTP UINT_MAX fraction; we just pass the plain nanosecond value.
199 clock_gettime(CLOCK_MONOTONIC, &m->trans_time_mon);
200 clock_gettime(CLOCK_REALTIME, &m->trans_time);
201 ntpmsg.trans_time.sec = htobe32(m->trans_time.tv_sec + OFFSET_1900_1970);
202 ntpmsg.trans_time.frac = htobe32(m->trans_time.tv_nsec);
204 addr.in.sin_addr.s_addr = inet_addr(m->server);
205 len = sendto(m->server_socket, &ntpmsg, sizeof(ntpmsg), MSG_DONTWAIT, &addr.sa, sizeof(addr.in));
206 if (len == sizeof(ntpmsg)) {
208 log_debug("Sent NTP request to: %s", m->server);
210 log_debug("Sending NTP request to %s failed: %m", m->server);
212 /* re-arm timer with incresing timeout, in case the packets never arrive back */
213 if (m->retry_interval > 0) {
214 if (m->retry_interval < NTP_POLL_INTERVAL_MAX_SEC * USEC_PER_SEC)
215 m->retry_interval *= 2;
217 m->retry_interval = NTP_POLL_INTERVAL_MIN_SEC * USEC_PER_SEC;
218 r = sntp_arm_timer(m, m->retry_interval);
225 static int sntp_timer(sd_event_source *source, usec_t usec, void *userdata) {
226 Manager *m = userdata;
230 sntp_send_request(m);
234 static int sntp_arm_timer(Manager *m, usec_t next) {
238 assert(m->event_receive);
241 m->event_timer = sd_event_source_unref(m->event_timer);
245 if (m->event_timer) {
246 r = sd_event_source_set_time(m->event_timer, now(CLOCK_MONOTONIC) + next);
250 return sd_event_source_set_enabled(m->event_timer, SD_EVENT_ONESHOT);
253 r = sd_event_add_time(
257 now(CLOCK_MONOTONIC) + next, 0,
265 static int sntp_clock_watch(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
266 Manager *m = userdata;
269 assert(m->event_receive);
272 sntp_clock_watch_setup(m);
274 /* skip our own jumps */
281 log_info("System time changed. Resyncing.");
282 m->poll_resync = true;
283 sntp_send_request(m);
288 /* wake up when the system time changes underneath us */
289 static int sntp_clock_watch_setup(Manager *m) {
291 struct itimerspec its = {
292 .it_value.tv_sec = TIME_T_MAX
295 _cleanup_close_ int fd = -1;
296 sd_event_source *source;
300 assert(m->event_receive);
302 fd = timerfd_create(CLOCK_REALTIME, TFD_NONBLOCK|TFD_CLOEXEC);
304 log_error("Failed to create timerfd: %m");
308 if (timerfd_settime(fd, TFD_TIMER_ABSTIME|TFD_TIMER_CANCEL_ON_SET, &its, NULL) < 0) {
309 log_error("Failed to set up timerfd: %m");
313 r = sd_event_add_io(m->event, &source, fd, EPOLLIN, sntp_clock_watch, m);
315 log_error("Failed to create clock watch event source: %s", strerror(-r));
319 sd_event_source_unref(m->event_clock_watch);
320 m->event_clock_watch = source;
322 safe_close(m->clock_watch_fd);
323 m->clock_watch_fd = fd;
329 static int sntp_adjust_clock(Manager *m, double offset, int leap_sec) {
330 struct timex tmx = {};
334 * For small deltas, tell the kernel to gradually adjust the system
335 * clock to the NTP time, larger deltas are just directly set.
337 * Clear STA_UNSYNC, it will enable the kernel's 11-minute mode, which
338 * syncs the system time periodically to the hardware clock.
340 if (fabs(offset) < NTP_MAX_ADJUST) {
341 tmx.modes = ADJ_STATUS | ADJ_NANO | ADJ_OFFSET | ADJ_TIMECONST | ADJ_MAXERROR | ADJ_ESTERROR;
342 tmx.status = STA_PLL;
343 tmx.offset = offset * NSEC_PER_SEC;
344 tmx.constant = log2i(m->poll_interval_usec / USEC_PER_SEC) - 4;
347 log_debug(" adjust (slew): %+.3f sec\n", offset);
349 tmx.modes = ADJ_SETOFFSET | ADJ_NANO;
351 /* ADJ_NANO uses nanoseconds in the microseconds field */
352 tmx.time.tv_sec = (long)offset;
353 tmx.time.tv_usec = (offset - tmx.time.tv_sec) * NSEC_PER_SEC;
355 /* the kernel expects -0.3s as {-1, 7000.000.000} */
356 if (tmx.time.tv_usec < 0) {
357 tmx.time.tv_sec -= 1;
358 tmx.time.tv_usec += NSEC_PER_SEC;
362 log_debug(" adjust (jump): %+.3f sec\n", offset);
367 tmx.status |= STA_INS;
370 tmx.status |= STA_DEL;
374 r = clock_adjtime(CLOCK_REALTIME, &tmx);
378 m->drift_ppm = tmx.freq / 65536;
380 log_debug(" status : %04i %s\n"
381 " time now : %li.%03lli\n"
383 " offset : %+.3f sec\n"
384 " freq offset : %+li (%i ppm)\n",
385 tmx.status, tmx.status & STA_UNSYNC ? "" : "sync",
386 tmx.time.tv_sec, tmx.time.tv_usec / NSEC_PER_MSEC,
388 (double)tmx.offset / NSEC_PER_SEC,
389 tmx.freq, m->drift_ppm);
394 static bool sntp_sample_spike_detection(Manager *m, double offset, double delay) {
395 unsigned int i, idx_cur, idx_new, idx_min;
401 /* ignore initial sample */
402 if (m->packet_count == 1)
405 /* store the current data in our samples array */
406 idx_cur = m->samples_idx;
407 idx_new = (idx_cur + 1) % ELEMENTSOF(m->samples);
408 m->samples_idx = idx_new;
409 m->samples[idx_new].offset = offset;
410 m->samples[idx_new].delay = delay;
412 /* calculate new jitter value from the RMS differences relative to the lowest delay sample */
413 jitter = m->samples_jitter;
414 for (idx_min = idx_cur, i = 0; i < ELEMENTSOF(m->samples); i++)
415 if (m->samples[i].delay > 0 && m->samples[i].delay < m->samples[idx_min].delay)
419 for (i = 0; i < ELEMENTSOF(m->samples); i++)
420 j += square(m->samples[i].offset - m->samples[idx_min].offset);
421 m->samples_jitter = sqrt(j / (ELEMENTSOF(m->samples) - 1));
423 /* ignore samples when resyncing */
427 /* always accept offset if we are farther off than the round-trip delay */
428 if (fabs(offset) > delay)
431 /* we need a few samples before looking at them */
432 if (m->packet_count < 4)
435 /* do not accept anything worse than the maximum possible error of the best sample */
436 if (fabs(offset) > m->samples[idx_min].delay)
439 /* compare the difference between the current offset to the previous offset and jitter */
440 return fabs(offset - m->samples[idx_cur].offset) > 3 * jitter;
443 static void sntp_adjust_poll(Manager *m, double offset, bool spike) {
444 if (m->poll_resync) {
445 m->poll_interval_usec = NTP_POLL_INTERVAL_MIN_SEC * USEC_PER_SEC;
446 m->poll_resync = false;
450 /* set to minimal poll interval */
451 if (!spike && fabs(offset) > NTP_ACCURACY_SEC) {
452 m->poll_interval_usec = NTP_POLL_INTERVAL_MIN_SEC * USEC_PER_SEC;
456 /* increase polling interval */
457 if (fabs(offset) < NTP_ACCURACY_SEC * 0.25) {
458 if (m->poll_interval_usec < NTP_POLL_INTERVAL_MAX_SEC * USEC_PER_SEC)
459 m->poll_interval_usec *= 2;
463 /* decrease polling interval */
464 if (spike || fabs(offset) > NTP_ACCURACY_SEC * 0.75) {
465 if (m->poll_interval_usec > NTP_POLL_INTERVAL_MIN_SEC * USEC_PER_SEC)
466 m->poll_interval_usec /= 2;
471 static int sntp_receive_response(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
472 Manager *m = userdata;
473 unsigned char buf[sizeof(struct ntp_msg)];
476 .iov_len = sizeof(buf),
479 struct cmsghdr cmsghdr;
480 uint8_t buf[CMSG_SPACE(sizeof(struct timeval))];
482 union sockaddr_union server_addr;
483 struct msghdr msghdr = {
486 .msg_control = &control,
487 .msg_controllen = sizeof(control),
488 .msg_name = &server_addr,
489 .msg_namelen = sizeof(server_addr),
491 struct cmsghdr *cmsg;
492 struct timespec now_ts;
493 struct timeval *recv_time;
495 struct ntp_msg *ntpmsg;
496 double origin, receive, trans, dest;
497 double delay, offset;
502 if (revents & (EPOLLHUP|EPOLLERR)) {
503 log_debug("Server connection returned error. Closing.");
504 sntp_server_disconnect(m);
508 len = recvmsg(fd, &msghdr, MSG_DONTWAIT);
510 log_debug("Error receiving message. Disconnecting.");
514 if (iov.iov_len < sizeof(struct ntp_msg)) {
515 log_debug("Invalid response from server. Disconnecting.");
519 if (m->server_addr.in.sin_addr.s_addr != server_addr.in.sin_addr.s_addr) {
520 log_debug("Response from unknown server. Disconnecting.");
525 for (cmsg = CMSG_FIRSTHDR(&msghdr); cmsg; cmsg = CMSG_NXTHDR(&msghdr, cmsg)) {
526 if (cmsg->cmsg_level != SOL_SOCKET)
529 switch (cmsg->cmsg_type) {
531 recv_time = (struct timeval *) CMSG_DATA(cmsg);
536 log_debug("Invalid packet timestamp. Disconnecting.");
540 ntpmsg = iov.iov_base;
542 log_debug("Unexpected reply. Ignoring.");
546 /* check our "time cookie" (we just stored nanoseconds in the fraction field) */
547 if (be32toh(ntpmsg->origin_time.sec) != m->trans_time.tv_sec + OFFSET_1900_1970 ||
548 be32toh(ntpmsg->origin_time.frac) != m->trans_time.tv_nsec) {
549 log_debug("Invalid reply; not our transmit time. Ignoring.");
553 if (NTP_FIELD_LEAP(ntpmsg->field) == NTP_LEAP_NOTINSYNC) {
554 log_debug("Server is not synchronized. Disconnecting.");
558 if (NTP_FIELD_VERSION(ntpmsg->field) != 4) {
559 log_debug("Response NTPv%d. Disconnecting.", NTP_FIELD_VERSION(ntpmsg->field));
563 if (NTP_FIELD_MODE(ntpmsg->field) != NTP_MODE_SERVER) {
564 log_debug("Unsupported mode %d. Disconnecting.", NTP_FIELD_MODE(ntpmsg->field));
570 m->retry_interval = 0;
572 /* announce leap seconds */
573 if (NTP_FIELD_LEAP(ntpmsg->field) & NTP_LEAP_PLUSSEC)
575 else if (NTP_FIELD_LEAP(ntpmsg->field) & NTP_LEAP_MINUSSEC)
581 * "Timestamp Name ID When Generated
582 * ------------------------------------------------------------
583 * Originate Timestamp T1 time request sent by client
584 * Receive Timestamp T2 time request received by server
585 * Transmit Timestamp T3 time reply sent by server
586 * Destination Timestamp T4 time reply received by client
588 * The round-trip delay, d, and system clock offset, t, are defined as:
589 * d = (T4 - T1) - (T3 - T2) t = ((T2 - T1) + (T3 - T4)) / 2"
591 clock_gettime(CLOCK_MONOTONIC, &now_ts);
592 origin = tv_to_d(recv_time) - (ts_to_d(&now_ts) - ts_to_d(&m->trans_time_mon)) + OFFSET_1900_1970;
593 receive = ntp_ts_to_d(&ntpmsg->recv_time);
594 trans = ntp_ts_to_d(&ntpmsg->trans_time);
595 dest = tv_to_d(recv_time) + OFFSET_1900_1970;
597 offset = ((receive - origin) + (trans - dest)) / 2;
598 delay = (dest - origin) - (trans - receive);
600 spike = sntp_sample_spike_detection(m, offset, delay);
602 sntp_adjust_poll(m, offset, spike);
604 log_debug("NTP response:\n"
609 " precision : %.6f sec (%d)\n"
610 " reference : %.4s\n"
615 " offset : %+.3f sec\n"
616 " delay : %+.3f sec\n"
617 " packet count : %"PRIu64"\n"
619 " poll interval: %llu\n",
620 NTP_FIELD_LEAP(ntpmsg->field),
621 NTP_FIELD_VERSION(ntpmsg->field),
622 NTP_FIELD_MODE(ntpmsg->field),
624 exp2(ntpmsg->precision), ntpmsg->precision,
625 ntpmsg->stratum == 1 ? ntpmsg->refid : "n/a",
626 origin - OFFSET_1900_1970,
627 receive - OFFSET_1900_1970,
628 trans - OFFSET_1900_1970,
629 dest - OFFSET_1900_1970,
632 m->samples_jitter, spike ? " spike" : "",
633 m->poll_interval_usec / USEC_PER_SEC);
636 r = sntp_adjust_clock(m, offset, leap_sec);
638 log_error("Failed to call clock_adjtime(): %m");
641 log_info("%s: interval/delta/delay/jitter/drift %llus/%+.3fs/%.3fs/%.3fs/%+ippm%s",
642 m->server, m->poll_interval_usec / USEC_PER_SEC, offset, delay, m->samples_jitter, m->drift_ppm,
643 spike ? " (ignored)" : "");
644 r = sntp_arm_timer(m, m->poll_interval_usec);
651 static int sntp_server_connect(Manager *m, const char *server) {
652 _cleanup_free_ char *s = NULL;
656 assert(m->server_socket >= 0);
666 zero(m->server_addr);
667 m->server_addr.in.sin_family = AF_INET;
668 m->server_addr.in.sin_addr.s_addr = inet_addr(server);
670 m->poll_interval_usec = NTP_POLL_INTERVAL_MIN_SEC * USEC_PER_SEC;
672 return sntp_send_request(m);
675 static void sntp_server_disconnect(Manager *m) {
679 m->event_timer = sd_event_source_unref(m->event_timer);
681 m->event_clock_watch = sd_event_source_unref(m->event_clock_watch);
682 m->clock_watch_fd = safe_close(m->clock_watch_fd);
684 m->event_receive = sd_event_source_unref(m->event_receive);
685 m->server_socket = safe_close(m->server_socket);
687 zero(m->server_addr);
692 static int sntp_listen_setup(Manager *m) {
694 union sockaddr_union addr = {
695 .in.sin_family = AF_INET,
698 _cleanup_close_ int fd = -1;
700 const int tos = IPTOS_LOWDELAY;
703 fd = socket(PF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
707 r = bind(fd, &addr.sa, sizeof(addr.in));
711 r = setsockopt(fd, SOL_SOCKET, SO_TIMESTAMP, &on, sizeof(on));
715 r = setsockopt(fd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
719 r = sd_event_add_io(m->event, &m->event_receive, fd, EPOLLIN, sntp_receive_response, m);
723 m->server_socket = fd;
729 static int manager_new(Manager **ret) {
730 _cleanup_manager_free_ Manager *m = NULL;
733 m = new0(Manager, 1);
737 r = sd_event_default(&m->event);
741 r = sntp_listen_setup(m);
745 r = sntp_clock_watch_setup(m);
755 static void manager_free(Manager *m) {
760 sd_event_unref(m->event);
764 int main(int argc, char *argv[]) {
765 _cleanup_manager_free_ Manager *m = NULL;
769 log_set_target(LOG_TARGET_AUTO);
770 log_parse_environment();
777 server = "216.239.32.15"; /* time1.google.com */
779 sd_notify(false, "READY=1");
781 r = sntp_server_connect(m, server);
785 sd_notifyf(false, "STATUS=Using Time Server: %s", server);
787 r = sd_event_loop(m->event);
792 return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;