packetaddr.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  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. func AttachAddressToPacket(data []byte, address gonet.Addr) []byte {
  14. packetBuf := buf.StackNew()
  15. udpaddr := address.(*gonet.UDPAddr)
  16. port, err := net.PortFromInt(uint32(udpaddr.Port))
  17. if err != nil {
  18. panic(err)
  19. }
  20. err = addrParser.WriteAddressPort(&packetBuf, net.IPAddress(udpaddr.IP), port)
  21. if err != nil {
  22. panic(err)
  23. }
  24. //Incorrect buffer reuse
  25. data = append(packetBuf.Bytes(), data...)
  26. //packetBuf.Release()
  27. return data
  28. }
  29. func ExtractAddressFromPacket(data []byte) ([]byte, gonet.Addr) {
  30. packetBuf := buf.StackNew()
  31. address, port, err := addrParser.ReadAddressPort(&packetBuf, bytes.NewReader(data))
  32. if err != nil {
  33. panic(err)
  34. }
  35. var addr = &gonet.UDPAddr{
  36. IP: address.IP(),
  37. Port: int(port.Value()),
  38. Zone: "",
  39. }
  40. payload := data[int(packetBuf.Len()):]
  41. packetBuf.Release()
  42. return payload, addr
  43. }