From 5b0442f7e6de1a603d9017b98c8676594d90d94e Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Tue, 21 Jun 2016 10:13:32 +0700 Subject: [PATCH] calculate correct MinLength for QUIC 34 ACK frames with ACK ranges ref #182 --- frames/ack_frame_new.go | 13 +++++++++---- frames/ack_frame_new_test.go | 20 ++++++++++++++++++-- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/frames/ack_frame_new.go b/frames/ack_frame_new.go index 1194108c..a86de0aa 100644 --- a/frames/ack_frame_new.go +++ b/frames/ack_frame_new.go @@ -237,12 +237,17 @@ func (f *AckFrameNew) MinLength(version protocol.VersionNumber) (protocol.ByteCo 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 - length += protocol.ByteCount(protocol.PacketNumberLen6) + + missingSequenceNumberDeltaLen := protocol.ByteCount(protocol.PacketNumberLen6) + + if f.HasMissingRanges() { + length += (1 + missingSequenceNumberDeltaLen) * protocol.ByteCount(len(f.AckRanges)) + } else { + length += missingSequenceNumberDeltaLen + } length += (1 + 2) * 0 /* TODO: num_timestamps */ - if f.HasMissingRanges() { - panic("NACKs not yet implemented") - } + return length, nil } diff --git a/frames/ack_frame_new_test.go b/frames/ack_frame_new_test.go index 280c2437..f84a6df5 100644 --- a/frames/ack_frame_new_test.go +++ b/frames/ack_frame_new_test.go @@ -249,7 +249,8 @@ var _ = Describe("AckFrame", func() { f := &AckFrameNew{ LargestObserved: 1, } - f.Write(b, 0) + err := f.Write(b, 0) + Expect(err).ToNot(HaveOccurred()) Expect(f.MinLength(0)).To(Equal(protocol.ByteCount(b.Len()))) }) @@ -257,7 +258,22 @@ var _ = Describe("AckFrame", func() { f := &AckFrameNew{ LargestObserved: 0xDEADBEEFCAFE, } - f.Write(b, 0) + err := f.Write(b, 0) + Expect(err).ToNot(HaveOccurred()) + Expect(f.MinLength(0)).To(Equal(protocol.ByteCount(b.Len()))) + }) + + It("has the proper min length for an ACK with missing packets", func() { + f := &AckFrameNew{ + LargestObserved: 2000, + AckRanges: []AckRange{ + AckRange{FirstPacketNumber: 1000, LastPacketNumber: 2000}, + AckRange{FirstPacketNumber: 50, LastPacketNumber: 900}, + AckRange{FirstPacketNumber: 1, LastPacketNumber: 23}, + }, + } + err := f.Write(b, 0) + Expect(err).ToNot(HaveOccurred()) Expect(f.MinLength(0)).To(Equal(protocol.ByteCount(b.Len()))) }) })