monitor.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. package libbox
  2. import (
  3. "net"
  4. "net/netip"
  5. "sync"
  6. "github.com/sagernet/sing-tun"
  7. "github.com/sagernet/sing/common"
  8. E "github.com/sagernet/sing/common/exceptions"
  9. "github.com/sagernet/sing/common/logger"
  10. M "github.com/sagernet/sing/common/metadata"
  11. "github.com/sagernet/sing/common/x/list"
  12. )
  13. var (
  14. _ tun.DefaultInterfaceMonitor = (*platformDefaultInterfaceMonitor)(nil)
  15. _ InterfaceUpdateListener = (*platformDefaultInterfaceMonitor)(nil)
  16. )
  17. type platformDefaultInterfaceMonitor struct {
  18. *platformInterfaceWrapper
  19. networkAddresses []networkAddress
  20. defaultInterfaceName string
  21. defaultInterfaceIndex int
  22. element *list.Element[tun.NetworkUpdateCallback]
  23. access sync.Mutex
  24. callbacks list.List[tun.DefaultInterfaceUpdateCallback]
  25. logger logger.Logger
  26. }
  27. type networkAddress struct {
  28. interfaceName string
  29. interfaceIndex int
  30. addresses []netip.Prefix
  31. }
  32. func (m *platformDefaultInterfaceMonitor) Start() error {
  33. return m.iif.StartDefaultInterfaceMonitor(m)
  34. }
  35. func (m *platformDefaultInterfaceMonitor) Close() error {
  36. return m.iif.CloseDefaultInterfaceMonitor(m)
  37. }
  38. func (m *platformDefaultInterfaceMonitor) DefaultInterfaceName(destination netip.Addr) string {
  39. for _, address := range m.networkAddresses {
  40. for _, prefix := range address.addresses {
  41. if prefix.Contains(destination) {
  42. return address.interfaceName
  43. }
  44. }
  45. }
  46. return m.defaultInterfaceName
  47. }
  48. func (m *platformDefaultInterfaceMonitor) DefaultInterfaceIndex(destination netip.Addr) int {
  49. for _, address := range m.networkAddresses {
  50. for _, prefix := range address.addresses {
  51. if prefix.Contains(destination) {
  52. return address.interfaceIndex
  53. }
  54. }
  55. }
  56. return m.defaultInterfaceIndex
  57. }
  58. func (m *platformDefaultInterfaceMonitor) DefaultInterface(destination netip.Addr) (string, int) {
  59. for _, address := range m.networkAddresses {
  60. for _, prefix := range address.addresses {
  61. if prefix.Contains(destination) {
  62. return address.interfaceName, address.interfaceIndex
  63. }
  64. }
  65. }
  66. return m.defaultInterfaceName, m.defaultInterfaceIndex
  67. }
  68. func (m *platformDefaultInterfaceMonitor) OverrideAndroidVPN() bool {
  69. return false
  70. }
  71. func (m *platformDefaultInterfaceMonitor) AndroidVPNEnabled() bool {
  72. return false
  73. }
  74. func (m *platformDefaultInterfaceMonitor) RegisterCallback(callback tun.DefaultInterfaceUpdateCallback) *list.Element[tun.DefaultInterfaceUpdateCallback] {
  75. m.access.Lock()
  76. defer m.access.Unlock()
  77. return m.callbacks.PushBack(callback)
  78. }
  79. func (m *platformDefaultInterfaceMonitor) UnregisterCallback(element *list.Element[tun.DefaultInterfaceUpdateCallback]) {
  80. m.access.Lock()
  81. defer m.access.Unlock()
  82. m.callbacks.Remove(element)
  83. }
  84. func (m *platformDefaultInterfaceMonitor) UpdateDefaultInterface(interfaceName string, interfaceIndex32 int32) {
  85. if sFixAndroidStack {
  86. go m.updateDefaultInterface(interfaceName, interfaceIndex32)
  87. } else {
  88. m.updateDefaultInterface(interfaceName, interfaceIndex32)
  89. }
  90. }
  91. func (m *platformDefaultInterfaceMonitor) updateDefaultInterface(interfaceName string, interfaceIndex32 int32) {
  92. if interfaceName == "" || interfaceIndex32 == -1 {
  93. m.defaultInterfaceName = ""
  94. m.defaultInterfaceIndex = -1
  95. m.access.Lock()
  96. callbacks := m.callbacks.Array()
  97. m.access.Unlock()
  98. for _, callback := range callbacks {
  99. callback(tun.EventNoRoute)
  100. }
  101. return
  102. }
  103. var err error
  104. if m.iif.UsePlatformInterfaceGetter() {
  105. err = m.updateInterfacesPlatform()
  106. } else {
  107. err = m.updateInterfaces()
  108. }
  109. if err == nil {
  110. err = m.router.UpdateInterfaces()
  111. }
  112. if err != nil {
  113. m.logger.Error(E.Cause(err, "update interfaces"))
  114. }
  115. interfaceIndex := int(interfaceIndex32)
  116. if m.defaultInterfaceName == interfaceName && m.defaultInterfaceIndex == interfaceIndex {
  117. return
  118. }
  119. m.defaultInterfaceName = interfaceName
  120. m.defaultInterfaceIndex = interfaceIndex
  121. m.access.Lock()
  122. callbacks := m.callbacks.Array()
  123. m.access.Unlock()
  124. for _, callback := range callbacks {
  125. callback(tun.EventInterfaceUpdate)
  126. }
  127. }
  128. func (m *platformDefaultInterfaceMonitor) updateInterfaces() error {
  129. interfaces, err := net.Interfaces()
  130. if err != nil {
  131. return err
  132. }
  133. var addresses []networkAddress
  134. for _, iif := range interfaces {
  135. var netAddresses []net.Addr
  136. netAddresses, err = iif.Addrs()
  137. if err != nil {
  138. return err
  139. }
  140. var address networkAddress
  141. address.interfaceName = iif.Name
  142. address.interfaceIndex = iif.Index
  143. address.addresses = common.Map(common.FilterIsInstance(netAddresses, func(it net.Addr) (*net.IPNet, bool) {
  144. value, loaded := it.(*net.IPNet)
  145. return value, loaded
  146. }), func(it *net.IPNet) netip.Prefix {
  147. bits, _ := it.Mask.Size()
  148. return netip.PrefixFrom(M.AddrFromIP(it.IP), bits)
  149. })
  150. addresses = append(addresses, address)
  151. }
  152. m.networkAddresses = addresses
  153. return nil
  154. }
  155. func (m *platformDefaultInterfaceMonitor) updateInterfacesPlatform() error {
  156. interfaces, err := m.Interfaces()
  157. if err != nil {
  158. return err
  159. }
  160. var addresses []networkAddress
  161. for _, iif := range interfaces {
  162. var address networkAddress
  163. address.interfaceName = iif.Name
  164. address.interfaceIndex = iif.Index
  165. // address.addresses = common.Map(iif.Addresses, netip.MustParsePrefix)
  166. addresses = append(addresses, address)
  167. }
  168. m.networkAddresses = addresses
  169. return nil
  170. }