forked from quic-go/quic-go
don't ignore reordered ACKs
This commit is contained in:
@@ -30,8 +30,7 @@ type sentPacketHandler struct {
|
|||||||
|
|
||||||
nextSendTime time.Time
|
nextSendTime time.Time
|
||||||
|
|
||||||
largestAcked protocol.PacketNumber
|
largestAcked protocol.PacketNumber
|
||||||
largestReceivedWithAck protocol.PacketNumber
|
|
||||||
// lowestNotConfirmedAcked is the lowest packet number that we sent an ACK for, but haven't received confirmation, that this ACK actually arrived
|
// lowestNotConfirmedAcked is the lowest packet number that we sent an ACK for, but haven't received confirmation, that this ACK actually arrived
|
||||||
// example: we send an ACK for packets 90-100 with packet number 20
|
// example: we send an ACK for packets 90-100 with packet number 20
|
||||||
// once we receive an ACK from the peer for packet 20, the lowestNotConfirmedAcked is 101
|
// once we receive an ACK from the peer for packet 20, the lowestNotConfirmedAcked is 101
|
||||||
@@ -176,12 +175,6 @@ func (h *sentPacketHandler) ReceivedAck(ackFrame *wire.AckFrame, withPacketNumbe
|
|||||||
return qerr.Error(qerr.InvalidAckData, "Received ACK for an unsent package")
|
return qerr.Error(qerr.InvalidAckData, "Received ACK for an unsent package")
|
||||||
}
|
}
|
||||||
|
|
||||||
// duplicate or out of order ACK
|
|
||||||
if withPacketNumber != 0 && withPacketNumber < h.largestReceivedWithAck {
|
|
||||||
h.logger.Debugf("Ignoring ACK frame (duplicate or out of order).")
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
h.largestReceivedWithAck = withPacketNumber
|
|
||||||
h.largestAcked = utils.MaxPacketNumber(h.largestAcked, largestAcked)
|
h.largestAcked = utils.MaxPacketNumber(h.largestAcked, largestAcked)
|
||||||
|
|
||||||
if !h.packetNumberGenerator.Validate(ackFrame) {
|
if !h.packetNumberGenerator.Validate(ackFrame) {
|
||||||
|
|||||||
@@ -159,19 +159,6 @@ var _ = Describe("SentPacketHandler", func() {
|
|||||||
Expect(handler.largestAcked).To(Equal(protocol.PacketNumber(4)))
|
Expect(handler.largestAcked).To(Equal(protocol.PacketNumber(4)))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("rejects out of order ACKs", func() {
|
|
||||||
// acks packets 0, 1, 2, 3
|
|
||||||
ack1 := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 0, Largest: 3}}}
|
|
||||||
ack2 := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 0, Largest: 4}}}
|
|
||||||
err := handler.ReceivedAck(ack1, 1337, protocol.Encryption1RTT, time.Now())
|
|
||||||
Expect(err).ToNot(HaveOccurred())
|
|
||||||
// this wouldn't happen in practive
|
|
||||||
// a receiver wouldn't send an ACK for a lower largest acked in a packet sent later
|
|
||||||
err = handler.ReceivedAck(ack2, 1337-1, protocol.Encryption1RTT, time.Now())
|
|
||||||
Expect(err).ToNot(HaveOccurred())
|
|
||||||
Expect(handler.largestAcked).To(Equal(protocol.PacketNumber(3)))
|
|
||||||
})
|
|
||||||
|
|
||||||
It("rejects ACKs with a too high LargestAcked packet number", func() {
|
It("rejects ACKs with a too high LargestAcked packet number", func() {
|
||||||
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 0, Largest: 9999}}}
|
ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 0, Largest: 9999}}}
|
||||||
err := handler.ReceivedAck(ack, 1, protocol.Encryption1RTT, time.Now())
|
err := handler.ReceivedAck(ack, 1, protocol.Encryption1RTT, time.Now())
|
||||||
|
|||||||
Reference in New Issue
Block a user