Support specific domain names to query IPV6, when setting force-AAAA-SOA yes
This commit is contained in:
@@ -186,6 +186,7 @@ struct dns_request {
|
|||||||
unsigned short rcode;
|
unsigned short rcode;
|
||||||
unsigned short ss_family;
|
unsigned short ss_family;
|
||||||
char remote_server_fail;
|
char remote_server_fail;
|
||||||
|
char skip_qtype_soa;
|
||||||
socklen_t addr_len;
|
socklen_t addr_len;
|
||||||
union {
|
union {
|
||||||
struct sockaddr_in in;
|
struct sockaddr_in in;
|
||||||
@@ -386,12 +387,6 @@ static int _dns_server_is_return_soa(struct dns_request *request)
|
|||||||
return 0;
|
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);
|
rule_flag = _dns_server_get_dns_rule(request, DOMAIN_RULE_FLAGS);
|
||||||
if (rule_flag) {
|
if (rule_flag) {
|
||||||
flags = rule_flag->flags;
|
flags = rule_flag->flags;
|
||||||
@@ -399,11 +394,39 @@ static int _dns_server_is_return_soa(struct dns_request *request)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((flags & DOMAIN_FLAG_ADDR_IPV4_SOA) && (request->qtype == DNS_T_A)) {
|
if (flags & DOMAIN_FLAG_ADDR_IGN) {
|
||||||
return 1;
|
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;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3606,6 +3629,10 @@ static int _dns_server_qtype_soa(struct dns_request *request)
|
|||||||
{
|
{
|
||||||
struct dns_qtype_soa_list *soa_list = NULL;
|
struct dns_qtype_soa_list *soa_list = NULL;
|
||||||
|
|
||||||
|
if (request->skip_qtype_soa) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t key = hash_32_generic(request->qtype, 32);
|
uint32_t key = hash_32_generic(request->qtype, 32);
|
||||||
hash_for_each_possible(dns_qtype_soa_table.qtype, soa_list, node, key)
|
hash_for_each_possible(dns_qtype_soa_table.qtype, soa_list, node, key)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user