mirror of
https://github.com/SagerNet/sing-tun.git
synced 2025-04-04 12:27:39 +03:00
Fix darwin monitor
This commit is contained in:
parent
6ef2a6cdaa
commit
689e60891c
2 changed files with 62 additions and 47 deletions
|
@ -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,6 +101,16 @@ func (m *networkUpdateMonitor) Close() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *defaultInterfaceMonitor) checkUpdate() error {
|
func (m *defaultInterfaceMonitor) checkUpdate() error {
|
||||||
|
var (
|
||||||
|
defaultInterface *net.Interface
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
if m.options.UnderNetworkExtension {
|
||||||
|
defaultInterface, err = getDefaultInterfaceBySocket()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
ribMessage, err := route.FetchRIB(unix.AF_UNSPEC, route.RIBTypeRoute, 0)
|
ribMessage, err := route.FetchRIB(unix.AF_UNSPEC, route.RIBTypeRoute, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -100,7 +119,6 @@ func (m *defaultInterfaceMonitor) checkUpdate() error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
var defaultInterface *net.Interface
|
|
||||||
for _, rawRouteMessage := range routeMessages {
|
for _, rawRouteMessage := range routeMessages {
|
||||||
routeMessage := rawRouteMessage.(*route.RouteMessage)
|
routeMessage := rawRouteMessage.(*route.RouteMessage)
|
||||||
if len(routeMessage.Addrs) <= unix.RTAX_NETMASK {
|
if len(routeMessage.Addrs) <= unix.RTAX_NETMASK {
|
||||||
|
@ -137,13 +155,6 @@ func (m *defaultInterfaceMonitor) checkUpdate() error {
|
||||||
defaultInterface = routeInterface
|
defaultInterface = routeInterface
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
if defaultInterface == nil {
|
|
||||||
if m.options.UnderNetworkExtension {
|
|
||||||
defaultInterface, err = getDefaultInterfaceBySocket()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if defaultInterface == nil {
|
if defaultInterface == nil {
|
||||||
return ErrNoRoute
|
return ErrNoRoute
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue