From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: passt.top; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: passt.top; dkim=pass (2048-bit key; secure) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.a=rsa-sha256 header.s=202502 header.b=Cl5ipIge; dkim-atps=neutral Received: from mail.ozlabs.org (gandalf.ozlabs.org [150.107.74.76]) by passt.top (Postfix) with ESMTPS id 150835A0621 for ; Tue, 25 Mar 2025 04:00:29 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gibson.dropbear.id.au; s=202502; t=1742871612; bh=U4nx4P4OWBj5AJyBsvKGRo0s/2hiq05R3cas4a0yYSA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Cl5ipIgeUKD9bhFEWX/xlCSUHtaFFWsFS4ztejoNpGrmzx+zvsN5yZFwhBdNUGmtp t5NcKuUjKCV3fzNQxJyUncPiRMPj3Jzn5O+l3BawG68GjzWcZGc2Zr5tSuWp7qIwCo VVWZWb9S1M7trBqzUs50uk4Cp6fCU2w1+EYiexF4m5R0OmYsDtegFq75OUVf3cJRH4 36amLmtcxxJFo94Yz6efSs5a1LioxViuHZ8MzOpM7N+Ul+iNIa+pveD9IMwKQO1zSQ 8p2oJwpWTOr7nWyJjzxzewNEkkl19v/ObZkflihcANp55tbqdPHaelW1+bksGMOyfI cklRvpVwdIBGw== Received: by gandalf.ozlabs.org (Postfix, from userid 1007) id 4ZMF5m3kL1z4x3S; Tue, 25 Mar 2025 14:00:12 +1100 (AEDT) From: David Gibson To: passt-dev@passt.top, Stefano Brivio Subject: [PATCH 1/4] udp: Common invocation of udp_sock_errs() for vhost-user and "buf" paths Date: Tue, 25 Mar 2025 14:00:07 +1100 Message-ID: <20250325030010.970144-2-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250325030010.970144-1-david@gibson.dropbear.id.au> References: <20250325030010.970144-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Message-ID-Hash: NKQZ6Y4KYLYAFTUACXIAHZYKTRBEA4UD X-Message-ID-Hash: NKQZ6Y4KYLYAFTUACXIAHZYKTRBEA4UD X-MailFrom: dgibson@gandalf.ozlabs.org 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: David Gibson 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: The vhost-user and non-vhost-user paths for both udp_listen_sock_handler() and udp_reply_sock_handler() are more or less completely separate. Both, however, start with essentially the same invocation of udp_sock_errs(), so that can be made common. Signed-off-by: David Gibson --- udp.c | 37 ++++++++++++++++++++----------------- udp_internal.h | 2 +- udp_vu.c | 15 --------------- 3 files changed, 21 insertions(+), 33 deletions(-) diff --git a/udp.c b/udp.c index 80520cbd..4a06b162 100644 --- a/udp.c +++ b/udp.c @@ -585,7 +585,8 @@ static int udp_sock_recverr(const struct ctx *c, union epoll_ref ref) * * Return: Number of errors handled, or < 0 if we have an unrecoverable error */ -int udp_sock_errs(const struct ctx *c, union epoll_ref ref, uint32_t events) +static int udp_sock_errs(const struct ctx *c, union epoll_ref ref, + uint32_t events) { unsigned n_err = 0; socklen_t errlen; @@ -678,13 +679,6 @@ static void udp_buf_listen_sock_handler(const struct ctx *c, const socklen_t sasize = sizeof(udp_meta[0].s_in); int n, i; - if (udp_sock_errs(c, ref, events) < 0) { - err("UDP: Unrecoverable error on listening socket:" - " (%s port %hu)", pif_name(ref.udp.pif), ref.udp.port); - /* FIXME: what now? close/re-open socket? */ - return; - } - if ((n = udp_sock_recv(c, ref.fd, events, udp_mh_recv)) <= 0) return; @@ -750,6 +744,13 @@ void udp_listen_sock_handler(const struct ctx *c, union epoll_ref ref, uint32_t events, const struct timespec *now) { + if (udp_sock_errs(c, ref, events) < 0) { + err("UDP: Unrecoverable error on listening socket:" + " (%s port %hu)", pif_name(ref.udp.pif), ref.udp.port); + /* FIXME: what now? close/re-open socket? */ + return; + } + if (c->mode == MODE_VU) { udp_vu_listen_sock_handler(c, ref, events, now); return; @@ -777,17 +778,8 @@ static void udp_buf_reply_sock_handler(const struct ctx *c, union epoll_ref ref, uint8_t topif = pif_at_sidx(tosidx); int n, i, from_s; - ASSERT(!c->no_udp && uflow); - from_s = uflow->s[ref.flowside.sidei]; - if (udp_sock_errs(c, ref, events) < 0) { - flow_err(uflow, "Unrecoverable error on reply socket"); - flow_err_details(uflow); - udp_flow_close(c, uflow); - return; - } - if ((n = udp_sock_recv(c, from_s, events, udp_mh_recv)) <= 0) return; @@ -825,6 +817,17 @@ static void udp_buf_reply_sock_handler(const struct ctx *c, union epoll_ref ref, void udp_reply_sock_handler(const struct ctx *c, union epoll_ref ref, uint32_t events, const struct timespec *now) { + struct udp_flow *uflow = udp_at_sidx(ref.flowside); + + ASSERT(!c->no_udp && uflow); + + if (udp_sock_errs(c, ref, events) < 0) { + flow_err(uflow, "Unrecoverable error on reply socket"); + flow_err_details(uflow); + udp_flow_close(c, uflow); + return; + } + if (c->mode == MODE_VU) { udp_vu_reply_sock_handler(c, ref, events, now); return; diff --git a/udp_internal.h b/udp_internal.h index 3b081f54..02724e59 100644 --- a/udp_internal.h +++ b/udp_internal.h @@ -30,5 +30,5 @@ size_t udp_update_hdr4(struct iphdr *ip4h, struct udp_payload_t *bp, size_t udp_update_hdr6(struct ipv6hdr *ip6h, struct udp_payload_t *bp, const struct flowside *toside, size_t dlen, bool no_udp_csum); -int udp_sock_errs(const struct ctx *c, union epoll_ref ref, uint32_t events); + #endif /* UDP_INTERNAL_H */ diff --git a/udp_vu.c b/udp_vu.c index c26a223d..84f52aff 100644 --- a/udp_vu.c +++ b/udp_vu.c @@ -227,12 +227,6 @@ void udp_vu_listen_sock_handler(const struct ctx *c, union epoll_ref ref, struct vu_virtq *vq = &vdev->vq[VHOST_USER_RX_QUEUE]; int i; - if (udp_sock_errs(c, ref, events) < 0) { - err("UDP: Unrecoverable error on listening socket:" - " (%s port %hu)", pif_name(ref.udp.pif), ref.udp.port); - return; - } - for (i = 0; i < UDP_MAX_FRAMES; i++) { const struct flowside *toside; union sockaddr_inany s_in; @@ -300,15 +294,6 @@ void udp_vu_reply_sock_handler(const struct ctx *c, union epoll_ref ref, struct vu_virtq *vq = &vdev->vq[VHOST_USER_RX_QUEUE]; int i; - ASSERT(!c->no_udp); - - if (udp_sock_errs(c, ref, events) < 0) { - flow_err(uflow, "Unrecoverable error on reply socket"); - flow_err_details(uflow); - udp_flow_close(c, uflow); - return; - } - for (i = 0; i < UDP_MAX_FRAMES; i++) { uint8_t topif = pif_at_sidx(tosidx); ssize_t dlen; -- 2.49.0