dualstack: update cache when ipv6 not exists
This commit is contained in:
@@ -130,7 +130,7 @@ int dns_cache_replace(char *domain, char *cname, int cname_ttl, int ttl, dns_typ
|
|||||||
/* lookup existing cache */
|
/* lookup existing cache */
|
||||||
dns_cache = dns_cache_lookup(domain, qtype);
|
dns_cache = dns_cache_lookup(domain, qtype);
|
||||||
if (dns_cache == NULL) {
|
if (dns_cache == NULL) {
|
||||||
return 0;
|
return dns_cache_insert(domain, cname, cname_ttl, ttl, qtype, addr, addr_len, speed);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ttl < DNS_CACHE_TTL_MIN) {
|
if (ttl < DNS_CACHE_TTL_MIN) {
|
||||||
|
|||||||
@@ -2026,9 +2026,10 @@ static int _dns_server_process_cache(struct dns_request *request)
|
|||||||
{
|
{
|
||||||
struct dns_cache *dns_cache = NULL;
|
struct dns_cache *dns_cache = NULL;
|
||||||
struct dns_cache *dns_cache_A = NULL;
|
struct dns_cache *dns_cache_A = NULL;
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
if (_dns_server_has_bind_flag(request, BIND_FLAG_NO_CACHE) == 0) {
|
if (_dns_server_has_bind_flag(request, BIND_FLAG_NO_CACHE) == 0) {
|
||||||
goto errout;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
dns_cache = dns_cache_lookup(request->domain, request->qtype);
|
dns_cache = dns_cache_lookup(request->domain, request->qtype);
|
||||||
@@ -2037,16 +2038,18 @@ static int _dns_server_process_cache(struct dns_request *request)
|
|||||||
dns_cache_A = dns_cache_lookup(request->domain, DNS_T_A);
|
dns_cache_A = dns_cache_lookup(request->domain, DNS_T_A);
|
||||||
if (dns_cache_A) {
|
if (dns_cache_A) {
|
||||||
tlog(TLOG_DEBUG, "No IPV6 Found, Force IPV4 perfered.");
|
tlog(TLOG_DEBUG, "No IPV6 Found, Force IPV4 perfered.");
|
||||||
dns_cache_release(dns_cache_A);
|
if (dns_cache_get_ttl(dns_cache_A) == 0) {
|
||||||
dns_cache_release(dns_cache);
|
_dns_server_prefetch_request(request->domain, request->qtype);
|
||||||
return _dns_server_reply_SOA(DNS_RC_NOERROR, request);
|
}
|
||||||
|
ret = _dns_server_reply_SOA(DNS_RC_NOERROR, request);
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
goto errout;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (request->qtype != dns_cache->qtype) {
|
if (request->qtype != dns_cache->qtype) {
|
||||||
goto errout;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (request->dualstack_selection && request->qtype == DNS_T_AAAA) {
|
if (request->dualstack_selection && request->qtype == DNS_T_AAAA) {
|
||||||
@@ -2055,9 +2058,8 @@ static int _dns_server_process_cache(struct dns_request *request)
|
|||||||
if ((dns_cache_A->speed + (dns_conf_dualstack_ip_selection_threshold * 10)) < dns_cache->speed ||
|
if ((dns_cache_A->speed + (dns_conf_dualstack_ip_selection_threshold * 10)) < dns_cache->speed ||
|
||||||
dns_cache->speed < 0) {
|
dns_cache->speed < 0) {
|
||||||
tlog(TLOG_DEBUG, "Force IPV4 perfered.");
|
tlog(TLOG_DEBUG, "Force IPV4 perfered.");
|
||||||
dns_cache_release(dns_cache_A);
|
ret = _dns_server_reply_SOA(DNS_RC_NOERROR, request);
|
||||||
dns_cache_release(dns_cache);
|
goto out_update_cache;
|
||||||
return _dns_server_reply_SOA(DNS_RC_NOERROR, request);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2075,7 +2077,7 @@ static int _dns_server_process_cache(struct dns_request *request)
|
|||||||
request->has_ipv6 = 1;
|
request->has_ipv6 = 1;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
goto errout;
|
goto out;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2093,28 +2095,26 @@ static int _dns_server_process_cache(struct dns_request *request)
|
|||||||
_dns_reply(request);
|
_dns_reply(request);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
|
out_update_cache:
|
||||||
if (dns_cache_get_ttl(dns_cache) == 0) {
|
if (dns_cache_get_ttl(dns_cache) == 0) {
|
||||||
_dns_server_prefetch_request(request->domain, request->qtype);
|
_dns_server_prefetch_request(request->domain, request->qtype);
|
||||||
} else {
|
} else {
|
||||||
dns_cache_update(dns_cache);
|
dns_cache_update(dns_cache);
|
||||||
}
|
}
|
||||||
dns_cache_release(dns_cache);
|
|
||||||
|
|
||||||
if (dns_cache_A) {
|
out:
|
||||||
dns_cache_release(dns_cache_A);
|
|
||||||
dns_cache_A = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
errout:
|
|
||||||
if (dns_cache) {
|
if (dns_cache) {
|
||||||
dns_cache_release(dns_cache);
|
dns_cache_release(dns_cache);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dns_cache_A) {
|
if (dns_cache_A) {
|
||||||
dns_cache_release(dns_cache_A);
|
dns_cache_release(dns_cache_A);
|
||||||
dns_cache_A = NULL;
|
dns_cache_A = NULL;
|
||||||
}
|
}
|
||||||
return -1;
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _dns_server_request_set_client(struct dns_request *request, struct dns_server_conn_head *conn)
|
static void _dns_server_request_set_client(struct dns_request *request, struct dns_server_conn_head *conn)
|
||||||
|
|||||||
Reference in New Issue
Block a user