// 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_