aboutgitcodebugslistschat
path: root/udp.c
diff options
context:
space:
mode:
Diffstat (limited to 'udp.c')
-rw-r--r--udp.c89
1 files changed, 46 insertions, 43 deletions
diff --git a/udp.c b/udp.c
index 229c038..67d723d 100644
--- a/udp.c
+++ b/udp.c
@@ -91,7 +91,6 @@
* - otherwise, discard
*/
-#define _GNU_SOURCE
#include <sched.h>
#include <stdio.h>
#include <errno.h>
@@ -99,6 +98,8 @@
#include <net/ethernet.h>
#include <net/if.h>
#include <netinet/in.h>
+#include <netinet/ip.h>
+#include <netinet/udp.h>
#include <stdint.h>
#include <stddef.h>
#include <string.h>
@@ -107,11 +108,10 @@
#include <sys/socket.h>
#include <sys/uio.h>
#include <unistd.h>
-#include <linux/ip.h>
-#include <linux/ipv6.h>
-#include <linux/udp.h>
#include <time.h>
+#include <linux/ipv6.h>
+
#include "checksum.h"
#include "util.h"
#include "passt.h"
@@ -206,7 +206,7 @@ __extension__ static struct udp4_l2_buf_t {
udp4_l2_buf[UDP_TAP_FRAMES] = {
[ 0 ... UDP_TAP_FRAMES - 1 ] = {
{ 0 }, 0, 0, L2_BUF_ETH_IP4_INIT, L2_BUF_IP4_INIT(IPPROTO_UDP),
- { 0 }, { 0 },
+ {{{ 0 }}}, { 0 },
},
};
@@ -245,7 +245,7 @@ udp6_l2_buf[UDP_TAP_FRAMES] = {
{ 0 },
#endif
0, L2_BUF_ETH_IP6_INIT, L2_BUF_IP6_INIT(IPPROTO_UDP),
- { 0 }, { 0 },
+ {{{ 0 }}}, { 0 },
},
};
@@ -426,8 +426,8 @@ int udp_splice_connect(struct ctx *c, int v6, int bound_sock,
in_port_t src, in_port_t dst, int splice)
{
struct epoll_event ev = { .events = EPOLLIN | EPOLLRDHUP | EPOLLHUP };
- union epoll_ref ref = { .proto = IPPROTO_UDP,
- .udp = { .splice = splice, .v6 = v6 }
+ union epoll_ref ref = { .r.proto = IPPROTO_UDP,
+ .r.p.udp.udp = { .splice = splice, .v6 = v6 }
};
struct sockaddr_storage sa;
struct udp_splice_port *sp;
@@ -438,7 +438,7 @@ int udp_splice_connect(struct ctx *c, int v6, int bound_sock,
IPPROTO_UDP);
if (s < 0)
return s;
- ref.s = s;
+ ref.r.s = s;
if (v6) {
struct sockaddr_in6 addr6 = {
@@ -465,15 +465,15 @@ int udp_splice_connect(struct ctx *c, int v6, int bound_sock,
struct sockaddr_in6 sa6;
memcpy(&sa6, &sa, sizeof(sa6));
- ref.udp.port = ntohs(sa6.sin6_port);
+ ref.r.p.udp.udp.port = ntohs(sa6.sin6_port);
} else {
struct sockaddr_in sa4;
memcpy(&sa4, &sa, sizeof(sa4));
- ref.udp.port = ntohs(sa4.sin_port);
+ ref.r.p.udp.udp.port = ntohs(sa4.sin_port);
}
- sp = &udp_splice_map[v6 ? V6 : V4][ref.udp.port];
+ sp = &udp_splice_map[v6 ? V6 : V4][ref.r.p.udp.udp.port];
if (splice == UDP_BACK_TO_INIT) {
sp->init_bound_sock = bound_sock;
sp->init_dst_port = src;
@@ -542,15 +542,15 @@ static int udp_splice_connect_ns(void *arg)
static void udp_sock_handler_splice(struct ctx *c, union epoll_ref ref,
uint32_t events, struct timespec *now)
{
+ in_port_t src, dst = ref.r.p.udp.udp.port, send_dst = 0;
struct msghdr *mh = &udp_splice_mmh_recv[0].msg_hdr;
- in_port_t src, dst = ref.udp.port, send_dst = 0;
struct sockaddr_storage *sa_s = mh->msg_name;
- int s, v6 = ref.udp.v6, n, i;
+ int s, v6 = ref.r.p.udp.udp.v6, n, i;
if (!(events & EPOLLIN))
return;
- n = recvmmsg(ref.s, udp_splice_mmh_recv, UDP_SPLICE_FRAMES, 0, NULL);
+ n = recvmmsg(ref.r.s, udp_splice_mmh_recv, UDP_SPLICE_FRAMES, 0, NULL);
if (n <= 0)
return;
@@ -565,13 +565,13 @@ static void udp_sock_handler_splice(struct ctx *c, union epoll_ref ref,
src = ntohs(sa->sin_port);
}
- switch (ref.udp.splice) {
+ switch (ref.r.p.udp.udp.splice) {
case UDP_TO_NS:
src += udp_port_delta_from_init[src];
if (!(s = udp_splice_map[v6][src].ns_conn_sock)) {
struct udp_splice_connect_ns_arg arg = {
- c, v6, ref.s, src, dst, -1,
+ c, v6, ref.r.s, src, dst, -1,
};
NS_CALL(udp_splice_connect_ns, &arg);
@@ -590,7 +590,7 @@ static void udp_sock_handler_splice(struct ctx *c, union epoll_ref ref,
src += udp_port_delta_from_tap[src];
if (!(s = udp_splice_map[v6][src].init_conn_sock)) {
- s = udp_splice_connect(c, v6, ref.s, src, dst,
+ s = udp_splice_connect(c, v6, ref.r.s, src, dst,
UDP_BACK_TO_NS);
if (s < 0)
return;
@@ -607,7 +607,8 @@ static void udp_sock_handler_splice(struct ctx *c, union epoll_ref ref,
return;
}
- if (ref.udp.splice == UDP_TO_NS || ref.udp.splice == UDP_TO_INIT) {
+ if (ref.r.p.udp.udp.splice == UDP_TO_NS ||
+ ref.r.p.udp.udp.splice == UDP_TO_INIT) {
for (i = 0; i < n; i++) {
struct msghdr *mh = &udp_splice_mmh_send[i].msg_hdr;
@@ -665,13 +666,13 @@ void udp_sock_handler(struct ctx *c, union epoll_ref ref, uint32_t events,
if (events == EPOLLERR)
return;
- if (ref.udp.splice) {
+ if (ref.r.p.udp.udp.splice) {
udp_sock_handler_splice(c, ref, events, now);
return;
}
- if (ref.udp.v6) {
- n = recvmmsg(ref.s, udp6_l2_mh_sock, UDP_TAP_FRAMES, 0, NULL);
+ 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;
@@ -719,7 +720,7 @@ void udp_sock_handler(struct ctx *c, union epoll_ref ref, uint32_t events,
}
b->uh.source = b->s_in6.sin6_port;
- b->uh.dest = htons(ref.udp.port);
+ b->uh.dest = htons(ref.r.p.udp.udp.port);
b->uh.len = b->ip6h.payload_len;
b->ip6h.hop_limit = IPPROTO_UDP;
@@ -759,7 +760,7 @@ void udp_sock_handler(struct ctx *c, union epoll_ref ref, uint32_t events,
tap_mmh = udp6_l2_mh_tap;
} else {
- n = recvmmsg(ref.s, udp4_l2_mh_sock, UDP_TAP_FRAMES, 0, NULL);
+ n = recvmmsg(ref.r.s, udp4_l2_mh_sock, UDP_TAP_FRAMES, 0, NULL);
if (n <= 0)
return;
@@ -798,7 +799,7 @@ void udp_sock_handler(struct ctx *c, union epoll_ref ref, uint32_t events,
udp_update_check4(b);
b->uh.source = b->s_in.sin_port;
- b->uh.dest = htons(ref.udp.port);
+ b->uh.dest = htons(ref.r.p.udp.udp.port);
b->uh.len = ntohs(udp4_l2_mh_sock[i].msg_len +
sizeof(b->uh));
@@ -934,7 +935,8 @@ int udp_tap_handler(struct ctx *c, int af, void *addr,
sl = sizeof(s_in);
if (!(s = udp_tap_map[V4][src].sock)) {
- union udp_epoll_ref uref = { .bound = 1, .port = src };
+ union udp_epoll_ref uref = { .udp.bound = 1,
+ .udp.port = src };
s = sock_l4(c, AF_INET, IPPROTO_UDP, src, 0, uref.u32);
if (s <= 0)
@@ -975,9 +977,9 @@ int udp_tap_handler(struct ctx *c, int af, void *addr,
}
if (!(s = udp_tap_map[V6][src].sock)) {
- union udp_epoll_ref uref = { .bound = 1, .v6 = 1,
- .port = src
- };
+ union udp_epoll_ref uref = { .udp.bound = 1,
+ .udp.v6 = 1,
+ .udp.port = src };
s = sock_l4(c, AF_INET6, IPPROTO_UDP, src, bind_to,
uref.u32);
@@ -1020,7 +1022,8 @@ int udp_tap_handler(struct ctx *c, int af, void *addr,
*/
int udp_sock_init_ns(void *arg)
{
- union udp_epoll_ref uref = { .bound = 1, .splice = UDP_TO_INIT };
+ union udp_epoll_ref uref = { .udp.bound = 1,
+ .udp.splice = UDP_TO_INIT };
struct ctx *c = (struct ctx *)arg;
int dst;
@@ -1030,16 +1033,16 @@ int udp_sock_init_ns(void *arg)
if (!bitmap_isset(c->udp.port_to_init, dst))
continue;
- uref.port = dst + udp_port_delta_to_init[dst];
+ uref.udp.port = dst + udp_port_delta_to_init[dst];
if (c->v4) {
- uref.v6 = 0;
+ uref.udp.v6 = 0;
sock_l4(c, AF_INET, IPPROTO_UDP, dst, BIND_LOOPBACK,
uref.u32);
}
if (c->v6) {
- uref.v6 = 1;
+ uref.udp.v6 = 1;
sock_l4(c, AF_INET6, IPPROTO_UDP, dst, BIND_LOOPBACK,
uref.u32);
}
@@ -1109,7 +1112,7 @@ static void udp_splice_iov_init(void)
*/
int udp_sock_init(struct ctx *c, struct timespec *now)
{
- union udp_epoll_ref uref = { .bound = 1 };
+ union udp_epoll_ref uref = { .udp.bound = 1 };
int dst, s;
(void)now;
@@ -1118,34 +1121,34 @@ int udp_sock_init(struct ctx *c, struct timespec *now)
if (!bitmap_isset(c->udp.port_to_tap, dst))
continue;
- uref.port = dst + udp_port_delta_to_tap[dst];
+ uref.udp.port = dst + udp_port_delta_to_tap[dst];
if (c->v4) {
- uref.splice = 0;
- uref.v6 = 0;
+ uref.udp.splice = 0;
+ uref.udp.v6 = 0;
s = sock_l4(c, AF_INET, IPPROTO_UDP, dst,
c->mode == MODE_PASTA ? BIND_EXT : BIND_ANY,
uref.u32);
if (s > 0)
- udp_tap_map[V4][uref.port].sock = s;
+ udp_tap_map[V4][uref.udp.port].sock = s;
if (c->mode == MODE_PASTA) {
- uref.splice = UDP_TO_NS;
+ uref.udp.splice = UDP_TO_NS;
sock_l4(c, AF_INET, IPPROTO_UDP, dst,
BIND_LOOPBACK, uref.u32);
}
}
if (c->v6) {
- uref.splice = 0;
- uref.v6 = 1;
+ uref.udp.splice = 0;
+ uref.udp.v6 = 1;
s = sock_l4(c, AF_INET6, IPPROTO_UDP, dst,
c->mode == MODE_PASTA ? BIND_EXT : BIND_ANY,
uref.u32);
if (s > 0)
- udp_tap_map[V6][uref.port].sock = s;
+ udp_tap_map[V6][uref.udp.port].sock = s;
if (c->mode == MODE_PASTA) {
- uref.splice = UDP_TO_NS;
+ uref.udp.splice = UDP_TO_NS;
sock_l4(c, AF_INET6, IPPROTO_UDP, dst,
BIND_LOOPBACK, uref.u32);
}