]> git.ipfire.org Git - thirdparty/wireguard-go.git/commitdiff
tun: darwin: fetch flags and mtu from if_msghdr directly
authorruokeqx <ruokeqx@gmail.com>
Thu, 2 Jan 2025 12:28:33 +0000 (20:28 +0800)
committerJason A. Donenfeld <Jason@zx2c4.com>
Mon, 5 May 2025 13:10:08 +0000 (15:10 +0200)
Signed-off-by: ruokeqx <ruokeqx@gmail.com>
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
tun/tun_darwin.go

index 407b6f2e978a242306be6360aef9471370c3a582..341afe3c5998051514cf57e2dd7efb24f0c3f9f6 100644 (file)
@@ -6,14 +6,12 @@
 package tun
 
 import (
-       "errors"
        "fmt"
        "io"
        "net"
        "os"
        "sync"
        "syscall"
-       "time"
        "unsafe"
 
        "golang.org/x/sys/unix"
@@ -30,18 +28,6 @@ type NativeTun struct {
        closeOnce   sync.Once
 }
 
-func retryInterfaceByIndex(index int) (iface *net.Interface, err error) {
-       for i := 0; i < 20; i++ {
-               iface, err = net.InterfaceByIndex(index)
-               if err != nil && errors.Is(err, unix.ENOMEM) {
-                       time.Sleep(time.Duration(i) * time.Second / 3)
-                       continue
-               }
-               return iface, err
-       }
-       return nil, err
-}
-
 func (tun *NativeTun) routineRouteListener(tunIfindex int) {
        var (
                statusUp  bool
@@ -62,26 +48,22 @@ func (tun *NativeTun) routineRouteListener(tunIfindex int) {
                        return
                }
 
-               if n < 14 {
+               if n < 28 {
                        continue
                }
 
-               if data[3 /* type */] != unix.RTM_IFINFO {
+               if data[3 /* ifm_type */] != unix.RTM_IFINFO {
                        continue
                }
-               ifindex := int(*(*uint16)(unsafe.Pointer(&data[12 /* ifindex */])))
+               ifindex := int(*(*uint16)(unsafe.Pointer(&data[12 /* ifm_index */])))
                if ifindex != tunIfindex {
                        continue
                }
 
-               iface, err := retryInterfaceByIndex(ifindex)
-               if err != nil {
-                       tun.errors <- err
-                       return
-               }
+               flags := int(*(*uint32)(unsafe.Pointer(&data[8 /* ifm_flags */])))
 
                // Up / Down event
-               up := (iface.Flags & net.FlagUp) != 0
+               up := (flags & syscall.IFF_UP) != 0
                if up != statusUp && up {
                        tun.events <- EventUp
                }
@@ -90,11 +72,13 @@ func (tun *NativeTun) routineRouteListener(tunIfindex int) {
                }
                statusUp = up
 
+               mtu := int(*(*uint32)(unsafe.Pointer(&data[24 /* ifm_data.ifi_mtu */])))
+
                // MTU changes
-               if iface.MTU != statusMTU {
+               if mtu != statusMTU {
                        tun.events <- EventMTUUpdate
                }
-               statusMTU = iface.MTU
+               statusMTU = mtu
        }
 }