connection.go 78 KB

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