From 903130da20372f9f4c1cf7b6d8f61c8aa872982b Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Wed, 13 Jul 2016 22:03:14 +0800 Subject: [PATCH] ignore repeated ACKs in new SentPacketHandler fixes #218 --- ackhandlernew/sent_packet_handler.go | 5 +++++ ackhandlernew/sent_packet_handler_test.go | 14 ++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/ackhandlernew/sent_packet_handler.go b/ackhandlernew/sent_packet_handler.go index 4a2fe7597..a8bad0323 100644 --- a/ackhandlernew/sent_packet_handler.go +++ b/ackhandlernew/sent_packet_handler.go @@ -159,6 +159,11 @@ func (h *sentPacketHandler) ReceivedAck(ackFrame *frames.AckFrameNew, withPacket h.largestReceivedPacketWithAck = withPacketNumber + // ignore repeated ACK (ACKs that don't have a higher LargestAcked than the last ACK) + if ackFrame.LargestAcked <= h.LargestInOrderAcked { + return nil + } + h.LargestAcked = ackFrame.LargestAcked // Update the RTT diff --git a/ackhandlernew/sent_packet_handler_test.go b/ackhandlernew/sent_packet_handler_test.go index 5fbd3b4f3..d79969c01 100644 --- a/ackhandlernew/sent_packet_handler_test.go +++ b/ackhandlernew/sent_packet_handler_test.go @@ -216,6 +216,20 @@ var _ = Describe("SentPacketHandler", func() { Expect(err).To(MatchError(errAckForUnsentPacket)) Expect(handler.BytesInFlight()).To(Equal(protocol.ByteCount(len(packets)))) }) + + It("ignores repeated ACKs", func() { + ack := frames.AckFrameNew{ + LargestAcked: 3, + LowestAcked: 1, + } + err := handler.ReceivedAck(&ack, 1337) + Expect(err).ToNot(HaveOccurred()) + Expect(handler.BytesInFlight()).To(Equal(protocol.ByteCount(len(packets) - 3))) + err = handler.ReceivedAck(&ack, 1337+1) + Expect(err).ToNot(HaveOccurred()) + Expect(handler.LargestAcked).To(Equal(protocol.PacketNumber(3))) + Expect(handler.BytesInFlight()).To(Equal(protocol.ByteCount(len(packets) - 3))) + }) }) Context("acks and nacks the right packets", func() {