forked from quic-go/quic-go
properly increase LargestInOrderAcked past retransmitted packets
This commit is contained in:
@@ -108,15 +108,14 @@ func (h *sentPacketHandler) queuePacketForRetransmission(packet *ackhandlerlegac
|
||||
h.retransmissionQueue = append(h.retransmissionQueue, packet)
|
||||
packet.Retransmitted = true
|
||||
|
||||
// increase the LargestInOrderAcked, if this is the lowest packet that hasn't been acked yet
|
||||
// If this is the lowest packet that hasn't been acked or retransmitted yet ...
|
||||
if packet.PacketNumber == h.LargestInOrderAcked+1 {
|
||||
for i := packet.PacketNumber + 1; i < h.LargestAcked; i++ {
|
||||
_, ok := h.packetHistory[protocol.PacketNumber(i)]
|
||||
if !ok {
|
||||
h.LargestInOrderAcked = i
|
||||
} else {
|
||||
// ... increase the LargestInOrderAcked until it's one before the next packet that was not acked and not retransmitted
|
||||
for h.LargestInOrderAcked < h.LargestAcked {
|
||||
if p, notAcked := h.packetHistory[h.LargestInOrderAcked+1]; notAcked && !p.Retransmitted {
|
||||
break
|
||||
}
|
||||
h.LargestInOrderAcked++
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -529,6 +529,31 @@ var _ = Describe("SentPacketHandler", func() {
|
||||
Expect(handler.LargestInOrderAcked).To(Equal(protocol.PacketNumber(2)))
|
||||
})
|
||||
|
||||
It("increases LargestInOrderAcked past packets queued for retransmission", func() {
|
||||
ack := frames.AckFrame{
|
||||
LargestAcked: 7,
|
||||
LowestAcked: 1,
|
||||
AckRanges: []frames.AckRange{
|
||||
{FirstPacketNumber: 7, LastPacketNumber: 7},
|
||||
{FirstPacketNumber: 4, LastPacketNumber: 5},
|
||||
{FirstPacketNumber: 1, LastPacketNumber: 1},
|
||||
},
|
||||
}
|
||||
err := handler.ReceivedAck(&ack, 1)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
// this will trigger a retransmission of packet 3
|
||||
for i := uint8(0); i < protocol.RetransmissionThreshold; i++ {
|
||||
handler.nackPacket(3)
|
||||
}
|
||||
Expect(handler.LargestInOrderAcked).To(Equal(protocol.PacketNumber(1)))
|
||||
// now, trigger retransmission of 2 ...
|
||||
for i := uint8(0); i < protocol.RetransmissionThreshold; i++ {
|
||||
handler.nackPacket(2)
|
||||
}
|
||||
// and check that it increased LargestInOrderAcked past 3
|
||||
Expect(handler.LargestInOrderAcked).To(Equal(protocol.PacketNumber(5)))
|
||||
})
|
||||
|
||||
It("does not retransmit a packet if a belated ACK was received", func() {
|
||||
// lose packet by NACKing it often enough
|
||||
for i := uint8(0); i < protocol.RetransmissionThreshold+1; i++ {
|
||||
|
||||
Reference in New Issue
Block a user