platform: Implement set underlying networks for android

This commit is contained in:
世界 2024-12-22 01:00:19 +08:00
parent f0f3a45904
commit eb4a184b7e
No known key found for this signature in database
GPG Key ID: CD109927C34A63C4
8 changed files with 43 additions and 0 deletions

View File

@ -51,4 +51,5 @@ type NetworkInterface struct {
DNSServers []string DNSServers []string
Expensive bool Expensive bool
Constrained bool Constrained bool
RawNetwork any
} }

View File

@ -78,6 +78,10 @@ func (s *platformInterfaceStub) Interfaces() ([]adapter.NetworkInterface, error)
return nil, os.ErrInvalid return nil, os.ErrInvalid
} }
func (s *platformInterfaceStub) SetUnderlyingNetworks(networks []adapter.NetworkInterface) error {
return os.ErrInvalid
}
func (s *platformInterfaceStub) UnderNetworkExtension() bool { func (s *platformInterfaceStub) UnderNetworkExtension() bool {
return false return false
} }

View File

@ -17,6 +17,7 @@ type PlatformInterface interface {
StartDefaultInterfaceMonitor(listener InterfaceUpdateListener) error StartDefaultInterfaceMonitor(listener InterfaceUpdateListener) error
CloseDefaultInterfaceMonitor(listener InterfaceUpdateListener) error CloseDefaultInterfaceMonitor(listener InterfaceUpdateListener) error
GetInterfaces() (NetworkInterfaceIterator, error) GetInterfaces() (NetworkInterfaceIterator, error)
SetUnderlyingNetworks(networks RawNetworkIterator) error
UnderNetworkExtension() bool UnderNetworkExtension() bool
IncludeAllNetworks() bool IncludeAllNetworks() bool
ReadWIFIState() *WIFIState ReadWIFIState() *WIFIState
@ -50,6 +51,8 @@ type NetworkInterface struct {
Type int32 Type int32
DNSServer StringIterator DNSServer StringIterator
Metered bool Metered bool
RawNetwork RawNetwork
} }
type WIFIState struct { type WIFIState struct {
@ -66,6 +69,11 @@ type NetworkInterfaceIterator interface {
HasNext() bool HasNext() bool
} }
type RawNetworkIterator interface {
Next() RawNetwork
HasNext() bool
}
type Notification struct { type Notification struct {
Identifier string Identifier string
TypeName string TypeName string

View File

@ -15,6 +15,7 @@ type Interface interface {
OpenTun(options *tun.Options, platformOptions option.TunPlatformOptions) (tun.Tun, error) OpenTun(options *tun.Options, platformOptions option.TunPlatformOptions) (tun.Tun, error)
CreateDefaultInterfaceMonitor(logger logger.Logger) tun.DefaultInterfaceMonitor CreateDefaultInterfaceMonitor(logger logger.Logger) tun.DefaultInterfaceMonitor
Interfaces() ([]adapter.NetworkInterface, error) Interfaces() ([]adapter.NetworkInterface, error)
SetUnderlyingNetworks(networks []adapter.NetworkInterface) error
UnderNetworkExtension() bool UnderNetworkExtension() bool
IncludeAllNetworks() bool IncludeAllNetworks() bool
ClearDNSCache() ClearDNSCache()

View File

@ -0,0 +1,3 @@
package libbox
type RawNetwork interface{}

View File

@ -0,0 +1,7 @@
//go:build !android
package libbox
type RawNetwork interface {
stub()
}

View File

@ -206,11 +206,18 @@ func (w *platformInterfaceWrapper) Interfaces() ([]adapter.NetworkInterface, err
DNSServers: iteratorToArray[string](netInterface.DNSServer), DNSServers: iteratorToArray[string](netInterface.DNSServer),
Expensive: netInterface.Metered || isDefault && w.isExpensive, Expensive: netInterface.Metered || isDefault && w.isExpensive,
Constrained: isDefault && w.isConstrained, Constrained: isDefault && w.isConstrained,
RawNetwork: netInterface.RawNetwork,
}) })
} }
return interfaces, nil return interfaces, nil
} }
func (w *platformInterfaceWrapper) SetUnderlyingNetworks(networks []adapter.NetworkInterface) error {
return w.iif.SetUnderlyingNetworks(newIterator(common.Map(networks, func(it adapter.NetworkInterface) RawNetwork {
return it.RawNetwork.(RawNetwork)
})))
}
func (w *platformInterfaceWrapper) UnderNetworkExtension() bool { func (w *platformInterfaceWrapper) UnderNetworkExtension() bool {
return w.iif.UnderNetworkExtension() return w.iif.UnderNetworkExtension()
} }

View File

@ -240,6 +240,9 @@ func (r *NetworkManager) UpdateInterfaces() error {
newInterfaces := common.Filter(interfaces, func(it adapter.NetworkInterface) bool { newInterfaces := common.Filter(interfaces, func(it adapter.NetworkInterface) bool {
return it.Flags&net.FlagUp != 0 return it.Flags&net.FlagUp != 0
}) })
for _, networkInterface := range newInterfaces {
networkInterface.RawNetwork = nil
}
r.networkInterfaces.Store(newInterfaces) r.networkInterfaces.Store(newInterfaces)
if len(newInterfaces) > 0 && !slices.EqualFunc(oldInterfaces, newInterfaces, func(oldInterface adapter.NetworkInterface, newInterface adapter.NetworkInterface) bool { if len(newInterfaces) > 0 && !slices.EqualFunc(oldInterfaces, newInterfaces, func(oldInterface adapter.NetworkInterface, newInterface adapter.NetworkInterface) bool {
return oldInterface.Interface.Index == newInterface.Interface.Index && return oldInterface.Interface.Index == newInterface.Interface.Index &&
@ -260,6 +263,15 @@ func (r *NetworkManager) UpdateInterfaces() error {
} }
return F.ToString(it.Name, " (", strings.Join(options, ", "), ")") return F.ToString(it.Name, " (", strings.Join(options, ", "), ")")
}), ", ")) }), ", "))
if C.IsAndroid {
err = r.platformInterface.SetUnderlyingNetworks(newInterfaces)
if err != nil {
r.logger.Error("set underlying networks: ", err)
}
}
}
for _, networkInterface := range interfaces {
networkInterface.RawNetwork = nil
} }
return nil return nil
} }