mirror of
https://github.com/shtorm-7/sing-box-extended.git
synced 2026-07-16 21:09:44 +03:00
platform: Add UsePlatformWIFIMonitor to gRPC interface
Align dev-next-grpc with wip2 by adding UsePlatformWIFIMonitor() to the new PlatformInterface, allowing platform clients to indicate they handle WIFI monitoring themselves.
This commit is contained in:
@@ -32,6 +32,8 @@ type PlatformInterface interface {
|
|||||||
UsePlatformConnectionOwnerFinder() bool
|
UsePlatformConnectionOwnerFinder() bool
|
||||||
FindConnectionOwner(request *FindConnectionOwnerRequest) (*ConnectionOwner, error)
|
FindConnectionOwner(request *FindConnectionOwnerRequest) (*ConnectionOwner, error)
|
||||||
|
|
||||||
|
UsePlatformWIFIMonitor() bool
|
||||||
|
|
||||||
UsePlatformNotification() bool
|
UsePlatformNotification() bool
|
||||||
SendNotification(notification *Notification) error
|
SendNotification(notification *Notification) error
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -116,6 +116,10 @@ func (s *platformInterfaceStub) RequestPermissionForWIFIState() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *platformInterfaceStub) UsePlatformWIFIMonitor() bool {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
func (s *platformInterfaceStub) ReadWIFIState() adapter.WIFIState {
|
func (s *platformInterfaceStub) ReadWIFIState() adapter.WIFIState {
|
||||||
return adapter.WIFIState{}
|
return adapter.WIFIState{}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -145,6 +145,10 @@ func (w *platformInterfaceWrapper) RequestPermissionForWIFIState() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (w *platformInterfaceWrapper) UsePlatformWIFIMonitor() bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
func (w *platformInterfaceWrapper) ReadWIFIState() adapter.WIFIState {
|
func (w *platformInterfaceWrapper) ReadWIFIState() adapter.WIFIState {
|
||||||
wifiState := w.iif.ReadWIFIState()
|
wifiState := w.iif.ReadWIFIState()
|
||||||
if wifiState == nil {
|
if wifiState == nil {
|
||||||
|
|||||||
@@ -58,24 +58,24 @@ type NetworkManager struct {
|
|||||||
started bool
|
started bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewNetworkManager(ctx context.Context, logger logger.ContextLogger, routeOptions option.RouteOptions, dnsOptions option.DNSOptions) (*NetworkManager, error) {
|
func NewNetworkManager(ctx context.Context, logger logger.ContextLogger, options option.RouteOptions, dnsOptions option.DNSOptions) (*NetworkManager, error) {
|
||||||
defaultDomainResolver := common.PtrValueOrDefault(routeOptions.DefaultDomainResolver)
|
defaultDomainResolver := common.PtrValueOrDefault(options.DefaultDomainResolver)
|
||||||
if routeOptions.AutoDetectInterface && !(C.IsLinux || C.IsDarwin || C.IsWindows) {
|
if options.AutoDetectInterface && !(C.IsLinux || C.IsDarwin || C.IsWindows) {
|
||||||
return nil, E.New("`auto_detect_interface` is only supported on Linux, Windows and macOS")
|
return nil, E.New("`auto_detect_interface` is only supported on Linux, Windows and macOS")
|
||||||
} else if routeOptions.OverrideAndroidVPN && !C.IsAndroid {
|
} else if options.OverrideAndroidVPN && !C.IsAndroid {
|
||||||
return nil, E.New("`override_android_vpn` is only supported on Android")
|
return nil, E.New("`override_android_vpn` is only supported on Android")
|
||||||
} else if routeOptions.DefaultInterface != "" && !(C.IsLinux || C.IsDarwin || C.IsWindows) {
|
} else if options.DefaultInterface != "" && !(C.IsLinux || C.IsDarwin || C.IsWindows) {
|
||||||
return nil, E.New("`default_interface` is only supported on Linux, Windows and macOS")
|
return nil, E.New("`default_interface` is only supported on Linux, Windows and macOS")
|
||||||
} else if routeOptions.DefaultMark != 0 && !C.IsLinux {
|
} else if options.DefaultMark != 0 && !C.IsLinux {
|
||||||
return nil, E.New("`default_mark` is only supported on linux")
|
return nil, E.New("`default_mark` is only supported on linux")
|
||||||
}
|
}
|
||||||
nm := &NetworkManager{
|
nm := &NetworkManager{
|
||||||
logger: logger,
|
logger: logger,
|
||||||
interfaceFinder: control.NewDefaultInterfaceFinder(),
|
interfaceFinder: control.NewDefaultInterfaceFinder(),
|
||||||
autoDetectInterface: routeOptions.AutoDetectInterface,
|
autoDetectInterface: options.AutoDetectInterface,
|
||||||
defaultOptions: adapter.NetworkOptions{
|
defaultOptions: adapter.NetworkOptions{
|
||||||
BindInterface: routeOptions.DefaultInterface,
|
BindInterface: options.DefaultInterface,
|
||||||
RoutingMark: uint32(routeOptions.DefaultMark),
|
RoutingMark: uint32(options.DefaultMark),
|
||||||
DomainResolver: defaultDomainResolver.Server,
|
DomainResolver: defaultDomainResolver.Server,
|
||||||
DomainResolveOptions: adapter.DNSQueryOptions{
|
DomainResolveOptions: adapter.DNSQueryOptions{
|
||||||
Strategy: C.DomainStrategy(defaultDomainResolver.Strategy),
|
Strategy: C.DomainStrategy(defaultDomainResolver.Strategy),
|
||||||
@@ -83,28 +83,28 @@ func NewNetworkManager(ctx context.Context, logger logger.ContextLogger, routeOp
|
|||||||
RewriteTTL: defaultDomainResolver.RewriteTTL,
|
RewriteTTL: defaultDomainResolver.RewriteTTL,
|
||||||
ClientSubnet: defaultDomainResolver.ClientSubnet.Build(netip.Prefix{}),
|
ClientSubnet: defaultDomainResolver.ClientSubnet.Build(netip.Prefix{}),
|
||||||
},
|
},
|
||||||
NetworkStrategy: (*C.NetworkStrategy)(routeOptions.DefaultNetworkStrategy),
|
NetworkStrategy: (*C.NetworkStrategy)(options.DefaultNetworkStrategy),
|
||||||
NetworkType: common.Map(routeOptions.DefaultNetworkType, option.InterfaceType.Build),
|
NetworkType: common.Map(options.DefaultNetworkType, option.InterfaceType.Build),
|
||||||
FallbackNetworkType: common.Map(routeOptions.DefaultFallbackNetworkType, option.InterfaceType.Build),
|
FallbackNetworkType: common.Map(options.DefaultFallbackNetworkType, option.InterfaceType.Build),
|
||||||
FallbackDelay: time.Duration(routeOptions.DefaultFallbackDelay),
|
FallbackDelay: time.Duration(options.DefaultFallbackDelay),
|
||||||
},
|
},
|
||||||
pauseManager: service.FromContext[pause.Manager](ctx),
|
pauseManager: service.FromContext[pause.Manager](ctx),
|
||||||
platformInterface: service.FromContext[adapter.PlatformInterface](ctx),
|
platformInterface: service.FromContext[adapter.PlatformInterface](ctx),
|
||||||
endpoint: service.FromContext[adapter.EndpointManager](ctx),
|
endpoint: service.FromContext[adapter.EndpointManager](ctx),
|
||||||
inbound: service.FromContext[adapter.InboundManager](ctx),
|
inbound: service.FromContext[adapter.InboundManager](ctx),
|
||||||
outbound: service.FromContext[adapter.OutboundManager](ctx),
|
outbound: service.FromContext[adapter.OutboundManager](ctx),
|
||||||
needWIFIState: hasRule(routeOptions.Rules, isWIFIRule) || hasDNSRule(dnsOptions.Rules, isWIFIDNSRule),
|
needWIFIState: hasRule(options.Rules, isWIFIRule) || hasDNSRule(dnsOptions.Rules, isWIFIDNSRule),
|
||||||
}
|
}
|
||||||
if routeOptions.DefaultNetworkStrategy != nil {
|
if options.DefaultNetworkStrategy != nil {
|
||||||
if routeOptions.DefaultInterface != "" {
|
if options.DefaultInterface != "" {
|
||||||
return nil, E.New("`default_network_strategy` is conflict with `default_interface`")
|
return nil, E.New("`default_network_strategy` is conflict with `default_interface`")
|
||||||
}
|
}
|
||||||
if !routeOptions.AutoDetectInterface {
|
if !options.AutoDetectInterface {
|
||||||
return nil, E.New("`auto_detect_interface` is required by `default_network_strategy`")
|
return nil, E.New("`auto_detect_interface` is required by `default_network_strategy`")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
usePlatformDefaultInterfaceMonitor := nm.platformInterface != nil
|
usePlatformDefaultInterfaceMonitor := nm.platformInterface != nil
|
||||||
enforceInterfaceMonitor := routeOptions.AutoDetectInterface
|
enforceInterfaceMonitor := options.AutoDetectInterface
|
||||||
if !usePlatformDefaultInterfaceMonitor {
|
if !usePlatformDefaultInterfaceMonitor {
|
||||||
networkMonitor, err := tun.NewNetworkUpdateMonitor(logger)
|
networkMonitor, err := tun.NewNetworkUpdateMonitor(logger)
|
||||||
if !((err != nil && !enforceInterfaceMonitor) || errors.Is(err, os.ErrInvalid)) {
|
if !((err != nil && !enforceInterfaceMonitor) || errors.Is(err, os.ErrInvalid)) {
|
||||||
@@ -114,7 +114,7 @@ func NewNetworkManager(ctx context.Context, logger logger.ContextLogger, routeOp
|
|||||||
nm.networkMonitor = networkMonitor
|
nm.networkMonitor = networkMonitor
|
||||||
interfaceMonitor, err := tun.NewDefaultInterfaceMonitor(nm.networkMonitor, logger, tun.DefaultInterfaceMonitorOptions{
|
interfaceMonitor, err := tun.NewDefaultInterfaceMonitor(nm.networkMonitor, logger, tun.DefaultInterfaceMonitorOptions{
|
||||||
InterfaceFinder: nm.interfaceFinder,
|
InterfaceFinder: nm.interfaceFinder,
|
||||||
OverrideAndroidVPN: routeOptions.OverrideAndroidVPN,
|
OverrideAndroidVPN: options.OverrideAndroidVPN,
|
||||||
UnderNetworkExtension: nm.platformInterface != nil && nm.platformInterface.UnderNetworkExtension(),
|
UnderNetworkExtension: nm.platformInterface != nil && nm.platformInterface.UnderNetworkExtension(),
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -188,7 +188,7 @@ func (r *NetworkManager) Start(stage adapter.StartStage) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
case adapter.StartStatePostStart:
|
case adapter.StartStatePostStart:
|
||||||
if r.needWIFIState && r.platformInterface == nil {
|
if r.needWIFIState && !(r.platformInterface != nil && r.platformInterface.UsePlatformWIFIMonitor()) {
|
||||||
wifiMonitor, err := settings.NewWIFIMonitor(r.onWIFIStateChanged)
|
wifiMonitor, err := settings.NewWIFIMonitor(r.onWIFIStateChanged)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err != os.ErrInvalid {
|
if err != os.ErrInvalid {
|
||||||
@@ -424,14 +424,16 @@ func (r *NetworkManager) WIFIState() adapter.WIFIState {
|
|||||||
|
|
||||||
func (r *NetworkManager) onWIFIStateChanged(state adapter.WIFIState) {
|
func (r *NetworkManager) onWIFIStateChanged(state adapter.WIFIState) {
|
||||||
r.wifiStateMutex.Lock()
|
r.wifiStateMutex.Lock()
|
||||||
if state == r.wifiState {
|
if state != r.wifiState {
|
||||||
|
r.wifiState = state
|
||||||
|
r.wifiStateMutex.Unlock()
|
||||||
|
if state.SSID != "" {
|
||||||
|
r.logger.Info("WIFI state changed: SSID=", state.SSID, ", BSSID=", state.BSSID)
|
||||||
|
} else {
|
||||||
|
r.logger.Info("WIFI disconnected")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
r.wifiStateMutex.Unlock()
|
r.wifiStateMutex.Unlock()
|
||||||
return
|
|
||||||
}
|
|
||||||
r.wifiState = state
|
|
||||||
r.wifiStateMutex.Unlock()
|
|
||||||
if state.SSID != "" {
|
|
||||||
r.logger.Info("updated WIFI state: SSID=", state.SSID, ", BSSID=", state.BSSID)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -439,7 +441,7 @@ func (r *NetworkManager) UpdateWIFIState() {
|
|||||||
var state adapter.WIFIState
|
var state adapter.WIFIState
|
||||||
if r.wifiMonitor != nil {
|
if r.wifiMonitor != nil {
|
||||||
state = r.wifiMonitor.ReadWIFIState()
|
state = r.wifiMonitor.ReadWIFIState()
|
||||||
} else if r.platformInterface != nil {
|
} else if r.platformInterface != nil && r.platformInterface.UsePlatformWIFIMonitor() {
|
||||||
state = r.platformInterface.ReadWIFIState()
|
state = r.platformInterface.ReadWIFIState()
|
||||||
} else {
|
} else {
|
||||||
return
|
return
|
||||||
|
|||||||
Reference in New Issue
Block a user