diff options
author | Stefano Brivio <sbrivio@redhat.com> | 2021-06-05 14:54:12 +0200 |
---|---|---|
committer | Stefano Brivio <sbrivio@redhat.com> | 2021-06-05 14:54:12 +0200 |
commit | 8b39b0b47f86e5bab88634cba1a8e9932e275f77 (patch) | |
tree | 40d43aa35b3fb6f81077890c5603ef008b7080b5 /tcp.c | |
parent | 46b799c0771bb80e7b2b4b9031bbb306f67ec17e (diff) | |
download | passt-8b39b0b47f86e5bab88634cba1a8e9932e275f77.tar passt-8b39b0b47f86e5bab88634cba1a8e9932e275f77.tar.gz passt-8b39b0b47f86e5bab88634cba1a8e9932e275f77.tar.bz2 passt-8b39b0b47f86e5bab88634cba1a8e9932e275f77.tar.lz passt-8b39b0b47f86e5bab88634cba1a8e9932e275f77.tar.xz passt-8b39b0b47f86e5bab88634cba1a8e9932e275f77.tar.zst passt-8b39b0b47f86e5bab88634cba1a8e9932e275f77.zip |
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 <sbrivio@redhat.com>
Diffstat (limited to 'tcp.c')
-rw-r--r-- | tcp.c | 11 |
1 files changed, 7 insertions, 4 deletions
@@ -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; |