Skip to content

Commit 9ec1ec9

Browse files
author
Mika Leppänen
committed
Fixed DNS resolution in case all sendto operations fail
DNS resolver now counts how many sendto operations are successful during one DNS server attempt cycle (attempting to contact DNS servers from 0 to last index, including stack specific ones). If all socket sendto operations fail, DNS resolution is aborted. If one or more are successful, DNS resolution is continued until total network attempts count is reached or all sendto operations fails during a cycle.
1 parent 80dde0b commit 9ec1ec9

File tree

1 file changed

+14
-5
lines changed

1 file changed

+14
-5
lines changed

features/netsocket/nsapi_dns.cpp

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -80,14 +80,15 @@ struct DNS_QUERY {
8080
uint8_t dns_server;
8181
uint8_t retries;
8282
uint8_t total_attempts;
83+
uint8_t send_success;
8384
uint8_t count;
8485
dns_state state;
8586
};
8687

8788
static void nsapi_dns_cache_add(const char *host, nsapi_addr_t *address, uint32_t ttl);
8889
static nsapi_size_or_error_t nsapi_dns_cache_find(const char *host, nsapi_version_t version, nsapi_addr_t *address);
8990

90-
static nsapi_error_t nsapi_dns_get_server_addr(NetworkStack *stack, uint8_t *index, uint8_t *total_attempts, SocketAddress *dns_addr);
91+
static nsapi_error_t nsapi_dns_get_server_addr(NetworkStack *stack, uint8_t *index, uint8_t *total_attempts, uint8_t *send_success, SocketAddress *dns_addr);
9192

9293
static void nsapi_dns_query_async_create(void *ptr);
9394
static nsapi_error_t nsapi_dns_query_async_delete(int unique_id);
@@ -384,7 +385,7 @@ static nsapi_error_t nsapi_dns_cache_find(const char *host, nsapi_version_t vers
384385
return ret_val;
385386
}
386387

387-
static nsapi_error_t nsapi_dns_get_server_addr(NetworkStack *stack, uint8_t *index, uint8_t *total_attempts, SocketAddress *dns_addr)
388+
static nsapi_error_t nsapi_dns_get_server_addr(NetworkStack *stack, uint8_t *index, uint8_t *total_attempts, uint8_t *send_success, SocketAddress *dns_addr)
388389
{
389390
bool dns_addr_set = false;
390391

@@ -393,8 +394,10 @@ static nsapi_error_t nsapi_dns_get_server_addr(NetworkStack *stack, uint8_t *ind
393394
}
394395

395396
if (*index >= DNS_SERVERS_SIZE + DNS_STACK_SERVERS_NUM) {
396-
if (*total_attempts) {
397+
// If there are total attempts left and send to has been successful at least once on this round
398+
if (*total_attempts && *send_success) {
397399
*index = 0;
400+
*send_success = 0;
398401
} else {
399402
return NSAPI_ERROR_NO_ADDRESS;
400403
}
@@ -453,11 +456,12 @@ static nsapi_size_or_error_t nsapi_dns_query_multiple(NetworkStack *stack, const
453456
uint8_t retries = MBED_CONF_NSAPI_DNS_RETRIES;
454457
uint8_t index = 0;
455458
uint8_t total_attempts = MBED_CONF_NSAPI_DNS_TOTAL_ATTEMPTS;
459+
uint8_t send_success = 0;
456460

457461
// check against each dns server
458462
while (true) {
459463
SocketAddress dns_addr;
460-
err = nsapi_dns_get_server_addr(stack, &index, &total_attempts, &dns_addr);
464+
err = nsapi_dns_get_server_addr(stack, &index, &total_attempts, &send_success, &dns_addr);
461465
if (err != NSAPI_ERROR_OK) {
462466
break;
463467
}
@@ -474,6 +478,8 @@ static nsapi_size_or_error_t nsapi_dns_query_multiple(NetworkStack *stack, const
474478
continue;
475479
}
476480

481+
send_success++;
482+
477483
if (total_attempts) {
478484
total_attempts--;
479485
}
@@ -650,6 +656,7 @@ nsapi_value_or_error_t nsapi_dns_query_multiple_async(NetworkStack *stack, const
650656
query->dns_server = 0;
651657
query->retries = MBED_CONF_NSAPI_DNS_RETRIES + 1;
652658
query->total_attempts = MBED_CONF_NSAPI_DNS_TOTAL_ATTEMPTS;
659+
query->send_success = 0;
653660
query->dns_message_id = 0;
654661
query->socket_timeout = 0;
655662
query->total_timeout = MBED_CONF_NSAPI_DNS_TOTAL_ATTEMPTS * MBED_CONF_NSAPI_DNS_RESPONSE_WAIT_TIME + 500;
@@ -971,7 +978,7 @@ static void nsapi_dns_query_async_send(void *ptr)
971978

972979
while (true) {
973980
SocketAddress dns_addr;
974-
nsapi_size_or_error_t err = nsapi_dns_get_server_addr(query->stack, &(query->dns_server), &(query->total_attempts), &dns_addr);
981+
nsapi_size_or_error_t err = nsapi_dns_get_server_addr(query->stack, &(query->dns_server), &(query->total_attempts), &(query->send_success), &dns_addr);
975982
if (err != NSAPI_ERROR_OK) {
976983
nsapi_dns_query_async_resp(query, NSAPI_ERROR_TIMEOUT, NULL);
977984
free(packet);
@@ -987,6 +994,8 @@ static void nsapi_dns_query_async_send(void *ptr)
987994
}
988995
}
989996

997+
query->send_success++;
998+
990999
if (query->total_attempts) {
9911000
query->total_attempts--;
9921001
}

0 commit comments

Comments
 (0)