Skip to content

Commit 9aaefe1

Browse files
don't retransmit PATH_CHALLENGE and PATH_RESPONSE frames (#4200)
1 parent 17fc98c commit 9aaefe1

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
@@ -563,6 +563,37 @@ var _ = Describe("Packet packer", func() {
563563
Expect(buffer.Len()).ToNot(BeZero())
564564
})
565565

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

0 commit comments

Comments
 (0)