router.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. package adapter
  2. import (
  3. "context"
  4. "net/http"
  5. "net/netip"
  6. "github.com/sagernet/sing-box/common/geoip"
  7. "github.com/sagernet/sing-dns"
  8. "github.com/sagernet/sing-tun"
  9. "github.com/sagernet/sing/common/control"
  10. N "github.com/sagernet/sing/common/network"
  11. "github.com/sagernet/sing/common/x/list"
  12. "github.com/sagernet/sing/service"
  13. mdns "github.com/miekg/dns"
  14. "go4.org/netipx"
  15. )
  16. type Router interface {
  17. Service
  18. PreStarter
  19. PostStarter
  20. Cleanup() error
  21. Outbounds() []Outbound
  22. Outbound(tag string) (Outbound, bool)
  23. DefaultOutbound(network string) (Outbound, error)
  24. FakeIPStore() FakeIPStore
  25. ConnectionRouter
  26. GeoIPReader() *geoip.Reader
  27. LoadGeosite(code string) (Rule, error)
  28. RuleSet(tag string) (RuleSet, bool)
  29. NeedWIFIState() bool
  30. Exchange(ctx context.Context, message *mdns.Msg) (*mdns.Msg, error)
  31. Lookup(ctx context.Context, domain string, strategy dns.DomainStrategy) ([]netip.Addr, error)
  32. LookupDefault(ctx context.Context, domain string) ([]netip.Addr, error)
  33. ClearDNSCache()
  34. InterfaceFinder() control.InterfaceFinder
  35. UpdateInterfaces() error
  36. DefaultInterface() string
  37. AutoDetectInterface() bool
  38. AutoDetectInterfaceFunc() control.Func
  39. DefaultMark() uint32
  40. RegisterAutoRedirectOutputMark(mark uint32) error
  41. AutoRedirectOutputMark() uint32
  42. NetworkMonitor() tun.NetworkUpdateMonitor
  43. InterfaceMonitor() tun.DefaultInterfaceMonitor
  44. PackageManager() tun.PackageManager
  45. WIFIState() WIFIState
  46. Rules() []Rule
  47. ClashServer() ClashServer
  48. SetClashServer(server ClashServer)
  49. V2RayServer() V2RayServer
  50. SetV2RayServer(server V2RayServer)
  51. ResetNetwork() error
  52. }
  53. func ContextWithRouter(ctx context.Context, router Router) context.Context {
  54. return service.ContextWith(ctx, router)
  55. }
  56. func RouterFromContext(ctx context.Context) Router {
  57. return service.FromContext[Router](ctx)
  58. }
  59. type HeadlessRule interface {
  60. Match(metadata *InboundContext) bool
  61. String() string
  62. }
  63. type Rule interface {
  64. HeadlessRule
  65. Service
  66. Type() string
  67. UpdateGeosite() error
  68. Outbound() string
  69. }
  70. type DNSRule interface {
  71. Rule
  72. DisableCache() bool
  73. RewriteTTL() *uint32
  74. ClientSubnet() *netip.Prefix
  75. WithAddressLimit() bool
  76. MatchAddressLimit(metadata *InboundContext) bool
  77. }
  78. type RuleSet interface {
  79. Name() string
  80. StartContext(ctx context.Context, startContext RuleSetStartContext) error
  81. PostStart() error
  82. Metadata() RuleSetMetadata
  83. ExtractIPSet() []*netipx.IPSet
  84. IncRef()
  85. DecRef()
  86. Cleanup()
  87. RegisterCallback(callback RuleSetUpdateCallback) *list.Element[RuleSetUpdateCallback]
  88. UnregisterCallback(element *list.Element[RuleSetUpdateCallback])
  89. Close() error
  90. HeadlessRule
  91. }
  92. type RuleSetUpdateCallback func(it RuleSet)
  93. type RuleSetMetadata struct {
  94. ContainsProcessRule bool
  95. ContainsWIFIRule bool
  96. ContainsIPCIDRRule bool
  97. }
  98. type RuleSetStartContext interface {
  99. HTTPClient(detour string, dialer N.Dialer) *http.Client
  100. Close()
  101. }
  102. type InterfaceUpdateListener interface {
  103. InterfaceUpdated()
  104. }
  105. type WIFIState struct {
  106. SSID string
  107. BSSID string
  108. }