tcp: Add logic to check for SYN w/ data in tcp_simple_retransmit
authorAlexander Duyck <alexanderduyck@fb.com>
Sat, 12 Dec 2020 20:31:24 +0000 (12:31 -0800)
committerJakub Kicinski <kuba@kernel.org>
Tue, 15 Dec 2020 03:29:55 +0000 (19:29 -0800)
commitc31b70c9968fe9c4194d1b5d06d07596a3b680de
tree94e7cec49dd4862a129fe3d3c0273c1bd4532131
parentca0b272b48f3adc112112a481f9f117f8308abf1
tcp: Add logic to check for SYN w/ data in tcp_simple_retransmit

There are cases where a fastopen SYN may trigger either a ICMP_TOOBIG
message in the case of IPv6 or a fragmentation request in the case of
IPv4. This results in the socket stalling for a second or more as it does
not respond to the message by retransmitting the SYN frame.

Normally a SYN frame should not be able to trigger a ICMP_TOOBIG or
ICMP_FRAG_NEEDED however in the case of fastopen we can have a frame that
makes use of the entire MSS. In the case of fastopen it does, and an
additional complication is that the retransmit queue doesn't contain the
original frames. As a result when tcp_simple_retransmit is called and
walks the list of frames in the queue it may not mark the frames as lost
because both the SYN and the data packet each individually are smaller than
the MSS size after the adjustment. This results in the socket being stalled
until the retransmit timer kicks in and forces the SYN frame out again
without the data attached.

In order to resolve this we can reduce the MSS the packets are compared
to in tcp_simple_retransmit to -1 for cases where we are still in the
TCP_SYN_SENT state for a fastopen socket. Doing this we will mark all of
the packets related to the fastopen SYN as lost.

Signed-off-by: Alexander Duyck <alexanderduyck@fb.com>
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Yuchung Cheng <ycheng@google.com>
Link: https://lore.kernel.org/r/160780498125.3272.15437756269539236825.stgit@localhost.localdomain
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/ipv4/tcp_input.c