interface_finder.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package route
  2. import (
  3. "net"
  4. "github.com/sagernet/sing/common/control"
  5. )
  6. var _ control.InterfaceFinder = (*myInterfaceFinder)(nil)
  7. type myInterfaceFinder struct {
  8. interfaces []net.Interface
  9. }
  10. func (f *myInterfaceFinder) update() error {
  11. ifs, err := net.Interfaces()
  12. if err != nil {
  13. return err
  14. }
  15. f.interfaces = ifs
  16. return nil
  17. }
  18. func (f *myInterfaceFinder) updateInterfaces(interfaces []net.Interface) {
  19. f.interfaces = interfaces
  20. }
  21. func (f *myInterfaceFinder) InterfaceIndexByName(name string) (interfaceIndex int, err error) {
  22. for _, netInterface := range f.interfaces {
  23. if netInterface.Name == name {
  24. return netInterface.Index, nil
  25. }
  26. }
  27. netInterface, err := net.InterfaceByName(name)
  28. if err != nil {
  29. return
  30. }
  31. f.update()
  32. return netInterface.Index, nil
  33. }
  34. func (f *myInterfaceFinder) InterfaceNameByIndex(index int) (interfaceName string, err error) {
  35. for _, netInterface := range f.interfaces {
  36. if netInterface.Index == index {
  37. return netInterface.Name, nil
  38. }
  39. }
  40. netInterface, err := net.InterfaceByIndex(index)
  41. if err != nil {
  42. return
  43. }
  44. f.update()
  45. return netInterface.Name, nil
  46. }