|
@@ -5567,9 +5567,12 @@ static bool tcp_rcv_fastopen_synack(struct sock *sk, struct sk_buff *synack,
|
|
|
return true;
|
|
|
}
|
|
|
tp->syn_data_acked = tp->syn_data;
|
|
|
- if (tp->syn_data_acked)
|
|
|
- NET_INC_STATS(sock_net(sk),
|
|
|
- LINUX_MIB_TCPFASTOPENACTIVE);
|
|
|
+ if (tp->syn_data_acked) {
|
|
|
+ NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPFASTOPENACTIVE);
|
|
|
+ /* SYN-data is counted as two separate packets in tcp_ack() */
|
|
|
+ if (tp->delivered > 1)
|
|
|
+ --tp->delivered;
|
|
|
+ }
|
|
|
|
|
|
tcp_fastopen_add_skb(sk, synack);
|
|
|
|
|
@@ -5901,6 +5904,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb)
|
|
|
}
|
|
|
switch (sk->sk_state) {
|
|
|
case TCP_SYN_RECV:
|
|
|
+ tp->delivered++; /* SYN-ACK delivery isn't tracked in tcp_ack */
|
|
|
if (!tp->srtt_us)
|
|
|
tcp_synack_rtt_meas(sk, req);
|
|
|
|