From 48e338130e87e1e2a8fb0ae7d08cf11f84e57eb2 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Tue, 1 Jun 2021 16:06:59 -0700 Subject: [PATCH] mve sockaddr_in to Go --- net/uring/io_uring.c | 19 +++++-------------- net/uring/io_uring_linux.go | 4 +++- 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/net/uring/io_uring.c b/net/uring/io_uring.c index 6e13a58d4..b90d20628 100644 --- a/net/uring/io_uring.c +++ b/net/uring/io_uring.c @@ -17,6 +17,7 @@ typedef struct io_uring go_uring; typedef struct msghdr go_msghdr; typedef struct iovec go_iovec; +typedef struct sockaddr_in go_sockaddr_in; // Wait for a completion to be available, fetch the data static int receive_into(int sock, struct io_uring *ring, char *ip, uint16_t *port) { @@ -44,13 +45,9 @@ again:; } int n = cqe->res; - struct sockaddr_in sa; - memcpy(&sa, mhdr->msg_name, mhdr->msg_namelen); - - memcpy(ip, &sa.sin_addr, 4); - *port = ntohs(sa.sin_port); - - free(mhdr->msg_name); + struct sockaddr_in *sa = (void *)mhdr->msg_name; + memcpy(ip, &sa->sin_addr, 4); + *port = ntohs(sa->sin_port); io_uring_cqe_seen(ring, cqe); return n; @@ -58,19 +55,13 @@ again:; // submit a recvmsg request via liburing // TODO: What recvfrom support arrives, maybe use that instead? -static int submit_recvmsg_request(int sock, struct io_uring *ring, struct msghdr *mhdr, struct iovec *iov, char *buf, int buflen) { - char *sender = malloc(sizeof(struct sockaddr_in)); - if (!sender) { - perror("malloc(sender)"); - return 1; - } +static int submit_recvmsg_request(int sock, struct io_uring *ring, struct msghdr *mhdr, struct iovec *iov, struct sockaddr_in *sender, char *buf, int buflen) { iov->iov_base = buf; iov->iov_len = buflen; mhdr->msg_iov = iov; mhdr->msg_iovlen = 1; - memset(sender, 0, sizeof(struct sockaddr_in)); mhdr->msg_name = sender; mhdr->msg_namelen = sizeof(struct sockaddr_in); diff --git a/net/uring/io_uring_linux.go b/net/uring/io_uring_linux.go index fd0bca3ed..d7c8cc38b 100644 --- a/net/uring/io_uring_linux.go +++ b/net/uring/io_uring_linux.go @@ -72,8 +72,9 @@ func (u *UDPConn) ReadFromNetaddr(buf []byte) (int, netaddr.IPPort, error) { } mhdr := new(C.go_msghdr) iov := new(C.go_iovec) + sa := new(C.go_sockaddr_in) // TODO: eventually separate submitting the request and waiting for the response. - errno := C.submit_recvmsg_request(u.fd, u.ptr, mhdr, iov, (*C.char)(unsafe.Pointer(&buf[0])), C.int(len(buf))) + errno := C.submit_recvmsg_request(u.fd, u.ptr, mhdr, iov, sa, (*C.char)(unsafe.Pointer(&buf[0])), C.int(len(buf))) if errno < 0 { return 0, netaddr.IPPort{}, fmt.Errorf("uring.UDPConn recv failed: %v", errno) // TODO: Improve errno } @@ -87,6 +88,7 @@ func (u *UDPConn) ReadFromNetaddr(buf []byte) (int, netaddr.IPPort, error) { ipp := netaddr.IPPortFrom(netaddr.IPFrom4(*a), uint16(port)) runtime.KeepAlive(mhdr) runtime.KeepAlive(iov) + runtime.KeepAlive(sa) return int(n), ipp, nil }