From 9d97d95a9cd52050b83a836e14172e98a9ab04e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Sun, 4 Jan 2026 23:24:29 +0800 Subject: [PATCH] Fix TUN interface restart fails with existing addresses --- tun_linux.go | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/tun_linux.go b/tun_linux.go index 7f22644..abca009 100644 --- a/tun_linux.go +++ b/tun_linux.go @@ -130,7 +130,7 @@ func (t *NativeTun) configure(tunLink netlink.Link) error { for _, address := range t.options.Inet4Address { addr4, _ := netlink.ParseAddr(address.String()) err = netlink.AddrAdd(tunLink, addr4) - if err != nil { + if err != nil && !errors.Is(err, unix.EEXIST) { return err } } @@ -139,7 +139,7 @@ func (t *NativeTun) configure(tunLink netlink.Link) error { for _, address := range t.options.Inet6Address { addr6, _ := netlink.ParseAddr(address.String()) err = netlink.AddrAdd(tunLink, addr6) - if err != nil { + if err != nil && !errors.Is(err, unix.EEXIST) { return err } } @@ -325,6 +325,7 @@ func (t *NativeTun) Close() error { if t.options.EXP_ExternalConfiguration { return common.Close(common.PtrOrNil(t.tunFile)) } + t.unsetAddresses() return E.Errors(t.unsetRoute(), t.unsetRules(), common.Close(common.PtrOrNil(t.tunFile))) } @@ -1016,6 +1017,24 @@ func (t *NativeTun) unsetRules() error { return nil } +func (t *NativeTun) unsetAddresses() { + if t.options.FileDescriptor > 0 { + return + } + tunLink, err := netlink.LinkByName(t.options.Name) + if err != nil { + return + } + for _, address := range t.options.Inet4Address { + addr, _ := netlink.ParseAddr(address.String()) + _ = netlink.AddrDel(tunLink, addr) + } + for _, address := range t.options.Inet6Address { + addr, _ := netlink.ParseAddr(address.String()) + _ = netlink.AddrDel(tunLink, addr) + } +} + func (t *NativeTun) resetRules() error { t.unsetRules() return t.setRules()