// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // A convenience class to store rtt samples and calculate smoothed rtt. #ifndef NET_QUIC_CONGESTION_CONTROL_RTT_STATS_H_ #define NET_QUIC_CONGESTION_CONTROL_RTT_STATS_H_ #include <algorithm> #include "base/basictypes.h" #include "net/quic/quic_protocol.h" #include "net/quic/quic_time.h" namespace net { namespace test { class RttStatsPeer; } // namespace test class NET_EXPORT_PRIVATE RttStats { public: RttStats(); // Returns true if any RTT measurements have been made. bool HasUpdates() const; // Updates the RTT from an incoming ack which is received |send_delta| after // the packet is sent and the peer reports the ack being delayed |ack_delay|. void UpdateRtt(QuicTime::Delta send_delta, QuicTime::Delta ack_delay, QuicTime now); // Forces RttStats to sample a new recent min rtt within the next // |num_samples| UpdateRtt calls. void SampleNewRecentMinRtt(uint32 num_samples); QuicTime::Delta SmoothedRtt() const; int64 initial_rtt_us() const { return initial_rtt_us_; } // Sets an initial RTT to be used for SmoothedRtt before any RTT updates. void set_initial_rtt_us(int64 initial_rtt_us) { initial_rtt_us_ = initial_rtt_us; } QuicTime::Delta latest_rtt() const { return latest_rtt_; } // Returns the min_rtt for the entire connection. QuicTime::Delta min_rtt() const { return min_rtt_; } // Returns the min_rtt since SampleNewRecentMinRtt has been called, or the // min_rtt for the entire connection if SampleNewMinRtt was never called. QuicTime::Delta recent_min_rtt() const { return recent_min_rtt_.rtt; } QuicTime::Delta mean_deviation() const { return mean_deviation_; } // Sets how old a recent min rtt sample can be. void set_recent_min_rtt_window(QuicTime::Delta recent_min_rtt_window) { recent_min_rtt_window_ = recent_min_rtt_window; } private: friend class test::RttStatsPeer; // Used to track a sampled RTT window. struct RttSample { RttSample() : rtt(QuicTime::Delta::Zero()), time(QuicTime::Zero()) { } RttSample(QuicTime::Delta rtt, QuicTime time) : rtt(rtt), time(time) { } QuicTime::Delta rtt; QuicTime time; // Time the rtt sample was recorded. }; // Implements the resampling algorithm and the windowed min rtt algorithm. void UpdateRecentMinRtt(QuicTime::Delta rtt_sample, QuicTime now); QuicTime::Delta latest_rtt_; QuicTime::Delta min_rtt_; QuicTime::Delta smoothed_rtt_; // Mean RTT deviation during this session. // Approximation of standard deviation, the error is roughly 1.25 times // larger than the standard deviation, for a normally distributed signal. QuicTime::Delta mean_deviation_; int64 initial_rtt_us_; RttSample new_min_rtt_; uint32 num_min_rtt_samples_remaining_; // State variables for Kathleen Nichols MinRTT algorithm. QuicTime::Delta recent_min_rtt_window_; RttSample recent_min_rtt_; // a in the windowed algorithm. RttSample half_window_rtt_; // b in the sampled algorithm. RttSample quarter_window_rtt_; // c in the sampled algorithm. DISALLOW_COPY_AND_ASSIGN(RttStats); }; } // namespace net #endif // NET_QUIC_CONGESTION_CONTROL_RTT_STATS_H_