Просмотр исходного кода

ecs: Optimize ecs-subnet configuration method

Nick Peng 2 лет назад
Родитель
Сommit
e66928f27f
2 измененных файлов с 18 добавлено и 5 удалено
  1. 4 2
      src/dns_client.c
  2. 14 3
      src/dns_conf.c

+ 4 - 2
src/dns_client.c

@@ -3414,9 +3414,11 @@ static int _dns_client_setup_server_packet(struct dns_server_info *server_info,
 
 	dns_set_OPT_payload_size(packet, DNS_IN_PACKSIZE);
 	/* dns_add_OPT_TCP_KEEPALIVE(packet, 600); */
-	if (query->qtype == DNS_T_A && server_info->ecs_ipv4.enable) {
+	if ((query->qtype == DNS_T_A && server_info->ecs_ipv4.enable) ||
+		(query->qtype == DNS_T_AAAA && server_info->ecs_ipv6.enable == 0 && server_info->ecs_ipv4.enable)) {
 		dns_add_OPT_ECS(packet, &server_info->ecs_ipv4.ecs);
-	} else if (query->qtype == DNS_T_AAAA && server_info->ecs_ipv6.enable) {
+	} else if ((query->qtype == DNS_T_AAAA && server_info->ecs_ipv6.enable) ||
+			   (query->qtype == DNS_T_A && server_info->ecs_ipv4.enable == 0 && server_info->ecs_ipv6.enable)) {
 		dns_add_OPT_ECS(packet, &server_info->ecs_ipv6.ecs);
 	}
 

+ 14 - 3
src/dns_conf.c

@@ -2562,9 +2562,6 @@ static int _conf_client_subnet(char *subnet, struct dns_edns_client_subnet *ipv4
 		*slash = 0;
 		slash++;
 		subnet_len = atoi(slash);
-		if (subnet_len < 0 || subnet_len > 128) {
-			return -1;
-		}
 	}
 
 	if (getaddr_by_host(str_subnet, (struct sockaddr *)&addr, &addr_len) != 0) {
@@ -2573,9 +2570,23 @@ static int _conf_client_subnet(char *subnet, struct dns_edns_client_subnet *ipv4
 
 	switch (addr.ss_family) {
 	case AF_INET:
+		if (subnet_len < 0 || subnet_len > 32) {
+			return -1;
+		}
+
+		if (subnet_len == 0) {
+			subnet_len = 32;
+		}
 		ecs = ipv4_ecs;
 		break;
 	case AF_INET6:
+		if (subnet_len < 0 || subnet_len > 128) {
+			return -1;
+		}
+
+		if (subnet_len == 0) {
+			subnet_len = 128;
+		}
 		ecs = ipv6_ecs;
 		break;
 	default: