protocol.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. package hysteria2
  2. import (
  3. "io"
  4. gonet "net"
  5. hyProtocol "github.com/apernet/hysteria/core/v2/international/protocol"
  6. "github.com/apernet/quic-go/quicvarint"
  7. "github.com/v2fly/v2ray-core/v5/common/buf"
  8. "github.com/v2fly/v2ray-core/v5/common/net"
  9. hyTransport "github.com/v2fly/v2ray-core/v5/transport/internet/hysteria2"
  10. )
  11. // ConnWriter is TCP Connection Writer Wrapper
  12. type ConnWriter struct {
  13. io.Writer
  14. Target net.Destination
  15. Account *MemoryAccount
  16. TCPHeaderSent bool
  17. }
  18. // Write implements io.Writer
  19. func (c *ConnWriter) Write(p []byte) (n int, err error) {
  20. if !c.TCPHeaderSent {
  21. if err := c.writeTCPHeader(); err != nil {
  22. return 0, newError("failed to write request header").Base(err)
  23. }
  24. }
  25. return c.Writer.Write(p)
  26. }
  27. // WriteMultiBuffer implements buf.Writer
  28. func (c *ConnWriter) WriteMultiBuffer(mb buf.MultiBuffer) error {
  29. defer buf.ReleaseMulti(mb)
  30. for _, b := range mb {
  31. if !b.IsEmpty() {
  32. if _, err := c.Write(b.Bytes()); err != nil {
  33. return err
  34. }
  35. }
  36. }
  37. return nil
  38. }
  39. func (c *ConnWriter) WriteTCPHeader() error {
  40. if !c.TCPHeaderSent {
  41. if err := c.writeTCPHeader(); err != nil {
  42. return err
  43. }
  44. }
  45. return nil
  46. }
  47. func QuicLen(s int) int {
  48. return int(quicvarint.Len(uint64(s)))
  49. }
  50. func (c *ConnWriter) writeTCPHeader() error {
  51. c.TCPHeaderSent = true
  52. // TODO: the padding length here should be randomized
  53. padding := "Jimmy Was Here"
  54. paddingLen := len(padding)
  55. addressAndPort := c.Target.NetAddr()
  56. addressLen := len(addressAndPort)
  57. size := QuicLen(addressLen) + addressLen + QuicLen(paddingLen) + paddingLen
  58. if size > hyProtocol.MaxAddressLength+hyProtocol.MaxPaddingLength {
  59. return newError("invalid header length")
  60. }
  61. buf := make([]byte, size)
  62. i := hyProtocol.VarintPut(buf, uint64(addressLen))
  63. i += copy(buf[i:], addressAndPort)
  64. i += hyProtocol.VarintPut(buf[i:], uint64(paddingLen))
  65. copy(buf[i:], padding)
  66. _, err := c.Writer.Write(buf)
  67. return err
  68. }
  69. // PacketWriter UDP Connection Writer Wrapper
  70. type PacketWriter struct {
  71. io.Writer
  72. HyConn *hyTransport.HyConn
  73. Target net.Destination
  74. }
  75. // WriteMultiBuffer implements buf.Writer
  76. func (w *PacketWriter) WriteMultiBuffer(mb buf.MultiBuffer) error {
  77. for _, b := range mb {
  78. if b.IsEmpty() {
  79. continue
  80. }
  81. if _, err := w.writePacket(b.Bytes(), w.Target); err != nil {
  82. buf.ReleaseMulti(mb)
  83. return err
  84. }
  85. }
  86. return nil
  87. }
  88. // WriteMultiBufferWithMetadata writes udp packet with destination specified
  89. func (w *PacketWriter) WriteMultiBufferWithMetadata(mb buf.MultiBuffer, dest net.Destination) error {
  90. for _, b := range mb {
  91. if b.IsEmpty() {
  92. continue
  93. }
  94. if _, err := w.writePacket(b.Bytes(), dest); err != nil {
  95. buf.ReleaseMulti(mb)
  96. return err
  97. }
  98. }
  99. return nil
  100. }
  101. func (w *PacketWriter) WriteTo(payload []byte, addr gonet.Addr) (int, error) {
  102. dest := net.DestinationFromAddr(addr)
  103. return w.writePacket(payload, dest)
  104. }
  105. func (w *PacketWriter) writePacket(payload []byte, dest net.Destination) (int, error) {
  106. return w.HyConn.WritePacket(payload, dest)
  107. }
  108. // ConnReader is TCP Connection Reader Wrapper
  109. type ConnReader struct {
  110. io.Reader
  111. Target net.Destination
  112. }
  113. // Read implements io.Reader
  114. func (c *ConnReader) Read(p []byte) (int, error) {
  115. return c.Reader.Read(p)
  116. }
  117. // ReadMultiBuffer implements buf.Reader
  118. func (c *ConnReader) ReadMultiBuffer() (buf.MultiBuffer, error) {
  119. b := buf.New()
  120. _, err := b.ReadFrom(c)
  121. return buf.MultiBuffer{b}, err
  122. }
  123. // PacketPayload combines udp payload and destination
  124. type PacketPayload struct {
  125. Target net.Destination
  126. Buffer buf.MultiBuffer
  127. }
  128. // PacketReader is UDP Connection Reader Wrapper
  129. type PacketReader struct {
  130. io.Reader
  131. HyConn *hyTransport.HyConn
  132. }
  133. // ReadMultiBuffer implements buf.Reader
  134. func (r *PacketReader) ReadMultiBuffer() (buf.MultiBuffer, error) {
  135. p, err := r.ReadMultiBufferWithMetadata()
  136. if p != nil {
  137. return p.Buffer, err
  138. }
  139. return nil, err
  140. }
  141. // ReadMultiBufferWithMetadata reads udp packet with destination
  142. func (r *PacketReader) ReadMultiBufferWithMetadata() (*PacketPayload, error) {
  143. _, data, dest, err := r.HyConn.ReadPacket()
  144. if err != nil {
  145. return nil, err
  146. }
  147. b := buf.FromBytes(data)
  148. return &PacketPayload{Target: *dest, Buffer: buf.MultiBuffer{b}}, nil
  149. }
  150. type PacketConnectionReader struct {
  151. reader *PacketReader
  152. payload *PacketPayload
  153. }
  154. func (r *PacketConnectionReader) ReadFrom(p []byte) (n int, addr gonet.Addr, err error) {
  155. if r.payload == nil || r.payload.Buffer.IsEmpty() {
  156. r.payload, err = r.reader.ReadMultiBufferWithMetadata()
  157. if err != nil {
  158. return
  159. }
  160. }
  161. addr = &gonet.UDPAddr{
  162. IP: r.payload.Target.Address.IP(),
  163. Port: int(r.payload.Target.Port),
  164. }
  165. r.payload.Buffer, n = buf.SplitFirstBytes(r.payload.Buffer, p)
  166. return
  167. }