1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
6 #include "common-signal.h"
9 #include "resolve-util.h"
10 #include "resolved-dns-browse-services.h"
11 #include "resolved-dns-dnssec.h"
12 #include "resolved-dns-stream.h"
13 #include "resolved-dns-stub.h"
14 #include "resolved-dns-trust-anchor.h"
15 #include "resolved-etc-hosts.h"
16 #include "resolved-forward.h"
18 #define MANAGER_SEARCH_DOMAINS_MAX 1024
19 #define MANAGER_DNS_SERVERS_MAX 256
21 typedef struct Manager
{
24 ResolveSupport llmnr_support
;
25 ResolveSupport mdns_support
;
26 DnssecMode dnssec_mode
;
27 DnsOverTlsMode dns_over_tls_mode
;
28 DnsCacheMode enable_cache
;
29 bool cache_from_localhost
;
30 DnsStubListenerMode dns_stub_listener_mode
;
31 usec_t stale_retention_usec
;
33 #if ENABLE_DNS_OVER_TLS
34 DnsTlsManagerData dnstls_data
;
41 sd_event_source
*rtnl_event_source
;
43 sd_network_monitor
*network_monitor
;
44 sd_event_source
*network_event_source
;
46 /* DNS query management */
47 Hashmap
*dns_transactions
;
48 LIST_HEAD(DnsQuery
, dns_queries
);
49 unsigned n_dns_queries
;
50 Hashmap
*stub_queries_by_packet
;
52 LIST_HEAD(DnsStream
, dns_streams
);
53 unsigned n_dns_streams
[_DNS_STREAM_TYPE_MAX
];
56 LIST_HEAD(DnsServer
, dns_servers
);
57 LIST_HEAD(DnsServer
, fallback_dns_servers
);
58 unsigned n_dns_servers
; /* counts both main and fallback */
59 DnsServer
*current_dns_server
;
61 LIST_HEAD(DnsSearchDomain
, search_domains
);
62 unsigned n_search_domains
;
64 bool need_builtin_fallbacks
;
65 bool read_resolv_conf
;
66 bool resolve_unicast_single_label
;
68 struct stat resolv_conf_stat
;
70 DnsTrustAnchor trust_anchor
;
72 LIST_HEAD(DnsScope
, dns_scopes
);
73 DnsScope
*unicast_scope
;
75 Hashmap
*delegates
; /* id string → DnsDelegate objects */
78 int llmnr_ipv4_udp_fd
;
79 int llmnr_ipv6_udp_fd
;
80 int llmnr_ipv4_tcp_fd
;
81 int llmnr_ipv6_tcp_fd
;
83 sd_event_source
*llmnr_ipv4_udp_event_source
;
84 sd_event_source
*llmnr_ipv6_udp_event_source
;
85 sd_event_source
*llmnr_ipv4_tcp_event_source
;
86 sd_event_source
*llmnr_ipv6_tcp_event_source
;
91 sd_event_source
*mdns_ipv4_event_source
;
92 sd_event_source
*mdns_ipv6_event_source
;
95 Hashmap
*dnssd_registered_services
;
100 /* The hostname we publish on LLMNR and mDNS */
102 char *llmnr_hostname
;
104 DnsResourceKey
*llmnr_host_ipv4_key
;
105 DnsResourceKey
*llmnr_host_ipv6_key
;
106 DnsResourceKey
*mdns_host_ipv4_key
;
107 DnsResourceKey
*mdns_host_ipv6_key
;
109 /* Watch the system hostname */
111 sd_event_source
*hostname_event_source
;
113 unsigned n_transactions_total
;
114 unsigned n_timeouts_total
;
115 unsigned n_timeouts_served_stale_total
;
116 unsigned n_failure_responses_total
;
117 unsigned n_failure_responses_served_stale_total
;
119 unsigned n_dnssec_verdict
[_DNSSEC_VERDICT_MAX
];
121 /* Data from /etc/hosts */
123 usec_t etc_hosts_last
;
124 struct stat etc_hosts_stat
;
127 /* List of refused DNS Record Types*/
128 Set
*refuse_record_types
;
130 OrderedSet
*dns_extra_stub_listeners
;
132 /* Local DNS stub on 127.0.0.53:53 */
133 sd_event_source
*dns_stub_udp_event_source
;
134 sd_event_source
*dns_stub_tcp_event_source
;
136 /* Local DNS proxy stub on 127.0.0.54:53 */
137 sd_event_source
*dns_proxy_stub_udp_event_source
;
138 sd_event_source
*dns_proxy_stub_tcp_event_source
;
140 Hashmap
*polkit_registry
;
142 sd_varlink_server
*varlink_server
;
143 sd_varlink_server
*varlink_monitor_server
;
145 Set
*varlink_query_results_subscription
;
146 Set
*varlink_dns_configuration_subscription
;
148 sd_json_variant
*dns_configuration_json
;
150 sd_netlink_slot
*netlink_new_route_slot
;
151 sd_netlink_slot
*netlink_del_route_slot
;
153 sd_event_source
*clock_change_event_source
;
155 LIST_HEAD(SocketGraveyard
, socket_graveyard
);
156 SocketGraveyard
*socket_graveyard_oldest
;
157 size_t n_socket_graveyard
;
159 struct sigrtmin18_info sigrtmin18_info
;
161 /* Map varlink links to DnsServiceBrowser instances. */
162 Hashmap
*dns_service_browsers
;
167 int manager_new(Manager
**ret
);
168 Manager
* manager_free(Manager
*m
);
170 int manager_start(Manager
*m
);
172 uint32_t manager_find_mtu(Manager
*m
);
174 int manager_monitor_send(Manager
*m
, DnsQuery
*q
);
176 int sendmsg_loop(int fd
, struct msghdr
*mh
, int flags
);
177 int manager_write(Manager
*m
, int fd
, DnsPacket
*p
);
178 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
);
179 int manager_recv(Manager
*m
, int fd
, DnsProtocol protocol
, DnsPacket
**ret
);
181 int manager_find_ifindex(Manager
*m
, int family
, const union in_addr_union
*in_addr
);
182 LinkAddress
* manager_find_link_address(Manager
*m
, int family
, const union in_addr_union
*in_addr
);
184 void manager_refresh_rrs(Manager
*m
);
185 int manager_next_hostname(Manager
*m
);
187 bool manager_packet_from_local_address(Manager
*m
, DnsPacket
*p
);
188 bool manager_packet_from_our_transaction(Manager
*m
, DnsPacket
*p
);
190 DnsScope
* manager_find_scope_from_protocol(Manager
*m
, int ifindex
, DnsProtocol protocol
, int family
);
192 static inline DnsScope
* manager_find_scope(Manager
*m
, DnsPacket
*p
) {
195 return manager_find_scope_from_protocol(m
, p
->ifindex
, p
->protocol
, p
->family
);
198 void manager_verify_all(Manager
*m
);
200 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager
*, manager_free
);
202 /* For some reason we need some extra cmsg space on some kernels/archs. One of those days we need to figure out why */
203 #define EXTRA_CMSG_SPACE 1024
205 int manager_is_own_hostname(Manager
*m
, const char *name
);
207 int manager_compile_dns_servers(Manager
*m
, OrderedSet
**servers
);
208 int manager_compile_search_domains(Manager
*m
, OrderedSet
**domains
, int filter_route
);
210 DnssecMode
manager_get_dnssec_mode(Manager
*m
);
211 bool manager_dnssec_supported(Manager
*m
);
213 DnsOverTlsMode
manager_get_dns_over_tls_mode(Manager
*m
);
215 void manager_dnssec_verdict(Manager
*m
, DnssecVerdict verdict
, const DnsResourceKey
*key
);
217 bool manager_routable(Manager
*m
);
219 void manager_flush_caches(Manager
*m
, int log_level
);
220 void manager_reset_server_features(Manager
*m
);
222 void manager_cleanup_saved_user(Manager
*m
);
224 bool manager_next_dnssd_names(Manager
*m
);
226 bool manager_server_is_stub(Manager
*m
, DnsServer
*s
);
228 int socket_disable_pmtud(int fd
, int af
);
230 int dns_manager_dump_statistics_json(Manager
*m
, sd_json_variant
**ret
);
232 void dns_manager_reset_statistics(Manager
*m
);
234 int manager_dump_dns_configuration_json(Manager
*m
, sd_json_variant
**ret
);
235 int manager_send_dns_configuration_changed(Manager
*m
, Link
*l
, bool reset
);
237 int manager_start_dns_configuration_monitor(Manager
*m
);
238 void manager_stop_dns_configuration_monitor(Manager
*m
);