mirror of
https://github.com/apache/nuttx.git
synced 2026-05-31 23:40:19 +08:00
ibs/libc/netdb: Make DNS retries configurable
This commit is contained in:
committed by
Gregory Nutt
parent
c6db972702
commit
5129e4dd60
+13
-7
@@ -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"
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
|||||||
Reference in New Issue
Block a user