monitor.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  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 interfaceName == "" || interfaceIndex32 == -1 {
  86. m.defaultInterfaceName = ""
  87. m.defaultInterfaceIndex = -1
  88. m.access.Lock()
  89. callbacks := m.callbacks.Array()
  90. m.access.Unlock()
  91. for _, callback := range callbacks {
  92. callback(tun.EventNoRoute)
  93. }
  94. return
  95. }
  96. var err error
  97. if m.iif.UsePlatformInterfaceGetter() {
  98. err = m.updateInterfacesPlatform()
  99. } else {
  100. err = m.updateInterfaces()
  101. }
  102. if err == nil {
  103. err = m.router.UpdateInterfaces()
  104. }
  105. if err != nil {
  106. m.logger.Error(E.Cause(err, "update interfaces"))
  107. }
  108. interfaceIndex := int(interfaceIndex32)
  109. if m.defaultInterfaceName == interfaceName && m.defaultInterfaceIndex == interfaceIndex {
  110. return
  111. }
  112. m.defaultInterfaceName = interfaceName
  113. m.defaultInterfaceIndex = interfaceIndex
  114. m.access.Lock()
  115. callbacks := m.callbacks.Array()
  116. m.access.Unlock()
  117. for _, callback := range callbacks {
  118. callback(tun.EventInterfaceUpdate)
  119. }
  120. }
  121. func (m *platformDefaultInterfaceMonitor) updateInterfaces() error {
  122. interfaces, err := net.Interfaces()
  123. if err != nil {
  124. return err
  125. }
  126. var addresses []networkAddress
  127. for _, iif := range interfaces {
  128. var netAddresses []net.Addr
  129. netAddresses, err = iif.Addrs()
  130. if err != nil {
  131. return err
  132. }
  133. var address networkAddress
  134. address.interfaceName = iif.Name
  135. address.interfaceIndex = iif.Index
  136. address.addresses = common.Map(common.FilterIsInstance(netAddresses, func(it net.Addr) (*net.IPNet, bool) {
  137. value, loaded := it.(*net.IPNet)
  138. return value, loaded
  139. }), func(it *net.IPNet) netip.Prefix {
  140. bits, _ := it.Mask.Size()
  141. return netip.PrefixFrom(M.AddrFromIP(it.IP), bits)
  142. })
  143. addresses = append(addresses, address)
  144. }
  145. m.networkAddresses = addresses
  146. return nil
  147. }
  148. func (m *platformDefaultInterfaceMonitor) updateInterfacesPlatform() error {
  149. interfaces, err := m.Interfaces()
  150. if err != nil {
  151. return err
  152. }
  153. var addresses []networkAddress
  154. for _, iif := range interfaces {
  155. var address networkAddress
  156. address.interfaceName = iif.Name
  157. address.interfaceIndex = iif.Index
  158. // address.addresses = common.Map(iif.Addresses, netip.MustParsePrefix)
  159. addresses = append(addresses, address)
  160. }
  161. m.networkAddresses = addresses
  162. return nil
  163. }