From f8dc78967a04716b8e40b8391d6b641085f53943 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Fri, 13 May 2016 12:56:58 +0700 Subject: [PATCH] add method to ask SendPacketHandler if any retransmissions queued --- ackhandler/interfaces.go | 1 + ackhandler/sent_packet_handler.go | 10 +++++++++- ackhandler/sent_packet_handler_test.go | 7 +++++++ packet_packer_test.go | 4 ++++ 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/ackhandler/interfaces.go b/ackhandler/interfaces.go index d6a922de..1f956003 100644 --- a/ackhandler/interfaces.go +++ b/ackhandler/interfaces.go @@ -12,6 +12,7 @@ type SentPacketHandler interface { SentPacket(packet *Packet) error ReceivedAck(ackFrame *frames.AckFrame) (time.Duration, []*Packet, []*Packet, error) + HasPacketForRetransmission() bool DequeuePacketForRetransmission() (packet *Packet) BytesInFlight() protocol.ByteCount diff --git a/ackhandler/sent_packet_handler.go b/ackhandler/sent_packet_handler.go index be855597..1765cbc4 100644 --- a/ackhandler/sent_packet_handler.go +++ b/ackhandler/sent_packet_handler.go @@ -206,10 +206,18 @@ func (h *sentPacketHandler) ReceivedAck(ackFrame *frames.AckFrame) (time.Duratio 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) { - if len(h.retransmissionQueue) == 0 { + if !h.HasPacketForRetransmission() { return nil } + queueLen := len(h.retransmissionQueue) // packets are usually NACKed in descending order. So use the slice as a stack packet = h.retransmissionQueue[queueLen-1] diff --git a/ackhandler/sent_packet_handler_test.go b/ackhandler/sent_packet_handler_test.go index e2fa2bd3..ed1f0318 100644 --- a/ackhandler/sent_packet_handler_test.go +++ b/ackhandler/sent_packet_handler_test.go @@ -365,9 +365,16 @@ var _ = Describe("SentPacketHandler", func() { 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() { handler.nackPacket(2) handler.nackPacket(2) + Expect(handler.HasPacketForRetransmission()).To(BeTrue()) Expect(len(handler.retransmissionQueue)).To(Equal(1)) Expect(handler.retransmissionQueue[0].PacketNumber).To(Equal(protocol.PacketNumber(2))) }) diff --git a/packet_packer_test.go b/packet_packer_test.go index 5a101e82..29538d4b 100644 --- a/packet_packer_test.go +++ b/packet_packer_test.go @@ -27,6 +27,10 @@ func (h *mockSentPacketHandler) DequeuePacketForRetransmission() (packet *ackhan return nil } +func (h *mockSentPacketHandler) HasPacketForRetransmission() bool { + return false +} + func (h *mockSentPacketHandler) BytesInFlight() protocol.ByteCount { return 0 }