Message ID | 1256052161-14156-7-git-send-email-gilad@codefidence.com |
---|---|
State | RFC, archived |
Delegated to: | David Miller |
Headers | show |
On Tue, 20 Oct 2009 17:22:39 +0200 Gilad Ben-Yossef <gilad@codefidence.com> wrote: > Add and use no window scale 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> The same effect can by just using window limit on route -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Stephen Hemminger wrote: > On Tue, 20 Oct 2009 17:22:39 +0200 > Gilad Ben-Yossef <gilad@codefidence.com> wrote: > > >> Add and use no window scale 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> >> > > The same effect can by just using window limit on route > Actually, not exactly. There is a subtle but important difference between "I support window scaling, but choose a scale of 0", which is what your suggestion will imply and "I don't support window scaling at all", which is what the suggested feature field does. To make things more complicated, until the previous patch I sent, when Linux would choose a window scale of zero for any reason, it would also wrongfully report it does not support window scaling at all to the other side, with some subtle bug caused by it, but this is no longer the behavior and I believe rightly so. Thanks, Gilad
diff --git a/include/linux/rtnetlink.h b/include/linux/rtnetlink.h index 2ab8c75..6784b34 100644 --- a/include/linux/rtnetlink.h +++ b/include/linux/rtnetlink.h @@ -380,6 +380,7 @@ enum #define RTAX_FEATURE_NO_SACK 0x00000002 #define RTAX_FEATURE_NO_TSTAMP 0x00000004 #define RTAX_FEATURE_ALLFRAG 0x00000008 +#define RTAX_FEATURE_NO_WSCALE 0x00000010 struct rta_session { diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index d2f9742..4f5e914 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, break; case TCPOPT_WINDOW: if (opsize == TCPOLEN_WINDOW && th->syn && - !estab && sysctl_tcp_window_scaling) { + !estab && sysctl_tcp_window_scaling && + !dst_feature(dst, RTAX_FEATURE_NO_WSCALE)) { __u8 snd_wscale = *(__u8 *)ptr; opt_rx->wscale_ok = 1; if (snd_wscale > 14) { diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 8f30c18..ff60a21 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, opts->tsecr = tp->rx_opt.ts_recent; size += TCPOLEN_TSTAMP_ALIGNED; } - if (likely(sysctl_tcp_window_scaling)) { + if (likely(sysctl_tcp_window_scaling && + !dst_feature(dst, RTAX_FEATURE_NO_WSCALE))) { opts->ws = tp->rx_opt.rcv_wscale; opts->options |= OPTION_WSCALE; size += TCPOLEN_WSCALE_ALIGNED; @@ -2347,7 +2348,8 @@ static void tcp_connect_init(struct sock *sk) tp->advmss - (tp->rx_opt.ts_recent_stamp ? tp->tcp_header_len - sizeof(struct tcphdr) : 0), &tp->rcv_wnd, &tp->window_clamp, - sysctl_tcp_window_scaling, + (sysctl_tcp_window_scaling && + !dst_feature(dst, RTAX_FEATURE_NO_WSCALE)), &rcv_wscale); tp->rx_opt.rcv_wscale = rcv_wscale;
Add and use no window scale 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> --- include/linux/rtnetlink.h | 1 + net/ipv4/tcp_input.c | 3 ++- net/ipv4/tcp_output.c | 6 ++++-- 3 files changed, 7 insertions(+), 3 deletions(-)