dns_server: fix ipv6 not response issue

This commit is contained in:
Nick Peng
2022-05-17 01:15:14 +08:00
parent bdc3a87d6d
commit ee40591aed

View File

@@ -397,15 +397,16 @@ struct dns_ip_address *_dns_ip_address_get(struct dns_request *request, unsigned
/* store the ip address and the number of hits */ /* store the ip address and the number of hits */
key = jhash(addr, addr_len, 0); key = jhash(addr, addr_len, 0);
key = jhash(&addr_type, sizeof(addr_type), key);
pthread_mutex_lock(&request->ip_map_lock); pthread_mutex_lock(&request->ip_map_lock);
hash_for_each_possible(request->ip_map, addr_tmp, node, key) hash_for_each_possible(request->ip_map, addr_tmp, node, key)
{ {
if (addr_type == DNS_T_A) { if (addr_type == DNS_T_A && addr_tmp->addr_type == DNS_T_A) {
if (memcmp(addr_tmp->ipv4_addr, addr, addr_len) == 0) { if (memcmp(addr_tmp->ipv4_addr, addr, addr_len) == 0) {
addr_map = addr_tmp; addr_map = addr_tmp;
break; break;
} }
} else if (addr_type == DNS_T_AAAA) { } else if (addr_type == DNS_T_AAAA && addr_tmp->addr_type == DNS_T_AAAA) {
if (memcmp(addr_tmp->ipv6_addr, addr, addr_len) == 0) { if (memcmp(addr_tmp->ipv6_addr, addr, addr_len) == 0) {
addr_map = addr_tmp; addr_map = addr_tmp;
break; break;
@@ -1051,7 +1052,7 @@ static int _dns_request_post(struct dns_server_post_context *context)
struct dns_request *request = context->request; struct dns_request *request = context->request;
int ret = 0; int ret = 0;
tlog(TLOG_DEBUG, "reply %s %d", request->domain, request->qtype); tlog(TLOG_DEBUG, "reply %s %d %d", request->domain, request->qtype, context->qtype);
if (request->conn == NULL) { if (request->conn == NULL) {
context->do_reply = 0; context->do_reply = 0;
@@ -1359,17 +1360,18 @@ static int _dns_ip_address_check_add(struct dns_request *request, char *cname, u
/* store the ip address and the number of hits */ /* store the ip address and the number of hits */
key = jhash(addr, addr_len, 0); key = jhash(addr, addr_len, 0);
key = jhash(&addr_type, sizeof(addr_type), key);
pthread_mutex_lock(&request->ip_map_lock); pthread_mutex_lock(&request->ip_map_lock);
hash_for_each_possible(request->ip_map, addr_map, node, key) hash_for_each_possible(request->ip_map, addr_map, node, key)
{ {
if (addr_type == DNS_T_A) { if (addr_map->addr_type == DNS_T_A && addr_type == DNS_T_A) {
if (memcmp(addr_map->ipv4_addr, addr, addr_len) == 0) { if (memcmp(addr_map->ipv4_addr, addr, addr_len) == 0) {
addr_map->hitnum++; addr_map->hitnum++;
addr_map->recv_tick = get_tick_count(); addr_map->recv_tick = get_tick_count();
pthread_mutex_unlock(&request->ip_map_lock); pthread_mutex_unlock(&request->ip_map_lock);
return -1; return -1;
} }
} else if (addr_type == DNS_T_AAAA) { } else if (addr_map->addr_type == DNS_T_AAAA && addr_type == DNS_T_AAAA) {
if (memcmp(addr_map->ipv6_addr, addr, addr_len) == 0) { if (memcmp(addr_map->ipv6_addr, addr, addr_len) == 0) {
addr_map->hitnum++; addr_map->hitnum++;
addr_map->recv_tick = get_tick_count(); addr_map->recv_tick = get_tick_count();
@@ -1572,7 +1574,6 @@ static void _dns_server_request_release_complete(struct dns_request *request, in
static void _dns_server_request_release(struct dns_request *request) static void _dns_server_request_release(struct dns_request *request)
{ {
_dns_server_request_release_complete(request, request->passthrough == 0); _dns_server_request_release_complete(request, request->passthrough == 0);
} }
@@ -1711,6 +1712,7 @@ static void _dns_server_ping_result(struct ping_host_struct *ping_host, const ch
request->ipv4_addr[3], request->ping_ttl_v4, rtt); request->ipv4_addr[3], request->ping_ttl_v4, rtt);
request->ping_ttl_v4 = rtt; request->ping_ttl_v4 = rtt;
request->has_cname = 0; request->has_cname = 0;
request->has_ipv4 = 1;
if (addr_map && addr_map->cname[0] != 0) { if (addr_map && addr_map->cname[0] != 0) {
request->has_cname = 1; request->has_cname = 1;
safe_strncpy(request->cname, addr_map->cname, DNS_MAX_CNAME_LEN); safe_strncpy(request->cname, addr_map->cname, DNS_MAX_CNAME_LEN);
@@ -1724,6 +1726,10 @@ static void _dns_server_ping_result(struct ping_host_struct *ping_host, const ch
return; return;
} }
} }
if (request->qtype == DNS_T_A) {
request->has_ping_result = 1;
}
} break; } break;
case AF_INET6: { case AF_INET6: {
struct sockaddr_in6 *addr_in6; struct sockaddr_in6 *addr_in6;
@@ -1736,6 +1742,8 @@ static void _dns_server_ping_result(struct ping_host_struct *ping_host, const ch
if (request->ping_ttl_v4 > rtt || request->ping_ttl_v4 == -1) { if (request->ping_ttl_v4 > rtt || request->ping_ttl_v4 == -1) {
request->ping_ttl_v4 = rtt; request->ping_ttl_v4 = rtt;
request->has_cname = 0;
request->has_ipv4 = 1;
memcpy(request->ipv4_addr, addr_in6->sin6_addr.s6_addr + 12, 4); memcpy(request->ipv4_addr, addr_in6->sin6_addr.s6_addr + 12, 4);
if (addr_map && addr_map->cname[0] != 0) { if (addr_map && addr_map->cname[0] != 0) {
request->has_cname = 1; request->has_cname = 1;
@@ -1744,29 +1752,41 @@ static void _dns_server_ping_result(struct ping_host_struct *ping_host, const ch
request->has_cname = 0; request->has_cname = 0;
} }
} }
if (request->qtype == DNS_T_A) {
request->has_ping_result = 1;
}
} else { } else {
addr_map = _dns_ip_address_get(request, addr_in6->sin6_addr.s6_addr, DNS_T_AAAA); addr_map = _dns_ip_address_get(request, addr_in6->sin6_addr.s6_addr,
DNS_T_AAAA);
if (addr_map) { if (addr_map) {
addr_map->ping_ttl = rtt; addr_map->ping_ttl = rtt;
} }
if (request->ping_ttl_v6 > rtt || request->ping_ttl_v6 == -1) { if (request->ping_ttl_v6 > rtt || request->ping_ttl_v6 == -1) {
request->ping_ttl_v6 = rtt; request->ping_ttl_v6 = rtt;
request->has_cname = 0;
request->has_ipv6 = 1;
memcpy(request->ipv6_addr, addr_in6->sin6_addr.s6_addr, 16); memcpy(request->ipv6_addr, addr_in6->sin6_addr.s6_addr, 16);
if (addr_map && addr_map->cname[0] != 0) { if (addr_map && addr_map->cname[0] != 0) {
request->has_cname = 1; request->has_cname = 1;
safe_strncpy(request->cname, addr_map->cname, DNS_MAX_CNAME_LEN); safe_strncpy(request->cname, addr_map->cname,
DNS_MAX_CNAME_LEN);
} else { } else {
request->has_cname = 0; request->has_cname = 0;
} }
} }
if (request->qtype == DNS_T_AAAA) {
request->has_ping_result = 1;
}
} }
} break; } break;
default: default:
break; break;
} }
if (result == PING_RESULT_RESPONSE) { if (result == PING_RESULT_RESPONSE) {
request->has_ping_result = 1;
tlog(TLOG_DEBUG, "from %s: seq=%d time=%d\n", host, seqno, rtt); tlog(TLOG_DEBUG, "from %s: seq=%d time=%d\n", host, seqno, rtt);
} else { } else {
tlog(TLOG_DEBUG, "from %s: seq=%d timeout\n", host, seqno); tlog(TLOG_DEBUG, "from %s: seq=%d timeout\n", host, seqno);