monitor.go 5.2 KB

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