Thread (5 messages) flat view 5 messages, 3 authors, 2021-08-25

Re: [PATCH net-next v2] tcp: enable mid stream window clamp

From: Eric Dumazet <edumazet@google.com>
Date: 2021-08-25 17:30:47

On Wed, Aug 25, 2021 at 9:57 AM Neil Spring [off-list ref] wrote:

Eric Dumazet wrote:
quoted
On 8/19/21 12:54 PM, Neil Spring wrote:
quoted
The TCP_WINDOW_CLAMP socket option is defined in tcp(7) to "Bound the size of
the advertised window to this value."  Window clamping is distributed across two
variables, window_clamp ("Maximal window to advertise" in tcp.h) and rcv_ssthresh
("Current window clamp").

This patch updates the function where the window clamp is set to also reduce the current
window clamp, rcv_sshthresh, if needed.  With this, setting the TCP_WINDOW_CLAMP option
has the documented effect of limiting the window.

Signed-off-by: Neil Spring <redacted>
---
v2: - fix email formatting


 net/ipv4/tcp.c | 2 ++
 1 file changed, 2 insertions(+)
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index f931def6302e..2dc6212d5888 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -3338,6 +3338,8 @@ int tcp_set_window_clamp(struct sock *sk, int val)
       } else {
               tp->window_clamp = val < SOCK_MIN_RCVBUF / 2 ?
                       SOCK_MIN_RCVBUF / 2 : val;
+             tp->rcv_ssthresh = min(tp->rcv_ssthresh,
+                                    tp->window_clamp);
quoted
This fits in a single line I think.
                tp->rcv_ssthresh = min(tp->rcv_ssthresh, tp->window_clamp);
I'll fix in v3 in a moment, thanks!
quoted
quoted
       }
       return 0;
 }
quoted
Hi Neil

Can you provide a packetdrill test showing the what the new expected behavior is ?
Sure.  I submitted a pull request on packetdrill -
https://github.com/google/packetdrill/pull/56 - to document the intended behavior.
quoted
It is not really clear why you need this.
The observation is that this option is currently ineffective at limiting once the
connection is exchanging data. I interpret this as a result of only looking at
the window clamp when growing rcv_ssthresh, not as a key to reduce this
limit.

The packetdrill example will fail at the point where an ack should have a reduced
window due to the clamp.
quoted
Also if we are unable to increase tp->rcv_ssthresh, this means the following sequence
will not work as we would expect :
quoted
+0 setsockopt(5, IPPROTO_TCP, TCP_WINDOW_CLAMP, [10000], 4) = 0
+0 setsockopt(5, IPPROTO_TCP, TCP_WINDOW_CLAMP, [100000], 4) = 0
The packetdrill shows that raising the window clamp works:
tcp_grow_window takes over and raises the window quickly, but I'll add
a specific test for this sequence (with no intervening data) to confirm.
Sure, raising the window clamping is working (even before your patch)

But after your patch, rcv_ssthresh will still be 10000, instead of
something maybe bigger ?
quoted
Thanks.
Thanks Eric!

-neil
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help