aboutgitcodebugslistschat
path: root/tcp.c
diff options
context:
space:
mode:
authorStefano Brivio <sbrivio@redhat.com>2021-06-05 14:54:12 +0200
committerStefano Brivio <sbrivio@redhat.com>2021-06-05 14:54:12 +0200
commit8b39b0b47f86e5bab88634cba1a8e9932e275f77 (patch)
tree40d43aa35b3fb6f81077890c5603ef008b7080b5 /tcp.c
parent46b799c0771bb80e7b2b4b9031bbb306f67ec17e (diff)
downloadpasst-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.c11
1 files 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;