mirror of
https://github.com/tailscale/tailscale.git
synced 2026-04-04 14:43:42 -04:00
mve sockaddr_in to Go
This commit is contained in:
@@ -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);
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user