diff --git a/experimental/libbox/config.go b/experimental/libbox/config.go index b7731143..56c56189 100644 --- a/experimental/libbox/config.go +++ b/experimental/libbox/config.go @@ -9,6 +9,7 @@ import ( "github.com/sagernet/sing-box" "github.com/sagernet/sing-box/adapter" "github.com/sagernet/sing-box/common/process" + "github.com/sagernet/sing-box/experimental/libbox/platform" "github.com/sagernet/sing-box/option" "github.com/sagernet/sing-tun" "github.com/sagernet/sing/common/control" @@ -54,7 +55,7 @@ func (s *platformInterfaceStub) UsePlatformAutoDetectInterfaceControl() bool { return true } -func (s *platformInterfaceStub) AutoDetectInterfaceControl() control.Func { +func (s *platformInterfaceStub) AutoDetectInterfaceControl(fd int) error { return nil } @@ -134,6 +135,10 @@ func (s *interfaceMonitorStub) RegisterCallback(callback tun.DefaultInterfaceUpd func (s *interfaceMonitorStub) UnregisterCallback(element *list.Element[tun.DefaultInterfaceUpdateCallback]) { } +func (s *platformInterfaceStub) SendNotification(notification *platform.Notification) error { + return nil +} + func FormatConfig(configContent string) (string, error) { options, err := parseConfig(configContent) if err != nil { diff --git a/experimental/libbox/platform.go b/experimental/libbox/platform.go index e2bf8e8e..1976ad70 100644 --- a/experimental/libbox/platform.go +++ b/experimental/libbox/platform.go @@ -22,6 +22,7 @@ type PlatformInterface interface { IncludeAllNetworks() bool ReadWIFIState() *WIFIState ClearDNSCache() + SendNotification(notification *Notification) error } type TunInterface interface { @@ -55,6 +56,16 @@ type NetworkInterfaceIterator interface { HasNext() bool } +type Notification struct { + Identifier string + TypeName string + TypeID int32 + Title string + Subtitle string + Body string + OpenURL string +} + type OnDemandRule interface { Target() int32 DNSSearchDomainMatch() StringIterator diff --git a/experimental/libbox/platform/interface.go b/experimental/libbox/platform/interface.go index 3bec13fa..3dc00081 100644 --- a/experimental/libbox/platform/interface.go +++ b/experimental/libbox/platform/interface.go @@ -14,7 +14,7 @@ import ( type Interface interface { Initialize(ctx context.Context, router adapter.Router) error UsePlatformAutoDetectInterfaceControl() bool - AutoDetectInterfaceControl() control.Func + AutoDetectInterfaceControl(fd int) error OpenTun(options *tun.Options, platformOptions option.TunPlatformOptions) (tun.Tun, error) UsePlatformDefaultInterfaceMonitor() bool CreateDefaultInterfaceMonitor(logger logger.Logger) tun.DefaultInterfaceMonitor @@ -25,4 +25,15 @@ type Interface interface { ClearDNSCache() ReadWIFIState() adapter.WIFIState process.Searcher + SendNotification(notification *Notification) error +} + +type Notification struct { + Identifier string + TypeName string + TypeID int32 + Title string + Subtitle string + Body string + OpenURL string } diff --git a/experimental/libbox/service.go b/experimental/libbox/service.go index 0525c8bf..20395e95 100644 --- a/experimental/libbox/service.go +++ b/experimental/libbox/service.go @@ -116,12 +116,8 @@ func (w *platformInterfaceWrapper) UsePlatformAutoDetectInterfaceControl() bool return w.iif.UsePlatformAutoDetectInterfaceControl() } -func (w *platformInterfaceWrapper) AutoDetectInterfaceControl() control.Func { - return func(network, address string, conn syscall.RawConn) error { - return control.Raw(conn, func(fd uintptr) error { - return w.iif.AutoDetectInterfaceControl(int32(fd)) - }) - } +func (w *platformInterfaceWrapper) AutoDetectInterfaceControl(fd int) error { + return w.iif.AutoDetectInterfaceControl(int32(fd)) } func (w *platformInterfaceWrapper) OpenTun(options *tun.Options, platformOptions option.TunPlatformOptions) (tun.Tun, error) { @@ -239,3 +235,7 @@ func (w *platformInterfaceWrapper) DisableColors() bool { func (w *platformInterfaceWrapper) WriteMessage(level log.Level, message string) { w.iif.WriteLog(message) } + +func (w *platformInterfaceWrapper) SendNotification(notification *platform.Notification) error { + return w.iif.SendNotification((*Notification)(notification)) +} diff --git a/route/router.go b/route/router.go index 2aaffbbb..1fc9aa77 100644 --- a/route/router.go +++ b/route/router.go @@ -10,6 +10,7 @@ import ( "os/user" "runtime" "strings" + "syscall" "time" "github.com/sagernet/sing-box/adapter" @@ -211,12 +212,19 @@ func NewRouter( } else { detour = dialer.NewDetour(router, server.Detour) } + var serverProtocol string switch server.Address { case "local": + serverProtocol = "local" default: serverURL, _ := url.Parse(server.Address) var serverAddress string if serverURL != nil { + if serverURL.Scheme == "" { + serverProtocol = "udp" + } else { + serverProtocol = serverURL.Scheme + } serverAddress = serverURL.Hostname() } if serverAddress == "" { @@ -242,9 +250,12 @@ func NewRouter( } else if dnsOptions.ClientSubnet != nil { clientSubnet = dnsOptions.ClientSubnet.Build() } + if serverProtocol == "" { + serverProtocol = "transport" + } transport, err := dns.CreateTransport(dns.TransportOptions{ Context: ctx, - Logger: logFactory.NewLogger(F.ToString("dns/transport[", tag, "]")), + Logger: logFactory.NewLogger(F.ToString("dns/", serverProtocol, "[", tag, "]")), Name: tag, Dialer: detour, Address: server.Address, @@ -1188,7 +1199,11 @@ func (r *Router) AutoDetectInterface() bool { func (r *Router) AutoDetectInterfaceFunc() control.Func { if r.platformInterface != nil && r.platformInterface.UsePlatformAutoDetectInterfaceControl() { - return r.platformInterface.AutoDetectInterfaceControl() + return func(network, address string, conn syscall.RawConn) error { + return control.Raw(conn, func(fd uintptr) error { + return r.platformInterface.AutoDetectInterfaceControl(int(fd)) + }) + } } else { if r.interfaceMonitor == nil { return nil