@@ -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
425425func (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
438440func (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