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