From mboxrd@z Thu Jan 1 00:00:00 1970 Received: by passt.top (Postfix, from userid 1000) id A16105A0274; Sat, 23 Sep 2023 00:06:10 +0200 (CEST) From: Stefano Brivio To: David Gibson , Matej Hrica Subject: [PATCH RFT 2/5] tcp: Reset STALLED flag on ACK only, check for pending socket data Date: Sat, 23 Sep 2023 00:06:07 +0200 Message-Id: <20230922220610.58767-3-sbrivio@redhat.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230922220610.58767-1-sbrivio@redhat.com> References: <20230922220610.58767-1-sbrivio@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Message-ID-Hash: DUX34K2LA3JSHAGYZRT36VRCJT47JMFZ X-Message-ID-Hash: DUX34K2LA3JSHAGYZRT36VRCJT47JMFZ X-MailFrom: sbrivio@passt.top X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: passt-dev@passt.top X-Mailman-Version: 3.3.8 Precedence: list List-Id: Development discussion and patches for passt Archived-At: Archived-At: List-Archive: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: In tcp_tap_handler(), we shouldn't reset the STALLED flag (indicating that we ran out of tap-side window space, or that all available socket data is already in flight -- better names welcome!) on any event: do that only if the first packet in a batch has the ACK flag set. Make sure we check for pending socket data when we reset it: reverting back to level-triggered epoll events, as tcp_epoll_ctl() does, isn't guaranteed to actually trigger a socket event. Further, note that the flag only makes sense once a connection is established, so move all this to the right place, which is convenient for the next patch, as we want to check if the STALLED flag was set before processing any new information about the window size advertised by the tap. Signed-off-by: Stefano Brivio --- tcp.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tcp.c b/tcp.c index aa1c8c9..5528e05 100644 --- a/tcp.c +++ b/tcp.c @@ -2572,8 +2572,6 @@ int tcp_tap_handler(struct ctx *c, int af, const void *saddr, const void *daddr, if (th->ack && !(conn->events & ESTABLISHED)) tcp_update_seqack_from_tap(c, conn, ntohl(th->ack_seq)); - conn_flag(c, conn, ~STALLED); - /* Establishing connection from socket */ if (conn->events & SOCK_ACCEPTED) { if (th->syn && th->ack && !th->fin) { @@ -2631,6 +2629,11 @@ int tcp_tap_handler(struct ctx *c, int af, const void *saddr, const void *daddr, if (conn->seq_ack_to_tap != conn->seq_from_tap) ack_due = 1; + if ((conn->flags & STALLED) && th->ack) { + conn_flag(c, conn, ~STALLED); + tcp_data_from_sock(c, conn); + } + if ((conn->events & TAP_FIN_RCVD) && !(conn->events & SOCK_FIN_SENT)) { shutdown(conn->sock, SHUT_WR); conn_event(c, conn, SOCK_FIN_SENT); -- 2.39.2