net-timestamp: cumulative tcp timestamping fixes
authorWillem de Bruijn <willemb@google.com>
Wed, 6 Aug 2014 19:09:44 +0000 (15:09 -0400)
committerDavid S. Miller <davem@davemloft.net>
Wed, 6 Aug 2014 21:09:01 +0000 (14:09 -0700)
A set of small fixes pointed out just after the merge:
- make tcp_tx_timestamp static
- make tcp_gso_tstamp static
- use before() to compare TCP seqno, instead of cast to u64
- add tstamp to tx_flags in GSO, instead of overwrite tx_flags
- record skb_shinfo(skb)->tskey for all timestamps, also HW.
- optimization in tcp_tx_timestamp:
  call sock_tx_timestamp only if a tstamp option is set.

Signed-off-by: Willem de Bruijn <willemb@google.com>
Fixes: 4ed2d765dfac ("net-timestamp: TCP timestamping")
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/tcp.c
net/ipv4/tcp_offload.c

index 744af67..181b70e 100644 (file)
@@ -426,13 +426,15 @@ void tcp_init_sock(struct sock *sk)
 }
 EXPORT_SYMBOL(tcp_init_sock);
 
-void tcp_tx_timestamp(struct sock *sk, struct sk_buff *skb)
+static void tcp_tx_timestamp(struct sock *sk, struct sk_buff *skb)
 {
-       struct skb_shared_info *shinfo = skb_shinfo(skb);
+       if (sk->sk_tsflags) {
+               struct skb_shared_info *shinfo = skb_shinfo(skb);
 
-       sock_tx_timestamp(sk, &shinfo->tx_flags);
-       if (shinfo->tx_flags & SKBTX_ANY_SW_TSTAMP)
-               shinfo->tskey = TCP_SKB_CB(skb)->seq + skb->len - 1;
+               sock_tx_timestamp(sk, &shinfo->tx_flags);
+               if (shinfo->tx_flags & SKBTX_ANY_TSTAMP)
+                       shinfo->tskey = TCP_SKB_CB(skb)->seq + skb->len - 1;
+       }
 }
 
 /*
index f597119..bc1b83c 100644 (file)
 #include <net/tcp.h>
 #include <net/protocol.h>
 
-void tcp_gso_tstamp(struct sk_buff *skb, unsigned int ts_seq, unsigned int seq,
-                   unsigned int mss)
+static void tcp_gso_tstamp(struct sk_buff *skb, unsigned int ts_seq,
+                          unsigned int seq, unsigned int mss)
 {
        while (skb) {
-               if (ts_seq < (__u64) seq + mss) {
-                       skb_shinfo(skb)->tx_flags = SKBTX_SW_TSTAMP;
+               if (before(ts_seq, seq + mss)) {
+                       skb_shinfo(skb)->tx_flags |= SKBTX_SW_TSTAMP;
                        skb_shinfo(skb)->tskey = ts_seq;
                        return;
                }