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 *