diff --git a/go.mod b/go.mod index dd114bfa..ab04fbaf 100644 --- a/go.mod +++ b/go.mod @@ -29,7 +29,7 @@ require ( github.com/sagernet/sing-dns v0.1.5-0.20230418025317-8a132998b322 github.com/sagernet/sing-shadowsocks v0.2.2-0.20230418025154-6114beeeba6d github.com/sagernet/sing-shadowtls v0.1.2-0.20230417103049-4f682e05f19b - github.com/sagernet/sing-tun v0.1.4-0.20230418134942-3a2687c37597 + github.com/sagernet/sing-tun v0.1.4-0.20230419011045-792eeb079312 github.com/sagernet/sing-vmess v0.1.5-0.20230417103030-8c3070ae3fb3 github.com/sagernet/smux v0.0.0-20230312102458-337ec2a5af37 github.com/sagernet/tfo-go v0.0.0-20230303015439-ffcfd8c41cf9 diff --git a/go.sum b/go.sum index 7f17a6d6..641e26b6 100644 --- a/go.sum +++ b/go.sum @@ -119,8 +119,8 @@ github.com/sagernet/sing-shadowsocks v0.2.2-0.20230418025154-6114beeeba6d h1:UUx github.com/sagernet/sing-shadowsocks v0.2.2-0.20230418025154-6114beeeba6d/go.mod h1:Co3PJXcaZoLwHGBfT0rbSnn9C7ywc41zVYWtDeoeI/Q= github.com/sagernet/sing-shadowtls v0.1.2-0.20230417103049-4f682e05f19b h1:ouW/6IDCrxkBe19YSbdCd7buHix7b+UZ6BM4Zz74XF4= github.com/sagernet/sing-shadowtls v0.1.2-0.20230417103049-4f682e05f19b/go.mod h1:oG8bPerYI6cZ74KquY3DvA7ynECyrILPBnce6wtBqeI= -github.com/sagernet/sing-tun v0.1.4-0.20230418134942-3a2687c37597 h1:2IJxBf9X8kSq/78KjfJwA16NC54Hwf4wVZZqldWQ+os= -github.com/sagernet/sing-tun v0.1.4-0.20230418134942-3a2687c37597/go.mod h1:bvcVzlf9q9dgxt8qKluW+zOXCFoN1+SpBG3sHTq8/9Q= +github.com/sagernet/sing-tun v0.1.4-0.20230419011045-792eeb079312 h1:yQAzMx+8CgW65V+EN/YnImw9DBLCRjDY4ZrVksb0M4w= +github.com/sagernet/sing-tun v0.1.4-0.20230419011045-792eeb079312/go.mod h1:bvcVzlf9q9dgxt8qKluW+zOXCFoN1+SpBG3sHTq8/9Q= github.com/sagernet/sing-vmess v0.1.5-0.20230417103030-8c3070ae3fb3 h1:BHOnxrbC929JonuKqFdJ7ZbDp7zs4oTlH5KFvKtWu9U= github.com/sagernet/sing-vmess v0.1.5-0.20230417103030-8c3070ae3fb3/go.mod h1:yKrAr+dqZd64DxBXCHWrYicp+n4qbqO73mtwv3dck8U= github.com/sagernet/smux v0.0.0-20230312102458-337ec2a5af37 h1:HuE6xSwco/Xed8ajZ+coeYLmioq0Qp1/Z2zczFaV8as= diff --git a/outbound/urltest.go b/outbound/urltest.go index 28c6970f..580ab426 100644 --- a/outbound/urltest.go +++ b/outbound/urltest.go @@ -13,6 +13,7 @@ import ( "github.com/sagernet/sing-box/log" "github.com/sagernet/sing-box/option" "github.com/sagernet/sing/common" + "github.com/sagernet/sing/common/atomic" "github.com/sagernet/sing/common/batch" E "github.com/sagernet/sing/common/exceptions" M "github.com/sagernet/sing/common/metadata" @@ -140,6 +141,7 @@ type URLTestGroup struct { interval time.Duration tolerance uint16 history *urltest.HistoryStorage + checking atomic.Bool access sync.Mutex ticker *time.Ticker @@ -268,9 +270,13 @@ func (g *URLTestGroup) URLTest(ctx context.Context, link string) (map[string]uin } func (g *URLTestGroup) urlTest(ctx context.Context, link string, force bool) (map[string]uint16, error) { + result := make(map[string]uint16) + if g.checking.Swap(true) { + return result, nil + } + defer g.checking.Store(false) b, _ := batch.New(ctx, batch.WithConcurrencyNum[any](10)) checked := make(map[string]bool) - result := make(map[string]uint16) var resultAccess sync.Mutex for _, detour := range g.outbounds { tag := detour.Tag() diff --git a/route/router.go b/route/router.go index 1d37e154..9a7a99ca 100644 --- a/route/router.go +++ b/route/router.go @@ -299,18 +299,21 @@ func NewRouter( if needInterfaceMonitor { if !usePlatformDefaultInterfaceMonitor { networkMonitor, err := tun.NewNetworkUpdateMonitor(router) - if err == nil { + if err != os.ErrInvalid { + if err != nil { + return nil, err + } router.networkMonitor = networkMonitor networkMonitor.RegisterCallback(router.interfaceFinder.update) + interfaceMonitor, err := tun.NewDefaultInterfaceMonitor(router.networkMonitor, tun.DefaultInterfaceMonitorOptions{ + OverrideAndroidVPN: options.OverrideAndroidVPN, + }) + if err != nil { + return nil, E.New("auto_detect_interface unsupported on current platform") + } + interfaceMonitor.RegisterCallback(router.notifyNetworkUpdate) + router.interfaceMonitor = interfaceMonitor } - interfaceMonitor, err := tun.NewDefaultInterfaceMonitor(router.networkMonitor, tun.DefaultInterfaceMonitorOptions{ - OverrideAndroidVPN: options.OverrideAndroidVPN, - }) - if err != nil { - return nil, E.New("auto_detect_interface unsupported on current platform") - } - interfaceMonitor.RegisterCallback(router.notifyNetworkUpdate) - router.interfaceMonitor = interfaceMonitor } else { interfaceMonitor := platformInterface.CreateDefaultInterfaceMonitor(router) interfaceMonitor.RegisterCallback(router.notifyNetworkUpdate)