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