1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2014 Kay Sievers, Lennart Poettering
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.
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.
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/>.
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>
36 #include <sys/prctl.h>
37 #include <sys/types.h>
42 #include "sparse-endian.h"
44 #include "socket-util.h"
46 #include "ratelimit.h"
48 #include "conf-parser.h"
49 #include "sd-daemon.h"
50 #include "event-util.h"
51 #include "network-util.h"
52 #include "clock-util.h"
53 #include "capability.h"
55 #include "timesyncd-conf.h"
56 #include "timesyncd-manager.h"
58 #define TIME_T_MAX (time_t)((1UL << ((sizeof(time_t) << 3) - 1)) - 1)
61 #define ADJ_SETOFFSET 0x0100 /* add 'time' to current time */
64 /* expected accuracy of time synchronization; used to adjust the poll interval */
65 #define NTP_ACCURACY_SEC 0.2
68 * "A client MUST NOT under any conditions use a poll interval less
71 #define NTP_POLL_INTERVAL_MIN_SEC 32
72 #define NTP_POLL_INTERVAL_MAX_SEC 2048
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.
79 #define NTP_MAX_ADJUST 0.4
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))
92 /* Maximum acceptable root distance in seconds. */
93 #define NTP_MAX_ROOT_DISTANCE 5.0
96 * "NTP timestamps are represented as a 64-bit unsigned fixed-point number,
97 * in seconds relative to 0h on 1 January 1900."
99 #define OFFSET_1900_1970 2208988800UL
101 #define RETRY_USEC (30*USEC_PER_SEC)
102 #define RATELIMIT_INTERVAL_USEC (10*USEC_PER_SEC)
103 #define RATELIMIT_BURST 10
105 #define TIMEOUT_USEC (10*USEC_PER_SEC)
112 struct ntp_ts_short {
122 struct ntp_ts_short root_delay;
123 struct ntp_ts_short root_dispersion;
125 struct ntp_ts reference_time;
126 struct ntp_ts origin_time;
127 struct ntp_ts recv_time;
128 struct ntp_ts trans_time;
131 static int manager_arm_timer(Manager *m, usec_t next);
132 static int manager_clock_watch_setup(Manager *m);
134 static double ntp_ts_short_to_d(const struct ntp_ts_short *ts) {
135 return be16toh(ts->sec) + (be16toh(ts->frac) / 65536.0);
138 static double ntp_ts_to_d(const struct ntp_ts *ts) {
139 return be32toh(ts->sec) + ((double)be32toh(ts->frac) / UINT_MAX);
142 static double ts_to_d(const struct timespec *ts) {
143 return ts->tv_sec + (1.0e-9 * ts->tv_nsec);
146 static double square(double d) {
150 static int manager_timeout(sd_event_source *source, usec_t usec, void *userdata) {
151 _cleanup_free_ char *pretty = NULL;
152 Manager *m = userdata;
155 assert(m->current_server_name);
156 assert(m->current_server_address);
158 server_address_pretty(m->current_server_address, &pretty);
159 log_info("Timed out waiting for reply from %s (%s).", strna(pretty), m->current_server_name->string);
161 return manager_connect(m);
164 static int manager_send_request(Manager *m) {
165 _cleanup_free_ char *pretty = NULL;
166 struct ntp_msg ntpmsg = {
168 * "The client initializes the NTP message header, sends the request
169 * to the server, and strips the time of day from the Transmit
170 * Timestamp field of the reply. For this purpose, all the NTP
171 * header fields are set to 0, except the Mode, VN, and optional
172 * Transmit Timestamp fields."
174 .field = NTP_FIELD(0, 4, NTP_MODE_CLIENT),
180 assert(m->current_server_name);
181 assert(m->current_server_address);
183 m->event_timeout = sd_event_source_unref(m->event_timeout);
186 * Set transmit timestamp, remember it; the server will send that back
187 * as the origin timestamp and we have an indication that this is the
188 * matching answer to our request.
190 * The actual value does not matter, We do not care about the correct
191 * NTP UINT_MAX fraction; we just pass the plain nanosecond value.
193 assert_se(clock_gettime(clock_boottime_or_monotonic(), &m->trans_time_mon) >= 0);
194 assert_se(clock_gettime(CLOCK_REALTIME, &m->trans_time) >= 0);
195 ntpmsg.trans_time.sec = htobe32(m->trans_time.tv_sec + OFFSET_1900_1970);
196 ntpmsg.trans_time.frac = htobe32(m->trans_time.tv_nsec);
198 server_address_pretty(m->current_server_address, &pretty);
200 len = sendto(m->server_socket, &ntpmsg, sizeof(ntpmsg), MSG_DONTWAIT, &m->current_server_address->sockaddr.sa, m->current_server_address->socklen);
201 if (len == sizeof(ntpmsg)) {
203 log_debug("Sent NTP request to %s (%s).", strna(pretty), m->current_server_name->string);
205 log_debug("Sending NTP request to %s (%s) failed: %m", strna(pretty), m->current_server_name->string);
206 return manager_connect(m);
209 r = sd_event_add_time(
212 clock_boottime_or_monotonic(),
213 now(clock_boottime_or_monotonic()) + TIMEOUT_USEC, 0,
216 log_error("Failed to arm timeout timer: %s", strerror(-r));
223 static int manager_timer(sd_event_source *source, usec_t usec, void *userdata) {
224 Manager *m = userdata;
228 return manager_send_request(m);
231 static int manager_arm_timer(Manager *m, usec_t next) {
235 assert(m->event_receive);
238 m->event_timer = sd_event_source_unref(m->event_timer);
242 if (m->event_timer) {
243 r = sd_event_source_set_time(m->event_timer, now(clock_boottime_or_monotonic()) + next);
247 return sd_event_source_set_enabled(m->event_timer, SD_EVENT_ONESHOT);
250 return sd_event_add_time(
253 clock_boottime_or_monotonic(),
254 now(clock_boottime_or_monotonic()) + next, 0,
258 static int manager_clock_watch(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
259 Manager *m = userdata;
264 manager_clock_watch_setup(m);
266 /* skip our own jumps */
273 log_info("System time changed. Resyncing.");
274 m->poll_resync = true;
276 return manager_send_request(m);
279 /* wake up when the system time changes underneath us */
280 static int manager_clock_watch_setup(Manager *m) {
282 struct itimerspec its = {
283 .it_value.tv_sec = TIME_T_MAX
290 m->event_clock_watch = sd_event_source_unref(m->event_clock_watch);
291 safe_close(m->clock_watch_fd);
293 m->clock_watch_fd = timerfd_create(CLOCK_REALTIME, TFD_NONBLOCK|TFD_CLOEXEC);
294 if (m->clock_watch_fd < 0) {
295 log_error("Failed to create timerfd: %m");
299 if (timerfd_settime(m->clock_watch_fd, TFD_TIMER_ABSTIME|TFD_TIMER_CANCEL_ON_SET, &its, NULL) < 0) {
300 log_error("Failed to set up timerfd: %m");
304 r = sd_event_add_io(m->event, &m->event_clock_watch, m->clock_watch_fd, EPOLLIN, manager_clock_watch, m);
306 log_error("Failed to create clock watch event source: %s", strerror(-r));
313 static int manager_adjust_clock(Manager *m, double offset, int leap_sec) {
314 struct timex tmx = {};
320 * For small deltas, tell the kernel to gradually adjust the system
321 * clock to the NTP time, larger deltas are just directly set.
323 if (fabs(offset) < NTP_MAX_ADJUST) {
324 tmx.modes = ADJ_STATUS | ADJ_NANO | ADJ_OFFSET | ADJ_TIMECONST | ADJ_MAXERROR | ADJ_ESTERROR;
325 tmx.status = STA_PLL;
326 tmx.offset = offset * NSEC_PER_SEC;
327 tmx.constant = log2i(m->poll_interval_usec / USEC_PER_SEC) - 4;
330 log_debug(" adjust (slew): %+.3f sec\n", offset);
332 tmx.modes = ADJ_STATUS | ADJ_NANO | ADJ_SETOFFSET;
334 /* ADJ_NANO uses nanoseconds in the microseconds field */
335 tmx.time.tv_sec = (long)offset;
336 tmx.time.tv_usec = (offset - tmx.time.tv_sec) * NSEC_PER_SEC;
338 /* the kernel expects -0.3s as {-1, 7000.000.000} */
339 if (tmx.time.tv_usec < 0) {
340 tmx.time.tv_sec -= 1;
341 tmx.time.tv_usec += NSEC_PER_SEC;
345 log_debug(" adjust (jump): %+.3f sec\n", offset);
349 * An unset STA_UNSYNC will enable the kernel's 11-minute mode,
350 * which syncs the system time periodically to the RTC.
352 * In case the RTC runs in local time, never touch the RTC,
353 * we have no way to properly handle daylight saving changes and
354 * mobile devices moving between time zones.
356 if (m->rtc_local_time)
357 tmx.status |= STA_UNSYNC;
361 tmx.status |= STA_INS;
364 tmx.status |= STA_DEL;
368 r = clock_adjtime(CLOCK_REALTIME, &tmx);
372 touch("/var/lib/systemd/clock");
374 m->drift_ppm = tmx.freq / 65536;
376 log_debug(" status : %04i %s\n"
377 " time now : %li.%03llu\n"
379 " offset : %+.3f sec\n"
380 " freq offset : %+li (%i ppm)\n",
381 tmx.status, tmx.status & STA_UNSYNC ? "unsync" : "sync",
382 tmx.time.tv_sec, (unsigned long long) (tmx.time.tv_usec / NSEC_PER_MSEC),
384 (double)tmx.offset / NSEC_PER_SEC,
385 tmx.freq, m->drift_ppm);
390 static bool manager_sample_spike_detection(Manager *m, double offset, double delay) {
391 unsigned int i, idx_cur, idx_new, idx_min;
399 /* ignore initial sample */
400 if (m->packet_count == 1)
403 /* store the current data in our samples array */
404 idx_cur = m->samples_idx;
405 idx_new = (idx_cur + 1) % ELEMENTSOF(m->samples);
406 m->samples_idx = idx_new;
407 m->samples[idx_new].offset = offset;
408 m->samples[idx_new].delay = delay;
410 /* calculate new jitter value from the RMS differences relative to the lowest delay sample */
411 jitter = m->samples_jitter;
412 for (idx_min = idx_cur, i = 0; i < ELEMENTSOF(m->samples); i++)
413 if (m->samples[i].delay > 0 && m->samples[i].delay < m->samples[idx_min].delay)
417 for (i = 0; i < ELEMENTSOF(m->samples); i++)
418 j += square(m->samples[i].offset - m->samples[idx_min].offset);
419 m->samples_jitter = sqrt(j / (ELEMENTSOF(m->samples) - 1));
421 /* ignore samples when resyncing */
425 /* always accept offset if we are farther off than the round-trip delay */
426 if (fabs(offset) > delay)
429 /* we need a few samples before looking at them */
430 if (m->packet_count < 4)
433 /* do not accept anything worse than the maximum possible error of the best sample */
434 if (fabs(offset) > m->samples[idx_min].delay)
437 /* compare the difference between the current offset to the previous offset and jitter */
438 return fabs(offset - m->samples[idx_cur].offset) > 3 * jitter;
441 static void manager_adjust_poll(Manager *m, double offset, bool spike) {
444 if (m->poll_resync) {
445 m->poll_interval_usec = NTP_POLL_INTERVAL_MIN_SEC * USEC_PER_SEC;
446 m->poll_resync = false;
450 /* set to minimal poll interval */
451 if (!spike && fabs(offset) > NTP_ACCURACY_SEC) {
452 m->poll_interval_usec = NTP_POLL_INTERVAL_MIN_SEC * USEC_PER_SEC;
456 /* increase polling interval */
457 if (fabs(offset) < NTP_ACCURACY_SEC * 0.25) {
458 if (m->poll_interval_usec < NTP_POLL_INTERVAL_MAX_SEC * USEC_PER_SEC)
459 m->poll_interval_usec *= 2;
463 /* decrease polling interval */
464 if (spike || fabs(offset) > NTP_ACCURACY_SEC * 0.75) {
465 if (m->poll_interval_usec > NTP_POLL_INTERVAL_MIN_SEC * USEC_PER_SEC)
466 m->poll_interval_usec /= 2;
471 static int manager_receive_response(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
472 Manager *m = userdata;
473 struct ntp_msg ntpmsg;
477 .iov_len = sizeof(ntpmsg),
480 struct cmsghdr cmsghdr;
481 uint8_t buf[CMSG_SPACE(sizeof(struct timeval))];
483 union sockaddr_union server_addr;
484 struct msghdr msghdr = {
487 .msg_control = &control,
488 .msg_controllen = sizeof(control),
489 .msg_name = &server_addr,
490 .msg_namelen = sizeof(server_addr),
492 struct cmsghdr *cmsg;
493 struct timespec *recv_time;
495 double origin, receive, trans, dest;
496 double delay, offset;
497 double root_distance;
505 if (revents & (EPOLLHUP|EPOLLERR)) {
506 log_warning("Server connection returned error.");
507 return manager_connect(m);
510 len = recvmsg(fd, &msghdr, MSG_DONTWAIT);
515 log_warning("Error receiving message. Disconnecting.");
516 return manager_connect(m);
519 if (iov.iov_len < sizeof(struct ntp_msg)) {
520 log_warning("Invalid response from server. Disconnecting.");
521 return manager_connect(m);
524 if (!m->current_server_name ||
525 !m->current_server_address ||
526 !sockaddr_equal(&server_addr, &m->current_server_address->sockaddr)) {
527 log_debug("Response from unknown server.");
532 for (cmsg = CMSG_FIRSTHDR(&msghdr); cmsg; cmsg = CMSG_NXTHDR(&msghdr, cmsg)) {
533 if (cmsg->cmsg_level != SOL_SOCKET)
536 switch (cmsg->cmsg_type) {
537 case SCM_TIMESTAMPNS:
538 recv_time = (struct timespec *) CMSG_DATA(cmsg);
543 log_error("Invalid packet timestamp.");
548 log_debug("Unexpected reply. Ignoring.");
552 /* check our "time cookie" (we just stored nanoseconds in the fraction field) */
553 if (be32toh(ntpmsg.origin_time.sec) != m->trans_time.tv_sec + OFFSET_1900_1970 ||
554 be32toh(ntpmsg.origin_time.frac) != m->trans_time.tv_nsec) {
555 log_debug("Invalid reply; not our transmit time. Ignoring.");
559 m->event_timeout = sd_event_source_unref(m->event_timeout);
561 if (be32toh(ntpmsg.recv_time.sec) < TIME_EPOCH + OFFSET_1900_1970 ||
562 be32toh(ntpmsg.trans_time.sec) < TIME_EPOCH + OFFSET_1900_1970) {
563 log_debug("Invalid reply, returned times before epoch. Ignoring.");
564 return manager_connect(m);
567 if (NTP_FIELD_LEAP(ntpmsg.field) == NTP_LEAP_NOTINSYNC ||
568 ntpmsg.stratum == 0 || ntpmsg.stratum >= 16) {
569 log_debug("Server is not synchronized. Disconnecting.");
570 return manager_connect(m);
573 if (!IN_SET(NTP_FIELD_VERSION(ntpmsg.field), 3, 4)) {
574 log_debug("Response NTPv%d. Disconnecting.", NTP_FIELD_VERSION(ntpmsg.field));
575 return manager_connect(m);
578 if (NTP_FIELD_MODE(ntpmsg.field) != NTP_MODE_SERVER) {
579 log_debug("Unsupported mode %d. Disconnecting.", NTP_FIELD_MODE(ntpmsg.field));
580 return manager_connect(m);
583 root_distance = ntp_ts_short_to_d(&ntpmsg.root_delay) / 2 + ntp_ts_short_to_d(&ntpmsg.root_dispersion);
584 if (root_distance > NTP_MAX_ROOT_DISTANCE) {
585 log_debug("Server has too large root distance. Disconnecting.");
586 return manager_connect(m);
592 /* announce leap seconds */
593 if (NTP_FIELD_LEAP(ntpmsg.field) & NTP_LEAP_PLUSSEC)
595 else if (NTP_FIELD_LEAP(ntpmsg.field) & NTP_LEAP_MINUSSEC)
601 * "Timestamp Name ID When Generated
602 * ------------------------------------------------------------
603 * Originate Timestamp T1 time request sent by client
604 * Receive Timestamp T2 time request received by server
605 * Transmit Timestamp T3 time reply sent by server
606 * Destination Timestamp T4 time reply received by client
608 * The round-trip delay, d, and system clock offset, t, are defined as:
609 * d = (T4 - T1) - (T3 - T2) t = ((T2 - T1) + (T3 - T4)) / 2"
611 origin = ts_to_d(&m->trans_time) + OFFSET_1900_1970;
612 receive = ntp_ts_to_d(&ntpmsg.recv_time);
613 trans = ntp_ts_to_d(&ntpmsg.trans_time);
614 dest = ts_to_d(recv_time) + OFFSET_1900_1970;
616 offset = ((receive - origin) + (trans - dest)) / 2;
617 delay = (dest - origin) - (trans - receive);
619 spike = manager_sample_spike_detection(m, offset, delay);
621 manager_adjust_poll(m, offset, spike);
623 log_debug("NTP response:\n"
628 " precision : %.6f sec (%d)\n"
629 " root distance: %.6f sec\n"
630 " reference : %.4s\n"
635 " offset : %+.3f sec\n"
636 " delay : %+.3f sec\n"
637 " packet count : %"PRIu64"\n"
639 " poll interval: " USEC_FMT "\n",
640 NTP_FIELD_LEAP(ntpmsg.field),
641 NTP_FIELD_VERSION(ntpmsg.field),
642 NTP_FIELD_MODE(ntpmsg.field),
644 exp2(ntpmsg.precision), ntpmsg.precision,
646 ntpmsg.stratum == 1 ? ntpmsg.refid : "n/a",
647 origin - OFFSET_1900_1970,
648 receive - OFFSET_1900_1970,
649 trans - OFFSET_1900_1970,
650 dest - OFFSET_1900_1970,
653 m->samples_jitter, spike ? " spike" : "",
654 m->poll_interval_usec / USEC_PER_SEC);
658 r = manager_adjust_clock(m, offset, leap_sec);
660 log_error("Failed to call clock_adjtime(): %m");
663 log_info("interval/delta/delay/jitter/drift " USEC_FMT "s/%+.3fs/%.3fs/%.3fs/%+ippm%s",
664 m->poll_interval_usec / USEC_PER_SEC, offset, delay, m->samples_jitter, m->drift_ppm,
665 spike ? " (ignored)" : "");
667 r = manager_arm_timer(m, m->poll_interval_usec);
669 log_error("Failed to rearm timer: %s", strerror(-r));
676 static int manager_listen_setup(Manager *m) {
677 union sockaddr_union addr = {};
678 static const int tos = IPTOS_LOWDELAY;
679 static const int on = 1;
684 assert(m->server_socket < 0);
685 assert(!m->event_receive);
686 assert(m->current_server_address);
688 addr.sa.sa_family = m->current_server_address->sockaddr.sa.sa_family;
690 m->server_socket = socket(addr.sa.sa_family, SOCK_DGRAM | SOCK_CLOEXEC, 0);
691 if (m->server_socket < 0)
694 r = bind(m->server_socket, &addr.sa, m->current_server_address->socklen);
698 r = setsockopt(m->server_socket, SOL_SOCKET, SO_TIMESTAMPNS, &on, sizeof(on));
702 setsockopt(m->server_socket, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));
704 return sd_event_add_io(m->event, &m->event_receive, m->server_socket, EPOLLIN, manager_receive_response, m);
707 static int manager_begin(Manager *m) {
708 _cleanup_free_ char *pretty = NULL;
712 assert_return(m->current_server_name, -EHOSTUNREACH);
713 assert_return(m->current_server_address, -EHOSTUNREACH);
715 m->poll_interval_usec = NTP_POLL_INTERVAL_MIN_SEC * USEC_PER_SEC;
717 server_address_pretty(m->current_server_address, &pretty);
718 log_info("Using NTP server %s (%s).", strna(pretty), m->current_server_name->string);
719 sd_notifyf(false, "STATUS=Using Time Server %s (%s).", strna(pretty), m->current_server_name->string);
721 r = manager_listen_setup(m);
723 log_warning("Failed to setup connection socket: %s", strerror(-r));
727 r = manager_clock_watch_setup(m);
731 return manager_send_request(m);
734 void manager_set_server_name(Manager *m, ServerName *n) {
737 if (m->current_server_name == n)
740 m->current_server_name = n;
741 m->current_server_address = NULL;
743 manager_disconnect(m);
746 log_debug("Selected server %s.", n->string);
749 void manager_set_server_address(Manager *m, ServerAddress *a) {
752 if (m->current_server_address == a)
755 m->current_server_address = a;
756 /* If a is NULL, we are just clearing the address, without
757 * changing the name. Keep the existing name in that case. */
759 m->current_server_name = a->name;
761 manager_disconnect(m);
764 _cleanup_free_ char *pretty = NULL;
765 server_address_pretty(a, &pretty);
766 log_debug("Selected address %s of server %s.", strna(pretty), a->name->string);
770 static int manager_resolve_handler(sd_resolve_query *q, int ret, const struct addrinfo *ai, void *userdata) {
771 Manager *m = userdata;
776 assert(m->current_server_name);
778 m->resolve_query = sd_resolve_query_unref(m->resolve_query);
781 log_debug("Failed to resolve %s: %s", m->current_server_name->string, gai_strerror(ret));
784 return manager_connect(m);
787 for (; ai; ai = ai->ai_next) {
788 _cleanup_free_ char *pretty = NULL;
792 assert(ai->ai_addrlen >= offsetof(struct sockaddr, sa_data));
794 if (!IN_SET(ai->ai_addr->sa_family, AF_INET, AF_INET6)) {
795 log_warning("Unsuitable address protocol for %s", m->current_server_name->string);
799 r = server_address_new(m->current_server_name, &a, (const union sockaddr_union*) ai->ai_addr, ai->ai_addrlen);
801 log_error("Failed to add server address: %s", strerror(-r));
805 server_address_pretty(a, &pretty);
806 log_debug("Resolved address %s for %s.", pretty, m->current_server_name->string);
809 if (!m->current_server_name->addresses) {
810 log_error("Failed to find suitable address for host %s.", m->current_server_name->string);
813 return manager_connect(m);
816 manager_set_server_address(m, m->current_server_name->addresses);
818 return manager_begin(m);
821 static int manager_retry_connect(sd_event_source *source, usec_t usec, void *userdata) {
822 Manager *m = userdata;
826 return manager_connect(m);
829 int manager_connect(Manager *m) {
834 manager_disconnect(m);
836 m->event_retry = sd_event_source_unref(m->event_retry);
837 if (!ratelimit_test(&m->ratelimit)) {
838 log_debug("Slowing down attempts to contact servers.");
840 r = sd_event_add_time(m->event, &m->event_retry, clock_boottime_or_monotonic(), now(clock_boottime_or_monotonic()) + RETRY_USEC, 0, manager_retry_connect, m);
842 log_error("Failed to create retry timer: %s", strerror(-r));
849 /* If we already are operating on some address, switch to the
851 if (m->current_server_address && m->current_server_address->addresses_next)
852 manager_set_server_address(m, m->current_server_address->addresses_next);
854 struct addrinfo hints = {
855 .ai_flags = AI_NUMERICSERV|AI_ADDRCONFIG,
856 .ai_socktype = SOCK_DGRAM,
859 /* Hmm, we are through all addresses, let's look for the next host instead */
860 if (m->current_server_name && m->current_server_name->names_next)
861 manager_set_server_name(m, m->current_server_name->names_next);
866 /* Our current server name list is exhausted,
867 * let's find the next one to iterate. First
868 * we try the system list, then the link list.
869 * After having processed the link list we
870 * jump back to the system list. However, if
871 * both lists are empty, we change to the
873 if (!m->current_server_name || m->current_server_name->type == SERVER_LINK) {
874 f = m->system_servers;
880 f = m->system_servers;
886 f = m->fallback_servers;
889 manager_set_server_name(m, NULL);
890 log_debug("No server found.");
894 if (restart && !m->exhausted_servers && m->poll_interval_usec) {
895 log_debug("Waiting after exhausting servers.");
896 r = sd_event_add_time(m->event, &m->event_retry, clock_boottime_or_monotonic(), now(clock_boottime_or_monotonic()) + m->poll_interval_usec, 0, manager_retry_connect, m);
898 log_error("Failed to create retry timer: %s", strerror(-r));
902 m->exhausted_servers = true;
904 /* Increase the polling interval */
905 if (m->poll_interval_usec < NTP_POLL_INTERVAL_MAX_SEC * USEC_PER_SEC)
906 m->poll_interval_usec *= 2;
911 m->exhausted_servers = false;
913 manager_set_server_name(m, f);
916 /* Tell the resolver to reread /etc/resolv.conf, in
917 * case it changed. */
920 /* Flush out any previously resolved addresses */
921 server_name_flush_addresses(m->current_server_name);
923 log_debug("Resolving %s...", m->current_server_name->string);
925 r = sd_resolve_getaddrinfo(m->resolve, &m->resolve_query, m->current_server_name->string, "123", &hints, manager_resolve_handler, m);
927 log_error("Failed to create resolver: %s", strerror(-r));
934 r = manager_begin(m);
941 void manager_disconnect(Manager *m) {
944 m->resolve_query = sd_resolve_query_unref(m->resolve_query);
946 m->event_timer = sd_event_source_unref(m->event_timer);
948 m->event_receive = sd_event_source_unref(m->event_receive);
949 m->server_socket = safe_close(m->server_socket);
951 m->event_clock_watch = sd_event_source_unref(m->event_clock_watch);
952 m->clock_watch_fd = safe_close(m->clock_watch_fd);
954 m->event_timeout = sd_event_source_unref(m->event_timeout);
956 sd_notifyf(false, "STATUS=Idle.");
959 void manager_flush_server_names(Manager *m, ServerType t) {
962 if (t == SERVER_SYSTEM)
963 while (m->system_servers)
964 server_name_free(m->system_servers);
966 if (t == SERVER_LINK)
967 while (m->link_servers)
968 server_name_free(m->link_servers);
970 if (t == SERVER_FALLBACK)
971 while (m->fallback_servers)
972 server_name_free(m->fallback_servers);
975 void manager_free(Manager *m) {
979 manager_disconnect(m);
980 manager_flush_server_names(m, SERVER_SYSTEM);
981 manager_flush_server_names(m, SERVER_LINK);
982 manager_flush_server_names(m, SERVER_FALLBACK);
984 sd_event_source_unref(m->event_retry);
986 sd_event_source_unref(m->network_event_source);
987 sd_network_monitor_unref(m->network_monitor);
989 sd_resolve_unref(m->resolve);
990 sd_event_unref(m->event);
995 static int manager_network_read_link_servers(Manager *m) {
996 _cleanup_strv_free_ char **ntp = NULL;
1003 r = sd_network_get_ntp(&ntp);
1007 LIST_FOREACH(names, n, m->link_servers)
1010 STRV_FOREACH(i, ntp) {
1013 LIST_FOREACH(names, n, m->link_servers)
1014 if (streq(n->string, *i)) {
1021 r = server_name_new(m, NULL, SERVER_LINK, *i);
1027 LIST_FOREACH_SAFE(names, n, nx, m->link_servers)
1029 server_name_free(n);
1034 manager_flush_server_names(m, SERVER_LINK);
1038 static int manager_network_event_handler(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
1039 Manager *m = userdata;
1040 bool connected, online;
1045 sd_network_monitor_flush(m->network_monitor);
1047 manager_network_read_link_servers(m);
1049 /* check if the machine is online */
1050 online = network_is_online();
1052 /* check if the client is currently connected */
1053 connected = m->server_socket >= 0 || m->resolve_query || m->exhausted_servers;
1055 if (connected && !online) {
1056 log_info("No network connectivity, watching for changes.");
1057 manager_disconnect(m);
1059 } else if (!connected && online) {
1060 log_info("Network configuration changed, trying to establish connection.");
1062 if (m->current_server_address)
1063 r = manager_begin(m);
1065 r = manager_connect(m);
1073 static int manager_network_monitor_listen(Manager *m) {
1078 r = sd_network_monitor_new(&m->network_monitor, NULL);
1082 fd = sd_network_monitor_get_fd(m->network_monitor);
1086 events = sd_network_monitor_get_events(m->network_monitor);
1090 r = sd_event_add_io(m->event, &m->network_event_source, fd, events, manager_network_event_handler, m);
1097 int manager_new(Manager **ret) {
1098 _cleanup_(manager_freep) Manager *m = NULL;
1103 m = new0(Manager, 1);
1107 m->server_socket = m->clock_watch_fd = -1;
1109 RATELIMIT_INIT(m->ratelimit, RATELIMIT_INTERVAL_USEC, RATELIMIT_BURST);
1111 r = manager_parse_server_string(m, SERVER_FALLBACK, NTP_SERVERS);
1115 r = sd_event_default(&m->event);
1119 sd_event_add_signal(m->event, NULL, SIGTERM, NULL, NULL);
1120 sd_event_add_signal(m->event, NULL, SIGINT, NULL, NULL);
1122 sd_event_set_watchdog(m->event, true);
1124 r = sd_resolve_default(&m->resolve);
1128 r = sd_resolve_attach_event(m->resolve, m->event, 0);
1132 r = manager_network_monitor_listen(m);
1136 manager_network_read_link_servers(m);