@@ -46,11 +46,11 @@ func (c *Conn) handleDatagram(now time.Time, dgram *datagram) (handled bool) {
4646 // https://www.rfc-editor.org/rfc/rfc9000#section-14.1-4
4747 return false
4848 }
49- n = c .handleLongHeader (now , ptype , initialSpace , c .keysInitial .r , buf )
49+ n = c .handleLongHeader (now , dgram , ptype , initialSpace , c .keysInitial .r , buf )
5050 case packetTypeHandshake :
51- n = c .handleLongHeader (now , ptype , handshakeSpace , c .keysHandshake .r , buf )
51+ n = c .handleLongHeader (now , dgram , ptype , handshakeSpace , c .keysHandshake .r , buf )
5252 case packetType1RTT :
53- n = c .handle1RTT (now , buf )
53+ n = c .handle1RTT (now , dgram , buf )
5454 case packetTypeRetry :
5555 c .handleRetry (now , buf )
5656 return true
@@ -86,7 +86,7 @@ func (c *Conn) handleDatagram(now time.Time, dgram *datagram) (handled bool) {
8686 return true
8787}
8888
89- func (c * Conn ) handleLongHeader (now time.Time , ptype packetType , space numberSpace , k fixedKeys , buf []byte ) int {
89+ func (c * Conn ) handleLongHeader (now time.Time , dgram * datagram , ptype packetType , space numberSpace , k fixedKeys , buf []byte ) int {
9090 if ! k .isSet () {
9191 return skipLongHeaderPacket (buf )
9292 }
@@ -125,7 +125,7 @@ func (c *Conn) handleLongHeader(now time.Time, ptype packetType, space numberSpa
125125 c .logLongPacketReceived (p , buf [:n ])
126126 }
127127 c .connIDState .handlePacket (c , p .ptype , p .srcConnID )
128- ackEliciting := c .handleFrames (now , ptype , space , p .payload )
128+ ackEliciting := c .handleFrames (now , dgram , ptype , space , p .payload )
129129 c .acks [space ].receive (now , space , p .num , ackEliciting )
130130 if p .ptype == packetTypeHandshake && c .side == serverSide {
131131 c .loss .validateClientAddress ()
@@ -138,7 +138,7 @@ func (c *Conn) handleLongHeader(now time.Time, ptype packetType, space numberSpa
138138 return n
139139}
140140
141- func (c * Conn ) handle1RTT (now time.Time , buf []byte ) int {
141+ func (c * Conn ) handle1RTT (now time.Time , dgram * datagram , buf []byte ) int {
142142 if ! c .keysAppData .canRead () {
143143 // 1-RTT packets extend to the end of the datagram,
144144 // so skip the remainder of the datagram if we can't parse this.
@@ -175,7 +175,7 @@ func (c *Conn) handle1RTT(now time.Time, buf []byte) int {
175175 if c .logEnabled (QLogLevelPacket ) {
176176 c .log1RTTPacketReceived (p , buf )
177177 }
178- ackEliciting := c .handleFrames (now , packetType1RTT , appDataSpace , p .payload )
178+ ackEliciting := c .handleFrames (now , dgram , packetType1RTT , appDataSpace , p .payload )
179179 c .acks [appDataSpace ].receive (now , appDataSpace , p .num , ackEliciting )
180180 return len (buf )
181181}
@@ -252,7 +252,7 @@ func (c *Conn) handleVersionNegotiation(now time.Time, pkt []byte) {
252252 c .abortImmediately (now , errVersionNegotiation )
253253}
254254
255- func (c * Conn ) handleFrames (now time.Time , ptype packetType , space numberSpace , payload []byte ) (ackEliciting bool ) {
255+ func (c * Conn ) handleFrames (now time.Time , dgram * datagram , ptype packetType , space numberSpace , payload []byte ) (ackEliciting bool ) {
256256 if len (payload ) == 0 {
257257 // "An endpoint MUST treat receipt of a packet containing no frames
258258 // as a connection error of type PROTOCOL_VIOLATION."
@@ -373,6 +373,16 @@ func (c *Conn) handleFrames(now time.Time, ptype packetType, space numberSpace,
373373 return
374374 }
375375 n = c .handleRetireConnectionIDFrame (now , space , payload )
376+ case frameTypePathChallenge :
377+ if ! frameOK (c , ptype , __01 ) {
378+ return
379+ }
380+ n = c .handlePathChallengeFrame (now , dgram , space , payload )
381+ case frameTypePathResponse :
382+ if ! frameOK (c , ptype , ___1 ) {
383+ return
384+ }
385+ n = c .handlePathResponseFrame (now , space , payload )
376386 case frameTypeConnectionCloseTransport :
377387 // Transport CONNECTION_CLOSE is OK in all spaces.
378388 n = c .handleConnectionCloseTransportFrame (now , payload )
@@ -546,6 +556,24 @@ func (c *Conn) handleRetireConnectionIDFrame(now time.Time, space numberSpace, p
546556 return n
547557}
548558
559+ func (c * Conn ) handlePathChallengeFrame (now time.Time , dgram * datagram , space numberSpace , payload []byte ) int {
560+ data , n := consumePathChallengeFrame (payload )
561+ if n < 0 {
562+ return - 1
563+ }
564+ c .handlePathChallenge (now , dgram , data )
565+ return n
566+ }
567+
568+ func (c * Conn ) handlePathResponseFrame (now time.Time , space numberSpace , payload []byte ) int {
569+ data , n := consumePathResponseFrame (payload )
570+ if n < 0 {
571+ return - 1
572+ }
573+ c .handlePathResponse (now , data )
574+ return n
575+ }
576+
549577func (c * Conn ) handleConnectionCloseTransportFrame (now time.Time , payload []byte ) int {
550578 code , _ , reason , n := consumeConnectionCloseTransportFrame (payload )
551579 if n < 0 {
0 commit comments