mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-25 21:24:08 +08:00
tcp: consider using standard rtx logic in tcp_rcv_fastopen_synack()
Jakub reported Data included in a Fastopen SYN that had to be retransmit would have to wait for an RTO if TX completions are slow, even with prior fix. This is because tcp_rcv_fastopen_synack() does not use standard rtx logic, meaning TSQ handler exits early in tcp_tsq_write() because tp->lost_out == tp->retrans_out Lets make tcp_rcv_fastopen_synack() use standard rtx logic, by using tcp_mark_skb_lost() on the skb thats needs to be sent again. Not this raised a warning in tcp_fastretrans_alert() during my tests since we consider the data not being aknowledged by the receiver does not mean packet was lost on the network. Signed-off-by: Eric Dumazet <edumazet@google.com> Reported-by: Jakub Kicinski <kuba@kernel.org> Cc: Neal Cardwell <ncardwell@google.com> Cc: Yuchung Cheng <ycheng@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
f4dae54e48
commit
a7abf3cd76
@ -2914,7 +2914,7 @@ static void tcp_fastretrans_alert(struct sock *sk, const u32 prior_snd_una,
|
||||
/* D. Check state exit conditions. State can be terminated
|
||||
* when high_seq is ACKed. */
|
||||
if (icsk->icsk_ca_state == TCP_CA_Open) {
|
||||
WARN_ON(tp->retrans_out != 0);
|
||||
WARN_ON(tp->retrans_out != 0 && !tp->syn_data);
|
||||
tp->retrans_stamp = 0;
|
||||
} else if (!before(tp->snd_una, tp->high_seq)) {
|
||||
switch (icsk->icsk_ca_state) {
|
||||
@ -5994,11 +5994,9 @@ static bool tcp_rcv_fastopen_synack(struct sock *sk, struct sk_buff *synack,
|
||||
tp->fastopen_client_fail = TFO_SYN_RETRANSMITTED;
|
||||
else
|
||||
tp->fastopen_client_fail = TFO_DATA_NOT_ACKED;
|
||||
skb_rbtree_walk_from(data) {
|
||||
if (__tcp_retransmit_skb(sk, data, 1))
|
||||
break;
|
||||
}
|
||||
tcp_rearm_rto(sk);
|
||||
skb_rbtree_walk_from(data)
|
||||
tcp_mark_skb_lost(sk, data);
|
||||
tcp_xmit_retransmit_queue(sk);
|
||||
NET_INC_STATS(sock_net(sk),
|
||||
LINUX_MIB_TCPFASTOPENACTIVEFAIL);
|
||||
return true;
|
||||
|
Loading…
Reference in New Issue
Block a user