fakeip_metadata.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. package adapter
  2. import (
  3. "bytes"
  4. "encoding"
  5. "encoding/binary"
  6. "io"
  7. "net/netip"
  8. "github.com/sagernet/sing/common"
  9. )
  10. type FakeIPMetadata struct {
  11. Inet4Range netip.Prefix
  12. Inet6Range netip.Prefix
  13. Inet4Current netip.Addr
  14. Inet6Current netip.Addr
  15. }
  16. func (m *FakeIPMetadata) MarshalBinary() (data []byte, err error) {
  17. var buffer bytes.Buffer
  18. for _, marshaler := range []encoding.BinaryMarshaler{m.Inet4Range, m.Inet6Range, m.Inet4Current, m.Inet6Current} {
  19. data, err = marshaler.MarshalBinary()
  20. if err != nil {
  21. return
  22. }
  23. common.Must(binary.Write(&buffer, binary.BigEndian, uint16(len(data))))
  24. buffer.Write(data)
  25. }
  26. data = buffer.Bytes()
  27. return
  28. }
  29. func (m *FakeIPMetadata) UnmarshalBinary(data []byte) error {
  30. reader := bytes.NewReader(data)
  31. for _, unmarshaler := range []encoding.BinaryUnmarshaler{&m.Inet4Range, &m.Inet6Range, &m.Inet4Current, &m.Inet6Current} {
  32. var length uint16
  33. common.Must(binary.Read(reader, binary.BigEndian, &length))
  34. element := make([]byte, length)
  35. _, err := io.ReadFull(reader, element)
  36. if err != nil {
  37. return err
  38. }
  39. err = unmarshaler.UnmarshalBinary(element)
  40. if err != nil {
  41. return err
  42. }
  43. }
  44. return nil
  45. }