]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/resolve/resolved-dns-server.h
resolved: automatically forget all learnt DNS server information when the network...
[thirdparty/systemd.git] / src / resolve / resolved-dns-server.h
CommitLineData
74b2466e
LP
1#pragma once
2
3/***
4 This file is part of systemd.
5
6 Copyright 2014 Lennart Poettering
7
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
12
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
17
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20***/
21
3c0cf502
LP
22#include "in-addr-util.h"
23
74b2466e 24typedef struct DnsServer DnsServer;
74b2466e 25
4e945a6f
LP
26typedef enum DnsServerType {
27 DNS_SERVER_SYSTEM,
28 DNS_SERVER_FALLBACK,
29 DNS_SERVER_LINK,
30} DnsServerType;
e3309036
ZJS
31#define _DNS_SERVER_TYPE_MAX (DNS_SERVER_LINK + 1)
32
33const char* dns_server_type_to_string(DnsServerType i) _const_;
34DnsServerType dns_server_type_from_string(const char *s) _pure_;
4e945a6f 35
be808ea0
TG
36typedef enum DnsServerFeatureLevel {
37 DNS_SERVER_FEATURE_LEVEL_TCP,
38 DNS_SERVER_FEATURE_LEVEL_UDP,
9c5e12a4 39 DNS_SERVER_FEATURE_LEVEL_EDNS0,
7586f4d1 40 DNS_SERVER_FEATURE_LEVEL_DO,
d74fb368 41 DNS_SERVER_FEATURE_LEVEL_LARGE,
be808ea0
TG
42 _DNS_SERVER_FEATURE_LEVEL_MAX,
43 _DNS_SERVER_FEATURE_LEVEL_INVALID = -1
44} DnsServerFeatureLevel;
45
46#define DNS_SERVER_FEATURE_LEVEL_WORST 0
47#define DNS_SERVER_FEATURE_LEVEL_BEST (_DNS_SERVER_FEATURE_LEVEL_MAX - 1)
48
49const char* dns_server_feature_level_to_string(int i) _const_;
50int dns_server_feature_level_from_string(const char *s) _pure_;
51
3e684349 52#include "resolved-link.h"
be808ea0 53#include "resolved-manager.h"
3e684349 54
74b2466e
LP
55struct DnsServer {
56 Manager *manager;
74b2466e 57
91b14d6f
TG
58 unsigned n_ref;
59
4e945a6f 60 DnsServerType type;
3c0cf502
LP
61 Link *link;
62
0dd25fb9 63 int family;
74b2466e 64 union in_addr_union address;
2817157b 65 int ifindex; /* for IPv6 link-local DNS servers */
74b2466e 66
6cb08a89
LP
67 char *server_string;
68
9df3ba6c
TG
69 usec_t resend_timeout;
70 usec_t max_rtt;
71
f4461e56
LP
72 DnsServerFeatureLevel verified_feature_level;
73 DnsServerFeatureLevel possible_feature_level;
de54e62b 74
d74fb368 75 size_t received_udp_packet_max;
de54e62b 76
6bb2c085
LP
77 unsigned n_failed_udp;
78 unsigned n_failed_tcp;
de54e62b 79
6bb2c085 80 bool packet_truncated:1;
de54e62b
LP
81 bool packet_bad_opt:1;
82 bool packet_rrsig_missing:1;
83
be808ea0
TG
84 usec_t verified_usec;
85 usec_t features_grace_period_usec;
74b2466e 86
1e02e182
LP
87 /* Whether we already warned about downgrading to non-DNSSEC mode for this server */
88 bool warned_downgrade:1;
89
b652d4a2
LP
90 /* Used when GC'ing old DNS servers when configuration changes. */
91 bool marked:1;
92
0eac4623
LP
93 /* If linked is set, then this server appears in the servers linked list */
94 bool linked:1;
74b2466e
LP
95 LIST_FIELDS(DnsServer, servers);
96};
97
98int dns_server_new(
99 Manager *m,
0b58db65 100 DnsServer **ret,
4e945a6f 101 DnsServerType type,
0b58db65 102 Link *link,
0dd25fb9 103 int family,
2817157b
LP
104 const union in_addr_union *address,
105 int ifindex);
74b2466e 106
91b14d6f
TG
107DnsServer* dns_server_ref(DnsServer *s);
108DnsServer* dns_server_unref(DnsServer *s);
87f5a193 109
0eac4623 110void dns_server_unlink(DnsServer *s);
0b58db65 111void dns_server_move_back_and_unmark(DnsServer *s);
0eac4623 112
6bb2c085
LP
113void dns_server_packet_received(DnsServer *s, int protocol, DnsServerFeatureLevel level, usec_t rtt, size_t size);
114void dns_server_packet_lost(DnsServer *s, int protocol, DnsServerFeatureLevel level, usec_t usec);
6bb2c085 115void dns_server_packet_truncated(DnsServer *s, DnsServerFeatureLevel level);
de54e62b
LP
116void dns_server_packet_rrsig_missing(DnsServer *s, DnsServerFeatureLevel level);
117void dns_server_packet_bad_opt(DnsServer *s, DnsServerFeatureLevel level);
d001e0a3 118void dns_server_packet_rcode_downgrade(DnsServer *s, DnsServerFeatureLevel level);
9df3ba6c 119
f4461e56
LP
120DnsServerFeatureLevel dns_server_possible_feature_level(DnsServer *s);
121
519ef046
LP
122int dns_server_adjust_opt(DnsServer *server, DnsPacket *packet, DnsServerFeatureLevel level);
123
6cb08a89 124const char *dns_server_string(DnsServer *server);
2817157b 125int dns_server_ifindex(const DnsServer *s);
6cb08a89 126
92ec902a
LP
127bool dns_server_dnssec_supported(DnsServer *server);
128
1e02e182
LP
129void dns_server_warn_downgrade(DnsServer *server);
130
b9fe94ca
MP
131bool dns_server_limited_domains(DnsServer *server);
132
2817157b 133DnsServer *dns_server_find(DnsServer *first, int family, const union in_addr_union *in_addr, int ifindex);
4b95f179
LP
134
135void dns_server_unlink_all(DnsServer *first);
136void dns_server_unlink_marked(DnsServer *first);
137void dns_server_mark_all(DnsServer *first);
f2f1dbe5 138
4b95f179 139DnsServer *manager_get_first_dns_server(Manager *m, DnsServerType t);
636e813d 140
0eac4623 141DnsServer *manager_set_dns_server(Manager *m, DnsServer *s);
0eac4623
LP
142DnsServer *manager_get_dns_server(Manager *m);
143void manager_next_dns_server(Manager *m);
144
b30bf55d
LP
145bool dns_server_address_valid(int family, const union in_addr_union *sa);
146
12bf2331
LP
147DnssecMode dns_server_get_dnssec_mode(DnsServer *s);
148
8300ba21
TG
149DEFINE_TRIVIAL_CLEANUP_FUNC(DnsServer*, dns_server_unref);
150
d5099efc 151extern const struct hash_ops dns_server_hash_ops;
ce7c8b20
LP
152
153void dns_server_flush_cache(DnsServer *s);
59c0fd0e
LP
154
155void dns_server_reset_features(DnsServer *s);
156void dns_server_reset_features_all(DnsServer *s);