router.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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/service"
  12. mdns "github.com/miekg/dns"
  13. )
  14. type Router interface {
  15. Service
  16. PreStarter
  17. PostStarter
  18. Outbounds() []Outbound
  19. Outbound(tag string) (Outbound, bool)
  20. DefaultOutbound(network string) (Outbound, error)
  21. FakeIPStore() FakeIPStore
  22. ConnectionRouter
  23. GeoIPReader() *geoip.Reader
  24. LoadGeosite(code string) (Rule, error)
  25. RuleSet(tag string) (RuleSet, bool)
  26. NeedWIFIState() bool
  27. Exchange(ctx context.Context, message *mdns.Msg) (*mdns.Msg, error)
  28. Lookup(ctx context.Context, domain string, strategy dns.DomainStrategy) ([]netip.Addr, error)
  29. LookupDefault(ctx context.Context, domain string) ([]netip.Addr, error)
  30. ClearDNSCache()
  31. InterfaceFinder() control.InterfaceFinder
  32. UpdateInterfaces() error
  33. DefaultInterface() string
  34. AutoDetectInterface() bool
  35. AutoDetectInterfaceFunc() control.Func
  36. DefaultMark() uint32
  37. NetworkMonitor() tun.NetworkUpdateMonitor
  38. InterfaceMonitor() tun.DefaultInterfaceMonitor
  39. PackageManager() tun.PackageManager
  40. WIFIState() WIFIState
  41. Rules() []Rule
  42. ClashServer() ClashServer
  43. SetClashServer(server ClashServer)
  44. V2RayServer() V2RayServer
  45. SetV2RayServer(server V2RayServer)
  46. ResetNetwork() error
  47. }
  48. func ContextWithRouter(ctx context.Context, router Router) context.Context {
  49. return service.ContextWith(ctx, router)
  50. }
  51. func RouterFromContext(ctx context.Context) Router {
  52. return service.FromContext[Router](ctx)
  53. }
  54. type HeadlessRule interface {
  55. Match(metadata *InboundContext) bool
  56. String() string
  57. }
  58. type Rule interface {
  59. HeadlessRule
  60. Service
  61. Type() string
  62. UpdateGeosite() error
  63. Outbound() string
  64. }
  65. type DNSRule interface {
  66. Rule
  67. DisableCache() bool
  68. RewriteTTL() *uint32
  69. ClientSubnet() *netip.Prefix
  70. WithAddressLimit() bool
  71. MatchAddressLimit(metadata *InboundContext) bool
  72. }
  73. type RuleSet interface {
  74. StartContext(ctx context.Context, startContext RuleSetStartContext) error
  75. Metadata() RuleSetMetadata
  76. Close() error
  77. HeadlessRule
  78. }
  79. type RuleSetMetadata struct {
  80. ContainsProcessRule bool
  81. ContainsWIFIRule bool
  82. ContainsIPCIDRRule bool
  83. }
  84. type RuleSetStartContext interface {
  85. HTTPClient(detour string, dialer N.Dialer) *http.Client
  86. Close()
  87. }
  88. type InterfaceUpdateListener interface {
  89. InterfaceUpdated()
  90. }
  91. type WIFIState struct {
  92. SSID string
  93. BSSID string
  94. }