diff --git a/contrib/examples/example_app/lwipopts.h b/contrib/examples/example_app/lwipopts.h index 1931764c4..c3da30f1b 100644 --- a/contrib/examples/example_app/lwipopts.h +++ b/contrib/examples/example_app/lwipopts.h @@ -329,6 +329,7 @@ void lwip_example_app_platform_assert(const char *msg, int line, const char *fil #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_LWIP_IP4_REASSEMBLY_TIMERS_ONDEMAND ESP_LWIP #define ESP_DNS ESP_LWIP #define ESP_LWIP_ARP ESP_LWIP diff --git a/src/core/ipv4/ip4_frag.c b/src/core/ipv4/ip4_frag.c index 530314471..7923f8d7f 100644 --- a/src/core/ipv4/ip4_frag.c +++ b/src/core/ipv4/ip4_frag.c @@ -52,6 +52,13 @@ #include #if IP_REASSEMBLY + +#if ESP_LWIP_IP4_REASSEMBLY_TIMERS_ONDEMAND +#include "lwip/timeouts.h" +#include "stdbool.h" +static bool s_is_tmr_start = false; +#endif /* ESP_LWIP_IP4_REASSEMBLY_TIMERS_ONDEMAND */ + /** * The IP reassembly code currently has the following limitations: * - IP header options are not supported @@ -118,6 +125,17 @@ static u16_t ip_reass_pbufcount; static void ip_reass_dequeue_datagram(struct ip_reassdata *ipr, struct ip_reassdata *prev); static int ip_reass_free_complete_datagram(struct ip_reassdata *ipr, struct ip_reassdata *prev); +#if ESP_LWIP_IP4_REASSEMBLY_TIMERS_ONDEMAND +/** + * Wrapper function with matching prototype which calls the actual callback + */ +static void ip_reass_timeout_cb(void *arg) +{ + LWIP_UNUSED_ARG(arg); + ip_reass_tmr(); +} +#endif + /** * Reassembly timer base function * for both NO_SYS == 0 and 1 (!). @@ -128,6 +146,9 @@ void ip_reass_tmr(void) { struct ip_reassdata *r, *prev = NULL; +#if ESP_LWIP_IP4_REASSEMBLY_TIMERS_ONDEMAND + bool tmr_restart = false; +#endif /* ESP_LWIP_IP4_REASSEMBLY_TIMERS_ONDEMAND */ r = reassdatagrams; while (r != NULL) { @@ -138,6 +159,9 @@ ip_reass_tmr(void) LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_reass_tmr: timer dec %"U16_F"\n", (u16_t)r->timer)); prev = r; r = r->next; +#if ESP_LWIP_IP4_REASSEMBLY_TIMERS_ONDEMAND + tmr_restart = true; +#endif /* ESP_LWIP_IP4_REASSEMBLY_TIMERS_ONDEMAND */ } else { /* reassembly timed out */ struct ip_reassdata *tmp; @@ -149,6 +173,14 @@ ip_reass_tmr(void) ip_reass_free_complete_datagram(tmp, prev); } } +#if ESP_LWIP_IP4_REASSEMBLY_TIMERS_ONDEMAND + if (tmr_restart) { + sys_timeout(IP_TMR_INTERVAL, ip_reass_timeout_cb, NULL); + } else { + sys_untimeout(ip_reass_timeout_cb, NULL); + s_is_tmr_start = false; + } +#endif/* ESP_LWIP_IP4_REASSEMBLY_TIMERS_ONDEMAND */ } /** @@ -672,6 +704,12 @@ ip4_reass(struct pbuf *p) /* Return the pbuf chain */ return p; } +#if ESP_LWIP_IP4_REASSEMBLY_TIMERS_ONDEMAND + if (!s_is_tmr_start) { + sys_timeout(IP_TMR_INTERVAL, ip_reass_timeout_cb, NULL); + s_is_tmr_start = true; + } +#endif /* ESP_LWIP_IP4_REASSEMBLY_TIMERS_ONDEMAND */ /* the datagram is not (yet?) reassembled completely */ LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_reass_pbufcount: %d out\n", ip_reass_pbufcount)); return NULL; diff --git a/src/core/timeouts.c b/src/core/timeouts.c index bd44dd4c4..ec7106e24 100644 --- a/src/core/timeouts.c +++ b/src/core/timeouts.c @@ -81,7 +81,7 @@ const struct lwip_cyclic_timer lwip_cyclic_timers[] = { {TCP_TMR_INTERVAL, HANDLER(tcp_tmr)}, #endif /* LWIP_TCP */ #if LWIP_IPV4 -#if IP_REASSEMBLY +#if IP_REASSEMBLY && !ESP_LWIP_IP4_REASSEMBLY_TIMERS_ONDEMAND {IP_TMR_INTERVAL, HANDLER(ip_reass_tmr)}, #endif /* IP_REASSEMBLY */ #if LWIP_ARP diff --git a/test/unit/lwipopts.h b/test/unit/lwipopts.h index bc97990b1..4c3ef1ea0 100644 --- a/test/unit/lwipopts.h +++ b/test/unit/lwipopts.h @@ -165,6 +165,7 @@ u32_t esp_random(void); #define DNS_FALLBACK_SERVER_INDEX (DNS_MAX_SERVERS - 1) #define ESP_LWIP_DHCP_FINE_TIMERS_ONDEMAND 1 #define ESP_LWIP_DNS_TIMERS_ONDEMAND 1 +#define ESP_LWIP_IP4_REASSEMBLY_TIMERS_ONDEMAND 1 #else #define ESP_LWIP 0 @@ -180,6 +181,10 @@ u32_t esp_random(void); #define ESP_LWIP_DNS_TIMERS_ONDEMAND 0 #endif +#ifndef ESP_LWIP_IP4_REASSEMBLY_TIMERS_ONDEMAND +#define ESP_LWIP_IP4_REASSEMBLY_TIMERS_ONDEMAND 0 +#endif /* ESP_LWIP_IP4_REASSEMBLY_TIMERS_ONDEMAND */ + #endif /* ESP_LWIP */ #endif /* LWIP_HDR_LWIPOPTS_H */