retransmission_queue.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. package quic
  2. import (
  3. "fmt"
  4. "github.com/Psiphon-Labs/quic-go/internal/protocol"
  5. "github.com/Psiphon-Labs/quic-go/internal/wire"
  6. )
  7. type retransmissionQueue struct {
  8. initial []wire.Frame
  9. initialCryptoData []*wire.CryptoFrame
  10. handshake []wire.Frame
  11. handshakeCryptoData []*wire.CryptoFrame
  12. appData []wire.Frame
  13. }
  14. func newRetransmissionQueue() *retransmissionQueue {
  15. return &retransmissionQueue{}
  16. }
  17. func (q *retransmissionQueue) AddInitial(f wire.Frame) {
  18. if cf, ok := f.(*wire.CryptoFrame); ok {
  19. q.initialCryptoData = append(q.initialCryptoData, cf)
  20. return
  21. }
  22. q.initial = append(q.initial, f)
  23. }
  24. func (q *retransmissionQueue) AddHandshake(f wire.Frame) {
  25. if cf, ok := f.(*wire.CryptoFrame); ok {
  26. q.handshakeCryptoData = append(q.handshakeCryptoData, cf)
  27. return
  28. }
  29. q.handshake = append(q.handshake, f)
  30. }
  31. func (q *retransmissionQueue) HasInitialData() bool {
  32. return len(q.initialCryptoData) > 0 || len(q.initial) > 0
  33. }
  34. func (q *retransmissionQueue) HasHandshakeData() bool {
  35. return len(q.handshakeCryptoData) > 0 || len(q.handshake) > 0
  36. }
  37. func (q *retransmissionQueue) HasAppData() bool {
  38. return len(q.appData) > 0
  39. }
  40. func (q *retransmissionQueue) AddAppData(f wire.Frame) {
  41. if _, ok := f.(*wire.StreamFrame); ok {
  42. panic("STREAM frames are handled with their respective streams.")
  43. }
  44. q.appData = append(q.appData, f)
  45. }
  46. func (q *retransmissionQueue) GetInitialFrame(maxLen protocol.ByteCount, v protocol.VersionNumber) wire.Frame {
  47. if len(q.initialCryptoData) > 0 {
  48. f := q.initialCryptoData[0]
  49. newFrame, needsSplit := f.MaybeSplitOffFrame(maxLen, v)
  50. if newFrame == nil && !needsSplit { // the whole frame fits
  51. q.initialCryptoData = q.initialCryptoData[1:]
  52. return f
  53. }
  54. if newFrame != nil { // frame was split. Leave the original frame in the queue.
  55. return newFrame
  56. }
  57. }
  58. if len(q.initial) == 0 {
  59. return nil
  60. }
  61. f := q.initial[0]
  62. if f.Length(v) > maxLen {
  63. return nil
  64. }
  65. q.initial = q.initial[1:]
  66. return f
  67. }
  68. func (q *retransmissionQueue) GetHandshakeFrame(maxLen protocol.ByteCount, v protocol.VersionNumber) wire.Frame {
  69. if len(q.handshakeCryptoData) > 0 {
  70. f := q.handshakeCryptoData[0]
  71. newFrame, needsSplit := f.MaybeSplitOffFrame(maxLen, v)
  72. if newFrame == nil && !needsSplit { // the whole frame fits
  73. q.handshakeCryptoData = q.handshakeCryptoData[1:]
  74. return f
  75. }
  76. if newFrame != nil { // frame was split. Leave the original frame in the queue.
  77. return newFrame
  78. }
  79. }
  80. if len(q.handshake) == 0 {
  81. return nil
  82. }
  83. f := q.handshake[0]
  84. if f.Length(v) > maxLen {
  85. return nil
  86. }
  87. q.handshake = q.handshake[1:]
  88. return f
  89. }
  90. func (q *retransmissionQueue) GetAppDataFrame(maxLen protocol.ByteCount, v protocol.VersionNumber) wire.Frame {
  91. if len(q.appData) == 0 {
  92. return nil
  93. }
  94. f := q.appData[0]
  95. if f.Length(v) > maxLen {
  96. return nil
  97. }
  98. q.appData = q.appData[1:]
  99. return f
  100. }
  101. func (q *retransmissionQueue) DropPackets(encLevel protocol.EncryptionLevel) {
  102. //nolint:exhaustive // Can only drop Initial and Handshake packet number space.
  103. switch encLevel {
  104. case protocol.EncryptionInitial:
  105. q.initial = nil
  106. q.initialCryptoData = nil
  107. case protocol.EncryptionHandshake:
  108. q.handshake = nil
  109. q.handshakeCryptoData = nil
  110. default:
  111. panic(fmt.Sprintf("unexpected encryption level: %s", encLevel))
  112. }
  113. }