server: Support specific qtype to return SOA

This commit is contained in:
Nick Peng
2022-02-17 22:32:03 +08:00
parent 45180c0dd6
commit ee9059bb37
6 changed files with 82 additions and 3 deletions

View File

@@ -2328,6 +2328,25 @@ errout:
return -1;
}
static int _dns_server_qtype_soa(struct dns_request *request)
{
struct dns_qtype_soa_list *soa_list = NULL;
uint32_t key = hash_32_generic(request->qtype, 32);
hash_for_each_possible(dns_qtype_soa_table.qtype, soa_list, node, key)
{
if (request->qtype != soa_list->qtypeid) {
continue;
}
_dns_server_reply_SOA(DNS_RC_NOERROR, request);
tlog(TLOG_DEBUG, "force qtype %d soa", request->qtype);
return 0;
}
return -1;
}
static void _dns_server_process_speed_check_rule(struct dns_request *request)
{
struct dns_domain_check_order *check_order = NULL;
@@ -2351,7 +2370,6 @@ static int _dns_server_get_expired_ttl_reply(struct dns_cache *dns_cache)
return dns_conf_serve_expired_reply_ttl;
}
static int _dns_server_get_expired_cname_ttl_reply(struct dns_cache *dns_cache)
{
int ttl = dns_cache_get_cname_ttl(dns_cache);
@@ -2429,13 +2447,12 @@ static int _dns_server_process_cache_packet(struct dns_request *request, struct
}
_dns_server_get_answer(request, packet);
_dns_server_audit_log(request);
if (request->result_callback) {
_dns_result_callback(request);
}
if (request->conn == NULL) {
return 0;
}
@@ -2703,6 +2720,11 @@ static int _dns_server_do_query(struct dns_request *request, const char *domain,
goto clean_exit;
}
/* process qtype soa */
if (_dns_server_qtype_soa(request) == 0) {
goto clean_exit;
}
/* process speed check rule */
_dns_server_process_speed_check_rule(request);