diff --git a/ackhandler/ack_handler.go b/ackhandler/ack_handler.go index 98c3e29ac..a7ca1b303 100644 --- a/ackhandler/ack_handler.go +++ b/ackhandler/ack_handler.go @@ -40,12 +40,12 @@ func (h *AckHandler) GetNackRanges() []*frames.NackRange { if !inRange { r := &frames.NackRange{ FirstPacketNumber: packetNumber, - Length: 1, + LastPacketNumber: packetNumber, } ranges = append(ranges, r) inRange = true } else { - ranges[len(ranges)-1].Length++ + ranges[len(ranges)-1].LastPacketNumber++ } } else { inRange = false diff --git a/ackhandler/ack_handler_test.go b/ackhandler/ack_handler_test.go index 145dbd558..3981a393c 100644 --- a/ackhandler/ack_handler_test.go +++ b/ackhandler/ack_handler_test.go @@ -29,7 +29,7 @@ var _ = Describe("AckHandler", func() { nackRanges := ackHandler.GetNackRanges() Expect(len(nackRanges)).To(Equal(1)) Expect(nackRanges[0].FirstPacketNumber).To(Equal(protocol.PacketNumber(5))) - Expect(nackRanges[0].Length).To(Equal(uint8(1))) + Expect(nackRanges[0].LastPacketNumber).To(Equal(protocol.PacketNumber(5))) }) It("handles two consecutive lost packages", func() { @@ -44,7 +44,7 @@ var _ = Describe("AckHandler", func() { nackRanges := ackHandler.GetNackRanges() Expect(len(nackRanges)).To(Equal(1)) Expect(nackRanges[0].FirstPacketNumber).To(Equal(protocol.PacketNumber(5))) - Expect(nackRanges[0].Length).To(Equal(uint8(2))) + Expect(nackRanges[0].LastPacketNumber).To(Equal(protocol.PacketNumber(6))) }) It("handles two non-consecutively lost packages", func() { @@ -59,9 +59,9 @@ var _ = Describe("AckHandler", func() { nackRanges := ackHandler.GetNackRanges() Expect(len(nackRanges)).To(Equal(2)) Expect(nackRanges[0].FirstPacketNumber).To(Equal(protocol.PacketNumber(3))) - Expect(nackRanges[0].Length).To(Equal(uint8(1))) + Expect(nackRanges[0].LastPacketNumber).To(Equal(protocol.PacketNumber(3))) Expect(nackRanges[1].FirstPacketNumber).To(Equal(protocol.PacketNumber(7))) - Expect(nackRanges[1].Length).To(Equal(uint8(1))) + Expect(nackRanges[1].LastPacketNumber).To(Equal(protocol.PacketNumber(7))) }) It("handles two sequences of lost packages", func() { @@ -76,9 +76,9 @@ var _ = Describe("AckHandler", func() { nackRanges := ackHandler.GetNackRanges() Expect(len(nackRanges)).To(Equal(2)) Expect(nackRanges[0].FirstPacketNumber).To(Equal(protocol.PacketNumber(2))) - Expect(nackRanges[0].Length).To(Equal(uint8(3))) + Expect(nackRanges[0].LastPacketNumber).To(Equal(protocol.PacketNumber(4))) Expect(nackRanges[1].FirstPacketNumber).To(Equal(protocol.PacketNumber(7))) - Expect(nackRanges[1].Length).To(Equal(uint8(2))) + Expect(nackRanges[1].LastPacketNumber).To(Equal(protocol.PacketNumber(8))) }) }) diff --git a/frames/ack_frame.go b/frames/ack_frame.go index dad0bd1a1..9c22a9532 100644 --- a/frames/ack_frame.go +++ b/frames/ack_frame.go @@ -11,7 +11,7 @@ import ( // NackRange is a NACK range type NackRange struct { FirstPacketNumber protocol.PacketNumber - Length uint8 + LastPacketNumber protocol.PacketNumber } // An AckFrame in QUIC @@ -45,15 +45,15 @@ func (f *AckFrame) Write(b *bytes.Buffer) error { for i, nackRange := range f.NackRanges { var missingPacketSequenceNumberDelta uint64 if i == 0 { - if protocol.PacketNumber(uint64(nackRange.FirstPacketNumber)+uint64(nackRange.Length)) > f.LargestObserved { + if nackRange.LastPacketNumber > f.LargestObserved { return errors.New("AckFrame: Invalid NACK ranges") } - missingPacketSequenceNumberDelta = uint64(f.LargestObserved-nackRange.FirstPacketNumber) - uint64(nackRange.Length) + 1 + missingPacketSequenceNumberDelta = uint64(f.LargestObserved) - uint64(nackRange.LastPacketNumber) } else { lastNackRange := f.NackRanges[i-1] - missingPacketSequenceNumberDelta = uint64(lastNackRange.FirstPacketNumber-nackRange.FirstPacketNumber) - uint64(nackRange.Length) + missingPacketSequenceNumberDelta = uint64(lastNackRange.FirstPacketNumber) - uint64(nackRange.LastPacketNumber) - 1 } - rangeLength := nackRange.Length - 1 + rangeLength := uint8(nackRange.LastPacketNumber - nackRange.FirstPacketNumber) if rangeLength > 255 { return errors.New("AckFrame: NACK ranges larger 256 packets not yet supported") } @@ -183,9 +183,7 @@ func ParseAckFrame(r *bytes.Reader) (*AckFrame, error) { } rangeLength := uint8(rangeLengthByte) - nackRange := NackRange{ - Length: uint8(rangeLength + 1), - } + nackRange := NackRange{} if i == 0 { nackRange.FirstPacketNumber = frame.LargestObserved - protocol.PacketNumber(missingPacketSequenceNumberDelta+uint64(rangeLength)) } else { @@ -195,6 +193,7 @@ func ParseAckFrame(r *bytes.Reader) (*AckFrame, error) { lastNackRange := frame.NackRanges[len(frame.NackRanges)-1] nackRange.FirstPacketNumber = lastNackRange.FirstPacketNumber - protocol.PacketNumber(missingPacketSequenceNumberDelta+uint64(rangeLength)) - 1 } + nackRange.LastPacketNumber = protocol.PacketNumber(uint64(nackRange.FirstPacketNumber) + uint64(rangeLength)) frame.NackRanges = append(frame.NackRanges, nackRange) } } diff --git a/frames/ack_frame_test.go b/frames/ack_frame_test.go index 54097172e..5a428e8ba 100644 --- a/frames/ack_frame_test.go +++ b/frames/ack_frame_test.go @@ -43,7 +43,7 @@ var _ = Describe("AckFrame", func() { Expect(frame.HasNACK()).To(Equal(true)) Expect(len(frame.NackRanges)).To(Equal(1)) Expect(frame.NackRanges[0].FirstPacketNumber).To(Equal(protocol.PacketNumber(1))) - Expect(frame.NackRanges[0].Length).To(Equal(uint8(2))) + Expect(frame.NackRanges[0].LastPacketNumber).To(Equal(protocol.PacketNumber(2))) Expect(b.Len()).To(Equal(0)) }) @@ -55,22 +55,23 @@ var _ = Describe("AckFrame", func() { Expect(frame.HasNACK()).To(Equal(true)) Expect(len(frame.NackRanges)).To(Equal(1)) // ToDo: check NACK range - Expect(frame.NackRanges[0].Length).To(Equal(uint8(4))) + // Expect(frame.NackRanges[0].Length).To(Equal(uint8(4))) Expect(b.Len()).To(Equal(0)) }) It("parses a frame containing multiple NACK ranges", func() { + // sent packets 1, 3, 7, 15 b := bytes.NewReader([]byte{0x60, 0x2, 0xf, 0xb8, 0x1, 0x1, 0x0, 0xe5, 0x58, 0x4, 0x0, 0x3, 0x1, 0x6, 0x1, 0x2, 0x1, 0x0}) frame, err := ParseAckFrame(b) Expect(err).ToNot(HaveOccurred()) Expect(frame.HasNACK()).To(Equal(true)) Expect(len(frame.NackRanges)).To(Equal(3)) Expect(frame.NackRanges[0].FirstPacketNumber).To(Equal(protocol.PacketNumber(8))) - Expect(frame.NackRanges[0].Length).To(Equal(uint8(7))) + Expect(frame.NackRanges[0].LastPacketNumber).To(Equal(protocol.PacketNumber(14))) Expect(frame.NackRanges[1].FirstPacketNumber).To(Equal(protocol.PacketNumber(4))) - Expect(frame.NackRanges[1].Length).To(Equal(uint8(3))) + Expect(frame.NackRanges[1].LastPacketNumber).To(Equal(protocol.PacketNumber(6))) Expect(frame.NackRanges[2].FirstPacketNumber).To(Equal(protocol.PacketNumber(2))) - Expect(frame.NackRanges[2].Length).To(Equal(uint8(1))) + Expect(frame.NackRanges[2].LastPacketNumber).To(Equal(protocol.PacketNumber(2))) Expect(b.Len()).To(Equal(0)) }) @@ -80,7 +81,7 @@ var _ = Describe("AckFrame", func() { }) It("gets the highest in order packet number for an ACK with one NACK ranges", func() { - nackRange := NackRange{FirstPacketNumber: 3, Length: 2} + nackRange := NackRange{FirstPacketNumber: 3, LastPacketNumber: 4} frame := AckFrame{ LargestObserved: 6, NackRanges: []NackRange{nackRange}, @@ -90,9 +91,9 @@ var _ = Describe("AckFrame", func() { 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}, + NackRange{FirstPacketNumber: 9, LastPacketNumber: 11}, + NackRange{FirstPacketNumber: 7, LastPacketNumber: 7}, + NackRange{FirstPacketNumber: 4, LastPacketNumber: 5}, } frame := &AckFrame{ LargestObserved: 15, @@ -118,7 +119,7 @@ var _ = Describe("AckFrame", func() { b := &bytes.Buffer{} nackRange := NackRange{ FirstPacketNumber: 2, - Length: 1, + LastPacketNumber: 2, } frame := AckFrame{ Entropy: 2, @@ -139,11 +140,11 @@ var _ = Describe("AckFrame", func() { b := &bytes.Buffer{} nackRange1 := NackRange{ FirstPacketNumber: 4, - Length: 3, + LastPacketNumber: 6, } nackRange2 := NackRange{ FirstPacketNumber: 2, - Length: 1, + LastPacketNumber: 2, } frame := AckFrame{ Entropy: 2, @@ -182,7 +183,7 @@ var _ = Describe("AckFrame", func() { NackRanges: []NackRange{ NackRange{ FirstPacketNumber: 2, - Length: 1, + LastPacketNumber: 2, }, }, } @@ -210,9 +211,9 @@ var _ = Describe("AckFrame", func() { It("is self-consistent for ACK frames with NACK ranges", func() { b := &bytes.Buffer{} nackRanges := []NackRange{ - NackRange{FirstPacketNumber: 9, Length: 3}, - NackRange{FirstPacketNumber: 7, Length: 1}, - NackRange{FirstPacketNumber: 2, Length: 2}, + NackRange{FirstPacketNumber: 9, LastPacketNumber: 11}, + NackRange{FirstPacketNumber: 7, LastPacketNumber: 7}, + NackRange{FirstPacketNumber: 2, LastPacketNumber: 3}, } frameOrig := &AckFrame{ LargestObserved: 15,