More edns0 rationalisation.

This commit is contained in:
Simon Kelley
2024-11-24 00:08:45 +00:00
parent 334e144c36
commit d2790914df
3 changed files with 27 additions and 21 deletions

View File

@@ -96,8 +96,8 @@ int in_zone(struct auth_zone *zone, char *name, char **cut)
} }
size_t answer_auth(struct dns_header *header, char *limit, size_t qlen, time_t now, union mysockaddr *peer_addr, size_t answer_auth(struct dns_header *header, char *limit, size_t qlen, time_t now,
int local_query, int do_bit, int have_pseudoheader) union mysockaddr *peer_addr, int local_query)
{ {
char *name = daemon->namebuff; char *name = daemon->namebuff;
unsigned char *p, *ansp; unsigned char *p, *ansp;
@@ -890,10 +890,6 @@ size_t answer_auth(struct dns_header *header, char *limit, size_t qlen, time_t n
return resize_packet(header, ansp - (unsigned char *)header, NULL, 0); return resize_packet(header, ansp - (unsigned char *)header, NULL, 0);
} }
/* Advertise our packet size limit in our reply */
if (have_pseudoheader)
return add_pseudoheader(header, ansp - (unsigned char *)header, (unsigned char *)limit, daemon->edns_pktsz, 0, NULL, 0, do_bit, 0);
return ansp - (unsigned char *)header; return ansp - (unsigned char *)header;
} }

View File

@@ -1411,8 +1411,7 @@ int private_net(struct in_addr addr, int ban_localhost);
/* auth.c */ /* auth.c */
#ifdef HAVE_AUTH #ifdef HAVE_AUTH
size_t answer_auth(struct dns_header *header, char *limit, size_t qlen, size_t answer_auth(struct dns_header *header, char *limit, size_t qlen,
time_t now, union mysockaddr *peer_addr, int local_query, time_t now, union mysockaddr *peer_addr, int local_query);
int do_bit, int have_pseudoheader);
int in_zone(struct auth_zone *zone, char *name, char **cut); int in_zone(struct auth_zone *zone, char *name, char **cut);
#endif #endif

View File

