Prevent TCP failures from affecting EDNS stats

EDNS mechanisms only apply to DNS over UDP.  Thus, errors encountered
while sending DNS queries over TCP must not influence EDNS timeout
statistics.

(cherry picked from commit fce3c93ea2)
This commit is contained in:
Michał Kępień 2019-10-31 08:48:35 +01:00
parent 188bf16bf9
commit e6dd9db0e4
2 changed files with 32 additions and 5 deletions

View file

@ -241,6 +241,18 @@ fi
if [ $ret != 0 ]; then echo_i "failed"; fi
status=`expr $status + $ret`
n=`expr $n + 1`
echo_i "checking that TCP failures do not influence EDNS statistics in the ADB ($n)"
ret=0
rndc_dumpdb ns1 -adb || ret=1
timeouts512=`sed -n "s|.*10\.53\.0\.7.*\[edns \([0-9/][0-9/]*\).*|\1|p" ns1/named_dump.db.test$n | awk -F/ '{print $NF}'`
if [ $timeouts512 -ne 0 ]; then
echo_i "512-byte EDNS timeouts according to ADB: $timeouts512, expected: 0"
ret=1
fi
if [ $ret != 0 ]; then echo_i "failed"; fi
status=`expr $status + $ret`
if $SHELL ../testcrypto.sh > /dev/null 2>&1
then
$PERL $SYSTEMTESTTOP/stop.pl --use-rndc --port ${CONTROLPORT} legacy ns1

View file

@ -890,6 +890,25 @@ resquery_destroy(resquery_t **queryp) {
empty_bucket(res);
}
/*%
* Update EDNS statistics for a server after not getting a response to a UDP
* query sent to it.
*/
static void
update_edns_stats(resquery_t *query) {
fetchctx_t *fctx = query->fctx;
if ((query->options & DNS_FETCHOPT_TCP) != 0) {
return;
}
if ((query->options & DNS_FETCHOPT_NOEDNS0) == 0) {
dns_adb_ednsto(fctx->adb, query->addrinfo, query->udpsize);
} else {
dns_adb_timeout(fctx->adb, query->addrinfo);
}
}
static void
fctx_cancelquery(resquery_t **queryp, dns_dispatchevent_t **deventp,
isc_time_t *finish, bool no_response,
@ -950,11 +969,7 @@ fctx_cancelquery(resquery_t **queryp, dns_dispatchevent_t **deventp,
uint32_t value;
uint32_t mask;
if ((query->options & DNS_FETCHOPT_NOEDNS0) == 0)
dns_adb_ednsto(fctx->adb, query->addrinfo,
query->udpsize);
else
dns_adb_timeout(fctx->adb, query->addrinfo);
update_edns_stats(query);
/*
* If "forward first;" is used and a forwarder timed