Don't do retries over UDP when we've sent the query by TCP.

This commit is contained in:
Simon Kelley
2025-01-12 22:02:05 +00:00
parent 509afcd1d2
commit 7d915a0bb9

View File

@@ -163,10 +163,10 @@ static int domain_no_rebind(char *domain)
return 0; return 0;
} }
static int forward_query(int udpfd, union mysockaddr *udpaddr, static void forward_query(int udpfd, union mysockaddr *udpaddr,
union all_addr *dst_addr, unsigned int dst_iface, union all_addr *dst_addr, unsigned int dst_iface,
struct dns_header *header, size_t plen, size_t replylimit, time_t now, struct dns_header *header, size_t plen, size_t replylimit, time_t now,
struct frec *forward, unsigned int fwd_flags, int fast_retry) struct frec *forward, unsigned int fwd_flags, int fast_retry)
{ {
unsigned int flags = 0; unsigned int flags = 0;
int is_dnssec = forward && (forward->flags & (FREC_DNSKEY_QUERY | FREC_DS_QUERY)); int is_dnssec = forward && (forward->flags & (FREC_DNSKEY_QUERY | FREC_DS_QUERY));
@@ -254,7 +254,7 @@ static int forward_query(int udpfd, union mysockaddr *udpaddr,
it's safe to wait for the reply from the first without it's safe to wait for the reply from the first without
forwarding the second. */ forwarding the second. */
if (difftime(now, forward->time) < 2) if (difftime(now, forward->time) < 2)
return 0; return;
} }
/* use our id when resending */ /* use our id when resending */
@@ -376,6 +376,10 @@ static int forward_query(int udpfd, union mysockaddr *udpaddr,
if (forward->flags & (FREC_DNSKEY_QUERY | FREC_DS_QUERY)) if (forward->flags & (FREC_DNSKEY_QUERY | FREC_DS_QUERY))
{ {
/* Don't retry if we've already sent it via TCP. */
if (forward->flags & FREC_GONE_TO_TCP)
return;
/* log_id should match previous DNSSEC query. */ /* log_id should match previous DNSSEC query. */
daemon->log_display_id = forward->frec_src.log_id; daemon->log_display_id = forward->frec_src.log_id;
@@ -386,8 +390,8 @@ static int forward_query(int udpfd, union mysockaddr *udpaddr,
/* Find suitable servers: should never fail. */ /* Find suitable servers: should never fail. */
if (!filter_servers(forward->sentto->arrayposn, F_DNSSECOK, &first, &last)) if (!filter_servers(forward->sentto->arrayposn, F_DNSSECOK, &first, &last))
return 0; return;
is_dnssec = 1; is_dnssec = 1;
forward->forwardall = 1; forward->forwardall = 1;
} }
@@ -502,8 +506,9 @@ static int forward_query(int udpfd, union mysockaddr *udpaddr,
if (forwarded || is_dnssec) if (forwarded || is_dnssec)
{ {
daemon->metrics[METRIC_DNS_QUERIES_FORWARDED]++;
forward->forward_timestamp = dnsmasq_milliseconds(); forward->forward_timestamp = dnsmasq_milliseconds();
return 1; return;
} }
/* could not send on, prepare to return */ /* could not send on, prepare to return */
@@ -515,7 +520,7 @@ static int forward_query(int udpfd, union mysockaddr *udpaddr,
if (udpfd != -1) if (udpfd != -1)
{ {
if (!(plen = make_local_answer(flags, gotname, plen, header, daemon->namebuff, (char *)(header + replylimit), first, last, ede))) if (!(plen = make_local_answer(flags, gotname, plen, header, daemon->namebuff, (char *)(header + replylimit), first, last, ede)))
return 0; return;
if (fwd_flags & FREC_HAS_PHEADER) if (fwd_flags & FREC_HAS_PHEADER)
{ {
@@ -543,7 +548,8 @@ static int forward_query(int udpfd, union mysockaddr *udpaddr,
send_from(udpfd, option_bool(OPT_NOWILD) || option_bool(OPT_CLEVERBIND), (char *)header, plen, udpaddr, dst_addr, dst_iface); send_from(udpfd, option_bool(OPT_NOWILD) || option_bool(OPT_CLEVERBIND), (char *)header, plen, udpaddr, dst_addr, dst_iface);
} }
return 0; daemon->metrics[METRIC_DNS_LOCAL_ANSWERED]++;
return;
} }
/* Check if any frecs need to do a retry, and action that if so. /* Check if any frecs need to do a retry, and action that if so.
@@ -1851,11 +1857,8 @@ void receive_query(struct listener *listen, time_t now)
blockdata_free(saved_question); blockdata_free(saved_question);
saved_question = NULL; saved_question = NULL;
if (forward_query(fd, &source_addr, &dst_addr, if_index, header, (size_t)n, forward_query(fd, &source_addr, &dst_addr, if_index, header, (size_t)n,
udp_size, now, NULL, fwd_flags, 0)) udp_size, now, NULL, fwd_flags, 0);
daemon->metrics[METRIC_DNS_QUERIES_FORWARDED]++;
else
daemon->metrics[METRIC_DNS_LOCAL_ANSWERED]++;
} }
blockdata_free(saved_question); blockdata_free(saved_question);