lwip/0045-add-dataack-when-recv-too-many-acks-with-data.patch
kircher 99cde8fa34 do not update cwnd when send dataack
(cherry picked from commit a3f13126c69279a93f6dd60385158683458c59f2)
2022-12-21 18:24:41 +08:00

92 lines
2.8 KiB
Diff

From fe99dca0fa972f3c934a91e587380f140e093306 Mon Sep 17 00:00:00 2001
From: kircher <majun65@huawei.com>
Date: Wed, 21 Dec 2022 17:34:17 +0800
Subject: [PATCH] add dataack when recv too many acks with data
---
src/core/tcp_in.c | 22 ++++++++++++++++++++++
src/include/lwip/tcp.h | 1 +
src/include/lwipopts.h | 2 ++
3 files changed, 25 insertions(+)
diff --git a/src/core/tcp_in.c b/src/core/tcp_in.c
index a5aebb4..9e84889 100644
--- a/src/core/tcp_in.c
+++ b/src/core/tcp_in.c
@@ -1259,6 +1259,7 @@ tcp_receive(struct tcp_pcb *pcb)
s16_t m;
u32_t right_wnd_edge;
int found_dupack = 0;
+ int found_dataack = 0;
LWIP_ASSERT("tcp_receive: invalid pcb", pcb != NULL);
LWIP_ASSERT("tcp_receive: wrong state", pcb->state >= ESTABLISHED);
@@ -1336,11 +1337,31 @@ tcp_receive(struct tcp_pcb *pcb)
}
}
}
+ /* fast rexmit when receive too many acks with data */
+ if (TCP_SEQ_LT(ackno + 1, pcb->snd_nxt)) {
+ if (pcb->snd_wl2 + pcb->snd_wnd == right_wnd_edge) {
+ if (pcb->rtime >= 0) {
+ if (pcb->lastack == ackno) {
+ found_dataack = 1;
+ ++pcb->dataacks;
+ if (pcb->dataacks > MAX_DATA_ACK_NUM) {
+ if (tcp_rexmit(pcb) == ERR_OK) {
+ pcb->rtime = 0;
+ pcb->dataacks = 0;
+ }
+ }
+ }
+ }
+ }
+ }
/* If Clause (1) or more is true, but not a duplicate ack, reset
* count of consecutive duplicate acks */
if (!found_dupack) {
pcb->dupacks = 0;
}
+ if (!found_dataack) {
+ pcb->dataacks = 0;
+ }
} else if (TCP_SEQ_BETWEEN(ackno, pcb->lastack + 1, pcb->snd_nxt)) {
/* We come here when the ACK acknowledges new data. */
tcpwnd_size_t acked;
@@ -1366,6 +1387,7 @@ tcp_receive(struct tcp_pcb *pcb)
/* Reset the fast retransmit variables. */
pcb->dupacks = 0;
pcb->lastack = ackno;
+ pcb->dataacks = 0;
/* Update the congestion control variables (cwnd and
ssthresh). */
diff --git a/src/include/lwip/tcp.h b/src/include/lwip/tcp.h
index 2a61776..97cb882 100644
--- a/src/include/lwip/tcp.h
+++ b/src/include/lwip/tcp.h
@@ -326,6 +326,7 @@ struct tcp_pcb {
/* fast retransmit/recovery */
u8_t dupacks;
+ u32_t dataacks;
u32_t lastack; /* Highest acknowledged seqno. */
/* congestion avoidance/control variables */
diff --git a/src/include/lwipopts.h b/src/include/lwipopts.h
index 907c630..405cf11 100644
--- a/src/include/lwipopts.h
+++ b/src/include/lwipopts.h
@@ -177,6 +177,8 @@
#define MIN_TSO_SEG_LEN 256
+#define MAX_DATA_ACK_NUM 256
+
/* ---------------------------------------
* ------- NIC offloads --------
* ---------------------------------------
--
2.33.0