From d23cacaddfd0383b439fd7b1d34c019ff6b81784 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Tue, 16 Aug 2016 12:21:31 +0700 Subject: [PATCH] always dequeue a StopWaiting if a packet contains a retransmission --- session.go | 4 +++- session_test.go | 7 ++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/session.go b/session.go index 667fac3b5..fd29b37a2 100644 --- a/session.go +++ b/session.go @@ -448,6 +448,7 @@ func (s *Session) sendPacket() error { } var controlFrames []frames.Frame + var hasRetransmission bool // check for retransmissions first for { @@ -455,6 +456,7 @@ func (s *Session) sendPacket() error { if retransmitPacket == nil { break } + hasRetransmission = true utils.Debugf("\tDequeueing retransmission for packet 0x%x", retransmitPacket.PacketNumber) if s.version <= protocol.Version33 { @@ -491,7 +493,7 @@ func (s *Session) sendPacket() error { if s.version <= protocol.Version33 { stopWaitingFrame = s.stopWaitingManager.GetStopWaitingFrame() } else { - if ack != nil { + if ack != nil || hasRetransmission { stopWaitingFrame = s.sentPacketHandler.GetStopWaitingFrame() } } diff --git a/session_test.go b/session_test.go index c613f61ed..2c32ae41e 100644 --- a/session_test.go +++ b/session_test.go @@ -50,6 +50,7 @@ type mockSentPacketHandler struct { retransmissionQueue []*ackhandlerlegacy.Packet congestionLimited bool maybeQueueRTOsCalled bool + requestedStopWaiting bool } func (h *mockSentPacketHandler) SentPacket(packet *ackhandlerlegacy.Packet) error { return nil } @@ -59,7 +60,8 @@ func (h *mockSentPacketHandler) ReceivedAck(ackFrame *frames.AckFrame, withPacke func (h *mockSentPacketHandler) BytesInFlight() protocol.ByteCount { return 0 } func (h *mockSentPacketHandler) GetLeastUnacked() protocol.PacketNumber { return 1 } func (h *mockSentPacketHandler) GetStopWaitingFrame() *frames.StopWaitingFrame { - panic("not implemented") + h.requestedStopWaiting = true + return nil } func (h *mockSentPacketHandler) CongestionAllowsSending() bool { return !h.congestionLimited } func (h *mockSentPacketHandler) CheckForError() error { return nil } @@ -542,6 +544,9 @@ var _ = Describe("Session", func() { err := session.sendPacket() Expect(err).NotTo(HaveOccurred()) Expect(conn.written).To(HaveLen(1)) + if session.version > protocol.Version33 { // before version 34, this was handled by the StopWaitingManager + Expect(sph.(*mockSentPacketHandler).requestedStopWaiting).To(BeTrue()) + } Expect(conn.written[0]).To(ContainSubstring("foobar1234567")) })