diff --git a/contrib/examples/example_app/lwipopts.h b/contrib/examples/example_app/lwipopts.h index b6667ec9..1c2837ab 100644 --- a/contrib/examples/example_app/lwipopts.h +++ b/contrib/examples/example_app/lwipopts.h @@ -325,5 +325,8 @@ void lwip_example_app_platform_assert(const char *msg, int line, const char *fil /* ESP options */ #define ESP_LWIP LWIP_NETCONN_FULLDUPLEX +#define ESP_LWIP_IGMP_TIMERS_ONDEMAND ESP_LWIP +#define ESP_LWIP_MLD6_TIMERS_ONDEMAND ESP_LWIP +#define ESP_DNS ESP_LWIP #endif /* LWIP_LWIPOPTS_H */ diff --git a/src/core/dns.c b/src/core/dns.c index 6540f143..86ab8bb0 100644 --- a/src/core/dns.c +++ b/src/core/dns.c @@ -96,6 +96,9 @@ #include "lwip/prot/dns.h" #include +#if ESP_DNS +#include +#endif /** Random generator function to create random TXIDs and source ports for queries */ #ifndef DNS_RAND_TXID @@ -314,12 +317,25 @@ const ip_addr_t dns_mquery_v6group = DNS_MQUERY_IPV6_GROUP_INIT; void dns_init(void) { +#if ESP_DNS +#ifdef FALLBACK_DNS_SERVER_ADDRESS + /* initialize fallback dns DNS server address */ + ip_addr_t dnsserver; + FALLBACK_DNS_SERVER_ADDRESS(&dnsserver); + dnsserver.type = IPADDR_TYPE_V4; + dns_setserver(DNS_FALLBACK_SERVER_INDEX, &dnsserver); +#endif /* FALLBACK_DNS_SERVER_ADDRESS */ + +#else + + #ifdef DNS_SERVER_ADDRESS /* initialize default DNS server address */ ip_addr_t dnsserver; DNS_SERVER_ADDRESS(&dnsserver); dns_setserver(0, &dnsserver); #endif /* DNS_SERVER_ADDRESS */ +#endif LWIP_ASSERT("sanity check SIZEOF_DNS_QUERY", sizeof(struct dns_query) == SIZEOF_DNS_QUERY); @@ -1078,7 +1094,11 @@ dns_check_entry(u8_t i) entry->server_idx = 0; entry->tmr = 1; entry->retries = 0; - +#if ESP_DNS + while((entry->server_idx < DNS_MAX_SERVERS) && ip_addr_isany_val(dns_servers[entry->server_idx])) { + entry->server_idx++; + } +#endif /* send DNS packet for this entry */ err = dns_send(i); if (err != ERR_OK) { @@ -1089,6 +1109,12 @@ dns_check_entry(u8_t i) case DNS_STATE_ASKING: if (--entry->tmr == 0) { if (++entry->retries == DNS_MAX_RETRIES) { +#if ESP_DNS + /* skip DNS servers with zero address */ + while ((entry->server_idx + 1 < DNS_MAX_SERVERS) && ip_addr_isany_val(dns_servers[entry->server_idx + 1])) { + entry->server_idx++; + } +#endif if (dns_backupserver_available(entry) #if LWIP_DNS_SUPPORT_MDNS_QUERIES && !entry->is_mdns @@ -1552,6 +1578,19 @@ dns_gethostbyname(const char *hostname, ip_addr_t *addr, dns_found_callback foun return dns_gethostbyname_addrtype(hostname, addr, found, callback_arg, LWIP_DNS_ADDRTYPE_DEFAULT); } +#if ESP_DNS +static bool dns_server_is_set (void) +{ + int i = 0; + for (i = 0;i < DNS_MAX_SERVERS; i++) { + if (!ip_addr_isany_val(dns_servers[i])) { + return true; + } + } + return false; +} +#endif + /** * @ingroup dns * Like dns_gethostbyname, but returned address type can be controlled: @@ -1644,7 +1683,11 @@ dns_gethostbyname_addrtype(const char *hostname, ip_addr_t *addr, dns_found_call #endif /* LWIP_DNS_SUPPORT_MDNS_QUERIES */ { /* prevent calling found callback if no server is set, return error instead */ +#if ESP_DNS + if (dns_server_is_set() == false) { +#else if (ip_addr_isany_val(dns_servers[0])) { +#endif return ERR_VAL; } } diff --git a/src/core/ipv4/dhcp.c b/src/core/ipv4/dhcp.c index 18261683..0cdf0ead 100644 --- a/src/core/ipv4/dhcp.c +++ b/src/core/ipv4/dhcp.c @@ -744,6 +744,11 @@ dhcp_handle_ack(struct netif *netif, struct dhcp_msg *msg_in) /* DNS servers */ for (n = 0; (n < LWIP_DHCP_PROVIDE_DNS_SERVERS) && dhcp_option_given(dhcp, DHCP_OPTION_IDX_DNS_SERVER + n); n++) { ip_addr_t dns_addr; +#if ESP_DNS + if (n == DNS_FALLBACK_SERVER_INDEX) { + continue; + } +#endif ip_addr_set_ip4_u32_val(dns_addr, lwip_htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_DNS_SERVER + n))); dns_setserver(n, &dns_addr); } diff --git a/src/include/lwip/dns.h b/src/include/lwip/dns.h index 09134154..db52fedd 100644 --- a/src/include/lwip/dns.h +++ b/src/include/lwip/dns.h @@ -111,7 +111,9 @@ err_t dns_gethostbyname(const char *hostname, ip_addr_t *addr, err_t dns_gethostbyname_addrtype(const char *hostname, ip_addr_t *addr, dns_found_callback found, void *callback_arg, u8_t dns_addrtype); - +#if ESP_DNS +void dns_clear_servers(bool keep_fallback); +#endif #if DNS_LOCAL_HOSTLIST size_t dns_local_iterate(dns_found_callback iterator_fn, void *iterator_arg); diff --git a/test/unit/lwipopts.h b/test/unit/lwipopts.h index b3208920..a8cae308 100644 --- a/test/unit/lwipopts.h +++ b/test/unit/lwipopts.h @@ -93,6 +93,7 @@ /* Enable Espressif specific options */ #ifdef ESP_LWIP +#define ESP_DNS 1 #define LWIP_DHCP_ENABLE_VENDOR_SPEC_IDS 1 #define LWIP_DHCP_ENABLE_CLIENT_ID 1 #define LWIP_DHCP_ENABLE_MTU_UPDATE 1 @@ -161,9 +162,11 @@ u32_t esp_random(void); #endif /* ESP_TEST_DEBUG */ #define ESP_LWIP_IGMP_TIMERS_ONDEMAND 1 #define ESP_LWIP_MLD6_TIMERS_ONDEMAND 1 +#define DNS_FALLBACK_SERVER_INDEX (DNS_MAX_SERVERS - 1) #else #define ESP_LWIP 0 +#define ESP_DNS 0 #define ESP_LWIP_IGMP_TIMERS_ONDEMAND 0 #define ESP_LWIP_MLD6_TIMERS_ONDEMAND 0