]> git.ipfire.org Git - thirdparty/wireguard-go.git/commitdiff
tun: use Ioctl{Get,Set}IfreqMTU from golang.org/x/sys/unix on macOS
authorTobias Klauser <tklauser@distanz.ch>
Tue, 27 Oct 2020 13:39:35 +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.Ioctl{Get,Set}IfreqMTU to get and set an interface's MTU.

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

index c30e733720102e99e2590348db4cbb1f72f6e7ad..54021c5db11eebb4f7c2ecb6762bdee51dca7b38 100644 (file)
@@ -298,11 +298,6 @@ func (tun *NativeTun) Close() error {
 }
 
 func (tun *NativeTun) setMTU(n int) error {
-
-       // open datagram socket
-
-       var fd int
-
        fd, err := unix.Socket(
                unix.AF_INET,
                unix.SOCK_DGRAM,
@@ -315,29 +310,18 @@ func (tun *NativeTun) setMTU(n int) error {
 
        defer unix.Close(fd)
 
-       // do ioctl call
-
-       var ifr [32]byte
-       copy(ifr[:], tun.name)
-       *(*uint32)(unsafe.Pointer(&ifr[unix.IFNAMSIZ])) = uint32(n)
-       _, _, errno := unix.Syscall(
-               unix.SYS_IOCTL,
-               uintptr(fd),
-               uintptr(unix.SIOCSIFMTU),
-               uintptr(unsafe.Pointer(&ifr[0])),
-       )
-
-       if errno != 0 {
-               return fmt.Errorf("failed to set MTU on %s", tun.name)
+       var ifr unix.IfreqMTU
+       copy(ifr.Name[:], tun.name)
+       ifr.MTU = int32(n)
+       err = unix.IoctlSetIfreqMTU(fd, &ifr)
+       if err != nil {
+               return fmt.Errorf("failed to set MTU on %s: %w", tun.name, err)
        }
 
        return nil
 }
 
 func (tun *NativeTun) MTU() (int, error) {
-
-       // open datagram socket
-
        fd, err := unix.Socket(
                unix.AF_INET,
                unix.SOCK_DGRAM,
@@ -350,19 +334,10 @@ func (tun *NativeTun) MTU() (int, error) {
 
        defer unix.Close(fd)
 
-       // do ioctl call
-
-       var ifr [64]byte
-       copy(ifr[:], tun.name)
-       _, _, errno := unix.Syscall(
-               unix.SYS_IOCTL,
-               uintptr(fd),
-               uintptr(unix.SIOCGIFMTU),
-               uintptr(unsafe.Pointer(&ifr[0])),
-       )
-       if errno != 0 {
-               return 0, fmt.Errorf("failed to get MTU on %s", tun.name)
+       ifr, err := unix.IoctlGetIfreqMTU(fd, tun.name)
+       if err != nil {
+               return 0, fmt.Errorf("failed to get MTU on %s: %w", tun.name, err)
        }
 
-       return int(*(*int32)(unsafe.Pointer(&ifr[16]))), nil
+       return int(ifr.MTU), nil
 }