diff --git a/ackhandler/sent_packet_handler.go b/ackhandler/sent_packet_handler.go index 80feccaf..569f3543 100644 --- a/ackhandler/sent_packet_handler.go +++ b/ackhandler/sent_packet_handler.go @@ -32,7 +32,7 @@ type sentPacketHandler struct { // TODO: Move into separate class as in chromium packetHistory map[protocol.PacketNumber]*Packet - retransmissionQueue []*Packet // ToDo: use better data structure + retransmissionQueue []*Packet stopWaitingManager StopWaitingManager bytesInFlight protocol.ByteCount @@ -210,8 +210,10 @@ func (h *sentPacketHandler) DequeuePacketForRetransmission() (packet *Packet) { if len(h.retransmissionQueue) == 0 { return nil } - packet = h.retransmissionQueue[0] - h.retransmissionQueue = h.retransmissionQueue[1:] + queueLen := len(h.retransmissionQueue) + // packets are usually NACKed in descending order. So use the slice as a stack + packet = h.retransmissionQueue[queueLen-1] + h.retransmissionQueue = h.retransmissionQueue[:queueLen-1] return packet } diff --git a/ackhandler/sent_packet_handler_test.go b/ackhandler/sent_packet_handler_test.go index b0c9dd12..e6a84a73 100644 --- a/ackhandler/sent_packet_handler_test.go +++ b/ackhandler/sent_packet_handler_test.go @@ -375,10 +375,10 @@ var _ = Describe("SentPacketHandler", func() { }) It("keeps the packets in the right order", func() { - handler.nackPacket(2) - handler.nackPacket(2) handler.nackPacket(4) handler.nackPacket(4) + handler.nackPacket(2) + handler.nackPacket(2) packet := handler.DequeuePacketForRetransmission() Expect(packet.PacketNumber).To(Equal(protocol.PacketNumber(2))) packet = handler.DequeuePacketForRetransmission() @@ -386,12 +386,12 @@ var _ = Describe("SentPacketHandler", func() { }) It("only queues each packet once, regardless of the number of NACKs", func() { - handler.nackPacket(2) - handler.nackPacket(2) handler.nackPacket(4) handler.nackPacket(4) handler.nackPacket(2) handler.nackPacket(2) + handler.nackPacket(4) + handler.nackPacket(4) _ = handler.DequeuePacketForRetransmission() _ = handler.DequeuePacketForRetransmission() Expect(handler.DequeuePacketForRetransmission()).To(BeNil()) diff --git a/session.go b/session.go index 9c664235..7e104aa1 100644 --- a/session.go +++ b/session.go @@ -333,7 +333,7 @@ func (s *Session) sendPacket() error { // TODO: handle multiple packets retransmissions retransmitPacket := s.sentPacketHandler.DequeuePacketForRetransmission() if retransmitPacket != nil { - utils.Debugf("\tQueueing retransmission for packet 0x%x", retransmitPacket.PacketNumber) + utils.Debugf("\tDequeueing retransmission for packet 0x%x", retransmitPacket.PacketNumber) s.stopWaitingManager.RegisterPacketForRetransmission(retransmitPacket) // resend the frames that were in the packet controlFrames = append(controlFrames, retransmitPacket.GetControlFramesForRetransmission()...)