From 112f1255c295adf1466a72efc94e4ce8fa19ffd6 Mon Sep 17 00:00:00 2001 From: Sachin Parekh Date: Mon, 15 Apr 2019 14:52:00 +0530 Subject: [PATCH] igmp/mld6: Add on-demand timers config 2.1.3-esp: 7d3b07fd igmp/mld6: Add on-demand timers config Signed-off-by: Sachin Parekh Co-Authored-By: Axel Lin (espressif/esp-lwip@b1eec77b) --- src/core/ipv4/igmp.c | 39 +++++++++++++++++++++++++++++++++++++++ src/core/ipv6/mld6.c | 38 ++++++++++++++++++++++++++++++++++++++ src/core/timeouts.c | 4 ++-- src/include/lwip/opt.h | 2 +- test/unit/lwipopts.h | 10 +++++++--- 5 files changed, 87 insertions(+), 6 deletions(-) diff --git a/src/core/ipv4/igmp.c b/src/core/ipv4/igmp.c index a74df16f..2be7de52 100644 --- a/src/core/ipv4/igmp.c +++ b/src/core/ipv4/igmp.c @@ -93,6 +93,7 @@ Steve Reynolds #include "lwip/netif.h" #include "lwip/stats.h" #include "lwip/prot/igmp.h" +#include "lwip/timeouts.h" #include @@ -107,6 +108,11 @@ static void igmp_send(struct netif *netif, struct igmp_group *group, u8_t type static ip4_addr_t allsystems; static ip4_addr_t allrouters; +#if ESP_LWIP_IGMP_TIMERS_ONDEMAND +#include +static bool is_tmr_start = false; +#endif + /** * Initialize the IGMP module */ @@ -633,6 +639,17 @@ igmp_leavegroup_netif(struct netif *netif, const ip4_addr_t *groupaddr) } } +#if ESP_LWIP_IGMP_TIMERS_ONDEMAND +/** + * Wrapper function with matching prototype which calls the actual callback + */ +static void igmp_timeout_cb(void *arg) +{ + LWIP_UNUSED_ARG(arg); + + igmp_tmr(); +} +#endif /** * The igmp timer function (both for NO_SYS=1 and =0) * Should be called every IGMP_TMR_INTERVAL milliseconds (100 ms is default). @@ -641,6 +658,9 @@ void igmp_tmr(void) { struct netif *netif; +#if ESP_LWIP_IGMP_TIMERS_ONDEMAND + bool tmr_restart = false; +#endif NETIF_FOREACH(netif) { struct igmp_group *group = netif_igmp_data(netif); @@ -651,10 +671,23 @@ igmp_tmr(void) if (group->timer == 0) { igmp_timeout(netif, group); } +#if ESP_LWIP_IGMP_TIMERS_ONDEMAND + else { + tmr_restart = true; + } +#endif } group = group->next; } } +#if ESP_LWIP_IGMP_TIMERS_ONDEMAND + if (tmr_restart) { + sys_timeout(IGMP_TMR_INTERVAL, igmp_timeout_cb, NULL); + } else { + sys_untimeout(igmp_timeout_cb, NULL); + is_tmr_start = false; + } +#endif } /** @@ -701,6 +734,12 @@ igmp_start_timer(struct igmp_group *group, u8_t max_time) if (group->timer == 0) { group->timer = 1; } +#if ESP_LWIP_IGMP_TIMERS_ONDEMAND + if (!is_tmr_start) { + sys_timeout(IGMP_TMR_INTERVAL, igmp_timeout_cb, NULL); + is_tmr_start = true; + } +#endif } /** diff --git a/src/core/ipv6/mld6.c b/src/core/ipv6/mld6.c index 0009c98b..6f8bb15d 100644 --- a/src/core/ipv6/mld6.c +++ b/src/core/ipv6/mld6.c @@ -66,6 +66,7 @@ #include "lwip/netif.h" #include "lwip/memp.h" #include "lwip/stats.h" +#include "lwip/timeouts.h" #include @@ -86,6 +87,10 @@ static err_t mld6_remove_group(struct netif *netif, struct mld_group *group); static void mld6_delayed_report(struct mld_group *group, u16_t maxresp); static void mld6_send(struct netif *netif, struct mld_group *group, u8_t type); +#if ESP_LWIP_MLD6_TIMERS_ONDEMAND +#include +static bool is_tmr_start = false; +#endif /** * Stop MLD processing on interface @@ -488,6 +493,17 @@ mld6_leavegroup_netif(struct netif *netif, const ip6_addr_t *groupaddr) return ERR_VAL; } +#if ESP_LWIP_MLD6_TIMERS_ONDEMAND +/** + * Wrapper function with matching prototype which calls the actual callback + */ +static void mld6_timeout_cb(void *arg) +{ + LWIP_UNUSED_ARG(arg); + + mld6_tmr(); +} +#endif /** * Periodic timer for mld processing. Must be called every @@ -499,6 +515,9 @@ void mld6_tmr(void) { struct netif *netif; +#if ESP_LWIP_MLD6_TIMERS_ONDEMAND + bool tmr_restart = false; +#endif NETIF_FOREACH(netif) { struct mld_group *group = netif_mld6_data(netif); @@ -514,10 +533,23 @@ mld6_tmr(void) group->group_state = MLD6_GROUP_IDLE_MEMBER; } } +#if ESP_LWIP_MLD6_TIMERS_ONDEMAND + else { + tmr_restart = true; + } +#endif } group = group->next; } } +#if ESP_LWIP_MLD6_TIMERS_ONDEMAND + if (tmr_restart) { + sys_timeout(MLD6_TMR_INTERVAL, mld6_timeout_cb, NULL); + } else { + sys_untimeout(mld6_timeout_cb, NULL); + is_tmr_start = false; + } +#endif } /** @@ -550,6 +582,12 @@ mld6_delayed_report(struct mld_group *group, u16_t maxresp_in) ((group->timer == 0) || (maxresp < group->timer)))) { group->timer = maxresp; group->group_state = MLD6_GROUP_DELAYING_MEMBER; +#if ESP_LWIP_MLD6_TIMERS_ONDEMAND + if (!is_tmr_start) { + sys_timeout(MLD6_TMR_INTERVAL, mld6_timeout_cb, NULL); + is_tmr_start = true; + } +#endif } } diff --git a/src/core/timeouts.c b/src/core/timeouts.c index 91657eb7..9402c885 100644 --- a/src/core/timeouts.c +++ b/src/core/timeouts.c @@ -94,7 +94,7 @@ const struct lwip_cyclic_timer lwip_cyclic_timers[] = { #if LWIP_ACD {ACD_TMR_INTERVAL, HANDLER(acd_tmr)}, #endif /* LWIP_ACD */ -#if LWIP_IGMP +#if LWIP_IGMP && !ESP_LWIP_IGMP_TIMERS_ONDEMAND {IGMP_TMR_INTERVAL, HANDLER(igmp_tmr)}, #endif /* LWIP_IGMP */ #endif /* LWIP_IPV4 */ @@ -106,7 +106,7 @@ const struct lwip_cyclic_timer lwip_cyclic_timers[] = { #if LWIP_IPV6_REASS {IP6_REASS_TMR_INTERVAL, HANDLER(ip6_reass_tmr)}, #endif /* LWIP_IPV6_REASS */ -#if LWIP_IPV6_MLD +#if LWIP_IPV6_MLD && !ESP_LWIP_MLD6_TIMERS_ONDEMAND {MLD6_TMR_INTERVAL, HANDLER(mld6_tmr)}, #endif /* LWIP_IPV6_MLD */ #if LWIP_IPV6_DHCP6 diff --git a/src/include/lwip/opt.h b/src/include/lwip/opt.h index dd65a111..9c21974f 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 + (2*LWIP_DHCP) + LWIP_ACD + LWIP_IGMP + LWIP_DNS + PPP_NUM_TIMEOUTS + (LWIP_IPV6 * (1 + LWIP_IPV6_REASS + LWIP_IPV6_MLD + LWIP_IPV6_DHCP6))) +#define LWIP_NUM_SYS_TIMEOUT_INTERNAL (LWIP_TCP + IP_REASSEMBLY + LWIP_ARP + (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))) /** * MEMP_NUM_SYS_TIMEOUT: the number of simultaneously active timeouts. diff --git a/test/unit/lwipopts.h b/test/unit/lwipopts.h index b36da57c..b3208920 100644 --- a/test/unit/lwipopts.h +++ b/test/unit/lwipopts.h @@ -159,10 +159,14 @@ u32_t esp_random(void); #define UDP_DEBUG LWIP_DBG_ON #define TCP_DEBUG LWIP_DBG_ON #endif /* ESP_TEST_DEBUG */ +#define ESP_LWIP_IGMP_TIMERS_ONDEMAND 1 +#define ESP_LWIP_MLD6_TIMERS_ONDEMAND 1 + #else -#define ESP_LWIP 0 -#define ESP_DHCP 0 -#define ESP_DHCP_DISABLE_VENDOR_CLASS_IDENTIFIER 1 +#define ESP_LWIP 0 +#define ESP_LWIP_IGMP_TIMERS_ONDEMAND 0 +#define ESP_LWIP_MLD6_TIMERS_ONDEMAND 0 + #endif /* ESP_LWIP */ #endif /* LWIP_HDR_LWIPOPTS_H */