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