diff --git a/ackhandlerlegacy/sent_packet_handler.go b/ackhandlerlegacy/sent_packet_handler.go index 3c6f7d84..0cb7e6d1 100644 --- a/ackhandlerlegacy/sent_packet_handler.go +++ b/ackhandlerlegacy/sent_packet_handler.go @@ -184,6 +184,11 @@ func (h *sentPacketHandler) ReceivedAck(ackFrame *frames.AckFrameLegacy, withPac h.largestReceivedPacketWithAck = withPacketNumber + // ignore repeated ACK (ACKs that don't have a higher LargestObserved than the last ACK) + if ackFrame.LargestObserved <= h.highestInOrderAckedPacketNumber { + return nil + } + expectedEntropy, err := h.calculateExpectedEntropy(ackFrame) if err != nil { return err diff --git a/ackhandlerlegacy/sent_packet_handler_test.go b/ackhandlerlegacy/sent_packet_handler_test.go index f186e6f1..3d2f8752 100644 --- a/ackhandlerlegacy/sent_packet_handler_test.go +++ b/ackhandlerlegacy/sent_packet_handler_test.go @@ -375,6 +375,19 @@ var _ = Describe("SentPacketHandler", func() { Expect(handler.BytesInFlight()).To(Equal(protocol.ByteCount(3))) }) + It("ignores repeated ACKs", func() { + ack := frames.AckFrameLegacy{ + LargestObserved: 3, + } + err := handler.ReceivedAck(&ack, 1337) + Expect(err).ToNot(HaveOccurred()) + Expect(handler.BytesInFlight()).To(Equal(protocol.ByteCount(3))) + err = handler.ReceivedAck(&ack, 1337+1) + Expect(err).ToNot(HaveOccurred()) + Expect(handler.LargestObserved).To(Equal(protocol.PacketNumber(3))) + Expect(handler.BytesInFlight()).To(Equal(protocol.ByteCount(3))) + }) + It("rejects ACKs with a too high LargestObserved packet number", func() { ack := frames.AckFrameLegacy{ LargestObserved: packets[len(packets)-1].PacketNumber + 1337,