forked from quic-go/quic-go
only delete a Packet from history in SentPacketHandler once it has been ACKed
This commit is contained in:
@@ -13,4 +13,5 @@ type Packet struct {
|
|||||||
Entropy EntropyAccumulator
|
Entropy EntropyAccumulator
|
||||||
|
|
||||||
MissingReports uint8
|
MissingReports uint8
|
||||||
|
Retransmitted bool // has this Packet ever been retransmitted
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,6 +50,12 @@ func (h *sentPacketHandler) nackPacket(packetNumber protocol.PacketNumber) error
|
|||||||
return ErrMapAccess
|
return ErrMapAccess
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if the packet has already been retransmit, do nothing
|
||||||
|
// we're probably only receiving another NACK for this packet because the retransmission has not yet arrived at the client
|
||||||
|
if packet.Retransmitted {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
packet.MissingReports++
|
packet.MissingReports++
|
||||||
|
|
||||||
if packet.MissingReports > retransmissionThreshold {
|
if packet.MissingReports > retransmissionThreshold {
|
||||||
@@ -58,20 +64,9 @@ func (h *sentPacketHandler) nackPacket(packetNumber protocol.PacketNumber) error
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *sentPacketHandler) recalculateHighestInOrderAckedPacketNumberFromPacketHistory() {
|
|
||||||
for i := h.highestInOrderAckedPacketNumber; i <= h.lastSentPacketNumber; i++ {
|
|
||||||
_, ok := h.packetHistory[i]
|
|
||||||
if ok {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
h.highestInOrderAckedPacketNumber = i
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (h *sentPacketHandler) queuePacketForRetransmission(packet *Packet) {
|
func (h *sentPacketHandler) queuePacketForRetransmission(packet *Packet) {
|
||||||
h.retransmissionQueue = append(h.retransmissionQueue, packet)
|
h.retransmissionQueue = append(h.retransmissionQueue, packet)
|
||||||
h.ackPacket(packet.PacketNumber)
|
packet.Retransmitted = true
|
||||||
h.recalculateHighestInOrderAckedPacketNumberFromPacketHistory()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *sentPacketHandler) SentPacket(packet *Packet) error {
|
func (h *sentPacketHandler) SentPacket(packet *Packet) error {
|
||||||
|
|||||||
@@ -340,15 +340,16 @@ var _ = Describe("SentPacketHandler", func() {
|
|||||||
Expect(handler.DequeuePacketForRetransmission()).To(BeNil())
|
Expect(handler.DequeuePacketForRetransmission()).To(BeNil())
|
||||||
})
|
})
|
||||||
|
|
||||||
It("recalculates the highestInOrderAckedPacketNumber after queueing a retransmission", func() {
|
It("does not change the highestInOrderAckedPacketNumber after queueing a retransmission", func() {
|
||||||
ack := frames.AckFrame{
|
ack := frames.AckFrame{
|
||||||
LargestObserved: 4,
|
LargestObserved: 4,
|
||||||
NackRanges: []frames.NackRange{frames.NackRange{FirstPacketNumber: 3, LastPacketNumber: 3}},
|
NackRanges: []frames.NackRange{frames.NackRange{FirstPacketNumber: 3, LastPacketNumber: 3}},
|
||||||
}
|
}
|
||||||
err := handler.ReceivedAck(&ack)
|
err := handler.ReceivedAck(&ack)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
Expect(handler.highestInOrderAckedPacketNumber).To(Equal(protocol.PacketNumber(2)))
|
||||||
handler.nackPacket(3) // this is the second NACK for this packet
|
handler.nackPacket(3) // this is the second NACK for this packet
|
||||||
Expect(handler.highestInOrderAckedPacketNumber).To(Equal(protocol.PacketNumber(4)))
|
Expect(handler.highestInOrderAckedPacketNumber).To(Equal(protocol.PacketNumber(2)))
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user