فهرست منبع

Fix dualstack select issue

Nick Peng 6 سال پیش
والد
کامیت
7241b24a57
5فایلهای تغییر یافته به همراه13 افزوده شده و 12 حذف شده
  1. 1 1
      ReadMe.md
  2. 1 1
      ReadMe_zh-CN.md
  3. 1 1
      etc/smartdns/smartdns.conf
  4. 2 2
      src/dns_conf.c
  5. 8 7
      src/dns_server.c

+ 1 - 1
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)  
 

+ 1 - 1
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)  
 

+ 1 - 1
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
 

+ 2 - 2
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),

+ 8 - 7
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);