diff --git a/net/tcp/tcp_send.c b/net/tcp/tcp_send.c index 9e6dd4e523ed5..02e289ee56374 100644 --- a/net/tcp/tcp_send.c +++ b/net/tcp/tcp_send.c @@ -382,7 +382,6 @@ void tcp_send(FAR struct net_driver_s *dev, FAR struct tcp_conn_s *conn, void tcp_reset(FAR struct net_driver_s *dev, FAR struct tcp_conn_s *conn) { FAR struct tcp_hdr_s *tcp; - uint32_t ackno; uint16_t tmp16; uint16_t acklen = 0; uint8_t seqbyte; @@ -437,7 +436,6 @@ void tcp_reset(FAR struct net_driver_s *dev, FAR struct tcp_conn_s *conn) acklen -= (tcp->tcpoffset >> 4) << 2; - tcp->flags = TCP_RST | TCP_ACK; tcp->tcpoffset = 5 << 4; /* Flip the seqno and ackno fields in the TCP header. */ @@ -463,9 +461,19 @@ void tcp_reset(FAR struct net_driver_s *dev, FAR struct tcp_conn_s *conn) * to propagate the carry to the other bytes as well. */ - ackno = tcp_addsequence(tcp->ackno, acklen); - - tcp_setsequence(tcp->ackno, ackno); + if ((tcp->flags & TCP_ACK) != 0) + { + tcp->flags = TCP_RST; + tcp_setsequence(tcp->ackno, 0); + } + else + { + uint32_t ackno; + tcp->flags = TCP_RST | TCP_ACK; + tcp_setsequence(tcp->seqno, 0); + ackno = tcp_addsequence(tcp->ackno, acklen); + tcp_setsequence(tcp->ackno, ackno); + } /* Swap port numbers. */