From b5764f22a2472b853867d9042cb46d08616f0390 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Sat, 29 Jun 2019 13:35:07 +0700 Subject: [PATCH] save the max_ack_delay in the rttStats --- internal/ackhandler/interfaces.go | 1 - internal/ackhandler/sent_packet_handler.go | 10 ++-------- internal/ackhandler/sent_packet_handler_test.go | 6 +++--- internal/congestion/rtt_stats.go | 8 ++++++++ internal/congestion/rtt_stats_test.go | 5 +++++ internal/mocks/ackhandler/sent_packet_handler.go | 12 ------------ session.go | 2 +- 7 files changed, 19 insertions(+), 25 deletions(-) diff --git a/internal/ackhandler/interfaces.go b/internal/ackhandler/interfaces.go index c7006f7d..905d6280 100644 --- a/internal/ackhandler/interfaces.go +++ b/internal/ackhandler/interfaces.go @@ -14,7 +14,6 @@ type SentPacketHandler interface { SentPacket(packet *Packet) SentPacketsAsRetransmission(packets []*Packet, retransmissionOf protocol.PacketNumber) ReceivedAck(ackFrame *wire.AckFrame, withPacketNumber protocol.PacketNumber, encLevel protocol.EncryptionLevel, recvTime time.Time) error - SetMaxAckDelay(time.Duration) DropPackets(protocol.EncryptionLevel) ResetForRetry() error diff --git a/internal/ackhandler/sent_packet_handler.go b/internal/ackhandler/sent_packet_handler.go index 08a1643b..2d81fc6f 100644 --- a/internal/ackhandler/sent_packet_handler.go +++ b/internal/ackhandler/sent_packet_handler.go @@ -60,8 +60,6 @@ type sentPacketHandler struct { congestion congestion.SendAlgorithmWithDebugInfos rttStats *congestion.RTTStats - maxAckDelay time.Duration - // The number of times the crypto packets have been retransmitted without receiving an ack. cryptoCount uint32 // The number of times a PTO has been sent without receiving an ack. @@ -135,10 +133,6 @@ func (h *sentPacketHandler) DropPackets(encLevel protocol.EncryptionLevel) { } } -func (h *sentPacketHandler) SetMaxAckDelay(mad time.Duration) { - h.maxAckDelay = mad -} - func (h *sentPacketHandler) SentPacket(packet *Packet) { if isAckEliciting := h.sentPacketImpl(packet); isAckEliciting { h.getPacketNumberSpace(packet.EncryptionLevel).history.SentPacket(packet) @@ -226,7 +220,7 @@ func (h *sentPacketHandler) ReceivedAck(ackFrame *wire.AckFrame, withPacketNumbe // don't use the ack delay for Initial and Handshake packets var ackDelay time.Duration if encLevel == protocol.Encryption1RTT { - ackDelay = utils.MinDuration(ackFrame.DelayTime, h.maxAckDelay) + ackDelay = utils.MinDuration(ackFrame.DelayTime, h.rttStats.MaxAckDelay()) } h.rttStats.UpdateRTT(rcvTime.Sub(p.SendTime), ackDelay, rcvTime) if h.logger.Debug() { @@ -664,7 +658,7 @@ func (h *sentPacketHandler) computeCryptoTimeout() time.Duration { } func (h *sentPacketHandler) computePTOTimeout() time.Duration { - duration := h.rttStats.SmoothedOrInitialRTT() + utils.MaxDuration(4*h.rttStats.MeanDeviation(), protocol.TimerGranularity) + h.maxAckDelay + duration := h.rttStats.SmoothedOrInitialRTT() + utils.MaxDuration(4*h.rttStats.MeanDeviation(), protocol.TimerGranularity) + h.rttStats.MaxAckDelay() return duration << h.ptoCount } diff --git a/internal/ackhandler/sent_packet_handler_test.go b/internal/ackhandler/sent_packet_handler_test.go index e3d894e9..de9d60eb 100644 --- a/internal/ackhandler/sent_packet_handler_test.go +++ b/internal/ackhandler/sent_packet_handler_test.go @@ -293,7 +293,7 @@ var _ = Describe("SentPacketHandler", func() { It("ignores the DelayTime for Initial and Handshake packets", func() { handler.SentPacket(cryptoPacket(&Packet{PacketNumber: 1})) - handler.SetMaxAckDelay(time.Hour) + handler.rttStats.SetMaxAckDelay(time.Hour) // make sure the rttStats have a min RTT, so that the delay is used handler.rttStats.UpdateRTT(5*time.Minute, 0, time.Now()) getPacket(1, protocol.EncryptionInitial).SendTime = time.Now().Add(-10 * time.Minute) @@ -306,7 +306,7 @@ var _ = Describe("SentPacketHandler", func() { }) It("uses the DelayTime in the ACK frame", func() { - handler.SetMaxAckDelay(time.Hour) + handler.rttStats.SetMaxAckDelay(time.Hour) // make sure the rttStats have a min RTT, so that the delay is used handler.rttStats.UpdateRTT(5*time.Minute, 0, time.Now()) getPacket(1, protocol.Encryption1RTT).SendTime = time.Now().Add(-10 * time.Minute) @@ -319,7 +319,7 @@ var _ = Describe("SentPacketHandler", func() { }) It("limits the DelayTime in the ACK frame to max_ack_delay", func() { - handler.SetMaxAckDelay(time.Minute) + handler.rttStats.SetMaxAckDelay(time.Minute) // make sure the rttStats have a min RTT, so that the delay is used handler.rttStats.UpdateRTT(5*time.Minute, 0, time.Now()) getPacket(1, protocol.Encryption1RTT).SendTime = time.Now().Add(-10 * time.Minute) diff --git a/internal/congestion/rtt_stats.go b/internal/congestion/rtt_stats.go index f0ebbb23..7c9b79ed 100644 --- a/internal/congestion/rtt_stats.go +++ b/internal/congestion/rtt_stats.go @@ -21,6 +21,8 @@ type RTTStats struct { latestRTT time.Duration smoothedRTT time.Duration meanDeviation time.Duration + + maxAckDelay time.Duration } // NewRTTStats makes a properly initialized RTTStats object @@ -52,6 +54,8 @@ func (r *RTTStats) SmoothedOrInitialRTT() time.Duration { // MeanDeviation gets the mean deviation func (r *RTTStats) MeanDeviation() time.Duration { return r.meanDeviation } +func (r *RTTStats) MaxAckDelay() time.Duration { return r.maxAckDelay } + // UpdateRTT updates the RTT based on a new sample. func (r *RTTStats) UpdateRTT(sendDelta, ackDelay time.Duration, now time.Time) { if sendDelta == utils.InfDuration || sendDelta <= 0 { @@ -84,6 +88,10 @@ func (r *RTTStats) UpdateRTT(sendDelta, ackDelay time.Duration, now time.Time) { } } +func (r *RTTStats) SetMaxAckDelay(mad time.Duration) { + r.maxAckDelay = mad +} + // OnConnectionMigration is called when connection migrates and rtt measurement needs to be reset. func (r *RTTStats) OnConnectionMigration() { r.latestRTT = 0 diff --git a/internal/congestion/rtt_stats_test.go b/internal/congestion/rtt_stats_test.go index e8f8c69c..2d3114aa 100644 --- a/internal/congestion/rtt_stats_test.go +++ b/internal/congestion/rtt_stats_test.go @@ -59,6 +59,11 @@ var _ = Describe("RTT stats", func() { Expect(rttStats.MinRTT()).To(Equal((7 * time.Millisecond))) }) + It("MaxAckDelay", func() { + rttStats.SetMaxAckDelay(42 * time.Minute) + Expect(rttStats.MaxAckDelay()).To(Equal(42 * time.Minute)) + }) + It("ExpireSmoothedMetrics", func() { initialRtt := (10 * time.Millisecond) rttStats.UpdateRTT(initialRtt, 0, time.Time{}) diff --git a/internal/mocks/ackhandler/sent_packet_handler.go b/internal/mocks/ackhandler/sent_packet_handler.go index 82f7bcaa..d915798f 100644 --- a/internal/mocks/ackhandler/sent_packet_handler.go +++ b/internal/mocks/ackhandler/sent_packet_handler.go @@ -230,18 +230,6 @@ func (mr *MockSentPacketHandlerMockRecorder) SentPacketsAsRetransmission(arg0, a return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SentPacketsAsRetransmission", reflect.TypeOf((*MockSentPacketHandler)(nil).SentPacketsAsRetransmission), arg0, arg1) } -// SetMaxAckDelay mocks base method -func (m *MockSentPacketHandler) SetMaxAckDelay(arg0 time.Duration) { - m.ctrl.T.Helper() - m.ctrl.Call(m, "SetMaxAckDelay", arg0) -} - -// SetMaxAckDelay indicates an expected call of SetMaxAckDelay -func (mr *MockSentPacketHandlerMockRecorder) SetMaxAckDelay(arg0 interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetMaxAckDelay", reflect.TypeOf((*MockSentPacketHandler)(nil).SetMaxAckDelay), arg0) -} - // ShouldSendNumPackets mocks base method func (m *MockSentPacketHandler) ShouldSendNumPackets() int { m.ctrl.T.Helper() diff --git a/session.go b/session.go index 8b8939a2..b71e96c8 100644 --- a/session.go +++ b/session.go @@ -1008,7 +1008,7 @@ func (s *session) processTransportParameters(data []byte) { s.packer.HandleTransportParameters(params) s.frameParser.SetAckDelayExponent(params.AckDelayExponent) s.connFlowController.UpdateSendWindow(params.InitialMaxData) - s.sentPacketHandler.SetMaxAckDelay(params.MaxAckDelay) + s.rttStats.SetMaxAckDelay(params.MaxAckDelay) if params.StatelessResetToken != nil { s.sessionRunner.AddResetToken(*params.StatelessResetToken, s) }