connection.go 79 KB

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