1
0
mirror of https://passt.top/passt synced 2024-12-22 13:45:32 +00:00

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 <sbrivio@redhat.com>
This commit is contained in:
Stefano Brivio 2021-09-16 08:14:01 +02:00
parent 474b8e6fb7
commit 45d9b0000e

28
tcp.c
View File

@ -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;