frame_parser.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. package wire
  2. import (
  3. "bytes"
  4. "errors"
  5. "fmt"
  6. "github.com/lucas-clemente/quic-go/internal/protocol"
  7. "github.com/lucas-clemente/quic-go/qerr"
  8. )
  9. // ParseNextFrame parses the next frame
  10. // It skips PADDING frames.
  11. func ParseNextFrame(r *bytes.Reader, hdr *Header, v protocol.VersionNumber) (Frame, error) {
  12. for r.Len() != 0 {
  13. typeByte, _ := r.ReadByte()
  14. if typeByte == 0x0 { // PADDING frame
  15. continue
  16. }
  17. r.UnreadByte()
  18. if !v.UsesIETFFrameFormat() {
  19. return parseGQUICFrame(r, typeByte, hdr, v)
  20. }
  21. return parseIETFFrame(r, typeByte, v)
  22. }
  23. return nil, nil
  24. }
  25. func parseIETFFrame(r *bytes.Reader, typeByte byte, v protocol.VersionNumber) (Frame, error) {
  26. var frame Frame
  27. var err error
  28. if typeByte&0xf8 == 0x10 {
  29. frame, err = parseStreamFrame(r, v)
  30. if err != nil {
  31. err = qerr.Error(qerr.InvalidStreamData, err.Error())
  32. }
  33. return frame, err
  34. }
  35. // TODO: implement all IETF QUIC frame types
  36. switch typeByte {
  37. case 0x1:
  38. frame, err = parseRstStreamFrame(r, v)
  39. if err != nil {
  40. err = qerr.Error(qerr.InvalidRstStreamData, err.Error())
  41. }
  42. case 0x2:
  43. frame, err = parseConnectionCloseFrame(r, v)
  44. if err != nil {
  45. err = qerr.Error(qerr.InvalidConnectionCloseData, err.Error())
  46. }
  47. case 0x4:
  48. frame, err = parseMaxDataFrame(r, v)
  49. if err != nil {
  50. err = qerr.Error(qerr.InvalidWindowUpdateData, err.Error())
  51. }
  52. case 0x5:
  53. frame, err = parseMaxStreamDataFrame(r, v)
  54. if err != nil {
  55. err = qerr.Error(qerr.InvalidWindowUpdateData, err.Error())
  56. }
  57. case 0x6:
  58. frame, err = parseMaxStreamIDFrame(r, v)
  59. if err != nil {
  60. err = qerr.Error(qerr.InvalidFrameData, err.Error())
  61. }
  62. case 0x7:
  63. frame, err = parsePingFrame(r, v)
  64. case 0x8:
  65. frame, err = parseBlockedFrame(r, v)
  66. if err != nil {
  67. err = qerr.Error(qerr.InvalidBlockedData, err.Error())
  68. }
  69. case 0x9:
  70. frame, err = parseStreamBlockedFrame(r, v)
  71. if err != nil {
  72. err = qerr.Error(qerr.InvalidBlockedData, err.Error())
  73. }
  74. case 0xa:
  75. frame, err = parseStreamIDBlockedFrame(r, v)
  76. if err != nil {
  77. err = qerr.Error(qerr.InvalidFrameData, err.Error())
  78. }
  79. case 0xc:
  80. frame, err = parseStopSendingFrame(r, v)
  81. if err != nil {
  82. err = qerr.Error(qerr.InvalidFrameData, err.Error())
  83. }
  84. case 0xd:
  85. frame, err = parseAckFrame(r, v)
  86. if err != nil {
  87. err = qerr.Error(qerr.InvalidAckData, err.Error())
  88. }
  89. case 0xe:
  90. frame, err = parsePathChallengeFrame(r, v)
  91. if err != nil {
  92. err = qerr.Error(qerr.InvalidFrameData, err.Error())
  93. }
  94. case 0xf:
  95. frame, err = parsePathResponseFrame(r, v)
  96. if err != nil {
  97. err = qerr.Error(qerr.InvalidFrameData, err.Error())
  98. }
  99. case 0x1a:
  100. frame, err = parseAckEcnFrame(r, v)
  101. if err != nil {
  102. err = qerr.Error(qerr.InvalidAckData, err.Error())
  103. }
  104. default:
  105. err = qerr.Error(qerr.InvalidFrameData, fmt.Sprintf("unknown type byte 0x%x", typeByte))
  106. }
  107. return frame, err
  108. }
  109. func parseGQUICFrame(r *bytes.Reader, typeByte byte, hdr *Header, v protocol.VersionNumber) (Frame, error) {
  110. var frame Frame
  111. var err error
  112. if typeByte&0x80 == 0x80 {
  113. frame, err = parseStreamFrame(r, v)
  114. if err != nil {
  115. err = qerr.Error(qerr.InvalidStreamData, err.Error())
  116. }
  117. return frame, err
  118. } else if typeByte&0xc0 == 0x40 {
  119. frame, err = parseAckFrame(r, v)
  120. if err != nil {
  121. err = qerr.Error(qerr.InvalidAckData, err.Error())
  122. }
  123. return frame, err
  124. }
  125. switch typeByte {
  126. case 0x1:
  127. frame, err = parseRstStreamFrame(r, v)
  128. if err != nil {
  129. err = qerr.Error(qerr.InvalidRstStreamData, err.Error())
  130. }
  131. case 0x2:
  132. frame, err = parseConnectionCloseFrame(r, v)
  133. if err != nil {
  134. err = qerr.Error(qerr.InvalidConnectionCloseData, err.Error())
  135. }
  136. case 0x3:
  137. frame, err = parseGoawayFrame(r, v)
  138. if err != nil {
  139. err = qerr.Error(qerr.InvalidGoawayData, err.Error())
  140. }
  141. case 0x4:
  142. frame, err = parseWindowUpdateFrame(r, v)
  143. if err != nil {
  144. err = qerr.Error(qerr.InvalidWindowUpdateData, err.Error())
  145. }
  146. case 0x5:
  147. frame, err = parseBlockedFrameLegacy(r, v)
  148. if err != nil {
  149. err = qerr.Error(qerr.InvalidBlockedData, err.Error())
  150. }
  151. case 0x6:
  152. if !v.UsesStopWaitingFrames() {
  153. err = errors.New("STOP_WAITING frames not supported by this QUIC version")
  154. break
  155. }
  156. frame, err = parseStopWaitingFrame(r, hdr.PacketNumber, hdr.PacketNumberLen, v)
  157. if err != nil {
  158. err = qerr.Error(qerr.InvalidStopWaitingData, err.Error())
  159. }
  160. case 0x7:
  161. frame, err = parsePingFrame(r, v)
  162. default:
  163. err = qerr.Error(qerr.InvalidFrameData, fmt.Sprintf("unknown type byte 0x%x", typeByte))
  164. }
  165. return frame, err
  166. }