Browse Source

dns_server: fix max ttl reply issue.

Nick Peng 2 năm trước cách đây
mục cha
commit
0340d272c3

+ 8 - 5
src/dns_client.c

@@ -2239,12 +2239,14 @@ static int _dns_client_process_udp_proxy(struct dns_server_info *server_info, st
 	}
 
 	int latency = get_tick_count() - server_info->send_tick;
+	tlog(TLOG_DEBUG, "recv udp packet from %s, len: %d, latency: %d",
+		 get_host_by_addr(from_host, sizeof(from_host), (struct sockaddr *)&from), len, latency);
+
 	if (latency < server_info->drop_packet_latency_ms) {
+		tlog(TLOG_DEBUG, "drop packet from %s, latency: %d", from_host, latency);
 		return 0;
 	}
 
-	tlog(TLOG_DEBUG, "recv udp packet from %s, len: %d",
-		 get_host_by_addr(from_host, sizeof(from_host), (struct sockaddr *)&from), len);
 
 	/* update recv time */
 	time(&server_info->last_recv);
@@ -2322,14 +2324,15 @@ static int _dns_client_process_udp(struct dns_server_info *server_info, struct e
 		}
 	}
 
-	tlog(TLOG_DEBUG, "recv udp packet from %s, len: %d, ttl: %d",
-		 get_host_by_addr(from_host, sizeof(from_host), (struct sockaddr *)&from), len, ttl);
+	int latency = get_tick_count() - server_info->send_tick;
+	tlog(TLOG_DEBUG, "recv udp packet from %s, len: %d, ttl: %d, latency: %d",
+		 get_host_by_addr(from_host, sizeof(from_host), (struct sockaddr *)&from), len, ttl, latency);
 
 	/* update recv time */
 	time(&server_info->last_recv);
 
-	int latency = get_tick_count() - server_info->send_tick;
 	if (latency < server_info->drop_packet_latency_ms) {
+		tlog(TLOG_DEBUG, "drop packet from %s, latency: %d", from_host, latency);
 		return 0;
 	}
 

+ 1 - 1
src/dns_server.c

@@ -1838,7 +1838,7 @@ static int _dns_request_update_id_ttl(struct dns_server_post_context *context)
 		}
 
 		if (ttl > dns_conf_rr_ttl_reply_max) {
-			ttl %= dns_conf_rr_ttl_reply_max;
+			ttl = dns_conf_rr_ttl_reply_max;
 		}
 
 		if (ttl == 0) {

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

@@ -127,6 +127,16 @@ cache-persist no)""");
 	EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
 	EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 5);
 	EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.2.3.4");
+
+	sleep(1);
+
+	ASSERT_TRUE(client.Query("a.com", 60053));
+	std::cout << client.GetResult() << std::endl;
+	ASSERT_EQ(client.GetAnswerNum(), 1);
+	EXPECT_EQ(client.GetStatus(), "NOERROR");
+	EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com");
+	EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 5);
+	EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.2.3.4");
 }
 
 TEST_F(Cache, max_reply_ttl_expired)

+ 0 - 4
test/cases/test-cname.cc

@@ -77,7 +77,6 @@ TEST_F(Cname, subdomain1)
 		if (request->domain == "s.a.com") {
 			smartdns::MockServer::AddIP(request, request->domain.c_str(), "4.5.6.7", 700);
 			return smartdns::SERVER_REQUEST_OK;
-
 		}
 
 		smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4", 611);
@@ -114,7 +113,6 @@ TEST_F(Cname, subdomain2)
 		if (request->domain == "a.s.a.com") {
 			smartdns::MockServer::AddIP(request, request->domain.c_str(), "4.5.6.7", 700);
 			return smartdns::SERVER_REQUEST_OK;
-
 		}
 
 		smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4", 611);
@@ -139,7 +137,6 @@ cache-persist no)""");
 	EXPECT_EQ(client.GetAnswer()[1].GetData(), "4.5.6.7");
 }
 
