From 8b39b0b47f86e5bab88634cba1a8e9932e275f77 Mon Sep 17 00:00:00 2001 From: Stefano Brivio Date: Sat, 5 Jun 2021 14:54:12 +0200 Subject: [PATCH] tcp: Fix window size in initial SYN, ACK segment to guest During handshake, the initial SYN, ACK segment to the guest, send as a response to the SYN segment, needs to report the unscaled value for the window, given that the handshake hasn't completed yet. While at it, fix the endianness for the window value in case TCP parameters can't be queried via TCP_INFO and we need to use the default value. Signed-off-by: Stefano Brivio --- tcp.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/tcp.c b/tcp.c index 1de6d99..4748461 100644 --- a/tcp.c +++ b/tcp.c @@ -798,10 +798,13 @@ static int tcp_send_to_tap(struct ctx *c, int s, int flags, char *in, int len) th->source = tc[s].sock_port; th->dest = tc[s].tap_port; - if (!err) - th->window = htons(info.tcpi_snd_wnd >> info.tcpi_snd_wscale); - else - th->window = WINDOW_DEFAULT; + if (!err) { + /* First value sent by receiver is not scaled */ + th->window = htons(info.tcpi_snd_wnd >> + ((flags & SYN) ? 0 : info.tcpi_snd_wscale)); + } else { + th->window = htons(WINDOW_DEFAULT); + } th->urg_ptr = 0; th->check = 0;