]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/timesync/timesyncd-manager.c
util-lib: split our string related calls from util.[ch] into its own file string...
[thirdparty/systemd.git] / src / timesync / timesyncd-manager.c
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 /***
4 This file is part of systemd.
5
6 Copyright 2014 Kay Sievers, Lennart Poettering
7
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.
12
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.
17
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/>.
20 ***/
21
22 #include <errno.h>
23 #include <math.h>
24 #include <netinet/in.h>
25 #include <netinet/ip.h>
26 #include <resolv.h>
27 #include <stdlib.h>
28 #include <sys/socket.h>
29 #include <sys/timerfd.h>
30 #include <sys/timex.h>
31 #include <sys/types.h>
32 #include <time.h>
33
34 #include "sd-daemon.h"
35
36 #include "list.h"
37 #include "log.h"
38 #include "missing.h"
39 #include "network-util.h"
40 #include "ratelimit.h"
41 #include "socket-util.h"
42 #include "sparse-endian.h"
43 #include "string-util.h"
44 #include "strv.h"
45 #include "time-util.h"
46 #include "timesyncd-conf.h"
47 #include "util.h"
48 #include "timesyncd-manager.h"
49
50 #ifndef ADJ_SETOFFSET
51 #define ADJ_SETOFFSET 0x0100 /* add 'time' to current time */
52 #endif
53
54 /* expected accuracy of time synchronization; used to adjust the poll interval */
55 #define NTP_ACCURACY_SEC 0.2
56
57 /*
58 * "A client MUST NOT under any conditions use a poll interval less
59 * than 15 seconds."
60 */
61 #define NTP_POLL_INTERVAL_MIN_SEC 32
62 #define NTP_POLL_INTERVAL_MAX_SEC 2048
63
64 /*
65 * Maximum delta in seconds which the system clock is gradually adjusted
66 * (slew) to approach the network time. Deltas larger that this are set by
67 * letting the system time jump. The kernel's limit for adjtime is 0.5s.
68 */
69 #define NTP_MAX_ADJUST 0.4
70
71 /* NTP protocol, packet header */
72 #define NTP_LEAP_PLUSSEC 1
73 #define NTP_LEAP_MINUSSEC 2
74 #define NTP_LEAP_NOTINSYNC 3
75 #define NTP_MODE_CLIENT 3
76 #define NTP_MODE_SERVER 4
77 #define NTP_FIELD_LEAP(f) (((f) >> 6) & 3)
78 #define NTP_FIELD_VERSION(f) (((f) >> 3) & 7)
79 #define NTP_FIELD_MODE(f) ((f) & 7)
80 #define NTP_FIELD(l, v, m) (((l) << 6) | ((v) << 3) | (m))
81
82 /* Maximum acceptable root distance in seconds. */
83 #define NTP_MAX_ROOT_DISTANCE 5.0
84
85 /* Maximum number of missed replies before selecting another source. */
86 #define NTP_MAX_MISSED_REPLIES 2
87
88 /*
89 * "NTP timestamps are represented as a 64-bit unsigned fixed-point number,
90 * in seconds relative to 0h on 1 January 1900."
91 */
92 #define OFFSET_1900_1970 UINT64_C(2208988800)
93
94 #define RETRY_USEC (30*USEC_PER_SEC)
95 #define RATELIMIT_INTERVAL_USEC (10*USEC_PER_SEC)
96 #define RATELIMIT_BURST 10
97
98 #define TIMEOUT_USEC (10*USEC_PER_SEC)
99
100 struct ntp_ts {
101 be32_t sec;
102 be32_t frac;
103 } _packed_;
104
105 struct ntp_ts_short {
106 be16_t sec;
107 be16_t frac;
108 } _packed_;
109
110 struct ntp_msg {
111 uint8_t field;
112 uint8_t stratum;
113 int8_t poll;
114 int8_t precision;
115 struct ntp_ts_short root_delay;
116 struct ntp_ts_short root_dispersion;
117 char refid[4];
118 struct ntp_ts reference_time;
119 struct ntp_ts origin_time;
120 struct ntp_ts recv_time;
121 struct ntp_ts trans_time;
122 } _packed_;
123
124 static int manager_arm_timer(Manager *m, usec_t next);
125 static int manager_clock_watch_setup(Manager *m);
126 static int manager_listen_setup(Manager *m);
127 static void manager_listen_stop(Manager *m);
128
129 static double ntp_ts_short_to_d(const struct ntp_ts_short *ts) {
130 return be16toh(ts->sec) + (be16toh(ts->frac) / 65536.0);
131 }
132
133 static double ntp_ts_to_d(const struct ntp_ts *ts) {
134 return be32toh(ts->sec) + ((double)be32toh(ts->frac) / UINT_MAX);
135 }
136
137 static double ts_to_d(const struct timespec *ts) {
138 return ts->tv_sec + (1.0e-9 * ts->tv_nsec);
139 }
140
141 static int manager_timeout(sd_event_source *source, usec_t usec, void *userdata) {
142 _cleanup_free_ char *pretty = NULL;
143 Manager *m = userdata;
144
145 assert(m);
146 assert(m->current_server_name);
147 assert(m->current_server_address);
148
149 server_address_pretty(m->current_server_address, &pretty);
150 log_info("Timed out waiting for reply from %s (%s).", strna(pretty), m->current_server_name->string);
151
152 return manager_connect(m);
153 }
154
155 static int manager_send_request(Manager *m) {
156 _cleanup_free_ char *pretty = NULL;
157 struct ntp_msg ntpmsg = {
158 /*
159 * "The client initializes the NTP message header, sends the request
160 * to the server, and strips the time of day from the Transmit
161 * Timestamp field of the reply. For this purpose, all the NTP
162 * header fields are set to 0, except the Mode, VN, and optional
163 * Transmit Timestamp fields."
164 */
165 .field = NTP_FIELD(0, 4, NTP_MODE_CLIENT),
166 };
167 ssize_t len;
168 int r;
169
170 assert(m);
171 assert(m->current_server_name);
172 assert(m->current_server_address);
173
174 m->event_timeout = sd_event_source_unref(m->event_timeout);
175
176 r = manager_listen_setup(m);
177 if (r < 0)
178 return log_warning_errno(r, "Failed to setup connection socket: %m");
179
180 /*
181 * Set transmit timestamp, remember it; the server will send that back
182 * as the origin timestamp and we have an indication that this is the
183 * matching answer to our request.
184 *
185 * The actual value does not matter, We do not care about the correct
186 * NTP UINT_MAX fraction; we just pass the plain nanosecond value.
187 */
188 assert_se(clock_gettime(clock_boottime_or_monotonic(), &m->trans_time_mon) >= 0);
189 assert_se(clock_gettime(CLOCK_REALTIME, &m->trans_time) >= 0);
190 ntpmsg.trans_time.sec = htobe32(m->trans_time.tv_sec + OFFSET_1900_1970);
191 ntpmsg.trans_time.frac = htobe32(m->trans_time.tv_nsec);
192
193 server_address_pretty(m->current_server_address, &pretty);
194
195 len = sendto(m->server_socket, &ntpmsg, sizeof(ntpmsg), MSG_DONTWAIT, &m->current_server_address->sockaddr.sa, m->current_server_address->socklen);
196 if (len == sizeof(ntpmsg)) {
197 m->pending = true;
198 log_debug("Sent NTP request to %s (%s).", strna(pretty), m->current_server_name->string);
199 } else {
200 log_debug_errno(errno, "Sending NTP request to %s (%s) failed: %m", strna(pretty), m->current_server_name->string);
201 return manager_connect(m);
202 }
203
204 /* re-arm timer with increasing timeout, in case the packets never arrive back */
205 if (m->retry_interval > 0) {
206 if (m->retry_interval < NTP_POLL_INTERVAL_MAX_SEC * USEC_PER_SEC)
207 m->retry_interval *= 2;
208 } else
209 m->retry_interval = NTP_POLL_INTERVAL_MIN_SEC * USEC_PER_SEC;
210
211 r = manager_arm_timer(m, m->retry_interval);
212 if (r < 0)
213 return log_error_errno(r, "Failed to rearm timer: %m");
214
215 m->missed_replies++;
216 if (m->missed_replies > NTP_MAX_MISSED_REPLIES) {
217 r = sd_event_add_time(
218 m->event,
219 &m->event_timeout,
220 clock_boottime_or_monotonic(),
221 now(clock_boottime_or_monotonic()) + TIMEOUT_USEC, 0,
222 manager_timeout, m);
223 if (r < 0)
224 return log_error_errno(r, "Failed to arm timeout timer: %m");
225 }
226
227 return 0;
228 }
229
230 static int manager_timer(sd_event_source *source, usec_t usec, void *userdata) {
231 Manager *m = userdata;
232
233 assert(m);
234
235 return manager_send_request(m);
236 }
237
238 static int manager_arm_timer(Manager *m, usec_t next) {
239 int r;
240
241 assert(m);
242
243 if (next == 0) {
244 m->event_timer = sd_event_source_unref(m->event_timer);
245 return 0;
246 }
247
248 if (m->event_timer) {
249 r = sd_event_source_set_time(m->event_timer, now(clock_boottime_or_monotonic()) + next);
250 if (r < 0)
251 return r;
252
253 return sd_event_source_set_enabled(m->event_timer, SD_EVENT_ONESHOT);
254 }
255
256 return sd_event_add_time(
257 m->event,
258 &m->event_timer,
259 clock_boottime_or_monotonic(),
260 now(clock_boottime_or_monotonic()) + next, 0,
261 manager_timer, m);
262 }
263
264 static int manager_clock_watch(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
265 Manager *m = userdata;
266
267 assert(m);
268
269 /* rearm timer */
270 manager_clock_watch_setup(m);
271
272 /* skip our own jumps */
273 if (m->jumped) {
274 m->jumped = false;
275 return 0;
276 }
277
278 /* resync */
279 log_debug("System time changed. Resyncing.");
280 m->poll_resync = true;
281
282 return manager_send_request(m);
283 }
284
285 /* wake up when the system time changes underneath us */
286 static int manager_clock_watch_setup(Manager *m) {
287
288 struct itimerspec its = {
289 .it_value.tv_sec = TIME_T_MAX
290 };
291
292 int r;
293
294 assert(m);
295
296 m->event_clock_watch = sd_event_source_unref(m->event_clock_watch);
297 safe_close(m->clock_watch_fd);
298
299 m->clock_watch_fd = timerfd_create(CLOCK_REALTIME, TFD_NONBLOCK|TFD_CLOEXEC);
300 if (m->clock_watch_fd < 0)
301 return log_error_errno(errno, "Failed to create timerfd: %m");
302
303 if (timerfd_settime(m->clock_watch_fd, TFD_TIMER_ABSTIME|TFD_TIMER_CANCEL_ON_SET, &its, NULL) < 0)
304 return log_error_errno(errno, "Failed to set up timerfd: %m");
305
306 r = sd_event_add_io(m->event, &m->event_clock_watch, m->clock_watch_fd, EPOLLIN, manager_clock_watch, m);
307 if (r < 0)
308 return log_error_errno(r, "Failed to create clock watch event source: %m");
309
310 return 0;
311 }
312
313 static int manager_adjust_clock(Manager *m, double offset, int leap_sec) {
314 struct timex tmx = {};
315 int r;
316
317 assert(m);
318
319 /*
320 * For small deltas, tell the kernel to gradually adjust the system
321 * clock to the NTP time, larger deltas are just directly set.
322 */
323 if (fabs(offset) < NTP_MAX_ADJUST) {
324 tmx.modes = ADJ_STATUS | ADJ_NANO | ADJ_OFFSET | ADJ_TIMECONST | ADJ_MAXERROR | ADJ_ESTERROR;
325 tmx.status = STA_PLL;
326 tmx.offset = offset * NSEC_PER_SEC;
327 tmx.constant = log2i(m->poll_interval_usec / USEC_PER_SEC) - 4;
328 tmx.maxerror = 0;
329 tmx.esterror = 0;
330 log_debug(" adjust (slew): %+.3f sec", offset);
331 } else {
332 tmx.modes = ADJ_STATUS | ADJ_NANO | ADJ_SETOFFSET;
333
334 /* ADJ_NANO uses nanoseconds in the microseconds field */
335 tmx.time.tv_sec = (long)offset;
336 tmx.time.tv_usec = (offset - tmx.time.tv_sec) * NSEC_PER_SEC;
337
338 /* the kernel expects -0.3s as {-1, 7000.000.000} */
339 if (tmx.time.tv_usec < 0) {
340 tmx.time.tv_sec -= 1;
341 tmx.time.tv_usec += NSEC_PER_SEC;
342 }
343
344 m->jumped = true;
345 log_debug(" adjust (jump): %+.3f sec", offset);
346 }
347
348 /*
349 * An unset STA_UNSYNC will enable the kernel's 11-minute mode,
350 * which syncs the system time periodically to the RTC.
351 *
352 * In case the RTC runs in local time, never touch the RTC,
353 * we have no way to properly handle daylight saving changes and
354 * mobile devices moving between time zones.
355 */
356 if (m->rtc_local_time)
357 tmx.status |= STA_UNSYNC;
358
359 switch (leap_sec) {
360 case 1:
361 tmx.status |= STA_INS;
362 break;
363 case -1:
364 tmx.status |= STA_DEL;
365 break;
366 }
367
368 r = clock_adjtime(CLOCK_REALTIME, &tmx);
369 if (r < 0)
370 return r;
371
372 touch("/var/lib/systemd/clock");
373
374 m->drift_ppm = tmx.freq / 65536;
375
376 log_debug(" status : %04i %s\n"
377 " time now : %li.%03llu\n"
378 " constant : %li\n"
379 " offset : %+.3f sec\n"
380 " freq offset : %+li (%i ppm)\n",
381 tmx.status, tmx.status & STA_UNSYNC ? "unsync" : "sync",
382 tmx.time.tv_sec, (unsigned long long) (tmx.time.tv_usec / NSEC_PER_MSEC),
383 tmx.constant,
384 (double)tmx.offset / NSEC_PER_SEC,
385 tmx.freq, m->drift_ppm);
386
387 return 0;
388 }
389
390 static bool manager_sample_spike_detection(Manager *m, double offset, double delay) {
391 unsigned int i, idx_cur, idx_new, idx_min;
392 double jitter;
393 double j;
394
395 assert(m);
396
397 m->packet_count++;
398
399 /* ignore initial sample */
400 if (m->packet_count == 1)
401 return false;
402
403 /* store the current data in our samples array */
404 idx_cur = m->samples_idx;
405 idx_new = (idx_cur + 1) % ELEMENTSOF(m->samples);
406 m->samples_idx = idx_new;
407 m->samples[idx_new].offset = offset;
408 m->samples[idx_new].delay = delay;
409
410 /* calculate new jitter value from the RMS differences relative to the lowest delay sample */
411 jitter = m->samples_jitter;
412 for (idx_min = idx_cur, i = 0; i < ELEMENTSOF(m->samples); i++)
413 if (m->samples[i].delay > 0 && m->samples[i].delay < m->samples[idx_min].delay)
414 idx_min = i;
415
416 j = 0;
417 for (i = 0; i < ELEMENTSOF(m->samples); i++)
418 j += pow(m->samples[i].offset - m->samples[idx_min].offset, 2);
419 m->samples_jitter = sqrt(j / (ELEMENTSOF(m->samples) - 1));
420
421 /* ignore samples when resyncing */
422 if (m->poll_resync)
423 return false;
424
425 /* always accept offset if we are farther off than the round-trip delay */
426 if (fabs(offset) > delay)
427 return false;
428
429 /* we need a few samples before looking at them */
430 if (m->packet_count < 4)
431 return false;
432
433 /* do not accept anything worse than the maximum possible error of the best sample */
434 if (fabs(offset) > m->samples[idx_min].delay)
435 return true;
436
437 /* compare the difference between the current offset to the previous offset and jitter */
438 return fabs(offset - m->samples[idx_cur].offset) > 3 * jitter;
439 }
440
441 static void manager_adjust_poll(Manager *m, double offset, bool spike) {
442 assert(m);
443
444 if (m->poll_resync) {
445 m->poll_interval_usec = NTP_POLL_INTERVAL_MIN_SEC * USEC_PER_SEC;
446 m->poll_resync = false;
447 return;
448 }
449
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;
453 return;
454 }
455
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;
460 return;
461 }
462
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;
467 return;
468 }
469 }
470
471 static int manager_receive_response(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
472 Manager *m = userdata;
473 struct ntp_msg ntpmsg;
474
475 struct iovec iov = {
476 .iov_base = &ntpmsg,
477 .iov_len = sizeof(ntpmsg),
478 };
479 union {
480 struct cmsghdr cmsghdr;
481 uint8_t buf[CMSG_SPACE(sizeof(struct timeval))];
482 } control;
483 union sockaddr_union server_addr;
484 struct msghdr msghdr = {
485 .msg_iov = &iov,
486 .msg_iovlen = 1,
487 .msg_control = &control,
488 .msg_controllen = sizeof(control),
489 .msg_name = &server_addr,
490 .msg_namelen = sizeof(server_addr),
491 };
492 struct cmsghdr *cmsg;
493 struct timespec *recv_time;
494 ssize_t len;
495 double origin, receive, trans, dest;
496 double delay, offset;
497 double root_distance;
498 bool spike;
499 int leap_sec;
500 int r;
501
502 assert(source);
503 assert(m);
504
505 if (revents & (EPOLLHUP|EPOLLERR)) {
506 log_warning("Server connection returned error.");
507 return manager_connect(m);
508 }
509
510 len = recvmsg(fd, &msghdr, MSG_DONTWAIT);
511 if (len < 0) {
512 if (errno == EAGAIN)
513 return 0;
514
515 log_warning("Error receiving message. Disconnecting.");
516 return manager_connect(m);
517 }
518
519 /* Too short or too long packet? */
520 if (iov.iov_len < sizeof(struct ntp_msg) || (msghdr.msg_flags & MSG_TRUNC)) {
521 log_warning("Invalid response from server. Disconnecting.");
522 return manager_connect(m);
523 }
524
525 if (!m->current_server_name ||
526 !m->current_server_address ||
527 !sockaddr_equal(&server_addr, &m->current_server_address->sockaddr)) {
528 log_debug("Response from unknown server.");
529 return 0;
530 }
531
532 recv_time = NULL;
533 CMSG_FOREACH(cmsg, &msghdr) {
534 if (cmsg->cmsg_level != SOL_SOCKET)
535 continue;
536
537 switch (cmsg->cmsg_type) {
538 case SCM_TIMESTAMPNS:
539 recv_time = (struct timespec *) CMSG_DATA(cmsg);
540 break;
541 }
542 }
543 if (!recv_time) {
544 log_error("Invalid packet timestamp.");
545 return -EINVAL;
546 }
547
548 if (!m->pending) {
549 log_debug("Unexpected reply. Ignoring.");
550 return 0;
551 }
552
553 m->missed_replies = 0;
554
555 /* check our "time cookie" (we just stored nanoseconds in the fraction field) */
556 if (be32toh(ntpmsg.origin_time.sec) != m->trans_time.tv_sec + OFFSET_1900_1970 ||
557 be32toh(ntpmsg.origin_time.frac) != m->trans_time.tv_nsec) {
558 log_debug("Invalid reply; not our transmit time. Ignoring.");
559 return 0;
560 }
561
562 m->event_timeout = sd_event_source_unref(m->event_timeout);
563
564 if (be32toh(ntpmsg.recv_time.sec) < TIME_EPOCH + OFFSET_1900_1970 ||
565 be32toh(ntpmsg.trans_time.sec) < TIME_EPOCH + OFFSET_1900_1970) {
566 log_debug("Invalid reply, returned times before epoch. Ignoring.");
567 return manager_connect(m);
568 }
569
570 if (NTP_FIELD_LEAP(ntpmsg.field) == NTP_LEAP_NOTINSYNC ||
571 ntpmsg.stratum == 0 || ntpmsg.stratum >= 16) {
572 log_debug("Server is not synchronized. Disconnecting.");
573 return manager_connect(m);
574 }
575
576 if (!IN_SET(NTP_FIELD_VERSION(ntpmsg.field), 3, 4)) {
577 log_debug("Response NTPv%d. Disconnecting.", NTP_FIELD_VERSION(ntpmsg.field));
578 return manager_connect(m);
579 }
580
581 if (NTP_FIELD_MODE(ntpmsg.field) != NTP_MODE_SERVER) {
582 log_debug("Unsupported mode %d. Disconnecting.", NTP_FIELD_MODE(ntpmsg.field));
583 return manager_connect(m);
584 }
585
586 root_distance = ntp_ts_short_to_d(&ntpmsg.root_delay) / 2 + ntp_ts_short_to_d(&ntpmsg.root_dispersion);
587 if (root_distance > NTP_MAX_ROOT_DISTANCE) {
588 log_debug("Server has too large root distance. Disconnecting.");
589 return manager_connect(m);
590 }
591
592 /* valid packet */
593 m->pending = false;
594 m->retry_interval = 0;
595
596 /* Stop listening */
597 manager_listen_stop(m);
598
599 /* announce leap seconds */
600 if (NTP_FIELD_LEAP(ntpmsg.field) & NTP_LEAP_PLUSSEC)
601 leap_sec = 1;
602 else if (NTP_FIELD_LEAP(ntpmsg.field) & NTP_LEAP_MINUSSEC)
603 leap_sec = -1;
604 else
605 leap_sec = 0;
606
607 /*
608 * "Timestamp Name ID When Generated
609 * ------------------------------------------------------------
610 * Originate Timestamp T1 time request sent by client
611 * Receive Timestamp T2 time request received by server
612 * Transmit Timestamp T3 time reply sent by server
613 * Destination Timestamp T4 time reply received by client
614 *
615 * The round-trip delay, d, and system clock offset, t, are defined as:
616 * d = (T4 - T1) - (T3 - T2) t = ((T2 - T1) + (T3 - T4)) / 2"
617 */
618 origin = ts_to_d(&m->trans_time) + OFFSET_1900_1970;
619 receive = ntp_ts_to_d(&ntpmsg.recv_time);
620 trans = ntp_ts_to_d(&ntpmsg.trans_time);
621 dest = ts_to_d(recv_time) + OFFSET_1900_1970;
622
623 offset = ((receive - origin) + (trans - dest)) / 2;
624 delay = (dest - origin) - (trans - receive);
625
626 spike = manager_sample_spike_detection(m, offset, delay);
627
628 manager_adjust_poll(m, offset, spike);
629
630 log_debug("NTP response:\n"
631 " leap : %u\n"
632 " version : %u\n"
633 " mode : %u\n"
634 " stratum : %u\n"
635 " precision : %.6f sec (%d)\n"
636 " root distance: %.6f sec\n"
637 " reference : %.4s\n"
638 " origin : %.3f\n"
639 " receive : %.3f\n"
640 " transmit : %.3f\n"
641 " dest : %.3f\n"
642 " offset : %+.3f sec\n"
643 " delay : %+.3f sec\n"
644 " packet count : %"PRIu64"\n"
645 " jitter : %.3f%s\n"
646 " poll interval: " USEC_FMT "\n",
647 NTP_FIELD_LEAP(ntpmsg.field),
648 NTP_FIELD_VERSION(ntpmsg.field),
649 NTP_FIELD_MODE(ntpmsg.field),
650 ntpmsg.stratum,
651 exp2(ntpmsg.precision), ntpmsg.precision,
652 root_distance,
653 ntpmsg.stratum == 1 ? ntpmsg.refid : "n/a",
654 origin - OFFSET_1900_1970,
655 receive - OFFSET_1900_1970,
656 trans - OFFSET_1900_1970,
657 dest - OFFSET_1900_1970,
658 offset, delay,
659 m->packet_count,
660 m->samples_jitter, spike ? " spike" : "",
661 m->poll_interval_usec / USEC_PER_SEC);
662
663 if (!spike) {
664 m->sync = true;
665 r = manager_adjust_clock(m, offset, leap_sec);
666 if (r < 0)
667 log_error_errno(errno, "Failed to call clock_adjtime(): %m");
668 }
669
670 log_debug("interval/delta/delay/jitter/drift " USEC_FMT "s/%+.3fs/%.3fs/%.3fs/%+ippm%s",
671 m->poll_interval_usec / USEC_PER_SEC, offset, delay, m->samples_jitter, m->drift_ppm,
672 spike ? " (ignored)" : "");
673
674 if (!m->good) {
675 _cleanup_free_ char *pretty = NULL;
676
677 m->good = true;
678
679 server_address_pretty(m->current_server_address, &pretty);
680 log_info("Synchronized to time server %s (%s).", strna(pretty), m->current_server_name->string);
681 sd_notifyf(false, "STATUS=Synchronized to time server %s (%s).", strna(pretty), m->current_server_name->string);
682 }
683
684 r = manager_arm_timer(m, m->poll_interval_usec);
685 if (r < 0)
686 return log_error_errno(r, "Failed to rearm timer: %m");
687
688 return 0;
689 }
690
691 static int manager_listen_setup(Manager *m) {
692 union sockaddr_union addr = {};
693 static const int tos = IPTOS_LOWDELAY;
694 static const int on = 1;
695 int r;
696
697 assert(m);
698
699 if (m->server_socket >= 0)
700 return 0;
701
702 assert(!m->event_receive);
703 assert(m->current_server_address);
704
705 addr.sa.sa_family = m->current_server_address->sockaddr.sa.sa_family;
706
707 m->server_socket = socket(addr.sa.sa_family, SOCK_DGRAM | SOCK_CLOEXEC, 0);
708 if (m->server_socket < 0)
709 return -errno;
710
711 r = bind(m->server_socket, &addr.sa, m->current_server_address->socklen);
712 if (r < 0)
713 return -errno;
714
715 r = setsockopt(m->server_socket, SOL_SOCKET, SO_TIMESTAMPNS, &on, sizeof(on));
716 if (r < 0)
717 return -errno;
718
719 (void) setsockopt(m->server_socket, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
720
721 return sd_event_add_io(m->event, &m->event_receive, m->server_socket, EPOLLIN, manager_receive_response, m);
722 }
723
724 static void manager_listen_stop(Manager *m) {
725 assert(m);
726
727 m->event_receive = sd_event_source_unref(m->event_receive);
728 m->server_socket = safe_close(m->server_socket);
729 }
730
731 static int manager_begin(Manager *m) {
732 _cleanup_free_ char *pretty = NULL;
733 int r;
734
735 assert(m);
736 assert_return(m->current_server_name, -EHOSTUNREACH);
737 assert_return(m->current_server_address, -EHOSTUNREACH);
738
739 m->good = false;
740 m->missed_replies = NTP_MAX_MISSED_REPLIES;
741 if (m->poll_interval_usec == 0)
742 m->poll_interval_usec = NTP_POLL_INTERVAL_MIN_SEC * USEC_PER_SEC;
743
744 server_address_pretty(m->current_server_address, &pretty);
745 log_debug("Connecting to time server %s (%s).", strna(pretty), m->current_server_name->string);
746 sd_notifyf(false, "STATUS=Connecting to time server %s (%s).", strna(pretty), m->current_server_name->string);
747
748 r = manager_clock_watch_setup(m);
749 if (r < 0)
750 return r;
751
752 return manager_send_request(m);
753 }
754
755 void manager_set_server_name(Manager *m, ServerName *n) {
756 assert(m);
757
758 if (m->current_server_name == n)
759 return;
760
761 m->current_server_name = n;
762 m->current_server_address = NULL;
763
764 manager_disconnect(m);
765
766 if (n)
767 log_debug("Selected server %s.", n->string);
768 }
769
770 void manager_set_server_address(Manager *m, ServerAddress *a) {
771 assert(m);
772
773 if (m->current_server_address == a)
774 return;
775
776 m->current_server_address = a;
777 /* If a is NULL, we are just clearing the address, without
778 * changing the name. Keep the existing name in that case. */
779 if (a)
780 m->current_server_name = a->name;
781
782 manager_disconnect(m);
783
784 if (a) {
785 _cleanup_free_ char *pretty = NULL;
786 server_address_pretty(a, &pretty);
787 log_debug("Selected address %s of server %s.", strna(pretty), a->name->string);
788 }
789 }
790
791 static int manager_resolve_handler(sd_resolve_query *q, int ret, const struct addrinfo *ai, void *userdata) {
792 Manager *m = userdata;
793 int r;
794
795 assert(q);
796 assert(m);
797 assert(m->current_server_name);
798
799 m->resolve_query = sd_resolve_query_unref(m->resolve_query);
800
801 if (ret != 0) {
802 log_debug("Failed to resolve %s: %s", m->current_server_name->string, gai_strerror(ret));
803
804 /* Try next host */
805 return manager_connect(m);
806 }
807
808 for (; ai; ai = ai->ai_next) {
809 _cleanup_free_ char *pretty = NULL;
810 ServerAddress *a;
811
812 assert(ai->ai_addr);
813 assert(ai->ai_addrlen >= offsetof(struct sockaddr, sa_data));
814
815 if (!IN_SET(ai->ai_addr->sa_family, AF_INET, AF_INET6)) {
816 log_warning("Unsuitable address protocol for %s", m->current_server_name->string);
817 continue;
818 }
819
820 r = server_address_new(m->current_server_name, &a, (const union sockaddr_union*) ai->ai_addr, ai->ai_addrlen);
821 if (r < 0)
822 return log_error_errno(r, "Failed to add server address: %m");
823
824 server_address_pretty(a, &pretty);
825 log_debug("Resolved address %s for %s.", pretty, m->current_server_name->string);
826 }
827
828 if (!m->current_server_name->addresses) {
829 log_error("Failed to find suitable address for host %s.", m->current_server_name->string);
830
831 /* Try next host */
832 return manager_connect(m);
833 }
834
835 manager_set_server_address(m, m->current_server_name->addresses);
836
837 return manager_begin(m);
838 }
839
840 static int manager_retry_connect(sd_event_source *source, usec_t usec, void *userdata) {
841 Manager *m = userdata;
842
843 assert(m);
844
845 return manager_connect(m);
846 }
847
848 int manager_connect(Manager *m) {
849 int r;
850
851 assert(m);
852
853 manager_disconnect(m);
854
855 m->event_retry = sd_event_source_unref(m->event_retry);
856 if (!ratelimit_test(&m->ratelimit)) {
857 log_debug("Slowing down attempts to contact servers.");
858
859 r = sd_event_add_time(m->event, &m->event_retry, clock_boottime_or_monotonic(), now(clock_boottime_or_monotonic()) + RETRY_USEC, 0, manager_retry_connect, m);
860 if (r < 0)
861 return log_error_errno(r, "Failed to create retry timer: %m");
862
863 return 0;
864 }
865
866 /* If we already are operating on some address, switch to the
867 * next one. */
868 if (m->current_server_address && m->current_server_address->addresses_next)
869 manager_set_server_address(m, m->current_server_address->addresses_next);
870 else {
871 struct addrinfo hints = {
872 .ai_flags = AI_NUMERICSERV|AI_ADDRCONFIG,
873 .ai_socktype = SOCK_DGRAM,
874 };
875
876 /* Hmm, we are through all addresses, let's look for the next host instead */
877 if (m->current_server_name && m->current_server_name->names_next)
878 manager_set_server_name(m, m->current_server_name->names_next);
879 else {
880 ServerName *f;
881 bool restart = true;
882
883 /* Our current server name list is exhausted,
884 * let's find the next one to iterate. First
885 * we try the system list, then the link list.
886 * After having processed the link list we
887 * jump back to the system list. However, if
888 * both lists are empty, we change to the
889 * fallback list. */
890 if (!m->current_server_name || m->current_server_name->type == SERVER_LINK) {
891 f = m->system_servers;
892 if (!f)
893 f = m->link_servers;
894 } else {
895 f = m->link_servers;
896 if (!f)
897 f = m->system_servers;
898 else
899 restart = false;
900 }
901
902 if (!f)
903 f = m->fallback_servers;
904
905 if (!f) {
906 manager_set_server_name(m, NULL);
907 log_debug("No server found.");
908 return 0;
909 }
910
911 if (restart && !m->exhausted_servers && m->poll_interval_usec) {
912 log_debug("Waiting after exhausting servers.");
913 r = sd_event_add_time(m->event, &m->event_retry, clock_boottime_or_monotonic(), now(clock_boottime_or_monotonic()) + m->poll_interval_usec, 0, manager_retry_connect, m);
914 if (r < 0)
915 return log_error_errno(r, "Failed to create retry timer: %m");
916
917 m->exhausted_servers = true;
918
919 /* Increase the polling interval */
920 if (m->poll_interval_usec < NTP_POLL_INTERVAL_MAX_SEC * USEC_PER_SEC)
921 m->poll_interval_usec *= 2;
922
923 return 0;
924 }
925
926 m->exhausted_servers = false;
927
928 manager_set_server_name(m, f);
929 }
930
931 /* Tell the resolver to reread /etc/resolv.conf, in
932 * case it changed. */
933 res_init();
934
935 /* Flush out any previously resolved addresses */
936 server_name_flush_addresses(m->current_server_name);
937
938 log_debug("Resolving %s...", m->current_server_name->string);
939
940 r = sd_resolve_getaddrinfo(m->resolve, &m->resolve_query, m->current_server_name->string, "123", &hints, manager_resolve_handler, m);
941 if (r < 0)
942 return log_error_errno(r, "Failed to create resolver: %m");
943
944 return 1;
945 }
946
947 r = manager_begin(m);
948 if (r < 0)
949 return r;
950
951 return 1;
952 }
953
954 void manager_disconnect(Manager *m) {
955 assert(m);
956
957 m->resolve_query = sd_resolve_query_unref(m->resolve_query);
958
959 m->event_timer = sd_event_source_unref(m->event_timer);
960
961 manager_listen_stop(m);
962
963 m->event_clock_watch = sd_event_source_unref(m->event_clock_watch);
964 m->clock_watch_fd = safe_close(m->clock_watch_fd);
965
966 m->event_timeout = sd_event_source_unref(m->event_timeout);
967
968 sd_notifyf(false, "STATUS=Idle.");
969 }
970
971 void manager_flush_server_names(Manager *m, ServerType t) {
972 assert(m);
973
974 if (t == SERVER_SYSTEM)
975 while (m->system_servers)
976 server_name_free(m->system_servers);
977
978 if (t == SERVER_LINK)
979 while (m->link_servers)
980 server_name_free(m->link_servers);
981
982 if (t == SERVER_FALLBACK)
983 while (m->fallback_servers)
984 server_name_free(m->fallback_servers);
985 }
986
987 void manager_free(Manager *m) {
988 if (!m)
989 return;
990
991 manager_disconnect(m);
992 manager_flush_server_names(m, SERVER_SYSTEM);
993 manager_flush_server_names(m, SERVER_LINK);
994 manager_flush_server_names(m, SERVER_FALLBACK);
995
996 sd_event_source_unref(m->event_retry);
997
998 sd_event_source_unref(m->network_event_source);
999 sd_network_monitor_unref(m->network_monitor);
1000
1001 sd_resolve_unref(m->resolve);
1002 sd_event_unref(m->event);
1003
1004 free(m);
1005 }
1006
1007 static int manager_network_read_link_servers(Manager *m) {
1008 _cleanup_strv_free_ char **ntp = NULL;
1009 ServerName *n, *nx;
1010 char **i;
1011 int r;
1012
1013 assert(m);
1014
1015 r = sd_network_get_ntp(&ntp);
1016 if (r < 0)
1017 goto clear;
1018
1019 LIST_FOREACH(names, n, m->link_servers)
1020 n->marked = true;
1021
1022 STRV_FOREACH(i, ntp) {
1023 bool found = false;
1024
1025 LIST_FOREACH(names, n, m->link_servers)
1026 if (streq(n->string, *i)) {
1027 n->marked = false;
1028 found = true;
1029 break;
1030 }
1031
1032 if (!found) {
1033 r = server_name_new(m, NULL, SERVER_LINK, *i);
1034 if (r < 0)
1035 goto clear;
1036 }
1037 }
1038
1039 LIST_FOREACH_SAFE(names, n, nx, m->link_servers)
1040 if (n->marked)
1041 server_name_free(n);
1042
1043 return 0;
1044
1045 clear:
1046 manager_flush_server_names(m, SERVER_LINK);
1047 return r;
1048 }
1049
1050 static int manager_network_event_handler(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
1051 Manager *m = userdata;
1052 bool connected, online;
1053 int r;
1054
1055 assert(m);
1056
1057 sd_network_monitor_flush(m->network_monitor);
1058
1059 manager_network_read_link_servers(m);
1060
1061 /* check if the machine is online */
1062 online = network_is_online();
1063
1064 /* check if the client is currently connected */
1065 connected = m->server_socket >= 0 || m->resolve_query || m->exhausted_servers;
1066
1067 if (connected && !online) {
1068 log_info("No network connectivity, watching for changes.");
1069 manager_disconnect(m);
1070
1071 } else if (!connected && online) {
1072 log_info("Network configuration changed, trying to establish connection.");
1073
1074 if (m->current_server_address)
1075 r = manager_begin(m);
1076 else
1077 r = manager_connect(m);
1078 if (r < 0)
1079 return r;
1080 }
1081
1082 return 0;
1083 }
1084
1085 static int manager_network_monitor_listen(Manager *m) {
1086 int r, fd, events;
1087
1088 assert(m);
1089
1090 r = sd_network_monitor_new(&m->network_monitor, NULL);
1091 if (r < 0)
1092 return r;
1093
1094 fd = sd_network_monitor_get_fd(m->network_monitor);
1095 if (fd < 0)
1096 return fd;
1097
1098 events = sd_network_monitor_get_events(m->network_monitor);
1099 if (events < 0)
1100 return events;
1101
1102 r = sd_event_add_io(m->event, &m->network_event_source, fd, events, manager_network_event_handler, m);
1103 if (r < 0)
1104 return r;
1105
1106 return 0;
1107 }
1108
1109 int manager_new(Manager **ret) {
1110 _cleanup_(manager_freep) Manager *m = NULL;
1111 int r;
1112
1113 assert(ret);
1114
1115 m = new0(Manager, 1);
1116 if (!m)
1117 return -ENOMEM;
1118
1119 m->server_socket = m->clock_watch_fd = -1;
1120
1121 RATELIMIT_INIT(m->ratelimit, RATELIMIT_INTERVAL_USEC, RATELIMIT_BURST);
1122
1123 r = manager_parse_server_string(m, SERVER_FALLBACK, NTP_SERVERS);
1124 if (r < 0)
1125 return r;
1126
1127 r = sd_event_default(&m->event);
1128 if (r < 0)
1129 return r;
1130
1131 sd_event_add_signal(m->event, NULL, SIGTERM, NULL, NULL);
1132 sd_event_add_signal(m->event, NULL, SIGINT, NULL, NULL);
1133
1134 sd_event_set_watchdog(m->event, true);
1135
1136 r = sd_resolve_default(&m->resolve);
1137 if (r < 0)
1138 return r;
1139
1140 r = sd_resolve_attach_event(m->resolve, m->event, 0);
1141 if (r < 0)
1142 return r;
1143
1144 r = manager_network_monitor_listen(m);
1145 if (r < 0)
1146 return r;
1147
1148 manager_network_read_link_servers(m);
1149
1150 *ret = m;
1151 m = NULL;
1152
1153 return 0;
1154 }