From 4eb088caa6869eaec97f907a2c2e9b5bb075c820 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Fri, 22 Apr 2016 13:15:55 +0700 Subject: [PATCH] increase missingReports counter for NACKed packets --- ackhandler/outgoing_packet_ack_handler.go | 13 ++++-- .../outgoing_packet_ack_handler_test.go | 40 +++++++++++++++++-- 2 files changed, 45 insertions(+), 8 deletions(-) diff --git a/ackhandler/outgoing_packet_ack_handler.go b/ackhandler/outgoing_packet_ack_handler.go index 89b15ca5..71662fbc 100644 --- a/ackhandler/outgoing_packet_ack_handler.go +++ b/ackhandler/outgoing_packet_ack_handler.go @@ -150,7 +150,7 @@ func (h *outgoingPacketAckHandler) ReceivedAck(ackFrame *frames.AckFrame) error delete(h.packetHistory, i) } - // delete packets with a packet number higher than highestInOrderAckedPacketNumber that have already been ACKed + // increase MissingReports counter of NACKed packets // this is the case if the PacketNumber is *not* contained in any of the NACK ranges if ackFrame.HasNACK() { nackRangeIndex := len(ackFrame.NackRanges) - 1 @@ -163,11 +163,16 @@ func (h *outgoingPacketAckHandler) ReceivedAck(ackFrame *frames.AckFrame) error nackRange = ackFrame.NackRanges[nackRangeIndex] } } - // PacketNumber i is not contained in a NACK range + // PacketNumber i is not contained in a NACK range, increase it's missingReports counter if i >= nackRange.FirstPacketNumber && i <= nackRange.LastPacketNumber { - continue + packet, ok := h.packetHistory[i] + if !ok { + return errMapAccess + } + packet.MissingReports++ + // ToDo: do something as when packet.MissionReports > threshold } - delete(h.packetHistory, i) + // ToDo: delete packet from history, since it already has been ACKed } } diff --git a/ackhandler/outgoing_packet_ack_handler_test.go b/ackhandler/outgoing_packet_ack_handler_test.go index 10f3ad07..5a60ddc1 100644 --- a/ackhandler/outgoing_packet_ack_handler_test.go +++ b/ackhandler/outgoing_packet_ack_handler_test.go @@ -177,7 +177,8 @@ var _ = Describe("AckHandler", func() { Expect(err).ToNot(HaveOccurred()) Expect(handler.packetHistory).ToNot(HaveKey(protocol.PacketNumber(1))) Expect(handler.packetHistory).To(HaveKey(protocol.PacketNumber(2))) - Expect(handler.packetHistory).ToNot(HaveKey(protocol.PacketNumber(3))) + Expect(handler.packetHistory[2].MissingReports).To(Equal(uint8(1))) + // Expect(handler.packetHistory).ToNot(HaveKey(protocol.PacketNumber(3))) Expect(handler.packetHistory).To(HaveKey(protocol.PacketNumber(4))) }) @@ -196,7 +197,9 @@ var _ = Describe("AckHandler", func() { Expect(handler.packetHistory).ToNot(HaveKey(protocol.PacketNumber(1))) Expect(handler.packetHistory).To(HaveKey(protocol.PacketNumber(2))) Expect(handler.packetHistory).To(HaveKey(protocol.PacketNumber(3))) - Expect(handler.packetHistory).ToNot(HaveKey(protocol.PacketNumber(4))) + Expect(handler.packetHistory[2].MissingReports).To(Equal(uint8(1))) + Expect(handler.packetHistory[3].MissingReports).To(Equal(uint8(1))) + // Expect(handler.packetHistory).ToNot(HaveKey(protocol.PacketNumber(4))) }) It("handles an ACK with multiple NACK ranges", func() { @@ -217,9 +220,11 @@ var _ = Describe("AckHandler", func() { Expect(err).ToNot(HaveOccurred()) Expect(handler.packetHistory).ToNot(HaveKey(protocol.PacketNumber(1))) Expect(handler.packetHistory).To(HaveKey(protocol.PacketNumber(2))) - Expect(handler.packetHistory).ToNot(HaveKey(protocol.PacketNumber(3))) + Expect(handler.packetHistory[2].MissingReports).To(Equal(uint8(1))) + // Expect(handler.packetHistory).ToNot(HaveKey(protocol.PacketNumber(3))) Expect(handler.packetHistory).To(HaveKey(protocol.PacketNumber(4))) - Expect(handler.packetHistory).ToNot(HaveKey(protocol.PacketNumber(5))) + Expect(handler.packetHistory[4].MissingReports).To(Equal(uint8(1))) + // Expect(handler.packetHistory).ToNot(HaveKey(protocol.PacketNumber(5))) }) It("rejects an ACK with a NACK that has incorrect entropy", func() { @@ -258,6 +263,33 @@ var _ = Describe("AckHandler", func() { err = handler.ReceivedAck(&ack) Expect(err).ToNot(HaveOccurred()) }) + + It("increments the missingReports counter every time a NACK for a packet is received", func() { + nackRange1 := frames.NackRange{FirstPacketNumber: 4, LastPacketNumber: 4} + nackRange2 := frames.NackRange{FirstPacketNumber: 2, LastPacketNumber: 2} + entropy := EntropyAccumulator(0) + entropy.Add(1, packets[0].EntropyBit) + entropy.Add(3, packets[2].EntropyBit) + ack1 := frames.AckFrame{ + LargestObserved: 3, + Entropy: byte(entropy), + NackRanges: []frames.NackRange{nackRange2}, + } + err := handler.ReceivedAck(&ack1) + Expect(err).ToNot(HaveOccurred()) + entropy.Add(5, packets[4].EntropyBit) + ack2 := frames.AckFrame{ + LargestObserved: 5, + Entropy: byte(entropy), + NackRanges: []frames.NackRange{nackRange1, nackRange2}, + } + err = handler.ReceivedAck(&ack2) + Expect(err).ToNot(HaveOccurred()) + Expect(handler.packetHistory).To(HaveKey(protocol.PacketNumber(2))) + Expect(handler.packetHistory).To(HaveKey(protocol.PacketNumber(4))) + Expect(handler.packetHistory[2].MissingReports).To(Equal(uint8(2))) + Expect(handler.packetHistory[4].MissingReports).To(Equal(uint8(1))) + }) }) }) })