github.com/mikelsr/quic-go@v0.36.1-0.20230701132136-1d9415b66898/connection.go (about) 1 package quic 2 3 import ( 4 "bytes" 5 "context" 6 "crypto/tls" 7 "errors" 8 "fmt" 9 "io" 10 "net" 11 "reflect" 12 "sync" 13 "sync/atomic" 14 "time" 15 16 "github.com/mikelsr/quic-go/internal/ackhandler" 17 "github.com/mikelsr/quic-go/internal/flowcontrol" 18 "github.com/mikelsr/quic-go/internal/handshake" 19 "github.com/mikelsr/quic-go/internal/logutils" 20 "github.com/mikelsr/quic-go/internal/protocol" 21 "github.com/mikelsr/quic-go/internal/qerr" 22 "github.com/mikelsr/quic-go/internal/utils" 23 "github.com/mikelsr/quic-go/internal/wire" 24 "github.com/mikelsr/quic-go/logging" 25 ) 26 27 type unpacker interface { 28 UnpackLongHeader(hdr *wire.Header, rcvTime time.Time, data []byte, v protocol.VersionNumber) (*unpackedPacket, error) 29 UnpackShortHeader(rcvTime time.Time, data []byte) (protocol.PacketNumber, protocol.PacketNumberLen, protocol.KeyPhaseBit, []byte, error) 30 } 31 32 type streamGetter interface { 33 GetOrOpenReceiveStream(protocol.StreamID) (receiveStreamI, error) 34 GetOrOpenSendStream(protocol.StreamID) (sendStreamI, error) 35 } 36 37 type streamManager interface { 38 GetOrOpenSendStream(protocol.StreamID) (sendStreamI, error) 39 GetOrOpenReceiveStream(protocol.StreamID) (receiveStreamI, error) 40 OpenStream() (Stream, error) 41 OpenUniStream() (SendStream, error) 42 OpenStreamSync(context.Context) (Stream, error) 43 OpenUniStreamSync(context.Context) (SendStream, error) 44 AcceptStream(context.Context) (Stream, error) 45 AcceptUniStream(context.Context) (ReceiveStream, error) 46 DeleteStream(protocol.StreamID) error 47 UpdateLimits(*wire.TransportParameters) 48 HandleMaxStreamsFrame(*wire.MaxStreamsFrame) 49 CloseWithError(error) 50 ResetFor0RTT() 51 UseResetMaps() 52 } 53 54 type cryptoStreamHandler interface { 55 StartHandshake() error 56 ChangeConnectionID(protocol.ConnectionID) 57 SetLargest1RTTAcked(protocol.PacketNumber) error 58 SetHandshakeConfirmed() 59 GetSessionTicket() ([]byte, error) 60 io.Closer 61 ConnectionState() handshake.ConnectionState 62 } 63 64 type receivedPacket struct { 65 buffer *packetBuffer 66 67 remoteAddr net.Addr 68 rcvTime time.Time 69 data []byte 70 71 ecn protocol.ECN 72 73 info packetInfo // only valid if the contained IP address is valid 74 } 75 76 func (p *receivedPacket) Size() protocol.ByteCount { return protocol.ByteCount(len(p.data)) } 77 78 func (p *receivedPacket) Clone() *receivedPacket { 79 return &receivedPacket{ 80 remoteAddr: p.remoteAddr, 81 rcvTime: p.rcvTime, 82 data: p.data, 83 buffer: p.buffer, 84 ecn: p.ecn, 85 info: p.info, 86 } 87 } 88 89 type connRunner interface { 90 Add(protocol.ConnectionID, packetHandler) bool 91 GetStatelessResetToken(protocol.ConnectionID) protocol.StatelessResetToken 92 Retire(protocol.ConnectionID) 93 Remove(protocol.ConnectionID) 94 ReplaceWithClosed([]protocol.ConnectionID, protocol.Perspective, []byte) 95 AddResetToken(protocol.StatelessResetToken, packetHandler) 96 RemoveResetToken(protocol.StatelessResetToken) 97 } 98 99 type handshakeRunner struct { 100 onReceivedParams func(*wire.TransportParameters) 101 onReceivedReadKeys func() 102 dropKeys func(protocol.EncryptionLevel) 103 onHandshakeComplete func() 104 } 105 106 func (r *handshakeRunner) OnReceivedParams(tp *wire.TransportParameters) { r.onReceivedParams(tp) } 107 func (r *handshakeRunner) DropKeys(el protocol.EncryptionLevel) { r.dropKeys(el) } 108 func (r *handshakeRunner) OnHandshakeComplete() { r.onHandshakeComplete() } 109 func (r *handshakeRunner) OnReceivedReadKeys() { r.onReceivedReadKeys() } 110 111 type closeError struct { 112 err error 113 remote bool 114 immediate bool 115 } 116 117 type errCloseForRecreating struct { 118 nextPacketNumber protocol.PacketNumber 119 nextVersion protocol.VersionNumber 120 } 121 122 func (e *errCloseForRecreating) Error() string { 123 return "closing connection in order to recreate it" 124 } 125 126 var connTracingID uint64 // to be accessed atomically 127 func nextConnTracingID() uint64 { return atomic.AddUint64(&connTracingID, 1) } 128 129 // A Connection is a QUIC connection 130 type connection struct { 131 // Destination connection ID used during the handshake. 132 // Used to check source connection ID on incoming packets. 133 handshakeDestConnID protocol.ConnectionID 134 // Set for the client. Destination connection ID used on the first Initial sent. 135 origDestConnID protocol.ConnectionID 136 retrySrcConnID *protocol.ConnectionID // only set for the client (and if a Retry was performed) 137 138 srcConnIDLen int 139 140 perspective protocol.Perspective 141 version protocol.VersionNumber 142 config *Config 143 144 conn sendConn 145 sendQueue sender 146 147 streamsMap streamManager 148 connIDManager *connIDManager 149 connIDGenerator *connIDGenerator 150 151 rttStats *utils.RTTStats 152 153 cryptoStreamManager *cryptoStreamManager 154 sentPacketHandler ackhandler.SentPacketHandler 155 receivedPacketHandler ackhandler.ReceivedPacketHandler 156 retransmissionQueue *retransmissionQueue 157 framer framer 158 windowUpdateQueue *windowUpdateQueue 159 connFlowController flowcontrol.ConnectionFlowController 160 tokenStoreKey string // only set for the client 161 tokenGenerator *handshake.TokenGenerator // only set for the server 162 163 unpacker unpacker 164 frameParser wire.FrameParser 165 packer packer 166 mtuDiscoverer mtuDiscoverer // initialized when the handshake completes 167 168 oneRTTStream cryptoStream // only set for the server 169 cryptoStreamHandler cryptoStreamHandler 170 171 receivedPackets chan receivedPacket 172 sendingScheduled chan struct{} 173 174 closeOnce sync.Once 175 // closeChan is used to notify the run loop that it should terminate 176 closeChan chan closeError 177 178 ctx context.Context 179 ctxCancel context.CancelFunc 180 handshakeCtx context.Context 181 handshakeCtxCancel context.CancelFunc 182 183 undecryptablePackets []receivedPacket // undecryptable packets, waiting for a change in encryption level 184 undecryptablePacketsToProcess []receivedPacket 185 186 clientHelloWritten <-chan *wire.TransportParameters 187 earlyConnReadyChan chan struct{} 188 handshakeCompleteChan chan struct{} // is closed when the handshake completes 189 sentFirstPacket bool 190 handshakeComplete bool 191 handshakeConfirmed bool 192 193 receivedRetry bool 194 versionNegotiated bool 195 receivedFirstPacket bool 196 197 // the minimum of the max_idle_timeout values advertised by both endpoints 198 idleTimeout time.Duration 199 creationTime time.Time 200 // The idle timeout is set based on the max of the time we received the last packet... 201 lastPacketReceivedTime time.Time 202 // ... and the time we sent a new ack-eliciting packet after receiving a packet. 203 firstAckElicitingPacketAfterIdleSentTime time.Time 204 // pacingDeadline is the time when the next packet should be sent 205 pacingDeadline time.Time 206 207 peerParams *wire.TransportParameters 208 209 timer connectionTimer 210 // keepAlivePingSent stores whether a keep alive PING is in flight. 211 // It is reset as soon as we receive a packet from the peer. 212 keepAlivePingSent bool 213 keepAliveInterval time.Duration 214 215 datagramQueue *datagramQueue 216 217 connStateMutex sync.Mutex 218 connState ConnectionState 219 220 logID string 221 tracer logging.ConnectionTracer 222 logger utils.Logger 223 } 224 225 var ( 226 _ Connection = &connection{} 227 _ EarlyConnection = &connection{} 228 _ streamSender = &connection{} 229 ) 230 231 var newConnection = func( 232 conn sendConn, 233 runner connRunner, 234 origDestConnID protocol.ConnectionID, 235 retrySrcConnID *protocol.ConnectionID, 236 clientDestConnID protocol.ConnectionID, 237 destConnID protocol.ConnectionID, 238 srcConnID protocol.ConnectionID, 239 connIDGenerator ConnectionIDGenerator, 240 statelessResetToken protocol.StatelessResetToken, 241 conf *Config, 242 tlsConf *tls.Config, 243 tokenGenerator *handshake.TokenGenerator, 244 clientAddressValidated bool, 245 tracer logging.ConnectionTracer, 246 tracingID uint64, 247 logger utils.Logger, 248 v protocol.VersionNumber, 249 ) quicConn { 250 s := &connection{ 251 conn: conn, 252 config: conf, 253 handshakeDestConnID: destConnID, 254 srcConnIDLen: srcConnID.Len(), 255 tokenGenerator: tokenGenerator, 256 oneRTTStream: newCryptoStream(), 257 perspective: protocol.PerspectiveServer, 258 handshakeCompleteChan: make(chan struct{}), 259 tracer: tracer, 260 logger: logger, 261 version: v, 262 } 263 if origDestConnID.Len() > 0 { 264 s.logID = origDestConnID.String() 265 } else { 266 s.logID = destConnID.String() 267 } 268 s.connIDManager = newConnIDManager( 269 destConnID, 270 func(token protocol.StatelessResetToken) { runner.AddResetToken(token, s) }, 271 runner.RemoveResetToken, 272 s.queueControlFrame, 273 ) 274 s.connIDGenerator = newConnIDGenerator( 275 srcConnID, 276 &clientDestConnID, 277 func(connID protocol.ConnectionID) { runner.Add(connID, s) }, 278 runner.GetStatelessResetToken, 279 runner.Remove, 280 runner.Retire, 281 runner.ReplaceWithClosed, 282 s.queueControlFrame, 283 connIDGenerator, 284 ) 285 s.preSetup() 286 s.ctx, s.ctxCancel = context.WithCancel(context.WithValue(context.Background(), ConnectionTracingKey, tracingID)) 287 s.sentPacketHandler, s.receivedPacketHandler = ackhandler.NewAckHandler( 288 0, 289 getMaxPacketSize(s.conn.RemoteAddr()), 290 s.rttStats, 291 clientAddressValidated, 292 s.perspective, 293 s.tracer, 294 s.logger, 295 ) 296 s.mtuDiscoverer = newMTUDiscoverer(s.rttStats, getMaxPacketSize(s.conn.RemoteAddr()), s.sentPacketHandler.SetMaxDatagramSize) 297 initialStream := newCryptoStream() 298 handshakeStream := newCryptoStream() 299 params := &wire.TransportParameters{ 300 InitialMaxStreamDataBidiLocal: protocol.ByteCount(s.config.InitialStreamReceiveWindow), 301 InitialMaxStreamDataBidiRemote: protocol.ByteCount(s.config.InitialStreamReceiveWindow), 302 InitialMaxStreamDataUni: protocol.ByteCount(s.config.InitialStreamReceiveWindow), 303 InitialMaxData: protocol.ByteCount(s.config.InitialConnectionReceiveWindow), 304 MaxIdleTimeout: s.config.MaxIdleTimeout, 305 MaxBidiStreamNum: protocol.StreamNum(s.config.MaxIncomingStreams), 306 MaxUniStreamNum: protocol.StreamNum(s.config.MaxIncomingUniStreams), 307 MaxAckDelay: protocol.MaxAckDelayInclGranularity, 308 AckDelayExponent: protocol.AckDelayExponent, 309 DisableActiveMigration: true, 310 StatelessResetToken: &statelessResetToken, 311 OriginalDestinationConnectionID: origDestConnID, 312 // For interoperability with quic-go versions before May 2023, this value must be set to a value 313 // different from protocol.DefaultActiveConnectionIDLimit. 314 // If set to the default value, it will be omitted from the transport parameters, which will make 315 // old quic-go versions interpret it as 0, instead of the default value of 2. 316 // See https://github.com/mikelsr/quic-go/pull/3806. 317 ActiveConnectionIDLimit: protocol.MaxActiveConnectionIDs, 318 InitialSourceConnectionID: srcConnID, 319 RetrySourceConnectionID: retrySrcConnID, 320 } 321 if s.config.EnableDatagrams { 322 params.MaxDatagramFrameSize = protocol.MaxDatagramFrameSize 323 } else { 324 params.MaxDatagramFrameSize = protocol.InvalidByteCount 325 } 326 if s.tracer != nil { 327 s.tracer.SentTransportParameters(params) 328 } 329 cs := handshake.NewCryptoSetupServer( 330 initialStream, 331 handshakeStream, 332 s.oneRTTStream, 333 clientDestConnID, 334 params, 335 &handshakeRunner{ 336 onReceivedParams: s.handleTransportParameters, 337 dropKeys: s.dropEncryptionLevel, 338 onReceivedReadKeys: s.receivedReadKeys, 339 onHandshakeComplete: func() { 340 runner.Retire(clientDestConnID) 341 close(s.handshakeCompleteChan) 342 }, 343 }, 344 tlsConf, 345 conf.Allow0RTT, 346 s.rttStats, 347 tracer, 348 logger, 349 s.version, 350 ) 351 s.cryptoStreamHandler = cs 352 s.packer = newPacketPacker(srcConnID, s.connIDManager.Get, initialStream, handshakeStream, s.sentPacketHandler, s.retransmissionQueue, cs, s.framer, s.receivedPacketHandler, s.datagramQueue, s.perspective) 353 s.unpacker = newPacketUnpacker(cs, s.srcConnIDLen) 354 s.cryptoStreamManager = newCryptoStreamManager(cs, initialStream, handshakeStream, s.oneRTTStream) 355 return s 356 } 357 358 // declare this as a variable, such that we can it mock it in the tests 359 var newClientConnection = func( 360 conn sendConn, 361 runner connRunner, 362 destConnID protocol.ConnectionID, 363 srcConnID protocol.ConnectionID, 364 connIDGenerator ConnectionIDGenerator, 365 conf *Config, 366 tlsConf *tls.Config, 367 initialPacketNumber protocol.PacketNumber, 368 enable0RTT bool, 369 hasNegotiatedVersion bool, 370 tracer logging.ConnectionTracer, 371 tracingID uint64, 372 logger utils.Logger, 373 v protocol.VersionNumber, 374 ) quicConn { 375 s := &connection{ 376 conn: conn, 377 config: conf, 378 origDestConnID: destConnID, 379 handshakeDestConnID: destConnID, 380 srcConnIDLen: srcConnID.Len(), 381 perspective: protocol.PerspectiveClient, 382 handshakeCompleteChan: make(chan struct{}), 383 logID: destConnID.String(), 384 logger: logger, 385 tracer: tracer, 386 versionNegotiated: hasNegotiatedVersion, 387 version: v, 388 } 389 s.connIDManager = newConnIDManager( 390 destConnID, 391 func(token protocol.StatelessResetToken) { runner.AddResetToken(token, s) }, 392 runner.RemoveResetToken, 393 s.queueControlFrame, 394 ) 395 s.connIDGenerator = newConnIDGenerator( 396 srcConnID, 397 nil, 398 func(connID protocol.ConnectionID) { runner.Add(connID, s) }, 399 runner.GetStatelessResetToken, 400 runner.Remove, 401 runner.Retire, 402 runner.ReplaceWithClosed, 403 s.queueControlFrame, 404 connIDGenerator, 405 ) 406 s.preSetup() 407 s.ctx, s.ctxCancel = context.WithCancel(context.WithValue(context.Background(), ConnectionTracingKey, tracingID)) 408 s.sentPacketHandler, s.receivedPacketHandler = ackhandler.NewAckHandler( 409 initialPacketNumber, 410 getMaxPacketSize(s.conn.RemoteAddr()), 411 s.rttStats, 412 false, /* has no effect */ 413 s.perspective, 414 s.tracer, 415 s.logger, 416 ) 417 s.mtuDiscoverer = newMTUDiscoverer(s.rttStats, getMaxPacketSize(s.conn.RemoteAddr()), s.sentPacketHandler.SetMaxDatagramSize) 418 initialStream := newCryptoStream() 419 handshakeStream := newCryptoStream() 420 oneRTTStream := newCryptoStream() 421 params := &wire.TransportParameters{ 422 InitialMaxStreamDataBidiRemote: protocol.ByteCount(s.config.InitialStreamReceiveWindow), 423 InitialMaxStreamDataBidiLocal: protocol.ByteCount(s.config.InitialStreamReceiveWindow), 424 InitialMaxStreamDataUni: protocol.ByteCount(s.config.InitialStreamReceiveWindow), 425 InitialMaxData: protocol.ByteCount(s.config.InitialConnectionReceiveWindow), 426 MaxIdleTimeout: s.config.MaxIdleTimeout, 427 MaxBidiStreamNum: protocol.StreamNum(s.config.MaxIncomingStreams), 428 MaxUniStreamNum: protocol.StreamNum(s.config.MaxIncomingUniStreams), 429 MaxAckDelay: protocol.MaxAckDelayInclGranularity, 430 AckDelayExponent: protocol.AckDelayExponent, 431 DisableActiveMigration: true, 432 // For interoperability with quic-go versions before May 2023, this value must be set to a value 433 // different from protocol.DefaultActiveConnectionIDLimit. 434 // If set to the default value, it will be omitted from the transport parameters, which will make 435 // old quic-go versions interpret it as 0, instead of the default value of 2. 436 // See https://github.com/mikelsr/quic-go/pull/3806. 437 ActiveConnectionIDLimit: protocol.MaxActiveConnectionIDs, 438 InitialSourceConnectionID: srcConnID, 439 } 440 if s.config.EnableDatagrams { 441 params.MaxDatagramFrameSize = protocol.MaxDatagramFrameSize 442 } else { 443 params.MaxDatagramFrameSize = protocol.InvalidByteCount 444 } 445 if s.tracer != nil { 446 s.tracer.SentTransportParameters(params) 447 } 448 cs, clientHelloWritten := handshake.NewCryptoSetupClient( 449 initialStream, 450 handshakeStream, 451 oneRTTStream, 452 destConnID, 453 params, 454 &handshakeRunner{ 455 onReceivedParams: s.handleTransportParameters, 456 dropKeys: s.dropEncryptionLevel, 457 onReceivedReadKeys: s.receivedReadKeys, 458 onHandshakeComplete: func() { close(s.handshakeCompleteChan) }, 459 }, 460 tlsConf, 461 enable0RTT, 462 s.rttStats, 463 tracer, 464 logger, 465 s.version, 466 ) 467 s.clientHelloWritten = clientHelloWritten 468 s.cryptoStreamHandler = cs 469 s.cryptoStreamManager = newCryptoStreamManager(cs, initialStream, handshakeStream, oneRTTStream) 470 s.unpacker = newPacketUnpacker(cs, s.srcConnIDLen) 471 s.packer = newPacketPacker(srcConnID, s.connIDManager.Get, initialStream, handshakeStream, s.sentPacketHandler, s.retransmissionQueue, cs, s.framer, s.receivedPacketHandler, s.datagramQueue, s.perspective) 472 if len(tlsConf.ServerName) > 0 { 473 s.tokenStoreKey = tlsConf.ServerName 474 } else { 475 s.tokenStoreKey = conn.RemoteAddr().String() 476 } 477 if s.config.TokenStore != nil { 478 if token := s.config.TokenStore.Pop(s.tokenStoreKey); token != nil { 479 s.packer.SetToken(token.data) 480 } 481 } 482 return s 483 } 484 485 func (s *connection) preSetup() { 486 s.sendQueue = newSendQueue(s.conn) 487 s.retransmissionQueue = newRetransmissionQueue() 488 s.frameParser = wire.NewFrameParser(s.config.EnableDatagrams) 489 s.rttStats = &utils.RTTStats{} 490 s.connFlowController = flowcontrol.NewConnectionFlowController( 491 protocol.ByteCount(s.config.InitialConnectionReceiveWindow), 492 protocol.ByteCount(s.config.MaxConnectionReceiveWindow), 493 s.onHasConnectionWindowUpdate, 494 func(size protocol.ByteCount) bool { 495 if s.config.AllowConnectionWindowIncrease == nil { 496 return true 497 } 498 return s.config.AllowConnectionWindowIncrease(s, uint64(size)) 499 }, 500 s.rttStats, 501 s.logger, 502 ) 503 s.earlyConnReadyChan = make(chan struct{}) 504 s.streamsMap = newStreamsMap( 505 s, 506 s.newFlowController, 507 uint64(s.config.MaxIncomingStreams), 508 uint64(s.config.MaxIncomingUniStreams), 509 s.perspective, 510 ) 511 s.framer = newFramer(s.streamsMap) 512 s.receivedPackets = make(chan receivedPacket, protocol.MaxConnUnprocessedPackets) 513 s.closeChan = make(chan closeError, 1) 514 s.sendingScheduled = make(chan struct{}, 1) 515 s.handshakeCtx, s.handshakeCtxCancel = context.WithCancel(context.Background()) 516 517 now := time.Now() 518 s.lastPacketReceivedTime = now 519 s.creationTime = now 520 521 s.windowUpdateQueue = newWindowUpdateQueue(s.streamsMap, s.connFlowController, s.framer.QueueControlFrame) 522 s.datagramQueue = newDatagramQueue(s.scheduleSending, s.logger) 523 s.connState.Version = s.version 524 } 525 526 // run the connection main loop 527 func (s *connection) run() error { 528 defer s.ctxCancel() 529 530 s.timer = *newTimer() 531 532 if err := s.cryptoStreamHandler.StartHandshake(); err != nil { 533 return err 534 } 535 go func() { 536 if err := s.sendQueue.Run(); err != nil { 537 s.destroyImpl(err) 538 } 539 }() 540 541 if s.perspective == protocol.PerspectiveClient { 542 select { 543 case zeroRTTParams := <-s.clientHelloWritten: 544 s.scheduleSending() 545 if zeroRTTParams != nil { 546 s.restoreTransportParameters(zeroRTTParams) 547 close(s.earlyConnReadyChan) 548 } 549 case closeErr := <-s.closeChan: 550 // put the close error back into the channel, so that the run loop can receive it 551 s.closeChan <- closeErr 552 } 553 } 554 555 var ( 556 closeErr closeError 557 sendQueueAvailable <-chan struct{} 558 ) 559 560 runLoop: 561 for { 562 // Close immediately if requested 563 select { 564 case closeErr = <-s.closeChan: 565 break runLoop 566 case <-s.handshakeCompleteChan: 567 s.handleHandshakeComplete() 568 default: 569 } 570 571 s.maybeResetTimer() 572 573 var processedUndecryptablePacket bool 574 if len(s.undecryptablePacketsToProcess) > 0 { 575 queue := s.undecryptablePacketsToProcess 576 s.undecryptablePacketsToProcess = nil 577 for _, p := range queue { 578 if processed := s.handlePacketImpl(p); processed { 579 processedUndecryptablePacket = true 580 } 581 // Don't set timers and send packets if the packet made us close the connection. 582 select { 583 case closeErr = <-s.closeChan: 584 break runLoop 585 default: 586 } 587 } 588 } 589 // If we processed any undecryptable packets, jump to the resetting of the timers directly. 590 if !processedUndecryptablePacket { 591 select { 592 case closeErr = <-s.closeChan: 593 break runLoop 594 case <-s.timer.Chan(): 595 s.timer.SetRead() 596 // We do all the interesting stuff after the switch statement, so 597 // nothing to see here. 598 case <-s.sendingScheduled: 599 // We do all the interesting stuff after the switch statement, so 600 // nothing to see here. 601 case <-sendQueueAvailable: 602 case firstPacket := <-s.receivedPackets: 603 wasProcessed := s.handlePacketImpl(firstPacket) 604 // Don't set timers and send packets if the packet made us close the connection. 605 select { 606 case closeErr = <-s.closeChan: 607 break runLoop 608 default: 609 } 610 if s.handshakeComplete { 611 // Now process all packets in the receivedPackets channel. 612 // Limit the number of packets to the length of the receivedPackets channel, 613 // so we eventually get a chance to send out an ACK when receiving a lot of packets. 614 numPackets := len(s.receivedPackets) 615 receiveLoop: 616 for i := 0; i < numPackets; i++ { 617 select { 618 case p := <-s.receivedPackets: 619 if processed := s.handlePacketImpl(p); processed { 620 wasProcessed = true 621 } 622 select { 623 case closeErr = <-s.closeChan: 624 break runLoop 625 default: 626 } 627 default: 628 break receiveLoop 629 } 630 } 631 } 632 // Only reset the timers if this packet was actually processed. 633 // This avoids modifying any state when handling undecryptable packets, 634 // which could be injected by an attacker. 635 if !wasProcessed { 636 continue 637 } 638 case <-s.handshakeCompleteChan: 639 s.handleHandshakeComplete() 640 } 641 } 642 643 now := time.Now() 644 if timeout := s.sentPacketHandler.GetLossDetectionTimeout(); !timeout.IsZero() && timeout.Before(now) { 645 // This could cause packets to be retransmitted. 646 // Check it before trying to send packets. 647 if err := s.sentPacketHandler.OnLossDetectionTimeout(); err != nil { 648 s.closeLocal(err) 649 } 650 } 651 652 if keepAliveTime := s.nextKeepAliveTime(); !keepAliveTime.IsZero() && !now.Before(keepAliveTime) { 653 // send a PING frame since there is no activity in the connection 654 s.logger.Debugf("Sending a keep-alive PING to keep the connection alive.") 655 s.framer.QueueControlFrame(&wire.PingFrame{}) 656 s.keepAlivePingSent = true 657 } else if !s.handshakeComplete && now.Sub(s.creationTime) >= s.config.handshakeTimeout() { 658 s.destroyImpl(qerr.ErrHandshakeTimeout) 659 continue 660 } else { 661 idleTimeoutStartTime := s.idleTimeoutStartTime() 662 if (!s.handshakeComplete && now.Sub(idleTimeoutStartTime) >= s.config.HandshakeIdleTimeout) || 663 (s.handshakeComplete && now.After(s.nextIdleTimeoutTime())) { 664 s.destroyImpl(qerr.ErrIdleTimeout) 665 continue 666 } 667 } 668 669 if s.sendQueue.WouldBlock() { 670 // The send queue is still busy sending out packets. 671 // Wait until there's space to enqueue new packets. 672 sendQueueAvailable = s.sendQueue.Available() 673 continue 674 } 675 if err := s.triggerSending(); err != nil { 676 s.closeLocal(err) 677 } 678 if s.sendQueue.WouldBlock() { 679 sendQueueAvailable = s.sendQueue.Available() 680 } else { 681 sendQueueAvailable = nil 682 } 683 } 684 685 s.cryptoStreamHandler.Close() 686 s.sendQueue.Close() // close the send queue before sending the CONNECTION_CLOSE 687 s.handleCloseError(&closeErr) 688 if e := (&errCloseForRecreating{}); !errors.As(closeErr.err, &e) && s.tracer != nil { 689 s.tracer.Close() 690 } 691 s.logger.Infof("Connection %s closed.", s.logID) 692 s.timer.Stop() 693 return closeErr.err 694 } 695 696 // blocks until the early connection can be used 697 func (s *connection) earlyConnReady() <-chan struct{} { 698 return s.earlyConnReadyChan 699 } 700 701 func (s *connection) HandshakeComplete() <-chan struct{} { 702 return s.handshakeCtx.Done() 703 } 704 705 func (s *connection) Context() context.Context { 706 return s.ctx 707 } 708 709 func (s *connection) supportsDatagrams() bool { 710 return s.peerParams.MaxDatagramFrameSize > 0 711 } 712 713 func (s *connection) ConnectionState() ConnectionState { 714 s.connStateMutex.Lock() 715 defer s.connStateMutex.Unlock() 716 cs := s.cryptoStreamHandler.ConnectionState() 717 s.connState.TLS = cs.ConnectionState 718 s.connState.Used0RTT = cs.Used0RTT 719 return s.connState 720 } 721 722 // Time when the connection should time out 723 func (s *connection) nextIdleTimeoutTime() time.Time { 724 idleTimeout := utils.Max(s.idleTimeout, s.rttStats.PTO(true)*3) 725 return s.idleTimeoutStartTime().Add(idleTimeout) 726 } 727 728 // Time when the next keep-alive packet should be sent. 729 // It returns a zero time if no keep-alive should be sent. 730 func (s *connection) nextKeepAliveTime() time.Time { 731 if s.config.KeepAlivePeriod == 0 || s.keepAlivePingSent || !s.firstAckElicitingPacketAfterIdleSentTime.IsZero() { 732 return time.Time{} 733 } 734 keepAliveInterval := utils.Max(s.keepAliveInterval, s.rttStats.PTO(true)*3/2) 735 return s.lastPacketReceivedTime.Add(keepAliveInterval) 736 } 737 738 func (s *connection) maybeResetTimer() { 739 var deadline time.Time 740 if !s.handshakeComplete { 741 deadline = utils.MinTime( 742 s.creationTime.Add(s.config.handshakeTimeout()), 743 s.idleTimeoutStartTime().Add(s.config.HandshakeIdleTimeout), 744 ) 745 } else { 746 if keepAliveTime := s.nextKeepAliveTime(); !keepAliveTime.IsZero() { 747 deadline = keepAliveTime 748 } else { 749 deadline = s.nextIdleTimeoutTime() 750 } 751 } 752 753 s.timer.SetTimer( 754 deadline, 755 s.receivedPacketHandler.GetAlarmTimeout(), 756 s.sentPacketHandler.GetLossDetectionTimeout(), 757 s.pacingDeadline, 758 ) 759 } 760 761 func (s *connection) idleTimeoutStartTime() time.Time { 762 return utils.MaxTime(s.lastPacketReceivedTime, s.firstAckElicitingPacketAfterIdleSentTime) 763 } 764 765 func (s *connection) handleHandshakeComplete() { 766 s.handshakeComplete = true 767 s.handshakeCompleteChan = nil // prevent this case from ever being selected again 768 defer s.handshakeCtxCancel() 769 // Once the handshake completes, we have derived 1-RTT keys. 770 // There's no point in queueing undecryptable packets for later decryption any more. 771 s.undecryptablePackets = nil 772 773 s.connIDManager.SetHandshakeComplete() 774 s.connIDGenerator.SetHandshakeComplete() 775 776 if s.perspective == protocol.PerspectiveClient { 777 s.applyTransportParameters() 778 return 779 } 780 781 s.handleHandshakeConfirmed() 782 783 ticket, err := s.cryptoStreamHandler.GetSessionTicket() 784 if err != nil { 785 s.closeLocal(err) 786 } 787 if ticket != nil { // may be nil if session tickets are disabled via tls.Config.SessionTicketsDisabled 788 s.oneRTTStream.Write(ticket) 789 for s.oneRTTStream.HasData() { 790 s.queueControlFrame(s.oneRTTStream.PopCryptoFrame(protocol.MaxPostHandshakeCryptoFrameSize)) 791 } 792 } 793 token, err := s.tokenGenerator.NewToken(s.conn.RemoteAddr()) 794 if err != nil { 795 s.closeLocal(err) 796 } 797 s.queueControlFrame(&wire.NewTokenFrame{Token: token}) 798 s.queueControlFrame(&wire.HandshakeDoneFrame{}) 799 } 800 801 func (s *connection) handleHandshakeConfirmed() { 802 s.handshakeConfirmed = true 803 s.sentPacketHandler.SetHandshakeConfirmed() 804 s.cryptoStreamHandler.SetHandshakeConfirmed() 805 806 if !s.config.DisablePathMTUDiscovery && s.conn.capabilities().DF { 807 maxPacketSize := s.peerParams.MaxUDPPayloadSize 808 if maxPacketSize == 0 { 809 maxPacketSize = protocol.MaxByteCount 810 } 811 s.mtuDiscoverer.Start(utils.Min(maxPacketSize, protocol.MaxPacketBufferSize)) 812 } 813 } 814 815 func (s *connection) handlePacketImpl(rp receivedPacket) bool { 816 s.sentPacketHandler.ReceivedBytes(rp.Size()) 817 818 if wire.IsVersionNegotiationPacket(rp.data) { 819 s.handleVersionNegotiationPacket(rp) 820 return false 821 } 822 823 var counter uint8 824 var lastConnID protocol.ConnectionID 825 var processed bool 826 data := rp.data 827 p := rp 828 for len(data) > 0 { 829 var destConnID protocol.ConnectionID 830 if counter > 0 { 831 p = *(p.Clone()) 832 p.data = data 833 834 var err error 835 destConnID, err = wire.ParseConnectionID(p.data, s.srcConnIDLen) 836 if err != nil { 837 if s.tracer != nil { 838 s.tracer.DroppedPacket(logging.PacketTypeNotDetermined, protocol.ByteCount(len(data)), logging.PacketDropHeaderParseError) 839 } 840 s.logger.Debugf("error parsing packet, couldn't parse connection ID: %s", err) 841 break 842 } 843 if destConnID != lastConnID { 844 if s.tracer != nil { 845 s.tracer.DroppedPacket(logging.PacketTypeNotDetermined, protocol.ByteCount(len(data)), logging.PacketDropUnknownConnectionID) 846 } 847 s.logger.Debugf("coalesced packet has different destination connection ID: %s, expected %s", destConnID, lastConnID) 848 break 849 } 850 } 851 852 if wire.IsLongHeaderPacket(p.data[0]) { 853 hdr, packetData, rest, err := wire.ParsePacket(p.data) 854 if err != nil { 855 if s.tracer != nil { 856 dropReason := logging.PacketDropHeaderParseError 857 if err == wire.ErrUnsupportedVersion { 858 dropReason = logging.PacketDropUnsupportedVersion 859 } 860 s.tracer.DroppedPacket(logging.PacketTypeNotDetermined, protocol.ByteCount(len(data)), dropReason) 861 } 862 s.logger.Debugf("error parsing packet: %s", err) 863 break 864 } 865 lastConnID = hdr.DestConnectionID 866 867 if hdr.Version != s.version { 868 if s.tracer != nil { 869 s.tracer.DroppedPacket(logging.PacketTypeFromHeader(hdr), protocol.ByteCount(len(data)), logging.PacketDropUnexpectedVersion) 870 } 871 s.logger.Debugf("Dropping packet with version %x. Expected %x.", hdr.Version, s.version) 872 break 873 } 874 875 if counter > 0 { 876 p.buffer.Split() 877 } 878 counter++ 879 880 // only log if this actually a coalesced packet 881 if s.logger.Debug() && (counter > 1 || len(rest) > 0) { 882 s.logger.Debugf("Parsed a coalesced packet. Part %d: %d bytes. Remaining: %d bytes.", counter, len(packetData), len(rest)) 883 } 884 885 p.data = packetData 886 887 if wasProcessed := s.handleLongHeaderPacket(p, hdr); wasProcessed { 888 processed = true 889 } 890 data = rest 891 } else { 892 if counter > 0 { 893 p.buffer.Split() 894 } 895 processed = s.handleShortHeaderPacket(p, destConnID) 896 break 897 } 898 } 899 900 p.buffer.MaybeRelease() 901 return processed 902 } 903 904 func (s *connection) handleShortHeaderPacket(p receivedPacket, destConnID protocol.ConnectionID) bool { 905 var wasQueued bool 906 907 defer func() { 908 // Put back the packet buffer if the packet wasn't queued for later decryption. 909 if !wasQueued { 910 p.buffer.Decrement() 911 } 912 }() 913 914 pn, pnLen, keyPhase, data, err := s.unpacker.UnpackShortHeader(p.rcvTime, p.data) 915 if err != nil { 916 wasQueued = s.handleUnpackError(err, p, logging.PacketType1RTT) 917 return false 918 } 919 920 if s.logger.Debug() { 921 s.logger.Debugf("<- Reading packet %d (%d bytes) for connection %s, 1-RTT", pn, p.Size(), destConnID) 922 wire.LogShortHeader(s.logger, destConnID, pn, pnLen, keyPhase) 923 } 924 925 if s.receivedPacketHandler.IsPotentiallyDuplicate(pn, protocol.Encryption1RTT) { 926 s.logger.Debugf("Dropping (potentially) duplicate packet.") 927 if s.tracer != nil { 928 s.tracer.DroppedPacket(logging.PacketType1RTT, p.Size(), logging.PacketDropDuplicate) 929 } 930 return false 931 } 932 933 var log func([]logging.Frame) 934 if s.tracer != nil { 935 log = func(frames []logging.Frame) { 936 s.tracer.ReceivedShortHeaderPacket( 937 &logging.ShortHeader{ 938 DestConnectionID: destConnID, 939 PacketNumber: pn, 940 PacketNumberLen: pnLen, 941 KeyPhase: keyPhase, 942 }, 943 p.Size(), 944 frames, 945 ) 946 } 947 } 948 if err := s.handleUnpackedShortHeaderPacket(destConnID, pn, data, p.ecn, p.rcvTime, log); err != nil { 949 s.closeLocal(err) 950 return false 951 } 952 return true 953 } 954 955 func (s *connection) handleLongHeaderPacket(p receivedPacket, hdr *wire.Header) bool /* was the packet successfully processed */ { 956 var wasQueued bool 957 958 defer func() { 959 // Put back the packet buffer if the packet wasn't queued for later decryption. 960 if !wasQueued { 961 p.buffer.Decrement() 962 } 963 }() 964 965 if hdr.Type == protocol.PacketTypeRetry { 966 return s.handleRetryPacket(hdr, p.data) 967 } 968 969 // The server can change the source connection ID with the first Handshake packet. 970 // After this, all packets with a different source connection have to be ignored. 971 if s.receivedFirstPacket && hdr.Type == protocol.PacketTypeInitial && hdr.SrcConnectionID != s.handshakeDestConnID { 972 if s.tracer != nil { 973 s.tracer.DroppedPacket(logging.PacketTypeInitial, p.Size(), logging.PacketDropUnknownConnectionID) 974 } 975 s.logger.Debugf("Dropping Initial packet (%d bytes) with unexpected source connection ID: %s (expected %s)", p.Size(), hdr.SrcConnectionID, s.handshakeDestConnID) 976 return false 977 } 978 // drop 0-RTT packets, if we are a client 979 if s.perspective == protocol.PerspectiveClient && hdr.Type == protocol.PacketType0RTT { 980 if s.tracer != nil { 981 s.tracer.DroppedPacket(logging.PacketType0RTT, p.Size(), logging.PacketDropKeyUnavailable) 982 } 983 return false 984 } 985 986 packet, err := s.unpacker.UnpackLongHeader(hdr, p.rcvTime, p.data, s.version) 987 if err != nil { 988 wasQueued = s.handleUnpackError(err, p, logging.PacketTypeFromHeader(hdr)) 989 return false 990 } 991 992 if s.logger.Debug() { 993 s.logger.Debugf("<- Reading packet %d (%d bytes) for connection %s, %s", packet.hdr.PacketNumber, p.Size(), hdr.DestConnectionID, packet.encryptionLevel) 994 packet.hdr.Log(s.logger) 995 } 996 997 if s.receivedPacketHandler.IsPotentiallyDuplicate(packet.hdr.PacketNumber, packet.encryptionLevel) { 998 s.logger.Debugf("Dropping (potentially) duplicate packet.") 999 if s.tracer != nil { 1000 s.tracer.DroppedPacket(logging.PacketTypeFromHeader(hdr), p.Size(), logging.PacketDropDuplicate) 1001 } 1002 return false 1003 } 1004 1005 if err := s.handleUnpackedLongHeaderPacket(packet, p.ecn, p.rcvTime, p.Size()); err != nil { 1006 s.closeLocal(err) 1007 return false 1008 } 1009 return true 1010 } 1011 1012 func (s *connection) handleUnpackError(err error, p receivedPacket, pt logging.PacketType) (wasQueued bool) { 1013 switch err { 1014 case handshake.ErrKeysDropped: 1015 if s.tracer != nil { 1016 s.tracer.DroppedPacket(pt, p.Size(), logging.PacketDropKeyUnavailable) 1017 } 1018 s.logger.Debugf("Dropping %s packet (%d bytes) because we already dropped the keys.", pt, p.Size()) 1019 case handshake.ErrKeysNotYetAvailable: 1020 // Sealer for this encryption level not yet available. 1021 // Try again later. 1022 s.tryQueueingUndecryptablePacket(p, pt) 1023 return true 1024 case wire.ErrInvalidReservedBits: 1025 s.closeLocal(&qerr.TransportError{ 1026 ErrorCode: qerr.ProtocolViolation, 1027 ErrorMessage: err.Error(), 1028 }) 1029 case handshake.ErrDecryptionFailed: 1030 // This might be a packet injected by an attacker. Drop it. 1031 if s.tracer != nil { 1032 s.tracer.DroppedPacket(pt, p.Size(), logging.PacketDropPayloadDecryptError) 1033 } 1034 s.logger.Debugf("Dropping %s packet (%d bytes) that could not be unpacked. Error: %s", pt, p.Size(), err) 1035 default: 1036 var headerErr *headerParseError 1037 if errors.As(err, &headerErr) { 1038 // This might be a packet injected by an attacker. Drop it. 1039 if s.tracer != nil { 1040 s.tracer.DroppedPacket(pt, p.Size(), logging.PacketDropHeaderParseError) 1041 } 1042 s.logger.Debugf("Dropping %s packet (%d bytes) for which we couldn't unpack the header. Error: %s", pt, p.Size(), err) 1043 } else { 1044 // This is an error returned by the AEAD (other than ErrDecryptionFailed). 1045 // For example, a PROTOCOL_VIOLATION due to key updates. 1046 s.closeLocal(err) 1047 } 1048 } 1049 return false 1050 } 1051 1052 func (s *connection) handleRetryPacket(hdr *wire.Header, data []byte) bool /* was this a valid Retry */ { 1053 if s.perspective == protocol.PerspectiveServer { 1054 if s.tracer != nil { 1055 s.tracer.DroppedPacket(logging.PacketTypeRetry, protocol.ByteCount(len(data)), logging.PacketDropUnexpectedPacket) 1056 } 1057 s.logger.Debugf("Ignoring Retry.") 1058 return false 1059 } 1060 if s.receivedFirstPacket { 1061 if s.tracer != nil { 1062 s.tracer.DroppedPacket(logging.PacketTypeRetry, protocol.ByteCount(len(data)), logging.PacketDropUnexpectedPacket) 1063 } 1064 s.logger.Debugf("Ignoring Retry, since we already received a packet.") 1065 return false 1066 } 1067 destConnID := s.connIDManager.Get() 1068 if hdr.SrcConnectionID == destConnID { 1069 if s.tracer != nil { 1070 s.tracer.DroppedPacket(logging.PacketTypeRetry, protocol.ByteCount(len(data)), logging.PacketDropUnexpectedPacket) 1071 } 1072 s.logger.Debugf("Ignoring Retry, since the server didn't change the Source Connection ID.") 1073 return false 1074 } 1075 // If a token is already set, this means that we already received a Retry from the server. 1076 // Ignore this Retry packet. 1077 if s.receivedRetry { 1078 s.logger.Debugf("Ignoring Retry, since a Retry was already received.") 1079 return false 1080 } 1081 1082 tag := handshake.GetRetryIntegrityTag(data[:len(data)-16], destConnID, hdr.Version) 1083 if !bytes.Equal(data[len(data)-16:], tag[:]) { 1084 if s.tracer != nil { 1085 s.tracer.DroppedPacket(logging.PacketTypeRetry, protocol.ByteCount(len(data)), logging.PacketDropPayloadDecryptError) 1086 } 1087 s.logger.Debugf("Ignoring spoofed Retry. Integrity Tag doesn't match.") 1088 return false 1089 } 1090 1091 if s.logger.Debug() { 1092 s.logger.Debugf("<- Received Retry:") 1093 (&wire.ExtendedHeader{Header: *hdr}).Log(s.logger) 1094 s.logger.Debugf("Switching destination connection ID to: %s", hdr.SrcConnectionID) 1095 } 1096 if s.tracer != nil { 1097 s.tracer.ReceivedRetry(hdr) 1098 } 1099 newDestConnID := hdr.SrcConnectionID 1100 s.receivedRetry = true 1101 if err := s.sentPacketHandler.ResetForRetry(); err != nil { 1102 s.closeLocal(err) 1103 return false 1104 } 1105 s.handshakeDestConnID = newDestConnID 1106 s.retrySrcConnID = &newDestConnID 1107 s.cryptoStreamHandler.ChangeConnectionID(newDestConnID) 1108 s.packer.SetToken(hdr.Token) 1109 s.connIDManager.ChangeInitialConnID(newDestConnID) 1110 s.scheduleSending() 1111 return true 1112 } 1113 1114 func (s *connection) handleVersionNegotiationPacket(p receivedPacket) { 1115 if s.perspective == protocol.PerspectiveServer || // servers never receive version negotiation packets 1116 s.receivedFirstPacket || s.versionNegotiated { // ignore delayed / duplicated version negotiation packets 1117 if s.tracer != nil { 1118 s.tracer.DroppedPacket(logging.PacketTypeVersionNegotiation, p.Size(), logging.PacketDropUnexpectedPacket) 1119 } 1120 return 1121 } 1122 1123 src, dest, supportedVersions, err := wire.ParseVersionNegotiationPacket(p.data) 1124 if err != nil { 1125 if s.tracer != nil { 1126 s.tracer.DroppedPacket(logging.PacketTypeVersionNegotiation, p.Size(), logging.PacketDropHeaderParseError) 1127 } 1128 s.logger.Debugf("Error parsing Version Negotiation packet: %s", err) 1129 return 1130 } 1131 1132 for _, v := range supportedVersions { 1133 if v == s.version { 1134 if s.tracer != nil { 1135 s.tracer.DroppedPacket(logging.PacketTypeVersionNegotiation, p.Size(), logging.PacketDropUnexpectedVersion) 1136 } 1137 // The Version Negotiation packet contains the version that we offered. 1138 // This might be a packet sent by an attacker, or it was corrupted. 1139 return 1140 } 1141 } 1142 1143 s.logger.Infof("Received a Version Negotiation packet. Supported Versions: %s", supportedVersions) 1144 if s.tracer != nil { 1145 s.tracer.ReceivedVersionNegotiationPacket(dest, src, supportedVersions) 1146 } 1147 newVersion, ok := protocol.ChooseSupportedVersion(s.config.Versions, supportedVersions) 1148 if !ok { 1149 s.destroyImpl(&VersionNegotiationError{ 1150 Ours: s.config.Versions, 1151 Theirs: supportedVersions, 1152 }) 1153 s.logger.Infof("No compatible QUIC version found.") 1154 return 1155 } 1156 if s.tracer != nil { 1157 s.tracer.NegotiatedVersion(newVersion, s.config.Versions, supportedVersions) 1158 } 1159 1160 s.logger.Infof("Switching to QUIC version %s.", newVersion) 1161 nextPN, _ := s.sentPacketHandler.PeekPacketNumber(protocol.EncryptionInitial) 1162 s.destroyImpl(&errCloseForRecreating{ 1163 nextPacketNumber: nextPN, 1164 nextVersion: newVersion, 1165 }) 1166 } 1167 1168 func (s *connection) handleUnpackedLongHeaderPacket( 1169 packet *unpackedPacket, 1170 ecn protocol.ECN, 1171 rcvTime time.Time, 1172 packetSize protocol.ByteCount, // only for logging 1173 ) error { 1174 if !s.receivedFirstPacket { 1175 s.receivedFirstPacket = true 1176 if !s.versionNegotiated && s.tracer != nil { 1177 var clientVersions, serverVersions []protocol.VersionNumber 1178 switch s.perspective { 1179 case protocol.PerspectiveClient: 1180 clientVersions = s.config.Versions 1181 case protocol.PerspectiveServer: 1182 serverVersions = s.config.Versions 1183 } 1184 s.tracer.NegotiatedVersion(s.version, clientVersions, serverVersions) 1185 } 1186 // The server can change the source connection ID with the first Handshake packet. 1187 if s.perspective == protocol.PerspectiveClient && packet.hdr.SrcConnectionID != s.handshakeDestConnID { 1188 cid := packet.hdr.SrcConnectionID 1189 s.logger.Debugf("Received first packet. Switching destination connection ID to: %s", cid) 1190 s.handshakeDestConnID = cid 1191 s.connIDManager.ChangeInitialConnID(cid) 1192 } 1193 // We create the connection as soon as we receive the first packet from the client. 1194 // We do that before authenticating the packet. 1195 // That means that if the source connection ID was corrupted, 1196 // we might have created a connection with an incorrect source connection ID. 1197 // Once we authenticate the first packet, we need to update it. 1198 if s.perspective == protocol.PerspectiveServer { 1199 if packet.hdr.SrcConnectionID != s.handshakeDestConnID { 1200 s.handshakeDestConnID = packet.hdr.SrcConnectionID 1201 s.connIDManager.ChangeInitialConnID(packet.hdr.SrcConnectionID) 1202 } 1203 if s.tracer != nil { 1204 s.tracer.StartedConnection( 1205 s.conn.LocalAddr(), 1206 s.conn.RemoteAddr(), 1207 packet.hdr.SrcConnectionID, 1208 packet.hdr.DestConnectionID, 1209 ) 1210 } 1211 } 1212 } 1213 1214 s.lastPacketReceivedTime = rcvTime 1215 s.firstAckElicitingPacketAfterIdleSentTime = time.Time{} 1216 s.keepAlivePingSent = false 1217 1218 var log func([]logging.Frame) 1219 if s.tracer != nil { 1220 log = func(frames []logging.Frame) { 1221 s.tracer.ReceivedLongHeaderPacket(packet.hdr, packetSize, frames) 1222 } 1223 } 1224 isAckEliciting, err := s.handleFrames(packet.data, packet.hdr.DestConnectionID, packet.encryptionLevel, log) 1225 if err != nil { 1226 return err 1227 } 1228 return s.receivedPacketHandler.ReceivedPacket(packet.hdr.PacketNumber, ecn, packet.encryptionLevel, rcvTime, isAckEliciting) 1229 } 1230 1231 func (s *connection) handleUnpackedShortHeaderPacket( 1232 destConnID protocol.ConnectionID, 1233 pn protocol.PacketNumber, 1234 data []byte, 1235 ecn protocol.ECN, 1236 rcvTime time.Time, 1237 log func([]logging.Frame), 1238 ) error { 1239 s.lastPacketReceivedTime = rcvTime 1240 s.firstAckElicitingPacketAfterIdleSentTime = time.Time{} 1241 s.keepAlivePingSent = false 1242 1243 isAckEliciting, err := s.handleFrames(data, destConnID, protocol.Encryption1RTT, log) 1244 if err != nil { 1245 return err 1246 } 1247 return s.receivedPacketHandler.ReceivedPacket(pn, ecn, protocol.Encryption1RTT, rcvTime, isAckEliciting) 1248 } 1249 1250 func (s *connection) handleFrames( 1251 data []byte, 1252 destConnID protocol.ConnectionID, 1253 encLevel protocol.EncryptionLevel, 1254 log func([]logging.Frame), 1255 ) (isAckEliciting bool, _ error) { 1256 // Only used for tracing. 1257 // If we're not tracing, this slice will always remain empty. 1258 var frames []logging.Frame 1259 if log != nil { 1260 frames = make([]logging.Frame, 0, 4) 1261 } 1262 var handleErr error 1263 for len(data) > 0 { 1264 l, frame, err := s.frameParser.ParseNext(data, encLevel, s.version) 1265 if err != nil { 1266 return false, err 1267 } 1268 data = data[l:] 1269 if frame == nil { 1270 break 1271 } 1272 if ackhandler.IsFrameAckEliciting(frame) { 1273 isAckEliciting = true 1274 } 1275 if log != nil { 1276 frames = append(frames, logutils.ConvertFrame(frame)) 1277 } 1278 // An error occurred handling a previous frame. 1279 // Don't handle the current frame. 1280 if handleErr != nil { 1281 continue 1282 } 1283 if err := s.handleFrame(frame, encLevel, destConnID); err != nil { 1284 if log == nil { 1285 return false, err 1286 } 1287 // If we're logging, we need to keep parsing (but not handling) all frames. 1288 handleErr = err 1289 } 1290 } 1291 1292 if log != nil { 1293 log(frames) 1294 if handleErr != nil { 1295 return false, handleErr 1296 } 1297 } 1298 return 1299 } 1300 1301 func (s *connection) handleFrame(f wire.Frame, encLevel protocol.EncryptionLevel, destConnID protocol.ConnectionID) error { 1302 var err error 1303 wire.LogFrame(s.logger, f, false) 1304 switch frame := f.(type) { 1305 case *wire.CryptoFrame: 1306 err = s.handleCryptoFrame(frame, encLevel) 1307 case *wire.StreamFrame: 1308 err = s.handleStreamFrame(frame) 1309 case *wire.AckFrame: 1310 err = s.handleAckFrame(frame, encLevel) 1311 case *wire.ConnectionCloseFrame: 1312 s.handleConnectionCloseFrame(frame) 1313 case *wire.ResetStreamFrame: 1314 err = s.handleResetStreamFrame(frame) 1315 case *wire.MaxDataFrame: 1316 s.handleMaxDataFrame(frame) 1317 case *wire.MaxStreamDataFrame: 1318 err = s.handleMaxStreamDataFrame(frame) 1319 case *wire.MaxStreamsFrame: 1320 s.handleMaxStreamsFrame(frame) 1321 case *wire.DataBlockedFrame: 1322 case *wire.StreamDataBlockedFrame: 1323 case *wire.StreamsBlockedFrame: 1324 case *wire.StopSendingFrame: 1325 err = s.handleStopSendingFrame(frame) 1326 case *wire.PingFrame: 1327 case *wire.PathChallengeFrame: 1328 s.handlePathChallengeFrame(frame) 1329 case *wire.PathResponseFrame: 1330 // since we don't send PATH_CHALLENGEs, we don't expect PATH_RESPONSEs 1331 err = errors.New("unexpected PATH_RESPONSE frame") 1332 case *wire.NewTokenFrame: 1333 err = s.handleNewTokenFrame(frame) 1334 case *wire.NewConnectionIDFrame: 1335 err = s.handleNewConnectionIDFrame(frame) 1336 case *wire.RetireConnectionIDFrame: 1337 err = s.handleRetireConnectionIDFrame(frame, destConnID) 1338 case *wire.HandshakeDoneFrame: 1339 err = s.handleHandshakeDoneFrame() 1340 case *wire.DatagramFrame: 1341 err = s.handleDatagramFrame(frame) 1342 default: 1343 err = fmt.Errorf("unexpected frame type: %s", reflect.ValueOf(&frame).Elem().Type().Name()) 1344 } 1345 return err 1346 } 1347 1348 // handlePacket is called by the server with a new packet 1349 func (s *connection) handlePacket(p receivedPacket) { 1350 // Discard packets once the amount of queued packets is larger than 1351 // the channel size, protocol.MaxConnUnprocessedPackets 1352 select { 1353 case s.receivedPackets <- p: 1354 default: 1355 if s.tracer != nil { 1356 s.tracer.DroppedPacket(logging.PacketTypeNotDetermined, p.Size(), logging.PacketDropDOSPrevention) 1357 } 1358 } 1359 } 1360 1361 func (s *connection) handleConnectionCloseFrame(frame *wire.ConnectionCloseFrame) { 1362 if frame.IsApplicationError { 1363 s.closeRemote(&qerr.ApplicationError{ 1364 Remote: true, 1365 ErrorCode: qerr.ApplicationErrorCode(frame.ErrorCode), 1366 ErrorMessage: frame.ReasonPhrase, 1367 }) 1368 return 1369 } 1370 s.closeRemote(&qerr.TransportError{ 1371 Remote: true, 1372 ErrorCode: qerr.TransportErrorCode(frame.ErrorCode), 1373 FrameType: frame.FrameType, 1374 ErrorMessage: frame.ReasonPhrase, 1375 }) 1376 } 1377 1378 func (s *connection) handleCryptoFrame(frame *wire.CryptoFrame, encLevel protocol.EncryptionLevel) error { 1379 return s.cryptoStreamManager.HandleCryptoFrame(frame, encLevel) 1380 } 1381 1382 func (s *connection) receivedReadKeys() { 1383 // Queue all packets for decryption that have been undecryptable so far. 1384 s.undecryptablePacketsToProcess = s.undecryptablePackets 1385 s.undecryptablePackets = nil 1386 } 1387 1388 func (s *connection) handleStreamFrame(frame *wire.StreamFrame) error { 1389 str, err := s.streamsMap.GetOrOpenReceiveStream(frame.StreamID) 1390 if err != nil { 1391 return err 1392 } 1393 if str == nil { 1394 // Stream is closed and already garbage collected 1395 // ignore this StreamFrame 1396 return nil 1397 } 1398 return str.handleStreamFrame(frame) 1399 } 1400 1401 func (s *connection) handleMaxDataFrame(frame *wire.MaxDataFrame) { 1402 s.connFlowController.UpdateSendWindow(frame.MaximumData) 1403 } 1404 1405 func (s *connection) handleMaxStreamDataFrame(frame *wire.MaxStreamDataFrame) error { 1406 str, err := s.streamsMap.GetOrOpenSendStream(frame.StreamID) 1407 if err != nil { 1408 return err 1409 } 1410 if str == nil { 1411 // stream is closed and already garbage collected 1412 return nil 1413 } 1414 str.updateSendWindow(frame.MaximumStreamData) 1415 return nil 1416 } 1417 1418 func (s *connection) handleMaxStreamsFrame(frame *wire.MaxStreamsFrame) { 1419 s.streamsMap.HandleMaxStreamsFrame(frame) 1420 } 1421 1422 func (s *connection) handleResetStreamFrame(frame *wire.ResetStreamFrame) error { 1423 str, err := s.streamsMap.GetOrOpenReceiveStream(frame.StreamID) 1424 if err != nil { 1425 return err 1426 } 1427 if str == nil { 1428 // stream is closed and already garbage collected 1429 return nil 1430 } 1431 return str.handleResetStreamFrame(frame) 1432 } 1433 1434 func (s *connection) handleStopSendingFrame(frame *wire.StopSendingFrame) error { 1435 str, err := s.streamsMap.GetOrOpenSendStream(frame.StreamID) 1436 if err != nil { 1437 return err 1438 } 1439 if str == nil { 1440 // stream is closed and already garbage collected 1441 return nil 1442 } 1443 str.handleStopSendingFrame(frame) 1444 return nil 1445 } 1446 1447 func (s *connection) handlePathChallengeFrame(frame *wire.PathChallengeFrame) { 1448 s.queueControlFrame(&wire.PathResponseFrame{Data: frame.Data}) 1449 } 1450 1451 func (s *connection) handleNewTokenFrame(frame *wire.NewTokenFrame) error { 1452 if s.perspective == protocol.PerspectiveServer { 1453 return &qerr.TransportError{ 1454 ErrorCode: qerr.ProtocolViolation, 1455 ErrorMessage: "received NEW_TOKEN frame from the client", 1456 } 1457 } 1458 if s.config.TokenStore != nil { 1459 s.config.TokenStore.Put(s.tokenStoreKey, &ClientToken{data: frame.Token}) 1460 } 1461 return nil 1462 } 1463 1464 func (s *connection) handleNewConnectionIDFrame(f *wire.NewConnectionIDFrame) error { 1465 return s.connIDManager.Add(f) 1466 } 1467 1468 func (s *connection) handleRetireConnectionIDFrame(f *wire.RetireConnectionIDFrame, destConnID protocol.ConnectionID) error { 1469 return s.connIDGenerator.Retire(f.SequenceNumber, destConnID) 1470 } 1471 1472 func (s *connection) handleHandshakeDoneFrame() error { 1473 if s.perspective == protocol.PerspectiveServer { 1474 return &qerr.TransportError{ 1475 ErrorCode: qerr.ProtocolViolation, 1476 ErrorMessage: "received a HANDSHAKE_DONE frame", 1477 } 1478 } 1479 if !s.handshakeConfirmed { 1480 s.handleHandshakeConfirmed() 1481 } 1482 return nil 1483 } 1484 1485 func (s *connection) handleAckFrame(frame *wire.AckFrame, encLevel protocol.EncryptionLevel) error { 1486 acked1RTTPacket, err := s.sentPacketHandler.ReceivedAck(frame, encLevel, s.lastPacketReceivedTime) 1487 if err != nil { 1488 return err 1489 } 1490 if !acked1RTTPacket { 1491 return nil 1492 } 1493 if s.perspective == protocol.PerspectiveClient && !s.handshakeConfirmed { 1494 s.handleHandshakeConfirmed() 1495 } 1496 return s.cryptoStreamHandler.SetLargest1RTTAcked(frame.LargestAcked()) 1497 } 1498 1499 func (s *connection) handleDatagramFrame(f *wire.DatagramFrame) error { 1500 if f.Length(s.version) > protocol.MaxDatagramFrameSize { 1501 return &qerr.TransportError{ 1502 ErrorCode: qerr.ProtocolViolation, 1503 ErrorMessage: "DATAGRAM frame too large", 1504 } 1505 } 1506 s.datagramQueue.HandleDatagramFrame(f) 1507 return nil 1508 } 1509 1510 // closeLocal closes the connection and send a CONNECTION_CLOSE containing the error 1511 func (s *connection) closeLocal(e error) { 1512 s.closeOnce.Do(func() { 1513 if e == nil { 1514 s.logger.Infof("Closing connection.") 1515 } else { 1516 s.logger.Errorf("Closing connection with error: %s", e) 1517 } 1518 s.closeChan <- closeError{err: e, immediate: false, remote: false} 1519 }) 1520 } 1521 1522 // destroy closes the connection without sending the error on the wire 1523 func (s *connection) destroy(e error) { 1524 s.destroyImpl(e) 1525 <-s.ctx.Done() 1526 } 1527 1528 func (s *connection) destroyImpl(e error) { 1529 s.closeOnce.Do(func() { 1530 if nerr, ok := e.(net.Error); ok && nerr.Timeout() { 1531 s.logger.Errorf("Destroying connection: %s", e) 1532 } else { 1533 s.logger.Errorf("Destroying connection with error: %s", e) 1534 } 1535 s.closeChan <- closeError{err: e, immediate: true, remote: false} 1536 }) 1537 } 1538 1539 func (s *connection) closeRemote(e error) { 1540 s.closeOnce.Do(func() { 1541 s.logger.Errorf("Peer closed connection with error: %s", e) 1542 s.closeChan <- closeError{err: e, immediate: true, remote: true} 1543 }) 1544 } 1545 1546 // Close the connection. It sends a NO_ERROR application error. 1547 // It waits until the run loop has stopped before returning 1548 func (s *connection) shutdown() { 1549 s.closeLocal(nil) 1550 <-s.ctx.Done() 1551 } 1552 1553 func (s *connection) CloseWithError(code ApplicationErrorCode, desc string) error { 1554 s.closeLocal(&qerr.ApplicationError{ 1555 ErrorCode: code, 1556 ErrorMessage: desc, 1557 }) 1558 <-s.ctx.Done() 1559 return nil 1560 } 1561 1562 func (s *connection) handleCloseError(closeErr *closeError) { 1563 e := closeErr.err 1564 if e == nil { 1565 e = &qerr.ApplicationError{} 1566 } else { 1567 defer func() { 1568 closeErr.err = e 1569 }() 1570 } 1571 1572 var ( 1573 statelessResetErr *StatelessResetError 1574 versionNegotiationErr *VersionNegotiationError 1575 recreateErr *errCloseForRecreating 1576 applicationErr *ApplicationError 1577 transportErr *TransportError 1578 ) 1579 switch { 1580 case errors.Is(e, qerr.ErrIdleTimeout), 1581 errors.Is(e, qerr.ErrHandshakeTimeout), 1582 errors.As(e, &statelessResetErr), 1583 errors.As(e, &versionNegotiationErr), 1584 errors.As(e, &recreateErr), 1585 errors.As(e, &applicationErr), 1586 errors.As(e, &transportErr): 1587 default: 1588 e = &qerr.TransportError{ 1589 ErrorCode: qerr.InternalError, 1590 ErrorMessage: e.Error(), 1591 } 1592 } 1593 1594 s.streamsMap.CloseWithError(e) 1595 s.connIDManager.Close() 1596 if s.datagramQueue != nil { 1597 s.datagramQueue.CloseWithError(e) 1598 } 1599 1600 if s.tracer != nil && !errors.As(e, &recreateErr) { 1601 s.tracer.ClosedConnection(e) 1602 } 1603 1604 // If this is a remote close we're done here 1605 if closeErr.remote { 1606 s.connIDGenerator.ReplaceWithClosed(s.perspective, nil) 1607 return 1608 } 1609 if closeErr.immediate { 1610 s.connIDGenerator.RemoveAll() 1611 return 1612 } 1613 // Don't send out any CONNECTION_CLOSE if this is an error that occurred 1614 // before we even sent out the first packet. 1615 if s.perspective == protocol.PerspectiveClient && !s.sentFirstPacket { 1616 s.connIDGenerator.RemoveAll() 1617 return 1618 } 1619 connClosePacket, err := s.sendConnectionClose(e) 1620 if err != nil { 1621 s.logger.Debugf("Error sending CONNECTION_CLOSE: %s", err) 1622 } 1623 s.connIDGenerator.ReplaceWithClosed(s.perspective, connClosePacket) 1624 } 1625 1626 func (s *connection) dropEncryptionLevel(encLevel protocol.EncryptionLevel) { 1627 if s.tracer != nil { 1628 s.tracer.DroppedEncryptionLevel(encLevel) 1629 } 1630 s.sentPacketHandler.DropPackets(encLevel) 1631 s.receivedPacketHandler.DropPackets(encLevel) 1632 if err := s.cryptoStreamManager.Drop(encLevel); err != nil { 1633 s.closeLocal(err) 1634 return 1635 } 1636 if encLevel == protocol.Encryption0RTT { 1637 s.streamsMap.ResetFor0RTT() 1638 if err := s.connFlowController.Reset(); err != nil { 1639 s.closeLocal(err) 1640 } 1641 if err := s.framer.Handle0RTTRejection(); err != nil { 1642 s.closeLocal(err) 1643 } 1644 } 1645 } 1646 1647 // is called for the client, when restoring transport parameters saved for 0-RTT 1648 func (s *connection) restoreTransportParameters(params *wire.TransportParameters) { 1649 if s.logger.Debug() { 1650 s.logger.Debugf("Restoring Transport Parameters: %s", params) 1651 } 1652 1653 s.peerParams = params 1654 s.connIDGenerator.SetMaxActiveConnIDs(params.ActiveConnectionIDLimit) 1655 s.connFlowController.UpdateSendWindow(params.InitialMaxData) 1656 s.streamsMap.UpdateLimits(params) 1657 s.connStateMutex.Lock() 1658 s.connState.SupportsDatagrams = s.supportsDatagrams() 1659 s.connStateMutex.Unlock() 1660 } 1661 1662 func (s *connection) handleTransportParameters(params *wire.TransportParameters) { 1663 if err := s.checkTransportParameters(params); err != nil { 1664 s.closeLocal(&qerr.TransportError{ 1665 ErrorCode: qerr.TransportParameterError, 1666 ErrorMessage: err.Error(), 1667 }) 1668 return 1669 } 1670 s.peerParams = params 1671 // On the client side we have to wait for handshake completion. 1672 // During a 0-RTT connection, we are only allowed to use the new transport parameters for 1-RTT packets. 1673 if s.perspective == protocol.PerspectiveServer { 1674 s.applyTransportParameters() 1675 // On the server side, the early connection is ready as soon as we processed 1676 // the client's transport parameters. 1677 close(s.earlyConnReadyChan) 1678 } 1679 1680 s.connStateMutex.Lock() 1681 s.connState.SupportsDatagrams = s.supportsDatagrams() 1682 s.connStateMutex.Unlock() 1683 } 1684 1685 func (s *connection) checkTransportParameters(params *wire.TransportParameters) error { 1686 if s.logger.Debug() { 1687 s.logger.Debugf("Processed Transport Parameters: %s", params) 1688 } 1689 if s.tracer != nil { 1690 s.tracer.ReceivedTransportParameters(params) 1691 } 1692 1693 // check the initial_source_connection_id 1694 if params.InitialSourceConnectionID != s.handshakeDestConnID { 1695 return fmt.Errorf("expected initial_source_connection_id to equal %s, is %s", s.handshakeDestConnID, params.InitialSourceConnectionID) 1696 } 1697 1698 if s.perspective == protocol.PerspectiveServer { 1699 return nil 1700 } 1701 // check the original_destination_connection_id 1702 if params.OriginalDestinationConnectionID != s.origDestConnID { 1703 return fmt.Errorf("expected original_destination_connection_id to equal %s, is %s", s.origDestConnID, params.OriginalDestinationConnectionID) 1704 } 1705 if s.retrySrcConnID != nil { // a Retry was performed 1706 if params.RetrySourceConnectionID == nil { 1707 return errors.New("missing retry_source_connection_id") 1708 } 1709 if *params.RetrySourceConnectionID != *s.retrySrcConnID { 1710 return fmt.Errorf("expected retry_source_connection_id to equal %s, is %s", s.retrySrcConnID, *params.RetrySourceConnectionID) 1711 } 1712 } else if params.RetrySourceConnectionID != nil { 1713 return errors.New("received retry_source_connection_id, although no Retry was performed") 1714 } 1715 return nil 1716 } 1717 1718 func (s *connection) applyTransportParameters() { 1719 params := s.peerParams 1720 // Our local idle timeout will always be > 0. 1721 s.idleTimeout = utils.MinNonZeroDuration(s.config.MaxIdleTimeout, params.MaxIdleTimeout) 1722 s.keepAliveInterval = utils.Min(s.config.KeepAlivePeriod, utils.Min(s.idleTimeout/2, protocol.MaxKeepAliveInterval)) 1723 s.streamsMap.UpdateLimits(params) 1724 s.frameParser.SetAckDelayExponent(params.AckDelayExponent) 1725 s.connFlowController.UpdateSendWindow(params.InitialMaxData) 1726 s.rttStats.SetMaxAckDelay(params.MaxAckDelay) 1727 s.connIDGenerator.SetMaxActiveConnIDs(params.ActiveConnectionIDLimit) 1728 if params.StatelessResetToken != nil { 1729 s.connIDManager.SetStatelessResetToken(*params.StatelessResetToken) 1730 } 1731 // We don't support connection migration yet, so we don't have any use for the preferred_address. 1732 if params.PreferredAddress != nil { 1733 // Retire the connection ID. 1734 s.connIDManager.AddFromPreferredAddress(params.PreferredAddress.ConnectionID, params.PreferredAddress.StatelessResetToken) 1735 } 1736 } 1737 1738 func (s *connection) triggerSending() error { 1739 s.pacingDeadline = time.Time{} 1740 now := time.Now() 1741 1742 sendMode := s.sentPacketHandler.SendMode(now) 1743 //nolint:exhaustive // No need to handle pacing limited here. 1744 switch sendMode { 1745 case ackhandler.SendAny: 1746 return s.sendPackets(now) 1747 case ackhandler.SendNone: 1748 return nil 1749 case ackhandler.SendPacingLimited: 1750 deadline := s.sentPacketHandler.TimeUntilSend() 1751 if deadline.IsZero() { 1752 deadline = deadlineSendImmediately 1753 } 1754 s.pacingDeadline = deadline 1755 // Allow sending of an ACK if we're pacing limit. 1756 // This makes sure that a peer that is mostly receiving data (and thus has an inaccurate cwnd estimate) 1757 // sends enough ACKs to allow its peer to utilize the bandwidth. 1758 fallthrough 1759 case ackhandler.SendAck: 1760 // We can at most send a single ACK only packet. 1761 // There will only be a new ACK after receiving new packets. 1762 // SendAck is only returned when we're congestion limited, so we don't need to set the pacinggs timer. 1763 return s.maybeSendAckOnlyPacket(now) 1764 case ackhandler.SendPTOInitial: 1765 if err := s.sendProbePacket(protocol.EncryptionInitial, now); err != nil { 1766 return err 1767 } 1768 if s.sendQueue.WouldBlock() { 1769 s.scheduleSending() 1770 return nil 1771 } 1772 return s.triggerSending() 1773 case ackhandler.SendPTOHandshake: 1774 if err := s.sendProbePacket(protocol.EncryptionHandshake, now); err != nil { 1775 return err 1776 } 1777 if s.sendQueue.WouldBlock() { 1778 s.scheduleSending() 1779 return nil 1780 } 1781 return s.triggerSending() 1782 case ackhandler.SendPTOAppData: 1783 if err := s.sendProbePacket(protocol.Encryption1RTT, now); err != nil { 1784 return err 1785 } 1786 if s.sendQueue.WouldBlock() { 1787 s.scheduleSending() 1788 return nil 1789 } 1790 return s.triggerSending() 1791 default: 1792 return fmt.Errorf("BUG: invalid send mode %d", sendMode) 1793 } 1794 } 1795 1796 func (s *connection) sendPackets(now time.Time) error { 1797 // Path MTU Discovery 1798 // Can't use GSO, since we need to send a single packet that's larger than our current maximum size. 1799 // Performance-wise, this doesn't matter, since we only send a very small (<10) number of 1800 // MTU probe packets per connection. 1801 if s.handshakeConfirmed && s.mtuDiscoverer != nil && s.mtuDiscoverer.ShouldSendProbe(now) { 1802 ping, size := s.mtuDiscoverer.GetPing() 1803 p, buf, err := s.packer.PackMTUProbePacket(ping, size, s.version) 1804 if err != nil { 1805 return err 1806 } 1807 s.logShortHeaderPacket(p.DestConnID, p.Ack, p.Frames, p.StreamFrames, p.PacketNumber, p.PacketNumberLen, p.KeyPhase, buf.Len(), false) 1808 s.registerPackedShortHeaderPacket(p, now) 1809 s.sendQueue.Send(buf, buf.Len()) 1810 // This is kind of a hack. We need to trigger sending again somehow. 1811 s.pacingDeadline = deadlineSendImmediately 1812 return nil 1813 } 1814 1815 if isBlocked, offset := s.connFlowController.IsNewlyBlocked(); isBlocked { 1816 s.framer.QueueControlFrame(&wire.DataBlockedFrame{MaximumData: offset}) 1817 } 1818 s.windowUpdateQueue.QueueAll() 1819 if cf := s.cryptoStreamManager.GetPostHandshakeData(protocol.MaxPostHandshakeCryptoFrameSize); cf != nil { 1820 s.queueControlFrame(cf) 1821 } 1822 1823 if !s.handshakeConfirmed { 1824 packet, err := s.packer.PackCoalescedPacket(false, s.mtuDiscoverer.CurrentSize(), s.version) 1825 if err != nil || packet == nil { 1826 return err 1827 } 1828 s.sentFirstPacket = true 1829 s.sendPackedCoalescedPacket(packet, now) 1830 sendMode := s.sentPacketHandler.SendMode(now) 1831 if sendMode == ackhandler.SendPacingLimited { 1832 s.resetPacingDeadline() 1833 } else if sendMode == ackhandler.SendAny { 1834 s.pacingDeadline = deadlineSendImmediately 1835 } 1836 return nil 1837 } 1838 1839 if s.conn.capabilities().GSO { 1840 return s.sendPacketsWithGSO(now) 1841 } 1842 return s.sendPacketsWithoutGSO(now) 1843 } 1844 1845 func (s *connection) sendPacketsWithoutGSO(now time.Time) error { 1846 for { 1847 buf := getPacketBuffer() 1848 if _, err := s.appendPacket(buf, s.mtuDiscoverer.CurrentSize(), now); err != nil { 1849 if err == errNothingToPack { 1850 buf.Release() 1851 return nil 1852 } 1853 return err 1854 } 1855 1856 s.sendQueue.Send(buf, buf.Len()) 1857 1858 if s.sendQueue.WouldBlock() { 1859 return nil 1860 } 1861 sendMode := s.sentPacketHandler.SendMode(now) 1862 if sendMode == ackhandler.SendPacingLimited { 1863 s.resetPacingDeadline() 1864 return nil 1865 } 1866 if sendMode != ackhandler.SendAny { 1867 return nil 1868 } 1869 // Prioritize receiving of packets over sending out more packets. 1870 if len(s.receivedPackets) > 0 { 1871 s.pacingDeadline = deadlineSendImmediately 1872 return nil 1873 } 1874 } 1875 } 1876 1877 func (s *connection) sendPacketsWithGSO(now time.Time) error { 1878 buf := getLargePacketBuffer() 1879 maxSize := s.mtuDiscoverer.CurrentSize() 1880 1881 for { 1882 var dontSendMore bool 1883 size, err := s.appendPacket(buf, maxSize, now) 1884 if err != nil { 1885 if err != errNothingToPack { 1886 return err 1887 } 1888 if buf.Len() == 0 { 1889 buf.Release() 1890 return nil 1891 } 1892 dontSendMore = true 1893 } 1894 1895 if !dontSendMore { 1896 sendMode := s.sentPacketHandler.SendMode(now) 1897 if sendMode == ackhandler.SendPacingLimited { 1898 s.resetPacingDeadline() 1899 } 1900 if sendMode != ackhandler.SendAny { 1901 dontSendMore = true 1902 } 1903 } 1904 1905 // Append another packet if 1906 // 1. The congestion controller and pacer allow sending more 1907 // 2. The last packet appended was a full-size packet 1908 // 3. We still have enough space for another full-size packet in the buffer 1909 if !dontSendMore && size == maxSize && buf.Len()+maxSize <= buf.Cap() { 1910 continue 1911 } 1912 1913 s.sendQueue.Send(buf, maxSize) 1914 1915 if dontSendMore { 1916 return nil 1917 } 1918 if s.sendQueue.WouldBlock() { 1919 return nil 1920 } 1921 1922 // Prioritize receiving of packets over sending out more packets. 1923 if len(s.receivedPackets) > 0 { 1924 s.pacingDeadline = deadlineSendImmediately 1925 return nil 1926 } 1927 1928 buf = getLargePacketBuffer() 1929 } 1930 } 1931 1932 func (s *connection) resetPacingDeadline() { 1933 deadline := s.sentPacketHandler.TimeUntilSend() 1934 if deadline.IsZero() { 1935 deadline = deadlineSendImmediately 1936 } 1937 s.pacingDeadline = deadline 1938 } 1939 1940 func (s *connection) maybeSendAckOnlyPacket(now time.Time) error { 1941 if !s.handshakeConfirmed { 1942 packet, err := s.packer.PackCoalescedPacket(true, s.mtuDiscoverer.CurrentSize(), s.version) 1943 if err != nil { 1944 return err 1945 } 1946 if packet == nil { 1947 return nil 1948 } 1949 s.sendPackedCoalescedPacket(packet, time.Now()) 1950 return nil 1951 } 1952 1953 p, buf, err := s.packer.PackAckOnlyPacket(s.mtuDiscoverer.CurrentSize(), s.version) 1954 if err != nil { 1955 if err == errNothingToPack { 1956 return nil 1957 } 1958 return err 1959 } 1960 s.logShortHeaderPacket(p.DestConnID, p.Ack, p.Frames, p.StreamFrames, p.PacketNumber, p.PacketNumberLen, p.KeyPhase, buf.Len(), false) 1961 s.registerPackedShortHeaderPacket(p, now) 1962 s.sendQueue.Send(buf, buf.Len()) 1963 return nil 1964 } 1965 1966 func (s *connection) sendProbePacket(encLevel protocol.EncryptionLevel, now time.Time) error { 1967 // Queue probe packets until we actually send out a packet, 1968 // or until there are no more packets to queue. 1969 var packet *coalescedPacket 1970 for { 1971 if wasQueued := s.sentPacketHandler.QueueProbePacket(encLevel); !wasQueued { 1972 break 1973 } 1974 var err error 1975 packet, err = s.packer.MaybePackProbePacket(encLevel, s.mtuDiscoverer.CurrentSize(), s.version) 1976 if err != nil { 1977 return err 1978 } 1979 if packet != nil { 1980 break 1981 } 1982 } 1983 if packet == nil { 1984 s.retransmissionQueue.AddPing(encLevel) 1985 var err error 1986 packet, err = s.packer.MaybePackProbePacket(encLevel, s.mtuDiscoverer.CurrentSize(), s.version) 1987 if err != nil { 1988 return err 1989 } 1990 } 1991 if packet == nil || (len(packet.longHdrPackets) == 0 && packet.shortHdrPacket == nil) { 1992 return fmt.Errorf("connection BUG: couldn't pack %s probe packet", encLevel) 1993 } 1994 s.sendPackedCoalescedPacket(packet, now) 1995 return nil 1996 } 1997 1998 // appendPacket appends a new packet to the given packetBuffer. 1999 // If there was nothing to pack, the returned size is 0. 2000 func (s *connection) appendPacket(buf *packetBuffer, maxSize protocol.ByteCount, now time.Time) (protocol.ByteCount, error) { 2001 startLen := buf.Len() 2002 p, err := s.packer.AppendPacket(buf, maxSize, s.version) 2003 if err != nil { 2004 return 0, err 2005 } 2006 size := buf.Len() - startLen 2007 s.logShortHeaderPacket(p.DestConnID, p.Ack, p.Frames, p.StreamFrames, p.PacketNumber, p.PacketNumberLen, p.KeyPhase, size, false) 2008 s.registerPackedShortHeaderPacket(p, now) 2009 return size, nil 2010 } 2011 2012 func (s *connection) registerPackedShortHeaderPacket(p shortHeaderPacket, now time.Time) { 2013 if s.firstAckElicitingPacketAfterIdleSentTime.IsZero() && (len(p.StreamFrames) > 0 || ackhandler.HasAckElicitingFrames(p.Frames)) { 2014 s.firstAckElicitingPacketAfterIdleSentTime = now 2015 } 2016 2017 largestAcked := protocol.InvalidPacketNumber 2018 if p.Ack != nil { 2019 largestAcked = p.Ack.LargestAcked() 2020 } 2021 s.sentPacketHandler.SentPacket(now, p.PacketNumber, largestAcked, p.StreamFrames, p.Frames, protocol.Encryption1RTT, p.Length, p.IsPathMTUProbePacket) 2022 s.connIDManager.SentPacket() 2023 } 2024 2025 func (s *connection) sendPackedCoalescedPacket(packet *coalescedPacket, now time.Time) { 2026 s.logCoalescedPacket(packet) 2027 for _, p := range packet.longHdrPackets { 2028 if s.firstAckElicitingPacketAfterIdleSentTime.IsZero() && p.IsAckEliciting() { 2029 s.firstAckElicitingPacketAfterIdleSentTime = now 2030 } 2031 largestAcked := protocol.InvalidPacketNumber 2032 if p.ack != nil { 2033 largestAcked = p.ack.LargestAcked() 2034 } 2035 s.sentPacketHandler.SentPacket(now, p.header.PacketNumber, largestAcked, p.streamFrames, p.frames, p.EncryptionLevel(), p.length, false) 2036 } 2037 if p := packet.shortHdrPacket; p != nil { 2038 if s.firstAckElicitingPacketAfterIdleSentTime.IsZero() && p.IsAckEliciting() { 2039 s.firstAckElicitingPacketAfterIdleSentTime = now 2040 } 2041 largestAcked := protocol.InvalidPacketNumber 2042 if p.Ack != nil { 2043 largestAcked = p.Ack.LargestAcked() 2044 } 2045 s.sentPacketHandler.SentPacket(now, p.PacketNumber, largestAcked, p.StreamFrames, p.Frames, protocol.Encryption1RTT, p.Length, p.IsPathMTUProbePacket) 2046 } 2047 s.connIDManager.SentPacket() 2048 s.sendQueue.Send(packet.buffer, packet.buffer.Len()) 2049 } 2050 2051 func (s *connection) sendConnectionClose(e error) ([]byte, error) { 2052 var packet *coalescedPacket 2053 var err error 2054 var transportErr *qerr.TransportError 2055 var applicationErr *qerr.ApplicationError 2056 if errors.As(e, &transportErr) { 2057 packet, err = s.packer.PackConnectionClose(transportErr, s.mtuDiscoverer.CurrentSize(), s.version) 2058 } else if errors.As(e, &applicationErr) { 2059 packet, err = s.packer.PackApplicationClose(applicationErr, s.mtuDiscoverer.CurrentSize(), s.version) 2060 } else { 2061 packet, err = s.packer.PackConnectionClose(&qerr.TransportError{ 2062 ErrorCode: qerr.InternalError, 2063 ErrorMessage: fmt.Sprintf("connection BUG: unspecified error type (msg: %s)", e.Error()), 2064 }, s.mtuDiscoverer.CurrentSize(), s.version) 2065 } 2066 if err != nil { 2067 return nil, err 2068 } 2069 s.logCoalescedPacket(packet) 2070 return packet.buffer.Data, s.conn.Write(packet.buffer.Data, packet.buffer.Len()) 2071 } 2072 2073 func (s *connection) logLongHeaderPacket(p *longHeaderPacket) { 2074 // quic-go logging 2075 if s.logger.Debug() { 2076 p.header.Log(s.logger) 2077 if p.ack != nil { 2078 wire.LogFrame(s.logger, p.ack, true) 2079 } 2080 for _, frame := range p.frames { 2081 wire.LogFrame(s.logger, frame.Frame, true) 2082 } 2083 for _, frame := range p.streamFrames { 2084 wire.LogFrame(s.logger, frame.Frame, true) 2085 } 2086 } 2087 2088 // tracing 2089 if s.tracer != nil { 2090 frames := make([]logging.Frame, 0, len(p.frames)) 2091 for _, f := range p.frames { 2092 frames = append(frames, logutils.ConvertFrame(f.Frame)) 2093 } 2094 for _, f := range p.streamFrames { 2095 frames = append(frames, logutils.ConvertFrame(f.Frame)) 2096 } 2097 var ack *logging.AckFrame 2098 if p.ack != nil { 2099 ack = logutils.ConvertAckFrame(p.ack) 2100 } 2101 s.tracer.SentLongHeaderPacket(p.header, p.length, ack, frames) 2102 } 2103 } 2104 2105 func (s *connection) logShortHeaderPacket( 2106 destConnID protocol.ConnectionID, 2107 ackFrame *wire.AckFrame, 2108 frames []ackhandler.Frame, 2109 streamFrames []ackhandler.StreamFrame, 2110 pn protocol.PacketNumber, 2111 pnLen protocol.PacketNumberLen, 2112 kp protocol.KeyPhaseBit, 2113 size protocol.ByteCount, 2114 isCoalesced bool, 2115 ) { 2116 if s.logger.Debug() && !isCoalesced { 2117 s.logger.Debugf("-> Sending packet %d (%d bytes) for connection %s, 1-RTT", pn, size, s.logID) 2118 } 2119 // quic-go logging 2120 if s.logger.Debug() { 2121 wire.LogShortHeader(s.logger, destConnID, pn, pnLen, kp) 2122 if ackFrame != nil { 2123 wire.LogFrame(s.logger, ackFrame, true) 2124 } 2125 for _, f := range frames { 2126 wire.LogFrame(s.logger, f.Frame, true) 2127 } 2128 for _, f := range streamFrames { 2129 wire.LogFrame(s.logger, f.Frame, true) 2130 } 2131 } 2132 2133 // tracing 2134 if s.tracer != nil { 2135 fs := make([]logging.Frame, 0, len(frames)+len(streamFrames)) 2136 for _, f := range frames { 2137 fs = append(fs, logutils.ConvertFrame(f.Frame)) 2138 } 2139 for _, f := range streamFrames { 2140 fs = append(fs, logutils.ConvertFrame(f.Frame)) 2141 } 2142 var ack *logging.AckFrame 2143 if ackFrame != nil { 2144 ack = logutils.ConvertAckFrame(ackFrame) 2145 } 2146 s.tracer.SentShortHeaderPacket( 2147 &logging.ShortHeader{ 2148 DestConnectionID: destConnID, 2149 PacketNumber: pn, 2150 PacketNumberLen: pnLen, 2151 KeyPhase: kp, 2152 }, 2153 size, 2154 ack, 2155 fs, 2156 ) 2157 } 2158 } 2159 2160 func (s *connection) logCoalescedPacket(packet *coalescedPacket) { 2161 if s.logger.Debug() { 2162 // There's a short period between dropping both Initial and Handshake keys and completion of the handshake, 2163 // during which we might call PackCoalescedPacket but just pack a short header packet. 2164 if len(packet.longHdrPackets) == 0 && packet.shortHdrPacket != nil { 2165 s.logShortHeaderPacket( 2166 packet.shortHdrPacket.DestConnID, 2167 packet.shortHdrPacket.Ack, 2168 packet.shortHdrPacket.Frames, 2169 packet.shortHdrPacket.StreamFrames, 2170 packet.shortHdrPacket.PacketNumber, 2171 packet.shortHdrPacket.PacketNumberLen, 2172 packet.shortHdrPacket.KeyPhase, 2173 packet.shortHdrPacket.Length, 2174 false, 2175 ) 2176 return 2177 } 2178 if len(packet.longHdrPackets) > 1 { 2179 s.logger.Debugf("-> Sending coalesced packet (%d parts, %d bytes) for connection %s", len(packet.longHdrPackets), packet.buffer.Len(), s.logID) 2180 } else { 2181 s.logger.Debugf("-> Sending packet %d (%d bytes) for connection %s, %s", packet.longHdrPackets[0].header.PacketNumber, packet.buffer.Len(), s.logID, packet.longHdrPackets[0].EncryptionLevel()) 2182 } 2183 } 2184 for _, p := range packet.longHdrPackets { 2185 s.logLongHeaderPacket(p) 2186 } 2187 if p := packet.shortHdrPacket; p != nil { 2188 s.logShortHeaderPacket(p.DestConnID, p.Ack, p.Frames, p.StreamFrames, p.PacketNumber, p.PacketNumberLen, p.KeyPhase, p.Length, true) 2189 } 2190 } 2191 2192 // AcceptStream returns the next stream openend by the peer 2193 func (s *connection) AcceptStream(ctx context.Context) (Stream, error) { 2194 return s.streamsMap.AcceptStream(ctx) 2195 } 2196 2197 func (s *connection) AcceptUniStream(ctx context.Context) (ReceiveStream, error) { 2198 return s.streamsMap.AcceptUniStream(ctx) 2199 } 2200 2201 // OpenStream opens a stream 2202 func (s *connection) OpenStream() (Stream, error) { 2203 return s.streamsMap.OpenStream() 2204 } 2205 2206 func (s *connection) OpenStreamSync(ctx context.Context) (Stream, error) { 2207 return s.streamsMap.OpenStreamSync(ctx) 2208 } 2209 2210 func (s *connection) OpenUniStream() (SendStream, error) { 2211 return s.streamsMap.OpenUniStream() 2212 } 2213 2214 func (s *connection) OpenUniStreamSync(ctx context.Context) (SendStream, error) { 2215 return s.streamsMap.OpenUniStreamSync(ctx) 2216 } 2217 2218 func (s *connection) newFlowController(id protocol.StreamID) flowcontrol.StreamFlowController { 2219 initialSendWindow := s.peerParams.InitialMaxStreamDataUni 2220 if id.Type() == protocol.StreamTypeBidi { 2221 if id.InitiatedBy() == s.perspective { 2222 initialSendWindow = s.peerParams.InitialMaxStreamDataBidiRemote 2223 } else { 2224 initialSendWindow = s.peerParams.InitialMaxStreamDataBidiLocal 2225 } 2226 } 2227 return flowcontrol.NewStreamFlowController( 2228 id, 2229 s.connFlowController, 2230 protocol.ByteCount(s.config.InitialStreamReceiveWindow), 2231 protocol.ByteCount(s.config.MaxStreamReceiveWindow), 2232 initialSendWindow, 2233 s.onHasStreamWindowUpdate, 2234 s.rttStats, 2235 s.logger, 2236 ) 2237 } 2238 2239 // scheduleSending signals that we have data for sending 2240 func (s *connection) scheduleSending() { 2241 select { 2242 case s.sendingScheduled <- struct{}{}: 2243 default: 2244 } 2245 } 2246 2247 // tryQueueingUndecryptablePacket queues a packet for which we're missing the decryption keys. 2248 // The logging.PacketType is only used for logging purposes. 2249 func (s *connection) tryQueueingUndecryptablePacket(p receivedPacket, pt logging.PacketType) { 2250 if s.handshakeComplete { 2251 panic("shouldn't queue undecryptable packets after handshake completion") 2252 } 2253 if len(s.undecryptablePackets)+1 > protocol.MaxUndecryptablePackets { 2254 if s.tracer != nil { 2255 s.tracer.DroppedPacket(pt, p.Size(), logging.PacketDropDOSPrevention) 2256 } 2257 s.logger.Infof("Dropping undecryptable packet (%d bytes). Undecryptable packet queue full.", p.Size()) 2258 return 2259 } 2260 s.logger.Infof("Queueing packet (%d bytes) for later decryption", p.Size()) 2261 if s.tracer != nil { 2262 s.tracer.BufferedPacket(pt, p.Size()) 2263 } 2264 s.undecryptablePackets = append(s.undecryptablePackets, p) 2265 } 2266 2267 func (s *connection) queueControlFrame(f wire.Frame) { 2268 s.framer.QueueControlFrame(f) 2269 s.scheduleSending() 2270 } 2271 2272 func (s *connection) onHasStreamWindowUpdate(id protocol.StreamID) { 2273 s.windowUpdateQueue.AddStream(id) 2274 s.scheduleSending() 2275 } 2276 2277 func (s *connection) onHasConnectionWindowUpdate() { 2278 s.windowUpdateQueue.AddConnection() 2279 s.scheduleSending() 2280 } 2281 2282 func (s *connection) onHasStreamData(id protocol.StreamID) { 2283 s.framer.AddActiveStream(id) 2284 s.scheduleSending() 2285 } 2286 2287 func (s *connection) onStreamCompleted(id protocol.StreamID) { 2288 if err := s.streamsMap.DeleteStream(id); err != nil { 2289 s.closeLocal(err) 2290 } 2291 } 2292 2293 func (s *connection) SendMessage(p []byte) error { 2294 if !s.supportsDatagrams() { 2295 return errors.New("datagram support disabled") 2296 } 2297 2298 f := &wire.DatagramFrame{DataLenPresent: true} 2299 if protocol.ByteCount(len(p)) > f.MaxDataLen(s.peerParams.MaxDatagramFrameSize, s.version) { 2300 return errors.New("message too large") 2301 } 2302 f.Data = make([]byte, len(p)) 2303 copy(f.Data, p) 2304 return s.datagramQueue.AddAndWait(f) 2305 } 2306 2307 func (s *connection) ReceiveMessage(ctx context.Context) ([]byte, error) { 2308 if !s.config.EnableDatagrams { 2309 return nil, errors.New("datagram support disabled") 2310 } 2311 return s.datagramQueue.Receive(ctx) 2312 } 2313 2314 func (s *connection) LocalAddr() net.Addr { 2315 return s.conn.LocalAddr() 2316 } 2317 2318 func (s *connection) RemoteAddr() net.Addr { 2319 return s.conn.RemoteAddr() 2320 } 2321 2322 func (s *connection) getPerspective() protocol.Perspective { 2323 return s.perspective 2324 } 2325 2326 func (s *connection) GetVersion() protocol.VersionNumber { 2327 return s.version 2328 } 2329 2330 func (s *connection) NextConnection() Connection { 2331 <-s.HandshakeComplete() 2332 s.streamsMap.UseResetMaps() 2333 return s 2334 }