diff --git a/.github/workflows/ci-linux.yml b/.github/workflows/ci-linux.yml index 8b5d9bfa..1686e2e9 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_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 CFLAGS="-DESP_LWIP=LWIP_NETCONN_FULLDUPLEX -DESP_LWIP_IP4_REASSEMBLY_TIMERS_ONDEMAND=ESP_LWIP -DESP_LWIP_IP6_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 d908ee84..87149f6a 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_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 CFLAGS="-DESP_LWIP=LWIP_NETCONN_FULLDUPLEX -DESP_LWIP_IP4_REASSEMBLY_TIMERS_ONDEMAND=ESP_LWIP -DESP_LWIP_IP6_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/ipv6/ip6_frag.c b/src/core/ipv6/ip6_frag.c index 8b352f56..5a7a0ae9 100644 --- a/src/core/ipv6/ip6_frag.c +++ b/src/core/ipv6/ip6_frag.c @@ -54,6 +54,11 @@ #if LWIP_IPV6 && LWIP_IPV6_REASS /* don't build if not configured for use in lwipopts.h */ +#if ESP_LWIP_IP6_REASSEMBLY_TIMERS_ONDEMAND +#include "stdbool.h" +#include "lwip/timeouts.h" +static bool s_is_tmr_start = false; +#endif /* ESP_LWIP_IP6_REASSEMBLY_TIMERS_ONDEMAND */ /** Setting this to 0, you can turn off checking the fragments for overlapping * regions. The code gets a little smaller. Only use this if you know that @@ -109,10 +114,24 @@ static void ip6_reass_free_complete_datagram(struct ip6_reassdata *ipr); static void ip6_reass_remove_oldest_datagram(struct ip6_reassdata *ipr, int pbufs_needed); #endif /* IP_REASS_FREE_OLDEST */ +#if ESP_LWIP_IP6_REASSEMBLY_TIMERS_ONDEMAND +/** + * Wrapper function with matching prototype which calls the actual callback + */ +static void ip6_reass_timeout_cb(void *arg) +{ + LWIP_UNUSED_ARG(arg); + ip6_reass_tmr(); +} +#endif /* ESP_LWIP_IP6_REASSEMBLY_TIMERS_ONDEMAND */ + void ip6_reass_tmr(void) { struct ip6_reassdata *r, *tmp; +#if ESP_LWIP_IP6_REASSEMBLY_TIMERS_ONDEMAND + bool tmr_restart = false; +#endif /* ESP_LWIP_IP6_REASSEMBLY_TIMERS_ONDEMAND */ #if !IPV6_FRAG_COPYHEADER LWIP_ASSERT("sizeof(struct ip6_reass_helper) <= IP6_FRAG_HLEN, set IPV6_FRAG_COPYHEADER to 1", @@ -126,6 +145,9 @@ ip6_reass_tmr(void) if (r->timer > 0) { r->timer--; r = r->next; +#if ESP_LWIP_IP6_REASSEMBLY_TIMERS_ONDEMAND + tmr_restart = true; +#endif /* ESP_LWIP_IP6_REASSEMBLY_TIMERS_ONDEMAND */ } else { /* reassembly timed out */ tmp = r; @@ -135,6 +157,14 @@ ip6_reass_tmr(void) ip6_reass_free_complete_datagram(tmp); } } +#if ESP_LWIP_IP6_REASSEMBLY_TIMERS_ONDEMAND + if (tmr_restart) { + sys_timeout(IP6_REASS_TMR_INTERVAL, ip6_reass_timeout_cb, NULL); + } else { + sys_untimeout(ip6_reass_timeout_cb, NULL); + s_is_tmr_start = false; + } +#endif/* ESP_LWIP_IP6_REASSEMBLY_TIMERS_ONDEMAND */ } /** @@ -357,7 +387,6 @@ ip6_reass(struct pbuf *p) /* enqueue the new structure to the front of the list */ ipr->next = reassdatagrams; reassdatagrams = ipr; - /* Use the current IPv6 header for src/dest address reference. * Eventually, we will replace it when we get the first fragment * (it might be this one, in any case, it is done later). */ @@ -660,6 +689,12 @@ ip6_reass(struct pbuf *p) /* Return the pbuf chain */ return p; } +#if ESP_LWIP_IP6_REASSEMBLY_TIMERS_ONDEMAND + if (!s_is_tmr_start) { + sys_timeout(IP6_REASS_TMR_INTERVAL, ip6_reass_timeout_cb, NULL); + s_is_tmr_start = true; + } +#endif /* ESP_LWIP_IP6_REASSEMBLY_TIMERS_ONDEMAND */ /* the datagram is not (yet?) reassembled completely */ return NULL; diff --git a/src/core/timeouts.c b/src/core/timeouts.c index d10a12cd..448159c9 100644 --- a/src/core/timeouts.c +++ b/src/core/timeouts.c @@ -105,7 +105,7 @@ const struct lwip_cyclic_timer lwip_cyclic_timers[] = { #endif /* LWIP_DNS */ #if LWIP_IPV6 {ND6_TMR_INTERVAL, HANDLER(nd6_tmr)}, -#if LWIP_IPV6_REASS +#if LWIP_IPV6_REASS && !ESP_LWIP_IP6_REASSEMBLY_TIMERS_ONDEMAND {IP6_REASS_TMR_INTERVAL, HANDLER(ip6_reass_tmr)}, #endif /* LWIP_IPV6_REASS */ #if LWIP_IPV6_MLD && !ESP_LWIP_MLD6_TIMERS_ONDEMAND diff --git a/test/apps/lwipopts.h b/test/apps/lwipopts.h index 37d822ba..19be675f 100644 --- a/test/apps/lwipopts.h +++ b/test/apps/lwipopts.h @@ -38,6 +38,7 @@ #define LWIP_IPV4 1 #define LWIP_IPV6 0 +#define LWIP_IPV6_REASS 0 #define NO_SYS 0 #define LWIP_SOCKET (NO_SYS==0) @@ -300,6 +301,9 @@ void sys_thread_sem_deinit(void); #if IP_REASSEMBLY #define ESP_LWIP_IP4_REASSEMBLY_TIMERS_ONDEMAND 1 #endif /* IP_REASSEMBLY */ +#if LWIP_IPV6_REASS +#define ESP_LWIP_IP6_REASSEMBLY_TIMERS_ONDEMAND 1 +#endif /* LWIP_IPV6_REASS */ #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 3ccb4314..e220318c 100644 --- a/test/unit/lwipopts.h +++ b/test/unit/lwipopts.h @@ -163,6 +163,7 @@ u32_t esp_random(void); #define ESP_LWIP_DHCP_FINE_TIMERS_ONDEMAND 1 #define ESP_LWIP_DNS_TIMERS_ONDEMAND 1 #define ESP_LWIP_IP4_REASSEMBLY_TIMERS_ONDEMAND 1 +#define ESP_LWIP_IP6_REASSEMBLY_TIMERS_ONDEMAND 1 #else #define ESP_LWIP 0 @@ -182,6 +183,10 @@ u32_t esp_random(void); #define ESP_LWIP_IP4_REASSEMBLY_TIMERS_ONDEMAND 0 #endif /* ESP_LWIP_IP4_REASSEMBLY_TIMERS_ONDEMAND */ +#ifndef ESP_LWIP_IP6_REASSEMBLY_TIMERS_ONDEMAND +#define ESP_LWIP_IP6_REASSEMBLY_TIMERS_ONDEMAND 0 +#endif /* ESP_LWIP_IP6_REASSEMBLY_TIMERS_ONDEMAND */ + #endif /* ESP_LWIP */ #endif /* LWIP_HDR_LWIPOPTS_H */