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 6F8B95A0274 for ; Tue, 6 Feb 2024 02:17:43 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gibson.dropbear.id.au; s=202312; t=1707182260; bh=UTSYTKcECbO6+6qv0DHwHrf1XWO1kb99mkDLcagoc8E=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=F7IBPTa3b5J8Ndrh21YHGuZIxwpktgqRGDG18d2hhmr0LkSC/wouvRlHuvptd825H Z1HA+Dyouddg7AfRT+Zv5513fXSBupmmRN9q1AXvWzL5pQAinWVOpGpB9qZAVljAAx ADBayEtx//mc+S51IPh35QkHXROOhVeERKTDZASUmCThFU3zgfvu/xL54CM1siYLwm ZeymOU04ZkNCcJmiTPAKkybgkuPqqkdzieW0apCk1RWq/pIa2b+L4bVNrf37YQHhgL O7UP4hUpFDCanxJuGMb43s5VU+ildLk9Uf4x8gqS4NmS7YjJN/SJjDHlOOs5t/vc3V ZDF2t/H/pQ8Vg== Received: by gandalf.ozlabs.org (Postfix, from userid 1007) id 4TTQN402Bdz4wyf; Tue, 6 Feb 2024 12:17:39 +1100 (AEDT) From: David Gibson To: passt-dev@passt.top, Stefano Brivio Subject: [PATCH v2 04/22] inany: Provide more conveniently typed constants for special addresses Date: Tue, 6 Feb 2024 12:17:16 +1100 Message-ID: <20240206011734.884138-5-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240206011734.884138-1-david@gibson.dropbear.id.au> References: <20240206011734.884138-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Message-ID-Hash: KFKEITD7QIGK3O72DSQU2HOFGS3QJ2QA X-Message-ID-Hash: KFKEITD7QIGK3O72DSQU2HOFGS3QJ2QA 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: Our inany_addr type is used in some places to represent either IPv4 or IPv6 addresses, and we plan to use it more widely. We don't yet provide constants of this type for special addresses (loopback and "any"). Add some of these, both the IPv4 and IPv6 variants of those addresses, but typed as union inany_addr. To avoid actually adding more things to .data we can use some macros and casting to overlay the IPv6 versions of these with the standard library's in6addr_loopback and in6addr_any. For the IPv4 versions we need to create new constant globals. For complicated historical reasons, the standard library doesn't provide constants for IPv4 loopback and any addresses as struct in_addr. It just has macros of type in_addr_t == uint32_t, which has confusing semantics w.r.t. endianness. We can use some more macros to address this lack, using macros to effectively create these IPv4 constants as pieces of the inany constants above. We use this last to avoid some awkward temporary variables just used to get an address of an IPv4 loopback address. Signed-off-by: David Gibson --- inany.c | 16 ++++++++++++++++ inany.h | 9 +++++++++ tcp.c | 4 ++-- udp.c | 8 +++++--- 4 files changed, 32 insertions(+), 5 deletions(-) diff --git a/inany.c b/inany.c index edf0b055..c11e2aa9 100644 --- a/inany.c +++ b/inany.c @@ -16,6 +16,22 @@ #include "siphash.h" #include "inany.h" +const union inany_addr inany_loopback4 = { + .v4mapped = { + .zero = { 0 }, + .one = { 0xff, 0xff, }, + .a4 = IN4ADDR_LOOPBACK_INIT, + }, +}; + +const union inany_addr inany_any4 = { + .v4mapped = { + .zero = { 0 }, + .one = { 0xff, 0xff, }, + .a4 = IN4ADDR_ANY_INIT, + }, +}; + /** inany_ntop - Convert an IPv[46] address to text format * @src: IPv[46] address * @dst: output buffer, minimum INANY_ADDRSTRLEN bytes diff --git a/inany.h b/inany.h index bf731166..4c4b36c3 100644 --- a/inany.h +++ b/inany.h @@ -32,6 +32,15 @@ static_assert(sizeof(union inany_addr) == sizeof(struct in6_addr), static_assert(_Alignof(union inany_addr) == _Alignof(uint32_t), "union inany_addr has unexpected alignment"); +#define inany_loopback6 (*(const union inany_addr *)(&in6addr_loopback)) +extern const union inany_addr inany_loopback4; + +#define inany_any6 (*(const union inany_addr *)(&in6addr_any)) +extern const union inany_addr inany_any4; + +#define in4addr_loopback (inany_loopback4.v4mapped.a4) +#define in4addr_any (inany_any4.v4mapped.a4) + /** inany_v4 - Extract IPv4 address, if present, from IPv[46] address * @addr: IPv4 or IPv6 address * diff --git a/tcp.c b/tcp.c index fdf56713..79b7b4d5 100644 --- a/tcp.c +++ b/tcp.c @@ -2926,12 +2926,12 @@ static void tcp_ns_sock_init4(const struct ctx *c, in_port_t port) .port = port + c->tcp.fwd_out.delta[port], .pif = PIF_SPLICE, }; - struct in_addr loopback = IN4ADDR_LOOPBACK_INIT; int s; ASSERT(c->mode == MODE_PASTA); - s = sock_l4(c, AF_INET, IPPROTO_TCP, &loopback, NULL, port, tref.u32); + s = sock_l4(c, AF_INET, IPPROTO_TCP, &in4addr_loopback, NULL, port, + tref.u32); if (s >= 0) tcp_sock_set_bufsize(c, s); else diff --git a/udp.c b/udp.c index c839e269..f2be0080 100644 --- a/udp.c +++ b/udp.c @@ -96,6 +96,7 @@ #include #include #include +#include #include #include #include @@ -112,6 +113,8 @@ #include "checksum.h" #include "util.h" +#include "siphash.h" +#include "inany.h" #include "passt.h" #include "tap.h" #include "pcap.h" @@ -1010,9 +1013,8 @@ int udp_sock_init(const struct ctx *c, int ns, sa_family_t af, udp_tap_map[V4][uref.port].sock = s < 0 ? -1 : s; udp_splice_init[V4][port].sock = s < 0 ? -1 : s; } else { - struct in_addr loopback = IN4ADDR_LOOPBACK_INIT; - - r4 = s = sock_l4(c, AF_INET, IPPROTO_UDP, &loopback, + r4 = s = sock_l4(c, AF_INET, IPPROTO_UDP, + &in4addr_loopback, ifname, port, uref.u32); udp_splice_ns[V4][port].sock = s < 0 ? -1 : s; } -- 2.43.0