summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Kelley <simon@thekelleys.org.uk>2023-03-20 15:16:29 +0000
committerSimon Kelley <simon@thekelleys.org.uk>2023-03-20 15:16:29 +0000
commit5a9eae429a7d0680d606f03f2759d7dde0bbe3f0 (patch)
treef4d444b74449d98fbef94b0392b0294b2a4c5132
parent946180701191ea7e552fa5a939140a635d47b566 (diff)
downloaddnsmasq-5a9eae429a7d0680d606f03f2759d7dde0bbe3f0.tar.gz
Improve cache use with --filter-A and --filter-AAAA
If --filter-AAAA is set and we have cached entry for the domain in question fpr any RR type that allows us to return a NODATA reply when --filter-AAAA is set without going upstream. Similarly for --filter-A.
-rw-r--r--src/rfc1035.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/rfc1035.c b/src/rfc1035.c
index 3d82ad9..5abacbd 100644
--- a/src/rfc1035.c
+++ b/src/rfc1035.c
@@ -1910,6 +1910,25 @@ size_t answer_request(struct dns_header *header, char *limit, size_t qlen,
anscount++;
}
}
+ else if (((flag & F_IPV4) && option_bool(OPT_FILTER_A)) || ((flag & F_IPV6) && option_bool(OPT_FILTER_AAAA)))
+ {
+ /* We don't have a cached answer and when we get an answer from upstream we're going to
+ filter it anyway. If we have a cached answer for the domain for another RRtype then
+ that may be enough to tell us if the answer should be NODATA and save the round trip.
+ Cached NXDOMAIN has already been handled, so here we look for any record for the domain,
+ since its existence allows us to return a NODATA answer. Note that we never set the AD flag,
+ since we didn't authentucate the record. We do set the AA flag since this answer comes from
+ local config. */
+
+ if (cache_find_by_name(NULL, name, now, F_IPV4 | F_IPV6 | F_SRV))
+ {
+ ans = 1;
+ sec_data = 0;
+
+ if (!dryrun)
+ log_query(F_NEG | F_CONFIG | flag, name, NULL, NULL, 0);
+ }
+ }
}
if (qtype == T_MX || qtype == T_ANY)
@@ -1920,6 +1939,7 @@ size_t answer_request(struct dns_header *header, char *limit, size_t qlen,
{
ans = found = 1;
sec_data = 0;
+
if (!dryrun)
{
int offset;