From 7796fad2b75658b18a6c99518adc575d802a62fd Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Mon, 15 Aug 2016 14:04:03 +0700 Subject: [PATCH] fix processing of ACK frames with old ACK ranges in new SentPacketHandler fixes #280 --- ackhandler/sent_packet_handler.go | 2 +- ackhandler/sent_packet_handler_test.go | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/ackhandler/sent_packet_handler.go b/ackhandler/sent_packet_handler.go index 7c9414a1e..a864c9edb 100644 --- a/ackhandler/sent_packet_handler.go +++ b/ackhandler/sent_packet_handler.go @@ -221,7 +221,7 @@ func (h *sentPacketHandler) ReceivedAck(ackFrame *frames.AckFrame, withPacketNum if ackFrame.HasMissingRanges() { ackRange := ackFrame.AckRanges[len(ackFrame.AckRanges)-1-ackRangeIndex] - if packetNumber > ackRange.LastPacketNumber && ackRangeIndex < len(ackFrame.AckRanges)-1 { + for packetNumber > ackRange.LastPacketNumber && ackRangeIndex < len(ackFrame.AckRanges)-1 { ackRangeIndex++ ackRange = ackFrame.AckRanges[len(ackFrame.AckRanges)-1-ackRangeIndex] } diff --git a/ackhandler/sent_packet_handler_test.go b/ackhandler/sent_packet_handler_test.go index f6f76226a..33918897e 100644 --- a/ackhandler/sent_packet_handler_test.go +++ b/ackhandler/sent_packet_handler_test.go @@ -487,6 +487,31 @@ var _ = Describe("SentPacketHandler", func() { Expect(handler.LargestInOrderAcked).To(Equal(protocol.PacketNumber(7))) Expect(handler.packetHistory.Front().Value.PacketNumber).To(Equal(protocol.PacketNumber(8))) }) + + It("processes an ACK that contains old ACK ranges", func() { + ack1 := frames.AckFrame{ + LargestAcked: 6, + LowestAcked: 1, + } + err := handler.ReceivedAck(&ack1, 1) + Expect(err).ToNot(HaveOccurred()) + Expect(handler.packetHistory.Front().Value.PacketNumber).To(Equal(protocol.PacketNumber(7))) + Expect(handler.BytesInFlight()).To(Equal(protocol.ByteCount(len(packets) - 6))) + ack2 := frames.AckFrame{ + LargestAcked: 10, + LowestAcked: 1, + AckRanges: []frames.AckRange{ + {FirstPacketNumber: 8, LastPacketNumber: 10}, + {FirstPacketNumber: 3, LastPacketNumber: 3}, + {FirstPacketNumber: 1, LastPacketNumber: 1}, + }, + } + err = handler.ReceivedAck(&ack2, 2) + Expect(err).ToNot(HaveOccurred()) + Expect(handler.BytesInFlight()).To(Equal(protocol.ByteCount(len(packets) - 6 - 3))) + Expect(handler.packetHistory.Front().Value.PacketNumber).To(Equal(protocol.PacketNumber(7))) + Expect(handler.packetHistory.Back().Value.PacketNumber).To(Equal(protocol.PacketNumber(12))) + }) }) Context("calculating RTT", func() {