udp.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. package protocol
  2. import (
  3. "encoding/binary"
  4. "errors"
  5. "github.com/v2ray/v2ray-core/common/log"
  6. v2net "github.com/v2ray/v2ray-core/common/net"
  7. )
  8. var (
  9. ErrorUnknownAddressType = errors.New("Unknown Address Type.")
  10. )
  11. type Socks5UDPRequest struct {
  12. Fragment byte
  13. Address v2net.Address
  14. Data []byte
  15. }
  16. func (request *Socks5UDPRequest) Destination() v2net.Destination {
  17. return v2net.NewUDPDestination(request.Address)
  18. }
  19. func ReadUDPRequest(packet []byte) (request Socks5UDPRequest, err error) {
  20. // packet[0] and packet[1] are reserved
  21. request.Fragment = packet[2]
  22. addrType := packet[3]
  23. var dataBegin int
  24. switch addrType {
  25. case AddrTypeIPv4:
  26. ip := packet[4:8]
  27. port := binary.BigEndian.Uint16(packet[8:10])
  28. request.Address = v2net.IPAddress(ip, port)
  29. dataBegin = 10
  30. case AddrTypeIPv6:
  31. ip := packet[4:20]
  32. port := binary.BigEndian.Uint16(packet[20:22])
  33. request.Address = v2net.IPAddress(ip, port)
  34. dataBegin = 22
  35. case AddrTypeDomain:
  36. domainLength := int(packet[4])
  37. domain := string(packet[5 : 5+domainLength])
  38. port := binary.BigEndian.Uint16(packet[5+domainLength : 5+domainLength+2])
  39. request.Address = v2net.DomainAddress(domain, port)
  40. dataBegin = 5 + domainLength + 2
  41. default:
  42. log.Warning("Unknown address type %d", addrType)
  43. err = ErrorUnknownAddressType
  44. return
  45. }
  46. request.Data = make([]byte, len(packet)-dataBegin)
  47. copy(request.Data, packet[dataBegin:])
  48. return
  49. }