mirror of
https://github.com/pi-hole/dnsmasq.git
synced 2025-12-19 10:18:25 +00:00
Don't do retries over UDP when we've sent the query by TCP.
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user