increase missingReports counter for NACKed packets

This commit is contained in:
Marten Seemann
2016-04-22 13:15:55 +07:00
parent 0fb7038747
commit 4eb088caa6
2 changed files with 45 additions and 8 deletions

View File

@@ -150,7 +150,7 @@ func (h *outgoingPacketAckHandler) ReceivedAck(ackFrame *frames.AckFrame) error
delete(h.packetHistory, i) 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 // this is the case if the PacketNumber is *not* contained in any of the NACK ranges
if ackFrame.HasNACK() { if ackFrame.HasNACK() {
nackRangeIndex := len(ackFrame.NackRanges) - 1 nackRangeIndex := len(ackFrame.NackRanges) - 1
@@ -163,11 +163,16 @@ func (h *outgoingPacketAckHandler) ReceivedAck(ackFrame *frames.AckFrame) error
nackRange = ackFrame.NackRanges[nackRangeIndex] 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 { 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
} }
} }

View File

@@ -177,7 +177,8 @@ var _ = Describe("AckHandler", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(handler.packetHistory).ToNot(HaveKey(protocol.PacketNumber(1))) Expect(handler.packetHistory).ToNot(HaveKey(protocol.PacketNumber(1)))
Expect(handler.packetHistory).To(HaveKey(protocol.PacketNumber(2))) 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).To(HaveKey(protocol.PacketNumber(4)))
}) })
@@ -196,7 +197,9 @@ var _ = Describe("AckHandler", func() {
Expect(handler.packetHistory).ToNot(HaveKey(protocol.PacketNumber(1))) Expect(handler.packetHistory).ToNot(HaveKey(protocol.PacketNumber(1)))
Expect(handler.packetHistory).To(HaveKey(protocol.PacketNumber(2))) Expect(handler.packetHistory).To(HaveKey(protocol.PacketNumber(2)))
Expect(handler.packetHistory).To(HaveKey(protocol.PacketNumber(3))) 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() { It("handles an ACK with multiple NACK ranges", func() {
@@ -217,9 +220,11 @@ var _ = Describe("AckHandler", func() {
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
Expect(handler.packetHistory).ToNot(HaveKey(protocol.PacketNumber(1))) Expect(handler.packetHistory).ToNot(HaveKey(protocol.PacketNumber(1)))
Expect(handler.packetHistory).To(HaveKey(protocol.PacketNumber(2))) 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).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() { It("rejects an ACK with a NACK that has incorrect entropy", func() {
@@ -258,6 +263,33 @@ var _ = Describe("AckHandler", func() {
err = handler.ReceivedAck(&ack) err = handler.ReceivedAck(&ack)
Expect(err).ToNot(HaveOccurred()) 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)))
})
}) })
}) })
}) })