diff options
author | Simon Kelley <simon@thekelleys.org.uk> | 2022-09-15 23:54:53 +0100 |
---|---|---|
committer | Simon Kelley <simon@thekelleys.org.uk> | 2022-09-15 23:54:53 +0100 |
commit | d882dfdae9b05e5c44389c2bbb9f9b10d9bb0c0f (patch) | |
tree | ba611cca01ac04a65e03c3f6c2192606bd6de778 | |
parent | a2ee2426bfd244e7f401fe3260f696a33104bfaa (diff) | |
download | dnsmasq-d882dfdae9b05e5c44389c2bbb9f9b10d9bb0c0f.tar.gz |
Tweak server-selection logic in the fast-retry case.
-rw-r--r-- | src/forward.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/src/forward.c b/src/forward.c index e1ec30a..02f8f81 100644 --- a/src/forward.c +++ b/src/forward.c @@ -170,7 +170,7 @@ static int domain_no_rebind(char *domain) static int forward_query(int udpfd, union mysockaddr *udpaddr, union all_addr *dst_addr, unsigned int dst_iface, struct dns_header *header, size_t plen, char *limit, time_t now, - struct frec *forward, int ad_reqd, int do_bit) + struct frec *forward, int ad_reqd, int do_bit, int fast_retry) { unsigned int flags = 0; unsigned int fwd_flags = 0; @@ -389,7 +389,8 @@ static int forward_query(int udpfd, union mysockaddr *udpaddr, #endif { /* retry on existing query, from original source. Send to all available servers */ - forward->sentto->failed_queries++; + if (!fast_retry) + forward->sentto->failed_queries++; if (!filter_servers(forward->sentto->arrayposn, F_SERVER, &first, &last)) goto reply; @@ -397,13 +398,13 @@ static int forward_query(int udpfd, union mysockaddr *udpaddr, master = daemon->serverarray[first]; /* Forward to all available servers on retry of query from same host. */ - if (!option_bool(OPT_ORDER) && old_src) + if (!option_bool(OPT_ORDER) && old_src && !fast_retry) forward->forwardall = 1; else { start = forward->sentto->arrayposn; - if (option_bool(OPT_ORDER)) + if (option_bool(OPT_ORDER) && !fast_retry) { /* In strict order mode, there must be a server later in the list left to send to, otherwise without the forwardall mechanism, @@ -636,7 +637,7 @@ int fast_retry(time_t now) daemon->log_display_id = f->frec_src.log_id; forward_query(-1, NULL, NULL, 0, header, f->stash_len, ((char *) header) + udp_size, now, f, - f->flags & FREC_AD_QUESTION, f->flags & FREC_DO_QUESTION); + f->flags & FREC_AD_QUESTION, f->flags & FREC_DO_QUESTION, 1); to_run = f->forward_delay = 2 * f->forward_delay; } @@ -1202,7 +1203,7 @@ void reply_query(int fd, time_t now) if (nn) { forward_query(-1, NULL, NULL, 0, header, nn, ((char *) header) + udp_size, now, forward, - forward->flags & FREC_AD_QUESTION, forward->flags & FREC_DO_QUESTION); + forward->flags & FREC_AD_QUESTION, forward->flags & FREC_DO_QUESTION, 0); return; } } @@ -1841,7 +1842,7 @@ void receive_query(struct listener *listen, time_t now) } if (forward_query(fd, &source_addr, &dst_addr, if_index, - header, (size_t)n, ((char *) header) + udp_size, now, NULL, ad_reqd, do_bit)) + header, (size_t)n, ((char *) header) + udp_size, now, NULL, ad_reqd, do_bit, 0)) daemon->metrics[METRIC_DNS_QUERIES_FORWARDED]++; else daemon->metrics[METRIC_DNS_LOCAL_ANSWERED]++; |