1
2
3
4
5 package quic
6
7
8
9
10
11
12
13 type sentPacketList struct {
14 nextNum packetNumber
15 off int
16 size int
17 p []*sentPacket
18 }
19
20
21 func (s *sentPacketList) start() packetNumber {
22 return s.nextNum - packetNumber(s.size)
23 }
24
25
26
27 func (s *sentPacketList) end() packetNumber {
28 return s.nextNum
29 }
30
31
32 func (s *sentPacketList) discard() {
33 *s = sentPacketList{}
34 }
35
36
37 func (s *sentPacketList) add(sent *sentPacket) {
38 if s.nextNum != sent.num {
39 panic("inserting out-of-order packet")
40 }
41 s.nextNum++
42 if s.size >= len(s.p) {
43 s.grow()
44 }
45 i := (s.off + s.size) % len(s.p)
46 s.size++
47 s.p[i] = sent
48 }
49
50
51 func (s *sentPacketList) nth(n int) *sentPacket {
52 index := (s.off + n) % len(s.p)
53 return s.p[index]
54 }
55
56
57
58 func (s *sentPacketList) num(num packetNumber) *sentPacket {
59 i := int(num - s.start())
60 if i < 0 || i >= s.size {
61 return nil
62 }
63 return s.nth(i)
64 }
65
66
67 func (s *sentPacketList) clean() {
68 for s.size > 0 {
69 sent := s.p[s.off]
70 if sent.state == sentPacketSent {
71 return
72 }
73 sent.recycle()
74 s.p[s.off] = nil
75 s.off = (s.off + 1) % len(s.p)
76 s.size--
77 }
78 s.off = 0
79 }
80
81
82 func (s *sentPacketList) grow() {
83 newSize := len(s.p) * 2
84 if newSize == 0 {
85 newSize = 64
86 }
87 p := make([]*sentPacket, newSize)
88 for i := 0; i < s.size; i++ {
89 p[i] = s.nth(i)
90 }
91 s.p = p
92 s.off = 0
93 }
94
View as plain text