From 949c98adc0d5d7c7c0af6bba26bb0853abcf43b8 Mon Sep 17 00:00:00 2001 From: ginuerzh Date: Mon, 8 Jul 2024 10:59:03 +0800 Subject: [PATCH] netns: add support for specifying network namespace by path --- config/parsing/service/parse.go | 10 ++++++++-- internal/net/net.go | 19 +++++++++++++++---- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/config/parsing/service/parse.go b/config/parsing/service/parse.go index f454a87..599b545 100644 --- a/config/parsing/service/parse.go +++ b/config/parsing/service/parse.go @@ -175,9 +175,15 @@ func ParseService(cfg *config.ServiceConfig) (service.Service, error) { } defer netns.Set(originNs) - ns, err := netns.GetFromName(netnsIn) + var ns netns.NsHandle + + if strings.HasPrefix(netnsIn, "/") { + ns, err = netns.GetFromPath(netnsIn) + } else { + ns, err = netns.GetFromName(netnsIn) + } if err != nil { - return nil, fmt.Errorf("netns.GetFromName(%s): %v", netnsIn, err) + return nil, fmt.Errorf("netns.Get(%s): %v", netnsIn, err) } defer ns.Close() diff --git a/internal/net/net.go b/internal/net/net.go index 618552e..866253c 100644 --- a/internal/net/net.go +++ b/internal/net/net.go @@ -5,6 +5,7 @@ import ( "fmt" "net" "runtime" + "strings" "syscall" "github.com/vishvananda/netns" @@ -48,9 +49,14 @@ func (lc *ListenConfig) Listen(ctx context.Context, network, address string) (ne } defer netns.Set(originNs) - ns, err := netns.GetFromName(lc.Netns) + var ns netns.NsHandle + if strings.HasPrefix(lc.Netns, "/") { + ns, err = netns.GetFromPath(lc.Netns) + } else { + ns, err = netns.GetFromName(lc.Netns) + } if err != nil { - return nil, fmt.Errorf("netns.GetFromName(%s): %v", lc.Netns, err) + return nil, fmt.Errorf("netns.Get(%s): %v", lc.Netns, err) } defer ns.Close() @@ -73,9 +79,14 @@ func (lc *ListenConfig) ListenPacket(ctx context.Context, network, address strin } defer netns.Set(originNs) - ns, err := netns.GetFromName(lc.Netns) + var ns netns.NsHandle + if strings.HasPrefix(lc.Netns, "/") { + ns, err = netns.GetFromPath(lc.Netns) + } else { + ns, err = netns.GetFromName(lc.Netns) + } if err != nil { - return nil, fmt.Errorf("netns.GetFromName(%s): %v", lc.Netns, err) + return nil, fmt.Errorf("netns.Get(%s): %v", lc.Netns, err) } defer ns.Close()