From 4be2ef710cf0cba28d1c45c4f0e454f418b64f3c Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Mon, 25 Apr 2016 17:06:38 +0700 Subject: [PATCH] actually store LargestObserved in OutgoingPacketAckHandler --- ackhandler/outgoing_packet_ack_handler.go | 12 +++++---- .../outgoing_packet_ack_handler_test.go | 25 +++++++++++++++++++ 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/ackhandler/outgoing_packet_ack_handler.go b/ackhandler/outgoing_packet_ack_handler.go index cf2afa80..ad901156 100644 --- a/ackhandler/outgoing_packet_ack_handler.go +++ b/ackhandler/outgoing_packet_ack_handler.go @@ -9,10 +9,11 @@ import ( ) var ( - errAckForUnsentPacket = errors.New("OutgoingPacketAckHandler: Received ACK for an unsent package") - errEntropy = errors.New("OutgoingPacketAckHandler: Wrong entropy") - errMapAccess = errors.New("OutgoingPacketAckHandler: Packet does not exist in PacketHistory") - retransmissionThreshold = uint8(3) + errAckForUnsentPacket = errors.New("OutgoingPacketAckHandler: Received ACK for an unsent package") + errDuplicateOrOutOfOrderAck = errors.New("OutgoingPacketAckHandler: Duplicate or out-of-order ACK") + errEntropy = errors.New("OutgoingPacketAckHandler: Wrong entropy") + errMapAccess = errors.New("OutgoingPacketAckHandler: Packet does not exist in PacketHistory") + retransmissionThreshold = uint8(3) ) type outgoingPacketAckHandler struct { @@ -114,7 +115,7 @@ func (h *outgoingPacketAckHandler) ReceivedAck(ackFrame *frames.AckFrame) error } if ackFrame.LargestObserved <= h.LargestObserved { // duplicate or out-of-order AckFrame - return nil + return errDuplicateOrOutOfOrderAck } expectedEntropy, err := h.calculateExpectedEntropy(ackFrame) @@ -132,6 +133,7 @@ func (h *outgoingPacketAckHandler) ReceivedAck(ackFrame *frames.AckFrame) error highestInOrderAckedPacketNumber := ackFrame.GetHighestInOrderPacketNumber() highestInOrderAckedEntropy := h.highestInOrderAckedEntropy + h.LargestObserved = ackFrame.LargestObserved // if this ACK increases the highestInOrderAckedPacketNumber, the packet will be deleted from the packetHistory map, thus we need to save it's Entropy before doing so if highestInOrderAckedPacketNumber > h.highestInOrderAckedPacketNumber { diff --git a/ackhandler/outgoing_packet_ack_handler_test.go b/ackhandler/outgoing_packet_ack_handler_test.go index 104d7ab8..6a302484 100644 --- a/ackhandler/outgoing_packet_ack_handler_test.go +++ b/ackhandler/outgoing_packet_ack_handler_test.go @@ -253,6 +253,31 @@ var _ = Describe("AckHandler", func() { Expect(handler.packetHistory).To(HaveKey(protocol.PacketNumber(6))) }) + It("rejects duplicate ACKs", func() { + largestObserved := 3 + ack := frames.AckFrame{ + LargestObserved: protocol.PacketNumber(largestObserved), + } + err := handler.ReceivedAck(&ack) + Expect(err).ToNot(HaveOccurred()) + err = handler.ReceivedAck(&ack) + Expect(err).To(HaveOccurred()) + Expect(err).To(Equal(errDuplicateOrOutOfOrderAck)) + }) + + It("rejects out of order ACKs", func() { + largestObserved := 3 + ack := frames.AckFrame{ + LargestObserved: protocol.PacketNumber(largestObserved), + } + err := handler.ReceivedAck(&ack) + Expect(err).ToNot(HaveOccurred()) + ack.LargestObserved-- + err = handler.ReceivedAck(&ack) + Expect(err).To(HaveOccurred()) + Expect(err).To(Equal(errDuplicateOrOutOfOrderAck)) + }) + It("rejects ACKs with a LargestObserved packet number higher than what was sent out previously", func() { ack := frames.AckFrame{ LargestObserved: packets[len(packets)-1].PacketNumber + 1337,