ibs/libc/netdb: Make DNS retries configurable

This commit is contained in:
Juha Niskanen
2018-11-14 06:30:49 -06:00
committed by Gregory Nutt
parent c6db972702
commit 5129e4dd60
3 changed files with 30 additions and 26 deletions
+13 -7
View File
@@ -54,13 +54,6 @@ menuconfig NETDB_DNSCLIENT
if NETDB_DNSCLIENT if NETDB_DNSCLIENT
config NETDB_DNSCLIENT_RECV_TIMEOUT
int "DNS receive tiemout"
default 30
---help---
This the timeout value when DNS receive response after
dns_send_query, unit: seconds
config NETDB_DNSCLIENT_ENTRIES config NETDB_DNSCLIENT_ENTRIES
int "Number of DNS resolver entries" int "Number of DNS resolver entries"
default 0 if DEFAULT_SMALL default 0 if DEFAULT_SMALL
@@ -109,6 +102,19 @@ config NETDB_DNSCLIENT_MAXRESPONSE
can be received by the DNS resolver. The default is 96 but may can be received by the DNS resolver. The default is 96 but may
need to be larger on enterprise networks (perhaps 176). need to be larger on enterprise networks (perhaps 176).
config NETDB_DNSCLIENT_RECV_TIMEOUT
int "DNS receive timeout"
default 30
---help---
This is the timeout value when DNS receives response after
dns_send_query, unit: seconds
config NETDB_DNSCLIENT_RETRIES
int "Number of retries for DNS request"
default 3
---help---
This setting determines how many times resolver retries request
until failing.
config NETDB_RESOLVCONF config NETDB_RESOLVCONF
bool "DNS resolver file support" bool "DNS resolver file support"
+15 -19
View File
@@ -63,10 +63,6 @@
* Pre-processor Definitions * Pre-processor Definitions
****************************************************************************/ ****************************************************************************/
/* The maximum number of retries when asking for a name */
#define MAX_RETRIES 8
/* Buffer sizes /* Buffer sizes
* *
* The SEND_BUFFER_SIZE depends the configured DNS name size, * The SEND_BUFFER_SIZE depends the configured DNS name size,
@@ -172,7 +168,7 @@ static FAR uint8_t *dns_parse_name(FAR uint8_t *query, FAR uint8_t *queryend)
static int dns_send_query(int sd, FAR const char *name, static int dns_send_query(int sd, FAR const char *name,
FAR union dns_server_u *uaddr, uint16_t rectype) FAR union dns_server_u *uaddr, uint16_t rectype)
{ {
register FAR struct dns_header_s *hdr; FAR struct dns_header_s *hdr;
FAR uint8_t *dest; FAR uint8_t *dest;
FAR uint8_t *nptr; FAR uint8_t *nptr;
FAR const char *src; FAR const char *src;
@@ -192,11 +188,11 @@ static int dns_send_query(int sd, FAR const char *name,
/* Initialize the request header */ /* Initialize the request header */
hdr = (FAR struct dns_header_s *)buffer; hdr = (FAR struct dns_header_s *)buffer;
memset(hdr, 0, sizeof(struct dns_header_s)); memset(hdr, 0, sizeof(*hdr));
hdr->id = htons(seqno); hdr->id = htons(seqno);
hdr->flags1 = DNS_FLAG1_RD; hdr->flags1 = DNS_FLAG1_RD;
hdr->numquestions = HTONS(1); hdr->numquestions = HTONS(1);
dest = buffer + 12; dest = buffer + sizeof(*hdr);
/* Convert hostname into suitable query format. */ /* Convert hostname into suitable query format. */
@@ -294,7 +290,7 @@ static int dns_recv_response(int sd, FAR struct sockaddr *addr,
return errcode; return errcode;
} }
if (ret < 12) if (ret < sizeof(*hdr))
{ {
/* DNS header can't fit in received data */ /* DNS header can't fit in received data */
@@ -491,7 +487,7 @@ static int dns_query_callback(FAR void *arg, FAR struct sockaddr *addr,
/* Loop while receive timeout errors occur and there are remaining retries */ /* Loop while receive timeout errors occur and there are remaining retries */
for (retries = 0; retries < 3; retries++) for (retries = 0; retries < CONFIG_NETDB_DNSCLIENT_RETRIES; retries++)
{ {
#ifdef CONFIG_NET_IPv4 #ifdef CONFIG_NET_IPv4
/* Is this an IPv4 address? */ /* Is this an IPv4 address? */
@@ -503,7 +499,7 @@ static int dns_query_callback(FAR void *arg, FAR struct sockaddr *addr,
if (addrlen < sizeof(struct sockaddr_in)) if (addrlen < sizeof(struct sockaddr_in))
{ {
/* Return zero to skip this address and try the next /* Return zero to skip this address and try the next
* namserver address in resolv.conf. * nameserver address in resolv.conf.
*/ */
nerr("ERROR: Invalid IPv4 address size: %d\n", addrlen); nerr("ERROR: Invalid IPv4 address size: %d\n", addrlen);
@@ -519,7 +515,7 @@ static int dns_query_callback(FAR void *arg, FAR struct sockaddr *addr,
if (ret < 0) if (ret < 0)
{ {
/* Return zero to skip this address and try the next /* Return zero to skip this address and try the next
* namserver address in resolv.conf. * nameserver address in resolv.conf.
*/ */
nerr("ERROR: IPv4 dns_send_query failed: %d\n", ret); nerr("ERROR: IPv4 dns_send_query failed: %d\n", ret);
@@ -563,7 +559,7 @@ static int dns_query_callback(FAR void *arg, FAR struct sockaddr *addr,
else if (ret != -EAGAIN) else if (ret != -EAGAIN)
{ {
/* Some failure other than receive timeout occurred. Return /* Some failure other than receive timeout occurred. Return
* zero to skip this address and try the next namserver * zero to skip this address and try the next nameserver
* address in resolv.conf. * address in resolv.conf.
*/ */
@@ -575,7 +571,7 @@ static int dns_query_callback(FAR void *arg, FAR struct sockaddr *addr,
#endif /* CONFIG_NET_IPv4 */ #endif /* CONFIG_NET_IPv4 */
#ifdef CONFIG_NET_IPv6 #ifdef CONFIG_NET_IPv6
/* Is this an IPv4 address? */ /* Is this an IPv6 address? */
if (query->addr->sa_family == AF_INET6) if (query->addr->sa_family == AF_INET6)
{ {
@@ -584,7 +580,7 @@ static int dns_query_callback(FAR void *arg, FAR struct sockaddr *addr,
if (addrlen < sizeof(struct sockaddr_in6)) if (addrlen < sizeof(struct sockaddr_in6))
{ {
/* Return zero to skip this address and try the next /* Return zero to skip this address and try the next
* namserver address in resolv.conf. * nameserver address in resolv.conf.
*/ */
nerr("ERROR: Invalid IPv6 address size: %d\n", addrlen); nerr("ERROR: Invalid IPv6 address size: %d\n", addrlen);
@@ -600,7 +596,7 @@ static int dns_query_callback(FAR void *arg, FAR struct sockaddr *addr,
if (ret < 0) if (ret < 0)
{ {
/* Return zero to skip this address and try the next /* Return zero to skip this address and try the next
* namserver address in resolv.conf. * nameserver address in resolv.conf.
*/ */
nerr("ERROR: IPv6 dns_send_query failed: %d\n", ret); nerr("ERROR: IPv6 dns_send_query failed: %d\n", ret);
@@ -644,7 +640,7 @@ static int dns_query_callback(FAR void *arg, FAR struct sockaddr *addr,
else if (ret != -EAGAIN) else if (ret != -EAGAIN)
{ {
/* Some failure other than receive timeout occurred. Return /* Some failure other than receive timeout occurred. Return
* zero to skip this address and try the next namserver * zero to skip this address and try the next nameserver
* address in resolv.conf. * address in resolv.conf.
*/ */
@@ -663,9 +659,9 @@ static int dns_query_callback(FAR void *arg, FAR struct sockaddr *addr,
} }
} }
/* We tried three times and could not communicate with this nameserver. /* We tried and could not communicate with this nameserver. Perhaps it
* Perhaps it is down? Return zero to continue with the next address * is down? Return zero to continue with the next address in the
* in the resolv.conf file. * resolv.conf file.
*/ */
query->result = -ETIMEDOUT; query->result = -ETIMEDOUT;
+2
View File
@@ -352,6 +352,7 @@ static int lib_localhost(FAR const char *name, FAR struct hostent *host,
****************************************************************************/ ****************************************************************************/
#ifdef CONFIG_NETDB_DNSCLIENT #ifdef CONFIG_NETDB_DNSCLIENT
#if CONFIG_NETDB_DNSCLIENT_ENTRIES > 0
static int lib_find_answer(FAR const char *name, FAR struct hostent *host, static int lib_find_answer(FAR const char *name, FAR struct hostent *host,
FAR char *buf, size_t buflen) FAR char *buf, size_t buflen)
{ {
@@ -443,6 +444,7 @@ static int lib_find_answer(FAR const char *name, FAR struct hostent *host,
host->h_name = ptr; host->h_name = ptr;
return OK; return OK;
} }
#endif
#endif /* CONFIG_NETDB_DNSCLIENT */ #endif /* CONFIG_NETDB_DNSCLIENT */
/**************************************************************************** /****************************************************************************