소스 검색

dns_server: fix some issues, domain speed check. serve-expired value. group info.

Nick Peng 1 년 전
부모
커밋
b9e2e66903
5개의 변경된 파일101개의 추가작업 그리고 1개의 파일을 삭제
  1. 8 0
      src/dns_conf.c
  2. 3 1
      src/dns_server.c
  3. 38 0
      test/cases/test-group.cc
  4. 10 0
      test/cases/test-ptr.cc
  5. 42 0
      test/cases/test-speed-check.cc

+ 8 - 0
src/dns_conf.c

@@ -599,6 +599,7 @@ static int _config_rule_group_setup_value(struct dns_conf_group_info *group_info
 	group_rule->dualstack_ip_selection = 1;
 	group_rule->dns_dualstack_ip_selection_threshold = 10;
 	group_rule->dns_rr_ttl_min = 600;
+	group_rule->dns_serve_expired = 1;
 	group_rule->dns_serve_expired_ttl = 24 * 3600 * 3;
 	group_rule->dns_serve_expired_reply_ttl = 3;
 	group_rule->dns_max_reply_ip_num = DNS_MAX_REPLY_IP_NUM;
@@ -980,6 +981,11 @@ static int _config_server(int argc, char *argv[], dns_server_type_t type, int de
 		group_name = _config_current_group()->group_name;
 	}
 
+	/* if server is defined in a group, exclude from default group */
+	if (group_name && group_name[0] != '\0') {
+		server_flag |= SERVER_FLAG_EXCLUDE_DEFAULT;
+	}
+
 	/* process extra options */
 	optind = 1;
 	while (1) {
@@ -2566,6 +2572,7 @@ static int _config_speed_check_mode_parser(struct dns_domain_check_orders *check
 			}
 			check_orders->orders[order].type = DOMAIN_CHECK_ICMP;
 			check_orders->orders[order].tcp_port = 0;
+			dns_conf_has_icmp_check = 1;
 		} else if (strstr(field, "tcp") == field) {
 			char *port_str = strstr(field, ":");
 			if (port_str) {
@@ -2577,6 +2584,7 @@ static int _config_speed_check_mode_parser(struct dns_domain_check_orders *check
 
 			check_orders->orders[order].type = DOMAIN_CHECK_TCP;
 			check_orders->orders[order].tcp_port = port;
+			dns_conf_has_tcp_check = 1;
 		} else if (strncmp(field, "none", sizeof("none")) == 0) {
 			for (i = order; i < DOMAIN_CHECK_NUM; i++) {
 				check_orders->orders[i].type = DOMAIN_CHECK_NONE;

+ 3 - 1
src/dns_server.c

@@ -6322,6 +6322,7 @@ static int _dns_server_setup_request_conf_pre(struct dns_request *request)
 	}
 
 	request->conf = rule_group;
+	safe_strncpy(request->dns_group_name, rule_group->group_name, sizeof(request->dns_group_name));
 	tlog(TLOG_DEBUG, "domain %s match group %s", request->domain, rule_group->group_name);
 
 	return 0;
@@ -8629,7 +8630,8 @@ int dns_server_init(void)
 
 	dns_server_check_ipv6_ready();
 	tlog(TLOG_INFO, "%s",
-		 (is_ipv6_ready) ? "IPV6 is ready, enable IPV6 features" : "IPV6 is not ready, disable IPV6 features");
+		 (is_ipv6_ready) ? "IPV6 is ready, enable IPV6 features"
+						 : "IPV6 is not ready or speed check is disabled, disable IPV6 features");
 
 	if (_dns_server_init_wakeup_event() != 0) {
 		tlog(TLOG_ERROR, "init wakeup event failed.");

+ 38 - 0
test/cases/test-group.cc

@@ -521,3 +521,41 @@ group-match -domain a.com
 	EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.2.3.4");
 	EXPECT_EQ(client.GetAnswer()[1].GetData(), "5.6.7.8");
 }
+
+TEST_F(Group, server_group_exclude_default)
+{
+	smartdns::MockServer server_upstream;
+	smartdns::MockServer server_upstream1;
+	smartdns::Server server;
+
+	server_upstream.Start("udp://0.0.0.0:61053", [](struct smartdns::ServerRequestContext *request) {
+		if (request->qtype != DNS_T_A) {
+			return smartdns::SERVER_REQUEST_SOA;
+		}
+
+		usleep(50000);
+
+		smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4", 611);
+		return smartdns::SERVER_REQUEST_OK;
+	});
+
+	server_upstream1.Start("udp://0.0.0.0:62053",
+						   [](struct smartdns::ServerRequestContext *request) { return smartdns::SERVER_REQUEST_SOA; });
+
+	server.MockPing(PING_TYPE_ICMP, "2001::", 128, 10000);
+	server.Start(R"""(bind [::]:60053
+bind-tcp [::]:60053
+group-begin client
+server 127.0.0.1:61053
+group-end
+server 127.0.0.1:62053
+)""");
+	smartdns::Client client;
+	ASSERT_TRUE(client.Query("a.com", 60053));
+	std::cout << client.GetResult() << std::endl;
+	ASSERT_EQ(client.GetAuthorityNum(), 1);
+	EXPECT_EQ(client.GetStatus(), "NXDOMAIN");
+	EXPECT_EQ(client.GetAuthority()[0].GetName(), "a.com");
+	EXPECT_EQ(client.GetAuthority()[0].GetTTL(), 60);
+	EXPECT_EQ(client.GetAuthority()[0].GetType(), "SOA");
+}

+ 10 - 0
test/cases/test-ptr.cc

@@ -88,6 +88,7 @@ speed-check-mode none
 expand-ptr-from-address yes
 address /a.com/10.11.12.13
 address /a.com/64:ff9b::1010:1010
+address /pi.local/192.168.1.1
 )""");
 	smartdns::Client client;
 	ASSERT_TRUE(client.Query("13.12.11.10.in-addr.arpa PTR", 60053));
@@ -108,6 +109,15 @@ address /a.com/64:ff9b::1010:1010
 	EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 600);
 	EXPECT_EQ(client.GetAnswer()[0].GetType(), "PTR");
 	EXPECT_EQ(client.GetAnswer()[0].GetData(), "a.com.");
+
+	ASSERT_TRUE(client.Query("-x 192.168.1.1", 60053));
+	std::cout << client.GetResult() << std::endl;
+	ASSERT_EQ(client.GetAnswerNum(), 1);
+	EXPECT_EQ(client.GetStatus(), "NOERROR");
+	EXPECT_EQ(client.GetAnswer()[0].GetName(), "1.1.168.192.in-addr.arpa");
+	EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 600);
+	EXPECT_EQ(client.GetAnswer()[0].GetType(), "PTR");
+	EXPECT_EQ(client.GetAnswer()[0].GetData(), "pi.local.");
 }
 
 TEST_F(Ptr, smartdns)

+ 42 - 0
test/cases/test-speed-check.cc

@@ -369,3 +369,45 @@ dualstack-ip-selection no
 	EXPECT_GT(client.GetAnswer()[0].GetTTL(), 597);
 	EXPECT_EQ(client.GetAnswer()[0].GetData(), "2001:db8::2");
 }
+
+TEST_F(SpeedCheck, global_none_rule_check)
+{
+	smartdns::MockServer server_upstream;
+	smartdns::Server server;
+
+	server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
+		if (request->qtype == DNS_T_A) {
+			smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4");
+			smartdns::MockServer::AddIP(request, request->domain.c_str(), "5.6.7.8");
+			return smartdns::SERVER_REQUEST_OK;
+		}
+		return smartdns::SERVER_REQUEST_SOA;
+	});
+
+	server.MockPing(PING_TYPE_ICMP, "1.2.3.4", 60, 100);
+	server.MockPing(PING_TYPE_ICMP, "5.6.7.8", 60, 150);
+
+	server.Start(R"""(bind [::]:60053
+server 127.0.0.1:61053
+speed-check-mode none
+domain-rules /b.com/ -c ping
+)""");
+	smartdns::Client client;
+	ASSERT_TRUE(client.Query("b.com", 60053));
+	std::cout << client.GetResult() << std::endl;
+	ASSERT_EQ(client.GetAnswerNum(), 1);
+	EXPECT_EQ(client.GetStatus(), "NOERROR");
+	EXPECT_GT(client.GetQueryTime(), 50);
+	EXPECT_EQ(client.GetAnswer()[0].GetName(), "b.com");
+	EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 3);
+
+	ASSERT_TRUE(client.Query("a.com", 60053));
+	std::cout << client.GetResult() << std::endl;
+	ASSERT_EQ(client.GetAnswerNum(), 2);
+	EXPECT_EQ(client.GetStatus(), "NOERROR");
+	EXPECT_LT(client.GetQueryTime(), 20);
+	EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
+	EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 600);
+	EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.2.3.4");
+	EXPECT_EQ(client.GetAnswer()[1].GetData(), "5.6.7.8");
+}