@@ -553,9 +553,9 @@ static int forward_query(int udpfd, union mysockaddr *udpaddr,
u16 swap = htons((u16)ede); u16 swap = htons((u16)ede);
if (ede != EDE_UNSET) if (ede != EDE_UNSET)
plen = add_pseudoheader(header, plen, (unsigned char *)(header + replylimit), 0, EDNS0_OPTION_EDE, (unsigned char *)&swap, 2, do_bit, 0); plen = add_pseudoheader(header, plen, (unsigned char *)(header + replylimit), daemon->edns_pktsz, EDNS0_OPTION_EDE, (unsigned char *)&swap, 2, do_bit, 0);
else else
plen = add_pseudoheader(header, plen, (unsigned char *)(header + replylimit), 0, 0, NULL, 0, do_bit, 0); plen = add_pseudoheader(header, plen, (unsigned char *)(header + replylimit), daemon->edns_pktsz, 0, NULL, 0, do_bit, 0);
} }
#if defined(HAVE_CONNTRACK) && defined(HAVE_UBUS) #if defined(HAVE_CONNTRACK) && defined(HAVE_UBUS)
@@ -828,7 +828,7 @@ static size_t process_reply(struct dns_header *header, time_t now, struct server
if (pheader && ede != EDE_UNSET) if (pheader && ede != EDE_UNSET)
{ {
u16 swap = htons((u16)ede); u16 swap = htons((u16)ede);
n = add_pseudoheader(header, n, limit, 0, EDNS0_OPTION_EDE, (unsigned char *)&swap, 2, do_bit, 1); n = add_pseudoheader(header, n, limit, daemon->edns_pktsz, EDNS0_OPTION_EDE, (unsigned char *)&swap, 2, do_bit, 1);
} }
if (RCODE(header) == NXDOMAIN) if (RCODE(header) == NXDOMAIN)
@@ -1776,7 +1776,7 @@ void receive_query(struct listener *listen, time_t now)
m = answer_disallowed(header, (size_t)n, (u32)mark, is_single_query ? daemon->namebuff : NULL); m = answer_disallowed(header, (size_t)n, (u32)mark, is_single_query ? daemon->namebuff : NULL);
if (have_pseudoheader && m != 0) if (have_pseudoheader && m != 0)
m = add_pseudoheader(header, m, ((unsigned char *) header) + daemon->edns_pktsz, 0, m = add_pseudoheader(header, m, ((unsigned char *) header) + daemon->edns_pktsz, daemon->edns_pktsz,
EDNS0_OPTION_EDE, (unsigned char *)&swap, 2, do_bit, 0); EDNS0_OPTION_EDE, (unsigned char *)&swap, 2, do_bit, 0);
if (m >= 1) if (m >= 1)
@@ -1793,10 +1793,13 @@ void receive_query(struct listener *listen, time_t now)
#ifdef HAVE_AUTH #ifdef HAVE_AUTH
else if (auth_dns) else if (auth_dns)
{ {
m = answer_auth(header, ((char *) header) + udp_size, (size_t)n, now, &source_addr, m = answer_auth(header, ((char *) header) + udp_size, (size_t)n, now, &source_addr, local_auth);
local_auth, do_bit, have_pseudoheader);
if (m >= 1) if (m >= 1)
{ {
if (have_pseudoheader)
m = add_pseudoheader(header, m, ((unsigned char *) header) + udp_size, daemon->edns_pktsz,
0, NULL, 0, do_bit, 0);
#ifdef HAVE_DUMPFILE #ifdef HAVE_DUMPFILE
dump_packet_udp(DUMP_REPLY, daemon->packet, m, NULL, &source_addr, listen->fd); dump_packet_udp(DUMP_REPLY, daemon->packet, m, NULL, &source_addr, listen->fd);
#endif #endif
@@ -1840,11 +1843,11 @@ void receive_query(struct listener *listen, time_t now)
{ {
u16 swap = htons(ede); u16 swap = htons(ede);
m = add_pseudoheader(header, m, ((unsigned char *) header) + daemon->edns_pktsz, 0, m = add_pseudoheader(header, m, ((unsigned char *) header) + daemon->edns_pktsz, daemon->edns_pktsz,
EDNS0_OPTION_EDE, (unsigned char *)&swap, 2, do_bit, 0); EDNS0_OPTION_EDE, (unsigned char *)&swap, 2, do_bit, 0);
} }
else else
m = add_pseudoheader(header, m, ((unsigned char *) header) + daemon->edns_pktsz, 0, m = add_pseudoheader(header, m, ((unsigned char *) header) + daemon->edns_pktsz, daemon->edns_pktsz,
0, NULL, 0, do_bit, 0); 0, NULL, 0, do_bit, 0);
} }
@@ -2400,14 +2403,18 @@ unsigned char *tcp_request(int confd, time_t now,
m = answer_disallowed(header, size, (u32)mark, is_single_query ? daemon->namebuff : NULL); m = answer_disallowed(header, size, (u32)mark, is_single_query ? daemon->namebuff : NULL);
if (have_pseudoheader && m != 0) if (have_pseudoheader && m != 0)
m = add_pseudoheader(header, m, ((unsigned char *) header) + 65536, 0, m = add_pseudoheader(header, m, ((unsigned char *) header) + 65536, daemon->edns_pktsz,
EDNS0_OPTION_EDE, (unsigned char *)&swap, 2, do_bit, 0); EDNS0_OPTION_EDE, (unsigned char *)&swap, 2, do_bit, 0);
} }
#endif #endif
#ifdef HAVE_AUTH #ifdef HAVE_AUTH
else if (auth_dns) else if (auth_dns)
m = answer_auth(header, ((char *) header) + 65536, (size_t)size, now, &peer_addr, {
local_auth, do_bit, have_pseudoheader); m = answer_auth(header, ((char *) header) + 65536, (size_t)size, now, &peer_addr, local_auth);
if (m >= 1 && have_pseudoheader)
m = add_pseudoheader(header, m, ((unsigned char *) header) + 65536, daemon->edns_pktsz,
0, NULL, 0, do_bit, 0);
}
#endif #endif
else else
{ {
@@ -2429,6 +2436,10 @@ unsigned char *tcp_request(int confd, time_t now,
/* m > 0 if answered from cache */ /* m > 0 if answered from cache */
m = answer_request(header, ((char *) header) + 65536, (size_t)size, m = answer_request(header, ((char *) header) + 65536, (size_t)size,
dst_addr_4, netmask, now, ad_reqd, do_bit, &stale, &filtered); dst_addr_4, netmask, now, ad_reqd, do_bit, &stale, &filtered);
if (m >= 1 && have_pseudoheader)
m = add_pseudoheader(header, m, ((unsigned char *) header) + 65536, daemon->edns_pktsz,
0, NULL, 0, do_bit, 0);
} }
/* Do this by steam now we're not in the select() loop */ /* Do this by steam now we're not in the select() loop */
check_log_writer(1); check_log_writer(1);
@@ -2585,9 +2596,9 @@ unsigned char *tcp_request(int confd, time_t now,
u16 swap = htons((u16)ede); u16 swap = htons((u16)ede);
if (ede != EDE_UNSET) if (ede != EDE_UNSET)
m = add_pseudoheader(header, m, ((unsigned char *) header) + 65536, 0, EDNS0_OPTION_EDE, (unsigned char *)&swap, 2, do_bit, 0); m = add_pseudoheader(header, m, ((unsigned char *) header) + 65536, daemon->edns_pktsz, EDNS0_OPTION_EDE, (unsigned char *)&swap, 2, do_bit, 0);
else else
m = add_pseudoheader(header, m, ((unsigned char *) header) + 65536, 0, 0, NULL, 0, do_bit, 0); m = add_pseudoheader(header, m, ((unsigned char *) header) + 65536, daemon->edns_pktsz, 0, NULL, 0, do_bit, 0);
} }
check_log_writer(1); check_log_writer(1);