Allow disabling TCP timestamp options per route
authorGilad Ben-Yossef <gilad@codefidence.com>
Wed, 28 Oct 2009 04:15:25 +0000 (04:15 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 29 Oct 2009 08:28:45 +0000 (01:28 -0700)
Implement querying and acting upon the no timestamp bit in the feature
field.

Signed-off-by: Gilad Ben-Yossef <gilad@codefidence.com>
Sigend-off-by: Ori Finkelman <ori@comsleep.com>
Sigend-off-by: Yony Amit <yony@comsleep.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/rtnetlink.h
net/ipv4/tcp_input.c
net/ipv4/tcp_output.c

index 9c802a6b04d342de2f47ae4333d552e9711a4231..2ab8c758b46c7acaea3818295b106b63e674adb8 100644 (file)
@@ -378,7 +378,7 @@ enum
 
 #define RTAX_FEATURE_ECN       0x00000001
 #define RTAX_FEATURE_NO_SACK   0x00000002
-#define RTAX_FEATURE_TIMESTAMP 0x00000004
+#define RTAX_FEATURE_NO_TSTAMP 0x00000004
 #define RTAX_FEATURE_ALLFRAG   0x00000008
 
 struct rta_session
index 5fb25f97745188be000c5b6c0b8073da60f0eb44..6097491aa9fcd55e1098c361000be9450699e450 100644 (file)
@@ -3755,7 +3755,8 @@ void tcp_parse_options(struct sk_buff *skb, struct tcp_options_received *opt_rx,
                        case TCPOPT_TIMESTAMP:
                                if ((opsize == TCPOLEN_TIMESTAMP) &&
                                    ((estab && opt_rx->tstamp_ok) ||
-                                    (!estab && sysctl_tcp_timestamps))) {
+                                    (!estab && sysctl_tcp_timestamps &&
+                                     !dst_feature(dst, RTAX_FEATURE_NO_TSTAMP)))) {
                                        opt_rx->saw_tstamp = 1;
                                        opt_rx->rcv_tsval = get_unaligned_be32(ptr);
                                        opt_rx->rcv_tsecr = get_unaligned_be32(ptr + 4);
index b35802af3c4c45dc97ee8813a38df7cad8c67c30..8819eba8ebb8b26225e8c9d4c6f27fd4da41f83f 100644 (file)
@@ -488,7 +488,9 @@ static unsigned tcp_syn_options(struct sock *sk, struct sk_buff *skb,
        opts->mss = tcp_advertise_mss(sk);
        size += TCPOLEN_MSS_ALIGNED;
 
-       if (likely(sysctl_tcp_timestamps && *md5 == NULL)) {
+       if (likely(sysctl_tcp_timestamps &&
+                  !dst_feature(dst, RTAX_FEATURE_NO_TSTAMP) &&
+                  *md5 == NULL)) {
                opts->options |= OPTION_TS;
                opts->tsval = TCP_SKB_CB(skb)->when;
                opts->tsecr = tp->rx_opt.ts_recent;
@@ -2317,7 +2319,9 @@ static void tcp_connect_init(struct sock *sk)
         * See tcp_input.c:tcp_rcv_state_process case TCP_SYN_SENT.
         */
        tp->tcp_header_len = sizeof(struct tcphdr) +
-               (sysctl_tcp_timestamps ? TCPOLEN_TSTAMP_ALIGNED : 0);
+               (sysctl_tcp_timestamps &&
+               (!dst_feature(dst, RTAX_FEATURE_NO_TSTAMP) ?
+                 TCPOLEN_TSTAMP_ALIGNED : 0));
 
 #ifdef CONFIG_TCP_MD5SIG
        if (tp->af_specific->md5_lookup(sk, sk) != NULL)