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