aboutgitcodebugslistschat
diff options
context:
space:
mode:
authorStefano Brivio <sbrivio@redhat.com>2024-10-15 00:17:24 +0200
committerStefano Brivio <sbrivio@redhat.com>2024-10-15 20:34:26 +0200
commit2d7f734c45c64e9d5ddc408a1e13de7d9942bf42 (patch)
tree10aa8db8af3833dead55b82cf469483c268fc04e
parent7612cb80fe80c089b25245e12a5e934f772480f8 (diff)
downloadpasst-2d7f734c45c64e9d5ddc408a1e13de7d9942bf42.tar
passt-2d7f734c45c64e9d5ddc408a1e13de7d9942bf42.tar.gz
passt-2d7f734c45c64e9d5ddc408a1e13de7d9942bf42.tar.bz2
passt-2d7f734c45c64e9d5ddc408a1e13de7d9942bf42.tar.lz
passt-2d7f734c45c64e9d5ddc408a1e13de7d9942bf42.tar.xz
passt-2d7f734c45c64e9d5ddc408a1e13de7d9942bf42.tar.zst
passt-2d7f734c45c64e9d5ddc408a1e13de7d9942bf42.zip
tcp: Send "empty" handshake ACK before first data segment
Starting from commit 9178a9e3462d ("tcp: Always send an ACK segment once the handshake is completed"), we always send an ACK segment, without any payload, to complete the three-way handshake while establishing a connection started from a socket. We queue that segment after checking if we already have data to send to the tap, which means that its sequence number is higher than any segment with data we're sending in the same iteration, if any data is available on the socket. However, in tcp_defer_handler(), we first flush "flags" buffers, that is, we send out segments without any data first, and then segments with data, which means that our "empty" ACK is sent before the ACK segment with data (if any), which has a lower sequence number. This appears to be harmless as the guest or container will generally reorder segments, but it looks rather weird and we can't exclude it's actually causing problems. Queue the empty ACK first, so that it gets a lower sequence number, before checking for any data from the socket. Reported-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Stefano Brivio <sbrivio@redhat.com> Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
-rw-r--r--tcp.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/tcp.c b/tcp.c
index 9617b7a..b2155ab 100644
--- a/tcp.c
+++ b/tcp.c
@@ -1957,11 +1957,12 @@ static void tcp_conn_from_sock_finish(const struct ctx *c,
return;
}
+ tcp_send_flag(c, conn, ACK);
+
/* The client might have sent data already, which we didn't
* dequeue waiting for SYN,ACK from tap -- check now.
*/
tcp_data_from_sock(c, conn);
- tcp_send_flag(c, conn, ACK);
}
/**