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=202504 header.b=GowMCTj3; dkim-atps=neutral Received: from mail.ozlabs.org (gandalf.ozlabs.org [150.107.74.76]) by passt.top (Postfix) with ESMTPS id 18D015A061E for ; Tue, 15 Apr 2025 09:16:40 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gibson.dropbear.id.au; s=202504; t=1744701386; bh=f1NkcRkUbG2anWjI6ZoGKHLPV4CNOASLDCaB0BnfioE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=GowMCTj3YozGvTQrApuuxI5rnjufTu6Bwc8YD/aUekHHStKZTONrKOcWPtX6gKbfE V6a7O6ILFMoq0NZKjdSiTR4JmlVhU47hTpnbcMfuCeXPTswQG+2kjrg5EU1tt5cjkP tZKXyzeXbiBehNS7XsUBC2O5VPxb+KdMINY3uaAkZBmJ6BuC6+FFqKFNRBE2BpsxCd zJ3eKk+8d96rfnMLofiV+L7CmHbIjpyucZlhinPZFdeluTp8R5Jw4VeRx0Tk0kDQCB UsmVQvpDs0NIVCKvF5kHX5t11ZXCvkHEaTNdtZSd+B/hdzyF1oBjNYoqDtYDOOoWVo dUOfEUPnZN7nA== Received: by gandalf.ozlabs.org (Postfix, from userid 1007) id 4ZcFnk5R37z4xP1; Tue, 15 Apr 2025 17:16:26 +1000 (AEST) From: David Gibson To: Stefano Brivio , passt-dev@passt.top Subject: [PATCH 6/7] udp: Minor re-organisation of udp_sock_recverr() Date: Tue, 15 Apr 2025 17:16:23 +1000 Message-ID: <20250415071624.2618589-7-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250415071624.2618589-1-david@gibson.dropbear.id.au> References: <20250415071624.2618589-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Message-ID-Hash: SCZJLTOQMXBE22DJ43ZUYFVVIFSY7KFM X-Message-ID-Hash: SCZJLTOQMXBE22DJ43ZUYFVVIFSY7KFM 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: Jon Maloy , 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: Usually we work with the "exit early" flow style, where we return early on "error" conditions in functions. We don't currently do this in udp_sock_recverr() for the case where we don't have a flow to associate the error with. Reorganise to use the "exit early" style, which will make some subsequent changes less awkward. Signed-off-by: David Gibson --- udp.c | 46 ++++++++++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/udp.c b/udp.c index 352ab83b..6db3accc 100644 --- a/udp.c +++ b/udp.c @@ -530,6 +530,9 @@ static int udp_sock_recverr(const struct ctx *c, int s, flow_sidx_t sidx) .msg_control = buf, .msg_controllen = sizeof(buf), }; + const struct flowside *toside; + flow_sidx_t tosidx; + size_t dlen; ssize_t rc; rc = recvmsg(s, &mh, MSG_ERRQUEUE); @@ -560,29 +563,32 @@ static int udp_sock_recverr(const struct ctx *c, int s, flow_sidx_t sidx) } eh = (const struct errhdr *)CMSG_DATA(hdr); - if (flow_sidx_valid(sidx)) { - flow_sidx_t tosidx = flow_sidx_opposite(sidx); - const struct flowside *toside = flowside_at_sidx(tosidx); - size_t dlen = rc; - - if (pif_is_socket(pif_at_sidx(tosidx))) { - /* XXX Is there any way to propagate ICMPs from socket - * to socket? */ - } else if (hdr->cmsg_level == IPPROTO_IP) { - dlen = MIN(dlen, ICMP4_MAX_DLEN); - udp_send_tap_icmp4(c, &eh->ee, toside, - eh->saddr.sa4.sin_addr, data, dlen); - } else if (hdr->cmsg_level == IPPROTO_IPV6) { - udp_send_tap_icmp6(c, &eh->ee, toside, - &eh->saddr.sa6.sin6_addr, data, - dlen, sidx.flowi); - } - } else { - trace("Ignoring received IP_RECVERR cmsg on listener socket"); - } + debug("%s error on UDP socket %i: %s", str_ee_origin(&eh->ee), s, strerror_(eh->ee.ee_errno)); + if (!flow_sidx_valid(sidx)) { + trace("Ignoring received IP_RECVERR cmsg on listener socket"); + return 1; + } + + tosidx = flow_sidx_opposite(sidx); + toside = flowside_at_sidx(tosidx); + dlen = rc; + + if (pif_is_socket(pif_at_sidx(tosidx))) { + /* XXX Is there any way to propagate ICMPs from socket to + * socket? */ + } else if (hdr->cmsg_level == IPPROTO_IP) { + dlen = MIN(dlen, ICMP4_MAX_DLEN); + udp_send_tap_icmp4(c, &eh->ee, toside, + eh->saddr.sa4.sin_addr, data, dlen); + } else if (hdr->cmsg_level == IPPROTO_IPV6) { + udp_send_tap_icmp6(c, &eh->ee, toside, + &eh->saddr.sa6.sin6_addr, data, + dlen, sidx.flowi); + } + return 1; } -- 2.49.0