From 7241b24a5743f1003695711a029aa41a664463b1 Mon Sep 17 00:00:00 2001 From: Nick Peng Date: Sun, 20 Jan 2019 19:18:50 +0800 Subject: [PATCH] Fix dualstack select issue --- ReadMe.md | 2 +- ReadMe_zh-CN.md | 2 +- etc/smartdns/smartdns.conf | 2 +- src/dns_conf.c | 4 ++-- src/dns_server.c | 15 ++++++++------- 5 files changed, 13 insertions(+), 12 deletions(-) diff --git a/ReadMe.md b/ReadMe.md index 304c87b..2e1a9b8 100755 --- a/ReadMe.md +++ b/ReadMe.md @@ -399,7 +399,7 @@ Note: Merlin firmware is derived from ASUS firmware and can theoretically be use |blacklist-ip|ip blacklist|None|[ip/subnet], Repeatable,When the filtering server responds IPs in the IP blacklist, The result will be discarded directly| blacklist-ip 1.2.3.4/16 |force-AAAA-SOA|force AAAA query return SOA|no|[yes\|no]|force-AAAA-SOA yes |dualstack-ip-selection|Dualstack ip selection|no|[yes\|no]|dualstack-ip-selection yes -|dualstack-ip-selection-threshold|Dualstack ip select threadhold|100ms|millisecond|dualstack-ip-selection-threshold [1-1000] +|dualstack-ip-selection-threshold|Dualstack ip select threadhold|30ms|millisecond|dualstack-ip-selection-threshold [0-1000] ## [Donate](#Donate) diff --git a/ReadMe_zh-CN.md b/ReadMe_zh-CN.md index 5734690..d787950 100644 --- a/ReadMe_zh-CN.md +++ b/ReadMe_zh-CN.md @@ -399,7 +399,7 @@ rtt min/avg/max/mdev = 5.954/6.133/6.313/0.195 ms |blacklist-ip|黑名单IP地址|无|[ip/subnet],可重复| blacklist-ip 1.2.3.4/16 |force-AAAA-SOA|强制AAAA地址返回SOA|no|[yes\|no]|force-AAAA-SOA yes |dualstack-ip-selection|双栈IP优选|no|[yes\|no]|dualstack-ip-selection yes -|dualstack-ip-selection-threshold|双栈IP优选阈值|100ms|毫秒|dualstack-ip-selection-threshold [1-1000] +|dualstack-ip-selection-threshold|双栈IP优选阈值|30ms|毫秒|dualstack-ip-selection-threshold [0-1000] ## [Donate](#Donate) diff --git a/etc/smartdns/smartdns.conf b/etc/smartdns/smartdns.conf index 6d1584c..106a101 100644 --- a/etc/smartdns/smartdns.conf +++ b/etc/smartdns/smartdns.conf @@ -40,7 +40,7 @@ cache-size 512 # force-AAAA-SOA [yes|no] # Enable IPV4, IPV6 dual stack IP optimization selection strategy -# dualstack-ip-selection-threshold [num] (1~1000) +# dualstack-ip-selection-threshold [num] (0~1000) # dualstack-ip-selection [yes|no] # dualstack-ip-selection yes diff --git a/src/dns_conf.c b/src/dns_conf.c index 8bd31f5..4220530 100644 --- a/src/dns_conf.c +++ b/src/dns_conf.c @@ -37,7 +37,7 @@ art_tree dns_conf_domain_rule; radix_tree_t *dns_conf_address_rule; int dns_conf_dualstack_ip_selection; -int dns_conf_dualstack_ip_selection_threshold = 100; +int dns_conf_dualstack_ip_selection_threshold = 30; int dns_conf_rr_ttl; int dns_conf_rr_ttl_min; @@ -674,7 +674,7 @@ struct config_item config_item[] = { CONF_INT("cache-size", &dns_conf_cachesize, 0, CONF_INT_MAX), CONF_YESNO("prefetch-domain", &dns_conf_prefetch), CONF_YESNO("dualstack-ip-selection", &dns_conf_dualstack_ip_selection), - CONF_INT("dualstack-ip-selection-threshold", &dns_conf_dualstack_ip_selection_threshold, 1, 1000), + CONF_INT("dualstack-ip-selection-threshold", &dns_conf_dualstack_ip_selection_threshold, 0, 1000), CONF_CUSTOM("log-level", config_log_level, NULL), CONF_STRING("log-file", (char *)dns_conf_log_file, DNS_MAX_PATH), CONF_SIZE("log-size", &dns_conf_log_size, 0, 1024 * 1024 * 1024), diff --git a/src/dns_server.c b/src/dns_server.c index 1feda76..d8f524f 100644 --- a/src/dns_server.c +++ b/src/dns_server.c @@ -537,18 +537,16 @@ int _dns_server_request_complete(struct dns_request *request) } } else if (request->qtype == DNS_T_AAAA) { - if (request->has_ipv4) { + if (request->has_ipv4 && request->ping_ttl_v4 > 0) { tlog(TLOG_INFO, "result: %s, rcode: %d, %d.%d.%d.%d\n", request->domain, request->rcode, request->ipv4_addr[0], request->ipv4_addr[1], request->ipv4_addr[2], request->ipv4_addr[3]); - if (((request->ping_ttl_v4 + (dns_conf_dualstack_ip_selection_threshold * 10) < request->ping_ttl_v6) && (request->ping_ttl_v4 > 0)) || - ((request->ping_ttl_v6 == -1) && (request->ping_ttl_v4 > 0))) { + if ((request->ping_ttl_v4 + (dns_conf_dualstack_ip_selection_threshold * 10)) < request->ping_ttl_v6 || request->ping_ttl_v6 < 0) { tlog(TLOG_DEBUG, "Force IPV4 perfered."); dns_cache_insert(request->domain, cname, cname_ttl, request->ttl_v4, DNS_T_A, request->ipv4_addr, DNS_RR_A_LEN); return _dns_server_reply_SOA(DNS_RC_NOERROR, request, NULL); } - request->has_ipv4 = 0; } if (request->has_ipv6) { @@ -567,6 +565,7 @@ int _dns_server_request_complete(struct dns_request *request) dns_cache_insert(request->domain, cname, cname_ttl, request->ttl_v6, DNS_T_AAAA, request->ipv6_addr, DNS_RR_AAAA_LEN); } + request->has_ipv4 = 0; request->has_soa = 0; } } @@ -734,8 +733,10 @@ void _dns_server_ping_result(struct ping_host_struct *ping_host, const char *hos memcpy(request->ipv4_addr, &addr_in->sin_addr.s_addr, 4); } - if (dns_conf_dualstack_ip_selection == 1 && request->qtype == DNS_T_AAAA) { - threshold = dns_conf_dualstack_ip_selection_threshold * 10; + if (request->qtype == DNS_T_AAAA && dns_conf_dualstack_ip_selection == 1) { + if (request->ping_ttl_v6 < 0 && request->has_soa == 0) { + return; + } } } break; case AF_INET6: { @@ -770,7 +771,7 @@ void _dns_server_ping_result(struct ping_host_struct *ping_host, const char *hos } else if (rtt < (get_tick_count() - request->send_tick) * 10) { may_complete = 1; } - + if (may_complete && request->has_ping_result == 1) { _dns_server_request_complete(request); _dns_server_request_remove(request);