ip_set.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package srs
  2. import (
  3. "encoding/binary"
  4. "io"
  5. "net/netip"
  6. "unsafe"
  7. "github.com/sagernet/sing/common/rw"
  8. "go4.org/netipx"
  9. )
  10. type myIPSet struct {
  11. rr []myIPRange
  12. }
  13. type myIPRange struct {
  14. from netip.Addr
  15. to netip.Addr
  16. }
  17. func readIPSet(reader io.Reader) (*netipx.IPSet, error) {
  18. var version uint8
  19. err := binary.Read(reader, binary.BigEndian, &version)
  20. if err != nil {
  21. return nil, err
  22. }
  23. var length uint64
  24. err = binary.Read(reader, binary.BigEndian, &length)
  25. if err != nil {
  26. return nil, err
  27. }
  28. mySet := &myIPSet{
  29. rr: make([]myIPRange, length),
  30. }
  31. for i := uint64(0); i < length; i++ {
  32. var (
  33. fromLen uint64
  34. toLen uint64
  35. fromAddr netip.Addr
  36. toAddr netip.Addr
  37. )
  38. fromLen, err = rw.ReadUVariant(reader)
  39. if err != nil {
  40. return nil, err
  41. }
  42. fromBytes := make([]byte, fromLen)
  43. _, err = io.ReadFull(reader, fromBytes)
  44. if err != nil {
  45. return nil, err
  46. }
  47. err = fromAddr.UnmarshalBinary(fromBytes)
  48. if err != nil {
  49. return nil, err
  50. }
  51. toLen, err = rw.ReadUVariant(reader)
  52. if err != nil {
  53. return nil, err
  54. }
  55. toBytes := make([]byte, toLen)
  56. _, err = io.ReadFull(reader, toBytes)
  57. if err != nil {
  58. return nil, err
  59. }
  60. err = toAddr.UnmarshalBinary(toBytes)
  61. if err != nil {
  62. return nil, err
  63. }
  64. mySet.rr[i] = myIPRange{fromAddr, toAddr}
  65. }
  66. return (*netipx.IPSet)(unsafe.Pointer(mySet)), nil
  67. }
  68. func writeIPSet(writer io.Writer, set *netipx.IPSet) error {
  69. err := binary.Write(writer, binary.BigEndian, uint8(1))
  70. if err != nil {
  71. return err
  72. }
  73. mySet := (*myIPSet)(unsafe.Pointer(set))
  74. err = binary.Write(writer, binary.BigEndian, uint64(len(mySet.rr)))
  75. if err != nil {
  76. return err
  77. }
  78. for _, rr := range mySet.rr {
  79. var (
  80. fromBinary []byte
  81. toBinary []byte
  82. )
  83. fromBinary, err = rr.from.MarshalBinary()
  84. if err != nil {
  85. return err
  86. }
  87. err = rw.WriteUVariant(writer, uint64(len(fromBinary)))
  88. if err != nil {
  89. return err
  90. }
  91. _, err = writer.Write(fromBinary)
  92. if err != nil {
  93. return err
  94. }
  95. toBinary, err = rr.to.MarshalBinary()
  96. if err != nil {
  97. return err
  98. }
  99. err = rw.WriteUVariant(writer, uint64(len(toBinary)))
  100. if err != nil {
  101. return err
  102. }
  103. _, err = writer.Write(toBinary)
  104. if err != nil {
  105. return err
  106. }
  107. }
  108. return nil
  109. }