packetaddr.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package packetaddr
  2. import (
  3. "bytes"
  4. "github.com/v2fly/v2ray-core/v4/common/buf"
  5. "github.com/v2fly/v2ray-core/v4/common/net"
  6. "github.com/v2fly/v2ray-core/v4/common/protocol"
  7. gonet "net"
  8. )
  9. var addrParser = protocol.NewAddressParser(
  10. protocol.AddressFamilyByte(0x01, net.AddressFamilyIPv4),
  11. protocol.AddressFamilyByte(0x02, net.AddressFamilyIPv6),
  12. )
  13. // AttachAddressToPacket
  14. // relinquish ownership of data
  15. // gain ownership of the returning value
  16. func AttachAddressToPacket(data *buf.Buffer, address gonet.Addr) (*buf.Buffer, error) {
  17. packetBuf := buf.New()
  18. udpaddr := address.(*gonet.UDPAddr)
  19. port, err := net.PortFromInt(uint32(udpaddr.Port))
  20. if err != nil {
  21. return nil, err
  22. }
  23. err = addrParser.WriteAddressPort(packetBuf, net.IPAddress(udpaddr.IP), port)
  24. if err != nil {
  25. return nil, err
  26. }
  27. _, err = packetBuf.Write(data.Bytes())
  28. if err != nil {
  29. return nil, err
  30. }
  31. data.Release()
  32. return packetBuf, nil
  33. }
  34. // ExtractAddressFromPacket
  35. // relinquish ownership of data
  36. // gain ownership of the returning value
  37. func ExtractAddressFromPacket(data *buf.Buffer) (*buf.Buffer, gonet.Addr, error) {
  38. packetBuf := buf.StackNew()
  39. address, port, err := addrParser.ReadAddressPort(&packetBuf, bytes.NewReader(data.Bytes()))
  40. if err != nil {
  41. return nil, nil, err
  42. }
  43. var addr = &gonet.UDPAddr{
  44. IP: address.IP(),
  45. Port: int(port.Value()),
  46. Zone: "",
  47. }
  48. data.Advance(packetBuf.Len())
  49. packetBuf.Release()
  50. return data, addr, nil
  51. }