Skip to content

Commit

Permalink
dns_server: cache ptr record
Browse files Browse the repository at this point in the history
  • Loading branch information
pymumu committed Nov 4, 2023
1 parent 2a8d3af commit 14330dd
Showing 1 changed file with 98 additions and 52 deletions.
150 changes: 98 additions & 52 deletions src/dns_server.c
Original file line number Diff line number Diff line change
Expand Up @@ -953,7 +953,7 @@ static int _dns_add_rrs(struct dns_server_post_context *context)
char *domain = request->domain;
if (request->has_ptr) {
/* add PTR record */
ret = dns_add_PTR(context->packet, DNS_RRS_AN, request->domain, 30, request->ptr_hostname);
ret = dns_add_PTR(context->packet, DNS_RRS_AN, request->domain, request->ip_ttl, request->ptr_hostname);
}

/* add CNAME record */
Expand Down Expand Up @@ -1258,6 +1258,22 @@ static inline int _dns_server_expired_cache_ttl(struct dns_cache *cache)
return cache->info.insert_time + cache->info.ttl + dns_conf_serve_expired_ttl - time(NULL);
}

static int _dns_cache_is_specify_packet(int qtype)
{
switch (qtype) {
case DNS_T_PTR:
case DNS_T_HTTPS:
case DNS_T_TXT:
case DNS_T_SRV:
break;
default:
return -1;
break;
}

return 0;
}

