diff --git a/src/core/tcp_in.c b/src/core/tcp_in.c index 282c0d3a..340e905a 100644 --- a/src/core/tcp_in.c +++ b/src/core/tcp_in.c @@ -1502,7 +1502,23 @@ tcp_receive(struct tcp_pcb *pcb) cseg = pcb->ooseq; seqno = pcb->ooseq->tcphdr->seqno; - +#if ESP_LWIP + if (pcb->rcv_wnd < TCP_TCPLEN(cseg)) { + LWIP_DEBUGF(TCP_OOSEQ_DEBUG, + ("tcp_receive: OOSEQ packet out of wnd " + "seqno=%"U32_F" wnd =%"U32_F" len=%"U16_F"\ + snd_wl1=%"U32_F" snd_wl2 =%"U32_F" f = %"X16_F" tf=%"U16_F"\n", + seqno,pcb->rcv_wnd,cseg->len,pcb->snd_wl1,pcb->snd_wl1,\ + TCPH_FLAGS((cseg)->tcphdr),pcb->flags)); + cseg->len = pcb->rcv_wnd; + if((TCPH_FLAGS((cseg)->tcphdr) & TCP_SYN) || (TCPH_FLAGS((cseg)->tcphdr) & TCP_FIN)) { + cseg->len -= 1; + } + pbuf_realloc(cseg->p, cseg->len); + tcp_segs_free(cseg->next); + cseg->next = NULL; + } +#endif pcb->rcv_nxt += TCP_TCPLEN(cseg); LWIP_ASSERT("tcp_receive: ooseq tcplen > rcv_wnd\n", pcb->rcv_wnd >= TCP_TCPLEN(cseg)); @@ -1659,6 +1675,17 @@ tcp_receive(struct tcp_pcb *pcb) } /* Adjust length of segment to fit in the window. */ next->next->len = (u16_t)(pcb->rcv_nxt + pcb->rcv_wnd - seqno); +#if ESP_LWIP + if (TCPH_FLAGS(next->next->tcphdr) & TCP_SYN) { + LWIP_DEBUGF(TCP_OOSEQ_DEBUG, + ("tcp_receive: ooseq not trimmed correctly to rcv_wnd " + "seqno=%"U32_F" wnd =%"U32_F" len=%"U16_F"\ + snd_wl1=%"U32_F" snd_wl2 =%"U32_F" f = %"X16_F" tf=%"U16_F"\n", + seqno,pcb->rcv_wnd,next->next->len,pcb->snd_wl1,pcb->snd_wl1,\ + TCPH_FLAGS(next->next->tcphdr),pcb->flags)); + next->next->len -= 1; + } +#endif pbuf_realloc(next->next->p, next->next->len); tcplen = TCP_TCPLEN(next->next); LWIP_ASSERT("tcp_receive: segment not trimmed correctly to rcv_wnd\n", diff --git a/test/unit/esp/lwipopts.h b/test/unit/esp/lwipopts.h index a07fdc3b..08aeb496 100644 --- a/test/unit/esp/lwipopts.h +++ b/test/unit/esp/lwipopts.h @@ -20,6 +20,7 @@ limitations under the License. #define SNTP_SERVER_DNS 0 #define LWIP_HAVE_LOOPIF 1 #define LWIP_NETIF_HOSTNAME 1 +#define TCP_OOSEQ_DEBUG LWIP_DBG_ON /* ESP specific cofiguration */ #define ESP_LWIP 1