Stub edns0 payload 1232 for IPv6 and 1432 for IPv4

This commit is contained in:
Willem Toorop 2014-10-23 14:30:23 +02:00
parent 484f98daf9
commit 6f6b8e65a2
3 changed files with 26 additions and 20 deletions

View File

@ -80,7 +80,7 @@ static void set_ub_limit_outstanding_queries(struct getdns_context*,
uint16_t);
static void set_ub_dnssec_allowed_skew(struct getdns_context*, uint32_t);
static void set_ub_edns_maximum_udp_payload_size(struct getdns_context*,
uint16_t);
int);
/* Stuff to make it compile pedantically */
#define RETURN_IF_NULL(ptr, code) if(ptr == NULL) return code;
@ -625,7 +625,7 @@ getdns_context_create_with_extended_memory_functions(
goto error;
result->dnssec_allowed_skew = 0;
result->edns_maximum_udp_payload_size = 1232;
result->edns_maximum_udp_payload_size = -1;
result->dns_transport = GETDNS_TRANSPORT_UDP_FIRST_AND_FALL_BACK_TO_TCP;
result->limit_outstanding_queries = 0;
result->has_ta = priv_getdns_parse_ta_file(NULL, NULL);
@ -1289,9 +1289,10 @@ error:
static void
set_ub_edns_maximum_udp_payload_size(struct getdns_context* context,
uint16_t value) {
int value) {
/* edns-buffer-size */
set_ub_number_opt(context, "edns-buffer-size:", value);
if (value >= 512 && value <= 65535)
set_ub_number_opt(context, "edns-buffer-size:", (uint16_t)value);
}
/*
@ -1879,7 +1880,9 @@ priv_get_context_settings(getdns_context* context) {
r |= getdns_dict_set_int(result, "limit_outstanding_queries", context->limit_outstanding_queries);
r |= getdns_dict_set_int(result, "dnssec_allowed_skew", context->dnssec_allowed_skew);
r |= getdns_dict_set_int(result, "follow_redirects", context->follow_redirects);
r |= getdns_dict_set_int(result, "edns_maximum_udp_payload_size", context->edns_maximum_udp_payload_size);
if (context->edns_maximum_udp_payload_size != -1)
r |= getdns_dict_set_int(result, "edns_maximum_udp_payload_size",
context->edns_maximum_udp_payload_size);
r |= getdns_dict_set_int(result, "edns_extended_rcode", context->edns_extended_rcode);
r |= getdns_dict_set_int(result, "edns_version", context->edns_version);
r |= getdns_dict_set_int(result, "edns_do_bit", context->edns_do_bit);

View File

@ -118,7 +118,7 @@ struct getdns_context {
uint8_t edns_extended_rcode;
uint8_t edns_version;
uint8_t edns_do_bit;
uint16_t edns_maximum_udp_payload_size;
int edns_maximum_udp_payload_size; /* -1 is unset */
getdns_update_callback update_callback;

View File

@ -44,12 +44,15 @@
#include "general.h"
static int
getdns_make_query_pkt_buf(getdns_context *context, const char *name,
uint16_t request_type, getdns_dict *extensions, uint8_t* buf, size_t* olen)
getdns_make_query_pkt_buf(
getdns_network_req *netreq, uint8_t *buf, size_t *olen)
{
uint32_t klass = GLDNS_RR_CLASS_IN;
size_t len;
getdns_dns_req *dnsreq = netreq->owner;
getdns_context *context = dnsreq->context;
getdns_dict *extensions = dnsreq->extensions;
int dnssec_return_status
= is_extension_set(extensions, "dnssec_return_status");
int dnssec_return_only_secure
@ -84,13 +87,16 @@ getdns_make_query_pkt_buf(getdns_context *context, const char *name,
"add_opt_parameters", &add_opt_parameters) == GETDNS_RETURN_GOOD;
if (dnssec_extension_set) {
edns_maximum_udp_payload_size = 1232;
edns_maximum_udp_payload_size =
netreq->upstream->addr.ss_family == AF_INET6 ? 1232 : 1432;
edns_extended_rcode = 0;
edns_version = 0;
edns_do_bit = 1;
} else {
edns_maximum_udp_payload_size
= context->edns_maximum_udp_payload_size;
= context->edns_maximum_udp_payload_size != -1
? context->edns_maximum_udp_payload_size
: netreq->upstream->addr.ss_family==AF_INET6 ? 1232 : 1432;
edns_extended_rcode = context->edns_extended_rcode;
edns_version = context->edns_version;
edns_do_bit = context->edns_do_bit;
@ -121,8 +127,6 @@ getdns_make_query_pkt_buf(getdns_context *context, const char *name,
len = *olen;
*olen = 0;
(void) getdns_dict_get_int(extensions, "specify_class", &klass);
if (len < GLDNS_HEADER_SIZE)
return GLDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL;
@ -141,15 +145,16 @@ getdns_make_query_pkt_buf(getdns_context *context, const char *name,
buf += GLDNS_HEADER_SIZE;
dname_len = len;
if ((r = gldns_str2wire_dname_buf(name, buf, &dname_len))) return r;
if ((r = gldns_str2wire_dname_buf(dnsreq->name, buf, &dname_len)))
return r;
len -= dname_len;
*olen += dname_len;
buf += dname_len;
if (len < 4)
return GLDNS_WIREPARSE_ERR_BUFFER_TOO_SMALL;
gldns_write_uint16(buf, request_type);
gldns_write_uint16(buf + 2, klass);
gldns_write_uint16(buf, netreq->request_type);
gldns_write_uint16(buf + 2, netreq->request_class);
len -= 4;
*olen += 4;
buf += 4;
@ -466,8 +471,7 @@ stub_udp_write_cb(void *userarg)
} else
pkt_len = pkt_buf_len;
if (getdns_make_query_pkt_buf(dnsreq->context, dnsreq->name,
netreq->request_type, dnsreq->extensions, pkt_buf, &pkt_len))
if (getdns_make_query_pkt_buf(netreq, pkt_buf, &pkt_len))
goto done;
netreq->query_id = ldns_get_random();
@ -750,8 +754,7 @@ stub_tcp_write(int fd, getdns_tcp_state *tcp, getdns_network_req *netreq)
pkt_len = pkt_buf_len - 2;
/* Construct query packet */
if (getdns_make_query_pkt_buf(dnsreq->context, dnsreq->name,
netreq->request_type,dnsreq->extensions,pkt + 2,&pkt_len))
if (getdns_make_query_pkt_buf(netreq, pkt + 2, &pkt_len))
return STUB_TCP_ERROR;
/* Prepend length short */