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