| /* |
| * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved. |
| * |
| * Use of this source code is governed by a BSD-style license |
| * that can be found in the LICENSE file in the root of the source |
| * tree. An additional intellectual property rights grant can be found |
| * in the file PATENTS. All contributing project authors may |
| * be found in the AUTHORS file in the root of the source tree. |
| */ |
| // A convenience class to store RTT samples and calculate smoothed RTT. |
| // From the Quic BBR implementation in Chromium. |
| |
| #ifndef MODULES_CONGESTION_CONTROLLER_BBR_RTT_STATS_H_ |
| #define MODULES_CONGESTION_CONTROLLER_BBR_RTT_STATS_H_ |
| |
| #include "api/units/time_delta.h" |
| #include "api/units/timestamp.h" |
| #include "rtc_base/checks.h" |
| #include "rtc_base/constructor_magic.h" |
| #include "rtc_base/logging.h" |
| |
| namespace webrtc { |
| namespace bbr { |
| |
| class RttStats { |
| public: |
| RttStats(); |
| |
| // 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(TimeDelta send_delta, TimeDelta ack_delay, Timestamp now); |
| |
| // Causes the smoothed_rtt to be increased to the latest_rtt if the latest_rtt |
| // is larger. The mean deviation is increased to the most recent deviation if |
| // it's larger. |
| void ExpireSmoothedMetrics(); |
| |
| // Called when connection migrates and RTT measurement needs to be reset. |
| void OnConnectionMigration(); |
| |
| // Returns the EWMA smoothed RTT for the connection. |
| // May return Zero if no valid updates have occurred. |
| TimeDelta smoothed_rtt() const { return smoothed_rtt_; } |
| |
| // Returns the EWMA smoothed RTT prior to the most recent RTT sample. |
| TimeDelta previous_srtt() const { return previous_srtt_; } |
| |
| int64_t 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_t initial_rtt_us) { |
| RTC_DCHECK_GE(initial_rtt_us, 0); |
| if (initial_rtt_us <= 0) { |
| RTC_LOG(LS_ERROR) << "Attempt to set initial rtt to <= 0."; |
| return; |
| } |
| initial_rtt_us_ = initial_rtt_us; |
| } |
| |
| // The most recent RTT measurement. |
| // May return Zero if no valid updates have occurred. |
| TimeDelta latest_rtt() const { return latest_rtt_; } |
| |
| // Returns the min_rtt for the entire connection. |
| // May return Zero if no valid updates have occurred. |
| TimeDelta min_rtt() const { return min_rtt_; } |
| |
| TimeDelta mean_deviation() const { return mean_deviation_; } |
| |
| private: |
| TimeDelta latest_rtt_; |
| TimeDelta min_rtt_; |
| TimeDelta smoothed_rtt_; |
| TimeDelta previous_srtt_; |
| // 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. |
| TimeDelta mean_deviation_; |
| int64_t initial_rtt_us_; |
| |
| RTC_DISALLOW_COPY_AND_ASSIGN(RttStats); |
| }; |
| |
| } // namespace bbr |
| } // namespace webrtc |
| |
| #endif // MODULES_CONGESTION_CONTROLLER_BBR_RTT_STATS_H_ |