Skip to content

Commit 8e0e8be

Browse files
matttbekuba-moo
authored andcommitted
tcp: clamp window like before the cleanup
A recent cleanup changed the behaviour of tcp_set_window_clamp(). This looks unintentional, and affects MPTCP selftests, e.g. some tests re-establishing a connection after a disconnect are now unstable. Before the cleanup, this operation was done: new_rcv_ssthresh = min(tp->rcv_wnd, new_window_clamp); tp->rcv_ssthresh = max(new_rcv_ssthresh, tp->rcv_ssthresh); The cleanup used the 'clamp' macro which takes 3 arguments -- value, lowest, and highest -- and returns a value between the lowest and the highest allowable values. This then assumes ... lowest (rcv_ssthresh) <= highest (rcv_wnd) ... which doesn't seem to be always the case here according to the MPTCP selftests, even when running them without MPTCP, but only TCP. For example, when we have ... rcv_wnd < rcv_ssthresh < new_rcv_ssthresh ... before the cleanup, the rcv_ssthresh was not changed, while after the cleanup, it is lowered down to rcv_wnd (highest). During a simple test with TCP, here are the values I observed: new_window_clamp (val) rcv_ssthresh (lo) rcv_wnd (hi) 117760 (out) 65495 < 65536 128512 (out) 109595 > 80256 => lo > hi 1184975 (out) 328987 < 329088 113664 (out) 65483 < 65536 117760 (out) 110968 < 110976 129024 (out) 116527 > 109696 => lo > hi Here, we can see that it is not that rare to have rcv_ssthresh (lo) higher than rcv_wnd (hi), so having a different behaviour when the clamp() macro is used, even without MPTCP. Note: new_window_clamp is always out of range (rcv_ssthresh < rcv_wnd) here, which seems to be generally the case in my tests with small connections. I then suggests reverting this part, not to change the behaviour. Fixes: 863a952 ("tcp: tcp_set_window_clamp() cleanup") Closes: multipath-tcp/mptcp_net-next#551 Signed-off-by: Matthieu Baerts (NGI0) <[email protected]> Tested-by: Jason Xing <[email protected]> Reviewed-by: Eric Dumazet <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 072dd84 commit 8e0e8be

File tree

1 file changed

+6
-6
lines changed

1 file changed

+6
-6
lines changed

net/ipv4/tcp.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3693,7 +3693,7 @@ EXPORT_SYMBOL(tcp_sock_set_keepcnt);
36933693

36943694
int tcp_set_window_clamp(struct sock *sk, int val)
36953695
{
3696-
u32 old_window_clamp, new_window_clamp;
3696+
u32 old_window_clamp, new_window_clamp, new_rcv_ssthresh;
36973697
struct tcp_sock *tp = tcp_sk(sk);
36983698

36993699
if (!val) {
@@ -3714,12 +3714,12 @@ int tcp_set_window_clamp(struct sock *sk, int val)
37143714
/* Need to apply the reserved mem provisioning only
37153715
* when shrinking the window clamp.
37163716
*/
3717-
if (new_window_clamp < old_window_clamp)
3717+
if (new_window_clamp < old_window_clamp) {
37183718
__tcp_adjust_rcv_ssthresh(sk, new_window_clamp);
3719-
else
3720-
tp->rcv_ssthresh = clamp(new_window_clamp,
3721-
tp->rcv_ssthresh,
3722-
tp->rcv_wnd);
3719+
} else {
3720+
new_rcv_ssthresh = min(tp->rcv_wnd, new_window_clamp);
3721+
tp->rcv_ssthresh = max(new_rcv_ssthresh, tp->rcv_ssthresh);
3722+
}
37233723
return 0;
37243724
}
37253725

0 commit comments

Comments
 (0)