forked from quic-go/quic-go
add method to ask SendPacketHandler if any retransmissions queued
This commit is contained in:
@@ -12,6 +12,7 @@ type SentPacketHandler interface {
|
|||||||
SentPacket(packet *Packet) error
|
SentPacket(packet *Packet) error
|
||||||
ReceivedAck(ackFrame *frames.AckFrame) (time.Duration, []*Packet, []*Packet, error)
|
ReceivedAck(ackFrame *frames.AckFrame) (time.Duration, []*Packet, []*Packet, error)
|
||||||
|
|
||||||
|
HasPacketForRetransmission() bool
|
||||||
DequeuePacketForRetransmission() (packet *Packet)
|
DequeuePacketForRetransmission() (packet *Packet)
|
||||||
|
|
||||||
BytesInFlight() protocol.ByteCount
|
BytesInFlight() protocol.ByteCount
|
||||||
|
|||||||
@@ -206,10 +206,18 @@ func (h *sentPacketHandler) ReceivedAck(ackFrame *frames.AckFrame) (time.Duratio
|
|||||||
return timeDelta, ackedPackets, lostPackets, nil
|
return timeDelta, ackedPackets, lostPackets, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h *sentPacketHandler) HasPacketForRetransmission() bool {
|
||||||
|
if len(h.retransmissionQueue) > 0 {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
func (h *sentPacketHandler) DequeuePacketForRetransmission() (packet *Packet) {
|
func (h *sentPacketHandler) DequeuePacketForRetransmission() (packet *Packet) {
|
||||||
if len(h.retransmissionQueue) == 0 {
|
if !h.HasPacketForRetransmission() {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
queueLen := len(h.retransmissionQueue)
|
queueLen := len(h.retransmissionQueue)
|
||||||
// packets are usually NACKed in descending order. So use the slice as a stack
|
// packets are usually NACKed in descending order. So use the slice as a stack
|
||||||
packet = h.retransmissionQueue[queueLen-1]
|
packet = h.retransmissionQueue[queueLen-1]
|
||||||
|
|||||||
@@ -365,9 +365,16 @@ var _ = Describe("SentPacketHandler", func() {
|
|||||||
Expect(handler.BytesInFlight()).To(Equal(protocol.ByteCount(6)))
|
Expect(handler.BytesInFlight()).To(Equal(protocol.ByteCount(6)))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
It("does not dequeue a packet if no packet has been nacked", func() {
|
||||||
|
handler.nackPacket(2)
|
||||||
|
Expect(handler.HasPacketForRetransmission()).To(BeFalse())
|
||||||
|
Expect(handler.DequeuePacketForRetransmission()).To(BeNil())
|
||||||
|
})
|
||||||
|
|
||||||
It("queues a packet for retransmission", func() {
|
It("queues a packet for retransmission", func() {
|
||||||
handler.nackPacket(2)
|
handler.nackPacket(2)
|
||||||
handler.nackPacket(2)
|
handler.nackPacket(2)
|
||||||
|
Expect(handler.HasPacketForRetransmission()).To(BeTrue())
|
||||||
Expect(len(handler.retransmissionQueue)).To(Equal(1))
|
Expect(len(handler.retransmissionQueue)).To(Equal(1))
|
||||||
Expect(handler.retransmissionQueue[0].PacketNumber).To(Equal(protocol.PacketNumber(2)))
|
Expect(handler.retransmissionQueue[0].PacketNumber).To(Equal(protocol.PacketNumber(2)))
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -27,6 +27,10 @@ func (h *mockSentPacketHandler) DequeuePacketForRetransmission() (packet *ackhan
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h *mockSentPacketHandler) HasPacketForRetransmission() bool {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
func (h *mockSentPacketHandler) BytesInFlight() protocol.ByteCount {
|
func (h *mockSentPacketHandler) BytesInFlight() protocol.ByteCount {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user