diff --git a/.github/workflows/ci-linux.yml b/.github/workflows/ci-linux.yml index 8ecb12f9..8b5d9bfa 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_DNS_TIMERS_ONDEMAND=ESP_LWIP -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 CFLAGS="-DESP_LWIP=LWIP_NETCONN_FULLDUPLEX -DESP_LWIP_IP4_REASSEMBLY_TIMERS_ONDEMAND=ESP_LWIP -DESP_LWIP_DNS_TIMERS_ONDEMAND=ESP_LWIP -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 88ca1ba5..d908ee84 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_DNS_TIMERS_ONDEMAND=ESP_LWIP -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 CFLAGS="-DESP_LWIP=LWIP_NETCONN_FULLDUPLEX -DESP_LWIP_IP4_REASSEMBLY_TIMERS_ONDEMAND=ESP_LWIP -DESP_LWIP_DNS_TIMERS_ONDEMAND=ESP_LWIP -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/ip4_frag.c b/src/core/ipv4/ip4_frag.c index a445530e..39459b6a 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 1391a710..d10a12cd 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/apps/lwipopts.h b/test/apps/lwipopts.h index 0cce2831..37d822ba 100644 --- a/test/apps/lwipopts.h +++ b/test/apps/lwipopts.h @@ -297,6 +297,9 @@ void sys_thread_sem_deinit(void); #define ESP_LWIP_DHCP_FINE_TIMERS_ONDEMAND 1 #define ESP_LWIP_DNS_TIMERS_ONDEMAND 1 #define ESP_LWIP_MLD6_TIMERS_ONDEMAND 1 +#if IP_REASSEMBLY +#define ESP_LWIP_IP4_REASSEMBLY_TIMERS_ONDEMAND 1 +#endif /* IP_REASSEMBLY */ #define ESP_DNS 1 #define ESP_LWIP_ARP 1 #define LWIP_AUTOIP_MAX_CONFLICTS 10 diff --git a/test/unit/lwipopts.h b/test/unit/lwipopts.h index 50675a91..3ccb4314 100644 --- a/test/unit/lwipopts.h +++ b/test/unit/lwipopts.h @@ -162,6 +162,7 @@ u32_t esp_random(void); #define ESP_LWIP_MLD6_TIMERS_ONDEMAND 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 @@ -177,6 +178,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 */