monitor.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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. done := make(chan struct{})
  49. go func() {
  50. m.updateDefaultInterface(interfaceName, interfaceIndex32, isExpensive, isConstrained)
  51. close(done)
  52. }()
  53. <-done
  54. } else {
  55. m.updateDefaultInterface(interfaceName, interfaceIndex32, isExpensive, isConstrained)
  56. }
  57. }
  58. func (m *platformDefaultInterfaceMonitor) updateDefaultInterface(interfaceName string, interfaceIndex32 int32, isExpensive bool, isConstrained bool) {
  59. m.isExpensive = isExpensive
  60. m.isConstrained = isConstrained
  61. err := m.networkManager.UpdateInterfaces()
  62. if err != nil {
  63. m.logger.Error(E.Cause(err, "update interfaces"))
  64. }
  65. m.defaultInterfaceAccess.Lock()
  66. if interfaceIndex32 == -1 {
  67. m.defaultInterface = nil
  68. callbacks := m.callbacks.Array()
  69. m.defaultInterfaceAccess.Unlock()
  70. for _, callback := range callbacks {
  71. callback(nil, 0)
  72. }
  73. return
  74. }
  75. oldInterface := m.defaultInterface
  76. newInterface, err := m.networkManager.InterfaceFinder().ByIndex(int(interfaceIndex32))
  77. if err != nil {
  78. m.defaultInterfaceAccess.Unlock()
  79. m.logger.Error(E.Cause(err, "find updated interface: ", interfaceName))
  80. return
  81. }
  82. m.defaultInterface = newInterface
  83. if oldInterface != nil && oldInterface.Name == m.defaultInterface.Name && oldInterface.Index == m.defaultInterface.Index {
  84. m.defaultInterfaceAccess.Unlock()
  85. return
  86. }
  87. callbacks := m.callbacks.Array()
  88. m.defaultInterfaceAccess.Unlock()
  89. for _, callback := range callbacks {
  90. callback(newInterface, 0)
  91. }
  92. }