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