From 3b5d10b1f2ca5b23b0c7b04515b49533c2f45e0e Mon Sep 17 00:00:00 2001 From: Lucas Clemente Date: Fri, 5 Aug 2016 15:02:02 +0200 Subject: [PATCH] properly increase LargestInOrderAcked past retransmitted packets --- ackhandler/sent_packet_handler.go | 11 +++++------ ackhandler/sent_packet_handler_test.go | 25 +++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/ackhandler/sent_packet_handler.go b/ackhandler/sent_packet_handler.go index e92290213..52e84dba4 100644 --- a/ackhandler/sent_packet_handler.go +++ b/ackhandler/sent_packet_handler.go @@ -108,15 +108,14 @@ func (h *sentPacketHandler) queuePacketForRetransmission(packet *ackhandlerlegac h.retransmissionQueue = append(h.retransmissionQueue, packet) packet.Retransmitted = true - // increase the LargestInOrderAcked, if this is the lowest packet that hasn't been acked yet + // If this is the lowest packet that hasn't been acked or retransmitted yet ... if packet.PacketNumber == h.LargestInOrderAcked+1 { - for i := packet.PacketNumber + 1; i < h.LargestAcked; i++ { - _, ok := h.packetHistory[protocol.PacketNumber(i)] - if !ok { - h.LargestInOrderAcked = i - } else { + // ... increase the LargestInOrderAcked until it's one before the next packet that was not acked and not retransmitted + for h.LargestInOrderAcked < h.LargestAcked { + if p, notAcked := h.packetHistory[h.LargestInOrderAcked+1]; notAcked && !p.Retransmitted { break } + h.LargestInOrderAcked++ } } diff --git a/ackhandler/sent_packet_handler_test.go b/ackhandler/sent_packet_handler_test.go index 43ba8322c..1faef4009 100644 --- a/ackhandler/sent_packet_handler_test.go +++ b/ackhandler/sent_packet_handler_test.go @@ -529,6 +529,31 @@ var _ = Describe("SentPacketHandler", func() { Expect(handler.LargestInOrderAcked).To(Equal(protocol.PacketNumber(2))) }) + It("increases LargestInOrderAcked past packets queued for retransmission", func() { + ack := frames.AckFrame{ + LargestAcked: 7, + LowestAcked: 1, + AckRanges: []frames.AckRange{ + {FirstPacketNumber: 7, LastPacketNumber: 7}, + {FirstPacketNumber: 4, LastPacketNumber: 5}, + {FirstPacketNumber: 1, LastPacketNumber: 1}, + }, + } + err := handler.ReceivedAck(&ack, 1) + Expect(err).ToNot(HaveOccurred()) + // this will trigger a retransmission of packet 3 + for i := uint8(0); i < protocol.RetransmissionThreshold; i++ { + handler.nackPacket(3) + } + Expect(handler.LargestInOrderAcked).To(Equal(protocol.PacketNumber(1))) + // now, trigger retransmission of 2 ... + for i := uint8(0); i < protocol.RetransmissionThreshold; i++ { + handler.nackPacket(2) + } + // and check that it increased LargestInOrderAcked past 3 + Expect(handler.LargestInOrderAcked).To(Equal(protocol.PacketNumber(5))) + }) + It("does not retransmit a packet if a belated ACK was received", func() { // lose packet by NACKing it often enough for i := uint8(0); i < protocol.RetransmissionThreshold+1; i++ {