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  }