mve sockaddr_in to Go

This commit is contained in:
Josh Bleecher Snyder
2021-06-01 16:06:59 -07:00
parent 56ece41326
commit 48e338130e
2 changed files with 8 additions and 15 deletions

View File

@@ -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);

View File

@@ -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
}