diff options
Diffstat (limited to 'net/ipv4/tcp_output.c')
-rw-r--r-- | net/ipv4/tcp_output.c | 20 |
1 files changed, 8 insertions, 12 deletions
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index a85d863c4419..60111a0fc201 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
@@ -212,12 +212,12 @@ void tcp_select_initial_window(int __space, __u32 mss, | |||
212 | 212 | ||
213 | /* If no clamp set the clamp to the max possible scaled window */ | 213 | /* If no clamp set the clamp to the max possible scaled window */ |
214 | if (*window_clamp == 0) | 214 | if (*window_clamp == 0) |
215 | (*window_clamp) = (65535 << 14); | 215 | (*window_clamp) = (U16_MAX << TCP_MAX_WSCALE); |
216 | space = min(*window_clamp, space); | 216 | space = min(*window_clamp, space); |
217 | 217 | ||
218 | /* Quantize space offering to a multiple of mss if possible. */ | 218 | /* Quantize space offering to a multiple of mss if possible. */ |
219 | if (space > mss) | 219 | if (space > mss) |
220 | space = (space / mss) * mss; | 220 | space = rounddown(space, mss); |
221 | 221 | ||
222 | /* NOTE: offering an initial window larger than 32767 | 222 | /* NOTE: offering an initial window larger than 32767 |
223 | * will break some buggy TCP stacks. If the admin tells us | 223 | * 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 | 234 | ||
235 | (*rcv_wscale) = 0; | 235 | (*rcv_wscale) = 0; |
236 | if (wscale_ok) { | 236 | if (wscale_ok) { |
237 | /* Set window scaling on max possible window | 237 | /* Set window scaling on max possible window */ |
238 | * See RFC1323 for an explanation of the limit to 14 | ||
239 | */ | ||
240 | space = max_t(u32, space, sysctl_tcp_rmem[2]); | 238 | space = max_t(u32, space, sysctl_tcp_rmem[2]); |
241 | space = max_t(u32, space, sysctl_rmem_max); | 239 | space = max_t(u32, space, sysctl_rmem_max); |
242 | space = min_t(u32, space, *window_clamp); | 240 | space = min_t(u32, space, *window_clamp); |
243 | while (space > 65535 && (*rcv_wscale) < 14) { | 241 | while (space > U16_MAX && (*rcv_wscale) < TCP_MAX_WSCALE) { |
244 | space >>= 1; | 242 | space >>= 1; |
245 | (*rcv_wscale)++; | 243 | (*rcv_wscale)++; |
246 | } | 244 | } |
@@ -253,7 +251,7 @@ void tcp_select_initial_window(int __space, __u32 mss, | |||
253 | } | 251 | } |
254 | 252 | ||
255 | /* Set the clamp no higher than max representable value */ | 253 | /* Set the clamp no higher than max representable value */ |
256 | (*window_clamp) = min(65535U << (*rcv_wscale), *window_clamp); | 254 | (*window_clamp) = min_t(__u32, U16_MAX << (*rcv_wscale), *window_clamp); |
257 | } | 255 | } |
258 | EXPORT_SYMBOL(tcp_select_initial_window); | 256 | EXPORT_SYMBOL(tcp_select_initial_window); |
259 | 257 | ||
@@ -2566,7 +2564,6 @@ u32 __tcp_select_window(struct sock *sk) | |||
2566 | /* Don't do rounding if we are using window scaling, since the | 2564 | /* Don't do rounding if we are using window scaling, since the |
2567 | * scaled window will not line up with the MSS boundary anyway. | 2565 | * scaled window will not line up with the MSS boundary anyway. |
2568 | */ | 2566 | */ |
2569 | window = tp->rcv_wnd; | ||
2570 | if (tp->rx_opt.rcv_wscale) { | 2567 | if (tp->rx_opt.rcv_wscale) { |
2571 | window = free_space; | 2568 | window = free_space; |
2572 | 2569 | ||
@@ -2574,10 +2571,9 @@ u32 __tcp_select_window(struct sock *sk) | |||
2574 | * Import case: prevent zero window announcement if | 2571 | * Import case: prevent zero window announcement if |
2575 | * 1<<rcv_wscale > mss. | 2572 | * 1<<rcv_wscale > mss. |
2576 | */ | 2573 | */ |
2577 | if (((window >> tp->rx_opt.rcv_wscale) << tp->rx_opt.rcv_wscale) != window) | 2574 | window = ALIGN(window, (1 << tp->rx_opt.rcv_wscale)); |
2578 | window = (((window >> tp->rx_opt.rcv_wscale) + 1) | ||
2579 | << tp->rx_opt.rcv_wscale); | ||
2580 | } else { | 2575 | } else { |
2576 | window = tp->rcv_wnd; | ||
2581 | /* Get the largest window that is a nice multiple of mss. | 2577 | /* Get the largest window that is a nice multiple of mss. |
2582 | * Window clamp already applied above. | 2578 | * Window clamp already applied above. |
2583 | * If our current window offering is within 1 mss of the | 2579 | * If our current window offering is within 1 mss of the |
@@ -2587,7 +2583,7 @@ u32 __tcp_select_window(struct sock *sk) | |||
2587 | * is too small. | 2583 | * is too small. |
2588 | */ | 2584 | */ |
2589 | if (window <= free_space - mss || window > free_space) | 2585 | if (window <= free_space - mss || window > free_space) |
2590 | window = (free_space / mss) * mss; | 2586 | window = rounddown(free_space, mss); |
2591 | else if (mss == full_space && | 2587 | else if (mss == full_space && |
2592 | free_space > window + (full_space >> 1)) | 2588 | free_space > window + (full_space >> 1)) |
2593 | window = free_space; | 2589 | window = free_space; |