static int _dns_server_get_cache_timeout(struct dns_request *request, struct dns_cache_key *cache_key, int ttl)
{
int timeout = 0;
Expand All @@ -1266,7 +1282,7 @@ static int _dns_server_get_cache_timeout(struct dns_request *request, struct dns
return ttl + 1;
}

if (dns_conf_prefetch) {
if (dns_conf_prefetch && _dns_cache_is_specify_packet(request->qtype) != 0) {
if (dns_conf_serve_expired) {
timeout = dns_conf_serve_expired_prefetch_time;
if (timeout == 0) {
Expand Down Expand Up @@ -1514,15 +1530,15 @@ static int _dns_cache_packet(struct dns_server_post_context *context)
cache_key.query_flag = request->server_flags;

if (request->prefetch) {
if (dns_cache_replace(&cache_key, request->rcode, context->reply_ttl, -1,
_dns_server_get_cache_timeout(request, &cache_key, context->reply_ttl),
if (dns_cache_replace(&cache_key, request->rcode, request->ip_ttl, -1,
_dns_server_get_cache_timeout(request, &cache_key, request->ip_ttl),
!request->prefetch_expired_domain, cache_packet) != 0) {
goto errout;
}
} else {
/* insert result to cache */
if (dns_cache_insert(&cache_key, request->rcode, context->reply_ttl, -1,
_dns_server_get_cache_timeout(request, NULL, context->reply_ttl), cache_packet) != 0) {
if (dns_cache_insert(&cache_key, request->rcode, request->ip_ttl, -1,
_dns_server_get_cache_timeout(request, NULL, request->ip_ttl), cache_packet) != 0) {
goto errout;
}
}
Expand Down Expand Up @@ -1585,15 +1601,8 @@ static int _dns_result_callback(struct dns_server_post_context *context)

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:
if (_dns_cache_is_specify_packet(context->qtype) != 0) {
return 0;
break;
}

return _dns_cache_packet(context);
Expand Down Expand Up @@ -3969,6 +3978,50 @@ static int _dns_server_process_local_ptr(struct dns_request *request)
return -1;
}

static int _dns_server_get_local_ttl(struct dns_request *request)
{
struct dns_ttl_rule *ttl_rule;

/* get domain rule flag */
ttl_rule = _dns_server_get_dns_rule(request, DOMAIN_RULE_TTL);
if (ttl_rule != NULL) {
if (ttl_rule->ttl > 0) {
return ttl_rule->ttl;
}
}

if (dns_conf_local_ttl > 0) {
return dns_conf_local_ttl;
}

if (dns_conf_rr_ttl > 0) {
return dns_conf_rr_ttl;
}

if (dns_conf_rr_ttl_min > 0) {
return dns_conf_rr_ttl_min;
}

return DNS_SERVER_ADDR_TTL;
}

static int _dns_server_process_private_ptr(struct dns_request *request)
{
int a, b, c, d;
int ret = sscanf(request->domain, "%d.%d.%d.%d.in-addr.arpa", &a, &b, &c, &d);
if (ret != 4) {
return -1;
}

if (d == 10 || (d == 172 && c >= 16 && c <= 31) || (d == 192 && c == 168)) {
request->has_soa = 1;
_dns_server_setup_soa(request);
return 0;
}

return -1;
}

static int _dns_server_process_ptr(struct dns_request *request)
{
if (_dns_server_process_ptrs(request) == 0) {
Expand All @@ -3979,14 +4032,20 @@ static int _dns_server_process_ptr(struct dns_request *request)
goto reply_exit;
}

if (_dns_server_process_private_ptr(request) == 0) {
goto reply_exit;
}

return -1;

reply_exit:
request->rcode = DNS_RC_NOERROR;
request->ip_ttl = _dns_server_get_local_ttl(request);
struct dns_server_post_context context;
_dns_server_post_context_init(&context, request);
context.do_reply = 1;
context.do_audit = 0;
context.do_cache = 1;
_dns_request_post(&context);
return 0;
}
Expand Down Expand Up @@ -4275,33 +4334,6 @@ static int _dns_server_pre_process_rule_flags(struct dns_request *request)
return 0;
}

static int _dns_server_get_local_ttl(struct dns_request *request)
{
struct dns_ttl_rule *ttl_rule;

/* get domain rule flag */
ttl_rule = _dns_server_get_dns_rule(request, DOMAIN_RULE_TTL);
if (ttl_rule != NULL) {
if (ttl_rule->ttl > 0) {
return ttl_rule->ttl;
}
}

if (dns_conf_local_ttl > 0) {
return dns_conf_local_ttl;
}

if (dns_conf_rr_ttl > 0) {
return dns_conf_rr_ttl;
}

if (dns_conf_rr_ttl_min > 0) {
return dns_conf_rr_ttl_min;
}

return DNS_SERVER_ADDR_TTL;
}

static int _dns_server_address_generate_order(int orders[], int order_num, int max_order_count)
{
int i = 0;
Expand Down Expand Up @@ -4918,14 +4950,18 @@ static int _dns_server_process_cache(struct dns_request *request)
goto reply_cache;
}

if (request->qtype != DNS_T_A && request->qtype != DNS_T_AAAA) {
goto reply_cache;
}

if (request->dualstack_selection) {
int dualstack_qtype = 0;
if (request->qtype == DNS_T_A) {
dualstack_qtype = DNS_T_AAAA;
} else if (request->qtype == DNS_T_AAAA) {
dualstack_qtype = DNS_T_A;
} else {
goto out;
goto reply_cache;
}

cache_key.qtype = dualstack_qtype;
Expand Down Expand Up @@ -5114,20 +5150,26 @@ static int _dns_server_process_smartdns_domain(struct dns_request *request)
return _dns_server_reply_request_eth_ip(request);
}

static int _dns_server_process_ptr_query(struct dns_request *request)
{
if (request->qtype != DNS_T_PTR) {
return -1;
}

if (_dns_server_process_ptr(request) == 0) {
return 0;
}

request->passthrough = 1;
return -1;
}

static int _dns_server_process_special_query(struct dns_request *request)
{
int ret = 0;

switch (request->qtype) {
case DNS_T_PTR:
/* return PTR record */
ret = _dns_server_process_ptr(request);
if (ret == 0) {
goto clean_exit;
} else {
/* pass to upstream server */
request->passthrough = 1;
}
break;
case DNS_T_SVCB:
ret = _dns_server_process_srv(request);
Expand All @@ -5141,7 +5183,6 @@ static int _dns_server_process_special_query(struct dns_request *request)
case DNS_T_A:
break;
case DNS_T_AAAA:

break;
default:
tlog(TLOG_DEBUG, "unsupported qtype: %d, domain: %s", request->qtype, request->domain);
Expand Down Expand Up @@ -5400,6 +5441,11 @@ static int _dns_server_do_query(struct dns_request *request, int skip_notify_eve
}
}

/* process ptr */
if (_dns_server_process_ptr_query(request) == 0) {
goto clean_exit;
}

ret = _dns_server_set_to_pending_list(request);
if (ret == 0) {
goto clean_exit;
Expand Down Expand Up @@ -6467,7 +6513,7 @@ static int _dns_server_cache_expired(struct dns_cache *dns_cache)
return -1;
}

if (dns_conf_prefetch == 1) {
if (dns_conf_prefetch == 1 && _dns_cache_is_specify_packet(dns_cache->info.qtype) != 0) {
if (dns_conf_serve_expired == 1) {
return _dns_server_prefetch_expired_domain(dns_cache);
} else {
Expand Down

0 comments on commit 14330dd

Please sign in to comment.