memory.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package fakeip
  2. import (
  3. "net/netip"
  4. "sync"
  5. "github.com/sagernet/sing-box/adapter"
  6. "github.com/sagernet/sing/common/logger"
  7. )
  8. var _ adapter.FakeIPStorage = (*MemoryStorage)(nil)
  9. type MemoryStorage struct {
  10. addressAccess sync.RWMutex
  11. domainAccess sync.RWMutex
  12. addressCache map[netip.Addr]string
  13. domainCache4 map[string]netip.Addr
  14. domainCache6 map[string]netip.Addr
  15. }
  16. func NewMemoryStorage() *MemoryStorage {
  17. return &MemoryStorage{
  18. addressCache: make(map[netip.Addr]string),
  19. domainCache4: make(map[string]netip.Addr),
  20. domainCache6: make(map[string]netip.Addr),
  21. }
  22. }
  23. func (s *MemoryStorage) FakeIPMetadata() *adapter.FakeIPMetadata {
  24. return nil
  25. }
  26. func (s *MemoryStorage) FakeIPSaveMetadata(metadata *adapter.FakeIPMetadata) error {
  27. return nil
  28. }
  29. func (s *MemoryStorage) FakeIPSaveMetadataAsync(metadata *adapter.FakeIPMetadata) {
  30. }
  31. func (s *MemoryStorage) FakeIPStore(address netip.Addr, domain string) error {
  32. s.addressAccess.Lock()
  33. s.domainAccess.Lock()
  34. if oldDomain, loaded := s.addressCache[address]; loaded {
  35. if address.Is4() {
  36. delete(s.domainCache4, oldDomain)
  37. } else {
  38. delete(s.domainCache6, oldDomain)
  39. }
  40. }
  41. s.addressCache[address] = domain
  42. if address.Is4() {
  43. s.domainCache4[domain] = address
  44. } else {
  45. s.domainCache6[domain] = address
  46. }
  47. s.domainAccess.Unlock()
  48. s.addressAccess.Unlock()
  49. return nil
  50. }
  51. func (s *MemoryStorage) FakeIPStoreAsync(address netip.Addr, domain string, logger logger.Logger) {
  52. _ = s.FakeIPStore(address, domain)
  53. }
  54. func (s *MemoryStorage) FakeIPLoad(address netip.Addr) (string, bool) {
  55. s.addressAccess.RLock()
  56. defer s.addressAccess.RUnlock()
  57. domain, loaded := s.addressCache[address]
  58. return domain, loaded
  59. }
  60. func (s *MemoryStorage) FakeIPLoadDomain(domain string, isIPv6 bool) (netip.Addr, bool) {
  61. s.domainAccess.RLock()
  62. defer s.domainAccess.RUnlock()
  63. if !isIPv6 {
  64. address, loaded := s.domainCache4[domain]
  65. return address, loaded
  66. } else {
  67. address, loaded := s.domainCache6[domain]
  68. return address, loaded
  69. }
  70. }
  71. func (s *MemoryStorage) FakeIPReset() error {
  72. s.addressAccess.Lock()
  73. s.domainAccess.Lock()
  74. s.addressCache = make(map[netip.Addr]string)
  75. s.domainCache4 = make(map[string]netip.Addr)
  76. s.domainCache6 = make(map[string]netip.Addr)
  77. s.domainAccess.Unlock()
  78. s.addressAccess.Unlock()
  79. return nil
  80. }