cache: cache special records
This commit is contained in:
@@ -61,6 +61,7 @@ typedef enum dns_type {
|
|||||||
DNS_T_SRV = 33,
|
DNS_T_SRV = 33,
|
||||||
DNS_T_OPT = 41,
|
DNS_T_OPT = 41,
|
||||||
DNS_T_SSHFP = 44,
|
DNS_T_SSHFP = 44,
|
||||||
|
DNS_T_HTTPS = 65,
|
||||||
DNS_T_SPF = 99,
|
DNS_T_SPF = 99,
|
||||||
DNS_T_AXFR = 252,
|
DNS_T_AXFR = 252,
|
||||||
DNS_T_ALL = 255
|
DNS_T_ALL = 255
|
||||||
|
|||||||
@@ -1049,7 +1049,7 @@ errout:
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _dns_cache_error_packet(struct dns_server_post_context *context)
|
static int _dns_cache_packet(struct dns_server_post_context *context)
|
||||||
{
|
{
|
||||||
struct dns_request *request = context->request;
|
struct dns_request *request = context->request;
|
||||||
struct dns_cache_data *cache_packet =
|
struct dns_cache_data *cache_packet =
|
||||||
@@ -1060,12 +1060,12 @@ static int _dns_cache_error_packet(struct dns_server_post_context *context)
|
|||||||
|
|
||||||
/* if doing prefetch, update cache only */
|
/* if doing prefetch, update cache only */
|
||||||
if (request->prefetch) {
|
if (request->prefetch) {
|
||||||
if (dns_cache_replace(request->domain, DNS_SERVER_FAIL_TTL, context->qtype, -1, cache_packet) != 0) {
|
if (dns_cache_replace(request->domain, context->reply_ttl, context->qtype, -1, cache_packet) != 0) {
|
||||||
goto errout;
|
goto errout;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* insert result to cache */
|
/* insert result to cache */
|
||||||
if (dns_cache_insert(request->domain, DNS_SERVER_FAIL_TTL, context->qtype, -1, cache_packet) != 0) {
|
if (dns_cache_insert(request->domain, context->reply_ttl, context->qtype, -1, cache_packet) != 0) {
|
||||||
goto errout;
|
goto errout;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1079,6 +1079,23 @@ errout:
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int _dns_cache_specify_packet(struct dns_server_post_context *context)
|
||||||
|
{
|
||||||
|
switch (context->qtype) {
|
||||||
|
case DNS_T_PTR:
|
||||||
|
case DNS_T_HTTPS:
|
||||||
|
case DNS_T_TXT:
|
||||||
|
case DNS_T_SRV:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return _dns_cache_packet(context);
|
||||||
|
}
|
||||||
|
|
||||||
static int _dns_cache_reply_packet(struct dns_server_post_context *context)
|
static int _dns_cache_reply_packet(struct dns_server_post_context *context)
|
||||||
{
|
{
|
||||||
struct dns_request *request = context->request;
|
struct dns_request *request = context->request;
|
||||||
@@ -1088,11 +1105,12 @@ static int _dns_cache_reply_packet(struct dns_server_post_context *context)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (context->packet->head.rcode == DNS_RC_SERVFAIL || context->packet->head.rcode == DNS_RC_NXDOMAIN) {
|
if (context->packet->head.rcode == DNS_RC_SERVFAIL || context->packet->head.rcode == DNS_RC_NXDOMAIN) {
|
||||||
return _dns_cache_error_packet(context);
|
context->reply_ttl = DNS_SERVER_FAIL_TTL;
|
||||||
|
return _dns_cache_packet(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (context->qtype != DNS_T_AAAA && context->qtype != DNS_T_A) {
|
if (context->qtype != DNS_T_AAAA && context->qtype != DNS_T_A) {
|
||||||
return 0;
|
return _dns_cache_specify_packet(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (context->ip_num == 0 && request->has_soa == 0) {
|
if (context->ip_num == 0 && request->has_soa == 0) {
|
||||||
|
|||||||
Reference in New Issue
Block a user