tcp: improve handling of SYN-ACK segments in TIMEWAIT state

Only consider segments with the SYN bit set and the ACK bit cleared
as "new connection attempts", which result in re-using a connection
being in TIMEWAIT state. This results in consistent handling of
SYN-ACK segments.

Reviewed by:		rscheff@
MFC after:		1 week
Sponsored by:		Netflix, Inc.
Differential Revision:	https://reviews.freebsd.org/D36864
This commit is contained in:
Michael Tuexen 2022-10-03 14:46:47 +02:00
parent dcdba3460d
commit 2515552e62

View File

@ -464,13 +464,13 @@ tcp_twcheck(struct inpcb *inp, struct tcpopt *to, struct tcphdr *th,
* are above the previous ones.
* Allow UDP port number changes in this case.
*/
if ((thflags & TH_SYN) && SEQ_GT(th->th_seq, tw->rcv_nxt)) {
if (((thflags & (TH_SYN | TH_ACK)) == TH_SYN) &&
SEQ_GT(th->th_seq, tw->rcv_nxt)) {
/*
* In case we can't upgrade our lock just pretend we have
* lost this packet.
*/
if (((thflags & (TH_SYN | TH_ACK)) == TH_SYN) &&
INP_TRY_UPGRADE(inp) == 0)
if (INP_TRY_UPGRADE(inp) == 0)
goto drop;
tcp_twclose(tw, 0);
TCPSTAT_INC(tcps_tw_recycles);