Skip to content

Commit d748b9e

Browse files
committed
dns_server:
Optimize ECS compatibility and fix bootstrapdns resolution problem.
1 parent d248f6d commit d748b9e

File tree

8 files changed

+66
-20
lines changed

8 files changed

+66
-20
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
.vscode
22
*.o
3+
*.a
34
*.pem
45
.DS_Store
56
*.swp.

src/dns_client.c

Lines changed: 39 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1503,11 +1503,27 @@ static int _dns_client_server_pending(char *server_ip, int port, dns_server_type
15031503
return -1;
15041504
}
15051505

1506+
static int _dns_client_resolv_ip_by_host(const char *host, char *ip, int ip_len)
1507+
{
1508+
struct addrinfo *gai = NULL;
1509+
gai = _dns_client_getaddr(host, NULL, SOCK_STREAM, 0);
1510+
if (gai == NULL) {
1511+
return -1;
1512+
}
1513+
1514+
if (get_host_by_addr(ip, ip_len, gai->ai_addr) == NULL) {
1515+
freeaddrinfo(gai);
1516+
return -1;
1517+
}
1518+
1519+
freeaddrinfo(gai);
1520+
return 0;
1521+
}
1522+
15061523
static int _dns_client_add_server_pending(char *server_ip, char *server_host, int port, dns_server_type_t server_type,
15071524
struct client_dns_server_flags *flags, int is_pending)
15081525
{
15091526
int ret = 0;
1510-
struct addrinfo *gai = NULL;
15111527
char server_ip_tmp[DNS_HOSTNAME_LEN] = {0};
15121528

15131529
if (server_type >= DNS_SERVER_TYPE_END) {
@@ -1522,21 +1538,13 @@ static int _dns_client_add_server_pending(char *server_ip, char *server_host, in
15221538
return 0;
15231539
}
15241540
} else if (check_is_ipaddr(server_ip) && is_pending == 0) {
1525-
gai = _dns_client_getaddr(server_ip, NULL, SOCK_STREAM, 0);
1526-
if (gai == NULL) {
1541+
if (_dns_client_resolv_ip_by_host(server_ip, server_ip_tmp, sizeof(server_ip_tmp)) != 0) {
1542+
tlog(TLOG_ERROR, "resolve %s failed.", server_ip);
15271543
return -1;
15281544
}
15291545

1530-
if (get_host_by_addr(server_ip_tmp, sizeof(server_ip_tmp), gai->ai_addr) != NULL) {
1531-
tlog(TLOG_INFO, "resolve %s to %s.", server_ip, server_ip_tmp);
1532-
server_ip = server_ip_tmp;
1533-
} else {
1534-
tlog(TLOG_INFO, "resolve %s failed.", server_ip);
1535-
freeaddrinfo(gai);
1536-
return -1;
1537-
}
1538-
1539-
freeaddrinfo(gai);
1546+
tlog(TLOG_INFO, "resolve %s to %s.", server_ip, server_ip_tmp);
1547+
server_ip = server_ip_tmp;
15401548
}
15411549

15421550
/* add server */
@@ -1545,7 +1553,9 @@ static int _dns_client_add_server_pending(char *server_ip, char *server_host, in
15451553
goto errout;
15461554
}
15471555

1548-
dns_client_has_bootstrap_dns = 1;
1556+
if ((flags->server_flag & SERVER_FLAG_EXCLUDE_DEFAULT) == 0 || dns_conf_exist_bootstrap_dns) {
1557+
dns_client_has_bootstrap_dns = 1;
1558+
}
15491559

15501560
return 0;
15511561
errout:
@@ -3765,15 +3775,15 @@ static int _dns_client_setup_server_packet(struct dns_server_info *server_info,
37653775
dns_set_OPT_option(packet, DNS_OPT_FLAG_DO);
37663776
}
37673777

3768-
if (server_info->type != DNS_SERVER_UDP && server_info->type != DNS_SERVER_MDNS) {
3769-
dns_add_OPT_TCP_KEEPALIVE(packet, 6000);
3778+
if (server_info->flags.tcp_keepalive > 0) {
3779+
dns_add_OPT_TCP_KEEPALIVE(packet, server_info->flags.tcp_keepalive);
37703780
}
37713781

37723782
if ((query->qtype == DNS_T_A && server_info->ecs_ipv4.enable)) {
37733783
dns_add_OPT_ECS(packet, &server_info->ecs_ipv4.ecs);
37743784
} else if ((query->qtype == DNS_T_AAAA && server_info->ecs_ipv6.enable)) {
37753785
dns_add_OPT_ECS(packet, &server_info->ecs_ipv6.ecs);
3776-
} else {
3786+
} else if (query->qtype == DNS_T_AAAA || query->qtype == DNS_T_A || server_info->flags.subnet_all_query_types) {
37773787
if (server_info->ecs_ipv6.enable) {
37783788
dns_add_OPT_ECS(packet, &server_info->ecs_ipv6.ecs);
37793789
} else if (server_info->ecs_ipv4.enable) {
@@ -4339,6 +4349,18 @@ static int _dns_client_add_pendings(struct dns_server_pending *pending, char *ip
43394349
{
43404350
struct dns_server_pending_group *group = NULL;
43414351
struct dns_server_pending_group *tmp = NULL;
4352+
char ip_tmp[DNS_HOSTNAME_LEN] = {0};
4353+
4354+
if (check_is_ipaddr(ip) != 0) {
4355+
if (_dns_client_resolv_ip_by_host(ip, ip_tmp, sizeof(ip_tmp)) != 0) {
4356+
tlog(TLOG_WARN, "resolv %s failed.", ip);
4357+
return -1;
4358+
}
4359+
4360+
tlog(TLOG_INFO, "resolv %s to %s.", ip, ip_tmp);
4361+
4362+
ip = ip_tmp;
4363+
}
43424364

43434365
if (_dns_client_add_server_pending(ip, pending->host, pending->port, pending->type, &pending->flags, 0) != 0) {
43444366
return -1;

src/dns_client.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,9 +141,13 @@ struct client_dns_server_flags {
141141
unsigned int server_flag;
142142
unsigned int result_flag;
143143
long long set_mark;
144+
int tcp_keepalive;
144145
int drop_packet_latency_ms;
146+
145147
char proxyname[DNS_MAX_CNAME_LEN];
146148
char ifname[DNS_SERVER_IFNAME_LEN];
149+
150+
int subnet_all_query_types;
147151
struct client_dns_server_flag_ecs ipv4_ecs;
148152
struct client_dns_server_flag_ecs ipv6_ecs;
149153

src/dns_conf.c

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ struct dns_servers dns_conf_servers[DNS_MAX_SERVERS];
9292
char dns_conf_server_name[DNS_MAX_SERVER_NAME_LEN];
9393
int dns_conf_server_num;
9494
static int dns_conf_resolv_hostname = 1;
95-
static char dns_conf_exist_bootstrap_dns;
95+
char dns_conf_exist_bootstrap_dns;
9696

9797
int dns_conf_has_icmp_check;
9898
int dns_conf_has_tcp_check;
@@ -909,6 +909,7 @@ static int _config_server(int argc, char *argv[], dns_server_type_t type, int de
909909
unsigned int server_flag = 0;
910910
unsigned char *spki = NULL;
911911
int drop_packet_latency_ms = 0;
912+
int tcp_keepalive = -1;
912913
int is_bootstrap_dns = 0;
913914
char host_ip[DNS_MAX_IPLEN] = {0};
914915
int no_tls_host_name = 0;
@@ -939,6 +940,8 @@ static int _config_server(int argc, char *argv[], dns_server_type_t type, int de
939940
{"host-name", required_argument, NULL, 260}, /* host name */
940941
{"http-host", required_argument, NULL, 261}, /* http host */
941942
{"tls-host-verify", required_argument, NULL, 262 }, /* verify tls hostname */
943+
{"tcp-keepalive", required_argument, NULL, 263}, /* tcp keepalive */
944+
{"subnet-all-query-types", no_argument, NULL, 264}, /* send subnent for all query types.*/
942945
{NULL, no_argument, NULL, 0}
943946
};
944947
/* clang-format on */
@@ -962,6 +965,8 @@ static int _config_server(int argc, char *argv[], dns_server_type_t type, int de
962965
server->proxyname[0] = '\0';
963966
server->set_mark = -1;
964967
server->drop_packet_latency_ms = drop_packet_latency_ms;
968+
server->tcp_keepalive = tcp_keepalive;
969+
server->subnet_all_query_types = 0;
965970

966971
if (parse_uri(ip, scheme, server->server, &port, server->path) != 0) {
967972
return -1;
@@ -1100,6 +1105,14 @@ static int _config_server(int argc, char *argv[], dns_server_type_t type, int de
11001105
}
11011106
break;
11021107
}
1108+
case 263: {
1109+
server->tcp_keepalive = atoi(optarg);
1110+
break;
1111+
}
1112+
case 264: {
1113+
server->subnet_all_query_types = 1;
1114+
break;
1115+
}
11031116
default:
11041117
if (optind > optind_last) {
11051118
tlog(TLOG_WARN, "unknown server option: %s at '%s:%d'.", argv[optind - 1], conf_get_conf_file(),

src/dns_conf.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,8 @@ struct dns_servers {
386386
dns_server_type_t type;
387387
long long set_mark;
388388
unsigned int drop_packet_latency_ms;
389+
int tcp_keepalive;
390+
int subnet_all_query_types;
389391
char skip_check_cert;
390392
char spki[DNS_MAX_SPKI_LEN];
391393
char hostname[DNS_MAX_CNAME_LEN];
@@ -674,6 +676,8 @@ extern ssize_t dns_conf_cache_max_memsize;
674676
extern struct dns_servers dns_conf_servers[DNS_MAX_SERVERS];
675677
extern int dns_conf_server_num;
676678

679+
extern char dns_conf_exist_bootstrap_dns;
680+
677681
/* proxy servers */
678682
extern struct dns_proxy_servers dns_conf_proxy_servers[PROXY_MAX_SERVERS];
679683
extern int dns_conf_proxy_server_num;

src/smartdns.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,8 @@ static int _smartdns_prepare_server_flags(struct client_dns_server_flags *flags,
232232
flags->result_flag = server->result_flag;
233233
flags->set_mark = server->set_mark;
234234
flags->drop_packet_latency_ms = server->drop_packet_latency_ms;
235+
flags->tcp_keepalive = server->tcp_keepalive;
236+
flags->subnet_all_query_types = server->subnet_all_query_types;
235237
safe_strncpy(flags->proxyname, server->proxyname, sizeof(flags->proxyname));
236238
safe_strncpy(flags->ifname, server->ifname, sizeof(flags->ifname));
237239
if (server->ipv4_ecs.enable) {

test/cases/test-bootstrap.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ TEST_F(BootStrap, bootstrap)
5555

5656
server.Start(R"""(bind [::]:60053
5757
server udp://127.0.0.1:62053 -bootstrap-dns
58-
server udp://example.com:61053
58+
server udp://example.com:61053 -group test
5959
)""");
6060
smartdns::Client client;
6161
usleep(2500000);

test/cases/test-subnet.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ TEST_F(SubNet, v4_server_subnet_txt)
289289
});
290290

291291
server.Start(R"""(bind [::]:60053
292-
server 127.0.0.1:61053 -subnet 8.8.8.8/24
292+
server 127.0.0.1:61053 -subnet 8.8.8.8/24 -subnet-all-query-types
293293
dualstack-ip-selection no
294294
rr-ttl-min 0
295295
)""");

0 commit comments

Comments
 (0)