This completes all interface level support for IPv6 DNS. Still some missing logic at the lowest protocol levels
This commit is contained in:
parent
504d6c42b9
commit
835878b003
@ -54,19 +54,6 @@
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
/* If both IPv4 and IPv6 are enabled, the DNS client can support only one or
|
||||
* the other.
|
||||
*/
|
||||
|
||||
#if !defined(CONFIG_NETDB_DNSCLIENT_IPv4) && \
|
||||
!defined(CONFIG_NETDB_DNSCLIENT_IPv6)
|
||||
# ifdef CONFIG_NET_IPv6
|
||||
# define CONFIG_NETDB_DNSCLIENT_IPv6 1
|
||||
# else
|
||||
# define CONFIG_NETDB_DNSCLIENT_IPv4 1
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#define DNS_FLAG1_RESPONSE 0x80
|
||||
#define DNS_FLAG1_OPCODE_STATUS 0x10
|
||||
#define DNS_FLAG1_OPCODE_INVERSE 0x08
|
||||
@ -108,7 +95,7 @@ struct dns_answer_s
|
||||
uint16_t class;
|
||||
uint16_t ttl[2];
|
||||
uint16_t len;
|
||||
#ifdef CONFIG_NETDB_DNSCLIENT_IPv6
|
||||
#if 0 /* REVISIT: Not yet support for IPv6 */
|
||||
struct in6_addr ipaddr;
|
||||
#else
|
||||
struct in_addr ipaddr;
|
||||
|
16
libc/Kconfig
16
libc/Kconfig
@ -544,21 +544,6 @@ config NETDB_DNSCLIENT
|
||||
|
||||
if NETDB_DNSCLIENT
|
||||
|
||||
choice
|
||||
prompt "Internet Protocol"
|
||||
default NETDB_DNSCLIENT_IPv4 if NET_IPv4
|
||||
default NETDB_DNSCLIENT_IPv6 if NET_IPv6 && !NET_IPv4
|
||||
|
||||
config NETDB_DNSCLIENT_IPv4
|
||||
bool "IPv4"
|
||||
depends on NET_IPv4
|
||||
|
||||
config NETDB_DNSCLIENT_IPv6
|
||||
bool "IPv6"
|
||||
depends on NET_IPv6
|
||||
|
||||
endchoice # Internet Protocol
|
||||
|
||||
config NETDB_DNSCLIENT_ENTRIES
|
||||
int "Number of DNS resolver entries"
|
||||
default 8
|
||||
@ -575,7 +560,6 @@ config NETDB_DNSCLIENT_MAXRESPONSE
|
||||
|
||||
endif # NETDB_DNSCLIENT
|
||||
|
||||
|
||||
comment "Non-standard Library Support"
|
||||
|
||||
if BUILD_PROTECTED || BUILD_KERNEL
|
||||
|
@ -45,6 +45,7 @@
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
|
||||
#include <nuttx/net/netconfig.h>
|
||||
@ -65,21 +66,6 @@
|
||||
# define CONFIG_NETDB_DNSCLIENT_MAXRESPONSE 96
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Public Types
|
||||
****************************************************************************/
|
||||
|
||||
union dns_server_u
|
||||
{
|
||||
struct sockaddr addr;
|
||||
#ifdef CONFIG_NET_IPv4
|
||||
struct sockaddr_in ipv4;
|
||||
#endif
|
||||
#ifdef CONFIG_NET_IPv6
|
||||
struct sockaddr_in6 ipv6;
|
||||
#endif
|
||||
};
|
||||
|
||||
/****************************************************************************
|
||||
* Public Function Prototypes
|
||||
****************************************************************************/
|
||||
@ -115,7 +101,7 @@ int dns_bind(void);
|
||||
* Name: dns_query
|
||||
*
|
||||
* Description:
|
||||
* Using the DNS resolver socket (sockfd), look up the the 'hostname', and
|
||||
* Using the DNS resolver socket (sd), look up the the 'hostname', and
|
||||
* return its IP address in 'ipaddr'
|
||||
*
|
||||
* Returned Value:
|
||||
@ -123,7 +109,8 @@ int dns_bind(void);
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int dns_query(int sockfd, FAR const char *hostname, FAR in_addr_t *ipaddr);
|
||||
int dns_query(int sd, FAR const char *hostname, FAR struct sockaddr *addr,
|
||||
FAR socklen_t *addrlen);
|
||||
|
||||
#undef EXTERN
|
||||
#if defined(__cplusplus)
|
||||
|
@ -75,6 +75,21 @@
|
||||
#define SEND_BUFFER_SIZE 64
|
||||
#define RECV_BUFFER_SIZE CONFIG_NETDB_DNSCLIENT_MAXRESPONSE
|
||||
|
||||
/****************************************************************************
|
||||
* Private Types
|
||||
****************************************************************************/
|
||||
|
||||
union dns_server_u
|
||||
{
|
||||
struct sockaddr addr;
|
||||
#ifdef CONFIG_NET_IPv4
|
||||
struct sockaddr_in ipv4;
|
||||
#endif
|
||||
#ifdef CONFIG_NET_IPv6
|
||||
struct sockaddr_in6 ipv6;
|
||||
#endif
|
||||
};
|
||||
|
||||
/****************************************************************************
|
||||
* Private Data
|
||||
****************************************************************************/
|
||||
@ -205,11 +220,8 @@ static int dns_send_query(int sd, FAR const char *name,
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_NETDB_DNSCLIENT_IPv6
|
||||
# error "Not implemented"
|
||||
#else
|
||||
static int dns_recv_response(int sd, FAR struct sockaddr_in *addr)
|
||||
#endif
|
||||
static int dns_recv_response(int sd, FAR struct sockaddr *addr,
|
||||
FAR socklen_t *addrlen)
|
||||
{
|
||||
FAR unsigned char *nameptr;
|
||||
char buffer[RECV_BUFFER_SIZE];
|
||||
@ -314,6 +326,11 @@ static int dns_recv_response(int sd, FAR struct sockaddr_in *addr)
|
||||
|
||||
/* Check for IP address type and Internet class. Others are discarded. */
|
||||
|
||||
#ifdef CONFIG_NET_IPv6
|
||||
# warning Missing IPv6 support!
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NET_IPv4
|
||||
if (ans->type == HTONS(1) &&
|
||||
ans->class == HTONS(1) &&
|
||||
ans->len == HTONS(4))
|
||||
@ -330,10 +347,25 @@ static int dns_recv_response(int sd, FAR struct sockaddr_in *addr)
|
||||
* we want.
|
||||
*/
|
||||
|
||||
addr->sin_addr.s_addr = ans->ipaddr.s_addr;
|
||||
return OK;
|
||||
if (*addrlen >=sizeof(struct sockaddr_in))
|
||||
{
|
||||
FAR struct sockaddr_in *inaddr;
|
||||
|
||||
inaddr = (FAR struct sockaddr_in *)addr;
|
||||
inaddr->sin_family = AF_INET;
|
||||
inaddr->sin_port = 0;
|
||||
inaddr->sin_addr.s_addr = ans->ipaddr.s_addr;
|
||||
|
||||
*addrlen = sizeof(struct sockaddr_in);
|
||||
return OK;
|
||||
}
|
||||
else
|
||||
{
|
||||
return -ERANGE;
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
nameptr = nameptr + 10 + htons(ans->len);
|
||||
}
|
||||
@ -408,13 +440,9 @@ int dns_bind(void)
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int dns_query(int sd, FAR const char *hostname, FAR in_addr_t *ipaddr)
|
||||
int dns_query(int sd, FAR const char *hostname, FAR struct sockaddr *addr,
|
||||
FAR socklen_t *addrlen)
|
||||
{
|
||||
#ifdef CONFIG_NETDB_DNSCLIENT_IPv6
|
||||
struct sockaddr_in6 addr;
|
||||
#else
|
||||
struct sockaddr_in addr;
|
||||
#endif
|
||||
int retries;
|
||||
int ret;
|
||||
|
||||
@ -433,13 +461,12 @@ int dns_query(int sd, FAR const char *hostname, FAR in_addr_t *ipaddr)
|
||||
|
||||
/* Obtain the response */
|
||||
|
||||
ret = dns_recv_response(sd, &addr);
|
||||
ret = dns_recv_response(sd, addr, addrlen);
|
||||
if (ret >= 0)
|
||||
{
|
||||
/* Response received successfully */
|
||||
/* Save the host address -- Needs fixed for IPv6 */
|
||||
|
||||
*ipaddr = addr.sin_addr.s_addr;
|
||||
return OK;
|
||||
}
|
||||
|
||||
|
@ -46,6 +46,7 @@
|
||||
#include <string.h>
|
||||
#include <netdb.h>
|
||||
#include <errno.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include <arpa/inet.h>
|
||||
|
||||
@ -203,11 +204,8 @@ static int lib_numeric_address(FAR const char *name, FAR struct hostent *host,
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_NETDB_DNSCLIENT_IPv6
|
||||
static int lib_dns_query(FAR const char *hostname, FAR struct in6_addr *ipaddr)
|
||||
#else
|
||||
static int lib_dns_query(FAR const char *hostname, FAR in_addr_t *ipaddr)
|
||||
#endif
|
||||
static int lib_dns_query(FAR const char *hostname,
|
||||
FAR struct sockaddr *addr, socklen_t *addrlen)
|
||||
{
|
||||
int sd;
|
||||
int ret;
|
||||
@ -222,7 +220,7 @@ static int lib_dns_query(FAR const char *hostname, FAR in_addr_t *ipaddr)
|
||||
|
||||
/* Perform the query to get the IP address */
|
||||
|
||||
ret = dns_query(sd, hostname, ipaddr);
|
||||
ret = dns_query(sd, hostname, addr, addrlen);
|
||||
|
||||
/* Release the socket */
|
||||
|
||||
@ -236,7 +234,7 @@ static int lib_dns_query(FAR const char *hostname, FAR in_addr_t *ipaddr)
|
||||
* Description:
|
||||
* Try to look-up the host name from the DNS server
|
||||
*
|
||||
* Input paramters:
|
||||
* Input Parameters:
|
||||
* name - The name of the host to find.
|
||||
* host - Caller provided location to return the host data.
|
||||
* buf - Caller provided buffer to hold string data associated with the
|
||||
@ -279,20 +277,37 @@ static int lib_dns_lookup(FAR const char *name, FAR struct hostent *host,
|
||||
|
||||
/* Try to get the host address using the DNS name server */
|
||||
|
||||
#ifdef CONFIG_NETDB_DNSCLIENT_IPv6
|
||||
addrlen = sizeof(struct in6_addr);
|
||||
addrtype = AF_INET6;
|
||||
ret = lib_dns_query(name, (FAR struct in6_addr *)ptr);
|
||||
#else
|
||||
addrlen = sizeof(struct in6_addr);
|
||||
addrtype = AF_INET;
|
||||
ret = lib_dns_query(name, (FAR in_addr_t *)ptr);
|
||||
#endif
|
||||
addrlen = buflen;
|
||||
ret = lib_dns_query(name, (FAR struct sockaddr *)ptr, &addrlen);
|
||||
|
||||
/* Was the DNS lookup successful? */
|
||||
|
||||
if (ret >= 0)
|
||||
{
|
||||
/* Get the address type; verify the address size. */
|
||||
|
||||
#ifdef CONFIG_NET_IPv4
|
||||
#ifdef CONFIG_NET_IPv6
|
||||
if (((FAR struct sockaddr_in *)ptr)->sin_family == AF_INET)
|
||||
#endif
|
||||
{
|
||||
DEBUGASSERT(addrlen == sizeof(struct sockaddr_in));
|
||||
addrlen = sizeof(struct sockaddr_in);
|
||||
addrtype = AF_INET;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NET_IPv6
|
||||
#ifdef CONFIG_NET_IPv4
|
||||
else
|
||||
#endif
|
||||
{
|
||||
DEBUGASSERT(addrlen == sizeof(struct sockaddr_in6));
|
||||
addrlen = sizeof(struct sockaddr_in6);
|
||||
addrtype = AF_INET6;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Yes.. Return the address that we obtained from the DNS name server. */
|
||||
|
||||
info->hi_addrlist[0] = ptr;
|
||||
|
Loading…
Reference in New Issue
Block a user