monitor.go 5.2 KB

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