aboutgitcodebugslistschat
path: root/tcp.c
diff options
context:
space:
mode:
authorStefano Brivio <sbrivio@redhat.com>2021-08-24 18:27:24 +0200
committerStefano Brivio <sbrivio@redhat.com>2021-08-24 18:27:24 +0200
commitcc2ebfd5f2c73b61590a28ff7d088520ce2c1502 (patch)
treeede7ef01f028f6087c1678243cfe2c23ada39272 /tcp.c
parentf2e3b9defdaa8821975ea68236687cfb6958db80 (diff)
downloadpasst-cc2ebfd5f2c73b61590a28ff7d088520ce2c1502.tar
passt-cc2ebfd5f2c73b61590a28ff7d088520ce2c1502.tar.gz
passt-cc2ebfd5f2c73b61590a28ff7d088520ce2c1502.tar.bz2
passt-cc2ebfd5f2c73b61590a28ff7d088520ce2c1502.tar.lz
passt-cc2ebfd5f2c73b61590a28ff7d088520ce2c1502.tar.xz
passt-cc2ebfd5f2c73b61590a28ff7d088520ce2c1502.tar.zst
passt-cc2ebfd5f2c73b61590a28ff7d088520ce2c1502.zip
tcp: Never send ACK because of pending unacknowleged data when sending SYN
With a kernel older than 5.3 (no_snd_wnd set), ack_pending in tcp_send_to_tap() might be true at the beginning of a new connection initiated by a socket. This means we send the first SYN segment to the tap together with ACK set, which is clearly invalid and triggers the receiver to reply with an RST segment right away. Set ack_pending to 0 whenever we're sending a SYN segment. In case of a SYN, ACK segment sent by the caller, the caller passes the ACK flag explicitly. Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Diffstat (limited to 'tcp.c')
-rw-r--r--tcp.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/tcp.c b/tcp.c
index a4c9114..093f95f 100644
--- a/tcp.c
+++ b/tcp.c
@@ -1137,7 +1137,9 @@ static int tcp_send_to_tap(struct ctx *c, struct tcp_tap_conn *conn,
conn->seq_to_tap += len;
}
- if (conn->no_snd_wnd) {
+ if (flags & SYN) {
+ ack_pending = 0;
+ } else if (conn->no_snd_wnd) {
ack_pending = (conn->seq_from_tap - conn->seq_ack_to_tap) <
MAX_WINDOW;
} else {