calculate correct MinLength for QUIC 34 ACK frames with ACK ranges

ref #182
This commit is contained in:
Marten Seemann
2016-06-21 10:13:32 +07:00
parent cc5fe06db9
commit 5b0442f7e6
2 changed files with 27 additions and 6 deletions

View File

@@ -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
}

View File

@@ -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())))
})
})