]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/resolve/resolved-manager.h
cbe635ff9479605e80faf985ef9507da1cc8f902
[thirdparty/systemd.git] / src / resolve / resolved-manager.h
1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
2 #pragma once
3
4 #include <sys/stat.h>
5
6 #include "common-signal.h"
7 #include "forward.h"
8 #include "list.h"
9 #include "resolve-util.h"
10 #include "resolved-dns-dnssec.h"
11 #include "resolved-dns-stream.h"
12 #include "resolved-dns-stub.h"
13 #include "resolved-dns-trust-anchor.h"
14 #include "resolved-etc-hosts.h"
15 #include "resolved-forward.h"
16
17 #define MANAGER_SEARCH_DOMAINS_MAX 256
18 #define MANAGER_DNS_SERVERS_MAX 256
19
20 typedef struct Manager {
21 sd_event *event;
22
23 ResolveSupport llmnr_support;
24 ResolveSupport mdns_support;
25 DnssecMode dnssec_mode;
26 DnsOverTlsMode dns_over_tls_mode;
27 DnsCacheMode enable_cache;
28 bool cache_from_localhost;
29 DnsStubListenerMode dns_stub_listener_mode;
30 usec_t stale_retention_usec;
31
32 #if ENABLE_DNS_OVER_TLS
33 DnsTlsManagerData dnstls_data;
34 #endif
35
36 /* Network */
37 Hashmap *links;
38
39 sd_netlink *rtnl;
40 sd_event_source *rtnl_event_source;
41
42 sd_network_monitor *network_monitor;
43 sd_event_source *network_event_source;
44
45 /* DNS query management */
46 Hashmap *dns_transactions;
47 LIST_HEAD(DnsQuery, dns_queries);
48 unsigned n_dns_queries;
49 Hashmap *stub_queries_by_packet;
50
51 LIST_HEAD(DnsStream, dns_streams);
52 unsigned n_dns_streams[_DNS_STREAM_TYPE_MAX];
53
54 /* Unicast dns */
55 LIST_HEAD(DnsServer, dns_servers);
56 LIST_HEAD(DnsServer, fallback_dns_servers);
57 unsigned n_dns_servers; /* counts both main and fallback */
58 DnsServer *current_dns_server;
59
60 LIST_HEAD(DnsSearchDomain, search_domains);
61 unsigned n_search_domains;
62
63 bool need_builtin_fallbacks;
64 bool read_resolv_conf;
65 bool resolve_unicast_single_label;
66
67 struct stat resolv_conf_stat;
68
69 DnsTrustAnchor trust_anchor;
70
71 LIST_HEAD(DnsScope, dns_scopes);
72 DnsScope *unicast_scope;
73
74 Hashmap *delegates; /* id string → DnsDelegate objects */
75
76 /* LLMNR */
77 int llmnr_ipv4_udp_fd;
78 int llmnr_ipv6_udp_fd;
79 int llmnr_ipv4_tcp_fd;
80 int llmnr_ipv6_tcp_fd;
81
82 sd_event_source *llmnr_ipv4_udp_event_source;
83 sd_event_source *llmnr_ipv6_udp_event_source;
84 sd_event_source *llmnr_ipv4_tcp_event_source;
85 sd_event_source *llmnr_ipv6_tcp_event_source;
86
87 /* mDNS */
88 int mdns_ipv4_fd;
89 int mdns_ipv6_fd;
90 sd_event_source *mdns_ipv4_event_source;
91 sd_event_source *mdns_ipv6_event_source;
92
93 /* DNS-SD */
94 Hashmap *dnssd_services;
95
96 /* dbus */
97 sd_bus *bus;
98
99 /* The hostname we publish on LLMNR and mDNS */
100 char *full_hostname;
101 char *llmnr_hostname;
102 char *mdns_hostname;
103 DnsResourceKey *llmnr_host_ipv4_key;
104 DnsResourceKey *llmnr_host_ipv6_key;
105 DnsResourceKey *mdns_host_ipv4_key;
106 DnsResourceKey *mdns_host_ipv6_key;
107
108 /* Watch the system hostname */
109 int hostname_fd;
110 sd_event_source *hostname_event_source;
111
112 unsigned n_transactions_total;
113 unsigned n_timeouts_total;
114 unsigned n_timeouts_served_stale_total;
115 unsigned n_failure_responses_total;
116 unsigned n_failure_responses_served_stale_total;
117
118 unsigned n_dnssec_verdict[_DNSSEC_VERDICT_MAX];
119
120 /* Data from /etc/hosts */
121 EtcHosts etc_hosts;
122 usec_t etc_hosts_last;
123 struct stat etc_hosts_stat;
124 bool read_etc_hosts;
125
126 /* List of refused DNS Record Types*/
127 Set *refuse_record_types;
128
129 OrderedSet *dns_extra_stub_listeners;
130
131 /* Local DNS stub on 127.0.0.53:53 */
132 sd_event_source *dns_stub_udp_event_source;
133 sd_event_source *dns_stub_tcp_event_source;
134
135 /* Local DNS proxy stub on 127.0.0.54:53 */
136 sd_event_source *dns_proxy_stub_udp_event_source;
137 sd_event_source *dns_proxy_stub_tcp_event_source;
138
139 Hashmap *polkit_registry;
140
141 sd_varlink_server *varlink_server;
142 sd_varlink_server *varlink_monitor_server;
143
144 Set *varlink_query_results_subscription;
145 Set *varlink_dns_configuration_subscription;
146
147 sd_json_variant *dns_configuration_json;
148
149 sd_netlink_slot *netlink_new_route_slot;
150 sd_netlink_slot *netlink_del_route_slot;
151
152 sd_event_source *clock_change_event_source;
153
154 LIST_HEAD(SocketGraveyard, socket_graveyard);
155 SocketGraveyard *socket_graveyard_oldest;
156 size_t n_socket_graveyard;
157
158 struct sigrtmin18_info sigrtmin18_info;
159 } Manager;
160
161 /* Manager */
162
163 int manager_new(Manager **ret);
164 Manager* manager_free(Manager *m);
165
166 int manager_start(Manager *m);
167
168 uint32_t manager_find_mtu(Manager *m);
169
170 int manager_monitor_send(Manager *m, DnsQuery *q);
171
172 int sendmsg_loop(int fd, struct msghdr *mh, int flags);
173 int manager_write(Manager *m, int fd, DnsPacket *p);
174 int manager_send(Manager *m, int fd, int ifindex, int family, const union in_addr_union *destination, uint16_t port, const union in_addr_union *source, DnsPacket *p);
175 int manager_recv(Manager *m, int fd, DnsProtocol protocol, DnsPacket **ret);
176
177 int manager_find_ifindex(Manager *m, int family, const union in_addr_union *in_addr);
178 LinkAddress* manager_find_link_address(Manager *m, int family, const union in_addr_union *in_addr);
179
180 void manager_refresh_rrs(Manager *m);
181 int manager_next_hostname(Manager *m);
182
183 bool manager_packet_from_local_address(Manager *m, DnsPacket *p);
184 bool manager_packet_from_our_transaction(Manager *m, DnsPacket *p);
185
186 DnsScope* manager_find_scope(Manager *m, DnsPacket *p);
187
188 void manager_verify_all(Manager *m);
189
190 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
191
192 /* For some reason we need some extra cmsg space on some kernels/archs. One of those days we need to figure out why */
193 #define EXTRA_CMSG_SPACE 1024
194
195 int manager_is_own_hostname(Manager *m, const char *name);
196
197 int manager_compile_dns_servers(Manager *m, OrderedSet **servers);
198 int manager_compile_search_domains(Manager *m, OrderedSet **domains, int filter_route);
199
200 DnssecMode manager_get_dnssec_mode(Manager *m);
201 bool manager_dnssec_supported(Manager *m);
202
203 DnsOverTlsMode manager_get_dns_over_tls_mode(Manager *m);
204
205 void manager_dnssec_verdict(Manager *m, DnssecVerdict verdict, const DnsResourceKey *key);
206
207 bool manager_routable(Manager *m);
208
209 void manager_flush_caches(Manager *m, int log_level);
210 void manager_reset_server_features(Manager *m);
211
212 void manager_cleanup_saved_user(Manager *m);
213
214 bool manager_next_dnssd_names(Manager *m);
215
216 bool manager_server_is_stub(Manager *m, DnsServer *s);
217
218 int socket_disable_pmtud(int fd, int af);
219
220 int dns_manager_dump_statistics_json(Manager *m, sd_json_variant **ret);
221
222 void dns_manager_reset_statistics(Manager *m);
223
224 int manager_dump_dns_configuration_json(Manager *m, sd_json_variant **ret);
225 int manager_send_dns_configuration_changed(Manager *m, Link *l, bool reset);
226
227 int manager_start_dns_configuration_monitor(Manager *m);
228 void manager_stop_dns_configuration_monitor(Manager *m);