From c0de3c0e42dcbd7f6176143b00741f7774b70a08 Mon Sep 17 00:00:00 2001 From: wwqgtxx Date: Mon, 10 Mar 2025 11:10:39 +0800 Subject: [PATCH] fix: some default value in dialer not restore in tun when config reload --- listener/listener.go | 3 +++ listener/sing_tun/server.go | 16 ++++++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/listener/listener.go b/listener/listener.go index cb8842dd..37bcbebf 100644 --- a/listener/listener.go +++ b/listener/listener.go @@ -512,6 +512,9 @@ func ReCreateTun(tunConf LC.Tun, tunnel C.Tunnel) { }() if tunConf.Equal(LastTunConf) { + if tunLister != nil { // some default value in dialer maybe changed when config reload, reset at here + tunLister.OnReload() + } return } diff --git a/listener/sing_tun/server.go b/listener/sing_tun/server.go index 56527ded..342defaf 100644 --- a/listener/sing_tun/server.go +++ b/listener/sing_tun/server.go @@ -307,7 +307,7 @@ func New(options LC.Tun, tunnel C.Tunnel, additions ...inbound.Addition) (l *Lis defaultInterfaceMonitor: defaultInterfaceMonitor, } if !dialer.DefaultInterfaceFinder.CompareAndSwap(nil, l.cDialerInterfaceFinder) { - err = E.New("don't allowed two tun listener using auto-detect-interface") + err = E.New("not allowed two tun listener using auto-detect-interface") return } } @@ -450,7 +450,10 @@ func New(options LC.Tun, tunnel C.Tunnel, additions ...inbound.Addition) (l *Lis } if tunOptions.AutoRedirectMarkMode { l.autoRedirectOutputMark = int32(outputMark) - dialer.DefaultRoutingMark.Store(l.autoRedirectOutputMark) + if !dialer.DefaultRoutingMark.CompareAndSwap(0, l.autoRedirectOutputMark) { + err = E.New("not allowed setting global routing-mark when working with autoRedirectMarkMode") + return + } l.autoRedirect.UpdateRouteAddressSet() l.ruleUpdateCallbackCloser = rpTunnel.RuleUpdateCallback().Register(l.ruleUpdateCallback) } @@ -517,6 +520,15 @@ func (l *Listener) updateRule(ruleProvider provider.RuleProvider, exclude bool, } } +func (l *Listener) OnReload() { + if l.autoRedirectOutputMark != 0 { + dialer.DefaultRoutingMark.CompareAndSwap(0, l.autoRedirectOutputMark) + } + if l.cDialerInterfaceFinder != nil { + dialer.DefaultInterfaceFinder.CompareAndSwap(nil, l.cDialerInterfaceFinder) + } +} + type cDialerInterfaceFinder struct { tunName string defaultInterfaceMonitor tun.DefaultInterfaceMonitor