dns.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package command
  2. import (
  3. "errors"
  4. "io"
  5. v2net "github.com/v2ray/v2ray-core/common/net"
  6. "github.com/v2ray/v2ray-core/transport"
  7. )
  8. func init() {
  9. RegisterResponseCommand(2, func() Command { return new(CacheDns) })
  10. }
  11. const (
  12. typeIPv4 byte = 1
  13. typeIPv6 byte = 2
  14. )
  15. var (
  16. ErrDomainAddress = errors.New("Unexpected domain address")
  17. )
  18. // Size: 1 byte type + 4 or 16 byte IP addr
  19. type CacheDns struct {
  20. Address v2net.Address
  21. }
  22. func (this *CacheDns) Marshal(writer io.Writer) (int, error) {
  23. if this.Address.IsIPv4() {
  24. writer.Write([]byte{typeIPv4})
  25. writer.Write(this.Address.IP())
  26. return 5, nil
  27. }
  28. if this.Address.IsIPv6() {
  29. writer.Write([]byte{typeIPv6})
  30. writer.Write(this.Address.IP())
  31. return 17, nil
  32. }
  33. return 0, ErrDomainAddress
  34. }
  35. func (this *CacheDns) Unmarshal(data []byte) error {
  36. if len(data) == 0 {
  37. return transport.CorruptedPacket
  38. }
  39. typeIP := data[0]
  40. data = data[1:]
  41. if typeIP == typeIPv4 {
  42. if len(data) < 4 {
  43. return transport.CorruptedPacket
  44. }
  45. this.Address = v2net.IPAddress(data[0:4])
  46. return nil
  47. }
  48. if typeIP == typeIPv6 {
  49. if len(data) < 16 {
  50. return transport.CorruptedPacket
  51. }
  52. this.Address = v2net.IPAddress(data[0:16])
  53. return nil
  54. }
  55. return transport.CorruptedPacket
  56. }