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