diff options
-rw-r--r-- | inany.c | 16 | ||||
-rw-r--r-- | inany.h | 9 | ||||
-rw-r--r-- | tcp.c | 4 | ||||
-rw-r--r-- | udp.c | 8 |
4 files changed, 32 insertions, 5 deletions
@@ -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 @@ -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 * @@ -2949,12 +2949,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 @@ -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; } |