1
2
3
4
5 package quic
6
7 import (
8 "bytes"
9 "encoding/binary"
10 "errors"
11 "time"
12 )
13
14 func (c *Conn) handleDatagram(now time.Time, dgram *datagram) (handled bool) {
15 if !c.localAddr.IsValid() {
16
17
18
19 c.localAddr = dgram.localAddr
20 }
21 if dgram.peerAddr.IsValid() && dgram.peerAddr != c.peerAddr {
22 if c.side == clientSide {
23
24
25
26 return false
27 }
28
29
30 return false
31 }
32 buf := dgram.b
33 c.loss.datagramReceived(now, len(buf))
34 if c.isDraining() {
35 return false
36 }
37 for len(buf) > 0 {
38 var n int
39 ptype := getPacketType(buf)
40 switch ptype {
41 case packetTypeInitial:
42 if c.side == serverSide && len(dgram.b) < paddedInitialDatagramSize {
43
44
45 return false
46 }
47 n = c.handleLongHeader(now, dgram, ptype, initialSpace, c.keysInitial.r, buf)
48 case packetTypeHandshake:
49 n = c.handleLongHeader(now, dgram, ptype, handshakeSpace, c.keysHandshake.r, buf)
50 case packetType1RTT:
51 n = c.handle1RTT(now, dgram, buf)
52 case packetTypeRetry:
53 c.handleRetry(now, buf)
54 return true
55 case packetTypeVersionNegotiation:
56 c.handleVersionNegotiation(now, buf)
57 return true
58 default:
59 n = -1
60 }
61 if n <= 0 {
62
63
64
65
66
67
68
69
70
71 if len(buf) == len(dgram.b) && len(buf) > statelessResetTokenLen {
72 var token statelessResetToken
73 copy(token[:], buf[len(buf)-len(token):])
74 if c.handleStatelessReset(now, token) {
75 return true
76 }
77 }
78
79 return false
80 }
81 c.idleHandlePacketReceived(now)
82 buf = buf[n:]
83 }
84 return true
85 }
86
87 func (c *Conn) handleLongHeader(now time.Time, dgram *datagram, ptype packetType, space numberSpace, k fixedKeys, buf []byte) int {
88 if !k.isSet() {
89 return skipLongHeaderPacket(buf)
90 }
91
92 pnumMax := c.acks[space].largestSeen()
93 p, n := parseLongHeaderPacket(buf, k, pnumMax)
94 if n < 0 {
95 return -1
96 }
97 if buf[0]&reservedLongBits != 0 {
98
99
100 c.abort(now, localTransportError{
101 code: errProtocolViolation,
102 reason: "reserved header bits are not zero",
103 })
104 return -1
105 }
106 if p.version != quicVersion1 {
107
108 c.abort(now, localTransportError{
109 code: errProtocolViolation,
110 reason: "protocol version changed during handshake",
111 })
112 return -1
113 }
114
115 if !c.acks[space].shouldProcess(p.num) {
116 return n
117 }
118
119 if logPackets {
120 logInboundLongPacket(c, p)
121 }
122 if c.logEnabled(QLogLevelPacket) {
123 c.logLongPacketReceived(p, buf[:n])
124 }
125 c.connIDState.handlePacket(c, p.ptype, p.srcConnID)
126 ackEliciting := c.handleFrames(now, dgram, ptype, space, p.payload)
127 c.acks[space].receive(now, space, p.num, ackEliciting, dgram.ecn)
128 if p.ptype == packetTypeHandshake && c.side == serverSide {
129 c.loss.validateClientAddress()
130
131
132
133
134 c.discardKeys(now, initialSpace)
135 }
136 return n
137 }
138
139 func (c *Conn) handle1RTT(now time.Time, dgram *datagram, buf []byte) int {
140 if !c.keysAppData.canRead() {
141
142
143 return len(buf)
144 }
145
146 pnumMax := c.acks[appDataSpace].largestSeen()
147 p, err := parse1RTTPacket(buf, &c.keysAppData, connIDLen, pnumMax)
148 if err != nil {
149
150
151 if _, ok := err.(localTransportError); ok {
152 c.abort(now, err)
153 }
154 return -1
155 }
156 if buf[0]&reserved1RTTBits != 0 {
157
158
159 c.abort(now, localTransportError{
160 code: errProtocolViolation,
161 reason: "reserved header bits are not zero",
162 })
163 return -1
164 }
165
166 if !c.acks[appDataSpace].shouldProcess(p.num) {
167 return len(buf)
168 }
169
170 if logPackets {
171 logInboundShortPacket(c, p)
172 }
173 if c.logEnabled(QLogLevelPacket) {
174 c.log1RTTPacketReceived(p, buf)
175 }
176 ackEliciting := c.handleFrames(now, dgram, packetType1RTT, appDataSpace, p.payload)
177 c.acks[appDataSpace].receive(now, appDataSpace, p.num, ackEliciting, dgram.ecn)
178 return len(buf)
179 }
180
181 func (c *Conn) handleRetry(now time.Time, pkt []byte) {
182 if c.side != clientSide {
183 return
184 }
185
186
187
188 if !c.keysInitial.canRead() {
189 return
190 }
191 if c.acks[initialSpace].seen.numRanges() != 0 {
192 return
193 }
194 if c.retryToken != nil {
195 return
196 }
197
198
199
200 p, ok := parseRetryPacket(pkt, c.connIDState.originalDstConnID)
201 if !ok {
202 return
203 }
204
205
206 if len(p.token) == 0 {
207 return
208 }
209 c.retryToken = cloneBytes(p.token)
210 c.connIDState.handleRetryPacket(p.srcConnID)
211 c.keysInitial = initialKeys(p.srcConnID, c.side)
212
213
214 c.loss.discardPackets(initialSpace, c.log, c.handleAckOrLoss)
215
216 if c.testHooks != nil {
217 c.testHooks.init(false)
218 }
219 }
220
221 var errVersionNegotiation = errors.New("server does not support QUIC version 1")
222
223 func (c *Conn) handleVersionNegotiation(now time.Time, pkt []byte) {
224 if c.side != clientSide {
225 return
226 }
227
228
229
230 if !c.keysInitial.canRead() {
231 return
232 }
233 if c.acks[initialSpace].seen.numRanges() != 0 {
234 return
235 }
236 _, srcConnID, versions := parseVersionNegotiation(pkt)
237 if len(c.connIDState.remote) < 1 || !bytes.Equal(c.connIDState.remote[0].cid, srcConnID) {
238 return
239 }
240 for len(versions) >= 4 {
241 ver := binary.BigEndian.Uint32(versions)
242 if ver == 1 {
243
244
245
246 return
247 }
248 versions = versions[4:]
249 }
250
251
252
253
254 c.abortImmediately(now, errVersionNegotiation)
255 }
256
257 func (c *Conn) handleFrames(now time.Time, dgram *datagram, ptype packetType, space numberSpace, payload []byte) (ackEliciting bool) {
258 if len(payload) == 0 {
259
260
261
262 c.abort(now, localTransportError{
263 code: errProtocolViolation,
264 reason: "packet contains no frames",
265 })
266 return false
267 }
268
269 frameOK := func(c *Conn, ptype, mask packetType) (ok bool) {
270 if ptype&mask == 0 {
271
272
273
274
275 c.abort(now, localTransportError{
276 code: errProtocolViolation,
277 reason: "frame not allowed in packet",
278 })
279 return false
280 }
281 return true
282 }
283
284
285 const (
286 IH_1 = packetTypeInitial | packetTypeHandshake | packetType1RTT
287 __01 = packetType0RTT | packetType1RTT
288 ___1 = packetType1RTT
289 )
290 hasCrypto := false
291 for len(payload) > 0 {
292 switch payload[0] {
293 case frameTypePadding, frameTypeAck, frameTypeAckECN,
294 frameTypeConnectionCloseTransport, frameTypeConnectionCloseApplication:
295 default:
296 ackEliciting = true
297 }
298 n := -1
299 switch payload[0] {
300 case frameTypePadding:
301
302 n = 1
303 case frameTypePing:
304
305
306
307
308 n = 1
309 case frameTypeAck, frameTypeAckECN:
310 if !frameOK(c, ptype, IH_1) {
311 return
312 }
313 n = c.handleAckFrame(now, space, payload)
314 case frameTypeResetStream:
315 if !frameOK(c, ptype, __01) {
316 return
317 }
318 n = c.handleResetStreamFrame(now, space, payload)
319 case frameTypeStopSending:
320 if !frameOK(c, ptype, __01) {
321 return
322 }
323 n = c.handleStopSendingFrame(now, space, payload)
324 case frameTypeCrypto:
325 if !frameOK(c, ptype, IH_1) {
326 return
327 }
328 hasCrypto = true
329 n = c.handleCryptoFrame(now, space, payload)
330 case frameTypeNewToken:
331 if !frameOK(c, ptype, ___1) {
332 return
333 }
334 _, n = consumeNewTokenFrame(payload)
335 case 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f:
336 if !frameOK(c, ptype, __01) {
337 return
338 }
339 n = c.handleStreamFrame(now, space, payload)
340 case frameTypeMaxData:
341 if !frameOK(c, ptype, __01) {
342 return
343 }
344 n = c.handleMaxDataFrame(now, payload)
345 case frameTypeMaxStreamData:
346 if !frameOK(c, ptype, __01) {
347 return
348 }
349 n = c.handleMaxStreamDataFrame(now, payload)
350 case frameTypeMaxStreamsBidi, frameTypeMaxStreamsUni:
351 if !frameOK(c, ptype, __01) {
352 return
353 }
354 n = c.handleMaxStreamsFrame(now, payload)
355 case frameTypeDataBlocked:
356 if !frameOK(c, ptype, __01) {
357 return
358 }
359 _, n = consumeDataBlockedFrame(payload)
360 case frameTypeStreamsBlockedBidi, frameTypeStreamsBlockedUni:
361 if !frameOK(c, ptype, __01) {
362 return
363 }
364 _, _, n = consumeStreamsBlockedFrame(payload)
365 case frameTypeStreamDataBlocked:
366 if !frameOK(c, ptype, __01) {
367 return
368 }
369 _, _, n = consumeStreamDataBlockedFrame(payload)
370 case frameTypeNewConnectionID:
371 if !frameOK(c, ptype, __01) {
372 return
373 }
374 n = c.handleNewConnectionIDFrame(now, space, payload)
375 case frameTypeRetireConnectionID:
376 if !frameOK(c, ptype, __01) {
377 return
378 }
379 n = c.handleRetireConnectionIDFrame(now, space, payload)
380 case frameTypePathChallenge:
381 if !frameOK(c, ptype, __01) {
382 return
383 }
384 n = c.handlePathChallengeFrame(now, dgram, space, payload)
385 case frameTypePathResponse:
386 if !frameOK(c, ptype, ___1) {
387 return
388 }
389 n = c.handlePathResponseFrame(now, space, payload)
390 case frameTypeConnectionCloseTransport:
391
392 n = c.handleConnectionCloseTransportFrame(now, payload)
393 case frameTypeConnectionCloseApplication:
394 if !frameOK(c, ptype, __01) {
395 return
396 }
397 n = c.handleConnectionCloseApplicationFrame(now, payload)
398 case frameTypeHandshakeDone:
399 if !frameOK(c, ptype, ___1) {
400 return
401 }
402 n = c.handleHandshakeDoneFrame(now, space, payload)
403 }
404 if n < 0 {
405 c.abort(now, localTransportError{
406 code: errFrameEncoding,
407 reason: "frame encoding error",
408 })
409 return false
410 }
411 payload = payload[n:]
412 }
413 if hasCrypto {
414
415
416
417
418 if err := c.handleTLSEvents(now); err != nil {
419 c.abort(now, err)
420 }
421 }
422 return ackEliciting
423 }
424
425 func (c *Conn) handleAckFrame(now time.Time, space numberSpace, payload []byte) int {
426 c.loss.receiveAckStart()
427 largest, ackDelay, ecn, n := consumeAckFrame(payload, func(rangeIndex int, start, end packetNumber) {
428 if err := c.loss.receiveAckRange(now, space, rangeIndex, start, end, c.handleAckOrLoss); err != nil {
429 c.abort(now, err)
430 return
431 }
432 })
433
434
435 _ = ecn
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456 var delay time.Duration
457 if c.peerAckDelayExponent >= 0 {
458 delay = ackDelay.Duration(uint8(c.peerAckDelayExponent))
459 }
460 c.loss.receiveAckEnd(now, c.log, space, delay, c.handleAckOrLoss)
461 if space == appDataSpace {
462 c.keysAppData.handleAckFor(largest)
463 }
464 return n
465 }
466
467 func (c *Conn) handleMaxDataFrame(now time.Time, payload []byte) int {
468 maxData, n := consumeMaxDataFrame(payload)
469 if n < 0 {
470 return -1
471 }
472 c.streams.outflow.setMaxData(maxData)
473 return n
474 }
475
476 func (c *Conn) handleMaxStreamDataFrame(now time.Time, payload []byte) int {
477 id, maxStreamData, n := consumeMaxStreamDataFrame(payload)
478 if n < 0 {
479 return -1
480 }
481 if s := c.streamForFrame(now, id, sendStream); s != nil {
482 if err := s.handleMaxStreamData(maxStreamData); err != nil {
483 c.abort(now, err)
484 return -1
485 }
486 }
487 return n
488 }
489
490 func (c *Conn) handleMaxStreamsFrame(now time.Time, payload []byte) int {
491 styp, max, n := consumeMaxStreamsFrame(payload)
492 if n < 0 {
493 return -1
494 }
495 c.streams.localLimit[styp].setMax(max)
496 return n
497 }
498
499 func (c *Conn) handleResetStreamFrame(now time.Time, space numberSpace, payload []byte) int {
500 id, code, finalSize, n := consumeResetStreamFrame(payload)
501 if n < 0 {
502 return -1
503 }
504 if s := c.streamForFrame(now, id, recvStream); s != nil {
505 if err := s.handleReset(code, finalSize); err != nil {
506 c.abort(now, err)
507 }
508 }
509 return n
510 }
511
512 func (c *Conn) handleStopSendingFrame(now time.Time, space numberSpace, payload []byte) int {
513 id, code, n := consumeStopSendingFrame(payload)
514 if n < 0 {
515 return -1
516 }
517 if s := c.streamForFrame(now, id, sendStream); s != nil {
518 if err := s.handleStopSending(code); err != nil {
519 c.abort(now, err)
520 }
521 }
522 return n
523 }
524
525 func (c *Conn) handleCryptoFrame(now time.Time, space numberSpace, payload []byte) int {
526 off, data, n := consumeCryptoFrame(payload)
527 err := c.handleCrypto(now, space, off, data)
528 if err != nil {
529 c.abort(now, err)
530 return -1
531 }
532 return n
533 }
534
535 func (c *Conn) handleStreamFrame(now time.Time, space numberSpace, payload []byte) int {
536 id, off, fin, b, n := consumeStreamFrame(payload)
537 if n < 0 {
538 return -1
539 }
540 if s := c.streamForFrame(now, id, recvStream); s != nil {
541 if err := s.handleData(off, b, fin); err != nil {
542 c.abort(now, err)
543 }
544 }
545 return n
546 }
547
548 func (c *Conn) handleNewConnectionIDFrame(now time.Time, space numberSpace, payload []byte) int {
549 seq, retire, connID, resetToken, n := consumeNewConnectionIDFrame(payload)
550 if n < 0 {
551 return -1
552 }
553 if err := c.connIDState.handleNewConnID(c, seq, retire, connID, resetToken); err != nil {
554 c.abort(now, err)
555 }
556 return n
557 }
558
559 func (c *Conn) handleRetireConnectionIDFrame(now time.Time, space numberSpace, payload []byte) int {
560 seq, n := consumeRetireConnectionIDFrame(payload)
561 if n < 0 {
562 return -1
563 }
564 if err := c.connIDState.handleRetireConnID(c, seq); err != nil {
565 c.abort(now, err)
566 }
567 return n
568 }
569
570 func (c *Conn) handlePathChallengeFrame(now time.Time, dgram *datagram, space numberSpace, payload []byte) int {
571 data, n := consumePathChallengeFrame(payload)
572 if n < 0 {
573 return -1
574 }
575 c.handlePathChallenge(now, dgram, data)
576 return n
577 }
578
579 func (c *Conn) handlePathResponseFrame(now time.Time, space numberSpace, payload []byte) int {
580 data, n := consumePathResponseFrame(payload)
581 if n < 0 {
582 return -1
583 }
584 c.handlePathResponse(now, data)
585 return n
586 }
587
588 func (c *Conn) handleConnectionCloseTransportFrame(now time.Time, payload []byte) int {
589 code, _, reason, n := consumeConnectionCloseTransportFrame(payload)
590 if n < 0 {
591 return -1
592 }
593 c.handlePeerConnectionClose(now, peerTransportError{code: code, reason: reason})
594 return n
595 }
596
597 func (c *Conn) handleConnectionCloseApplicationFrame(now time.Time, payload []byte) int {
598 code, reason, n := consumeConnectionCloseApplicationFrame(payload)
599 if n < 0 {
600 return -1
601 }
602 c.handlePeerConnectionClose(now, &ApplicationError{Code: code, Reason: reason})
603 return n
604 }
605
606 func (c *Conn) handleHandshakeDoneFrame(now time.Time, space numberSpace, payload []byte) int {
607 if c.side == serverSide {
608
609
610 c.abort(now, localTransportError{
611 code: errProtocolViolation,
612 reason: "client sent HANDSHAKE_DONE",
613 })
614 return -1
615 }
616 if c.isAlive() {
617 c.confirmHandshake(now)
618 }
619 return 1
620 }
621
622 var errStatelessReset = errors.New("received stateless reset")
623
624 func (c *Conn) handleStatelessReset(now time.Time, resetToken statelessResetToken) (valid bool) {
625 if !c.connIDState.isValidStatelessResetToken(resetToken) {
626 return false
627 }
628 c.setFinalError(errStatelessReset)
629 c.enterDraining(now)
630 return true
631 }
632
View as plain text