ipcidr_strategy.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package provider
  2. import (
  3. "errors"
  4. "io"
  5. "net/netip"
  6. "github.com/metacubex/mihomo/component/cidr"
  7. C "github.com/metacubex/mihomo/constant"
  8. P "github.com/metacubex/mihomo/constant/provider"
  9. "github.com/metacubex/mihomo/log"
  10. "go4.org/netipx"
  11. )
  12. type ipcidrStrategy struct {
  13. count int
  14. shouldResolveIP bool
  15. cidrSet *cidr.IpCidrSet
  16. //trie *trie.IpCidrTrie
  17. }
  18. func (i *ipcidrStrategy) Behavior() P.RuleBehavior {
  19. return P.IPCIDR
  20. }
  21. func (i *ipcidrStrategy) ShouldFindProcess() bool {
  22. return false
  23. }
  24. func (i *ipcidrStrategy) Match(metadata *C.Metadata) bool {
  25. // return i.trie != nil && i.trie.IsContain(metadata.DstIP.AsSlice())
  26. return i.cidrSet != nil && i.cidrSet.IsContain(metadata.DstIP)
  27. }
  28. func (i *ipcidrStrategy) Count() int {
  29. return i.count
  30. }
  31. func (i *ipcidrStrategy) ShouldResolveIP() bool {
  32. return i.shouldResolveIP
  33. }
  34. func (i *ipcidrStrategy) Reset() {
  35. // i.trie = trie.NewIpCidrTrie()
  36. i.cidrSet = cidr.NewIpCidrSet()
  37. i.count = 0
  38. i.shouldResolveIP = false
  39. }
  40. func (i *ipcidrStrategy) Insert(rule string) {
  41. //err := i.trie.AddIpCidrForString(rule)
  42. err := i.cidrSet.AddIpCidrForString(rule)
  43. if err != nil {
  44. log.Warnln("invalid Ipcidr:[%s]", rule)
  45. } else {
  46. i.shouldResolveIP = true
  47. i.count++
  48. }
  49. }
  50. func (i *ipcidrStrategy) FinishInsert() {
  51. i.cidrSet.Merge()
  52. }
  53. func (i *ipcidrStrategy) FromMrs(r io.Reader, count int) error {
  54. cidrSet, err := cidr.ReadIpCidrSet(r)
  55. if err != nil {
  56. return err
  57. }
  58. i.count = count
  59. i.cidrSet = cidrSet
  60. if i.count > 0 {
  61. i.shouldResolveIP = true
  62. }
  63. return nil
  64. }
  65. func (i *ipcidrStrategy) WriteMrs(w io.Writer) error {
  66. if i.cidrSet == nil {
  67. return errors.New("nil cidrSet")
  68. }
  69. return i.cidrSet.WriteBin(w)
  70. }
  71. func (i *ipcidrStrategy) DumpMrs(f func(key string) bool) {
  72. if i.cidrSet != nil {
  73. i.cidrSet.Foreach(func(prefix netip.Prefix) bool {
  74. return f(prefix.String())
  75. })
  76. }
  77. }
  78. func (i *ipcidrStrategy) ToIpCidr() *netipx.IPSet {
  79. return i.cidrSet.ToIPSet()
  80. }
  81. func NewIPCidrStrategy() *ipcidrStrategy {
  82. return &ipcidrStrategy{}
  83. }