summaryrefslogtreecommitdiff
path: root/src/forward.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/forward.c')
-rw-r--r--src/forward.c64
1 files changed, 45 insertions, 19 deletions
diff --git a/src/forward.c b/src/forward.c
index 3f3954d..d79cc56 100644
--- a/src/forward.c
+++ b/src/forward.c
@@ -721,7 +721,7 @@ static size_t process_reply(struct dns_header *header, time_t now, struct server
if (added_pheader)
{
/* client didn't send EDNS0, we added one, strip it off before returning answer. */
- n = rrfilter(header, n, RRFILTER_EDNS0);
+ rrfilter(header, &n, RRFILTER_EDNS0);
pheader = NULL;
}
else
@@ -831,11 +831,16 @@ static size_t process_reply(struct dns_header *header, time_t now, struct server
if (rcode == NOERROR)
{
+ size_t modified = 0;
+
if (option_bool(OPT_FILTER_A))
- n = rrfilter(header, n, RRFILTER_A);
+ modified = rrfilter(header, &n, RRFILTER_A);
if (option_bool(OPT_FILTER_AAAA))
- n = rrfilter(header, n, RRFILTER_AAAA);
+ modified += rrfilter(header, &n, RRFILTER_AAAA);
+
+ if (modified > 0)
+ ede = EDE_FILTERED;
}
if (doctored)
@@ -859,7 +864,7 @@ static size_t process_reply(struct dns_header *header, time_t now, struct server
/* If the requestor didn't set the DO bit, don't return DNSSEC info. */
if (!do_bit)
- n = rrfilter(header, n, RRFILTER_DNSSEC);
+ rrfilter(header, &n, RRFILTER_DNSSEC);
}
#endif
@@ -1807,7 +1812,7 @@ void receive_query(struct listener *listen, time_t now)
#endif
else
{
- int stale;
+ int stale, filtered;
int ad_reqd = do_bit;
u16 hb3 = header->hb3, hb4 = header->hb4;
int fd = listen->fd;
@@ -1817,17 +1822,28 @@ void receive_query(struct listener *listen, time_t now)
ad_reqd = 1;
m = answer_request(header, ((char *) header) + udp_size, (size_t)n,
- dst_addr_4, netmask, now, ad_reqd, do_bit, have_pseudoheader, &stale);
+ dst_addr_4, netmask, now, ad_reqd, do_bit, have_pseudoheader, &stale, &filtered);
if (m >= 1)
{
- if (stale && have_pseudoheader)
+ if (have_pseudoheader)
{
- u16 swap = htons(EDE_STALE);
+ int ede = EDE_UNSET;
- m = add_pseudoheader(header, m, ((unsigned char *) header) + udp_size, daemon->edns_pktsz,
- EDNS0_OPTION_EDE, (unsigned char *)&swap, 2, do_bit, 0);
+ if (filtered)
+ ede = EDE_FILTERED;
+ else if (stale)
+ ede = EDE_STALE;
+
+ if (ede != EDE_UNSET)
+ {
+ u16 swap = htons(ede);
+
+ m = add_pseudoheader(header, m, ((unsigned char *) header) + udp_size, daemon->edns_pktsz,
+ EDNS0_OPTION_EDE, (unsigned char *)&swap, 2, do_bit, 0);
+ }
}
+
#ifdef HAVE_DUMPFILE
dump_packet_udp(DUMP_REPLY, daemon->packet, m, NULL, &source_addr, listen->fd);
#endif
@@ -2097,7 +2113,7 @@ unsigned char *tcp_request(int confd, time_t now,
unsigned char *pheader;
unsigned int mark = 0;
int have_mark = 0;
- int first, last, stale, do_stale = 0;
+ int first, last, filtered, stale, do_stale = 0;
unsigned int flags = 0;
u16 hb3, hb4;
@@ -2291,7 +2307,7 @@ unsigned char *tcp_request(int confd, time_t now,
else
/* m > 0 if answered from cache */
m = answer_request(header, ((char *) header) + 65536, (size_t)size,
- dst_addr_4, netmask, now, ad_reqd, do_bit, have_pseudoheader, &stale);
+ dst_addr_4, netmask, now, ad_reqd, do_bit, have_pseudoheader, &stale, &filtered);
/* Do this by steam now we're not in the select() loop */
check_log_writer(1);
@@ -2430,13 +2446,23 @@ unsigned char *tcp_request(int confd, time_t now,
m = add_pseudoheader(header, m, ((unsigned char *) header) + 65536, daemon->edns_pktsz, 0, NULL, 0, do_bit, 0);
}
}
- else if (stale)
- {
- u16 swap = htons((u16)EDE_STALE);
-
- m = add_pseudoheader(header, m, ((unsigned char *) header) + 65536, daemon->edns_pktsz, EDNS0_OPTION_EDE, (unsigned char *)&swap, 2, do_bit, 0);
- }
-
+ else
+ {
+ ede = EDE_UNSET;
+
+ if (filtered)
+ ede = EDE_FILTERED;
+ else if (stale)
+ ede = EDE_STALE;
+
+ if (ede != EDE_UNSET)
+ {
+ u16 swap = htons((u16)ede);
+
+ m = add_pseudoheader(header, m, ((unsigned char *) header) + 65536, daemon->edns_pktsz, EDNS0_OPTION_EDE, (unsigned char *)&swap, 2, do_bit, 0);
+ }
+ }
+
check_log_writer(1);
*length = htons(m);