Coverage Report

Created: 2025-08-28 06:46

/src/systemd/src/resolve/resolved-dns-transaction.h
Line
Count
Source (jump to first uncovered line)
1
/* SPDX-License-Identifier: LGPL-2.1-or-later */
2
#pragma once
3
4
#include "list.h"
5
#include "resolved-def.h"
6
#include "resolved-dns-dnssec.h"
7
#include "resolved-dns-server.h"
8
#include "resolved-forward.h"
9
10
typedef enum DnsTransactionState {
11
        DNS_TRANSACTION_NULL,
12
        DNS_TRANSACTION_PENDING,
13
        DNS_TRANSACTION_VALIDATING,
14
        DNS_TRANSACTION_RCODE_FAILURE,
15
        DNS_TRANSACTION_SUCCESS,
16
        DNS_TRANSACTION_NO_SERVERS,
17
        DNS_TRANSACTION_TIMEOUT,
18
        DNS_TRANSACTION_ATTEMPTS_MAX_REACHED,
19
        DNS_TRANSACTION_INVALID_REPLY,
20
        DNS_TRANSACTION_ERRNO,
21
        DNS_TRANSACTION_ABORTED,
22
        DNS_TRANSACTION_DNSSEC_FAILED,
23
        DNS_TRANSACTION_NO_TRUST_ANCHOR,
24
        DNS_TRANSACTION_RR_TYPE_UNSUPPORTED,
25
        DNS_TRANSACTION_NETWORK_DOWN,
26
        DNS_TRANSACTION_NOT_FOUND, /* like NXDOMAIN, but when LLMNR/TCP connections fail */
27
        DNS_TRANSACTION_NO_SOURCE, /* All suitable DnsTransactionSource turned off */
28
        DNS_TRANSACTION_STUB_LOOP,
29
        _DNS_TRANSACTION_STATE_MAX,
30
        _DNS_TRANSACTION_STATE_INVALID = -EINVAL,
31
} DnsTransactionState;
32
33
0
#define DNS_TRANSACTION_IS_LIVE(state) IN_SET((state), DNS_TRANSACTION_NULL, DNS_TRANSACTION_PENDING, DNS_TRANSACTION_VALIDATING)
34
35
typedef enum DnsTransactionSource {
36
        DNS_TRANSACTION_NETWORK,
37
        DNS_TRANSACTION_CACHE,
38
        DNS_TRANSACTION_ZONE,
39
        DNS_TRANSACTION_TRUST_ANCHOR,
40
        _DNS_TRANSACTION_SOURCE_MAX,
41
        _DNS_TRANSACTION_SOURCE_INVALID = -EINVAL,
42
} DnsTransactionSource;
43
44
typedef struct DnsTransaction {
45
        DnsScope *scope;
46
47
        DnsResourceKey *key;         /* For regular lookups the RR key to look for */
48
        DnsPacket *bypass;           /* For bypass lookups the full original request packet */
49
50
        uint64_t query_flags;
51
52
        DnsPacket *sent, *received;
53
54
        DnsAnswer *answer;
55
        int answer_rcode;
56
        int answer_ede_rcode;
57
        char *answer_ede_msg;
58
        DnssecResult answer_dnssec_result;
59
        DnsTransactionSource answer_source;
60
        uint32_t answer_nsec_ttl;
61
        int answer_errno; /* if state is DNS_TRANSACTION_ERRNO */
62
63
        DnsTransactionState state;
64
65
        /* SD_RESOLVED_AUTHENTICATED here indicates whether the primary answer is authenticated, i.e. whether
66
         * the RRs from answer which directly match the question are authenticated, or, if there are none,
67
         * whether the NODATA or NXDOMAIN case is. It says nothing about additional RRs listed in the answer,
68
         * however they have their own DNS_ANSWER_AUTHORIZED FLAGS. Note that this bit is defined different
69
         * than the AD bit in DNS packets, as that covers more than just the actual primary answer. */
70
        uint64_t answer_query_flags;
71
72
        /* Contains DNSKEY, DS, SOA RRs we already verified and need
73
         * to authenticate this reply */
74
        DnsAnswer *validated_keys;
75
76
        usec_t start_usec;
77
        usec_t next_attempt_after;
78
        sd_event_source *timeout_event_source;
79
        unsigned n_attempts;
80
81
        /* UDP connection logic, if we need it */
82
        int dns_udp_fd;
83
        sd_event_source *dns_udp_event_source;
84
85
        /* TCP connection logic, if we need it */
86
        DnsStream *stream;
87
88
        /* The active server */
89
        DnsServer *server;
90
91
        /* The features of the DNS server at time of transaction start */
92
        DnsServerFeatureLevel current_feature_level;
93
94
        /* If we got SERVFAIL back, we retry the lookup, using a lower feature level than we used before. */
95
        DnsServerFeatureLevel clamp_feature_level_servfail;
96
97
        uint16_t id;
98
99
        bool tried_stream:1;
100
101
        bool initial_jitter_scheduled:1;
102
        bool initial_jitter_elapsed:1;
103
104
        bool probing:1;
105
106
        bool seen_timeout:1;
107
108
        /* Query candidates this transaction is referenced by and that
109
         * shall be notified about this specific transaction
110
         * completing. */
111
        Set *notify_query_candidates, *notify_query_candidates_done;
112
113
        /* Zone items this transaction is referenced by and that shall
114
         * be notified about completion. */
115
        Set *notify_zone_items, *notify_zone_items_done;
116
117
        /* Other transactions that this transactions is referenced by
118
         * and that shall be notified about completion. This is used
119
         * when transactions want to validate their RRsets, but need
120
         * another DNSKEY or DS RR to do so. */
121
        Set *notify_transactions, *notify_transactions_done;
122
123
        /* The opposite direction: the transactions this transaction
124
         * created in order to request DNSKEY or DS RRs. */
125
        Set *dnssec_transactions;
126
127
        unsigned n_picked_servers;
128
129
        unsigned block_gc;
130
131
        /* Set when we're willing to let this transaction live beyond it's usefulness for the original query,
132
         * for caching purposes. This blocks gc while there is still a chance we might still receive an
133
         * answer. */
134
        bool wait_for_answer;
135
136
        LIST_FIELDS(DnsTransaction, transactions_by_scope);
137
        LIST_FIELDS(DnsTransaction, transactions_by_stream);
138
        LIST_FIELDS(DnsTransaction, transactions_by_key);
139
140
        /* Note: fields should be ordered to minimize alignment gaps. Use pahole! */
141
} DnsTransaction;
142
143
int dns_transaction_new(DnsTransaction **ret, DnsScope *s, DnsResourceKey *key, DnsPacket *bypass, uint64_t flags);
144
DnsTransaction* dns_transaction_free(DnsTransaction *t);
145
146
DnsTransaction* dns_transaction_gc(DnsTransaction *t);
147
DEFINE_TRIVIAL_CLEANUP_FUNC(DnsTransaction*, dns_transaction_gc);
148
149
int dns_transaction_go(DnsTransaction *t);
150
151
void dns_transaction_process_reply(DnsTransaction *t, DnsPacket *p, bool encrypted);
152
void dns_transaction_complete(DnsTransaction *t, DnsTransactionState state);
153
154
void dns_transaction_notify(DnsTransaction *t, DnsTransaction *source);
155
int dns_transaction_validate_dnssec(DnsTransaction *t);
156
int dns_transaction_request_dnssec_keys(DnsTransaction *t);
157
158
DnsResourceKey* dns_transaction_key(DnsTransaction *t);
159
160
0
static inline uint64_t dns_transaction_source_to_query_flags(DnsTransactionSource s) {
161
162
0
        switch (s) {
163
164
0
        case DNS_TRANSACTION_NETWORK:
165
0
                return SD_RESOLVED_FROM_NETWORK;
166
167
0
        case DNS_TRANSACTION_CACHE:
168
0
                return SD_RESOLVED_FROM_CACHE;
169
170
0
        case DNS_TRANSACTION_ZONE:
171
0
                return SD_RESOLVED_FROM_ZONE;
172
173
0
        case DNS_TRANSACTION_TRUST_ANCHOR:
174
0
                return SD_RESOLVED_FROM_TRUST_ANCHOR;
175
176
0
        default:
177
0
                return 0;
178
0
        }
179
0
}
Unexecuted instantiation: resolved-bus.c:dns_transaction_source_to_query_flags
Unexecuted instantiation: resolved-dns-browse-services.c:dns_transaction_source_to_query_flags
Unexecuted instantiation: resolved-dns-query.c:dns_transaction_source_to_query_flags
Unexecuted instantiation: resolved-dns-scope.c:dns_transaction_source_to_query_flags
Unexecuted instantiation: resolved-dns-stub.c:dns_transaction_source_to_query_flags
Unexecuted instantiation: resolved-dns-transaction.c:dns_transaction_source_to_query_flags
Unexecuted instantiation: resolved-dns-zone.c:dns_transaction_source_to_query_flags
Unexecuted instantiation: resolved-llmnr.c:dns_transaction_source_to_query_flags
Unexecuted instantiation: resolved-manager.c:dns_transaction_source_to_query_flags
Unexecuted instantiation: resolved-mdns.c:dns_transaction_source_to_query_flags
Unexecuted instantiation: resolved-varlink.c:dns_transaction_source_to_query_flags
180
181
const char* dns_transaction_state_to_string(DnsTransactionState p) _const_;
182
DnsTransactionState dns_transaction_state_from_string(const char *s) _pure_;
183
184
const char* dns_transaction_source_to_string(DnsTransactionSource p) _const_;
185
DnsTransactionSource dns_transaction_source_from_string(const char *s) _pure_;