Skip to content

Commit 21609dd

Browse files
don't retransmit PATH_CHALLENGE and PATH_RESPONSE frames (#4200)
1 parent d7aa627 commit 21609dd

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
@@ -626,7 +626,13 @@ func (p *packetPacker) composeNextPacket(maxFrameSize protocol.ByteCount, onlyAc
626626
pl.length += lengthAdded
627627
// add handlers for the control frames that were added
628628
for i := startLen; i < len(pl.frames); i++ {
629-
pl.frames[i].Handler = p.retransmissionQueue.AppDataAckHandler()
629+
switch pl.frames[i].Frame.(type) {
630+
case *wire.PathChallengeFrame, *wire.PathResponseFrame:
631+
// Path probing is currently not supported, therefore we don't need to set the OnAcked callback yet.
632+
// PATH_CHALLENGE and PATH_RESPONSE are never retransmitted.
633+
default:
634+
pl.frames[i].Handler = p.retransmissionQueue.AppDataAckHandler()
635+
}
630636
}
631637

632638
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)