diff --git a/src/resolve/resolved-dns-transaction.c b/src/resolve/resolved-dns-transaction.c index ba76725655..9368f970fc 100644 --- a/src/resolve/resolved-dns-transaction.c +++ b/src/resolve/resolved-dns-transaction.c @@ -1621,7 +1621,7 @@ static int dns_transaction_prepare(DnsTransaction *t, usec_t ts) { return 0; } - if (t->n_attempts >= TRANSACTION_ATTEMPTS_MAX(t->scope->protocol)) { + if (t->n_attempts >= dns_transaction_attempts_max(t->scope->protocol, t->probing)) { DnsTransactionState result; if (t->scope->protocol == DNS_PROTOCOL_LLMNR) diff --git a/src/resolve/resolved-dns-transaction.h b/src/resolve/resolved-dns-transaction.h index 498cabb7e5..f4cb5d3d8d 100644 --- a/src/resolve/resolved-dns-transaction.h +++ b/src/resolve/resolved-dns-transaction.h @@ -214,11 +214,31 @@ DnsTransactionSource dns_transaction_source_from_string(const char *s) _pure_; /* Maximum attempts to send LLMNR requests, see RFC 4795 Section 2.7 */ #define LLMNR_TRANSACTION_ATTEMPTS_MAX 3 -/* Maximum attempts to send MDNS requests, see RFC 6762 Section 8.1 */ -#define MDNS_TRANSACTION_ATTEMPTS_MAX 3 +/* Maximum attempts to send MDNS requests is one except for probe requests, see RFC 6762 Section 8.1 + * RFC 6762 differentiates between normal (single-shot/continuous) and probe requests. + * It therefore makes sense to attempt each normal query only once with no retries. + * Otherwise we'd be sending out three attempts for even a normal query. */ +#define MDNS_TRANSACTION_ATTEMPTS_MAX 1 -#define TRANSACTION_ATTEMPTS_MAX(p) (((p) == DNS_PROTOCOL_LLMNR) ? \ - LLMNR_TRANSACTION_ATTEMPTS_MAX : \ - (((p) == DNS_PROTOCOL_MDNS) ? \ - MDNS_TRANSACTION_ATTEMPTS_MAX : \ - DNS_TRANSACTION_ATTEMPTS_MAX)) +#define MDNS_PROBE_TRANSACTION_ATTEMPTS_MAX 3 + +static inline unsigned dns_transaction_attempts_max(DnsProtocol p, bool probing) { + + switch (p) { + + case DNS_PROTOCOL_LLMNR: + return LLMNR_TRANSACTION_ATTEMPTS_MAX; + + case DNS_PROTOCOL_MDNS: + if (probing) + return MDNS_PROBE_TRANSACTION_ATTEMPTS_MAX; + else + return MDNS_TRANSACTION_ATTEMPTS_MAX; + + case DNS_PROTOCOL_DNS: + return DNS_TRANSACTION_ATTEMPTS_MAX; + + default: + return 0; + } +}