diff --git a/src/dns_cache.c b/src/dns_cache.c index 06a8d66..5b54996 100644 --- a/src/dns_cache.c +++ b/src/dns_cache.c @@ -329,7 +329,7 @@ static void _dns_cache_remove_by_domain(struct dns_cache_key *cache_key) continue; } - if (strncmp(dns_cache->info.dns_group_name, cache_key->dns_group_name, DNS_MAX_CNAME_LEN) != 0) { + if (strncmp(dns_cache->info.dns_group_name, cache_key->dns_group_name, DNS_GROUP_NAME_LEN) != 0) { continue; } diff --git a/src/dns_client.c b/src/dns_client.c index a441316..83812af 100644 --- a/src/dns_client.c +++ b/src/dns_client.c @@ -97,6 +97,7 @@ struct dns_server_info { /* server type */ dns_server_type_t type; long long so_mark; + int drop_packet_latency_ms; /* client socket */ int fd; @@ -118,6 +119,7 @@ struct dns_server_info { time_t last_send; time_t last_recv; + unsigned long send_tick; int prohibit; /* server addr info */ @@ -1056,6 +1058,7 @@ static int _dns_client_server_add(char *server_ip, char *server_host, int port, server_info->skip_check_cert = skip_check_cert; server_info->prohibit = 0; server_info->so_mark = flags->set_mark; + server_info->drop_packet_latency_ms = flags->drop_packet_latency_ms; safe_strncpy(server_info->proxy_name, flags->proxyname, sizeof(server_info->proxy_name)); pthread_mutex_init(&server_info->lock, NULL); memcpy(&server_info->flags, flags, sizeof(server_info->flags)); @@ -2261,6 +2264,11 @@ static int _dns_client_process_udp(struct dns_server_info *server_info, struct e /* 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) { + return 0; + } + /* processing dns packet */ if (_dns_client_recv(server_info, inpacket, len, (struct sockaddr *)&from, from_len) != 0) { return -1; @@ -3326,6 +3334,7 @@ static int _dns_client_send_packet(struct dns_query_struct *query, void *packet, continue; } time(&server_info->last_send); + server_info->send_tick = get_tick_count(); } pthread_mutex_unlock(&client.server_list_lock); diff --git a/src/dns_client.h b/src/dns_client.h index 2b6adf1..cbdad7c 100644 --- a/src/dns_client.h +++ b/src/dns_client.h @@ -113,6 +113,7 @@ struct client_dns_server_flags { unsigned int server_flag; unsigned int result_flag; long long set_mark; + int drop_packet_latency_ms; char proxyname[DNS_MAX_CNAME_LEN]; union { struct client_dns_server_flag_udp udp; diff --git a/src/dns_conf.c b/src/dns_conf.c index 8a5b647..af4e823 100644 --- a/src/dns_conf.c +++ b/src/dns_conf.c @@ -462,6 +462,7 @@ static int _config_server(int argc, char *argv[], dns_server_type_t type, int de unsigned int result_flag = 0; unsigned int server_flag = 0; unsigned char *spki = NULL; + int drop_packet_latency_ms = 0; int ttl = 0; /* clang-format off */ @@ -472,6 +473,7 @@ static int _config_server(int argc, char *argv[], dns_server_type_t type, int de /* experimental feature */ {"check-edns", no_argument, NULL, 'e'}, /* check edns */ #endif + {"drop-packet-latency", required_argument, NULL, 'D'}, {"spki-pin", required_argument, NULL, 'p'}, /* check SPKI pin */ {"host-name", required_argument, NULL, 'h'}, /* host name */ {"http-host", required_argument, NULL, 'H'}, /* http host */ @@ -503,6 +505,7 @@ static int _config_server(int argc, char *argv[], dns_server_type_t type, int de server->tls_host_verify[0] = '\0'; server->proxyname[0] = '\0'; server->set_mark = -1; + server->drop_packet_latency_ms = drop_packet_latency_ms; if (parse_uri(ip, scheme, server->server, &port, server->path) != 0) { return -1; @@ -572,6 +575,10 @@ static int _config_server(int argc, char *argv[], dns_server_type_t type, int de safe_strncpy(server->httphost, optarg, DNS_MAX_CNAME_LEN); break; } + case 'D': { + drop_packet_latency_ms = atoi(optarg); + break; + } case 'E': { server_flag |= SERVER_FLAG_EXCLUDE_DEFAULT; break; @@ -618,6 +625,7 @@ static int _config_server(int argc, char *argv[], dns_server_type_t type, int de server->result_flag = result_flag; server->server_flag = server_flag; server->ttl = ttl; + server->drop_packet_latency_ms = drop_packet_latency_ms; dns_conf_server_num++; tlog(TLOG_DEBUG, "add server %s, flag: %X, ttl: %d", ip, result_flag, ttl); diff --git a/src/dns_conf.h b/src/dns_conf.h index 586b60e..aefd83c 100644 --- a/src/dns_conf.h +++ b/src/dns_conf.h @@ -282,6 +282,7 @@ struct dns_servers { int ttl; dns_server_type_t type; long long set_mark; + unsigned int drop_packet_latency_ms; char skip_check_cert; char spki[DNS_MAX_SPKI_LEN]; char hostname[DNS_MAX_CNAME_LEN]; diff --git a/src/smartdns.c b/src/smartdns.c index 50fd995..d7c18f9 100644 --- a/src/smartdns.c +++ b/src/smartdns.c @@ -269,6 +269,7 @@ static int _smartdns_add_servers(void) flags.server_flag = dns_conf_servers[i].server_flag; flags.result_flag = dns_conf_servers[i].result_flag; flags.set_mark = dns_conf_servers[i].set_mark; + flags.drop_packet_latency_ms = dns_conf_servers[i].drop_packet_latency_ms; safe_strncpy(flags.proxyname, dns_conf_servers[i].proxyname, sizeof(flags.proxyname)); ret = dns_client_add_server(dns_conf_servers[i].server, dns_conf_servers[i].port, dns_conf_servers[i].type, &flags);