tcp: timestamp SYN+DATA messages
authorEric Dumazet <edumazet@google.com>
Mon, 10 Mar 2014 00:36:02 +0000 (17:36 -0700)
committerDavid S. Miller <davem@davemloft.net>
Mon, 10 Mar 2014 20:15:54 +0000 (16:15 -0400)
All skb in socket write queue should be properly timestamped.

In case of FastOpen, we special case the SYN+DATA 'message' as we
queue in socket wrote queue the two fallback skbs:

1) SYN message by itself.
2) DATA segment by itself.

We should make sure these skbs have proper timestamps.

Add a WARN_ON_ONCE() to eventually catch future violations.

Fixes: 740b0f1841f6 ("tcp: switch rtt estimations to usec resolution")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Cc: Neal Cardwell <ncardwell@google.com>
Cc: Yuchung Cheng <ycheng@google.com>
Acked-by: Neal Cardwell <ncardwell@google.com>
Acked-by: Yuchung Cheng <ycheng@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/tcp_input.c
net/ipv4/tcp_output.c

index b99003f556d8d6b41110046047766794ae029bd1..e1661f46fd19fb588555e9f769b9eed2c02fd27d 100644 (file)
@@ -3067,6 +3067,7 @@ static int tcp_clean_rtx_queue(struct sock *sk, int prior_fackets,
                        flag |= FLAG_RETRANS_DATA_ACKED;
                } else {
                        last_ackt = skb->skb_mstamp;
+                       WARN_ON_ONCE(last_ackt.v64 == 0);
                        if (!first_ackt.v64)
                                first_ackt = last_ackt;
 
index bc0fb0fc755253d55366d915bea8dc0621114fef..5a163de5e142f80edb2cf9bd4228437f56896a22 100644 (file)
@@ -2972,6 +2972,12 @@ static int tcp_send_syn_data(struct sock *sk, struct sk_buff *syn)
        tcp_connect_queue_skb(sk, data);
        fo->copied = data->len;
 
+       /* syn_data is about to be sent, we need to take current time stamps
+        * for the packets that are in write queue : SYN packet and DATA
+        */
+       skb_mstamp_get(&syn->skb_mstamp);
+       data->skb_mstamp = syn->skb_mstamp;
+
        if (tcp_transmit_skb(sk, syn_data, 0, sk->sk_allocation) == 0) {
                tp->syn_data = (fo->copied > 0);
                NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPORIGDATASENT);