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