aboutgitcodebugslistschat
diff options
context:
space:
mode:
-rw-r--r--udp.c47
1 files changed, 20 insertions, 27 deletions
diff --git a/udp.c b/udp.c
index 43ed643..2d34f6a 100644
--- a/udp.c
+++ b/udp.c
@@ -235,18 +235,10 @@ static struct mmsghdr udp4_mh_recv [UDP_MAX_FRAMES];
static struct mmsghdr udp6_mh_recv [UDP_MAX_FRAMES];
/* IOVs and msghdr arrays for sending "spliced" datagrams to sockets */
-static struct sockaddr_in udp4_splice_to = {
- .sin_family = AF_INET,
- .sin_addr = IN4ADDR_LOOPBACK_INIT,
-};
-static struct sockaddr_in6 udp6_splice_to = {
- .sin6_family = AF_INET6,
- .sin6_addr = IN6ADDR_LOOPBACK_INIT,
-};
+static union sockaddr_inany udp_splice_to;
static struct iovec udp_iov_splice [UDP_MAX_FRAMES];
-static struct mmsghdr udp4_mh_splice [UDP_MAX_FRAMES];
-static struct mmsghdr udp6_mh_splice [UDP_MAX_FRAMES];
+static struct mmsghdr udp_mh_splice [UDP_MAX_FRAMES];
/* IOVs for L2 frames */
static struct iovec udp4_l2_iov [UDP_MAX_FRAMES][UDP_NUM_IOVS];
@@ -523,7 +515,7 @@ static unsigned udp_splice_send(const struct ctx *c, size_t start, size_t n,
const struct timespec *now)
{
in_port_t src = udp_meta[start].splicesrc;
- struct mmsghdr *mmh_recv, *mmh_send;
+ struct mmsghdr *mmh_recv;
unsigned int i = start;
int s;
@@ -532,16 +524,22 @@ static unsigned udp_splice_send(const struct ctx *c, size_t start, size_t n,
if (ref.udp.v6) {
mmh_recv = udp6_mh_recv;
- mmh_send = udp6_mh_splice;
- udp6_splice_to.sin6_port = htons(dst);
+ udp_splice_to.sa6 = (struct sockaddr_in6) {
+ .sin6_family = AF_INET6,
+ .sin6_addr = in6addr_loopback,
+ .sin6_port = htons(dst),
+ };
} else {
mmh_recv = udp4_mh_recv;
- mmh_send = udp4_mh_splice;
- udp4_splice_to.sin_port = htons(dst);
+ udp_splice_to.sa4 = (struct sockaddr_in) {
+ .sin_family = AF_INET,
+ .sin_addr = in4addr_loopback,
+ .sin_port = htons(dst),
+ };
}
do {
- mmh_send[i].msg_hdr.msg_iov->iov_len = mmh_recv[i].msg_len;
+ udp_mh_splice[i].msg_hdr.msg_iov->iov_len = mmh_recv[i].msg_len;
if (++i >= n)
break;
@@ -579,7 +577,7 @@ static unsigned udp_splice_send(const struct ctx *c, size_t start, size_t n,
udp_splice_ns[ref.udp.v6][src].ts = now->tv_sec;
}
- sendmmsg(s, mmh_send + start, i - start, MSG_NOSIGNAL);
+ sendmmsg(s, udp_mh_splice + start, i - start, MSG_NOSIGNAL);
out:
return i - start;
}
@@ -1094,20 +1092,15 @@ static void udp_splice_iov_init(void)
int i;
for (i = 0; i < UDP_MAX_FRAMES; i++) {
- struct msghdr *mh4 = &udp4_mh_splice[i].msg_hdr;
- struct msghdr *mh6 = &udp6_mh_splice[i].msg_hdr;
-
- mh4->msg_name = &udp4_splice_to;
- mh4->msg_namelen = sizeof(udp4_splice_to);
+ struct msghdr *mh = &udp_mh_splice[i].msg_hdr;
- mh6->msg_name = &udp6_splice_to;
- mh6->msg_namelen = sizeof(udp6_splice_to);
+ mh->msg_name = &udp_splice_to;
+ mh->msg_namelen = sizeof(udp_splice_to);
udp_iov_splice[i].iov_base = udp_payload[i].data;
- mh4->msg_iov = &udp_iov_splice[i];
- mh6->msg_iov = &udp_iov_splice[i];
- mh4->msg_iovlen = mh6->msg_iovlen = 1;
+ mh->msg_iov = &udp_iov_splice[i];
+ mh->msg_iovlen = 1;
}
}