From e5c291d3476e368b5dc76bfbcf0bb97b033257b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=20Lepp=C3=A4nen?= Date: Tue, 27 Sep 2016 11:54:54 +0300 Subject: [PATCH] Added version to nsapi get host by name --- .../FEATURE_IPV4/lwip-interface/lwip_stack.c | 29 ++++++++++++++----- features/net/network-socket/NetworkStack.cpp | 14 ++++++++- features/net/network-socket/nsapi_types.h | 10 ++++--- 3 files changed, 41 insertions(+), 12 deletions(-) diff --git a/features/net/FEATURE_IPV4/lwip-interface/lwip_stack.c b/features/net/FEATURE_IPV4/lwip-interface/lwip_stack.c index 83a61b9f5b..2ada01f22c 100644 --- a/features/net/FEATURE_IPV4/lwip-interface/lwip_stack.c +++ b/features/net/FEATURE_IPV4/lwip-interface/lwip_stack.c @@ -525,23 +525,38 @@ static int lwip_err_remap(err_t err) { } /* LWIP network stack implementation */ -static int lwip_gethostbyname(nsapi_stack_t *stack, const char *host, nsapi_addr_t *addr) +static int lwip_gethostbyname(nsapi_stack_t *stack, const char *host, nsapi_addr_t *addr, nsapi_version_t version) { ip_addr_t lwip_addr; #if LWIP_IPV4 && LWIP_IPV6 u8_t addr_type; - const ip_addr_t *ip_addr; - ip_addr = lwip_get_ip_addr(true, &lwip_netif); - if (IP_IS_V6(ip_addr)) { - addr_type = NETCONN_DNS_IPV6; - } else { + if (version == NSAPI_UNSPEC) { + const ip_addr_t *ip_addr; + ip_addr = lwip_get_ip_addr(true, &lwip_netif); + if (IP_IS_V6(ip_addr)) { + addr_type = NETCONN_DNS_IPV6; + } else { + addr_type = NETCONN_DNS_IPV4; + } + } else if (version == NSAPI_IPv4) { addr_type = NETCONN_DNS_IPV4; + } else if (version == NSAPI_IPv6) { + addr_type = NETCONN_DNS_IPV6; } err_t err = netconn_gethostbyname_addrtype(host, &lwip_addr, addr_type); -#else +#elif LWIP_IPV4 + if (version != NSAPI_IPv4 && version != NSAPI_UNSPEC) { + return NSAPI_ERROR_DNS_FAILURE; + } + err_t err = netconn_gethostbyname(host, &lwip_addr); +#elif LWIP_IPV6 + if (version != NSAPI_IPv6 && version != NSAPI_UNSPEC) { + return NSAPI_ERROR_DNS_FAILURE; + } err_t err = netconn_gethostbyname(host, &lwip_addr); #endif + if (err != ERR_OK) { return NSAPI_ERROR_DNS_FAILURE; } diff --git a/features/net/network-socket/NetworkStack.cpp b/features/net/network-socket/NetworkStack.cpp index 009bdbfae3..908cdd38d5 100644 --- a/features/net/network-socket/NetworkStack.cpp +++ b/features/net/network-socket/NetworkStack.cpp @@ -107,7 +107,19 @@ public: } nsapi_addr_t addr = {NSAPI_IPv4, 0}; - int err = _stack_api()->gethostbyname(_stack(), name, &addr); + int err = _stack_api()->gethostbyname(_stack(), name, &addr, NSAPI_UNSPEC); + address->set_addr(addr); + return err; + } + + virtual int gethostbyname(const char *name, SocketAddress *address, nsapi_version_t version) + { + if (!_stack_api()->gethostbyname) { + return NetworkStack::gethostbyname(name, address, version); + } + + nsapi_addr_t addr = {NSAPI_IPv4, 0}; + int err = _stack_api()->gethostbyname(_stack(), name, &addr, version); address->set_addr(addr); return err; } diff --git a/features/net/network-socket/nsapi_types.h b/features/net/network-socket/nsapi_types.h index c1972f0926..4324bae68d 100644 --- a/features/net/network-socket/nsapi_types.h +++ b/features/net/network-socket/nsapi_types.h @@ -85,15 +85,16 @@ typedef enum nsapi_error { * @enum nsapi_version_t */ typedef enum nsapi_version { - NSAPI_IPv4, /*!< Address is IPv4 */ - NSAPI_IPv6, /*!< Address is IPv6 */ + NSAPI_IPv4, /*!< Address is IPv4 */ + NSAPI_IPv6, /*!< Address is IPv6 */ + NSAPI_UNSPEC /*!< Address is unspecified */ } nsapi_version_t; /** IP address structure for passing IP addresses by value */ typedef struct nsapi_addr { /** IP version - * NSAPI_IPv4 or NSAPI_IPv6 + * NSAPI_IPv4 or NSAPI_IPv6 (NSAPI_UNSPEC not currently supported) */ nsapi_version_t version; @@ -197,9 +198,10 @@ typedef struct nsapi_stack_api * @param stack Stack handle * @param addr Destination for the host IP address * @param host Hostname to resolve + * @param version Address family * @return 0 on success, negative error code on failure */ - int (*gethostbyname)(nsapi_stack_t *stack, const char *host, nsapi_addr_t *addr); + int (*gethostbyname)(nsapi_stack_t *stack, const char *host, nsapi_addr_t *addr, nsapi_version_t version); /** Add a domain name server to list of servers to query *