On Fri, Aug 15, 2025 at 06:10:37PM +0200, Stefano Brivio wrote: > If we're retransmitting any data, and we sent a FIN segment to our > peer, regardless of whether it was received, we obviously have to > retransmit it as well, given that it can only come with the last data > segment, or after it. > > Unconditionally clear the internal TAP_FIN_SENT flag whenever we > re-transmit, so that we know we have to send it again, in case. > > Reported-by: Paul Holzinger > Signed-off-by: Stefano Brivio Reviewed-by: David Gibson > --- > tcp.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/tcp.c b/tcp.c > index 957b498..7c1f237 100644 > --- a/tcp.c > +++ b/tcp.c > @@ -1759,6 +1759,7 @@ static int tcp_data_from_tap(const struct ctx *c, struct tcp_tap_conn *conn, > "fast re-transmit, ACK: %u, previous sequence: %u", > max_ack_seq, conn->seq_to_tap); > conn->seq_to_tap = max_ack_seq; > + conn->events &= ~TAP_FIN_SENT; > if (tcp_set_peek_offset(conn, 0)) { > tcp_rst(c, conn); > return -1; > @@ -2286,6 +2287,7 @@ void tcp_timer_handler(const struct ctx *c, union epoll_ref ref) > flow_dbg(conn, "ACK timeout, retry"); > conn->retrans++; > conn->seq_to_tap = conn->seq_ack_from_tap; > + conn->events &= ~TAP_FIN_SENT; > if (!conn->wnd_from_tap) > conn->wnd_from_tap = 1; /* Zero-window probe */ > if (tcp_set_peek_offset(conn, 0)) { -- David Gibson (he or they) | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you, not the other way | around. http://www.ozlabs.org/~dgibson