tcp: setup timestamp offset when write_seq already set
Found that when randomized tcp offsets are enabled (by default)
TCP client can still start new connections without them. Later,
if server does active close and re-uses sockets in TIME-WAIT
state, new SYN from client can be rejected on PAWS check inside
tcp_timewait_state_process(), because either tw_ts_recent or
rcv_tsval doesn't really have an offset set.
Here is how to reproduce it with LTP netstress tool:
netstress -R 1 &
netstress -H 127.0.0.1 -lr
1000000 -a1
[...]
< S seq
1956977072 win 43690 TS val 295618 ecr
459956970
> . ack
1956911535 win 342 TS val
459967184 ecr
1547117608
< R seq
1956911535 win 0 length 0
+1. < S seq
1956977072 win 43690 TS val 296640 ecr
459956970
> S. seq
657450664 ack
1956977073 win 43690 TS val
459968205 ecr 296640
Fixes:
95a22caee396 ("tcp: randomize tcp timestamp offsets for each connection")
Signed-off-by: Alexey Kodanev <alexey.kodanev@oracle.com>
Acked-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>