1195972f6Sopenharmony_ciFrom f1692b0c380241699f70adbf7796cb2c7b3a5c94 Mon Sep 17 00:00:00 2001
2195972f6Sopenharmony_ciFrom: jiangheng12 <jiangheng14@huawei.com>
3195972f6Sopenharmony_ciDate: Sat, 1 Apr 2023 16:59:28 +0800
4195972f6Sopenharmony_ciSubject: [PATCH] fix last_unsent/last_unacked
5195972f6Sopenharmony_ci
6195972f6Sopenharmony_ci---
7195972f6Sopenharmony_ci src/core/tcp_in.c  | 25 +++++++++++++------------
8195972f6Sopenharmony_ci src/core/tcp_out.c | 18 +++++++++++++-----
9195972f6Sopenharmony_ci 2 files changed, 26 insertions(+), 17 deletions(-)
10195972f6Sopenharmony_ci
11195972f6Sopenharmony_cidiff --git a/src/core/tcp_in.c b/src/core/tcp_in.c
12195972f6Sopenharmony_ciindex 719cf04..7e7d70a 100644
13195972f6Sopenharmony_ci--- a/src/core/tcp_in.c
14195972f6Sopenharmony_ci+++ b/src/core/tcp_in.c
15195972f6Sopenharmony_ci@@ -1375,18 +1375,19 @@ tcp_receive(struct tcp_pcb *pcb)
16195972f6Sopenharmony_ci             }
17195972f6Sopenharmony_ci           }
18195972f6Sopenharmony_ci         }
19195972f6Sopenharmony_ci-      }
20195972f6Sopenharmony_ci-      /* fast rexmit when receive too many acks with data */
21195972f6Sopenharmony_ci-      if (TCP_SEQ_LT(ackno + 1, pcb->snd_nxt)) {
22195972f6Sopenharmony_ci-        if (pcb->snd_wl2 + pcb->snd_wnd == right_wnd_edge) {
23195972f6Sopenharmony_ci-          if (pcb->rtime >= 0) {
24195972f6Sopenharmony_ci-            if (pcb->lastack == ackno) {
25195972f6Sopenharmony_ci-              found_dataack = 1;
26195972f6Sopenharmony_ci-              ++pcb->dataacks;
27195972f6Sopenharmony_ci-              if (pcb->dataacks > GAZELLE_TCP_MAX_DATA_ACK_NUM) {
28195972f6Sopenharmony_ci-                if (tcp_rexmit(pcb) == ERR_OK) {
29195972f6Sopenharmony_ci-                  pcb->rtime = 0;
30195972f6Sopenharmony_ci-                  pcb->dataacks = 0;
31195972f6Sopenharmony_ci+      } else {
32195972f6Sopenharmony_ci+        /* fast rexmit when receive too many acks with data */
33195972f6Sopenharmony_ci+        if (TCP_SEQ_LT(ackno + 1, pcb->snd_nxt)) {
34195972f6Sopenharmony_ci+          if (pcb->snd_wl2 + pcb->snd_wnd == right_wnd_edge) {
35195972f6Sopenharmony_ci+            if (pcb->rtime >= 0) {
36195972f6Sopenharmony_ci+              if (pcb->lastack == ackno) {
37195972f6Sopenharmony_ci+                found_dataack = 1;
38195972f6Sopenharmony_ci+                ++pcb->dataacks;
39195972f6Sopenharmony_ci+                if ((pcb->dataacks > GAZELLE_TCP_MAX_DATA_ACK_NUM) && (pcb->nrtx < (TCP_MAXRTX / 2))) {
40195972f6Sopenharmony_ci+                  if (tcp_rexmit(pcb) == ERR_OK) {
41195972f6Sopenharmony_ci+                    pcb->rtime = 0;
42195972f6Sopenharmony_ci+                    pcb->dataacks = 0;
43195972f6Sopenharmony_ci+                  }
44195972f6Sopenharmony_ci                 }
45195972f6Sopenharmony_ci               }
46195972f6Sopenharmony_ci             }
47195972f6Sopenharmony_cidiff --git a/src/core/tcp_out.c b/src/core/tcp_out.c
48195972f6Sopenharmony_ciindex b1c317d..6250e6b 100644
49195972f6Sopenharmony_ci--- a/src/core/tcp_out.c
50195972f6Sopenharmony_ci+++ b/src/core/tcp_out.c
51195972f6Sopenharmony_ci@@ -1444,10 +1444,7 @@ tcp_output(struct tcp_pcb *pcb)
52195972f6Sopenharmony_ci   pcb->persist_backoff = 0;
53195972f6Sopenharmony_ci 
54195972f6Sopenharmony_ci   /* useg should point to last segment on unacked queue */
55195972f6Sopenharmony_ci-  useg = pcb->unacked;
56195972f6Sopenharmony_ci-  if (useg != NULL) {
57195972f6Sopenharmony_ci-    for (; useg->next != NULL; useg = useg->next);
58195972f6Sopenharmony_ci-  }
59195972f6Sopenharmony_ci+  useg = pcb->last_unacked;
60195972f6Sopenharmony_ci 
61195972f6Sopenharmony_ci   /* data available and window allows it to be sent? */
62195972f6Sopenharmony_ci #if GAZELLE_ENABLE
63195972f6Sopenharmony_ci@@ -1515,7 +1512,11 @@ tcp_output(struct tcp_pcb *pcb)
64195972f6Sopenharmony_ci             return err;
65195972f6Sopenharmony_ci         }
66195972f6Sopenharmony_ci 
67195972f6Sopenharmony_ci+        if (pcb->last_unsent == pcb->unsent) {
68195972f6Sopenharmony_ci+            pcb->last_unsent = last_seg->next;
69195972f6Sopenharmony_ci+        }
70195972f6Sopenharmony_ci         pcb->unsent = last_seg->next;
71195972f6Sopenharmony_ci+
72195972f6Sopenharmony_ci         if (pcb->state != SYN_SENT) {
73195972f6Sopenharmony_ci             tcp_clear_flags(pcb, TF_ACK_DELAY | TF_ACK_NOW);
74195972f6Sopenharmony_ci         }
75195972f6Sopenharmony_ci@@ -1535,6 +1536,7 @@ tcp_output(struct tcp_pcb *pcb)
76195972f6Sopenharmony_ci             if (TCP_TCPLEN(tmp_seg) > 0) {
77195972f6Sopenharmony_ci                 tmp_seg->next = NULL;
78195972f6Sopenharmony_ci                 if (pcb->unacked == NULL) {
79195972f6Sopenharmony_ci+                    pcb->last_unacked = tmp_seg;
80195972f6Sopenharmony_ci                     pcb->unacked = tmp_seg;
81195972f6Sopenharmony_ci                     useg = tmp_seg;
82195972f6Sopenharmony_ci                 } else {
83195972f6Sopenharmony_ci@@ -1550,6 +1552,9 @@ tcp_output(struct tcp_pcb *pcb)
84195972f6Sopenharmony_ci                     } else {
85195972f6Sopenharmony_ci                         /* add segment to tail of unacked list */
86195972f6Sopenharmony_ci                         useg->next = tmp_seg;
87195972f6Sopenharmony_ci+                        if (pcb->last_unacked == useg) {
88195972f6Sopenharmony_ci+                            pcb->last_unacked = tmp_seg;
89195972f6Sopenharmony_ci+                        }
90195972f6Sopenharmony_ci                         useg = useg->next;
91195972f6Sopenharmony_ci                     }
92195972f6Sopenharmony_ci                 }
93195972f6Sopenharmony_ci@@ -1603,6 +1608,9 @@ end_loop:
94195972f6Sopenharmony_ci #if TCP_OVERSIZE_DBGCHECK
95195972f6Sopenharmony_ci     seg->oversize_left = 0;
96195972f6Sopenharmony_ci #endif /* TCP_OVERSIZE_DBGCHECK */
97195972f6Sopenharmony_ci+    if (pcb->last_unsent == pcb->unsent) {
98195972f6Sopenharmony_ci+      pcb->last_unsent = seg->next;
99195972f6Sopenharmony_ci+    }
100195972f6Sopenharmony_ci     pcb->unsent = seg->next;
101195972f6Sopenharmony_ci     if (pcb->state != SYN_SENT) {
102195972f6Sopenharmony_ci       tcp_clear_flags(pcb, TF_ACK_DELAY | TF_ACK_NOW);
103195972f6Sopenharmony_ci@@ -1709,7 +1717,7 @@ tcp_output_segment(struct tcp_seg *seg, struct tcp_pcb *pcb, struct netif *netif
104195972f6Sopenharmony_ci   int seg_chksum_was_swapped = 0;
105195972f6Sopenharmony_ci #endif
106195972f6Sopenharmony_ci 
107195972f6Sopenharmony_ci-#if USE_LIBOS
108195972f6Sopenharmony_ci+#if GAZELLE_ENABLE
109195972f6Sopenharmony_ci   lstack_calculate_aggregate(1, seg->len);
110195972f6Sopenharmony_ci #endif
111195972f6Sopenharmony_ci 
112195972f6Sopenharmony_ci-- 
113195972f6Sopenharmony_ci2.23.0
114195972f6Sopenharmony_ci
115