Skip to content

Commit 6cc3d58

Browse files
don't retransmit PATH_CHALLENGE and PATH_RESPONSE frames (#4200)
1 parent a0ffa75 commit 6cc3d58

File tree

2 files changed

+38
-1
lines changed

2 files changed

+38
-1
lines changed

Diff for: packet_packer.go

+7-1
Original file line numberDiff line numberDiff line change
@@ -640,7 +640,13 @@ func (p *packetPacker) composeNextPacket(maxFrameSize protocol.ByteCount, onlyAc
640640
pl.length += lengthAdded
641641
// add handlers for the control frames that were added
642642
for i := startLen; i < len(pl.frames); i++ {
643-
pl.frames[i].Handler = p.retransmissionQueue.AppDataAckHandler()
643+
switch pl.frames[i].Frame.(type) {
644+
case *wire.PathChallengeFrame, *wire.PathResponseFrame:
645+
// Path probing is currently not supported, therefore we don't need to set the OnAcked callback yet.
646+
// PATH_CHALLENGE and PATH_RESPONSE are never retransmitted.
647+
default:
648+
pl.frames[i].Handler = p.retransmissionQueue.AppDataAckHandler()
649+
}
644650
}
645651

646652
pl.streamFrames, lengthAdded = p.framer.AppendStreamFrames(pl.streamFrames, maxFrameSize-pl.length, v)

Diff for: packet_packer_test.go

+31
Original file line numberDiff line numberDiff line change
@@ -562,6 +562,37 @@ var _ = Describe("Packet packer", func() {
562562
Expect(buffer.Len()).ToNot(BeZero())
563563
})
564564

565+
It("packs PATH_CHALLENGE and PATH_RESPONSE frames", func() {
566+
pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)
567+
pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42))
568+
sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil)
569+
framer.EXPECT().HasData().Return(true)
570+
ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false)
571+
frames := []ackhandler.Frame{
572+
{Frame: &wire.PathChallengeFrame{}},
573+
{Frame: &wire.PathResponseFrame{}},
574+
{Frame: &wire.DataBlockedFrame{}},
575+
}
576+
expectAppendControlFrames(frames...)
577+
expectAppendStreamFrames()
578+
buffer := getPacketBuffer()
579+
p, err := packer.AppendPacket(buffer, maxPacketSize, protocol.Version1)
580+
Expect(p).ToNot(BeNil())
581+
Expect(err).ToNot(HaveOccurred())
582+
Expect(p.Frames).To(HaveLen(3))
583+
for i, f := range p.Frames {
584+
Expect(f).To(BeAssignableToTypeOf(frames[i]))
585+
switch f.Frame.(type) {
586+
case *wire.PathChallengeFrame, *wire.PathResponseFrame:
587+
// This means that the frame won't be retransmitted.
588+
Expect(f.Handler).To(BeNil())
589+
default:
590+
Expect(f.Handler).ToNot(BeNil())
591+
}
592+
}
593+
Expect(buffer.Len()).ToNot(BeZero())
594+
})
595+
565596
It("packs DATAGRAM frames", func() {
566597
ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true)
567598
pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2)

0 commit comments

Comments
 (0)