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; |
