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