You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by pk...@apache.org on 2022/07/12 08:04:45 UTC
[incubator-nuttx] branch master updated: net/tcp: fix regression of invalid update the rexmit_seq in buffer mode
This is an automated email from the ASF dual-hosted git repository.
pkarashchenko pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new 1c80675e87 net/tcp: fix regression of invalid update the rexmit_seq in buffer mode
1c80675e87 is described below
commit 1c80675e87521f2868592337c1d715f4ae597ea3
Author: chao.an <an...@xiaomi.com>
AuthorDate: Mon Jul 4 00:58:44 2022 +0800
net/tcp: fix regression of invalid update the rexmit_seq in buffer mode
fix regression of invalid update the rexmit_seq in buffer mode
rexmit_seq should not be used instead of sndseq in fast retransmission,
sndseq of retransmission in the packet does not need to be re-updated
Signed-off-by: chao.an <an...@xiaomi.com>
---
net/tcp/tcp.h | 3 +++
net/tcp/tcp_appsend.c | 30 +++++++++++++++++++-----------
net/tcp/tcp_send_buffered.c | 3 ---
3 files changed, 22 insertions(+), 14 deletions(-)
diff --git a/net/tcp/tcp.h b/net/tcp/tcp.h
index 78147ed352..c11550d742 100644
--- a/net/tcp/tcp.h
+++ b/net/tcp/tcp.h
@@ -175,7 +175,10 @@ struct tcp_conn_s
uint8_t rcvseq[4]; /* The sequence number that we expect to
* receive next */
uint8_t sndseq[4]; /* The sequence number that was last sent by us */
+#if !defined(CONFIG_NET_TCP_WRITE_BUFFERS) || \
+ defined(CONFIG_NET_SENDFILE)
uint32_t rexmit_seq; /* The sequence number to be retrasmitted */
+#endif
uint8_t crefs; /* Reference counts on this instance */
#if defined(CONFIG_NET_IPv4) && defined(CONFIG_NET_IPv6)
uint8_t domain; /* IP domain: PF_INET or PF_INET6 */
diff --git a/net/tcp/tcp_appsend.c b/net/tcp/tcp_appsend.c
index 39b120f3d8..1f87f87431 100644
--- a/net/tcp/tcp_appsend.c
+++ b/net/tcp/tcp_appsend.c
@@ -322,23 +322,31 @@ void tcp_rexmit(FAR struct net_driver_s *dev, FAR struct tcp_conn_s *conn,
* new data in it, we must send out a packet.
*/
- if ((result & TCP_REXMIT) != 0 &&
- dev->d_sndlen > 0 && conn->tx_unacked > 0)
+#if defined(CONFIG_NET_TCP_WRITE_BUFFERS) && defined(CONFIG_NET_SENDFILE)
+ if (conn->sendfile)
+#endif
{
- uint32_t saveseq;
+#if !defined(CONFIG_NET_TCP_WRITE_BUFFERS) || defined(CONFIG_NET_SENDFILE)
+ if ((result & TCP_REXMIT) != 0 &&
+ dev->d_sndlen > 0 && conn->tx_unacked > 0 &&
+ conn->rexmit_seq > 0)
+ {
+ uint32_t saveseq;
- /* According to RFC 6298 (5.4), retransmit the earliest segment
- * that has not been acknowledged by the TCP receiver.
- */
+ /* According to RFC 6298 (5.4), retransmit the earliest segment
+ * that has not been acknowledged by the TCP receiver.
+ */
- saveseq = tcp_getsequence(conn->sndseq);
- tcp_setsequence(conn->sndseq, conn->rexmit_seq);
+ saveseq = tcp_getsequence(conn->sndseq);
+ tcp_setsequence(conn->sndseq, conn->rexmit_seq);
- tcp_send(dev, conn, TCP_ACK | TCP_PSH, dev->d_sndlen + hdrlen);
+ tcp_send(dev, conn, TCP_ACK | TCP_PSH, dev->d_sndlen + hdrlen);
- tcp_setsequence(conn->sndseq, saveseq);
+ tcp_setsequence(conn->sndseq, saveseq);
- return;
+ return;
+ }
+#endif
}
#if defined(CONFIG_NET_TCP_WRITE_BUFFERS)
diff --git a/net/tcp/tcp_send_buffered.c b/net/tcp/tcp_send_buffered.c
index d00962c8ae..752a2920e6 100644
--- a/net/tcp/tcp_send_buffered.c
+++ b/net/tcp/tcp_send_buffered.c
@@ -594,8 +594,6 @@ static uint16_t psock_send_eventhandler(FAR struct net_driver_s *dev,
continue;
}
- conn->rexmit_seq = rexmitno;
-
/* Reconstruct the length of the earliest segment to be
* retransmitted.
*/
@@ -612,7 +610,6 @@ static uint16_t psock_send_eventhandler(FAR struct net_driver_s *dev,
*/
DEBUGASSERT(TCP_WBSEQNO(wrb) != (unsigned)-1);
- conn->rexmit_seq = TCP_WBSEQNO(wrb);
#ifdef NEED_IPDOMAIN_SUPPORT
/* If both IPv4 and IPv6 support are enabled, then we will need to