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