]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/resolve/resolved-manager.h
Merge pull request #8575 from keszybz/non-absolute-paths
[thirdparty/systemd.git] / src / resolve / resolved-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 Tom Gundersen <teg@jklm.no>
8 ***/
9
10 #include "sd-event.h"
11 #include "sd-netlink.h"
12 #include "sd-network.h"
13
14 #include "hashmap.h"
15 #include "list.h"
16 #include "ordered-set.h"
17 #include "resolve-util.h"
18
19 typedef struct Manager Manager;
20
21 #include "resolved-conf.h"
22 #include "resolved-dns-query.h"
23 #include "resolved-dns-search-domain.h"
24 #include "resolved-dns-server.h"
25 #include "resolved-dns-stream.h"
26 #include "resolved-dns-trust-anchor.h"
27 #include "resolved-link.h"
28
29 #define MANAGER_SEARCH_DOMAINS_MAX 32
30 #define MANAGER_DNS_SERVERS_MAX 32
31
32 struct Manager {
33 sd_event *event;
34
35 ResolveSupport llmnr_support;
36 ResolveSupport mdns_support;
37 DnssecMode dnssec_mode;
38 bool enable_cache;
39 DnsStubListenerMode dns_stub_listener_mode;
40
41 /* Network */
42 Hashmap *links;
43
44 sd_netlink *rtnl;
45 sd_event_source *rtnl_event_source;
46
47 sd_network_monitor *network_monitor;
48 sd_event_source *network_event_source;
49
50 /* DNS query management */
51 Hashmap *dns_transactions;
52 LIST_HEAD(DnsQuery, dns_queries);
53 unsigned n_dns_queries;
54
55 LIST_HEAD(DnsStream, dns_streams);
56 unsigned n_dns_streams;
57
58 /* Unicast dns */
59 LIST_HEAD(DnsServer, dns_servers);
60 LIST_HEAD(DnsServer, fallback_dns_servers);
61 unsigned n_dns_servers; /* counts both main and fallback */
62 DnsServer *current_dns_server;
63
64 LIST_HEAD(DnsSearchDomain, search_domains);
65 unsigned n_search_domains;
66
67 bool need_builtin_fallbacks:1;
68
69 bool read_resolv_conf:1;
70 usec_t resolv_conf_mtime;
71
72 DnsTrustAnchor trust_anchor;
73
74 LIST_HEAD(DnsScope, dns_scopes);
75 DnsScope *unicast_scope;
76
77 /* LLMNR */
78 int llmnr_ipv4_udp_fd;
79 int llmnr_ipv6_udp_fd;
80 int llmnr_ipv4_tcp_fd;
81 int llmnr_ipv6_tcp_fd;
82
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;
87
88 /* mDNS */
89 int mdns_ipv4_fd;
90 int mdns_ipv6_fd;
91
92 /* DNS-SD */
93 Hashmap *dnssd_services;
94
95 sd_event_source *mdns_ipv4_event_source;
96 sd_event_source *mdns_ipv6_event_source;
97
98 /* dbus */
99 sd_bus *bus;
100
101 /* The hostname we publish on LLMNR and mDNS */
102 char *full_hostname;
103 char *llmnr_hostname;
104 char *mdns_hostname;
105 DnsResourceKey *llmnr_host_ipv4_key;
106 DnsResourceKey *llmnr_host_ipv6_key;
107 DnsResourceKey *mdns_host_ipv4_key;
108 DnsResourceKey *mdns_host_ipv6_key;
109
110 /* Watch the system hostname */
111 int hostname_fd;
112 sd_event_source *hostname_event_source;
113
114 /* Watch for system suspends */
115 sd_bus_slot *prepare_for_sleep_slot;
116
117 sd_event_source *sigusr1_event_source;
118 sd_event_source *sigusr2_event_source;
119 sd_event_source *sigrtmin1_event_source;
120
121 unsigned n_transactions_total;
122 unsigned n_dnssec_verdict[_DNSSEC_VERDICT_MAX];
123
124 /* Data from /etc/hosts */
125 Set* etc_hosts_by_address;
126 Hashmap* etc_hosts_by_name;
127 usec_t etc_hosts_last, etc_hosts_mtime;
128
129 /* Local DNS stub on 127.0.0.53:53 */
130 int dns_stub_udp_fd;
131 int dns_stub_tcp_fd;
132
133 sd_event_source *dns_stub_udp_event_source;
134 sd_event_source *dns_stub_tcp_event_source;
135
136 Hashmap *polkit_registry;
137 };
138
139 /* Manager */
140
141 int manager_new(Manager **ret);
142 Manager* manager_free(Manager *m);
143
144 int manager_start(Manager *m);
145
146 uint32_t manager_find_mtu(Manager *m);
147
148 int manager_write(Manager *m, int fd, DnsPacket *p);
149 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);
150 int manager_recv(Manager *m, int fd, DnsProtocol protocol, DnsPacket **ret);
151
152 int manager_find_ifindex(Manager *m, int family, const union in_addr_union *in_addr);
153 LinkAddress* manager_find_link_address(Manager *m, int family, const union in_addr_union *in_addr);
154
155 void manager_refresh_rrs(Manager *m);
156 int manager_next_hostname(Manager *m);
157
158 bool manager_our_packet(Manager *m, DnsPacket *p);
159 DnsScope* manager_find_scope(Manager *m, DnsPacket *p);
160
161 void manager_verify_all(Manager *m);
162
163 DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free);
164
165 #define EXTRA_CMSG_SPACE 1024
166
167 int manager_is_own_hostname(Manager *m, const char *name);
168
169 int manager_compile_dns_servers(Manager *m, OrderedSet **servers);
170 int manager_compile_search_domains(Manager *m, OrderedSet **domains, int filter_route);
171
172 DnssecMode manager_get_dnssec_mode(Manager *m);
173 bool manager_dnssec_supported(Manager *m);
174
175 void manager_dnssec_verdict(Manager *m, DnssecVerdict verdict, const DnsResourceKey *key);
176
177 bool manager_routable(Manager *m, int family);
178
179 void manager_flush_caches(Manager *m);
180 void manager_reset_server_features(Manager *m);
181
182 void manager_cleanup_saved_user(Manager *m);
183
184 bool manager_next_dnssd_names(Manager *m);