Commit 589c49cb authored by Gao Feng's avatar Gao Feng Committed by David S. Miller

net: tcp: Define the TCP_MAX_WSCALE instead of literal number 14

Define one new macro TCP_MAX_WSCALE instead of literal number '14',
and use U16_MAX instead of 65535 as the max value of TCP window.
There is another minor change, use rounddown(space, mss) instead of
(space / mss) * mss;
Signed-off-by: default avatarGao Feng <fgao@ikuai8.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 5e351410
...@@ -78,6 +78,9 @@ void tcp_time_wait(struct sock *sk, int state, int timeo); ...@@ -78,6 +78,9 @@ void tcp_time_wait(struct sock *sk, int state, int timeo);
/* Maximal number of ACKs sent quickly to accelerate slow-start. */ /* Maximal number of ACKs sent quickly to accelerate slow-start. */
#define TCP_MAX_QUICKACKS 16U #define TCP_MAX_QUICKACKS 16U
/* Maximal number of window scale according to RFC1323 */
#define TCP_MAX_WSCALE 14U
/* urg_data states */ /* urg_data states */
#define TCP_URG_VALID 0x0100 #define TCP_URG_VALID 0x0100
#define TCP_URG_NOTYET 0x0200 #define TCP_URG_NOTYET 0x0200
......
...@@ -2393,7 +2393,7 @@ static int tcp_repair_options_est(struct tcp_sock *tp, ...@@ -2393,7 +2393,7 @@ static int tcp_repair_options_est(struct tcp_sock *tp,
u16 snd_wscale = opt.opt_val & 0xFFFF; u16 snd_wscale = opt.opt_val & 0xFFFF;
u16 rcv_wscale = opt.opt_val >> 16; u16 rcv_wscale = opt.opt_val >> 16;
if (snd_wscale > 14 || rcv_wscale > 14) if (snd_wscale > TCP_MAX_WSCALE || rcv_wscale > TCP_MAX_WSCALE)
return -EFBIG; return -EFBIG;
tp->rx_opt.snd_wscale = snd_wscale; tp->rx_opt.snd_wscale = snd_wscale;
......
...@@ -3759,11 +3759,12 @@ void tcp_parse_options(const struct sk_buff *skb, ...@@ -3759,11 +3759,12 @@ void tcp_parse_options(const struct sk_buff *skb,
!estab && sysctl_tcp_window_scaling) { !estab && sysctl_tcp_window_scaling) {
__u8 snd_wscale = *(__u8 *)ptr; __u8 snd_wscale = *(__u8 *)ptr;
opt_rx->wscale_ok = 1; opt_rx->wscale_ok = 1;
if (snd_wscale > 14) { if (snd_wscale > TCP_MAX_WSCALE) {
net_info_ratelimited("%s: Illegal window scaling value %d >14 received\n", net_info_ratelimited("%s: Illegal window scaling value %d > %u received\n",
__func__, __func__,
snd_wscale); snd_wscale,
snd_wscale = 14; TCP_MAX_WSCALE);
snd_wscale = TCP_MAX_WSCALE;
} }
opt_rx->snd_wscale = snd_wscale; opt_rx->snd_wscale = snd_wscale;
} }
......
...@@ -212,12 +212,12 @@ void tcp_select_initial_window(int __space, __u32 mss, ...@@ -212,12 +212,12 @@ void tcp_select_initial_window(int __space, __u32 mss,
/* If no clamp set the clamp to the max possible scaled window */ /* If no clamp set the clamp to the max possible scaled window */
if (*window_clamp == 0) if (*window_clamp == 0)
(*window_clamp) = (65535 << 14); (*window_clamp) = (U16_MAX << TCP_MAX_WSCALE);
space = min(*window_clamp, space); space = min(*window_clamp, space);
/* Quantize space offering to a multiple of mss if possible. */ /* Quantize space offering to a multiple of mss if possible. */
if (space > mss) if (space > mss)
space = (space / mss) * mss; space = rounddown(space, mss);
/* NOTE: offering an initial window larger than 32767 /* NOTE: offering an initial window larger than 32767
* will break some buggy TCP stacks. If the admin tells us * will break some buggy TCP stacks. If the admin tells us
...@@ -234,13 +234,11 @@ void tcp_select_initial_window(int __space, __u32 mss, ...@@ -234,13 +234,11 @@ void tcp_select_initial_window(int __space, __u32 mss,
(*rcv_wscale) = 0; (*rcv_wscale) = 0;
if (wscale_ok) { if (wscale_ok) {
/* Set window scaling on max possible window /* Set window scaling on max possible window */
* See RFC1323 for an explanation of the limit to 14
*/
space = max_t(u32, space, sysctl_tcp_rmem[2]); space = max_t(u32, space, sysctl_tcp_rmem[2]);
space = max_t(u32, space, sysctl_rmem_max); space = max_t(u32, space, sysctl_rmem_max);
space = min_t(u32, space, *window_clamp); space = min_t(u32, space, *window_clamp);
while (space > 65535 && (*rcv_wscale) < 14) { while (space > U16_MAX && (*rcv_wscale) < TCP_MAX_WSCALE) {
space >>= 1; space >>= 1;
(*rcv_wscale)++; (*rcv_wscale)++;
} }
...@@ -253,7 +251,7 @@ void tcp_select_initial_window(int __space, __u32 mss, ...@@ -253,7 +251,7 @@ void tcp_select_initial_window(int __space, __u32 mss,
} }
/* Set the clamp no higher than max representable value */ /* Set the clamp no higher than max representable value */
(*window_clamp) = min(65535U << (*rcv_wscale), *window_clamp); (*window_clamp) = min_t(__u32, U16_MAX << (*rcv_wscale), *window_clamp);
} }
EXPORT_SYMBOL(tcp_select_initial_window); EXPORT_SYMBOL(tcp_select_initial_window);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment