2022-09-14 04:46:02 +00:00
|
|
|
package route
|
|
|
|
|
|
|
|
import (
|
|
|
|
"net"
|
|
|
|
|
|
|
|
"github.com/sagernet/sing/common/control"
|
|
|
|
)
|
|
|
|
|
|
|
|
var _ control.InterfaceFinder = (*myInterfaceFinder)(nil)
|
|
|
|
|
|
|
|
type myInterfaceFinder struct {
|
2023-04-18 06:04:09 +00:00
|
|
|
interfaces []net.Interface
|
2022-09-14 04:46:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (f *myInterfaceFinder) update() error {
|
|
|
|
ifs, err := net.Interfaces()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2023-04-18 06:04:09 +00:00
|
|
|
f.interfaces = ifs
|
2022-09-14 04:46:02 +00:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2023-04-18 06:04:09 +00:00
|
|
|
func (f *myInterfaceFinder) updateInterfaces(interfaces []net.Interface) {
|
|
|
|
f.interfaces = interfaces
|
|
|
|
}
|
|
|
|
|
2022-09-14 04:46:02 +00:00
|
|
|
func (f *myInterfaceFinder) InterfaceIndexByName(name string) (interfaceIndex int, err error) {
|
2023-04-18 06:04:09 +00:00
|
|
|
for _, netInterface := range f.interfaces {
|
2022-09-14 04:46:02 +00:00
|
|
|
if netInterface.Name == name {
|
|
|
|
return netInterface.Index, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
netInterface, err := net.InterfaceByName(name)
|
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
f.update()
|
|
|
|
return netInterface.Index, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (f *myInterfaceFinder) InterfaceNameByIndex(index int) (interfaceName string, err error) {
|
2023-04-18 06:04:09 +00:00
|
|
|
for _, netInterface := range f.interfaces {
|
2022-09-14 04:46:02 +00:00
|
|
|
if netInterface.Index == index {
|
|
|
|
return netInterface.Name, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
netInterface, err := net.InterfaceByIndex(index)
|
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
f.update()
|
|
|
|
return netInterface.Name, nil
|
|
|
|
}
|