interface_finder.go 994 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  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. ifs []net.Interface
  9. }
  10. func (f *myInterfaceFinder) update() error {
  11. ifs, err := net.Interfaces()
  12. if err != nil {
  13. return err
  14. }
  15. f.ifs = ifs
  16. return nil
  17. }
  18. func (f *myInterfaceFinder) InterfaceIndexByName(name string) (interfaceIndex int, err error) {
  19. for _, netInterface := range f.ifs {
  20. if netInterface.Name == name {
  21. return netInterface.Index, nil
  22. }
  23. }
  24. netInterface, err := net.InterfaceByName(name)
  25. if err != nil {
  26. return
  27. }
  28. f.update()
  29. return netInterface.Index, nil
  30. }
  31. func (f *myInterfaceFinder) InterfaceNameByIndex(index int) (interfaceName string, err error) {
  32. for _, netInterface := range f.ifs {
  33. if netInterface.Index == index {
  34. return netInterface.Name, nil
  35. }
  36. }
  37. netInterface, err := net.InterfaceByIndex(index)
  38. if err != nil {
  39. return
  40. }
  41. f.update()
  42. return netInterface.Name, nil
  43. }