103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// found in the LICENSE file.
403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "net/quic/quic_sustained_bandwidth_recorder.h"
603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/logging.h"
803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "net/quic/quic_bandwidth.h"
903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "net/quic/quic_time.h"
1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace net {
1203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)QuicSustainedBandwidthRecorder::QuicSustainedBandwidthRecorder()
1403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    : has_estimate_(false),
1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      is_recording_(false),
1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      bandwidth_estimate_recorded_during_slow_start_(false),
1703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      bandwidth_estimate_(QuicBandwidth::Zero()),
1803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      max_bandwidth_estimate_(QuicBandwidth::Zero()),
1903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      max_bandwidth_timestamp_(0),
2003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      start_time_(QuicTime::Zero()) {}
2103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
2203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void QuicSustainedBandwidthRecorder::RecordEstimate(bool in_recovery,
2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                                    bool in_slow_start,
2403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                                    QuicBandwidth bandwidth,
2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                                    QuicTime estimate_time,
2603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                                    QuicWallTime wall_time,
2703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                                    QuicTime::Delta srtt) {
2803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (in_recovery) {
2903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    is_recording_ = false;
3003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    DVLOG(1) << "Stopped recording at: " << estimate_time.ToDebuggingValue();
3103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return;
3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
3303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
3403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (!is_recording_) {
3503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    // This is the first estimate of a new recording period.
3603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    start_time_ = estimate_time;
3703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    is_recording_ = true;
3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    DVLOG(1) << "Started recording at: " << start_time_.ToDebuggingValue();
3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return;
4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // If we have been recording for at least 3 * srtt, then record the latest
4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // bandwidth estimate as a valid sustained bandwidth estimate.
4403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (estimate_time.Subtract(start_time_) >= srtt.Multiply(3)) {
4503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    has_estimate_ = true;
4603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    bandwidth_estimate_recorded_during_slow_start_ = in_slow_start;
4703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    bandwidth_estimate_ = bandwidth;
4803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    DVLOG(1) << "New sustained bandwidth estimate (KBytes/s): "
4903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)             << bandwidth_estimate_.ToKBytesPerSecond();
5003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
5103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
5203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Check for an increase in max bandwidth.
5303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (bandwidth > max_bandwidth_estimate_) {
5403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    max_bandwidth_estimate_ = bandwidth;
5503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    max_bandwidth_timestamp_ = wall_time.ToUNIXSeconds();
5603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    DVLOG(1) << "New max bandwidth estimate (KBytes/s): "
5703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)             << max_bandwidth_estimate_.ToKBytesPerSecond();
5803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
5903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
6003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
6103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}  // namespace net
62