xudp.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package xudp
  2. import (
  3. "io"
  4. "github.com/xtls/xray-core/common/buf"
  5. "github.com/xtls/xray-core/common/net"
  6. "github.com/xtls/xray-core/common/protocol"
  7. )
  8. var addrParser = protocol.NewAddressParser(
  9. protocol.AddressFamilyByte(byte(protocol.AddressTypeIPv4), net.AddressFamilyIPv4),
  10. protocol.AddressFamilyByte(byte(protocol.AddressTypeDomain), net.AddressFamilyDomain),
  11. protocol.AddressFamilyByte(byte(protocol.AddressTypeIPv6), net.AddressFamilyIPv6),
  12. protocol.PortThenAddress(),
  13. )
  14. func NewPacketWriter(writer buf.Writer, dest net.Destination) *PacketWriter {
  15. return &PacketWriter{
  16. Writer: writer,
  17. Dest: dest,
  18. }
  19. }
  20. type PacketWriter struct {
  21. Writer buf.Writer
  22. Dest net.Destination
  23. }
  24. func (w *PacketWriter) WriteMultiBuffer(mb buf.MultiBuffer) error {
  25. defer buf.ReleaseMulti(mb)
  26. mb2Write := make(buf.MultiBuffer, 0, len(mb))
  27. for _, b := range mb {
  28. length := b.Len()
  29. if length == 0 || length+666 > buf.Size {
  30. continue
  31. }
  32. eb := buf.New()
  33. eb.Write([]byte{0, 0, 0, 0})
  34. if w.Dest.Network == net.Network_UDP {
  35. eb.WriteByte(1) // New
  36. eb.WriteByte(1) // Opt
  37. eb.WriteByte(2) // UDP
  38. addrParser.WriteAddressPort(eb, w.Dest.Address, w.Dest.Port)
  39. w.Dest.Network = net.Network_Unknown
  40. } else {
  41. eb.WriteByte(2) // Keep
  42. eb.WriteByte(1)
  43. if b.UDP != nil {
  44. eb.WriteByte(2)
  45. addrParser.WriteAddressPort(eb, b.UDP.Address, b.UDP.Port)
  46. }
  47. }
  48. l := eb.Len() - 2
  49. eb.SetByte(0, byte(l>>8))
  50. eb.SetByte(1, byte(l))
  51. eb.WriteByte(byte(length >> 8))
  52. eb.WriteByte(byte(length))
  53. eb.Write(b.Bytes())
  54. mb2Write = append(mb2Write, eb)
  55. }
  56. if mb2Write.IsEmpty() {
  57. return nil
  58. }
  59. return w.Writer.WriteMultiBuffer(mb2Write)
  60. }
  61. func NewPacketReader(reader io.Reader) *PacketReader {
  62. return &PacketReader{
  63. Reader: reader,
  64. cache: make([]byte, 2),
  65. }
  66. }
  67. type PacketReader struct {
  68. Reader io.Reader
  69. cache []byte
  70. }
  71. func (r *PacketReader) ReadMultiBuffer() (buf.MultiBuffer, error) {
  72. for {
  73. if _, err := io.ReadFull(r.Reader, r.cache); err != nil {
  74. return nil, err
  75. }
  76. l := int32(r.cache[0])<<8 | int32(r.cache[1])
  77. if l < 4 {
  78. return nil, io.EOF
  79. }
  80. b := buf.New()
  81. if _, err := b.ReadFullFrom(r.Reader, l); err != nil {
  82. b.Release()
  83. return nil, err
  84. }
  85. discard := false
  86. switch b.Byte(2) {
  87. case 2:
  88. if l != 4 {
  89. b.Advance(5)
  90. addr, port, err := addrParser.ReadAddressPort(nil, b)
  91. if err != nil {
  92. b.Release()
  93. return nil, err
  94. }
  95. b.UDP = &net.Destination{
  96. Network: net.Network_UDP,
  97. Address: addr,
  98. Port: port,
  99. }
  100. }
  101. case 4:
  102. discard = true
  103. default:
  104. b.Release()
  105. return nil, io.EOF
  106. }
  107. if b.Byte(3) == 1 {
  108. if _, err := io.ReadFull(r.Reader, r.cache); err != nil {
  109. b.Release()
  110. return nil, err
  111. }
  112. length := int32(r.cache[0])<<8 | int32(r.cache[1])
  113. if length > 0 {
  114. b.Clear()
  115. if _, err := b.ReadFullFrom(r.Reader, length); err != nil {
  116. b.Release()
  117. return nil, err
  118. }
  119. if !discard {
  120. return buf.MultiBuffer{b}, nil
  121. }
  122. }
  123. }
  124. b.Release()
  125. }
  126. }