From 0433f8d5da8f2ba33ab022791a8d9ece734c1fdd Mon Sep 17 00:00:00 2001 From: mzz2017 <2017@duck.com> Date: Thu, 2 Mar 2023 21:28:30 +0800 Subject: [PATCH] fix: should reset kernel program outbound alive status every reload --- component/outbound/dialer_group.go | 14 +++++++++----- control/connectivity.go | 16 +++++++++------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/component/outbound/dialer_group.go b/component/outbound/dialer_group.go index fc55a37..d181bf3 100644 --- a/component/outbound/dialer_group.go +++ b/component/outbound/dialer_group.go @@ -29,7 +29,7 @@ type DialerGroup struct { selectionPolicy *DialerSelectionPolicy } -func NewDialerGroup(option *dialer.GlobalOption, name string, dialers []*dialer.Dialer, p DialerSelectionPolicy, aliveChangeCallback func(alive bool, networkType *dialer.NetworkType)) *DialerGroup { +func NewDialerGroup(option *dialer.GlobalOption, name string, dialers []*dialer.Dialer, p DialerSelectionPolicy, aliveChangeCallback func(alive bool, networkType *dialer.NetworkType, isInit bool)) *DialerGroup { log := option.Log var aliveDnsTcp4DialerSet *dialer.AliveDialerSet var aliveDnsTcp6DialerSet *dialer.AliveDialerSet @@ -54,8 +54,9 @@ func NewDialerGroup(option *dialer.GlobalOption, name string, dialers []*dialer. log, name, networkType, option.CheckTolerance, p.Policy, dialers, func(networkType *dialer.NetworkType) func(alive bool) { // Use the trick to copy a pointer of *dialer.NetworkType. - return func(alive bool) { aliveChangeCallback(alive, networkType) } + return func(alive bool) { aliveChangeCallback(alive, networkType, false) } }(networkType), true) + aliveChangeCallback(true, networkType, true) networkType = &dialer.NetworkType{ L4Proto: consts.L4ProtoStr_TCP, @@ -66,8 +67,9 @@ func NewDialerGroup(option *dialer.GlobalOption, name string, dialers []*dialer. log, name, networkType, option.CheckTolerance, p.Policy, dialers, func(networkType *dialer.NetworkType) func(alive bool) { // Use the trick to copy a pointer of *dialer.NetworkType. - return func(alive bool) { aliveChangeCallback(alive, networkType) } + return func(alive bool) { aliveChangeCallback(alive, networkType, false) } }(networkType), true) + aliveChangeCallback(true, networkType, true) networkType = &dialer.NetworkType{ L4Proto: consts.L4ProtoStr_UDP, @@ -78,8 +80,9 @@ func NewDialerGroup(option *dialer.GlobalOption, name string, dialers []*dialer. log, name, networkType, option.CheckTolerance, p.Policy, dialers, func(networkType *dialer.NetworkType) func(alive bool) { // Use the trick to copy a pointer of *dialer.NetworkType. - return func(alive bool) { aliveChangeCallback(alive, networkType) } + return func(alive bool) { aliveChangeCallback(alive, networkType, false) } }(networkType), true) + aliveChangeCallback(true, networkType, true) networkType = &dialer.NetworkType{ L4Proto: consts.L4ProtoStr_UDP, @@ -90,8 +93,9 @@ func NewDialerGroup(option *dialer.GlobalOption, name string, dialers []*dialer. log, name, networkType, option.CheckTolerance, p.Policy, dialers, func(networkType *dialer.NetworkType) func(alive bool) { // Use the trick to copy a pointer of *dialer.NetworkType. - return func(alive bool) { aliveChangeCallback(alive, networkType) } + return func(alive bool) { aliveChangeCallback(alive, networkType, false) } }(networkType), true) + aliveChangeCallback(true, networkType, true) if option.CheckDnsTcp { aliveDnsTcp4DialerSet = dialer.NewAliveDialerSet(log, name, &dialer.NetworkType{ diff --git a/control/connectivity.go b/control/connectivity.go index 4e79a74..999f75a 100644 --- a/control/connectivity.go +++ b/control/connectivity.go @@ -23,13 +23,15 @@ func FormatL4Proto(l4proto uint8) string { return strconv.Itoa(int(l4proto)) } -func (c *controlPlaneCore) OutboundAliveChangeCallback(outbound uint8) func(alive bool, networkType *dialer.NetworkType) { - return func(alive bool, networkType *dialer.NetworkType) { - c.log.WithFields(logrus.Fields{ - "alive": alive, - "network": networkType.StringWithoutDns(), - "outbound": c.outboundId2Name[outbound], - }).Warnf("Outbound alive state changed, notify the kernel program.") +func (c *controlPlaneCore) OutboundAliveChangeCallback(outbound uint8) func(alive bool, networkType *dialer.NetworkType, isInit bool) { + return func(alive bool, networkType *dialer.NetworkType, isInit bool) { + if !isInit { + c.log.WithFields(logrus.Fields{ + "alive": alive, + "network": networkType.StringWithoutDns(), + "outbound": c.outboundId2Name[outbound], + }).Warnf("Outbound alive state changed, notify the kernel program.") + } value := uint32(0) if alive {