diff --git a/frames/ack_frame.go b/frames/ack_frame.go index ab02f077b..53aec8744 100644 --- a/frames/ack_frame.go +++ b/frames/ack_frame.go @@ -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 } } diff --git a/frames/ack_frame_test.go b/frames/ack_frame_test.go index ed5974eff..81f6cd050 100644 --- a/frames/ack_frame_test.go +++ b/frames/ack_frame_test.go @@ -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},