diff options
author | Stefano Brivio <sbrivio@redhat.com> | 2021-08-24 18:27:24 +0200 |
---|---|---|
committer | Stefano Brivio <sbrivio@redhat.com> | 2021-08-24 18:27:24 +0200 |
commit | cc2ebfd5f2c73b61590a28ff7d088520ce2c1502 (patch) | |
tree | ede7ef01f028f6087c1678243cfe2c23ada39272 /tcp.c | |
parent | f2e3b9defdaa8821975ea68236687cfb6958db80 (diff) | |
download | passt-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.c | 4 |
1 files changed, 3 insertions, 1 deletions
@@ -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 { |