chiark / gitweb /
timesyncd: fix typo in comment
[elogind.git] / src / timesync / timesyncd.c
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 /***
4   This file is part of systemd.
5
6   Copyright 2014 Kay Sievers, Lennart Poettering
7
8   systemd is free software; you can redistribute it and/or modify it
9   under the terms of the GNU Lesser General Public License as published by
10   the Free Software Foundation; either version 2.1 of the License, or
11   (at your option) any later version.
12
13   systemd is distributed in the hope that it will be useful, but
14   WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16   Lesser General Public License for more details.
17
18   You should have received a copy of the GNU Lesser General Public License
19   along with systemd; If not, see <http://www.gnu.org/licenses/>.
20 ***/
21
22 #include <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
37 #include "missing.h"
38 #include "util.h"
39 #include "sparse-endian.h"
40 #include "log.h"
41 #include "socket-util.h"
42 #include "list.h"
43 #include "ratelimit.h"
44 #include "strv.h"
45 #include "conf-parser.h"
46 #include "sd-event.h"
47 #include "sd-resolve.h"
48 #include "sd-daemon.h"
49 #include "sd-network.h"
50 #include "event-util.h"
51 #include "network-util.h"
52 #include "timesyncd.h"
53
54 #define TIME_T_MAX (time_t)((1UL << ((sizeof(time_t) << 3) - 1)) - 1)
55
56 #ifndef ADJ_SETOFFSET
57 #define ADJ_SETOFFSET                   0x0100  /* add 'time' to current time */
58 #endif
59
60 /* expected accuracy of time synchronization; used to adjust the poll interval */
61 #define NTP_ACCURACY_SEC                0.2
62
63 /*
64  * "A client MUST NOT under any conditions use a poll interval less
65  * than 15 seconds."
66  */
67 #define NTP_POLL_INTERVAL_MIN_SEC       32
68 #define NTP_POLL_INTERVAL_MAX_SEC       2048
69
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 */
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
94 #define RETRY_USEC (30*USEC_PER_SEC)
95 #define RATELIMIT_INTERVAL_USEC (10*USEC_PER_SEC)
96 #define RATELIMIT_BURST 10
97
98 #define TIMEOUT_USEC (10*USEC_PER_SEC)
99
100 struct ntp_ts {
101         be32_t sec;
102         be32_t frac;
103 } _packed_;
104
105 struct ntp_ts_short {
106         be16_t sec;
107         be16_t frac;
108 } _packed_;
109
110 struct ntp_msg {
111         uint8_t field;
112         uint8_t stratum;
113         int8_t poll;
114         int8_t precision;
115         struct ntp_ts_short root_delay;
116         struct ntp_ts_short root_dispersion;
117         char refid[4];
118         struct ntp_ts reference_time;
119         struct ntp_ts origin_time;
120         struct ntp_ts recv_time;
121         struct ntp_ts trans_time;
122 } _packed_;
123
124 static void manager_free(Manager *m);
125 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
126 #define _cleanup_manager_free_ _cleanup_(manager_freep)
127
128 static int manager_arm_timer(Manager *m, usec_t next);
129 static int manager_clock_watch_setup(Manager *m);
130 static int manager_connect(Manager *m);
131 static void manager_disconnect(Manager *m);
132
133 static double ntp_ts_to_d(const struct ntp_ts *ts) {
134         return be32toh(ts->sec) + ((double)be32toh(ts->frac) / UINT_MAX);
135 }
136
137 static double ts_to_d(const struct timespec *ts) {
138         return ts->tv_sec + (1.0e-9 * ts->tv_nsec);
139 }
140
141 static double tv_to_d(const struct timeval *tv) {
142         return tv->tv_sec + (1.0e-6 * tv->tv_usec);
143 }
144
145 static double square(double d) {
146         return d * d;
147 }
148
149 static 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
163 static int manager_send_request(Manager *m) {
164         _cleanup_free_ char *pretty = NULL;
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         };
175         ssize_t len;
176         int r;
177
178         assert(m);
179         assert(m->current_server_name);
180         assert(m->current_server_address);
181
182         m->event_timeout = sd_event_source_unref(m->event_timeout);
183
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
190          * NTP UINT_MAX fraction; we just pass the plain nanosecond value.
191          */
192         assert_se(clock_gettime(CLOCK_MONOTONIC, &m->trans_time_mon) >= 0);
193         assert_se(clock_gettime(CLOCK_REALTIME, &m->trans_time) >= 0);
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);
196
197         sockaddr_pretty(&m->current_server_address->sockaddr.sa, m->current_server_address->socklen, true, &pretty);
198
199         len = sendto(m->server_socket, &ntpmsg, sizeof(ntpmsg), MSG_DONTWAIT, &m->current_server_address->sockaddr.sa, m->current_server_address->socklen);
200         if (len == sizeof(ntpmsg)) {
201                 m->pending = true;
202                 log_debug("Sent NTP request to %s (%s).", strna(pretty), m->current_server_name->string);
203         } else {
204                 log_debug("Sending NTP request to %s (%s) failed: %m", strna(pretty), m->current_server_name->string);
205                 return manager_connect(m);
206         }
207
208         /* re-arm timer with increasing timeout, in case the packets never arrive back */
209         if (m->retry_interval > 0) {
210                 if (m->retry_interval < NTP_POLL_INTERVAL_MAX_SEC * USEC_PER_SEC)
211                         m->retry_interval *= 2;
212         } else
213                 m->retry_interval = NTP_POLL_INTERVAL_MIN_SEC * USEC_PER_SEC;
214
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
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
232         return 0;
233 }
234
235 static int manager_timer(sd_event_source *source, usec_t usec, void *userdata) {
236         Manager *m = userdata;
237
238         assert(m);
239
240         return manager_send_request(m);
241 }
242
243 static int manager_arm_timer(Manager *m, usec_t next) {
244         int r;
245
246         assert(m);
247         assert(m->event_receive);
248
249         if (next == 0) {
250                 m->event_timer = sd_event_source_unref(m->event_timer);
251                 return 0;
252         }
253
254         if (m->event_timer) {
255                 r = sd_event_source_set_time(m->event_timer, now(CLOCK_MONOTONIC) + next);
256                 if (r < 0)
257                         return r;
258
259                 return sd_event_source_set_enabled(m->event_timer, SD_EVENT_ONESHOT);
260         }
261
262         return sd_event_add_time(
263                         m->event,
264                         &m->event_timer,
265                         CLOCK_MONOTONIC,
266                         now(CLOCK_MONOTONIC) + next, 0,
267                         manager_timer, m);
268 }
269
270 static int manager_clock_watch(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
271         Manager *m = userdata;
272
273         assert(m);
274
275         /* rearm timer */
276         manager_clock_watch_setup(m);
277
278         /* skip our own jumps */
279         if (m->jumped) {
280                 m->jumped = false;
281                 return 0;
282         }
283
284         /* resync */
285         log_info("System time changed. Resyncing.");
286         m->poll_resync = true;
287         return manager_send_request(m);
288 }
289
290 /* wake up when the system time changes underneath us */
291 static int manager_clock_watch_setup(Manager *m) {
292
293         struct itimerspec its = {
294                 .it_value.tv_sec = TIME_T_MAX
295         };
296
297         int r;
298
299         assert(m);
300
301         m->event_clock_watch = sd_event_source_unref(m->event_clock_watch);
302         safe_close(m->clock_watch_fd);
303
304         m->clock_watch_fd = timerfd_create(CLOCK_REALTIME, TFD_NONBLOCK|TFD_CLOEXEC);
305         if (m->clock_watch_fd < 0) {
306                 log_error("Failed to create timerfd: %m");
307                 return -errno;
308         }
309
310         if (timerfd_settime(m->clock_watch_fd, TFD_TIMER_ABSTIME|TFD_TIMER_CANCEL_ON_SET, &its, NULL) < 0) {
311                 log_error("Failed to set up timerfd: %m");
312                 return -errno;
313         }
314
315         r = sd_event_add_io(m->event, &m->event_clock_watch, m->clock_watch_fd, EPOLLIN, manager_clock_watch, m);
316         if (r < 0) {
317                 log_error("Failed to create clock watch event source: %s", strerror(-r));
318                 return r;
319         }
320
321         return 0;
322 }
323
324 static int manager_adjust_clock(Manager *m, double offset, int leap_sec) {
325         struct timex tmx = {};
326         int r;
327
328         assert(m);
329
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          */
337         if (fabs(offset) < NTP_MAX_ADJUST) {
338                 tmx.modes = ADJ_STATUS | ADJ_NANO | ADJ_OFFSET | ADJ_TIMECONST | ADJ_MAXERROR | ADJ_ESTERROR;
339                 tmx.status = STA_PLL;
340                 tmx.offset = offset * NSEC_PER_SEC;
341                 tmx.constant = log2i(m->poll_interval_usec / USEC_PER_SEC) - 4;
342                 tmx.maxerror = 0;
343                 tmx.esterror = 0;
344                 log_debug("  adjust (slew): %+.3f sec\n", offset);
345         } else {
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) {
354                         tmx.time.tv_sec  -= 1;
355                         tmx.time.tv_usec += NSEC_PER_SEC;
356                 }
357
358                 m->jumped = true;
359                 log_debug("  adjust (jump): %+.3f sec\n", offset);
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
371         r = clock_adjtime(CLOCK_REALTIME, &tmx);
372         if (r < 0)
373                 return r;
374
375         m->drift_ppm = tmx.freq / 65536;
376
377         log_debug("  status       : %04i %s\n"
378                   "  time now     : %li.%03lli\n"
379                   "  constant     : %li\n"
380                   "  offset       : %+.3f sec\n"
381                   "  freq offset  : %+li (%i ppm)\n",
382                   tmx.status, tmx.status & STA_UNSYNC ? "" : "sync",
383                   tmx.time.tv_sec, tmx.time.tv_usec / NSEC_PER_MSEC,
384                   tmx.constant,
385                   (double)tmx.offset / NSEC_PER_SEC,
386                   tmx.freq, m->drift_ppm);
387
388         return 0;
389 }
390
391 static bool manager_sample_spike_detection(Manager *m, double offset, double delay) {
392         unsigned int i, idx_cur, idx_new, idx_min;
393         double jitter;
394         double j;
395
396         assert(m);
397
398         m->packet_count++;
399
400         /* ignore initial sample */
401         if (m->packet_count == 1)
402                 return false;
403
404         /* store the current data in our samples array */
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;
410
411         /* calculate new jitter value from the RMS differences relative to the lowest delay sample */
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)
415                         idx_min = i;
416
417         j = 0;
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));
421
422         /* ignore samples when resyncing */
423         if (m->poll_resync)
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 */
431         if (m->packet_count < 4)
432                 return false;
433
434         /* do not accept anything worse than the maximum possible error of the best sample */
435         if (fabs(offset) > m->samples[idx_min].delay)
436                 return true;
437
438         /* compare the difference between the current offset to the previous offset and jitter */
439         return fabs(offset - m->samples[idx_cur].offset) > 3 * jitter;
440 }
441
442 static void manager_adjust_poll(Manager *m, double offset, bool spike) {
443         assert(m);
444
445         if (m->poll_resync) {
446                 m->poll_interval_usec = NTP_POLL_INTERVAL_MIN_SEC * USEC_PER_SEC;
447                 m->poll_resync = false;
448                 return;
449         }
450
451         /* set to minimal poll interval */
452         if (!spike && fabs(offset) > NTP_ACCURACY_SEC) {
453                 m->poll_interval_usec = NTP_POLL_INTERVAL_MIN_SEC * USEC_PER_SEC;
454                 return;
455         }
456
457         /* increase polling interval */
458         if (fabs(offset) < NTP_ACCURACY_SEC * 0.25) {
459                 if (m->poll_interval_usec < NTP_POLL_INTERVAL_MAX_SEC * USEC_PER_SEC)
460                         m->poll_interval_usec *= 2;
461                 return;
462         }
463
464         /* decrease polling interval */
465         if (spike || fabs(offset) > NTP_ACCURACY_SEC * 0.75) {
466                 if (m->poll_interval_usec > NTP_POLL_INTERVAL_MIN_SEC * USEC_PER_SEC)
467                         m->poll_interval_usec /= 2;
468                 return;
469         }
470 }
471
472 static 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
488 static int manager_receive_response(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
489         Manager *m = userdata;
490         struct ntp_msg ntpmsg;
491
492         struct iovec iov = {
493                 .iov_base = &ntpmsg,
494                 .iov_len = sizeof(ntpmsg),
495         };
496         union {
497                 struct cmsghdr cmsghdr;
498                 uint8_t buf[CMSG_SPACE(sizeof(struct timeval))];
499         } control;
500         union sockaddr_union server_addr;
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;
510         struct timespec now_ts;
511         struct timeval *recv_time;
512         ssize_t len;
513         double origin, receive, trans, dest;
514         double delay, offset;
515         bool spike;
516         int leap_sec;
517         int r;
518
519         assert(source);
520         assert(m);
521
522         if (revents & (EPOLLHUP|EPOLLERR)) {
523                 log_warning("Server connection returned error.");
524                 return manager_connect(m);
525         }
526
527         len = recvmsg(fd, &msghdr, MSG_DONTWAIT);
528         if (len < 0) {
529                 if (errno == EAGAIN)
530                         return 0;
531
532                 log_warning("Error receiving message. Disconnecting.");
533                 return manager_connect(m);
534         }
535
536         if (iov.iov_len < sizeof(struct ntp_msg)) {
537                 log_warning("Invalid response from server. Disconnecting.");
538                 return manager_connect(m);
539         }
540
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;
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) {
560                 log_error("Invalid packet timestamp.");
561                 return -EINVAL;
562         }
563
564         if (!m->pending) {
565                 log_debug("Unexpected reply. Ignoring.");
566                 return 0;
567         }
568
569         /* check our "time cookie" (we just stored nanoseconds in the fraction field) */
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) {
572                 log_debug("Invalid reply; not our transmit time. Ignoring.");
573                 return 0;
574         }
575
576         m->event_timeout = sd_event_source_unref(m->event_timeout);
577
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
584         if (NTP_FIELD_LEAP(ntpmsg.field) == NTP_LEAP_NOTINSYNC) {
585                 log_debug("Server is not synchronized. Disconnecting.");
586                 return manager_connect(m);
587         }
588
589         if (!IN_SET(NTP_FIELD_VERSION(ntpmsg.field), 3, 4)) {
590                 log_debug("Response NTPv%d. Disconnecting.", NTP_FIELD_VERSION(ntpmsg.field));
591                 return manager_connect(m);
592         }
593
594         if (NTP_FIELD_MODE(ntpmsg.field) != NTP_MODE_SERVER) {
595                 log_debug("Unsupported mode %d. Disconnecting.", NTP_FIELD_MODE(ntpmsg.field));
596                 return manager_connect(m);
597         }
598
599         /* valid packet */
600         m->pending = false;
601         m->retry_interval = 0;
602
603         /* announce leap seconds */
604         if (NTP_FIELD_LEAP(ntpmsg.field) & NTP_LEAP_PLUSSEC)
605                 leap_sec = 1;
606         else if (NTP_FIELD_LEAP(ntpmsg.field) & NTP_LEAP_MINUSSEC)
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          *
619          *  The round-trip delay, d, and system clock offset, t, are defined as:
620          *  d = (T4 - T1) - (T3 - T2)     t = ((T2 - T1) + (T3 - T4)) / 2"
621          */
622         assert_se(clock_gettime(CLOCK_MONOTONIC, &now_ts) >= 0);
623         origin = tv_to_d(recv_time) - (ts_to_d(&now_ts) - ts_to_d(&m->trans_time_mon)) + OFFSET_1900_1970;
624         receive = ntp_ts_to_d(&ntpmsg.recv_time);
625         trans = ntp_ts_to_d(&ntpmsg.trans_time);
626         dest = tv_to_d(recv_time) + OFFSET_1900_1970;
627
628         offset = ((receive - origin) + (trans - dest)) / 2;
629         delay = (dest - origin) - (trans - receive);
630
631         spike = manager_sample_spike_detection(m, offset, delay);
632
633         manager_adjust_poll(m, offset, spike);
634
635         log_debug("NTP response:\n"
636                   "  leap         : %u\n"
637                   "  version      : %u\n"
638                   "  mode         : %u\n"
639                   "  stratum      : %u\n"
640                   "  precision    : %.6f sec (%d)\n"
641                   "  reference    : %.4s\n"
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"
648                   "  packet count : %"PRIu64"\n"
649                   "  jitter       : %.3f%s\n"
650                   "  poll interval: %llu\n",
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",
657                   origin - OFFSET_1900_1970,
658                   receive - OFFSET_1900_1970,
659                   trans - OFFSET_1900_1970,
660                   dest - OFFSET_1900_1970,
661                   offset, delay,
662                   m->packet_count,
663                   m->samples_jitter, spike ? " spike" : "",
664                   m->poll_interval_usec / USEC_PER_SEC);
665
666         if (!spike) {
667                 r = manager_adjust_clock(m, offset, leap_sec);
668                 if (r < 0)
669                         log_error("Failed to call clock_adjtime(): %m");
670         }
671
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,
674                  spike ? " (ignored)" : "");
675
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;
683 }
684
685 static 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;
690
691         assert(m);
692
693         assert(m->server_socket < 0);
694         assert(!m->event_receive);
695         assert(m->current_server_address);
696
697         addr.sa.sa_family = m->current_server_address->sockaddr.sa.sa_family;
698
699         m->server_socket = socket(addr.sa.sa_family, SOCK_DGRAM | SOCK_CLOEXEC, 0);
700         if (m->server_socket < 0)
701                 return -errno;
702
703         r = bind(m->server_socket, &addr.sa, m->current_server_address->socklen);
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));
712
713         return sd_event_add_io(m->event, &m->event_receive, m->server_socket, EPOLLIN, manager_receive_response, m);
714 }
715
716 static int manager_begin(Manager *m) {
717         _cleanup_free_ char *pretty = NULL;
718         int r;
719
720         assert(m);
721         assert_return(m->current_server_name, -EHOSTUNREACH);
722         assert_return(m->current_server_address, -EHOSTUNREACH);
723
724         m->poll_interval_usec = NTP_POLL_INTERVAL_MIN_SEC * USEC_PER_SEC;
725
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);
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);
737         if (r < 0)
738                 return r;
739
740         return manager_send_request(m);
741 }
742
743 static 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
754 static 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
767 static 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) {
778                 log_info("Failed to resolve %s: %s", m->current_server_name->string, gai_strerror(ret));
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);
809                 log_debug("Resolved address %s for %s.", pretty, m->current_server_name->string);
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
824 static 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
832 static int manager_connect(Manager *m) {
833
834         struct addrinfo hints = {
835                 .ai_flags = AI_NUMERICSERV|AI_ADDRCONFIG,
836                 .ai_socktype = SOCK_DGRAM,
837         };
838         int r;
839
840         assert(m);
841
842         manager_disconnect(m);
843
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
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
877                 /* Tell the resolver to reread /etc/resolv.conf, in
878                  * case it changed. */
879                 res_init();
880
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
897 static int manager_add_server(Manager *m, const char *server) {
898         ServerName *n, *tail;
899
900         assert(m);
901         assert(server);
902
903         n = new0(ServerName, 1);
904         if (!n)
905                 return -ENOMEM;
906
907         n->string = strdup(server);
908         if (!n->string) {
909                 free(n);
910                 return -ENOMEM;
911         }
912
913         LIST_FIND_TAIL(names, m->servers, tail);
914         LIST_INSERT_AFTER(names, m->servers, tail, n);
915
916         return 0;
917 }
918
919 static 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
941 static void manager_disconnect(Manager *m) {
942         assert(m);
943
944         m->resolve_query = sd_resolve_query_unref(m->resolve_query);
945
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
951         m->event_clock_watch = sd_event_source_unref(m->event_clock_watch);
952         m->clock_watch_fd = safe_close(m->clock_watch_fd);
953
954         m->event_timeout = sd_event_source_unref(m->event_timeout);
955
956         sd_notifyf(false, "STATUS=Idle.");
957 }
958
959 static int manager_new(Manager **ret) {
960         _cleanup_manager_free_ Manager *m = NULL;
961         int r;
962
963         m = new0(Manager, 1);
964         if (!m)
965                 return -ENOMEM;
966
967         m->server_socket = m->clock_watch_fd = -1;
968
969         RATELIMIT_INIT(m->ratelimit, RATELIMIT_INTERVAL_USEC, RATELIMIT_BURST);
970
971         r = sd_event_default(&m->event);
972         if (r < 0)
973                 return r;
974
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);
979         if (r < 0)
980                 return r;
981
982         r = sd_resolve_attach_event(m->resolve, m->event, 0);
983         if (r < 0)
984                 return r;
985
986         r = manager_clock_watch_setup(m);
987         if (r < 0)
988                 return r;
989
990         *ret = m;
991         m = NULL;
992
993         return 0;
994 }
995
996 static void manager_free(Manager *m) {
997         if (!m)
998                 return;
999
1000         manager_disconnect(m);
1001         manager_flush_names(m);
1002
1003         sd_event_source_unref(m->sigint);
1004         sd_event_source_unref(m->sigterm);
1005
1006         sd_event_source_unref(m->event_retry);
1007
1008         sd_event_source_unref(m->network_event_source);
1009         sd_network_monitor_unref(m->network_monitor);
1010
1011         sd_resolve_unref(m->resolve);
1012         sd_event_unref(m->event);
1013
1014         free(m);
1015 }
1016
1017 int 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
1041 static 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
1065 static bool network_is_online(void) {
1066         _cleanup_free_ char *state = NULL;
1067         int r;
1068
1069         r = sd_network_get_operational_state(&state);
1070         if (r >= 0 && streq("carrier", state))
1071                 return true;
1072         else
1073                 return false;
1074 }
1075
1076 static 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
1111 static 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
1141 int main(int argc, char *argv[]) {
1142         _cleanup_manager_free_ Manager *m = NULL;
1143         int r;
1144
1145         if (argc > 1) {
1146                 log_error("This program does not take arguments.");
1147                 return EXIT_FAILURE;
1148         }
1149
1150         log_set_target(LOG_TARGET_AUTO);
1151         log_set_facility(LOG_CRON);
1152         log_parse_environment();
1153         log_open();
1154
1155         umask(0022);
1156
1157         assert_se(sigprocmask_many(SIG_BLOCK, SIGTERM, SIGINT, -1) == 0);
1158
1159         r = manager_new(&m);
1160         if (r < 0) {
1161                 log_error("Failed to allocate manager: %s", strerror(-r));
1162                 goto out;
1163         }
1164
1165         manager_add_server_string(m, NTP_SERVERS);
1166         manager_parse_config_file(m);
1167
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
1174         log_debug("systemd-timesyncd running as pid %lu", (unsigned long) getpid());
1175         sd_notify(false, "READY=1");
1176
1177         if (network_is_online()) {
1178                 r = manager_connect(m);
1179                 if (r < 0)
1180                         goto out;
1181         }
1182
1183         r = sd_event_loop(m->event);
1184         if (r < 0) {
1185                 log_error("Failed to run event loop: %s", strerror(-r));
1186                 goto out;
1187         }
1188
1189         sd_event_get_exit_code(m->event, &r);
1190
1191 out:
1192         sd_notify(false, "STATUS=Shutting down...");
1193
1194         return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
1195 }