aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/tcp_output.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv4/tcp_output.c')
-rw-r--r--net/ipv4/tcp_output.c20
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}
258EXPORT_SYMBOL(tcp_select_initial_window); 256EXPORT_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;