mirror of
https://github.com/SagerNet/sing-box.git
synced 2024-12-26 15:05:42 +08:00
platform: Implement set underlying networks for android
This commit is contained in:
parent
f0f3a45904
commit
eb4a184b7e
|
@ -51,4 +51,5 @@ type NetworkInterface struct {
|
||||||
DNSServers []string
|
DNSServers []string
|
||||||
Expensive bool
|
Expensive bool
|
||||||
Constrained bool
|
Constrained bool
|
||||||
|
RawNetwork any
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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()
|
||||||
|
|
3
experimental/libbox/raw_network_android.go
Normal file
3
experimental/libbox/raw_network_android.go
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
package libbox
|
||||||
|
|
||||||
|
type RawNetwork interface{}
|
7
experimental/libbox/raw_network_stub.go
Normal file
7
experimental/libbox/raw_network_stub.go
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
//go:build !android
|
||||||
|
|
||||||
|
package libbox
|
||||||
|
|
||||||
|
type RawNetwork interface {
|
||||||
|
stub()
|
||||||
|
}
|
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user