mirror of https://github.com/getdnsapi/getdns.git
DNS64 rewriting in the right place
This commit is contained in:
parent
cea99adc12
commit
686d99fb06
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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 &&
|
||||||
|
|
Loading…
Reference in New Issue