From 2c6482bafb1fbe9f3fb1b9eee1d8cc082864158b Mon Sep 17 00:00:00 2001 From: xueyunfei Date: Wed, 14 Sep 2022 20:08:55 +0800 Subject: [PATCH] lwip timer:optimization dhcp fine timer --- .github/workflows/ci-linux.yml | 2 +- .gitlab-ci.yml | 2 +- src/core/ipv4/dhcp.c | 45 ++++++++++++++++++++++++++++++++++ src/core/timeouts.c | 4 ++- src/include/lwip/dhcp.h | 3 +++ src/include/lwip/opt.h | 2 +- test/apps/lwipopts.h | 1 + test/unit/dhcp/test_dhcp.c | 4 +++ test/unit/lwipopts.h | 5 ++++ 9 files changed, 64 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci-linux.yml b/.github/workflows/ci-linux.yml index 7e45086d..b3658181 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_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_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 e3624e85..74926c2b 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_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_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/ipv4/dhcp.c b/src/core/ipv4/dhcp.c index 9e1538e4..f2b1a42c 100644 --- a/src/core/ipv4/dhcp.c +++ b/src/core/ipv4/dhcp.c @@ -79,9 +79,20 @@ #include "lwip/etharp.h" #include "lwip/prot/dhcp.h" #include "lwip/prot/iana.h" +#include "lwip/timeouts.h" #include +#if ESP_LWIP_DHCP_FINE_TIMERS_ONDEMAND +#include +static bool is_tmr_start = false; +#define ESP_LWIP_DHCP_FINE_TIMER_START_ONCE() if (!is_tmr_start) { \ + sys_timeout(DHCP_FINE_TIMER_MSECS, dhcp_fine_timeout_cb, NULL); \ + is_tmr_start = true; } +#else +#define ESP_LWIP_DHCP_FINE_TIMER_START_ONCE() +#endif /* ESP_LWIP_DHCP_FINE_TIMERS_ONDEMAND */ + #ifdef LWIP_HOOK_FILENAME #include LWIP_HOOK_FILENAME #endif @@ -296,6 +307,14 @@ dhcp_dec_pcb_refcount(void) } } +#if ESP_LWIP_DHCP_FINE_TIMERS_ONDEMAND +void dhcp_fine_timeout_cb(void *arg) +{ + LWIP_UNUSED_ARG(arg); + dhcp_fine_tmr(); +} +#endif + /** * Back-off the DHCP client (because of a received NAK response). * @@ -357,6 +376,7 @@ dhcp_check(struct netif *netif) msecs = 500; dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_check(): set request timeout %"U16_F" msecs\n", msecs)); + ESP_LWIP_DHCP_FINE_TIMER_START_ONCE(); } #endif /* DHCP_DOES_ARP_CHECK */ @@ -457,6 +477,7 @@ dhcp_select(struct netif *netif) msecs = (u16_t)((dhcp->tries < 6 ? 1 << dhcp->tries : 60) * 1000); dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_select(): set request timeout %"U16_F" msecs\n", msecs)); + ESP_LWIP_DHCP_FINE_TIMER_START_ONCE(); return result; } @@ -502,10 +523,15 @@ dhcp_coarse_tmr(void) * A DHCP server is expected to respond within a short period of time. * This timer checks whether an outstanding DHCP request is timed out. */ + void dhcp_fine_tmr(void) { struct netif *netif; + +#if ESP_LWIP_DHCP_FINE_TIMERS_ONDEMAND + bool tmr_restart = false; +#endif /* ESP_LWIP_DHCP_FINE_TIMERS_ONDEMAND */ /* loop through netif's */ NETIF_FOREACH(netif) { struct dhcp *dhcp = netif_dhcp_data(netif); @@ -514,13 +540,27 @@ dhcp_fine_tmr(void) /* timer is active (non zero), and is about to trigger now */ if (dhcp->request_timeout > 1) { dhcp->request_timeout--; +#if ESP_LWIP_DHCP_FINE_TIMERS_ONDEMAND + tmr_restart = true; +#endif } else if (dhcp->request_timeout == 1) { dhcp->request_timeout--; /* { dhcp->request_timeout == 0 } */ LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_fine_tmr(): request timeout\n")); /* this client's request timeout triggered */ dhcp_timeout(netif); +#if ESP_LWIP_DHCP_FINE_TIMERS_ONDEMAND + tmr_restart = true; +#endif } +#if ESP_LWIP_DHCP_FINE_TIMERS_ONDEMAND + if (tmr_restart) { + sys_timeout(DHCP_FINE_TIMER_MSECS, dhcp_fine_timeout_cb, NULL); + } else { + sys_untimeout(dhcp_fine_timeout_cb, NULL); + is_tmr_start = false; + } +#endif } } } @@ -1023,6 +1063,7 @@ dhcp_decline(struct netif *netif) msecs = 10 * 1000; dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_decline(): set request timeout %"U16_F" msecs\n", msecs)); + ESP_LWIP_DHCP_FINE_TIMER_START_ONCE(); return result; } #endif /* DHCP_DOES_ARP_CHECK */ @@ -1089,6 +1130,7 @@ dhcp_discover(struct netif *netif) msecs = DHCP_REQUEST_TIMEOUT_SEQUENCE(dhcp->tries); dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_discover(): set request timeout %"U16_F" msecs\n", msecs)); + ESP_LWIP_DHCP_FINE_TIMER_START_ONCE(); return result; } @@ -1227,6 +1269,7 @@ dhcp_renew(struct netif *netif) msecs = (u16_t)(dhcp->tries < 10 ? dhcp->tries * 2000 : 20 * 1000); dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_renew(): set request timeout %"U16_F" msecs\n", msecs)); + ESP_LWIP_DHCP_FINE_TIMER_START_ONCE(); return result; } @@ -1281,6 +1324,7 @@ dhcp_rebind(struct netif *netif) msecs = (u16_t)(dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000); dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_rebind(): set request timeout %"U16_F" msecs\n", msecs)); + ESP_LWIP_DHCP_FINE_TIMER_START_ONCE(); return result; } @@ -1338,6 +1382,7 @@ dhcp_reboot(struct netif *netif) msecs = (u16_t)(dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000); dhcp->request_timeout = (u16_t)((msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS); LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_reboot(): set request timeout %"U16_F" msecs\n", msecs)); + ESP_LWIP_DHCP_FINE_TIMER_START_ONCE(); return result; } diff --git a/src/core/timeouts.c b/src/core/timeouts.c index a06f8028..ee7ec15c 100644 --- a/src/core/timeouts.c +++ b/src/core/timeouts.c @@ -89,8 +89,10 @@ const struct lwip_cyclic_timer lwip_cyclic_timers[] = { #endif /* LWIP_ARP */ #if LWIP_DHCP {DHCP_COARSE_TIMER_MSECS, HANDLER(dhcp_coarse_tmr)}, - {DHCP_FINE_TIMER_MSECS, HANDLER(dhcp_fine_tmr)}, #endif /* LWIP_DHCP */ +#if LWIP_DHCP && !ESP_LWIP_DHCP_FINE_TIMERS_ONDEMAND + {DHCP_FINE_TIMER_MSECS, HANDLER(dhcp_fine_tmr)}, +#endif /* LWIP_DHCP && !ESP_LWIP_DHCP_FINE_TIMERS_ONDEMAND */ #if LWIP_AUTOIP {AUTOIP_TMR_INTERVAL, HANDLER(autoip_tmr)}, #endif /* LWIP_AUTOIP */ diff --git a/src/include/lwip/dhcp.h b/src/include/lwip/dhcp.h index 70a0f4fc..d9d3ee21 100644 --- a/src/include/lwip/dhcp.h +++ b/src/include/lwip/dhcp.h @@ -123,6 +123,9 @@ u8_t dhcp_supplied_address(const struct netif *netif); void dhcp_coarse_tmr(void); /* to be called every half second */ void dhcp_fine_tmr(void); +#if ESP_LWIP_DHCP_FINE_TIMERS_ONDEMAND +void dhcp_fine_timeout_cb(void *arg); +#endif #if LWIP_DHCP_GET_NTP_SRV /** This function must exist, in other to add offered NTP servers to diff --git a/src/include/lwip/opt.h b/src/include/lwip/opt.h index 6e7af796..8c8048fc 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 + (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) + 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 d37fae16..825a362a 100644 --- a/test/apps/lwipopts.h +++ b/test/apps/lwipopts.h @@ -294,6 +294,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_MLD6_TIMERS_ONDEMAND 1 #define ESP_DNS 1 #define ESP_LWIP_ARP 1 diff --git a/test/unit/dhcp/test_dhcp.c b/test/unit/dhcp/test_dhcp.c index 4fc285d5..42c2af58 100644 --- a/test/unit/dhcp/test_dhcp.c +++ b/test/unit/dhcp/test_dhcp.c @@ -5,6 +5,7 @@ #include "lwip/prot/dhcp.h" #include "lwip/prot/iana.h" #include "lwip/etharp.h" +#include "lwip/timeouts.h" #include "netif/ethernet.h" static struct netif net_test; @@ -140,6 +141,9 @@ static void tick_lwip(void) { tick++; if (tick % 5 == 0) { +#if ESP_LWIP_DHCP_FINE_TIMERS_ONDEMAND + sys_untimeout(dhcp_fine_timeout_cb, NULL); +#endif dhcp_fine_tmr(); } #if ESP_LWIP diff --git a/test/unit/lwipopts.h b/test/unit/lwipopts.h index 4dc58a49..93320d04 100644 --- a/test/unit/lwipopts.h +++ b/test/unit/lwipopts.h @@ -158,6 +158,7 @@ u32_t esp_random(void); #endif /* ESP_TEST_DEBUG */ #define ESP_LWIP_IGMP_TIMERS_ONDEMAND 1 #define ESP_LWIP_MLD6_TIMERS_ONDEMAND 1 +#define ESP_LWIP_DHCP_FINE_TIMERS_ONDEMAND 1 #else #define ESP_LWIP 0 @@ -165,6 +166,10 @@ u32_t esp_random(void); #define ESP_LWIP_IGMP_TIMERS_ONDEMAND 0 #define ESP_LWIP_MLD6_TIMERS_ONDEMAND 0 +#ifndef ESP_LWIP_DHCP_FINE_TIMERS_ONDEMAND +#define ESP_LWIP_DHCP_FINE_TIMERS_ONDEMAND 0 +#endif + #endif /* ESP_LWIP */ #endif /* LWIP_HDR_LWIPOPTS_H */