diff --git a/ackhandler/sent_packet_handler.go b/ackhandler/sent_packet_handler.go index e7984723..d3a36de3 100644 --- a/ackhandler/sent_packet_handler.go +++ b/ackhandler/sent_packet_handler.go @@ -328,6 +328,11 @@ func (h *sentPacketHandler) GetStopWaitingFrame(force bool) *frames.StopWaitingF func (h *sentPacketHandler) SendingAllowed() bool { congestionLimited := h.bytesInFlight > h.congestion.GetCongestionWindow() maxTrackedLimited := protocol.PacketNumber(len(h.retransmissionQueue)+h.packetHistory.Len()) >= protocol.MaxTrackedSentPackets + if congestionLimited { + utils.Debugf("Congestion limited: bytes in flight %d, window %d", + h.bytesInFlight, + h.congestion.GetCongestionWindow()) + } return !(congestionLimited || maxTrackedLimited) } @@ -342,7 +347,11 @@ func (h *sentPacketHandler) retransmitOldestTwoPackets() { func (h *sentPacketHandler) queueRTO(el *PacketElement) { packet := &el.Value - utils.Debugf("\tQueueing packet 0x%x for retransmission (RTO)", packet.PacketNumber) + utils.Debugf( + "\tQueueing packet 0x%x for retransmission (RTO), %d outstanding", + packet.PacketNumber, + h.packetHistory.Len(), + ) h.queuePacketForRetransmission(el) h.congestion.OnPacketLost(packet.PacketNumber, packet.Length, h.bytesInFlight) h.congestion.OnRetransmissionTimeout(true) @@ -352,11 +361,7 @@ func (h *sentPacketHandler) queuePacketForRetransmission(packetElement *PacketEl packet := &packetElement.Value h.bytesInFlight -= packet.Length h.retransmissionQueue = append(h.retransmissionQueue, packet) - h.packetHistory.Remove(packetElement) - - // strictly speaking, this is only necessary for RTO retransmissions - // this is because FastRetransmissions are triggered by missing ranges in ACKs, and then the LargestAcked will already be higher than the packet number of the retransmitted packet h.stopWaitingManager.QueuedRetransmissionForPacketNumber(packet.PacketNumber) } diff --git a/session.go b/session.go index 5b7a96fe..130a55cd 100644 --- a/session.go +++ b/session.go @@ -552,10 +552,7 @@ func (s *session) sendPacket() error { // get WindowUpdate frames // this call triggers the flow controller to increase the flow control windows, if necessary - windowUpdateFrames, err := s.getWindowUpdateFrames() - if err != nil { - return err - } + windowUpdateFrames := s.getWindowUpdateFrames() for _, wuf := range windowUpdateFrames { controlFrames = append(controlFrames, wuf) } @@ -572,7 +569,7 @@ func (s *session) sendPacket() error { utils.Debugf("\tDequeueing handshake retransmission for packet 0x%x", retransmitPacket.PacketNumber) stopWaitingFrame := s.sentPacketHandler.GetStopWaitingFrame(true) var packet *packedPacket - packet, err = s.packer.RetransmitNonForwardSecurePacket(stopWaitingFrame, retransmitPacket) + packet, err := s.packer.RetransmitNonForwardSecurePacket(stopWaitingFrame, retransmitPacket) if err != nil { return err } @@ -594,7 +591,7 @@ func (s *session) sendPacket() error { // only retransmit WindowUpdates if the stream is not yet closed and the we haven't sent another WindowUpdate with a higher ByteOffset for the stream var currentOffset protocol.ByteCount f := frame.(*frames.WindowUpdateFrame) - currentOffset, err = s.flowControlManager.GetReceiveWindow(f.StreamID) + currentOffset, err := s.flowControlManager.GetReceiveWindow(f.StreamID) if err == nil && f.ByteOffset >= currentOffset { controlFrames = append(controlFrames, frame) } @@ -779,13 +776,13 @@ func (s *session) tryDecryptingQueuedPackets() { s.undecryptablePackets = s.undecryptablePackets[:0] } -func (s *session) getWindowUpdateFrames() ([]*frames.WindowUpdateFrame, error) { +func (s *session) getWindowUpdateFrames() []*frames.WindowUpdateFrame { updates := s.flowControlManager.GetWindowUpdates() res := make([]*frames.WindowUpdateFrame, len(updates)) for i, u := range updates { res[i] = &frames.WindowUpdateFrame{StreamID: u.StreamID, ByteOffset: u.Offset} } - return res, nil + return res } func (s *session) ackAlarmChanged(t time.Time) { diff --git a/session_test.go b/session_test.go index f228b12f..e0307b87 100644 --- a/session_test.go +++ b/session_test.go @@ -1423,8 +1423,7 @@ var _ = Describe("Session", func() { It("gets stream level window updates", func() { err := sess.flowControlManager.AddBytesRead(1, protocol.ReceiveStreamFlowControlWindow) Expect(err).NotTo(HaveOccurred()) - frames, err := sess.getWindowUpdateFrames() - Expect(err).NotTo(HaveOccurred()) + frames := sess.getWindowUpdateFrames() Expect(frames).To(HaveLen(1)) Expect(frames[0].StreamID).To(Equal(protocol.StreamID(1))) Expect(frames[0].ByteOffset).To(Equal(protocol.ReceiveStreamFlowControlWindow * 2)) @@ -1435,8 +1434,7 @@ var _ = Describe("Session", func() { Expect(err).NotTo(HaveOccurred()) err = sess.flowControlManager.AddBytesRead(5, protocol.ReceiveConnectionFlowControlWindow) Expect(err).NotTo(HaveOccurred()) - frames, err := sess.getWindowUpdateFrames() - Expect(err).NotTo(HaveOccurred()) + frames := sess.getWindowUpdateFrames() Expect(frames).To(HaveLen(1)) Expect(frames[0].StreamID).To(Equal(protocol.StreamID(0))) Expect(frames[0].ByteOffset).To(Equal(protocol.ReceiveConnectionFlowControlWindow * 2))