aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGilad Ben-Yossef <gilad@codefidence.com>2009-10-28 00:15:26 -0400
committerDavid S. Miller <davem@davemloft.net>2009-10-29 04:28:47 -0400
commit345cda2fd695534be5a4494f1b59da9daed33663 (patch)
tree6e4b83512481d25b8e7976a1556c5d848e84a621
parentcda42ebd67ee5fdf09d7057b5a4584d36fe8a335 (diff)
Allow to turn off TCP window scale opt per route
Add and use no window scale bit in the features field. Note that this is not the same as setting a window scale of 0 as would happen with window limit on route. 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>
-rw-r--r--include/linux/rtnetlink.h1
-rw-r--r--net/ipv4/tcp_input.c3
-rw-r--r--net/ipv4/tcp_output.c6
3 files changed, 7 insertions, 3 deletions
diff --git a/include/linux/rtnetlink.h b/include/linux/rtnetlink.h
index 2ab8c758b46c..6784b342cbbf 100644
--- a/include/linux/rtnetlink.h
+++ b/include/linux/rtnetlink.h
@@ -380,6 +380,7 @@ enum
380#define RTAX_FEATURE_NO_SACK 0x00000002 380#define RTAX_FEATURE_NO_SACK 0x00000002
381#define RTAX_FEATURE_NO_TSTAMP 0x00000004 381#define RTAX_FEATURE_NO_TSTAMP 0x00000004
382#define RTAX_FEATURE_ALLFRAG 0x00000008 382#define RTAX_FEATURE_ALLFRAG 0x00000008
383#define RTAX_FEATURE_NO_WSCALE 0x00000010
383 384
384struct rta_session 385struct rta_session
385{ 386{
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index 6097491aa9fc..393c56921dcb 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -3739,7 +3739,8 @@ void tcp_parse_options(struct sk_buff *skb, struct tcp_options_received *opt_rx,
3739 break; 3739 break;
3740 case TCPOPT_WINDOW: 3740 case TCPOPT_WINDOW:
3741 if (opsize == TCPOLEN_WINDOW && th->syn && 3741 if (opsize == TCPOLEN_WINDOW && th->syn &&
3742 !estab && sysctl_tcp_window_scaling) { 3742 !estab && sysctl_tcp_window_scaling &&
3743 !dst_feature(dst, RTAX_FEATURE_NO_WSCALE)) {
3743 __u8 snd_wscale = *(__u8 *)ptr; 3744 __u8 snd_wscale = *(__u8 *)ptr;
3744 opt_rx->wscale_ok = 1; 3745 opt_rx->wscale_ok = 1;
3745 if (snd_wscale > 14) { 3746 if (snd_wscale > 14) {
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
index 8819eba8ebb8..616c686ca253 100644
--- a/net/ipv4/tcp_output.c
+++ b/net/ipv4/tcp_output.c
@@ -496,7 +496,8 @@ static unsigned tcp_syn_options(struct sock *sk, struct sk_buff *skb,
496 opts->tsecr = tp->rx_opt.ts_recent; 496 opts->tsecr = tp->rx_opt.ts_recent;
497 size += TCPOLEN_TSTAMP_ALIGNED; 497 size += TCPOLEN_TSTAMP_ALIGNED;
498 } 498 }
499 if (likely(sysctl_tcp_window_scaling)) { 499 if (likely(sysctl_tcp_window_scaling &&
500 !dst_feature(dst, RTAX_FEATURE_NO_WSCALE))) {
500 opts->ws = tp->rx_opt.rcv_wscale; 501 opts->ws = tp->rx_opt.rcv_wscale;
501 opts->options |= OPTION_WSCALE; 502 opts->options |= OPTION_WSCALE;
502 size += TCPOLEN_WSCALE_ALIGNED; 503 size += TCPOLEN_WSCALE_ALIGNED;
@@ -2347,7 +2348,8 @@ static void tcp_connect_init(struct sock *sk)
2347 tp->advmss - (tp->rx_opt.ts_recent_stamp ? tp->tcp_header_len - sizeof(struct tcphdr) : 0), 2348 tp->advmss - (tp->rx_opt.ts_recent_stamp ? tp->tcp_header_len - sizeof(struct tcphdr) : 0),
2348 &tp->rcv_wnd, 2349 &tp->rcv_wnd,
2349 &tp->window_clamp, 2350 &tp->window_clamp,
2350 sysctl_tcp_window_scaling, 2351 (sysctl_tcp_window_scaling &&
2352 !dst_feature(dst, RTAX_FEATURE_NO_WSCALE)),
2351 &rcv_wscale); 2353 &rcv_wscale);
2352 2354
2353 tp->rx_opt.rcv_wscale = rcv_wscale; 2355 tp->rx_opt.rcv_wscale = rcv_wscale;