-
 TEST_F(Cname, loop)
 {
 	smartdns::MockServer server_upstream;
@@ -153,7 +150,6 @@ TEST_F(Cname, loop)
 		if (request->domain == "s.a.com") {
 			smartdns::MockServer::AddIP(request, request->domain.c_str(), "4.5.6.7", 700);
 			return smartdns::SERVER_REQUEST_OK;
-
 		}
 
 		smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4", 611);

+ 7 - 7
test/cases/test-domain-rule.cc

@@ -39,17 +39,17 @@ TEST_F(DomainRule, bogus_nxdomain)
 		if (request->qtype != DNS_T_A) {
 			return smartdns::SERVER_REQUEST_SOA;
 		}
-        if (request->domain == "a.com") {
-            smartdns::MockServer::AddIP(request, request->domain.c_str(), "10.11.12.13", 611);
-            return smartdns::SERVER_REQUEST_OK;
-        }
+		if (request->domain == "a.com") {
+			smartdns::MockServer::AddIP(request, request->domain.c_str(), "10.11.12.13", 611);
+			return smartdns::SERVER_REQUEST_OK;
+		}
 
 		smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4", 611);
 		return smartdns::SERVER_REQUEST_OK;
 	});
 
-    /* this ip will be discard, but is reachable */
-    server.MockPing(PING_TYPE_ICMP, "1.2.3.4", 60, 10);
+	/* this ip will be discard, but is reachable */
+	server.MockPing(PING_TYPE_ICMP, "1.2.3.4", 60, 10);
 
 	server.Start(R"""(bind [::]:60053
 server udp://127.0.0.1:61053 -blacklist-ip
@@ -64,7 +64,7 @@ cache-persist no)""");
 	ASSERT_EQ(client.GetAuthorityNum(), 1);
 	EXPECT_EQ(client.GetStatus(), "NXDOMAIN");
 
-    ASSERT_TRUE(client.Query("b.com", 60053));
+	ASSERT_TRUE(client.Query("b.com", 60053));
 	std::cout << client.GetResult() << std::endl;
 	ASSERT_EQ(client.GetAnswerNum(), 1);
 	EXPECT_EQ(client.GetStatus(), "NOERROR");

+ 8 - 8
test/cases/test-ip-rule.cc

@@ -53,8 +53,8 @@ TEST_F(IPRule, white_list)
 		return smartdns::SERVER_REQUEST_OK;
 	});
 
-    /* this ip will be discard, but is reachable */
-    server.MockPing(PING_TYPE_ICMP, "1.2.3.4", 60, 10);
+	/* this ip will be discard, but is reachable */
+	server.MockPing(PING_TYPE_ICMP, "1.2.3.4", 60, 10);
 
 	server.Start(R"""(bind [::]:60053
 server udp://127.0.0.1:61053 -whitelist-ip
@@ -97,8 +97,8 @@ TEST_F(IPRule, black_list)
 		return smartdns::SERVER_REQUEST_OK;
 	});
 
-    /* this ip will be discard, but is reachable */
-    server.MockPing(PING_TYPE_ICMP, "4.5.6.7", 60, 10);
+	/* this ip will be discard, but is reachable */
+	server.MockPing(PING_TYPE_ICMP, "4.5.6.7", 60, 10);
 
 	server.Start(R"""(bind [::]:60053
 server udp://127.0.0.1:61053 -blacklist-ip
@@ -134,10 +134,10 @@ TEST_F(IPRule, ignore_ip)
 		return smartdns::SERVER_REQUEST_OK;
 	});
 
