1195972f6Sopenharmony_ciFrom 1aa27395a4c4b73b6db472c4ae75ed91637a11bf Mon Sep 17 00:00:00 2001 2195972f6Sopenharmony_ciFrom: kircher <majun65@huawei.com> 3195972f6Sopenharmony_ciDate: Wed, 21 Dec 2022 17:50:50 +0800 4195972f6Sopenharmony_ciSubject: [PATCH] add dataack when recv too many acks with data 5195972f6Sopenharmony_ci 6195972f6Sopenharmony_ci--- 7195972f6Sopenharmony_ci src/core/tcp_in.c | 22 ++++++++++++++++++++++ 8195972f6Sopenharmony_ci src/include/lwip/tcp.h | 1 + 9195972f6Sopenharmony_ci src/include/lwipopts.h | 2 ++ 10195972f6Sopenharmony_ci 3 files changed, 25 insertions(+) 11195972f6Sopenharmony_ci 12195972f6Sopenharmony_cidiff --git a/src/core/tcp_in.c b/src/core/tcp_in.c 13195972f6Sopenharmony_ciindex 78954bd..35ec6d9 100644 14195972f6Sopenharmony_ci--- a/src/core/tcp_in.c 15195972f6Sopenharmony_ci+++ b/src/core/tcp_in.c 16195972f6Sopenharmony_ci@@ -1260,6 +1260,7 @@ tcp_receive(struct tcp_pcb *pcb) 17195972f6Sopenharmony_ci s16_t m; 18195972f6Sopenharmony_ci u32_t right_wnd_edge; 19195972f6Sopenharmony_ci int found_dupack = 0; 20195972f6Sopenharmony_ci+ int found_dataack = 0; 21195972f6Sopenharmony_ci 22195972f6Sopenharmony_ci LWIP_ASSERT("tcp_receive: invalid pcb", pcb != NULL); 23195972f6Sopenharmony_ci LWIP_ASSERT("tcp_receive: wrong state", pcb->state >= ESTABLISHED); 24195972f6Sopenharmony_ci@@ -1337,11 +1338,31 @@ tcp_receive(struct tcp_pcb *pcb) 25195972f6Sopenharmony_ci } 26195972f6Sopenharmony_ci } 27195972f6Sopenharmony_ci } 28195972f6Sopenharmony_ci+ /* fast rexmit when receive too many acks with data */ 29195972f6Sopenharmony_ci+ if (TCP_SEQ_LT(ackno + 1, pcb->snd_nxt)) { 30195972f6Sopenharmony_ci+ if (pcb->snd_wl2 + pcb->snd_wnd == right_wnd_edge) { 31195972f6Sopenharmony_ci+ if (pcb->rtime >= 0) { 32195972f6Sopenharmony_ci+ if (pcb->lastack == ackno) { 33195972f6Sopenharmony_ci+ found_dataack = 1; 34195972f6Sopenharmony_ci+ ++pcb->dataacks; 35195972f6Sopenharmony_ci+ if (pcb->dataacks > MAX_DATA_ACK_NUM) { 36195972f6Sopenharmony_ci+ if (tcp_rexmit(pcb) == ERR_OK) { 37195972f6Sopenharmony_ci+ pcb->rtime = 0; 38195972f6Sopenharmony_ci+ pcb->dataacks = 0; 39195972f6Sopenharmony_ci+ } 40195972f6Sopenharmony_ci+ } 41195972f6Sopenharmony_ci+ } 42195972f6Sopenharmony_ci+ } 43195972f6Sopenharmony_ci+ } 44195972f6Sopenharmony_ci+ } 45195972f6Sopenharmony_ci /* If Clause (1) or more is true, but not a duplicate ack, reset 46195972f6Sopenharmony_ci * count of consecutive duplicate acks */ 47195972f6Sopenharmony_ci if (!found_dupack) { 48195972f6Sopenharmony_ci pcb->dupacks = 0; 49195972f6Sopenharmony_ci } 50195972f6Sopenharmony_ci+ if (!found_dataack) { 51195972f6Sopenharmony_ci+ pcb->dataacks = 0; 52195972f6Sopenharmony_ci+ } 53195972f6Sopenharmony_ci } else if (TCP_SEQ_BETWEEN(ackno, pcb->lastack + 1, pcb->snd_nxt)) { 54195972f6Sopenharmony_ci /* We come here when the ACK acknowledges new data. */ 55195972f6Sopenharmony_ci tcpwnd_size_t acked; 56195972f6Sopenharmony_ci@@ -1367,6 +1388,7 @@ tcp_receive(struct tcp_pcb *pcb) 57195972f6Sopenharmony_ci /* Reset the fast retransmit variables. */ 58195972f6Sopenharmony_ci pcb->dupacks = 0; 59195972f6Sopenharmony_ci pcb->lastack = ackno; 60195972f6Sopenharmony_ci+ pcb->dataacks = 0; 61195972f6Sopenharmony_ci 62195972f6Sopenharmony_ci /* Update the congestion control variables (cwnd and 63195972f6Sopenharmony_ci ssthresh). */ 64195972f6Sopenharmony_cidiff --git a/src/include/lwip/tcp.h b/src/include/lwip/tcp.h 65195972f6Sopenharmony_ciindex 2a61776..97cb882 100644 66195972f6Sopenharmony_ci--- a/src/include/lwip/tcp.h 67195972f6Sopenharmony_ci+++ b/src/include/lwip/tcp.h 68195972f6Sopenharmony_ci@@ -326,6 +326,7 @@ struct tcp_pcb { 69195972f6Sopenharmony_ci 70195972f6Sopenharmony_ci /* fast retransmit/recovery */ 71195972f6Sopenharmony_ci u8_t dupacks; 72195972f6Sopenharmony_ci+ u32_t dataacks; 73195972f6Sopenharmony_ci u32_t lastack; /* Highest acknowledged seqno. */ 74195972f6Sopenharmony_ci 75195972f6Sopenharmony_ci /* congestion avoidance/control variables */ 76195972f6Sopenharmony_cidiff --git a/src/include/lwipopts.h b/src/include/lwipopts.h 77195972f6Sopenharmony_ciindex 907c630..405cf11 100644 78195972f6Sopenharmony_ci--- a/src/include/lwipopts.h 79195972f6Sopenharmony_ci+++ b/src/include/lwipopts.h 80195972f6Sopenharmony_ci@@ -177,6 +177,8 @@ 81195972f6Sopenharmony_ci 82195972f6Sopenharmony_ci #define MIN_TSO_SEG_LEN 256 83195972f6Sopenharmony_ci 84195972f6Sopenharmony_ci+#define MAX_DATA_ACK_NUM 256 85195972f6Sopenharmony_ci+ 86195972f6Sopenharmony_ci /* --------------------------------------- 87195972f6Sopenharmony_ci * ------- NIC offloads -------- 88195972f6Sopenharmony_ci * --------------------------------------- 89195972f6Sopenharmony_ci-- 90195972f6Sopenharmony_ci2.33.0 91195972f6Sopenharmony_ci 92