Fix interface callback

This commit is contained in:
世界 2024-11-12 23:18:20 +08:00
parent 64c0f526fd
commit b4300eaa6a
No known key found for this signature in database
GPG key ID: CD109927C34A63C4
7 changed files with 16 additions and 22 deletions

View file

@ -10,14 +10,10 @@ var ErrNoRoute = E.New("no route to internet")
type ( type (
NetworkUpdateCallback = func() NetworkUpdateCallback = func()
DefaultInterfaceUpdateCallback = func(event int) DefaultInterfaceUpdateCallback = func(defaultInterface *control.Interface, flags int)
) )
const ( const FlagAndroidVPNUpdate = 1 << iota
EventInterfaceUpdate = 1
EventAndroidVPNUpdate = 2
EventNoRoute = 4
)
type NetworkUpdateMonitor interface { type NetworkUpdateMonitor interface {
Start() error Start() error

View file

@ -57,16 +57,13 @@ func (m *defaultInterfaceMonitor) checkUpdate() error {
return E.Cause(err, "find updated interface: ", link.Attrs().Name) return E.Cause(err, "find updated interface: ", link.Attrs().Name)
} }
m.defaultInterface.Store(newInterface) m.defaultInterface.Store(newInterface)
var event int if oldInterface != nil && oldInterface.Equals(*newInterface) && oldVPNEnabled == m.androidVPNEnabled {
if oldInterface == nil || !oldInterface.Equals(*newInterface) { return nil
event |= EventInterfaceUpdate
} }
var flags int
if oldVPNEnabled != m.androidVPNEnabled { if oldVPNEnabled != m.androidVPNEnabled {
event |= EventAndroidVPNUpdate flags = FlagAndroidVPNUpdate
} }
if event != 0 { m.emit(newInterface, flags)
m.emit(event)
}
return nil return nil
} }

View file

@ -174,7 +174,7 @@ func (m *defaultInterfaceMonitor) checkUpdate() error {
if oldInterface != nil && oldInterface.Equals(*newInterface) { if oldInterface != nil && oldInterface.Equals(*newInterface) {
return nil return nil
} }
m.emit(EventInterfaceUpdate) m.emit(newInterface, 0)
return nil return nil
} }

View file

@ -34,7 +34,7 @@ func (m *defaultInterfaceMonitor) checkUpdate() error {
if oldInterface != nil && oldInterface.Equals(*newInterface) { if oldInterface != nil && oldInterface.Equals(*newInterface) {
return nil return nil
} }
m.emit(EventInterfaceUpdate) m.emit(newInterface, 0)
return nil return nil
} }
return ErrNoRoute return ErrNoRoute

View file

@ -84,7 +84,7 @@ func (m *defaultInterfaceMonitor) postCheckUpdate() {
if !m.noRoute { if !m.noRoute {
m.noRoute = true m.noRoute = true
m.defaultInterface.Store(nil) m.defaultInterface.Store(nil)
m.emit(EventNoRoute) m.emit(nil, 0)
} }
} else if err != nil { } else if err != nil {
m.logger.Error("check interface: ", err) m.logger.Error("check interface: ", err)
@ -124,11 +124,11 @@ func (m *defaultInterfaceMonitor) UnregisterCallback(element *list.Element[Defau
m.callbacks.Remove(element) m.callbacks.Remove(element)
} }
func (m *defaultInterfaceMonitor) emit(event int) { func (m *defaultInterfaceMonitor) emit(defaultInterface *control.Interface, flags int) {
m.access.Lock() m.access.Lock()
callbacks := m.callbacks.Array() callbacks := m.callbacks.Array()
m.access.Unlock() m.access.Unlock()
for _, callback := range callbacks { for _, callback := range callbacks {
callback(event) callback(defaultInterface, flags)
} }
} }

View file

@ -111,6 +111,6 @@ func (m *defaultInterfaceMonitor) checkUpdate() error {
if oldInterface != nil && !oldInterface.Equals(*newInterface) { if oldInterface != nil && !oldInterface.Equals(*newInterface) {
return nil return nil
} }
m.emit(EventInterfaceUpdate) m.emit(newInterface, 0)
return nil return nil
} }

View file

@ -16,6 +16,7 @@ import (
"github.com/sagernet/sing/common" "github.com/sagernet/sing/common"
"github.com/sagernet/sing/common/buf" "github.com/sagernet/sing/common/buf"
"github.com/sagernet/sing/common/bufio" "github.com/sagernet/sing/common/bufio"
"github.com/sagernet/sing/common/control"
E "github.com/sagernet/sing/common/exceptions" E "github.com/sagernet/sing/common/exceptions"
N "github.com/sagernet/sing/common/network" N "github.com/sagernet/sing/common/network"
"github.com/sagernet/sing/common/rw" "github.com/sagernet/sing/common/rw"
@ -881,8 +882,8 @@ func (t *NativeTun) resetRules() error {
return t.setRules() return t.setRules()
} }
func (t *NativeTun) routeUpdate(event int) { func (t *NativeTun) routeUpdate(_ *control.Interface, flags int) {
if event&EventAndroidVPNUpdate == 0 { if flags&FlagAndroidVPNUpdate == 0 {
return return
} }
err := t.resetRules() err := t.resetRules()