From 45d9b0000e7690f03f4fdf56bebacc96392e0178 Mon Sep 17 00:00:00 2001 From: Stefano Brivio Date: Thu, 16 Sep 2021 08:14:01 +0200 Subject: tcp: Read SO_SNDBUF unconditionally Checking it only when the cached value is smaller than the current window of the receiver is not enough: it might shrink further while the receiver window is growing. Signed-off-by: Stefano Brivio --- tcp.c | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/tcp.c b/tcp.c index bc0dc61..231b842 100644 --- a/tcp.c +++ b/tcp.c @@ -1150,16 +1150,13 @@ static int tcp_send_to_tap(struct ctx *c, struct tcp_tap_conn *conn, return err; } - if (info.tcpi_snd_wnd > conn->sndbuf) { - sl = sizeof(conn->sndbuf); - if (getsockopt(conn->sock, SOL_SOCKET, SO_SNDBUF, - &conn->sndbuf, &sl)) - conn->sndbuf = USHRT_MAX; - - info.tcpi_snd_wnd = MIN(info.tcpi_snd_wnd, - conn->sndbuf / 100 * 90); - } + sl = sizeof(conn->sndbuf); + if (getsockopt(conn->sock, SOL_SOCKET, SO_SNDBUF, + &conn->sndbuf, &sl)) + conn->sndbuf = USHRT_MAX; + info.tcpi_snd_wnd = MIN(info.tcpi_snd_wnd, + conn->sndbuf * 90 / 100); conn->tcpi_snd_wnd = info.tcpi_snd_wnd; } @@ -1766,15 +1763,12 @@ recvmmsg: &sl)) goto err; - if (info.tcpi_snd_wnd > conn->sndbuf) { - if (getsockopt(conn->sock, SOL_SOCKET, - SO_SNDBUF, &conn->sndbuf, &sl)) - conn->sndbuf = USHRT_MAX; + if (getsockopt(conn->sock, SOL_SOCKET, + SO_SNDBUF, &conn->sndbuf, &sl)) + conn->sndbuf = USHRT_MAX; - info.tcpi_snd_wnd = MIN(info.tcpi_snd_wnd, - conn->sndbuf / 100 - * 90); - } + info.tcpi_snd_wnd = MIN(info.tcpi_snd_wnd, + conn->sndbuf * 90 / 100); if (conn->state == ESTABLISHED) conn->seq_ack_to_tap = conn->seq_from_tap; -- cgit v1.2.3