ip_set.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package srs
  2. import (
  3. "encoding/binary"
  4. "net/netip"
  5. "os"
  6. "unsafe"
  7. "github.com/sagernet/sing/common"
  8. M "github.com/sagernet/sing/common/metadata"
  9. "github.com/sagernet/sing/common/varbin"
  10. "go4.org/netipx"
  11. )
  12. type myIPSet struct {
  13. rr []myIPRange
  14. }
  15. type myIPRange struct {
  16. from netip.Addr
  17. to netip.Addr
  18. }
  19. type myIPRangeData struct {
  20. From []byte
  21. To []byte
  22. }
  23. func readIPSet(reader varbin.Reader) (*netipx.IPSet, error) {
  24. version, err := reader.ReadByte()
  25. if err != nil {
  26. return nil, err
  27. }
  28. if version != 1 {
  29. return nil, os.ErrInvalid
  30. }
  31. // WTF why using uint64 here
  32. var length uint64
  33. err = binary.Read(reader, binary.BigEndian, &length)
  34. if err != nil {
  35. return nil, err
  36. }
  37. ranges := make([]myIPRangeData, length)
  38. err = varbin.Read(reader, binary.BigEndian, &ranges)
  39. if err != nil {
  40. return nil, err
  41. }
  42. mySet := &myIPSet{
  43. rr: make([]myIPRange, len(ranges)),
  44. }
  45. for i, rangeData := range ranges {
  46. mySet.rr[i].from = M.AddrFromIP(rangeData.From)
  47. mySet.rr[i].to = M.AddrFromIP(rangeData.To)
  48. }
  49. return (*netipx.IPSet)(unsafe.Pointer(mySet)), nil
  50. }
  51. func writeIPSet(writer varbin.Writer, set *netipx.IPSet) error {
  52. err := writer.WriteByte(1)
  53. if err != nil {
  54. return err
  55. }
  56. dataList := common.Map((*myIPSet)(unsafe.Pointer(set)).rr, func(rr myIPRange) myIPRangeData {
  57. return myIPRangeData{
  58. From: rr.from.AsSlice(),
  59. To: rr.to.AsSlice(),
  60. }
  61. })
  62. err = binary.Write(writer, binary.BigEndian, uint64(len(dataList)))
  63. if err != nil {
  64. return err
  65. }
  66. for _, data := range dataList {
  67. err = varbin.Write(writer, binary.BigEndian, data)
  68. if err != nil {
  69. return err
  70. }
  71. }
  72. return nil
  73. }