diff --git a/features/lwipstack/LWIPStack.cpp b/features/lwipstack/LWIPStack.cpp index e0498e63ab..f239bf0344 100644 --- a/features/lwipstack/LWIPStack.cpp +++ b/features/lwipstack/LWIPStack.cpp @@ -198,6 +198,39 @@ nsapi_error_t LWIP::get_dns_server(int index, SocketAddress *address, const char return NSAPI_ERROR_NO_ADDRESS; } +nsapi_error_t LWIP::add_dns_server(const SocketAddress &address, const char *interface_name) +{ + int index; + nsapi_addr_t addr = address.get_addr(); + const ip_addr_t *ip_addr_move; + ip_addr_t ip_addr; + + convert_mbed_addr_to_lwip(&ip_addr, &addr); + + if (ip_addr_isany(&ip_addr)) { + return NSAPI_ERROR_NO_ADDRESS; + } + + if (interface_name == NULL) { + for (index = DNS_MAX_SERVERS - 1; index > 0; index--) { + ip_addr_move = dns_getserver(index - 1, NULL); + if (!ip_addr_isany(ip_addr_move)) { + dns_setserver(index, ip_addr_move, NULL); + } + } + dns_setserver(0, &ip_addr, NULL); + } else { + for (index = DNS_MAX_SERVERS - 1; index > 0; index--) { + ip_addr_move = dns_get_interface_server(index - 1, interface_name); + if (!ip_addr_isany(ip_addr_move)) { + dns_add_interface_server(index, interface_name, ip_addr_move); + } + } + dns_add_interface_server(0, interface_name, &ip_addr); + } + return NSAPI_ERROR_OK; +} + void LWIP::tcpip_thread_callback(void *ptr) { lwip_callback *cb = static_cast(ptr); diff --git a/features/lwipstack/LWIPStack.h b/features/lwipstack/LWIPStack.h index 07a00c60a3..4f680989f7 100644 --- a/features/lwipstack/LWIPStack.h +++ b/features/lwipstack/LWIPStack.h @@ -272,6 +272,14 @@ public: */ virtual nsapi_error_t get_dns_server(int index, SocketAddress *address, const char *interface_name); + /** Add a domain name server to list of servers to query + * + * @param address Destination for the host address + * @param interface_name Network interface name + * @return NSAPI_ERROR_OK on success, negative error code on failure + */ + virtual nsapi_error_t add_dns_server(const SocketAddress &address, const char *interface_name); + /** Get the local IP address * * @return Null-terminated representation of the local IP address diff --git a/features/lwipstack/lwip/src/core/lwip_dns.c b/features/lwipstack/lwip/src/core/lwip_dns.c index 36936f2bbc..bdbaeb9baa 100644 --- a/features/lwipstack/lwip/src/core/lwip_dns.c +++ b/features/lwipstack/lwip/src/core/lwip_dns.c @@ -487,7 +487,7 @@ dns_get_interface_server(u8_t numdns, const char *interface_name) { struct dns_server_interface *interface_server; - if (numdns < DNS_MAX_SERVERS) { + if (numdns >= DNS_MAX_SERVERS) { return IP_ADDR_ANY; }