Allow disabling of DSACK TCP option per route
authorGilad Ben-Yossef <gilad@codefidence.com>
Wed, 28 Oct 2009 04:15:27 +0000 (04:15 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 29 Oct 2009 08:28:48 +0000 (01:28 -0700)
Add and use no DSCAK bit in the features 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

index 6784b342cbbfedb4ac152af6df2deb067262ddb1..e78b60cd65a4dc1f89a504a11e0e598432a865e2 100644 (file)
@@ -381,6 +381,7 @@ enum
 #define RTAX_FEATURE_NO_TSTAMP 0x00000004
 #define RTAX_FEATURE_ALLFRAG   0x00000008
 #define RTAX_FEATURE_NO_WSCALE 0x00000010
+#define RTAX_FEATURE_NO_DSACK  0x00000020
 
 struct rta_session
 {
index 393c56921dcbe75c2c11d2306bfa8004e4797bef..ba0eab65fe803f721407a83af12074e6d8055d5b 100644 (file)
@@ -4080,8 +4080,10 @@ static inline int tcp_sack_extend(struct tcp_sack_block *sp, u32 seq,
 static void tcp_dsack_set(struct sock *sk, u32 seq, u32 end_seq)
 {
        struct tcp_sock *tp = tcp_sk(sk);
+       struct dst_entry *dst = __sk_dst_get(sk);
 
-       if (tcp_is_sack(tp) && sysctl_tcp_dsack) {
+       if (tcp_is_sack(tp) && sysctl_tcp_dsack &&
+           !dst_feature(dst, RTAX_FEATURE_NO_DSACK)) {
                int mib_idx;
 
                if (before(seq, tp->rcv_nxt))
@@ -4110,13 +4112,15 @@ static void tcp_dsack_extend(struct sock *sk, u32 seq, u32 end_seq)
 static void tcp_send_dupack(struct sock *sk, struct sk_buff *skb)
 {
        struct tcp_sock *tp = tcp_sk(sk);
+       struct dst_entry *dst = __sk_dst_get(sk);
 
        if (TCP_SKB_CB(skb)->end_seq != TCP_SKB_CB(skb)->seq &&
            before(TCP_SKB_CB(skb)->seq, tp->rcv_nxt)) {
                NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_DELAYEDACKLOST);
                tcp_enter_quickack_mode(sk);
 
-               if (tcp_is_sack(tp) && sysctl_tcp_dsack) {
+               if (tcp_is_sack(tp) && sysctl_tcp_dsack &&
+                   !dst_feature(dst, RTAX_FEATURE_NO_DSACK)) {
                        u32 end_seq = TCP_SKB_CB(skb)->end_seq;
 
                        if (after(TCP_SKB_CB(skb)->end_seq, tp->rcv_nxt))