diff --git a/frames/ack_frame.go b/frames/ack_frame.go index 61aac9ff3..775628c89 100644 --- a/frames/ack_frame.go +++ b/frames/ack_frame.go @@ -18,8 +18,8 @@ type NackRange struct { type AckFrame struct { Entropy byte LargestObserved protocol.PacketNumber - DelayTime uint16 // Todo: properly interpret this value as described in the specification - NackRanges []NackRange + DelayTime uint16 // Todo: properly interpret this value as described in the specification + NackRanges []NackRange // has to be ordered. The NACK range with the highest FirstPacketNumber goes first, the NACK range with the lowest FirstPacketNumber goes last } // Write writes an ACK frame. @@ -73,6 +73,14 @@ func (f *AckFrame) HasNACK() bool { return false } +// GetHighestInOrderPacket gets the highest in order packet number that is confirmed by this ACK +func (f *AckFrame) GetHighestInOrderPacket() protocol.PacketNumber { + if f.HasNACK() { + return (f.NackRanges[len(f.NackRanges)-1].FirstPacketNumber - 1) + } + return f.LargestObserved +} + // ParseAckFrame reads an ACK frame func ParseAckFrame(r *bytes.Reader) (*AckFrame, error) { frame := &AckFrame{} diff --git a/frames/ack_frame_test.go b/frames/ack_frame_test.go index 400013ef5..79cbee0be 100644 --- a/frames/ack_frame_test.go +++ b/frames/ack_frame_test.go @@ -73,6 +73,33 @@ var _ = Describe("AckFrame", func() { Expect(frame.NackRanges[2].Length).To(Equal(uint8(1))) Expect(b.Len()).To(Equal(0)) }) + + It("gets the highest in order packet number for an ACK without NACK ranges", func() { + frame := AckFrame{LargestObserved: 5} + Expect(frame.GetHighestInOrderPacket()).To(Equal(protocol.PacketNumber(5))) + }) + + It("gets the highest in order packet number for an ACK with one NACK ranges", func() { + nackRange := NackRange{FirstPacketNumber: 3, Length: 2} + frame := AckFrame{ + LargestObserved: 6, + NackRanges: []NackRange{nackRange}, + } + Expect(frame.GetHighestInOrderPacket()).To(Equal(protocol.PacketNumber(2))) + }) + + It("gets the highest in order packet number for an ACK with one NACK ranges", func() { + nackRanges := []NackRange{ + NackRange{FirstPacketNumber: 9, Length: 3}, + NackRange{FirstPacketNumber: 7, Length: 1}, + NackRange{FirstPacketNumber: 4, Length: 2}, + } + frame := &AckFrame{ + LargestObserved: 15, + NackRanges: nackRanges, + } + Expect(frame.GetHighestInOrderPacket()).To(Equal(protocol.PacketNumber(3))) + }) }) Context("when writing", func() {