@@ -46,11 +46,11 @@ func (c *Conn) handleDatagram(now time.Time, dgram *datagram) (handled bool) {
46
46
// https://www.rfc-editor.org/rfc/rfc9000#section-14.1-4
47
47
return false
48
48
}
49
- n = c .handleLongHeader (now , ptype , initialSpace , c .keysInitial .r , buf )
49
+ n = c .handleLongHeader (now , dgram , ptype , initialSpace , c .keysInitial .r , buf )
50
50
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 )
52
52
case packetType1RTT :
53
- n = c .handle1RTT (now , buf )
53
+ n = c .handle1RTT (now , dgram , buf )
54
54
case packetTypeRetry :
55
55
c .handleRetry (now , buf )
56
56
return true
@@ -86,7 +86,7 @@ func (c *Conn) handleDatagram(now time.Time, dgram *datagram) (handled bool) {
86
86
return true
87
87
}
88
88
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 {
90
90
if ! k .isSet () {
91
91
return skipLongHeaderPacket (buf )
92
92
}
@@ -125,7 +125,7 @@ func (c *Conn) handleLongHeader(now time.Time, ptype packetType, space numberSpa
125
125
c .logLongPacketReceived (p , buf [:n ])
126
126
}
127
127
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 )
129
129
c .acks [space ].receive (now , space , p .num , ackEliciting )
130
130
if p .ptype == packetTypeHandshake && c .side == serverSide {
131
131
c .loss .validateClientAddress ()
@@ -138,7 +138,7 @@ func (c *Conn) handleLongHeader(now time.Time, ptype packetType, space numberSpa
138
138
return n
139
139
}
140
140
141
- func (c * Conn ) handle1RTT (now time.Time , buf []byte ) int {
141
+ func (c * Conn ) handle1RTT (now time.Time , dgram * datagram , buf []byte ) int {
142
142
if ! c .keysAppData .canRead () {
143
143
// 1-RTT packets extend to the end of the datagram,
144
144
// 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 {
175
175
if c .logEnabled (QLogLevelPacket ) {
176
176
c .log1RTTPacketReceived (p , buf )
177
177
}
178
- ackEliciting := c .handleFrames (now , packetType1RTT , appDataSpace , p .payload )
178
+ ackEliciting := c .handleFrames (now , dgram , packetType1RTT , appDataSpace , p .payload )
179
179
c .acks [appDataSpace ].receive (now , appDataSpace , p .num , ackEliciting )
180
180
return len (buf )
181
181
}
@@ -252,7 +252,7 @@ func (c *Conn) handleVersionNegotiation(now time.Time, pkt []byte) {
252
252
c .abortImmediately (now , errVersionNegotiation )
253
253
}
254
254
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 ) {
256
256
if len (payload ) == 0 {
257
257
// "An endpoint MUST treat receipt of a packet containing no frames
258
258
// as a connection error of type PROTOCOL_VIOLATION."
@@ -373,6 +373,16 @@ func (c *Conn) handleFrames(now time.Time, ptype packetType, space numberSpace,
373
373
return
374
374
}
375
375
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 )
376
386
case frameTypeConnectionCloseTransport :
377
387
// Transport CONNECTION_CLOSE is OK in all spaces.
378
388
n = c .handleConnectionCloseTransportFrame (now , payload )
@@ -546,6 +556,24 @@ func (c *Conn) handleRetireConnectionIDFrame(now time.Time, space numberSpace, p
546
556
return n
547
557
}
548
558
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
+
549
577
func (c * Conn ) handleConnectionCloseTransportFrame (now time.Time , payload []byte ) int {
550
578
code , _ , reason , n := consumeConnectionCloseTransportFrame (payload )
551
579
if n < 0 {
0 commit comments