From 74ac98e7a53f205a6566484860dbd74b112fb44d Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Tue, 21 Jun 2016 14:11:19 +0700 Subject: [PATCH] calculate MinLength for QUIC 34 ACKs with long ranges of missing packets ref #182 --- frames/ack_frame_new.go | 3 +-- frames/ack_frame_new_test.go | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/frames/ack_frame_new.go b/frames/ack_frame_new.go index a49d4a0bb..a0b35631f 100644 --- a/frames/ack_frame_new.go +++ b/frames/ack_frame_new.go @@ -267,12 +267,11 @@ func (f *AckFrameNew) MinLength(version protocol.VersionNumber) (protocol.ByteCo var length protocol.ByteCount length = 1 + 2 + 1 + 1 + 4 // 1 TypeByte, 2 ACK delay time, 1 Num Timestamp, 1 Delta Largest Observed, 4 FirstTimestamp length += protocol.ByteCount(protocol.GetPacketNumberLength(f.LargestObserved)) - // for the first ACK block length missingSequenceNumberDeltaLen := protocol.ByteCount(protocol.PacketNumberLen6) if f.HasMissingRanges() { - length += (1 + missingSequenceNumberDeltaLen) * protocol.ByteCount(len(f.AckRanges)) + length += (1 + missingSequenceNumberDeltaLen) * protocol.ByteCount(f.numWrittenNackRanges()) } else { length += missingSequenceNumberDeltaLen } diff --git a/frames/ack_frame_new_test.go b/frames/ack_frame_new_test.go index 419607d0e..b62e0e810 100644 --- a/frames/ack_frame_new_test.go +++ b/frames/ack_frame_new_test.go @@ -351,6 +351,20 @@ var _ = Describe("AckFrame", func() { Expect(err).ToNot(HaveOccurred()) Expect(f.MinLength(0)).To(Equal(protocol.ByteCount(b.Len()))) }) + + It("has the proper min length for an ACK with long gaps of missing packets", func() { + f := &AckFrameNew{ + LargestObserved: 2000, + AckRanges: []AckRange{ + AckRange{FirstPacketNumber: 1500, LastPacketNumber: 2000}, + AckRange{FirstPacketNumber: 290, LastPacketNumber: 295}, + AckRange{FirstPacketNumber: 1, LastPacketNumber: 19}, + }, + } + err := f.Write(b, 0) + Expect(err).ToNot(HaveOccurred()) + Expect(f.MinLength(0)).To(Equal(protocol.ByteCount(b.Len()))) + }) }) })