|
@@ -625,7 +625,7 @@ static int _dns_server_is_dns64_request(struct dns_request *request)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
- if (dns_conf_dns_dns64.prefix_len <= 0) {
|
|
|
+ if (request->conf->dns_dns64.prefix_len <= 0) {
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -4138,6 +4138,9 @@ static int _dns_server_process_answer(struct dns_request *request, const char *d
|
|
|
case DNS_T_SOA: {
|
|
|
/* if DNS64 enabled, skip check SOA. */
|
|
|
if (_dns_server_is_dns64_request(request)) {
|
|
|
+ if (request->has_ip) {
|
|
|
+ _dns_server_request_complete(request);
|
|
|
+ }
|
|
|
break;
|
|
|
}
|
|
|
|
|
@@ -4513,7 +4516,7 @@ static void _dns_server_query_end(struct dns_request *request)
|
|
|
if (request->dualstack_selection_query == 1) {
|
|
|
if ((conf->ipset_nftset.ipset_no_speed.ipv4_enable || conf->ipset_nftset.nftset_no_speed.ip_enable ||
|
|
|
conf->ipset_nftset.ipset_no_speed.ipv6_enable || conf->ipset_nftset.nftset_no_speed.ip6_enable) &&
|
|
|
- dns_conf_dns_dns64.prefix_len == 0) {
|
|
|
+ request->conf->dns_dns64.prefix_len == 0) {
|
|
|
/* if speed check fail enabled, we need reply quickly, otherwise wait for ping result.*/
|
|
|
_dns_server_request_complete(request);
|
|
|
}
|
|
@@ -5961,7 +5964,7 @@ _dns_server_process_dns64_callback(struct dns_request *request, struct dns_reque
|
|
|
int addr_len = 0;
|
|
|
|
|
|
if (request->has_ip == 1) {
|
|
|
- if (memcmp(request->ip_addr, dns_conf_dns_dns64.prefix, 12) != 0) {
|
|
|
+ if (memcmp(request->ip_addr, request->conf->dns_dns64.prefix, 12) != 0) {
|
|
|
return DNS_CHILD_POST_SKIP;
|
|
|
}
|
|
|
}
|
|
@@ -5976,11 +5979,12 @@ _dns_server_process_dns64_callback(struct dns_request *request, struct dns_reque
|
|
|
request->ttl_cname = child_request->ttl_cname;
|
|
|
}
|
|
|
|
|
|
- if (child_request->has_ip == 0) {
|
|
|
+ if (child_request->has_ip == 0 && request->has_ip == 0) {
|
|
|
+ request->rcode = child_request->rcode;
|
|
|
if (child_request->has_soa) {
|
|
|
memcpy(&request->soa, &child_request->soa, sizeof(struct dns_soa));
|
|
|
request->has_soa = 1;
|
|
|
- return DNS_CHILD_POST_SUCCESS;
|
|
|
+ return DNS_CHILD_POST_SKIP;
|
|
|
}
|
|
|
|
|
|
if (request->has_soa == 0) {
|
|
@@ -5990,13 +5994,15 @@ _dns_server_process_dns64_callback(struct dns_request *request, struct dns_reque
|
|
|
return DNS_CHILD_POST_FAIL;
|
|
|
}
|
|
|
|
|
|
- memcpy(request->ip_addr, dns_conf_dns_dns64.prefix, 16);
|
|
|
- memcpy(request->ip_addr + 12, child_request->ip_addr, 4);
|
|
|
- request->ip_ttl = child_request->ip_ttl;
|
|
|
- request->has_ip = 1;
|
|
|
- request->has_soa = 0;
|
|
|
+ if (request->has_ip == 0 && child_request->has_ip == 1) {
|
|
|
+ request->rcode = child_request->rcode;
|
|
|
+ memcpy(request->ip_addr, request->conf->dns_dns64.prefix, 12);
|
|
|
+ memcpy(request->ip_addr + 12, child_request->ip_addr, 4);
|
|
|
+ request->ip_ttl = child_request->ip_ttl;
|
|
|
+ request->has_ip = 1;
|
|
|
+ request->has_soa = 0;
|
|
|
+ }
|
|
|
|
|
|
- request->rcode = child_request->rcode;
|
|
|
pthread_mutex_lock(&request->ip_map_lock);
|
|
|
hash_for_each_safe(request->ip_map, bucket, tmp, addr_map, node)
|
|
|
{
|
|
@@ -6026,7 +6032,7 @@ _dns_server_process_dns64_callback(struct dns_request *request, struct dns_reque
|
|
|
|
|
|
new_addr_map->addr_type = DNS_T_AAAA;
|
|
|
addr_len = DNS_RR_AAAA_LEN;
|
|
|
- memcpy(new_addr_map->ip_addr, dns_conf_dns_dns64.prefix, 16);
|
|
|
+ memcpy(new_addr_map->ip_addr, request->conf->dns_dns64.prefix, 16);
|
|
|
memcpy(new_addr_map->ip_addr + 12, addr_map->ip_addr, 4);
|
|
|
|
|
|
new_addr_map->ping_time = addr_map->ping_time;
|
|
@@ -6042,7 +6048,7 @@ _dns_server_process_dns64_callback(struct dns_request *request, struct dns_reque
|
|
|
return DNS_CHILD_POST_NO_RESPONSE;
|
|
|
}
|
|
|
|
|
|
- return DNS_CHILD_POST_SUCCESS;
|
|
|
+ return DNS_CHILD_POST_SKIP;
|
|
|
}
|
|
|
|
|
|
static int _dns_server_process_dns64(struct dns_request *request)
|
|
@@ -6060,6 +6066,8 @@ static int _dns_server_process_dns64(struct dns_request *request)
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
+ request->dualstack_selection = 0;
|
|
|
+ child_request->prefetch_flags |= PREFETCH_FLAGS_NO_DUALSTACK;
|
|
|
request->request_wait++;
|
|
|
int ret = _dns_server_do_query(child_request, 0);
|
|
|
if (ret != 0) {
|
|
@@ -6069,7 +6077,7 @@ static int _dns_server_process_dns64(struct dns_request *request)
|
|
|
}
|
|
|
|
|
|
_dns_server_request_release_complete(child_request, 0);
|
|
|
- return 1;
|
|
|
+ return 0;
|
|
|
|
|
|
errout:
|
|
|
|
|
@@ -6288,6 +6296,10 @@ static int _dns_server_process_cache(struct dns_request *request)
|
|
|
goto reply_cache;
|
|
|
}
|
|
|
|
|
|
+ if (_dns_server_is_dns64_request(request) == 1) {
|
|
|
+ goto reply_cache;
|
|
|
+ }
|
|
|
+
|
|
|
cache_key.qtype = dualstack_qtype;
|
|
|
dualstack_dns_cache = dns_cache_lookup(&cache_key);
|
|
|
if (dualstack_dns_cache == NULL && request->cname[0] != '\0') {
|