-    /* this ip will be discard, but is reachable */
-    server.MockPing(PING_TYPE_ICMP, "1.2.3.4", 60, 10);
-    server.MockPing(PING_TYPE_ICMP, "4.5.6.7", 60, 90);
-    server.MockPing(PING_TYPE_ICMP, "7.8.9.10", 60, 40);
+	/* this ip will be discard, but is reachable */
+	server.MockPing(PING_TYPE_ICMP, "1.2.3.4", 60, 10);
+	server.MockPing(PING_TYPE_ICMP, "4.5.6.7", 60, 90);
+	server.MockPing(PING_TYPE_ICMP, "7.8.9.10", 60, 40);
 
 	server.Start(R"""(bind [::]:60053
 server udp://127.0.0.1:61053 -blacklist-ip

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

@@ -42,11 +42,11 @@ TEST_F(Ptr, query)
 			return smartdns::SERVER_REQUEST_OK;
 		}
 
-        if (request->qtype == DNS_T_PTR) {
-            dns_add_PTR(request->response_packet, DNS_RRS_AN, request->domain.c_str(), 30, "my-hostname");
-            request->response_packet->head.rcode = DNS_RC_NOERROR;
-            return smartdns::SERVER_REQUEST_OK;
-        }
+		if (request->qtype == DNS_T_PTR) {
+			dns_add_PTR(request->response_packet, DNS_RRS_AN, request->domain.c_str(), 30, "my-hostname");
+			request->response_packet->head.rcode = DNS_RC_NOERROR;
+			return smartdns::SERVER_REQUEST_OK;
+		}
 
 		return smartdns::SERVER_REQUEST_SOA;
 	});
@@ -127,11 +127,11 @@ TEST_F(Ptr, smartdns)
 			return smartdns::SERVER_REQUEST_OK;
 		}
 
-        if (request->qtype == DNS_T_PTR) {
-            dns_add_PTR(request->response_packet, DNS_RRS_AN, request->domain.c_str(), 30, "my-hostname");
-            request->response_packet->head.rcode = DNS_RC_NOERROR;
-            return smartdns::SERVER_REQUEST_OK;
-        }
+		if (request->qtype == DNS_T_PTR) {
+			dns_add_PTR(request->response_packet, DNS_RRS_AN, request->domain.c_str(), 30, "my-hostname");
+			request->response_packet->head.rcode = DNS_RC_NOERROR;
+			return smartdns::SERVER_REQUEST_OK;
+		}
 
 		return smartdns::SERVER_REQUEST_SOA;
 	});

+ 5 - 5
test/cases/test-server.cc

@@ -44,7 +44,7 @@ TEST_F(Server, all_unreach)
 		return smartdns::SERVER_REQUEST_OK;
 	});
 
-    server.MockPing(PING_TYPE_ICMP, "2001::", 128, 10000);
+	server.MockPing(PING_TYPE_ICMP, "2001::", 128, 10000);
 	server.Start(R"""(bind [::]:60053
 bind-tcp [::]:60053
 server tls://255.255.255.255
@@ -58,11 +58,11 @@ cache-persist no)""");
 	ASSERT_TRUE(client.Query("a.com", 60053));
 	std::cout << client.GetResult() << std::endl;
 	EXPECT_EQ(client.GetStatus(), "SERVFAIL");
-    EXPECT_EQ(client.GetAnswerNum(), 0);
+	EXPECT_EQ(client.GetAnswerNum(), 0);
 
-    /* server should not crash */
-    ASSERT_TRUE(client.Query("a.com +tcp", 60053));
+	/* server should not crash */
+	ASSERT_TRUE(client.Query("a.com +tcp", 60053));
 	std::cout << client.GetResult() << std::endl;
 	EXPECT_EQ(client.GetStatus(), "SERVFAIL");
-    EXPECT_EQ(client.GetAnswerNum(), 0);
+	EXPECT_EQ(client.GetAnswerNum(), 0);
 }

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

@@ -220,7 +220,6 @@ cache-persist no)""");
 	EXPECT_EQ(client.GetAnswer()[0].GetData(), "5.6.7.8");
 }
 
-
 TEST_F(SpeedCheck, tcp_faster_than_ping)
 {
 	smartdns::MockServer server_upstream;