tcp: In ESTABLISHED state, acknowledge segments as they're sent to the socket

...instead of waiting for the remote peer to do that -- it's
especially important in case we request retransmissions from the
guest, but it also helps speeding up slow start. This should
probably be a configurable behaviour in the future.

Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
Stefano Brivio 2021-09-14 16:54:06 +02:00
parent 621c589d36
commit a616357c86

21
tcp.c
View file

@ -1200,8 +1200,9 @@ static int tcp_send_to_tap(struct ctx *c, struct tcp_tap_conn *conn,
if (flags & SYN) { if (flags & SYN) {
ack_pending = 0; ack_pending = 0;
} else if (conn->no_snd_wnd) { } else if (conn->state == ESTABLISHED || conn->no_snd_wnd) {
ack_pending = (conn->seq_from_tap - conn->seq_ack_to_tap) < ack_pending = conn->seq_from_tap != conn->seq_ack_to_tap &&
(conn->seq_from_tap - conn->seq_ack_to_tap) <
MAX_WINDOW; MAX_WINDOW;
} else { } else {
ack_pending = info.tcpi_bytes_acked > conn->tcpi_acked_last; ack_pending = info.tcpi_bytes_acked > conn->tcpi_acked_last;
@ -1213,8 +1214,12 @@ static int tcp_send_to_tap(struct ctx *c, struct tcp_tap_conn *conn,
if (conn->no_snd_wnd) { if (conn->no_snd_wnd) {
conn->seq_ack_to_tap = conn->seq_from_tap; conn->seq_ack_to_tap = conn->seq_from_tap;
} else { } else {
conn->seq_ack_to_tap = info.tcpi_bytes_acked + if (conn->state == ESTABLISHED)
conn->seq_init_from_tap; conn->seq_ack_to_tap = conn->seq_from_tap;
else
conn->seq_ack_to_tap = info.tcpi_bytes_acked +
conn->seq_init_from_tap;
conn->tcpi_acked_last = info.tcpi_bytes_acked; conn->tcpi_acked_last = info.tcpi_bytes_acked;
} }
@ -1770,9 +1775,13 @@ recvmmsg:
* 90); * 90);
} }
if (conn->state == ESTABLISHED)
conn->seq_ack_to_tap = conn->seq_from_tap;
else
conn->seq_ack_to_tap = info.tcpi_bytes_acked +
conn->seq_init_from_tap;
conn->tcpi_acked_last = info.tcpi_bytes_acked; conn->tcpi_acked_last = info.tcpi_bytes_acked;
conn->seq_ack_to_tap = info.tcpi_bytes_acked +
conn->seq_init_from_tap;
} }
} else { } else {
info.tcpi_snd_wscale = conn->ws; info.tcpi_snd_wscale = conn->ws;