Files
xray-core/proxy/tun/config.go

79 lines
1.4 KiB
Go

package tun
import (
"context"
"net"
"sync"
"github.com/xtls/xray-core/common/errors"
)
type InterfaceUpdater struct {
sync.Mutex
tunIndex int
fixedName string
iface *net.Interface
}
var updater *InterfaceUpdater
func (updater *InterfaceUpdater) Get() *net.Interface {
updater.Lock()
defer updater.Unlock()
return updater.iface
}
func (updater *InterfaceUpdater) Update() {
updater.Lock()
defer updater.Unlock()
if updater.iface != nil {
iface, err := net.InterfaceByIndex(updater.iface.Index)
if err == nil && iface.Name == updater.iface.Name {
return
}
}
updater.iface = nil
interfaces, err := net.Interfaces()
if err != nil {
errors.LogInfoInner(context.Background(), err, "[tun] failed to update interface")
return
}
var got *net.Interface
for _, iface := range interfaces {
if iface.Index == updater.tunIndex {
continue
}
if updater.fixedName != "" {
if iface.Name == updater.fixedName {
got = &iface
break
}
} else {
addrs, err := iface.Addrs()
if err != nil {
continue
}
if (iface.Flags&net.FlagUp != 0) &&
(iface.Flags&net.FlagLoopback == 0) &&
len(addrs) > 0 {
got = &iface
break
}
}
}
if got == nil {
errors.LogInfo(context.Background(), "[tun] failed to update interface > got == nil")
return
}
updater.iface = got
errors.LogInfo(context.Background(), "[tun] update interface ", got.Name, " ", got.Index)
}