aboutgitcodebugslistschat
path: root/udp.c
diff options
context:
space:
mode:
authorDavid Gibson <david@gibson.dropbear.id.au>2024-02-28 22:25:03 +1100
committerStefano Brivio <sbrivio@redhat.com>2024-02-29 09:47:28 +0100
commit0cf6b2d89dbe6f26bb9cba470a5fda84ea1caae7 (patch)
tree429fc52f043a0c0fb75380632df01e0827a7d2fc /udp.c
parent330b5db77d4c73b0fad0467e6268c08c4176312e (diff)
downloadpasst-0cf6b2d89dbe6f26bb9cba470a5fda84ea1caae7.tar
passt-0cf6b2d89dbe6f26bb9cba470a5fda84ea1caae7.tar.gz
passt-0cf6b2d89dbe6f26bb9cba470a5fda84ea1caae7.tar.bz2
passt-0cf6b2d89dbe6f26bb9cba470a5fda84ea1caae7.tar.lz
passt-0cf6b2d89dbe6f26bb9cba470a5fda84ea1caae7.tar.xz
passt-0cf6b2d89dbe6f26bb9cba470a5fda84ea1caae7.tar.zst
passt-0cf6b2d89dbe6f26bb9cba470a5fda84ea1caae7.zip
inany: Provide more conveniently typed constants for special addresses
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 some gotchas 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 <david@gibson.dropbear.id.au> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
Diffstat (limited to 'udp.c')
-rw-r--r--udp.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/udp.c b/udp.c
index 5b7778e..de25eb0 100644
--- a/udp.c
+++ b/udp.c
@@ -96,6 +96,7 @@
#include <stdio.h>
#include <errno.h>
#include <limits.h>
+#include <assert.h>
#include <net/ethernet.h>
#include <net/if.h>
#include <netinet/in.h>
@@ -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"
@@ -1017,9 +1020,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;
}