...
1
2
3
4
5
6
7 package quic
8
9 import "fmt"
10
11
12
13
14
15
16
17
18
19
20
21
22 func (c *Conn) handleAckOrLoss(space numberSpace, sent *sentPacket, fate packetFate) {
23 if fate == packetLost && c.logEnabled(QLogLevelPacket) {
24 c.logPacketLost(space, sent)
25 }
26
27
28
29
30
31
32
33 for !sent.done() {
34 switch f := sent.next(); f {
35 default:
36 panic(fmt.Sprintf("BUG: unhandled acked/lost frame type %x", f))
37 case frameTypeAck:
38
39
40
41
42
43
44 largest := packetNumber(sent.nextInt())
45 if fate == packetAcked {
46 c.acks[space].handleAck(largest)
47 }
48 case frameTypeCrypto:
49 start, end := sent.nextRange()
50 c.crypto[space].ackOrLoss(start, end, fate)
51 case frameTypeMaxData:
52 c.ackOrLossMaxData(sent.num, fate)
53 case frameTypeResetStream,
54 frameTypeStopSending,
55 frameTypeMaxStreamData,
56 frameTypeStreamDataBlocked:
57 id := streamID(sent.nextInt())
58 s := c.streamForID(id)
59 if s == nil {
60 continue
61 }
62 s.ackOrLoss(sent.num, f, fate)
63 case frameTypeStreamBase,
64 frameTypeStreamBase | streamFinBit:
65 id := streamID(sent.nextInt())
66 start, end := sent.nextRange()
67 s := c.streamForID(id)
68 if s == nil {
69 continue
70 }
71 fin := f&streamFinBit != 0
72 s.ackOrLossData(sent.num, start, end, fin, fate)
73 case frameTypeMaxStreamsBidi:
74 c.streams.remoteLimit[bidiStream].sendMax.ackLatestOrLoss(sent.num, fate)
75 case frameTypeMaxStreamsUni:
76 c.streams.remoteLimit[uniStream].sendMax.ackLatestOrLoss(sent.num, fate)
77 case frameTypeNewConnectionID:
78 seq := int64(sent.nextInt())
79 c.connIDState.ackOrLossNewConnectionID(sent.num, seq, fate)
80 case frameTypeRetireConnectionID:
81 seq := int64(sent.nextInt())
82 c.connIDState.ackOrLossRetireConnectionID(sent.num, seq, fate)
83 case frameTypeHandshakeDone:
84 c.handshakeConfirmed.ackOrLoss(sent.num, fate)
85 }
86 }
87 }
88
View as plain text