forked from quic-go/quic-go
increase missingReports counter for NACKed packets
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)))
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user