monitor.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package libbox
  2. import (
  3. "github.com/sagernet/sing-tun"
  4. "github.com/sagernet/sing/common/control"
  5. E "github.com/sagernet/sing/common/exceptions"
  6. "github.com/sagernet/sing/common/logger"
  7. "github.com/sagernet/sing/common/x/list"
  8. )
  9. var (
  10. _ tun.DefaultInterfaceMonitor = (*platformDefaultInterfaceMonitor)(nil)
  11. _ InterfaceUpdateListener = (*platformDefaultInterfaceMonitor)(nil)
  12. )
  13. type platformDefaultInterfaceMonitor struct {
  14. *platformInterfaceWrapper
  15. element *list.Element[tun.NetworkUpdateCallback]
  16. callbacks list.List[tun.DefaultInterfaceUpdateCallback]
  17. logger logger.Logger
  18. }
  19. func (m *platformDefaultInterfaceMonitor) Start() error {
  20. return m.iif.StartDefaultInterfaceMonitor(m)
  21. }
  22. func (m *platformDefaultInterfaceMonitor) Close() error {
  23. return m.iif.CloseDefaultInterfaceMonitor(m)
  24. }
  25. func (m *platformDefaultInterfaceMonitor) DefaultInterface() *control.Interface {
  26. m.defaultInterfaceAccess.Lock()
  27. defer m.defaultInterfaceAccess.Unlock()
  28. return m.defaultInterface
  29. }
  30. func (m *platformDefaultInterfaceMonitor) OverrideAndroidVPN() bool {
  31. return false
  32. }
  33. func (m *platformDefaultInterfaceMonitor) AndroidVPNEnabled() bool {
  34. return false
  35. }
  36. func (m *platformDefaultInterfaceMonitor) RegisterCallback(callback tun.DefaultInterfaceUpdateCallback) *list.Element[tun.DefaultInterfaceUpdateCallback] {
  37. m.defaultInterfaceAccess.Lock()
  38. defer m.defaultInterfaceAccess.Unlock()
  39. return m.callbacks.PushBack(callback)
  40. }
  41. func (m *platformDefaultInterfaceMonitor) UnregisterCallback(element *list.Element[tun.DefaultInterfaceUpdateCallback]) {
  42. m.defaultInterfaceAccess.Lock()
  43. defer m.defaultInterfaceAccess.Unlock()
  44. m.callbacks.Remove(element)
  45. }
  46. func (m *platformDefaultInterfaceMonitor) UpdateDefaultInterface(interfaceName string, interfaceIndex32 int32, isExpensive bool, isConstrained bool) {
  47. if sFixAndroidStack {
  48. go m.updateDefaultInterface(interfaceName, interfaceIndex32, isExpensive, isConstrained)
  49. } else {
  50. m.updateDefaultInterface(interfaceName, interfaceIndex32, isExpensive, isConstrained)
  51. }
  52. }
  53. func (m *platformDefaultInterfaceMonitor) updateDefaultInterface(interfaceName string, interfaceIndex32 int32, isExpensive bool, isConstrained bool) {
  54. m.isExpensive = isExpensive
  55. m.isConstrained = isConstrained
  56. err := m.networkManager.UpdateInterfaces()
  57. if err != nil {
  58. m.logger.Error(E.Cause(err, "update interfaces"))
  59. }
  60. m.defaultInterfaceAccess.Lock()
  61. if interfaceIndex32 == -1 {
  62. m.defaultInterface = nil
  63. callbacks := m.callbacks.Array()
  64. m.defaultInterfaceAccess.Unlock()
  65. for _, callback := range callbacks {
  66. callback(nil, 0)
  67. }
  68. return
  69. }
  70. oldInterface := m.defaultInterface
  71. newInterface, err := m.networkManager.InterfaceFinder().ByIndex(int(interfaceIndex32))
  72. if err != nil {
  73. m.defaultInterfaceAccess.Unlock()
  74. m.logger.Error(E.Cause(err, "find updated interface: ", interfaceName))
  75. return
  76. }
  77. m.defaultInterface = newInterface
  78. if oldInterface != nil && oldInterface.Name == m.defaultInterface.Name && oldInterface.Index == m.defaultInterface.Index {
  79. m.defaultInterfaceAccess.Unlock()
  80. return
  81. }
  82. callbacks := m.callbacks.Array()
  83. m.defaultInterfaceAccess.Unlock()
  84. for _, callback := range callbacks {
  85. callback(newInterface, 0)
  86. }
  87. }