From 7f5ab42c7ed973fe24cd8e807dcd1f8de90c62d6 Mon Sep 17 00:00:00 2001 From: xueyunfei Date: Tue, 11 Aug 2020 17:54:36 +0800 Subject: [PATCH] optimization lwip dns timer --- src/core/dns.c | 40 ++++++++++++++++++++++++++++++++++++++++ src/core/timeouts.c | 2 +- test/unit/lwipopts.h | 1 + 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/core/dns.c b/src/core/dns.c index 0517c2a2..e8b8a5c7 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 is_tmr_start = false; +#endif /* ESP_LWIP_DNS_TIMERS_ONDEMAND */ #include @@ -422,6 +428,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). @@ -429,8 +446,25 @@ dns_getserver(u8_t numdns) void dns_tmr(void) { +#if ESP_LWIP_DNS_TIMERS_ONDEMAND + bool tmr_restart = false; +#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 (u8_t 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); + is_tmr_start = false; + } +#endif/* ESP_LWIP_DNS_TIMERS_ONDEMAND */ } #if DNS_LOCAL_HOSTLIST @@ -1542,6 +1576,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 (!is_tmr_start) { + sys_timeout(DNS_TMR_INTERVAL, dns_timeout_cb, NULL); + 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 98245604..234704e8 100644 --- a/src/core/timeouts.c +++ b/src/core/timeouts.c @@ -108,7 +108,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/test/unit/lwipopts.h b/test/unit/lwipopts.h index 324eacbd..5bed5f44 100644 --- a/test/unit/lwipopts.h +++ b/test/unit/lwipopts.h @@ -102,6 +102,7 @@ #define ESP_PPP 1 #define ESP_LWIP_IGMP_TIMERS_ONDEMAND 1 #define ESP_LWIP_MLD6_TIMERS_ONDEMAND 1 +#define ESP_LWIP_DNS_TIMERS_ONDEMAND 1 #define ESP_GRATUITOUS_ARP 1 #define ESP_LWIP_SELECT 1 #define ESP_LWIP_LOCK 1