|
@@ -582,9 +582,12 @@ static inline void tcp_rcv_rtt_measure_ts(struct sock *sk,
|
|
|
{
|
|
|
struct tcp_sock *tp = tcp_sk(sk);
|
|
|
|
|
|
- if (tp->rx_opt.rcv_tsecr &&
|
|
|
- (TCP_SKB_CB(skb)->end_seq -
|
|
|
- TCP_SKB_CB(skb)->seq >= inet_csk(sk)->icsk_ack.rcv_mss)) {
|
|
|
+ if (tp->rx_opt.rcv_tsecr == tp->rcv_rtt_last_tsecr)
|
|
|
+ return;
|
|
|
+ tp->rcv_rtt_last_tsecr = tp->rx_opt.rcv_tsecr;
|
|
|
+
|
|
|
+ if (TCP_SKB_CB(skb)->end_seq -
|
|
|
+ TCP_SKB_CB(skb)->seq >= inet_csk(sk)->icsk_ack.rcv_mss) {
|
|
|
u32 delta = tcp_time_stamp(tp) - tp->rx_opt.rcv_tsecr;
|
|
|
u32 delta_us;
|
|
|
|
|
@@ -5475,6 +5478,11 @@ void tcp_rcv_established(struct sock *sk, struct sk_buff *skb)
|
|
|
tcp_ack(sk, skb, 0);
|
|
|
__kfree_skb(skb);
|
|
|
tcp_data_snd_check(sk);
|
|
|
+ /* When receiving pure ack in fast path, update
|
|
|
+ * last ts ecr directly instead of calling
|
|
|
+ * tcp_rcv_rtt_measure_ts()
|
|
|
+ */
|
|
|
+ tp->rcv_rtt_last_tsecr = tp->rx_opt.rcv_tsecr;
|
|
|
return;
|
|
|
} else { /* Header too small */
|
|
|
TCP_INC_STATS(sock_net(sk), TCP_MIB_INERRS);
|