diff --git a/.github/workflows/ci-linux.yml b/.github/workflows/ci-linux.yml index b3658181..8ecb12f9 100644 --- a/.github/workflows/ci-linux.yml +++ b/.github/workflows/ci-linux.yml @@ -51,7 +51,7 @@ jobs: run: | cp ${CONTRIB}/examples/example_app/lwipcfg.h.example ${CONTRIB}/examples/example_app/lwipcfg.h cd ${CONTRIB}/ports/unix/example_app - export CFLAGS="-DESP_LWIP=LWIP_NETCONN_FULLDUPLEX -DESP_LWIP_DHCP_FINE_TIMERS_ONDEMAND=ESP_LWIP -DESP_LWIP_IGMP_TIMERS_ONDEMAND=ESP_LWIP -DESP_LWIP_MLD6_TIMERS_ONDEMAND=ESP_LWIP -DESP_DNS=ESP_LWIP -DESP_LWIP_ARP=ESP_LWIP" + export CFLAGS="-DESP_LWIP=LWIP_NETCONN_FULLDUPLEX -DESP_LWIP_DNS_TIMERS_ONDEMAND=ESP_LWIP -DESP_LWIP_DHCP_FINE_TIMERS_ONDEMAND=ESP_LWIP -DESP_LWIP_IGMP_TIMERS_ONDEMAND=ESP_LWIP -DESP_LWIP_MLD6_TIMERS_ONDEMAND=ESP_LWIP -DESP_DNS=ESP_LWIP -DESP_LWIP_ARP=ESP_LWIP" export LWIPDIR=../../../../src/ make TESTFLAGS="-Wno-documentation" -j 4 chmod +x iteropts.sh && ./iteropts.sh diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 74926c2b..88ca1ba5 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -86,7 +86,7 @@ validate_opts: - *get_contrib - cp ${CONTRIB}/examples/example_app/lwipcfg.h.example ${CONTRIB}/examples/example_app/lwipcfg.h - cd ${CONTRIB}/ports/unix/example_app - - export CFLAGS="-DESP_LWIP=LWIP_NETCONN_FULLDUPLEX -DESP_LWIP_DHCP_FINE_TIMERS_ONDEMAND=ESP_LWIP -DESP_LWIP_IGMP_TIMERS_ONDEMAND=ESP_LWIP -DESP_LWIP_MLD6_TIMERS_ONDEMAND=ESP_LWIP -DESP_DNS=ESP_LWIP" + - export CFLAGS="-DESP_LWIP=LWIP_NETCONN_FULLDUPLEX -DESP_LWIP_DNS_TIMERS_ONDEMAND=ESP_LWIP -DESP_LWIP_DHCP_FINE_TIMERS_ONDEMAND=ESP_LWIP -DESP_LWIP_IGMP_TIMERS_ONDEMAND=ESP_LWIP -DESP_LWIP_MLD6_TIMERS_ONDEMAND=ESP_LWIP -DESP_DNS=ESP_LWIP" - export LWIPDIR=../../../../src/ - chmod +x iteropts.sh && ./iteropts.sh diff --git a/src/core/dns.c b/src/core/dns.c index 5dee59af..e7b52d24 100644 --- a/src/core/dns.c +++ b/src/core/dns.c @@ -94,6 +94,12 @@ #include "lwip/memp.h" #include "lwip/dns.h" #include "lwip/prot/dns.h" +#include "lwip/timeouts.h" + +#if ESP_LWIP_DNS_TIMERS_ONDEMAND +#include "stdbool.h" +static bool s_is_tmr_start = false; +#endif /* ESP_LWIP_DNS_TIMERS_ONDEMAND */ #include #if ESP_DNS @@ -412,6 +418,17 @@ dns_getserver(u8_t numdns) } } +#if ESP_LWIP_DNS_TIMERS_ONDEMAND +/** + * Wrapper function with matching prototype which calls the actual callback + */ +static void dns_timeout_cb(void *arg) +{ + LWIP_UNUSED_ARG(arg); + dns_tmr(); +} +#endif /* ESP_LWIP_DNS_TIMERS_ONDEMAND */ + /** * The DNS resolver client timer - handle retries and timeouts and should * be called every DNS_TMR_INTERVAL milliseconds (every second by default). @@ -419,8 +436,26 @@ dns_getserver(u8_t numdns) void dns_tmr(void) { +#if ESP_LWIP_DNS_TIMERS_ONDEMAND + bool tmr_restart = false; + u8_t i = 0; +#endif /* ESP_LWIP_DNS_TIMERS_ONDEMAND */ LWIP_DEBUGF(DNS_DEBUG, ("dns_tmr: dns_check_entries\n")); dns_check_entries(); +#if ESP_LWIP_DNS_TIMERS_ONDEMAND + for (i = 0; i < DNS_TABLE_SIZE; ++i) { + if (dns_table[i].state != DNS_STATE_UNUSED) { + tmr_restart = true; + break; + } + } + if (tmr_restart) { + sys_timeout(DNS_TMR_INTERVAL, dns_timeout_cb, NULL); + } else { + sys_untimeout(dns_timeout_cb, NULL); + s_is_tmr_start = false; + } +#endif/* ESP_LWIP_DNS_TIMERS_ONDEMAND */ } #if DNS_LOCAL_HOSTLIST @@ -1532,6 +1567,12 @@ dns_enqueue(const char *name, size_t hostnamelen, dns_found_callback found, /* force to send query without waiting timer */ dns_check_entry(i); +#if ESP_LWIP_DNS_TIMERS_ONDEMAND + if (!s_is_tmr_start) { + sys_timeout(DNS_TMR_INTERVAL, dns_timeout_cb, NULL); + s_is_tmr_start = true; + } +#endif /* ESP_LWIP_DNS_TIMERS_ONDEMAND */ /* dns query is enqueued */ return ERR_INPROGRESS; diff --git a/src/core/timeouts.c b/src/core/timeouts.c index ee7ec15c..1391a710 100644 --- a/src/core/timeouts.c +++ b/src/core/timeouts.c @@ -100,7 +100,7 @@ const struct lwip_cyclic_timer lwip_cyclic_timers[] = { {IGMP_TMR_INTERVAL, HANDLER(igmp_tmr)}, #endif /* LWIP_IGMP */ #endif /* LWIP_IPV4 */ -#if LWIP_DNS +#if LWIP_DNS && !ESP_LWIP_DNS_TIMERS_ONDEMAND {DNS_TMR_INTERVAL, HANDLER(dns_tmr)}, #endif /* LWIP_DNS */ #if LWIP_IPV6 diff --git a/src/include/lwip/opt.h b/src/include/lwip/opt.h index 8c8048fc..1071bcf2 100644 --- a/src/include/lwip/opt.h +++ b/src/include/lwip/opt.h @@ -505,7 +505,7 @@ * The number of sys timeouts used by the core stack (not apps) * The default number of timeouts is calculated here for all enabled modules. */ -#define LWIP_NUM_SYS_TIMEOUT_INTERNAL (LWIP_TCP + IP_REASSEMBLY + LWIP_ARP + (ESP_LWIP_DHCP_FINE_TIMERS_ONDEMAND ? LWIP_DHCP : 2*LWIP_DHCP) + LWIP_AUTOIP + (ESP_LWIP_IGMP_TIMERS_ONDEMAND ? 0 : LWIP_IGMP) + LWIP_DNS + PPP_NUM_TIMEOUTS + (LWIP_IPV6 * (1 + LWIP_IPV6_REASS + (ESP_LWIP_MLD6_TIMERS_ONDEMAND ? 0 : LWIP_IPV6_MLD)))) +#define LWIP_NUM_SYS_TIMEOUT_INTERNAL (LWIP_TCP + IP_REASSEMBLY + LWIP_ARP + (ESP_LWIP_DHCP_FINE_TIMERS_ONDEMAND ? LWIP_DHCP : 2*LWIP_DHCP) + LWIP_AUTOIP + (ESP_LWIP_IGMP_TIMERS_ONDEMAND ? 0 : LWIP_IGMP) + (ESP_LWIP_DNS_TIMERS_ONDEMAND ? 0 : LWIP_DNS) + PPP_NUM_TIMEOUTS + (LWIP_IPV6 * (1 + LWIP_IPV6_REASS + (ESP_LWIP_MLD6_TIMERS_ONDEMAND ? 0 : LWIP_IPV6_MLD)))) /** * MEMP_NUM_SYS_TIMEOUT: the number of simultaneously active timeouts. diff --git a/test/apps/lwipopts.h b/test/apps/lwipopts.h index 825a362a..0cce2831 100644 --- a/test/apps/lwipopts.h +++ b/test/apps/lwipopts.h @@ -295,6 +295,7 @@ void sys_thread_sem_deinit(void); #define ESP_LWIP_IGMP_TIMERS_ONDEMAND 1 #define ESP_LWIP_DHCP_FINE_TIMERS_ONDEMAND 1 +#define ESP_LWIP_DNS_TIMERS_ONDEMAND 1 #define ESP_LWIP_MLD6_TIMERS_ONDEMAND 1 #define ESP_DNS 1 #define ESP_LWIP_ARP 1 diff --git a/test/unit/lwipopts.h b/test/unit/lwipopts.h index 7f5f9210..50675a91 100644 --- a/test/unit/lwipopts.h +++ b/test/unit/lwipopts.h @@ -161,6 +161,7 @@ u32_t esp_random(void); #define ESP_LWIP_IGMP_TIMERS_ONDEMAND 1 #define ESP_LWIP_MLD6_TIMERS_ONDEMAND 1 #define ESP_LWIP_DHCP_FINE_TIMERS_ONDEMAND 1 +#define ESP_LWIP_DNS_TIMERS_ONDEMAND 1 #else #define ESP_LWIP 0 @@ -172,6 +173,10 @@ u32_t esp_random(void); #define ESP_LWIP_DHCP_FINE_TIMERS_ONDEMAND 0 #endif +#ifndef ESP_LWIP_DNS_TIMERS_ONDEMAND +#define ESP_LWIP_DNS_TIMERS_ONDEMAND 0 +#endif + #endif /* ESP_LWIP */ #endif /* LWIP_HDR_LWIPOPTS_H */