forked from quic-go/quic-go
don't add ACK ranges for delayed packets, if history was already deleted
This commit is contained in:
@@ -12,6 +12,8 @@ import (
|
|||||||
// It does not store packet contents.
|
// It does not store packet contents.
|
||||||
type receivedPacketHistory struct {
|
type receivedPacketHistory struct {
|
||||||
ranges *utils.PacketIntervalList
|
ranges *utils.PacketIntervalList
|
||||||
|
|
||||||
|
deletedBelow protocol.PacketNumber
|
||||||
}
|
}
|
||||||
|
|
||||||
var errTooManyOutstandingReceivedAckRanges = qerr.Error(qerr.InternalError, "Too many outstanding received ACK ranges")
|
var errTooManyOutstandingReceivedAckRanges = qerr.Error(qerr.InternalError, "Too many outstanding received ACK ranges")
|
||||||
@@ -25,6 +27,10 @@ func newReceivedPacketHistory() *receivedPacketHistory {
|
|||||||
|
|
||||||
// ReceivedPacket registers a packet with PacketNumber p and updates the ranges
|
// ReceivedPacket registers a packet with PacketNumber p and updates the ranges
|
||||||
func (h *receivedPacketHistory) ReceivedPacket(p protocol.PacketNumber) error {
|
func (h *receivedPacketHistory) ReceivedPacket(p protocol.PacketNumber) error {
|
||||||
|
// ignore delayed packets, if we already deleted the range
|
||||||
|
if p < h.deletedBelow {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
if h.ranges.Len() >= protocol.MaxTrackedReceivedAckRanges {
|
if h.ranges.Len() >= protocol.MaxTrackedReceivedAckRanges {
|
||||||
return errTooManyOutstandingReceivedAckRanges
|
return errTooManyOutstandingReceivedAckRanges
|
||||||
}
|
}
|
||||||
@@ -75,6 +81,11 @@ func (h *receivedPacketHistory) ReceivedPacket(p protocol.PacketNumber) error {
|
|||||||
|
|
||||||
// DeleteBelow deletes all entries below (but not including) p
|
// DeleteBelow deletes all entries below (but not including) p
|
||||||
func (h *receivedPacketHistory) DeleteBelow(p protocol.PacketNumber) {
|
func (h *receivedPacketHistory) DeleteBelow(p protocol.PacketNumber) {
|
||||||
|
if p < h.deletedBelow {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
h.deletedBelow = p
|
||||||
|
|
||||||
nextEl := h.ranges.Front()
|
nextEl := h.ranges.Front()
|
||||||
for el := h.ranges.Front(); nextEl != nil; el = nextEl {
|
for el := h.ranges.Front(); nextEl != nil; el = nextEl {
|
||||||
nextEl = el.Next()
|
nextEl = el.Next()
|
||||||
|
|||||||
@@ -174,6 +174,18 @@ var _ = Describe("receivedPacketHistory", func() {
|
|||||||
Expect(hist.ranges.Front().Value).To(Equal(utils.PacketInterval{Start: 4, End: 4}))
|
Expect(hist.ranges.Front().Value).To(Equal(utils.PacketInterval{Start: 4, End: 4}))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
It("doesn't add delayed packets below deleted ranges", func() {
|
||||||
|
hist.ReceivedPacket(4)
|
||||||
|
hist.ReceivedPacket(5)
|
||||||
|
hist.ReceivedPacket(6)
|
||||||
|
hist.DeleteBelow(5)
|
||||||
|
Expect(hist.ranges.Len()).To(Equal(1))
|
||||||
|
Expect(hist.ranges.Front().Value).To(Equal(utils.PacketInterval{Start: 5, End: 6}))
|
||||||
|
hist.ReceivedPacket(2)
|
||||||
|
Expect(hist.ranges.Len()).To(Equal(1))
|
||||||
|
Expect(hist.ranges.Front().Value).To(Equal(utils.PacketInterval{Start: 5, End: 6}))
|
||||||
|
})
|
||||||
|
|
||||||
Context("DoS protection", func() {
|
Context("DoS protection", func() {
|
||||||
It("doesn't create more than MaxTrackedReceivedAckRanges ranges", func() {
|
It("doesn't create more than MaxTrackedReceivedAckRanges ranges", func() {
|
||||||
for i := protocol.PacketNumber(1); i <= protocol.MaxTrackedReceivedAckRanges; i++ {
|
for i := protocol.PacketNumber(1); i <= protocol.MaxTrackedReceivedAckRanges; i++ {
|
||||||
|
|||||||
Reference in New Issue
Block a user