From ffc331af21f15a8f0f5b77d21d140c39e09001eb Mon Sep 17 00:00:00 2001 From: Nick Peng Date: Sat, 15 Jul 2023 21:04:27 +0800 Subject: [PATCH] dns-client: fix bootstrap retry failure issue when os startup. --- src/dns_client.c | 27 +++++++++++++++++++-------- src/dns_server.c | 2 +- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/dns_client.c b/src/dns_client.c index ea4dcc2..fb99e68 100644 --- a/src/dns_client.c +++ b/src/dns_client.c @@ -161,7 +161,8 @@ struct dns_server_pending { unsigned int has_v6; unsigned int query_v4; unsigned int query_v6; - unsigned int has_soa; + unsigned int has_soa_v4; + unsigned int has_soa_v6; /* server type */ dns_server_type_t type; @@ -3908,9 +3909,11 @@ static int _dns_client_pending_server_resolve(const struct dns_result *result, v { struct dns_server_pending *pending = user_ptr; int ret = 0; + int has_soa = 0; - if (result->rtcode == DNS_RC_NXDOMAIN || result->ip_num == 0 || result->has_soa == 1) { - pending->has_soa = 1; + if (result->rtcode == DNS_RC_NXDOMAIN || result->has_soa == 1 || result->rtcode == DNS_RC_REFUSED || + (result->rtcode == DNS_RC_NOERROR && result->ip_num == 0)) { + has_soa = 1; } if (result->addr_type == DNS_T_A) { @@ -3918,16 +3921,24 @@ static int _dns_client_pending_server_resolve(const struct dns_result *result, v if (result->rtcode == DNS_RC_NOERROR && result->ip_num > 0) { pending->has_v4 = 1; pending->ping_time_v4 = result->ping_time; - pending->has_soa = 0; + pending->has_soa_v4 = 0; safe_strncpy(pending->ipv4, result->ip, DNS_HOSTNAME_LEN); + } else if (has_soa) { + pending->has_v4 = 0; + pending->ping_time_v4 = -1; + pending->has_soa_v4 = 1; } } else if (result->addr_type == DNS_T_AAAA) { pending->ping_time_v6 = -1; if (result->rtcode == DNS_RC_NOERROR && result->ip_num > 0) { pending->has_v6 = 1; pending->ping_time_v6 = result->ping_time; - pending->has_soa = 0; + pending->has_soa_v6 = 0; safe_strncpy(pending->ipv6, result->ip, DNS_HOSTNAME_LEN); + } else if (has_soa) { + pending->has_v6 = 0; + pending->ping_time_v6 = -1; + pending->has_soa_v6 = 1; } } else { ret = -1; @@ -4066,7 +4077,7 @@ static void _dns_client_add_pending_servers(void) continue; } - if (pending->has_soa && dnsserver_ip == NULL && pending->query_v4 && pending->query_v6) { + if (dnsserver_ip == NULL && pending->has_soa_v4 && pending->has_soa_v6) { tlog(TLOG_WARN, "add pending DNS server %s failed, no such host.", pending->host); _dns_client_server_pending_remove(pending); continue; @@ -4140,10 +4151,10 @@ static void _dns_client_period_run(unsigned int msec) if (atomic_dec_and_test(&query->retry_count) || (query->has_result != 0)) { _dns_client_query_remove(query); if (query->has_result == 0) { - tlog(TLOG_INFO, "retry query %s, type: %d, id: %d failed", query->domain, query->qtype, query->sid); + tlog(TLOG_DEBUG, "retry query %s, type: %d, id: %d failed", query->domain, query->qtype, query->sid); } } else { - tlog(TLOG_INFO, "retry query %s, type: %d, id: %d", query->domain, query->qtype, query->sid); + tlog(TLOG_DEBUG, "retry query %s, type: %d, id: %d", query->domain, query->qtype, query->sid); _dns_client_send_query(query); } _dns_client_query_release(query); diff --git a/src/dns_server.c b/src/dns_server.c index af31d29..41a3210 100644 --- a/src/dns_server.c +++ b/src/dns_server.c @@ -5537,7 +5537,7 @@ int dns_server_query(const char *domain, int qtype, struct dns_server_query_opti _dns_server_request_set_callback(request, callback, user_ptr); ret = _dns_server_do_query(request, 0); if (ret != 0) { - tlog(TLOG_ERROR, "do query %s failed.\n", domain); + tlog(TLOG_DEBUG, "do query %s failed.\n", domain); goto errout; }