1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
6 #include "common-signal.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"
17 #define MANAGER_SEARCH_DOMAINS_MAX 256
18 #define MANAGER_DNS_SERVERS_MAX 256
20 typedef struct Manager
{
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
;
32 #if ENABLE_DNS_OVER_TLS
33 DnsTlsManagerData dnstls_data
;
40 sd_event_source
*rtnl_event_source
;
42 sd_network_monitor
*network_monitor
;
43 sd_event_source
*network_event_source
;
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
;
51 LIST_HEAD(DnsStream
, dns_streams
);
52 unsigned n_dns_streams
[_DNS_STREAM_TYPE_MAX
];
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
;
60 LIST_HEAD(DnsSearchDomain
, search_domains
);
61 unsigned n_search_domains
;
63 bool need_builtin_fallbacks
;
64 bool read_resolv_conf
;
65 bool resolve_unicast_single_label
;
67 struct stat resolv_conf_stat
;
69 DnsTrustAnchor trust_anchor
;
71 LIST_HEAD(DnsScope
, dns_scopes
);
72 DnsScope
*unicast_scope
;
74 Hashmap
*delegates
; /* id string → DnsDelegate objects */
77 int llmnr_ipv4_udp_fd
;
78 int llmnr_ipv6_udp_fd
;
79 int llmnr_ipv4_tcp_fd
;
80 int llmnr_ipv6_tcp_fd
;
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
;
90 sd_event_source
*mdns_ipv4_event_source
;
91 sd_event_source
*mdns_ipv6_event_source
;
94 Hashmap
*dnssd_services
;
99 /* The hostname we publish on LLMNR and mDNS */
101 char *llmnr_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
;
108 /* Watch the system hostname */
110 sd_event_source
*hostname_event_source
;
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
;
118 unsigned n_dnssec_verdict
[_DNSSEC_VERDICT_MAX
];
120 /* Data from /etc/hosts */
122 usec_t etc_hosts_last
;
123 struct stat etc_hosts_stat
;
126 /* List of refused DNS Record Types*/
127 Set
*refuse_record_types
;
129 OrderedSet
*dns_extra_stub_listeners
;
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
;
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
;
139 Hashmap
*polkit_registry
;
141 sd_varlink_server
*varlink_server
;
142 sd_varlink_server
*varlink_monitor_server
;
144 Set
*varlink_query_results_subscription
;
145 Set
*varlink_dns_configuration_subscription
;
147 sd_json_variant
*dns_configuration_json
;
149 sd_netlink_slot
*netlink_new_route_slot
;
150 sd_netlink_slot
*netlink_del_route_slot
;
152 sd_event_source
*clock_change_event_source
;
154 LIST_HEAD(SocketGraveyard
, socket_graveyard
);
155 SocketGraveyard
*socket_graveyard_oldest
;
156 size_t n_socket_graveyard
;
158 struct sigrtmin18_info sigrtmin18_info
;
163 int manager_new(Manager
**ret
);
164 Manager
* manager_free(Manager
*m
);
166 int manager_start(Manager
*m
);
168 uint32_t manager_find_mtu(Manager
*m
);
170 int manager_monitor_send(Manager
*m
, DnsQuery
*q
);
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
);
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
);
180 void manager_refresh_rrs(Manager
*m
);
181 int manager_next_hostname(Manager
*m
);
183 bool manager_packet_from_local_address(Manager
*m
, DnsPacket
*p
);
184 bool manager_packet_from_our_transaction(Manager
*m
, DnsPacket
*p
);
186 DnsScope
* manager_find_scope(Manager
*m
, DnsPacket
*p
);
188 void manager_verify_all(Manager
*m
);
190 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager
*, manager_free
);
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
195 int manager_is_own_hostname(Manager
*m
, const char *name
);
197 int manager_compile_dns_servers(Manager
*m
, OrderedSet
**servers
);
198 int manager_compile_search_domains(Manager
*m
, OrderedSet
**domains
, int filter_route
);
200 DnssecMode
manager_get_dnssec_mode(Manager
*m
);
201 bool manager_dnssec_supported(Manager
*m
);
203 DnsOverTlsMode
manager_get_dns_over_tls_mode(Manager
*m
);
205 void manager_dnssec_verdict(Manager
*m
, DnssecVerdict verdict
, const DnsResourceKey
*key
);
207 bool manager_routable(Manager
*m
);
209 void manager_flush_caches(Manager
*m
, int log_level
);
210 void manager_reset_server_features(Manager
*m
);
212 void manager_cleanup_saved_user(Manager
*m
);
214 bool manager_next_dnssd_names(Manager
*m
);
216 bool manager_server_is_stub(Manager
*m
, DnsServer
*s
);
218 int socket_disable_pmtud(int fd
, int af
);
220 int dns_manager_dump_statistics_json(Manager
*m
, sd_json_variant
**ret
);
222 void dns_manager_reset_statistics(Manager
*m
);
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
);
227 int manager_start_dns_configuration_monitor(Manager
*m
);
228 void manager_stop_dns_configuration_monitor(Manager
*m
);