From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from gandalf.ozlabs.org (gandalf.ozlabs.org [150.107.74.76]) by passt.top (Postfix) with ESMTPS id 9C3D85A0268 for ; Thu, 24 Nov 2022 09:54:27 +0100 (CET) Received: by gandalf.ozlabs.org (Postfix, from userid 1007) id 4NHsHg5TwJz4xN6; Thu, 24 Nov 2022 19:54:23 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gibson.dropbear.id.au; s=201602; t=1669280063; bh=IGsB+36utJT7G9jMQPGS1evFZIF+G6ABVgMNYMMj1CM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=dAOSof4/sym2CmyWM3FzYTbg4YEv4DQaNuZPX2Wlvytfu0ybk8yGiINIATbeVos8v MC2m72quqF8R+jp+adTuNFqcv8hTQA4vTvY0pAS9QYwIJZG+t2SPM0Ln/gebHvdEVH 0nCR96Seo8VzxeXKDTyq+apqFW2uhzq2lKSERXPQ= From: David Gibson To: Stefano Brivio , passt-dev@passt.top Subject: [PATCH 2/4] udp: Better factor IPv4 and IPv6 paths in udp_sock_handler() Date: Thu, 24 Nov 2022 19:54:19 +1100 Message-Id: <20221124085421.3027886-3-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20221124085421.3027886-1-david@gibson.dropbear.id.au> References: <20221124085421.3027886-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Message-ID-Hash: UIAH4SEMXC4ZNEHIFLEROSOY5NR77DNF X-Message-ID-Hash: UIAH4SEMXC4ZNEHIFLEROSOY5NR77DNF 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.3 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: Apart from which mh array they're operating on the recvmmsg() calls in udp_sock_handler() are identical between the IPv4 and IPv6 paths, as are some of the control structure updates. By using some local variables to refer to the IP version specific control arrays, make some more logic common between the IPv4 and IPv6 paths. As well as slightly reducing the code size, this makes it less likely that we'll accidentally use the IPv4 arrays in the IPv6 path or vice versa as we did in a recently fixed bug. Signed-off-by: David Gibson --- udp.c | 40 ++++++++++++++++++---------------------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/udp.c b/udp.c index 99f9374..6a34e85 100644 --- a/udp.c +++ b/udp.c @@ -833,9 +833,10 @@ void udp_sock_handler(const struct ctx *c, union epoll_ref ref, uint32_t events, const struct timespec *now) { ssize_t n, msg_len = 0, missing = 0; + struct mmsghdr *tap_mmh, *sock_mmh; int msg_bufs = 0, msg_i = 0, ret; - struct mmsghdr *tap_mmh; struct msghdr *last_mh; + struct iovec *tap_iov; unsigned int i; if (events == EPOLLERR) @@ -847,34 +848,29 @@ void udp_sock_handler(const struct ctx *c, union epoll_ref ref, uint32_t events, } if (ref.r.p.udp.udp.v6) { - n = recvmmsg(ref.r.s, udp6_l2_mh_sock, UDP_TAP_FRAMES, 0, NULL); - if (n <= 0) - return; - - udp6_l2_mh_tap[0].msg_hdr.msg_iov = &udp6_l2_iov_tap[0]; - - for (i = 0; i < (unsigned)n; i++) { - udp_sock_fill_data_v6(c, i, ref, - &msg_i, &msg_bufs, &msg_len, now); - } - - udp6_l2_mh_tap[msg_i].msg_hdr.msg_iovlen = msg_bufs; tap_mmh = udp6_l2_mh_tap; + sock_mmh = udp6_l2_mh_sock; + tap_iov = udp6_l2_iov_tap; } else { - n = recvmmsg(ref.r.s, udp4_l2_mh_sock, UDP_TAP_FRAMES, 0, NULL); - if (n <= 0) - return; + tap_mmh = udp4_l2_mh_tap; + sock_mmh = udp4_l2_mh_sock; + tap_iov = udp4_l2_iov_tap; + } - udp4_l2_mh_tap[0].msg_hdr.msg_iov = &udp4_l2_iov_tap[0]; + n = recvmmsg(ref.r.s, sock_mmh, UDP_TAP_FRAMES, 0, NULL); + if (n <= 0) + return; - for (i = 0; i < (unsigned)n; i++) { + tap_mmh[0].msg_hdr.msg_iov = &tap_iov[0]; + for (i = 0; i < (unsigned)n; i++) { + if (ref.r.p.udp.udp.v6) + udp_sock_fill_data_v6(c, i, ref, + &msg_i, &msg_bufs, &msg_len, now); + else udp_sock_fill_data_v4(c, i, ref, &msg_i, &msg_bufs, &msg_len, now); - } - - udp4_l2_mh_tap[msg_i].msg_hdr.msg_iovlen = msg_bufs; - tap_mmh = udp4_l2_mh_tap; } + tap_mmh[msg_i].msg_hdr.msg_iovlen = msg_bufs; if (c->mode == MODE_PASTA) return; -- 2.38.1