Support specific domain names to query IPV6, when setting force-AAAA-SOA yes

This commit is contained in:
Nick Peng
2022-12-03 15:03:34 +08:00
parent dad31179d2
commit f671c34e7c

View File

@@ -186,6 +186,7 @@ struct dns_request {
unsigned short rcode;
unsigned short ss_family;
char remote_server_fail;
char skip_qtype_soa;
socklen_t addr_len;
union {
struct sockaddr_in in;
@@ -386,12 +387,6 @@ static int _dns_server_is_return_soa(struct dns_request *request)
return 0;
}
if (request->qtype == DNS_T_AAAA) {
if (_dns_server_has_bind_flag(request, BIND_FLAG_FORCE_AAAA_SOA) == 0 || dns_conf_force_AAAA_SOA == 1) {
return 1;
}
}
rule_flag = _dns_server_get_dns_rule(request, DOMAIN_RULE_FLAGS);
if (rule_flag) {
flags = rule_flag->flags;
@@ -399,11 +394,39 @@ static int _dns_server_is_return_soa(struct dns_request *request)
return 1;
}
if ((flags & DOMAIN_FLAG_ADDR_IPV4_SOA) && (request->qtype == DNS_T_A)) {
return 1;
if (flags & DOMAIN_FLAG_ADDR_IGN) {
request->skip_qtype_soa = 1;
return 0;
}
if ((flags & DOMAIN_FLAG_ADDR_IPV6_SOA) && (request->qtype == DNS_T_AAAA)) {
switch (request->qtype) {
case DNS_T_A:
if (flags & DOMAIN_FLAG_ADDR_IPV4_SOA) {
return 1;
}
if (flags & DOMAIN_FLAG_ADDR_IPV4_IGN) {
request->skip_qtype_soa = 1;
return 0;
}
break;
case DNS_T_AAAA:
if (flags & DOMAIN_FLAG_ADDR_IPV6_SOA) {
return 1;
}
if (flags & DOMAIN_FLAG_ADDR_IPV6_IGN) {
request->skip_qtype_soa = 1;
return 0;
}
break;
default:
break;
}
}
if (request->qtype == DNS_T_AAAA) {
if (_dns_server_has_bind_flag(request, BIND_FLAG_FORCE_AAAA_SOA) == 0 || dns_conf_force_AAAA_SOA == 1) {
return 1;
}
}
@@ -3606,6 +3629,10 @@ static int _dns_server_qtype_soa(struct dns_request *request)
{
struct dns_qtype_soa_list *soa_list = NULL;
if (request->skip_qtype_soa) {
return -1;
}
uint32_t key = hash_32_generic(request->qtype, 32);
hash_for_each_possible(dns_qtype_soa_table.qtype, soa_list, node, key)
{