tcp: Request retransmission with updated sequence also on partial write to socket
If we couldn't write the whole batch of received packets to the socket, and we have missing segments, we still need to request their retransmission right away, otherwise it will take ages for the guest to figure out we're missing them. Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
parent
a616357c86
commit
9af8e0a1a7
1 changed files with 8 additions and 11 deletions
19
tcp.c
19
tcp.c
|
@ -2088,13 +2088,8 @@ static void tcp_data_from_tap(struct ctx *c, struct tcp_tap_conn *conn,
|
|||
return;
|
||||
}
|
||||
|
||||
if (keep != -1) {
|
||||
tcp_send_to_tap(c, conn, ACK, NULL, 0);
|
||||
tcp_send_to_tap(c, conn, ACK, NULL, 0);
|
||||
}
|
||||
|
||||
if (!iov_i)
|
||||
goto fin_check;
|
||||
goto out;
|
||||
|
||||
mh.msg_iovlen = iov_i;
|
||||
eintr:
|
||||
|
@ -2114,14 +2109,16 @@ eintr:
|
|||
if (len < (seq_from_tap - conn->seq_from_tap)) {
|
||||
conn->seq_from_tap += len;
|
||||
tcp_send_to_tap(c, conn, ZERO_WINDOW, NULL, 0);
|
||||
return;
|
||||
} else {
|
||||
conn->seq_from_tap += len;
|
||||
}
|
||||
|
||||
conn->seq_from_tap += len;
|
||||
|
||||
fin_check:
|
||||
if (keep != -1)
|
||||
out:
|
||||
if (keep != -1) {
|
||||
tcp_send_to_tap(c, conn, ACK, NULL, 0);
|
||||
tcp_send_to_tap(c, conn, ACK, NULL, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
if (ack) {
|
||||
if (conn->state == ESTABLISHED_SOCK_FIN_SENT &&
|
||||
|
|
Loading…
Reference in a new issue