Fix darwin monitor

This commit is contained in:
世界 2024-03-14 13:37:44 +08:00
parent 6ef2a6cdaa
commit 689e60891c
No known key found for this signature in database
GPG key ID: CD109927C34A63C4
2 changed files with 62 additions and 47 deletions

View file

@ -42,7 +42,7 @@ func (m *networkUpdateMonitor) loopUpdate() {
select { select {
case <-m.done: case <-m.done:
return return
case <-time.After(time.Second): default:
} }
err := m.loopUpdate0() err := m.loopUpdate0()
if err != nil { if err != nil {
@ -67,7 +67,16 @@ func (m *networkUpdateMonitor) loopUpdate1(routeSocketFile *os.File) {
defer routeSocketFile.Close() defer routeSocketFile.Close()
buffer := buf.NewPacket() buffer := buf.NewPacket()
defer buffer.Release() defer buffer.Release()
done := make(chan struct{})
go func() {
select {
case <-m.done:
routeSocketFile.Close()
case <-done:
}
}()
n, err := routeSocketFile.Read(buffer.FreeBytes()) n, err := routeSocketFile.Read(buffer.FreeBytes())
close(done)
if err != nil { if err != nil {
return return
} }
@ -92,57 +101,59 @@ func (m *networkUpdateMonitor) Close() error {
} }
func (m *defaultInterfaceMonitor) checkUpdate() error { func (m *defaultInterfaceMonitor) checkUpdate() error {
ribMessage, err := route.FetchRIB(unix.AF_UNSPEC, route.RIBTypeRoute, 0) var (
if err != nil { defaultInterface *net.Interface
return err err error
} )
routeMessages, err := route.ParseRIB(route.RIBTypeRoute, ribMessage) if m.options.UnderNetworkExtension {
if err != nil { defaultInterface, err = getDefaultInterfaceBySocket()
return err
}
var defaultInterface *net.Interface
for _, rawRouteMessage := range routeMessages {
routeMessage := rawRouteMessage.(*route.RouteMessage)
if len(routeMessage.Addrs) <= unix.RTAX_NETMASK {
continue
}
destination, isIPv4Destination := routeMessage.Addrs[unix.RTAX_DST].(*route.Inet4Addr)
if !isIPv4Destination {
continue
}
if destination.IP != netip.IPv4Unspecified().As4() {
continue
}
mask, isIPv4Mask := routeMessage.Addrs[unix.RTAX_NETMASK].(*route.Inet4Addr)
if !isIPv4Mask {
continue
}
ones, _ := net.IPMask(mask.IP[:]).Size()
if ones != 0 {
continue
}
routeInterface, err := net.InterfaceByIndex(routeMessage.Index)
if err != nil { if err != nil {
return err return err
} }
if routeMessage.Flags&unix.RTF_UP == 0 { } else {
continue ribMessage, err := route.FetchRIB(unix.AF_UNSPEC, route.RIBTypeRoute, 0)
if err != nil {
return err
} }
if routeMessage.Flags&unix.RTF_GATEWAY == 0 { routeMessages, err := route.ParseRIB(route.RIBTypeRoute, ribMessage)
continue if err != nil {
return err
} }
if routeMessage.Flags&unix.RTF_IFSCOPE != 0 { for _, rawRouteMessage := range routeMessages {
// continue routeMessage := rawRouteMessage.(*route.RouteMessage)
} if len(routeMessage.Addrs) <= unix.RTAX_NETMASK {
defaultInterface = routeInterface continue
break }
} destination, isIPv4Destination := routeMessage.Addrs[unix.RTAX_DST].(*route.Inet4Addr)
if defaultInterface == nil { if !isIPv4Destination {
if m.options.UnderNetworkExtension { continue
defaultInterface, err = getDefaultInterfaceBySocket() }
if destination.IP != netip.IPv4Unspecified().As4() {
continue
}
mask, isIPv4Mask := routeMessage.Addrs[unix.RTAX_NETMASK].(*route.Inet4Addr)
if !isIPv4Mask {
continue
}
ones, _ := net.IPMask(mask.IP[:]).Size()
if ones != 0 {
continue
}
routeInterface, err := net.InterfaceByIndex(routeMessage.Index)
if err != nil { if err != nil {
return err return err
} }
if routeMessage.Flags&unix.RTF_UP == 0 {
continue
}
if routeMessage.Flags&unix.RTF_GATEWAY == 0 {
continue
}
if routeMessage.Flags&unix.RTF_IFSCOPE != 0 {
// continue
}
defaultInterface = routeInterface
break
} }
} }
if defaultInterface == nil { if defaultInterface == nil {

View file

@ -6,7 +6,6 @@ import (
"errors" "errors"
"net" "net"
"net/netip" "net/netip"
"runtime"
"sync" "sync"
"time" "time"
@ -44,6 +43,7 @@ type defaultInterfaceMonitor struct {
defaultInterfaceIndex int defaultInterfaceIndex int
androidVPNEnabled bool androidVPNEnabled bool
networkMonitor NetworkUpdateMonitor networkMonitor NetworkUpdateMonitor
checkUpdateTimer *time.Timer
element *list.Element[NetworkUpdateCallback] element *list.Element[NetworkUpdateCallback]
access sync.Mutex access sync.Mutex
callbacks list.List[DefaultInterfaceUpdateCallback] callbacks list.List[DefaultInterfaceUpdateCallback]
@ -72,9 +72,13 @@ func (m *defaultInterfaceMonitor) Start() error {
} }
func (m *defaultInterfaceMonitor) delayCheckUpdate() { func (m *defaultInterfaceMonitor) delayCheckUpdate() {
if runtime.GOOS == "android" { if m.checkUpdateTimer != nil {
time.Sleep(time.Second) m.checkUpdateTimer.Stop()
} }
m.checkUpdateTimer = time.AfterFunc(time.Second, m.postCheckUpdate)
}
func (m *defaultInterfaceMonitor) postCheckUpdate() {
err := m.updateInterfaces() err := m.updateInterfaces()
if err != nil { if err != nil {
m.logger.Error("update interfaces: ", err) m.logger.Error("update interfaces: ", err)