support largest observed packet number missing in ACK frames

fixes #63
This commit is contained in:
Marten Seemann
2016-05-16 21:50:58 +07:00
parent d5c7a62066
commit 565f4c9fda
2 changed files with 21 additions and 6 deletions

View File

@@ -239,12 +239,8 @@ func ParseAckFrame(r *bytes.Reader, version protocol.VersionNumber) (*AckFrame,
}
rangeLength := uint8(rangeLengthByte)
if i == 0 && missingPacketSequenceNumberDelta == 0 {
return nil, errors.New("ACK frame: largest observed missing not yet implemented")
}
// contiguous NACK range
if missingPacketSequenceNumberDelta == 0 {
if i > 0 && missingPacketSequenceNumberDelta == 0 {
nackRange := &frame.NackRanges[len(frame.NackRanges)-1]
if uint64(nackRange.FirstPacketNumber) <= uint64(rangeLength)+1 {
return nil, errInvalidNackRanges
@@ -291,7 +287,7 @@ func (f *AckFrame) validateNackRanges() bool {
if nackRange.FirstPacketNumber > nackRange.LastPacketNumber {
return false
}
if nackRange.LastPacketNumber >= f.LargestObserved {
if nackRange.LastPacketNumber > f.LargestObserved {
return false
}
}

View File

@@ -100,6 +100,16 @@ var _ = Describe("AckFrame", func() {
Expect(b.Len()).To(BeZero())
})
It("parses a frame with the largest observed missing", func() {
b := bytes.NewReader([]byte{0x60, 0x2, 0xf, 0xb8, 0x1, 0x1, 0x0, 0xe5, 0x58, 0x4, 0x0, 0x1, 0x0, 0x0})
frame, err := ParseAckFrame(b, 32)
Expect(err).ToNot(HaveOccurred())
Expect(frame.HasNACK()).To(Equal(true))
Expect(frame.NackRanges).To(HaveLen(1))
Expect(frame.NackRanges[0]).To(Equal(NackRange{FirstPacketNumber: 15, LastPacketNumber: 15}))
Expect(b.Len()).To(Equal(0))
})
Context("contiguous NACK ranges", func() {
It("parses a frame with a contiguous NACK range spanning two fields", func() {
b := bytes.NewReader([]byte{0x64, 0x8, 0x2E, 0x01, 0x72, 0x1, 0x1, 0x0, 0xc0, 0x15, 0x0, 0x0, 0x2, 0x1, 0x2b, 0x0, 0xff})
@@ -186,6 +196,15 @@ var _ = Describe("AckFrame", func() {
Expect(ack.validateNackRanges()).To(BeFalse())
})
It("does not reject NACKs with LasterPacketNumber equal to LargestObserved", func() {
nackRange := NackRange{FirstPacketNumber: 7, LastPacketNumber: 7}
ack := AckFrame{
LargestObserved: 7,
NackRanges: []NackRange{nackRange},
}
Expect(ack.validateNackRanges()).To(BeTrue())
})
It("rejects NACKs with NackRanges in the wrong order", func() {
nackRanges := []NackRange{
{FirstPacketNumber: 2, LastPacketNumber: 2},