ipcidr.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package common
  2. import (
  3. "net/netip"
  4. C "github.com/metacubex/mihomo/constant"
  5. )
  6. type IPCIDROption func(*IPCIDR)
  7. func WithIPCIDRSourceIP(b bool) IPCIDROption {
  8. return func(i *IPCIDR) {
  9. i.isSourceIP = b
  10. }
  11. }
  12. func WithIPCIDRNoResolve(noResolve bool) IPCIDROption {
  13. return func(i *IPCIDR) {
  14. i.noResolveIP = noResolve
  15. }
  16. }
  17. type IPCIDR struct {
  18. *Base
  19. ipnet netip.Prefix
  20. adapter string
  21. isSourceIP bool
  22. noResolveIP bool
  23. }
  24. func (i *IPCIDR) RuleType() C.RuleType {
  25. if i.isSourceIP {
  26. return C.SrcIPCIDR
  27. }
  28. return C.IPCIDR
  29. }
  30. func (i *IPCIDR) Match(metadata *C.Metadata) (bool, string) {
  31. ip := metadata.DstIP
  32. if i.isSourceIP {
  33. ip = metadata.SrcIP
  34. }
  35. return ip.IsValid() && i.ipnet.Contains(ip), i.adapter
  36. }
  37. func (i *IPCIDR) Adapter() string {
  38. return i.adapter
  39. }
  40. func (i *IPCIDR) Payload() string {
  41. return i.ipnet.String()
  42. }
  43. func (i *IPCIDR) ShouldResolveIP() bool {
  44. return !i.noResolveIP
  45. }
  46. func NewIPCIDR(s string, adapter string, opts ...IPCIDROption) (*IPCIDR, error) {
  47. ipnet, err := netip.ParsePrefix(s)
  48. if err != nil {
  49. return nil, errPayload
  50. }
  51. ipcidr := &IPCIDR{
  52. Base: &Base{},
  53. ipnet: ipnet,
  54. adapter: adapter,
  55. }
  56. for _, o := range opts {
  57. o(ipcidr)
  58. }
  59. return ipcidr, nil
  60. }
  61. //var _ C.Rule = (*IPCIDR)(nil)