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