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 */
key = jhash(addr, addr_len, 0);
key = jhash(&addr_type, sizeof(addr_type), key);
pthread_mutex_lock(&request->ip_map_lock);
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) {
addr_map = addr_tmp;
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) {
addr_map = addr_tmp;
break;
@@ -1051,7 +1052,7 @@ static int _dns_request_post(struct dns_server_post_context *context)
struct dns_request *request = context->request;
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) {
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 */
key = jhash(addr, addr_len, 0);
key = jhash(&addr_type, sizeof(addr_type), key);
pthread_mutex_lock(&request->ip_map_lock);
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) {
addr_map->hitnum++;
addr_map->recv_tick = get_tick_count();
pthread_mutex_unlock(&request->ip_map_lock);
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) {
addr_map->hitnum++;
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)
{
_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->ping_ttl_v4 = rtt;
request->has_cname = 0;
request->has_ipv4 = 1;
if (addr_map && addr_map->cname[0] != 0) {
request->has_cname = 1;
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;
}
}
if (request->qtype == DNS_T_A) {
request->has_ping_result = 1;
}
} break;
case AF_INET6: {
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) {
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);
if (addr_map && addr_map->cname[0] != 0) {
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;
}
}
if (request->qtype == DNS_T_A) {
request->has_ping_result = 1;
}
} 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) {
addr_map->ping_ttl = rtt;
}
if (request->ping_ttl_v6 > rtt || request->ping_ttl_v6 == -1) {
request->ping_ttl_v6 = rtt;
request->has_cname = 0;
request->has_ipv6 = 1;
memcpy(request->ipv6_addr, addr_in6->sin6_addr.s6_addr, 16);
if (addr_map && addr_map->cname[0] != 0) {
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 {
request->has_cname = 0;
}
}
if (request->qtype == DNS_T_AAAA) {
request->has_ping_result = 1;
}
}
} break;
default:
break;
}
if (result == PING_RESULT_RESPONSE) {
request->has_ping_result = 1;
tlog(TLOG_DEBUG, "from %s: seq=%d time=%d\n", host, seqno, rtt);
} else {
tlog(TLOG_DEBUG, "from %s: seq=%d timeout\n", host, seqno);