diff --git a/session.go b/session.go index c9e3743b..ce9b40f5 100644 --- a/session.go +++ b/session.go @@ -933,6 +933,12 @@ sendLoop: case ackhandler.SendNone: break sendLoop case ackhandler.SendAck: + // If we already sent packets, and the send mode switches to SendAck, + // we've just become congestion limited. + // There's no need to try to send an ACK at this moment. + if numPacketsSent > 0 { + return nil + } // We can at most send a single ACK only packet. // There will only be a new ACK after receiving new packets. // SendAck is only returned when we're congestion limited, so we don't need to set the pacingt timer. diff --git a/session_test.go b/session_test.go index 06167ad5..26cc4650 100644 --- a/session_test.go +++ b/session_test.go @@ -890,6 +890,10 @@ var _ = Describe("Session", func() { sph.EXPECT().TimeUntilSend().Return(time.Now()) sph.EXPECT().SendMode().Return(ackhandler.SendAny) sph.EXPECT().SendMode().Return(ackhandler.SendAck) + rph := mockackhandler.NewMockReceivedPacketHandler(mockCtrl) + rph.EXPECT().GetAlarmTimeout().Return(time.Now().Add(time.Hour)).Times(2) + rph.EXPECT().GetAckFrame() + sess.receivedPacketHandler = rph done := make(chan struct{}) go func() { defer GinkgoRecover()