github.com/chwjbn/xclash@v0.2.0/dns/enhancer.go (about)

     1  package dns
     2  
     3  import (
     4  	"net"
     5  
     6  	"github.com/chwjbn/xclash/common/cache"
     7  	"github.com/chwjbn/xclash/component/fakeip"
     8  	C "github.com/chwjbn/xclash/constant"
     9  )
    10  
    11  type ResolverEnhancer struct {
    12  	mode     C.DNSMode
    13  	fakePool *fakeip.Pool
    14  	mapping  *cache.LruCache
    15  }
    16  
    17  func (h *ResolverEnhancer) FakeIPEnabled() bool {
    18  	return h.mode == C.DNSFakeIP
    19  }
    20  
    21  func (h *ResolverEnhancer) MappingEnabled() bool {
    22  	return h.mode == C.DNSFakeIP || h.mode == C.DNSMapping
    23  }
    24  
    25  func (h *ResolverEnhancer) IsExistFakeIP(ip net.IP) bool {
    26  	if !h.FakeIPEnabled() {
    27  		return false
    28  	}
    29  
    30  	if pool := h.fakePool; pool != nil {
    31  		return pool.Exist(ip)
    32  	}
    33  
    34  	return false
    35  }
    36  
    37  func (h *ResolverEnhancer) IsFakeIP(ip net.IP) bool {
    38  	if !h.FakeIPEnabled() {
    39  		return false
    40  	}
    41  
    42  	if pool := h.fakePool; pool != nil {
    43  		return pool.IPNet().Contains(ip) && !pool.Gateway().Equal(ip)
    44  	}
    45  
    46  	return false
    47  }
    48  
    49  func (h *ResolverEnhancer) FindHostByIP(ip net.IP) (string, bool) {
    50  	if pool := h.fakePool; pool != nil {
    51  		if host, existed := pool.LookBack(ip); existed {
    52  			return host, true
    53  		}
    54  	}
    55  
    56  	if mapping := h.mapping; mapping != nil {
    57  		if host, existed := h.mapping.Get(ip.String()); existed {
    58  			return host.(string), true
    59  		}
    60  	}
    61  
    62  	return "", false
    63  }
    64  
    65  func (h *ResolverEnhancer) PatchFrom(o *ResolverEnhancer) {
    66  	if h.mapping != nil && o.mapping != nil {
    67  		o.mapping.CloneTo(h.mapping)
    68  	}
    69  
    70  	if h.fakePool != nil && o.fakePool != nil {
    71  		h.fakePool.CloneFrom(o.fakePool)
    72  	}
    73  }
    74  
    75  func NewEnhancer(cfg Config) *ResolverEnhancer {
    76  	var fakePool *fakeip.Pool
    77  	var mapping *cache.LruCache
    78  
    79  	if cfg.EnhancedMode != C.DNSNormal {
    80  		fakePool = cfg.Pool
    81  		mapping = cache.NewLRUCache(cache.WithSize(4096), cache.WithStale(true))
    82  	}
    83  
    84  	return &ResolverEnhancer{
    85  		mode:     cfg.EnhancedMode,
    86  		fakePool: fakePool,
    87  		mapping:  mapping,
    88  	}
    89  }