transport_adapter.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package dns
  2. import (
  3. "net/netip"
  4. "github.com/sagernet/sing-box/adapter"
  5. C "github.com/sagernet/sing-box/constant"
  6. "github.com/sagernet/sing-box/option"
  7. )
  8. var _ adapter.LegacyDNSTransport = (*TransportAdapter)(nil)
  9. type TransportAdapter struct {
  10. transportType string
  11. transportTag string
  12. dependencies []string
  13. hasDetour bool
  14. strategy C.DomainStrategy
  15. clientSubnet netip.Prefix
  16. }
  17. func NewTransportAdapter(transportType string, transportTag string, dependencies []string) TransportAdapter {
  18. return TransportAdapter{
  19. transportType: transportType,
  20. transportTag: transportTag,
  21. dependencies: dependencies,
  22. }
  23. }
  24. func NewTransportAdapterWithLocalOptions(transportType string, transportTag string, localOptions option.LocalDNSServerOptions) TransportAdapter {
  25. var dependencies []string
  26. if localOptions.DomainResolver != nil && localOptions.DomainResolver.Server != "" {
  27. dependencies = append(dependencies, localOptions.DomainResolver.Server)
  28. }
  29. return TransportAdapter{
  30. transportType: transportType,
  31. transportTag: transportTag,
  32. dependencies: dependencies,
  33. hasDetour: localOptions.Detour != "",
  34. strategy: C.DomainStrategy(localOptions.LegacyStrategy),
  35. clientSubnet: localOptions.LegacyClientSubnet,
  36. }
  37. }
  38. func NewTransportAdapterWithRemoteOptions(transportType string, transportTag string, remoteOptions option.RemoteDNSServerOptions) TransportAdapter {
  39. var dependencies []string
  40. if remoteOptions.DomainResolver != nil && remoteOptions.DomainResolver.Server != "" {
  41. dependencies = append(dependencies, remoteOptions.DomainResolver.Server)
  42. }
  43. if remoteOptions.LegacyAddressResolver != "" {
  44. dependencies = append(dependencies, remoteOptions.LegacyAddressResolver)
  45. }
  46. return TransportAdapter{
  47. transportType: transportType,
  48. transportTag: transportTag,
  49. dependencies: dependencies,
  50. strategy: C.DomainStrategy(remoteOptions.LegacyStrategy),
  51. clientSubnet: remoteOptions.LegacyClientSubnet,
  52. }
  53. }
  54. func (a *TransportAdapter) Type() string {
  55. return a.transportType
  56. }
  57. func (a *TransportAdapter) Tag() string {
  58. return a.transportTag
  59. }
  60. func (a *TransportAdapter) Dependencies() []string {
  61. return a.dependencies
  62. }
  63. func (a *TransportAdapter) HasDetour() bool {
  64. return a.hasDetour
  65. }
  66. func (a *TransportAdapter) LegacyStrategy() C.DomainStrategy {
  67. return a.strategy
  68. }
  69. func (a *TransportAdapter) LegacyClientSubnet() netip.Prefix {
  70. return a.clientSubnet
  71. }