From 11b4e86325cb33c66587d6bc7ac34ab34e12a352 Mon Sep 17 00:00:00 2001 From: Daniel Ding Date: Sun, 29 Sep 2024 14:12:53 +0800 Subject: [PATCH] fix: restart openvpn without vrf master. --- pkg/api/api.go | 2 +- pkg/api/network.go | 2 +- pkg/switch/network.go | 67 ++++++++++++++++++++++++------------------- 3 files changed, 39 insertions(+), 32 deletions(-) diff --git a/pkg/api/api.go b/pkg/api/api.go index 6534812..d60265f 100755 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -64,7 +64,7 @@ type Router interface { } type VPNer interface { - RestartVpn() + RestartVPN() } type Qoser interface { diff --git a/pkg/api/network.go b/pkg/api/network.go index 6e60fc9..7c9575f 100755 --- a/pkg/api/network.go +++ b/pkg/api/network.go @@ -116,7 +116,7 @@ func (h Network) RestartVPN(w http.ResponseWriter, r *http.Request) { return } - worker.RestartVpn() + worker.RestartVPN() ResponseJson(w, true) } diff --git a/pkg/switch/network.go b/pkg/switch/network.go index c49cbf5..8890dab 100755 --- a/pkg/switch/network.go +++ b/pkg/switch/network.go @@ -428,6 +428,38 @@ func (w *WorkerImpl) UndoZTrust() { } } +func (w *WorkerImpl) letVPN2VRF() { + _, vpn := w.GetCfgs() + promise := libol.NewPromise() + promise.Go(func() error { + link, err := nl.LinkByName(vpn.Device) + if link == nil { + w.out.Info("Link %s %s", vpn.Device, err) + return err + } + + attr := link.Attrs() + if err := w.vrf.AddSlave(attr.Name); err != nil { + w.out.Info("VRF AddSlave: %s", err) + return err + } + + dest, _ := libol.ParseNet(vpn.Subnet) + rt := &nl.Route{ + Dst: dest, + Table: w.table, + LinkIndex: attr.Index, + } + w.out.Debug("WorkerImpl.LoadRoute: %s", rt.String()) + if err := nl.RouteAdd(rt); err != nil { + w.out.Warn("Route add: %s", err) + return err + } + + return nil + }) +} + func (w *WorkerImpl) Start(v api.Switcher) { cfg, vpn := w.GetCfgs() @@ -447,36 +479,8 @@ func (w *WorkerImpl) Start(v api.Switcher) { if !(w.vpn == nil) { w.vpn.Start() if !(w.vrf == nil) { - promise := libol.NewPromise() - promise.Go(func() error { - link, err := nl.LinkByName(vpn.Device) - if link == nil { - w.out.Info("Link %s %s", vpn.Device, err) - return err - } - - attr := link.Attrs() - if err := w.vrf.AddSlave(attr.Name); err != nil { - w.out.Info("VRF AddSlave: %s", err) - return err - } - - dest, _ := libol.ParseNet(vpn.Subnet) - rt := &nl.Route{ - Dst: dest, - Table: w.table, - LinkIndex: attr.Index, - } - w.out.Debug("WorkerImpl.LoadRoute: %s", rt.String()) - if err := nl.RouteAdd(rt); err != nil { - w.out.Warn("Route add: %s", err) - return err - } - - return nil - }) + w.letVPN2VRF() } - w.fire.Mangle.In.AddRule(cn.IPRule{ Input: vpn.Device, Jump: w.qos.ChainIn(), @@ -559,9 +563,12 @@ func (w *WorkerImpl) unloadRoutes() { } } -func (w *WorkerImpl) RestartVpn() { +func (w *WorkerImpl) RestartVPN() { if w.vpn != nil { w.vpn.Restart() + if !(w.vrf == nil) { + w.letVPN2VRF() + } } }