]> git.ipfire.org Git - thirdparty/wireguard-go.git/commitdiff
tun: use SockaddrCtl from golang.org/x/sys/unix on macOS
authorTobias Klauser <tklauser@distanz.ch>
Tue, 27 Oct 2020 13:39:36 +0000 (14:39 +0100)
committerJason A. Donenfeld <Jason@zx2c4.com>
Tue, 27 Oct 2020 15:20:09 +0000 (16:20 +0100)
Direct syscalls using unix.Syscall(unix.SYS_*, ...) are discouraged on
macOS and might not be supported in future versions. Switch to use
unix.Connect with unix.SockaddrCtl instead.

Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
tun/tun_darwin.go

index 54021c5db11eebb4f7c2ecb6762bdee51dca7b38..7a06af51c7da8e4fa9ee576153c04e3fb1a6908c 100644 (file)
@@ -20,16 +20,6 @@ import (
 
 const utunControlName = "com.apple.net.utun_control"
 
-// sockaddr_ctl specifeid in /usr/include/sys/kern_control.h
-type sockaddrCtl struct {
-       scLen      uint8
-       scFamily   uint8
-       ssSysaddr  uint16
-       scID       uint32
-       scUnit     uint32
-       scReserved [5]uint32
-}
-
 type NativeTun struct {
        name        string
        tunFile     *os.File
@@ -38,8 +28,6 @@ type NativeTun struct {
        routeSocket int
 }
 
-var sockaddrCtlSize uintptr = 32
-
 func retryInterfaceByIndex(index int) (iface *net.Interface, err error) {
        for i := 0; i < 20; i++ {
                iface, err = net.InterfaceByIndex(index)
@@ -134,25 +122,14 @@ func CreateTUN(name string, mtu int) (Device, error) {
                return nil, fmt.Errorf("IoctlGetCtlInfo: %w", err)
        }
 
-       sc := sockaddrCtl{
-               scLen:     uint8(sockaddrCtlSize),
-               scFamily:  unix.AF_SYSTEM,
-               ssSysaddr: 2,
-               scID:      ctlInfo.Id,
-               scUnit:    uint32(ifIndex) + 1,
+       sc := &unix.SockaddrCtl{
+               ID:   ctlInfo.Id,
+               Unit: uint32(ifIndex) + 1,
        }
 
-       scPointer := unsafe.Pointer(&sc)
-
-       _, _, errno = unix.RawSyscall(
-               unix.SYS_CONNECT,
-               uintptr(fd),
-               uintptr(scPointer),
-               uintptr(sockaddrCtlSize),
-       )
-
-       if errno != 0 {
-               return nil, fmt.Errorf("SYS_CONNECT: %v", errno)
+       err = unix.Connect(fd, sc)
+       if err != nil {
+               return nil, err
        }
 
        err = syscall.SetNonblock(fd, true)