Skip to content

Commit 4b2a904

Browse files
committed
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.
1 parent b66e578 commit 4b2a904

File tree

4 files changed

+40
-28
lines changed

4 files changed

+40
-28
lines changed

adapter/platform.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ type PlatformInterface interface {
3232
UsePlatformConnectionOwnerFinder() bool
3333
FindConnectionOwner(request *FindConnectionOwnerRequest) (*ConnectionOwner, error)
3434

35+
UsePlatformWIFIMonitor() bool
36+
3537
UsePlatformNotification() bool
3638
SendNotification(notification *Notification) error
3739
}

experimental/libbox/config.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,10 @@ func (s *platformInterfaceStub) RequestPermissionForWIFIState() error {
116116
return nil
117117
}
118118

119+
func (s *platformInterfaceStub) UsePlatformWIFIMonitor() bool {
120+
return false
121+
}
122+
119123
func (s *platformInterfaceStub) ReadWIFIState() adapter.WIFIState {
120124
return adapter.WIFIState{}
121125
}

experimental/libbox/service.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,10 @@ func (w *platformInterfaceWrapper) RequestPermissionForWIFIState() error {
145145
return nil
146146
}
147147

148+
func (w *platformInterfaceWrapper) UsePlatformWIFIMonitor() bool {
149+
return true
150+
}
151+
148152
func (w *platformInterfaceWrapper) ReadWIFIState() adapter.WIFIState {
149153
wifiState := w.iif.ReadWIFIState()
150154
if wifiState == nil {

route/network.go

Lines changed: 30 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -58,53 +58,53 @@ type NetworkManager struct {
5858
started bool
5959
}
6060

61-
func NewNetworkManager(ctx context.Context, logger logger.ContextLogger, routeOptions option.RouteOptions, dnsOptions option.DNSOptions) (*NetworkManager, error) {
62-
defaultDomainResolver := common.PtrValueOrDefault(routeOptions.DefaultDomainResolver)
63-
if routeOptions.AutoDetectInterface && !(C.IsLinux || C.IsDarwin || C.IsWindows) {
61+
func NewNetworkManager(ctx context.Context, logger logger.ContextLogger, options option.RouteOptions, dnsOptions option.DNSOptions) (*NetworkManager, error) {
62+
defaultDomainResolver := common.PtrValueOrDefault(options.DefaultDomainResolver)
63+
if options.AutoDetectInterface && !(C.IsLinux || C.IsDarwin || C.IsWindows) {
6464
return nil, E.New("`auto_detect_interface` is only supported on Linux, Windows and macOS")
65-
} else if routeOptions.OverrideAndroidVPN && !C.IsAndroid {
65+
} else if options.OverrideAndroidVPN && !C.IsAndroid {
6666
return nil, E.New("`override_android_vpn` is only supported on Android")
67-
} else if routeOptions.DefaultInterface != "" && !(C.IsLinux || C.IsDarwin || C.IsWindows) {
67+
} else if options.DefaultInterface != "" && !(C.IsLinux || C.IsDarwin || C.IsWindows) {
6868
return nil, E.New("`default_interface` is only supported on Linux, Windows and macOS")
69-
} else if routeOptions.DefaultMark != 0 && !C.IsLinux {
69+
} else if options.DefaultMark != 0 && !C.IsLinux {
7070
return nil, E.New("`default_mark` is only supported on linux")
7171
}
7272
nm := &NetworkManager{
7373
logger: logger,
7474
interfaceFinder: control.NewDefaultInterfaceFinder(),
75-
autoDetectInterface: routeOptions.AutoDetectInterface,
75+
autoDetectInterface: options.AutoDetectInterface,
7676
defaultOptions: adapter.NetworkOptions{
77-
BindInterface: routeOptions.DefaultInterface,
78-
RoutingMark: uint32(routeOptions.DefaultMark),
77+
BindInterface: options.DefaultInterface,
78+
RoutingMark: uint32(options.DefaultMark),
7979
DomainResolver: defaultDomainResolver.Server,
8080
DomainResolveOptions: adapter.DNSQueryOptions{
8181
Strategy: C.DomainStrategy(defaultDomainResolver.Strategy),
8282
DisableCache: defaultDomainResolver.DisableCache,
8383
RewriteTTL: defaultDomainResolver.RewriteTTL,
8484
ClientSubnet: defaultDomainResolver.ClientSubnet.Build(netip.Prefix{}),
8585
},
86-
NetworkStrategy: (*C.NetworkStrategy)(routeOptions.DefaultNetworkStrategy),
87-
NetworkType: common.Map(routeOptions.DefaultNetworkType, option.InterfaceType.Build),
88-
FallbackNetworkType: common.Map(routeOptions.DefaultFallbackNetworkType, option.InterfaceType.Build),
89-
FallbackDelay: time.Duration(routeOptions.DefaultFallbackDelay),
86+
NetworkStrategy: (*C.NetworkStrategy)(options.DefaultNetworkStrategy),
87+
NetworkType: common.Map(options.DefaultNetworkType, option.InterfaceType.Build),
88+
FallbackNetworkType: common.Map(options.DefaultFallbackNetworkType, option.InterfaceType.Build),
89+
FallbackDelay: time.Duration(options.DefaultFallbackDelay),
9090
},
9191
pauseManager: service.FromContext[pause.Manager](ctx),
9292
platformInterface: service.FromContext[adapter.PlatformInterface](ctx),
9393
endpoint: service.FromContext[adapter.EndpointManager](ctx),
9494
inbound: service.FromContext[adapter.InboundManager](ctx),
9595
outbound: service.FromContext[adapter.OutboundManager](ctx),
96-
needWIFIState: hasRule(routeOptions.Rules, isWIFIRule) || hasDNSRule(dnsOptions.Rules, isWIFIDNSRule),
96+
needWIFIState: hasRule(options.Rules, isWIFIRule) || hasDNSRule(dnsOptions.Rules, isWIFIDNSRule),
9797
}
98-
if routeOptions.DefaultNetworkStrategy != nil {
99-
if routeOptions.DefaultInterface != "" {
98+
if options.DefaultNetworkStrategy != nil {
99+
if options.DefaultInterface != "" {
100100
return nil, E.New("`default_network_strategy` is conflict with `default_interface`")
101101
}
102-
if !routeOptions.AutoDetectInterface {
102+
if !options.AutoDetectInterface {
103103
return nil, E.New("`auto_detect_interface` is required by `default_network_strategy`")
104104
}
105105
}
106106
usePlatformDefaultInterfaceMonitor := nm.platformInterface != nil
107-
enforceInterfaceMonitor := routeOptions.AutoDetectInterface
107+
enforceInterfaceMonitor := options.AutoDetectInterface
108108
if !usePlatformDefaultInterfaceMonitor {
109109
networkMonitor, err := tun.NewNetworkUpdateMonitor(logger)
110110
if !((err != nil && !enforceInterfaceMonitor) || errors.Is(err, os.ErrInvalid)) {
@@ -114,7 +114,7 @@ func NewNetworkManager(ctx context.Context, logger logger.ContextLogger, routeOp
114114
nm.networkMonitor = networkMonitor
115115
interfaceMonitor, err := tun.NewDefaultInterfaceMonitor(nm.networkMonitor, logger, tun.DefaultInterfaceMonitorOptions{
116116
InterfaceFinder: nm.interfaceFinder,
117-
OverrideAndroidVPN: routeOptions.OverrideAndroidVPN,
117+
OverrideAndroidVPN: options.OverrideAndroidVPN,
118118
UnderNetworkExtension: nm.platformInterface != nil && nm.platformInterface.UnderNetworkExtension(),
119119
})
120120
if err != nil {
@@ -188,7 +188,7 @@ func (r *NetworkManager) Start(stage adapter.StartStage) error {
188188
}
189189
}
190190
case adapter.StartStatePostStart:
191-
if r.needWIFIState && r.platformInterface == nil {
191+
if r.needWIFIState && !(r.platformInterface != nil && r.platformInterface.UsePlatformWIFIMonitor()) {
192192
wifiMonitor, err := settings.NewWIFIMonitor(r.onWIFIStateChanged)
193193
if err != nil {
194194
if err != os.ErrInvalid {
@@ -424,22 +424,24 @@ func (r *NetworkManager) WIFIState() adapter.WIFIState {
424424

425425
func (r *NetworkManager) onWIFIStateChanged(state adapter.WIFIState) {
426426
r.wifiStateMutex.Lock()
427-
if state == r.wifiState {
427+
if state != r.wifiState {
428+
r.wifiState = state
429+
r.wifiStateMutex.Unlock()
430+
if state.SSID != "" {
431+
r.logger.Info("WIFI state changed: SSID=", state.SSID, ", BSSID=", state.BSSID)
432+
} else {
433+
r.logger.Info("WIFI disconnected")
434+
}
435+
} else {
428436
r.wifiStateMutex.Unlock()
429-
return
430-
}
431-
r.wifiState = state
432-
r.wifiStateMutex.Unlock()
433-
if state.SSID != "" {
434-
r.logger.Info("updated WIFI state: SSID=", state.SSID, ", BSSID=", state.BSSID)
435437
}
436438
}
437439

438440
func (r *NetworkManager) UpdateWIFIState() {
439441
var state adapter.WIFIState
440442
if r.wifiMonitor != nil {
441443
state = r.wifiMonitor.ReadWIFIState()
442-
} else if r.platformInterface != nil {
444+
} else if r.platformInterface != nil && r.platformInterface.UsePlatformWIFIMonitor() {
443445
state = r.platformInterface.ReadWIFIState()
444446
} else {
445447
return

0 commit comments

Comments
 (0)