DNS64 rewriting in the right place

This commit is contained in:
Willem Toorop 2016-07-17 11:22:31 +02:00
parent cea99adc12
commit 686d99fb06
3 changed files with 33 additions and 7 deletions

View File

@ -1323,6 +1323,9 @@ getdns_context_create_with_extended_memory_functions(
result->return_both_v4_and_v6 = 0; result->return_both_v4_and_v6 = 0;
result->return_call_reporting = 0; result->return_call_reporting = 0;
(void) memset(result->dns64_prefix, 0, 16); (void) memset(result->dns64_prefix, 0, 16);
result->dns64_prefix[1] = 0x64;
result->dns64_prefix[2] = 0xff;
result->dns64_prefix[3] = 0x9b;
result->specify_class = GETDNS_RRCLASS_IN; result->specify_class = GETDNS_RRCLASS_IN;
/* state data used to detect changes to the system config files /* state data used to detect changes to the system config files

View File

@ -721,10 +721,13 @@ _getdns_dns_req_new(getdns_context *context, getdns_eventloop *loop,
getdns_dns_req *result = NULL; getdns_dns_req *result = NULL;
uint32_t klass = context->specify_class; uint32_t klass = context->specify_class;
getdns_bindata *dns64_prefix = NULL; getdns_bindata *dns64_prefix = NULL;
int a_aaaa_query = is_extension_set(extensions, int dns64 = is_extension_set(extensions, "dns64", context->dns64);
"return_both_v4_and_v6", context->return_both_v4_and_v6) && int a_aaaa_query = (dns64 && request_type == GETDNS_RRTYPE_AAAA) ||
( request_type == GETDNS_RRTYPE_A || ( is_extension_set( extensions, "return_both_v4_and_v6"
request_type == GETDNS_RRTYPE_AAAA ); , context->return_both_v4_and_v6)
&& ( request_type == GETDNS_RRTYPE_A
|| request_type == GETDNS_RRTYPE_AAAA ));
/* Reserve for the buffer at least one more byte /* Reserve for the buffer at least one more byte
* (to test for udp overflow) (hence the + 1), * (to test for udp overflow) (hence the + 1),
* And align on the 8 byte boundry (hence the (x + 7) / 8 * 8) * And align on the 8 byte boundry (hence the (x + 7) / 8 * 8)
@ -910,7 +913,7 @@ _getdns_dns_req_new(getdns_context *context, getdns_eventloop *loop,
result->add_warning_for_bad_dns = is_extension_set(extensions, result->add_warning_for_bad_dns = is_extension_set(extensions,
"add_warning_for_bad_dns", context->add_warning_for_bad_dns); "add_warning_for_bad_dns", context->add_warning_for_bad_dns);
result->dns64 = is_extension_set(extensions, "dns64", context->dns64); result->dns64 = dns64;
if (!getdns_dict_get_bindata(extensions, "dns64_prefix", &dns64_prefix) if (!getdns_dict_get_bindata(extensions, "dns64_prefix", &dns64_prefix)
&& dns64_prefix->size == 16) && dns64_prefix->size == 16)
(void) memcpy(result->dns64_prefix, dns64_prefix->data, 16); (void) memcpy(result->dns64_prefix, dns64_prefix->data, 16);

View File

@ -563,6 +563,12 @@ _getdns_create_reply_dict(getdns_context *context, getdns_network_req *req,
getdns_list *bad_dns = NULL; getdns_list *bad_dns = NULL;
_getdns_rrset_spc answer_spc; _getdns_rrset_spc answer_spc;
_getdns_rrset *answer; _getdns_rrset *answer;
uint8_t dns64_address[16];
int dns64_translate = req->owner->dns64 &&
req->owner->netreqs[1] &&
req->request_type == GETDNS_RRTYPE_A &&
just_addrs && !just_addrs->numinuse;
if (!result) if (!result)
goto error; goto error;
@ -667,6 +673,14 @@ _getdns_create_reply_dict(getdns_context *context, getdns_network_req *req,
continue; continue;
bin_size = rdf_iter->nxt - rdf_iter->pos; bin_size = rdf_iter->nxt - rdf_iter->pos;
if (dns64_translate && rr_type == GETDNS_RRTYPE_A) {
(void) memcpy(dns64_address, req->owner->dns64_prefix, 12);
(void) memcpy(dns64_address + 12, rdf_iter->pos, 4);
rr_type = GETDNS_RRTYPE_AAAA;
bin_size = 16;
bin_data = dns64_address;
}
else
bin_data = rdf_iter->pos; bin_data = rdf_iter->pos;
if (!set_dict(&rr_dict, getdns_dict_create_with_context(context)) || if (!set_dict(&rr_dict, getdns_dict_create_with_context(context)) ||
@ -1125,6 +1139,13 @@ _getdns_create_getdns_response(getdns_dns_req *completed_request)
if (! netreq->response_len) if (! netreq->response_len)
continue; continue;
/* Skip dns64 translation if we had IPv6 answers alread */
if (completed_request->dns64 &&
completed_request->netreqs[1] &&
netreq->request_type == GETDNS_RRTYPE_A &&
just_addrs && just_addrs->numinuse)
continue;
if (netreq->tsig_status == GETDNS_DNSSEC_INSECURE) if (netreq->tsig_status == GETDNS_DNSSEC_INSECURE)
_getdns_network_validate_tsig(netreq); _getdns_network_validate_tsig(netreq);
@ -1138,7 +1159,6 @@ _getdns_create_getdns_response(getdns_dns_req *completed_request)
netreq->dnssec_status == GETDNS_DNSSEC_BOGUS) netreq->dnssec_status == GETDNS_DNSSEC_BOGUS)
nbogus++; nbogus++;
if (! completed_request->dnssec_return_all_statuses && if (! completed_request->dnssec_return_all_statuses &&
! completed_request->dnssec_return_validation_chain) { ! completed_request->dnssec_return_validation_chain) {
if (dnssec_return_status && if (dnssec_return_status &&