2022-10-25 12:55:00 +08:00
|
|
|
package libbox
|
|
|
|
|
2023-04-18 14:04:09 +08:00
|
|
|
import (
|
2024-11-11 16:23:45 +08:00
|
|
|
C "github.com/sagernet/sing-box/constant"
|
2023-04-18 14:04:09 +08:00
|
|
|
"github.com/sagernet/sing-box/option"
|
|
|
|
)
|
2023-02-28 19:02:27 +08:00
|
|
|
|
2022-10-25 12:55:00 +08:00
|
|
|
type PlatformInterface interface {
|
2023-04-21 17:04:55 +08:00
|
|
|
UsePlatformAutoDetectInterfaceControl() bool
|
2022-10-25 12:55:00 +08:00
|
|
|
AutoDetectInterfaceControl(fd int32) error
|
2023-02-26 19:16:28 +08:00
|
|
|
OpenTun(options TunOptions) (int32, error)
|
2022-10-25 12:55:00 +08:00
|
|
|
WriteLog(message string)
|
|
|
|
UseProcFS() bool
|
|
|
|
FindConnectionOwner(ipProtocol int32, sourceAddress string, sourcePort int32, destinationAddress string, destinationPort int32) (int32, error)
|
|
|
|
PackageNameByUid(uid int32) (string, error)
|
|
|
|
UIDByPackageName(packageName string) (int32, error)
|
2023-04-18 14:04:09 +08:00
|
|
|
StartDefaultInterfaceMonitor(listener InterfaceUpdateListener) error
|
|
|
|
CloseDefaultInterfaceMonitor(listener InterfaceUpdateListener) error
|
|
|
|
GetInterfaces() (NetworkInterfaceIterator, error)
|
2023-06-07 21:01:29 +08:00
|
|
|
UnderNetworkExtension() bool
|
2024-05-07 20:34:24 +08:00
|
|
|
IncludeAllNetworks() bool
|
2023-11-24 20:58:07 +08:00
|
|
|
ReadWIFIState() *WIFIState
|
2023-08-24 21:52:38 +08:00
|
|
|
ClearDNSCache()
|
2024-11-06 12:51:53 +08:00
|
|
|
SendNotification(notification *Notification) error
|
2022-10-25 12:55:00 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
type TunInterface interface {
|
|
|
|
FileDescriptor() int32
|
|
|
|
Close() error
|
|
|
|
}
|
2023-02-28 19:02:27 +08:00
|
|
|
|
2023-04-18 14:04:09 +08:00
|
|
|
type InterfaceUpdateListener interface {
|
2024-11-11 16:23:45 +08:00
|
|
|
UpdateDefaultInterface(interfaceName string, interfaceIndex int32, isExpensive bool, isConstrained bool)
|
2023-04-18 14:04:09 +08:00
|
|
|
}
|
|
|
|
|
2024-11-11 16:23:45 +08:00
|
|
|
const (
|
2024-11-13 19:05:28 +08:00
|
|
|
InterfaceTypeWIFI = int32(C.InterfaceTypeWIFI)
|
|
|
|
InterfaceTypeCellular = int32(C.InterfaceTypeCellular)
|
|
|
|
InterfaceTypeEthernet = int32(C.InterfaceTypeEthernet)
|
|
|
|
InterfaceTypeOther = int32(C.InterfaceTypeOther)
|
2024-11-11 16:23:45 +08:00
|
|
|
)
|
|
|
|
|
2023-04-18 14:04:09 +08:00
|
|
|
type NetworkInterface struct {
|
|
|
|
Index int32
|
|
|
|
MTU int32
|
|
|
|
Name string
|
|
|
|
Addresses StringIterator
|
2024-10-29 15:28:58 +08:00
|
|
|
Flags int32
|
2024-11-11 16:23:45 +08:00
|
|
|
|
2024-11-13 19:05:28 +08:00
|
|
|
Type int32
|
2024-11-11 16:23:45 +08:00
|
|
|
DNSServer StringIterator
|
|
|
|
Metered bool
|
2023-04-18 14:04:09 +08:00
|
|
|
}
|
|
|
|
|
2023-11-24 20:58:07 +08:00
|
|
|
type WIFIState struct {
|
|
|
|
SSID string
|
|
|
|
BSSID string
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewWIFIState(wifiSSID string, wifiBSSID string) *WIFIState {
|
|
|
|
return &WIFIState{wifiSSID, wifiBSSID}
|
|
|
|
}
|
|
|
|
|
2023-04-18 14:04:09 +08:00
|
|
|
type NetworkInterfaceIterator interface {
|
|
|
|
Next() *NetworkInterface
|
2023-02-28 19:02:27 +08:00
|
|
|
HasNext() bool
|
|
|
|
}
|
|
|
|
|
2024-11-06 12:51:53 +08:00
|
|
|
type Notification struct {
|
|
|
|
Identifier string
|
|
|
|
TypeName string
|
|
|
|
TypeID int32
|
|
|
|
Title string
|
|
|
|
Subtitle string
|
|
|
|
Body string
|
|
|
|
OpenURL string
|
|
|
|
}
|
|
|
|
|
2023-02-28 19:02:27 +08:00
|
|
|
type OnDemandRule interface {
|
|
|
|
Target() int32
|
|
|
|
DNSSearchDomainMatch() StringIterator
|
|
|
|
DNSServerAddressMatch() StringIterator
|
|
|
|
InterfaceTypeMatch() int32
|
|
|
|
SSIDMatch() StringIterator
|
|
|
|
ProbeURL() string
|
|
|
|
}
|
|
|
|
|
2023-04-18 14:04:09 +08:00
|
|
|
type OnDemandRuleIterator interface {
|
|
|
|
Next() OnDemandRule
|
|
|
|
HasNext() bool
|
|
|
|
}
|
|
|
|
|
2023-02-28 19:02:27 +08:00
|
|
|
type onDemandRule struct {
|
|
|
|
option.OnDemandRule
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *onDemandRule) Target() int32 {
|
|
|
|
if r.OnDemandRule.Action == nil {
|
|
|
|
return -1
|
|
|
|
}
|
|
|
|
return int32(*r.OnDemandRule.Action)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *onDemandRule) DNSSearchDomainMatch() StringIterator {
|
|
|
|
return newIterator(r.OnDemandRule.DNSSearchDomainMatch)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *onDemandRule) DNSServerAddressMatch() StringIterator {
|
|
|
|
return newIterator(r.OnDemandRule.DNSServerAddressMatch)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *onDemandRule) InterfaceTypeMatch() int32 {
|
|
|
|
if r.OnDemandRule.InterfaceTypeMatch == nil {
|
|
|
|
return -1
|
|
|
|
}
|
|
|
|
return int32(*r.OnDemandRule.InterfaceTypeMatch)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *onDemandRule) SSIDMatch() StringIterator {
|
|
|
|
return newIterator(r.OnDemandRule.SSIDMatch)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *onDemandRule) ProbeURL() string {
|
|
|
|
return r.OnDemandRule.ProbeURL
|
|
|
|
}
|