retransmission_queue.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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. version protocol.VersionNumber
  14. }
  15. func newRetransmissionQueue(ver protocol.VersionNumber) *retransmissionQueue {
  16. return &retransmissionQueue{version: ver}
  17. }
  18. func (q *retransmissionQueue) AddInitial(f wire.Frame) {
  19. if cf, ok := f.(*wire.CryptoFrame); ok {
  20. q.initialCryptoData = append(q.initialCryptoData, cf)
  21. return
  22. }
  23. q.initial = append(q.initial, f)
  24. }
  25. func (q *retransmissionQueue) AddHandshake(f wire.Frame) {
  26. if cf, ok := f.(*wire.CryptoFrame); ok {
  27. q.handshakeCryptoData = append(q.handshakeCryptoData, cf)
  28. return
  29. }
  30. q.handshake = append(q.handshake, f)
  31. }
  32. func (q *retransmissionQueue) HasInitialData() bool {
  33. return len(q.initialCryptoData) > 0 || len(q.initial) > 0
  34. }
  35. func (q *retransmissionQueue) HasHandshakeData() bool {
  36. return len(q.handshakeCryptoData) > 0 || len(q.handshake) > 0
  37. }
  38. func (q *retransmissionQueue) AddAppData(f wire.Frame) {
  39. if _, ok := f.(*wire.StreamFrame); ok {
  40. panic("STREAM frames are handled with their respective streams.")
  41. }
  42. q.appData = append(q.appData, f)
  43. }
  44. func (q *retransmissionQueue) GetInitialFrame(maxLen protocol.ByteCount) wire.Frame {
  45. if len(q.initialCryptoData) > 0 {
  46. if f := q.initialCryptoData[0]; f.Length(q.version) <= maxLen {
  47. q.initialCryptoData = q.initialCryptoData[1:]
  48. return f
  49. }
  50. }
  51. if len(q.initial) == 0 {
  52. return nil
  53. }
  54. f := q.initial[0]
  55. if f.Length(q.version) > maxLen {
  56. return nil
  57. }
  58. q.initial = q.initial[1:]
  59. return f
  60. }
  61. func (q *retransmissionQueue) GetHandshakeFrame(maxLen protocol.ByteCount) wire.Frame {
  62. if len(q.handshakeCryptoData) > 0 {
  63. if f := q.handshakeCryptoData[0]; f.Length(q.version) <= maxLen {
  64. q.handshakeCryptoData = q.handshakeCryptoData[1:]
  65. return f
  66. }
  67. }
  68. if len(q.handshake) == 0 {
  69. return nil
  70. }
  71. f := q.handshake[0]
  72. if f.Length(q.version) > maxLen {
  73. return nil
  74. }
  75. q.handshake = q.handshake[1:]
  76. return f
  77. }
  78. func (q *retransmissionQueue) GetAppDataFrame(maxLen protocol.ByteCount) wire.Frame {
  79. if len(q.appData) == 0 {
  80. return nil
  81. }
  82. f := q.appData[0]
  83. if f.Length(q.version) > maxLen {
  84. return nil
  85. }
  86. q.appData = q.appData[1:]
  87. return f
  88. }
  89. func (q *retransmissionQueue) DropPackets(encLevel protocol.EncryptionLevel) {
  90. switch encLevel {
  91. case protocol.EncryptionInitial:
  92. q.initial = nil
  93. q.initialCryptoData = nil
  94. case protocol.EncryptionHandshake:
  95. q.handshake = nil
  96. q.handshakeCryptoData = nil
  97. default:
  98. panic(fmt.Sprintf("unexpected encryption level: %s", encLevel))
  99. }
  100. }