Fix TUN interface restart fails with existing addresses

This commit is contained in:
世界 2026-01-04 23:24:29 +08:00
parent 525f783d00
commit 9d97d95a9c
No known key found for this signature in database
GPG key ID: CD109927C34A63C4

View file

@ -130,7 +130,7 @@ func (t *NativeTun) configure(tunLink netlink.Link) error {
for _, address := range t.options.Inet4Address { for _, address := range t.options.Inet4Address {
addr4, _ := netlink.ParseAddr(address.String()) addr4, _ := netlink.ParseAddr(address.String())
err = netlink.AddrAdd(tunLink, addr4) err = netlink.AddrAdd(tunLink, addr4)
if err != nil { if err != nil && !errors.Is(err, unix.EEXIST) {
return err return err
} }
} }
@ -139,7 +139,7 @@ func (t *NativeTun) configure(tunLink netlink.Link) error {
for _, address := range t.options.Inet6Address { for _, address := range t.options.Inet6Address {
addr6, _ := netlink.ParseAddr(address.String()) addr6, _ := netlink.ParseAddr(address.String())
err = netlink.AddrAdd(tunLink, addr6) err = netlink.AddrAdd(tunLink, addr6)
if err != nil { if err != nil && !errors.Is(err, unix.EEXIST) {
return err return err
} }
} }
@ -325,6 +325,7 @@ func (t *NativeTun) Close() error {
if t.options.EXP_ExternalConfiguration { if t.options.EXP_ExternalConfiguration {
return common.Close(common.PtrOrNil(t.tunFile)) return common.Close(common.PtrOrNil(t.tunFile))
} }
t.unsetAddresses()
return E.Errors(t.unsetRoute(), t.unsetRules(), common.Close(common.PtrOrNil(t.tunFile))) return E.Errors(t.unsetRoute(), t.unsetRules(), common.Close(common.PtrOrNil(t.tunFile)))
} }
@ -1016,6 +1017,24 @@ func (t *NativeTun) unsetRules() error {
return nil 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 { func (t *NativeTun) resetRules() error {
t.unsetRules() t.unsetRules()
return t.setRules() return t.setRules()