diff options
-rw-r--r-- | include/linux/rtnetlink.h | 1 | ||||
-rw-r--r-- | net/ipv4/tcp_input.c | 3 | ||||
-rw-r--r-- | net/ipv4/tcp_output.c | 6 |
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 | ||
384 | struct rta_session | 385 | struct 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; |