]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/timesync/timesyncd-manager.h
Merge pull request #8868 from yuwata/resolve-show-current-server
[thirdparty/systemd.git] / src / timesync / timesyncd-manager.h
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2 #pragma once
3
4 /***
5 This file is part of systemd.
6
7 Copyright 2014 Kay Sievers, Lennart Poettering
8 ***/
9
10 #include <sys/timex.h>
11
12 #include "sd-bus.h"
13 #include "sd-event.h"
14 #include "sd-network.h"
15 #include "sd-resolve.h"
16
17 #include "list.h"
18 #include "ratelimit.h"
19 #include "time-util.h"
20 #include "timesyncd-ntp-message.h"
21
22 typedef struct Manager Manager;
23
24 #include "timesyncd-server.h"
25
26 /*
27 * "A client MUST NOT under any conditions use a poll interval less
28 * than 15 seconds."
29 */
30 #define NTP_POLL_INTERVAL_MIN_USEC (32 * USEC_PER_SEC)
31 #define NTP_POLL_INTERVAL_MAX_USEC (2048 * USEC_PER_SEC)
32
33 struct Manager {
34 sd_bus *bus;
35 sd_event *event;
36 sd_resolve *resolve;
37
38 LIST_HEAD(ServerName, system_servers);
39 LIST_HEAD(ServerName, link_servers);
40 LIST_HEAD(ServerName, fallback_servers);
41
42 bool have_fallbacks:1;
43
44 RateLimit ratelimit;
45 bool exhausted_servers;
46
47 /* network */
48 sd_event_source *network_event_source;
49 sd_network_monitor *network_monitor;
50
51 /* peer */
52 sd_resolve_query *resolve_query;
53 sd_event_source *event_receive;
54 ServerName *current_server_name;
55 ServerAddress *current_server_address;
56 int server_socket;
57 int missed_replies;
58 uint64_t packet_count;
59 sd_event_source *event_timeout;
60 bool good;
61
62 /* last sent packet */
63 struct timespec trans_time_mon;
64 struct timespec trans_time;
65 usec_t retry_interval;
66 bool pending;
67
68 /* poll timer */
69 sd_event_source *event_timer;
70 usec_t poll_interval_usec;
71 usec_t poll_interval_min_usec;
72 usec_t poll_interval_max_usec;
73 bool poll_resync;
74
75 /* history data */
76 struct {
77 double offset;
78 double delay;
79 } samples[8];
80 unsigned int samples_idx;
81 double samples_jitter;
82 usec_t max_root_distance_usec;
83
84 /* last change */
85 bool jumped;
86 bool sync;
87 long drift_freq;
88
89 /* watch for time changes */
90 sd_event_source *event_clock_watch;
91 int clock_watch_fd;
92
93 /* Retry connections */
94 sd_event_source *event_retry;
95
96 /* RTC runs in local time, leave it alone */
97 bool rtc_local_time;
98
99 /* NTP response */
100 struct ntp_msg ntpmsg;
101 struct timespec origin_time, dest_time;
102 bool spike;
103 };
104
105 int manager_new(Manager **ret);
106 void manager_free(Manager *m);
107
108 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
109
110 void manager_set_server_name(Manager *m, ServerName *n);
111 void manager_set_server_address(Manager *m, ServerAddress *a);
112 void manager_flush_server_names(Manager *m, ServerType t);
113
114 int manager_connect(Manager *m);
115 void manager_disconnect(Manager *m);