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 ts_to_d(const struct timespec *ts) {
158 return ts->tv_sec + (1.0e-9 * ts->tv_nsec);
161 static double tv_to_d(const struct timeval *tv) {
162 return tv->tv_sec + (1.0e-6 * tv->tv_usec);
165 static double square(double d) {
169 static int sntp_send_request(Manager *m) {
170 struct ntp_msg ntpmsg = {};
171 struct sockaddr_in addr = {};
176 * "The client initializes the NTP message header, sends the request
177 * to the server, and strips the time of day from the Transmit
178 * Timestamp field of the reply. For this purpose, all the NTP
179 * header fields are set to 0, except the Mode, VN, and optional
180 * Transmit Timestamp fields."
182 ntpmsg.field = NTP_FIELD(0, 4, NTP_MODE_CLIENT);
185 * Set transmit timestamp, remember it; the server will send that back
186 * as the origin timestamp and we have an indication that this is the
187 * matching answer to our request.
189 * The actual value does not matter, We do not care about the correct
190 * NTP UINT_MAX fraction; we just pass the plain nanosecond value.
192 clock_gettime(CLOCK_MONOTONIC, &m->trans_time_mon);
193 clock_gettime(CLOCK_REALTIME, &m->trans_time);
194 ntpmsg.trans_time.sec = htobe32(m->trans_time.tv_sec + OFFSET_1900_1970);
195 ntpmsg.trans_time.frac = htobe32(m->trans_time.tv_nsec);
197 addr.sin_family = AF_INET;
198 addr.sin_port = htobe16(123);
199 addr.sin_addr.s_addr = inet_addr(m->server);
200 len = sendto(m->server_socket, &ntpmsg, sizeof(ntpmsg), MSG_DONTWAIT, &addr, sizeof(addr));
201 if (len == sizeof(ntpmsg)) {
203 log_debug("Sent NTP request to: %s", m->server);
205 log_debug("Sending NTP request to %s failed: %m", m->server);
207 /* re-arm timer with incresing timeout, in case the packets never arrive back */
208 if (m->retry_interval > 0) {
209 if (m->retry_interval < NTP_POLL_INTERVAL_MAX_SEC * USEC_PER_SEC)
210 m->retry_interval *= 2;
212 m->retry_interval = NTP_POLL_INTERVAL_MIN_SEC * USEC_PER_SEC;
213 r = sntp_arm_timer(m, m->retry_interval);
220 static int sntp_timer(sd_event_source *source, usec_t usec, void *userdata) {
221 Manager *m = userdata;
225 sntp_send_request(m);
229 static int sntp_arm_timer(Manager *m, usec_t next) {
233 assert(m->event_receive);
236 m->event_timer = sd_event_source_unref(m->event_timer);
240 if (m->event_timer) {
241 r = sd_event_source_set_time(m->event_timer, now(CLOCK_MONOTONIC) + next);
245 return sd_event_source_set_enabled(m->event_timer, SD_EVENT_ONESHOT);
248 r = sd_event_add_time(
252 now(CLOCK_MONOTONIC) + next, 0,
260 static int sntp_clock_watch(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
261 Manager *m = userdata;
264 assert(m->event_receive);
267 sntp_clock_watch_setup(m);
269 /* skip our own jumps */
276 log_info("System time changed. Resyncing.");
277 m->poll_resync = true;
278 sntp_send_request(m);
283 /* wake up when the system time changes underneath us */
284 static int sntp_clock_watch_setup(Manager *m) {
285 struct itimerspec its = { .it_value.tv_sec = TIME_T_MAX };
286 _cleanup_close_ int fd = -1;
288 sd_event_source *source;
292 assert(m->event_receive);
294 fd = timerfd_create(CLOCK_REALTIME, TFD_NONBLOCK|TFD_CLOEXEC);
296 log_error("Failed to create timerfd: %m");
300 if (timerfd_settime(fd, TFD_TIMER_ABSTIME|TFD_TIMER_CANCEL_ON_SET, &its, NULL) < 0) {
301 log_error("Failed to set up timerfd: %m");
305 e = sd_event_source_get_event(m->event_receive);
306 r = sd_event_add_io(e, &source, fd, EPOLLIN, sntp_clock_watch, m);
308 log_error("Failed to create clock watch event source: %s", strerror(-r));
312 sd_event_source_unref(m->event_clock_watch);
313 m->event_clock_watch = source;
315 if (m->clock_watch_fd >= 0)
316 close(m->clock_watch_fd);
317 m->clock_watch_fd = fd;
323 static int sntp_adjust_clock(Manager *m, double offset, int leap_sec) {
324 struct timex tmx = {};
328 * For small deltas, tell the kernel to gradually adjust the system
329 * clock to the NTP time, larger deltas are just directly set.
331 * Clear STA_UNSYNC, it will enable the kernel's 11-minute mode, which
332 * syncs the system time periodically to the hardware clock.
334 if (fabs(offset) < NTP_MAX_ADJUST) {
335 tmx.modes = ADJ_STATUS | ADJ_NANO | ADJ_OFFSET | ADJ_TIMECONST | ADJ_MAXERROR | ADJ_ESTERROR;
336 tmx.status = STA_PLL;
337 tmx.offset = offset * NSEC_PER_SEC;
338 tmx.constant = log2i(m->poll_interval_usec / USEC_PER_SEC) - 4;
341 log_debug(" adjust (slew): %+.3f sec\n", offset);
343 tmx.modes = ADJ_SETOFFSET | ADJ_NANO;
345 /* ADJ_NANO uses nanoseconds in the microseconds field */
346 tmx.time.tv_sec = (long)offset;
347 tmx.time.tv_usec = (offset - tmx.time.tv_sec) * NSEC_PER_SEC;
349 /* the kernel expects -0.3s as {-1, 7000.000.000} */
350 if (tmx.time.tv_usec < 0) {
351 tmx.time.tv_usec -= 1;
352 tmx.time.tv_usec += NSEC_PER_SEC;
356 log_debug(" adjust (jump): %+.3f sec\n", offset);
361 tmx.status |= STA_INS;
364 tmx.status |= STA_DEL;
368 r = clock_adjtime(CLOCK_REALTIME, &tmx);
372 log_debug(" status : %04i %s\n"
373 " time now : %li.%03lli\n"
375 " offset : %+.3f sec\n"
376 " freq offset : %+li (%i ppm)\n",
377 tmx.status, tmx.status & STA_UNSYNC ? "" : "sync",
378 tmx.time.tv_sec, tmx.time.tv_usec / NSEC_PER_MSEC,
380 (double)tmx.offset / NSEC_PER_SEC,
381 tmx.freq, abs(tmx.freq) / 65536);
386 static bool sntp_sample_spike_detection(Manager *m, double offset, double delay) {
387 unsigned int i, idx_cur, idx_new, idx_min;
393 /* ignore initial sample */
394 if (m->packet_count == 1)
397 /* store the current data in our samples array */
398 idx_cur = m->samples_idx;
399 idx_new = (idx_cur + 1) % ELEMENTSOF(m->samples);
400 m->samples_idx = idx_new;
401 m->samples[idx_new].offset = offset;
402 m->samples[idx_new].delay = delay;
404 /* calculate new jitter value from the RMS differences relative to the lowest delay sample */
405 jitter = m->samples_jitter;
406 for (idx_min = idx_cur, i = 0; i < ELEMENTSOF(m->samples); i++)
407 if (m->samples[i].delay > 0 && m->samples[i].delay < m->samples[idx_min].delay)
411 for (i = 0; i < ELEMENTSOF(m->samples); i++)
412 j += square(m->samples[i].offset - m->samples[idx_min].offset);
413 m->samples_jitter = sqrt(j / (ELEMENTSOF(m->samples) - 1));
415 /* ignore samples when resyncing */
419 /* always accept offset if we are farther off than the round-trip delay */
420 if (fabs(offset) > delay)
423 /* we need a few samples before looking at them */
424 if (m->packet_count < 4)
427 /* do not accept anything worse than the maximum possible error of the best sample */
428 if (fabs(offset) > m->samples[idx_min].delay)
431 /* compare the difference between the current offset to the previous offset and jitter */
432 return fabs(offset - m->samples[idx_cur].offset) > 3 * jitter;
435 static void sntp_adjust_poll(Manager *m, double offset, bool spike) {
436 if (m->poll_resync) {
437 m->poll_interval_usec = NTP_POLL_INTERVAL_MIN_SEC * USEC_PER_SEC;
438 m->poll_resync = false;
442 /* set to minimal poll interval */
443 if (!spike && fabs(offset) > NTP_ACCURACY_SEC) {
444 m->poll_interval_usec = NTP_POLL_INTERVAL_MIN_SEC * USEC_PER_SEC;
448 /* increase polling interval */
449 if (fabs(offset) < NTP_ACCURACY_SEC * 0.25) {
450 if (m->poll_interval_usec < NTP_POLL_INTERVAL_MAX_SEC * USEC_PER_SEC)
451 m->poll_interval_usec *= 2;
455 /* decrease polling interval */
456 if (spike || fabs(offset) > NTP_ACCURACY_SEC * 0.75) {
457 if (m->poll_interval_usec > NTP_POLL_INTERVAL_MIN_SEC * USEC_PER_SEC)
458 m->poll_interval_usec /= 2;
463 static int sntp_receive_response(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
464 Manager *m = userdata;
465 unsigned char buf[sizeof(struct ntp_msg)];
468 .iov_len = sizeof(buf),
471 struct cmsghdr cmsghdr;
472 uint8_t buf[CMSG_SPACE(sizeof(struct timeval))];
474 struct sockaddr_in server_addr;
475 struct msghdr msghdr = {
478 .msg_control = &control,
479 .msg_controllen = sizeof(control),
480 .msg_name = &server_addr,
481 .msg_namelen = sizeof(server_addr),
483 struct cmsghdr *cmsg;
484 struct timespec now_ts;
485 struct timeval *recv_time;
487 struct ntp_msg *ntpmsg;
488 double origin, receive, trans, dest;
489 double delay, offset;
494 if (revents & (EPOLLHUP|EPOLLERR)) {
495 log_debug("Server connection returned error. Closing.");
496 sntp_server_disconnect(m);
500 len = recvmsg(fd, &msghdr, MSG_DONTWAIT);
502 log_debug("Error receiving message. Disconnecting.");
506 if (iov.iov_len < sizeof(struct ntp_msg)) {
507 log_debug("Invalid response from server. Disconnecting.");
511 if (m->server_addr.sin_addr.s_addr != server_addr.sin_addr.s_addr) {
512 log_debug("Response from unknown server. Disconnecting.");
517 for (cmsg = CMSG_FIRSTHDR(&msghdr); cmsg; cmsg = CMSG_NXTHDR(&msghdr, cmsg)) {
518 if (cmsg->cmsg_level != SOL_SOCKET)
521 switch (cmsg->cmsg_type) {
523 recv_time = (struct timeval *) CMSG_DATA(cmsg);
528 log_debug("Invalid packet timestamp. Disconnecting.");
532 ntpmsg = iov.iov_base;
534 log_debug("Unexpected reply. Ignoring.");
538 /* check our "time cookie" (we just stored nanoseconds in the fraction field) */
539 if (be32toh(ntpmsg->origin_time.sec) != m->trans_time.tv_sec + OFFSET_1900_1970 ||
540 be32toh(ntpmsg->origin_time.frac) != m->trans_time.tv_nsec) {
541 log_debug("Invalid reply; not our transmit time. Ignoring.");
545 if (NTP_FIELD_LEAP(ntpmsg->field) == NTP_LEAP_NOTINSYNC) {
546 log_debug("Server is not synchronized. Disconnecting.");
550 if (NTP_FIELD_VERSION(ntpmsg->field) != 4) {
551 log_debug("Response NTPv%d. Disconnecting.", NTP_FIELD_VERSION(ntpmsg->field));
555 if (NTP_FIELD_MODE(ntpmsg->field) != NTP_MODE_SERVER) {
556 log_debug("Unsupported mode %d. Disconnecting.", NTP_FIELD_MODE(ntpmsg->field));
562 m->retry_interval = 0;
564 /* announce leap seconds */
565 if (NTP_FIELD_LEAP(ntpmsg->field) & NTP_LEAP_PLUSSEC)
567 else if (NTP_FIELD_LEAP(ntpmsg->field) & NTP_LEAP_MINUSSEC)
573 * "Timestamp Name ID When Generated
574 * ------------------------------------------------------------
575 * Originate Timestamp T1 time request sent by client
576 * Receive Timestamp T2 time request received by server
577 * Transmit Timestamp T3 time reply sent by server
578 * Destination Timestamp T4 time reply received by client
580 * The round-trip delay, d, and system clock offset, t, are defined as:
581 * d = (T4 - T1) - (T3 - T2) t = ((T2 - T1) + (T3 - T4)) / 2"
583 clock_gettime(CLOCK_MONOTONIC, &now_ts);
584 origin = tv_to_d(recv_time) - (ts_to_d(&now_ts) - ts_to_d(&m->trans_time_mon)) + OFFSET_1900_1970;
585 receive = ntp_ts_to_d(&ntpmsg->recv_time);
586 trans = ntp_ts_to_d(&ntpmsg->trans_time);
587 dest = tv_to_d(recv_time) + OFFSET_1900_1970;
589 offset = ((receive - origin) + (trans - dest)) / 2;
590 delay = (dest - origin) - (trans - receive);
592 spike = sntp_sample_spike_detection(m, offset, delay);
594 sntp_adjust_poll(m, offset, spike);
596 log_debug("NTP response:\n"
601 " precision : %.6f sec (%d)\n"
602 " reference : %.4s\n"
607 " offset : %+.3f sec\n"
608 " delay : %+.3f sec\n"
609 " packet count : %"PRIu64"\n"
611 " poll interval: %llu\n",
612 NTP_FIELD_LEAP(ntpmsg->field),
613 NTP_FIELD_VERSION(ntpmsg->field),
614 NTP_FIELD_MODE(ntpmsg->field),
616 exp2(ntpmsg->precision), ntpmsg->precision,
617 ntpmsg->stratum == 1 ? ntpmsg->refid : "n/a",
618 origin - OFFSET_1900_1970,
619 receive - OFFSET_1900_1970,
620 trans - OFFSET_1900_1970,
621 dest - OFFSET_1900_1970,
624 m->samples_jitter, spike ? " spike" : "",
625 m->poll_interval_usec / USEC_PER_SEC);
627 log_info("%s: interval/delta/delay/jitter %llu/%+.3f/%.3f/%.3f%s",
628 m->server, m->poll_interval_usec / USEC_PER_SEC, offset, delay, m->samples_jitter, spike ? " (ignored)" : "");
631 r = sntp_adjust_clock(m, offset, leap_sec);
633 log_error("Failed to call clock_adjtime(): %m");
636 r = sntp_arm_timer(m, m->poll_interval_usec);
643 static int sntp_server_connect(Manager *m, const char *server) {
644 _cleanup_free_ char *s = NULL;
648 assert(m->server_socket >= 0);
658 zero(m->server_addr);
659 m->server_addr.sin_family = AF_INET;
660 m->server_addr.sin_addr.s_addr = inet_addr(server);
662 m->poll_interval_usec = NTP_POLL_INTERVAL_MIN_SEC * USEC_PER_SEC;
664 return sntp_send_request(m);
667 static void sntp_server_disconnect(Manager *m) {
671 m->event_timer = sd_event_source_unref(m->event_timer);
673 m->event_clock_watch = sd_event_source_unref(m->event_clock_watch);
674 if (m->clock_watch_fd > 0)
675 close(m->clock_watch_fd);
676 m->clock_watch_fd = -1;
678 m->event_receive = sd_event_source_unref(m->event_receive);
679 if (m->server_socket > 0)
680 close(m->server_socket);
681 m->server_socket = -1;
683 zero(m->server_addr);
688 static int sntp_listen_setup(Manager *m) {
689 _cleanup_close_ int fd = -1;
690 struct sockaddr_in addr;
692 const int tos = IPTOS_LOWDELAY;
695 fd = socket(PF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
700 addr.sin_family = AF_INET;
701 r = bind(fd, (struct sockaddr *)&addr, sizeof(addr));
705 r = setsockopt(fd, SOL_SOCKET, SO_TIMESTAMP, &on, sizeof(on));
709 r = setsockopt(fd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
713 r = sd_event_add_io(m->event, &m->event_receive, fd, EPOLLIN, sntp_receive_response, m);
717 m->server_socket = fd;
723 static int manager_new(Manager **ret) {
724 _cleanup_manager_free_ Manager *m = NULL;
727 m = new0(Manager, 1);
731 r = sd_event_default(&m->event);
735 r = sntp_listen_setup(m);
739 r = sntp_clock_watch_setup(m);
749 static void manager_free(Manager *m) {
754 sd_event_unref(m->event);
758 int main(int argc, char *argv[]) {
759 _cleanup_manager_free_ Manager *m = NULL;
763 log_set_target(LOG_TARGET_AUTO);
764 log_parse_environment();
771 server = "216.239.32.15"; /* time1.google.com */
776 r = sntp_server_connect(m, server);
781 "STATUS=Using time server: %s", server);
783 r = sd_event_loop(m->event);
788 return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;