From 3d8cbaa9cef78e705a84952ef5ae25ed838ad4dc Mon Sep 17 00:00:00 2001 From: xueyunfei Date: Tue, 11 Aug 2020 17:54:36 +0800 Subject: [PATCH] dns: Add on-demand timer config for DNS timer 2.1.3-esp: 6b0bfc2e lwip:optimization lwip dns timer --- contrib/examples/example_app/lwipopts.h | 1 + src/core/dns.c | 41 +++++++++++++++++++++++++ src/core/timeouts.c | 2 +- src/include/lwip/opt.h | 2 +- test/unit/lwipopts.h | 5 +++ 5 files changed, 49 insertions(+), 2 deletions(-) diff --git a/contrib/examples/example_app/lwipopts.h b/contrib/examples/example_app/lwipopts.h index b4ab028c..1931764c 100644 --- a/contrib/examples/example_app/lwipopts.h +++ b/contrib/examples/example_app/lwipopts.h @@ -328,6 +328,7 @@ void lwip_example_app_platform_assert(const char *msg, int line, const char *fil #define ESP_LWIP_IGMP_TIMERS_ONDEMAND ESP_LWIP #define ESP_LWIP_MLD6_TIMERS_ONDEMAND ESP_LWIP #define ESP_LWIP_DHCP_FINE_TIMERS_ONDEMAND ESP_LWIP +#define ESP_LWIP_DNS_TIMERS_ONDEMAND ESP_LWIP #define ESP_DNS ESP_LWIP #define ESP_LWIP_ARP ESP_LWIP diff --git a/src/core/dns.c b/src/core/dns.c index 9ebd070c..68355487 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 @@ -1555,6 +1590,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 5ba672c3..bd44dd4c 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 41938ea2..b2913548 100644 --- a/src/include/lwip/opt.h +++ b/src/include/lwip/opt.h @@ -498,7 +498,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_ACD + (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) + LWIP_IPV6_DHCP6))) +#define LWIP_NUM_SYS_TIMEOUT_INTERNAL (LWIP_TCP + IP_REASSEMBLY + LWIP_ARP + (ESP_LWIP_DHCP_FINE_TIMERS_ONDEMAND ? LWIP_DHCP : 2*LWIP_DHCP) + LWIP_ACD + (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) + LWIP_IPV6_DHCP6))) /** * MEMP_NUM_SYS_TIMEOUT: the number of simultaneously active timeouts. diff --git a/test/unit/lwipopts.h b/test/unit/lwipopts.h index 1e095828..bc97990b 100644 --- a/test/unit/lwipopts.h +++ b/test/unit/lwipopts.h @@ -164,6 +164,7 @@ u32_t esp_random(void); #define ESP_LWIP_MLD6_TIMERS_ONDEMAND 1 #define DNS_FALLBACK_SERVER_INDEX (DNS_MAX_SERVERS - 1) #define ESP_LWIP_DHCP_FINE_TIMERS_ONDEMAND 1 +#define ESP_LWIP_DNS_TIMERS_ONDEMAND 1 #else #define ESP_LWIP 0 @@ -175,6 +176,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 */