From a91c50243ef457aa1bc6f866e6c402b2c0df4a65 Mon Sep 17 00:00:00 2001 From: zhanghongyu Date: Fri, 7 Nov 2025 17:34:36 +0800 Subject: [PATCH] net/tcp: send reset when retransmitted number greater than TCP_MAXRTX in the current process, if tcpstate is at TCP_FIN_WAIT_1, TCP_CLOSING, and TCP_LAST_ACK, and the peer does not reply TCP_ACK, it will be retransmitted permanently. to avoid continuous occupation of resources, now when the retransmission equals TCP_MAXRTX, a reset message will be sent and the conn resources will be reclaimed in tcp_close_work. Signed-off-by: zhanghongyu --- net/tcp/tcp_timer.c | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/net/tcp/tcp_timer.c b/net/tcp/tcp_timer.c index be78056f191..d732a4e3af3 100644 --- a/net/tcp/tcp_timer.c +++ b/net/tcp/tcp_timer.c @@ -552,32 +552,26 @@ void tcp_timer(FAR struct net_driver_s *dev, FAR struct tcp_conn_s *conn) else if ( #ifdef CONFIG_NET_TCP_WRITE_BUFFERS -# ifdef CONFIG_NET_SENDFILE - (!conn->sendfile && conn->expired > 0) || - (conn->sendfile && conn->nrtx >= TCP_MAXRTX) || -# else conn->expired > 0 || -# endif -#else - conn->nrtx >= TCP_MAXRTX || #endif + (conn->tcpstateflags != TCP_SYN_SENT && + conn->nrtx >= TCP_MAXRTX) || (conn->tcpstateflags == TCP_SYN_SENT && - conn->nrtx >= TCP_MAXSYNRTX) - ) + conn->nrtx >= TCP_MAXSYNRTX)) { conn->tcpstateflags = TCP_CLOSED; ninfo("TCP state: TCP_CLOSED\n"); - /* We call tcp_callback() with TCP_TIMEDOUT to + /* We send a reset packet to the remote host. */ + + tcp_send(dev, conn, TCP_RST | TCP_ACK, hdrlen); + + /* We also call tcp_callback() with TCP_TIMEDOUT to * inform the application that the connection has * timed out. */ tcp_callback(dev, conn, TCP_TIMEDOUT); - - /* We also send a reset packet to the remote host. */ - - tcp_send(dev, conn, TCP_RST | TCP_ACK, hdrlen); goto done; }