tcp: bug fix Fast Open client retransmission
If SYN-ACK partially acks SYN-data, the client retransmits the remaining data by tcp_retransmit_skb(). This increments lost recovery state variables like tp->retrans_out in Open state. If loss recovery happens before the retransmission is acked, it triggers the WARN_ON check in tcp_fastretrans_alert(). For example: the client sends SYN-data, gets SYN-ACK acking only ISN, retransmits data, sends another 4 data packets and get 3 dupacks. Since the retransmission is not caused by network drop it should not update the recovery state variables. Further the server may return a smaller MSS than the cached MSS used for SYN-data, so the retranmission needs a loop. Otherwise some data will not be retransmitted until timeout or other loss recovery events. Signed-off-by: Yuchung Cheng <ycheng@google.com> Acked-by: Neal Cardwell <ncardwell@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
1afa471706
commit
93b174ad71
@@ -5645,7 +5645,11 @@ static bool tcp_rcv_fastopen_synack(struct sock *sk, struct sk_buff *synack,
|
||||
tcp_fastopen_cache_set(sk, mss, cookie, syn_drop);
|
||||
|
||||
if (data) { /* Retransmit unacked data in SYN */
|
||||
tcp_retransmit_skb(sk, data);
|
||||
tcp_for_write_queue_from(data, sk) {
|
||||
if (data == tcp_send_head(sk) ||
|
||||
__tcp_retransmit_skb(sk, data))
|
||||
break;
|
||||
}
|
||||
tcp_rearm_rto(sk);
|
||||
return true;
|
||||
}
|
||||
|
Reference in New Issue
Block a user