1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "net/quic/quic_sustained_bandwidth_recorder.h" 6 7#include "base/logging.h" 8#include "net/quic/quic_bandwidth.h" 9#include "net/quic/quic_time.h" 10 11namespace net { 12 13QuicSustainedBandwidthRecorder::QuicSustainedBandwidthRecorder() 14 : has_estimate_(false), 15 is_recording_(false), 16 bandwidth_estimate_recorded_during_slow_start_(false), 17 bandwidth_estimate_(QuicBandwidth::Zero()), 18 max_bandwidth_estimate_(QuicBandwidth::Zero()), 19 max_bandwidth_timestamp_(0), 20 start_time_(QuicTime::Zero()) {} 21 22void QuicSustainedBandwidthRecorder::RecordEstimate(bool in_recovery, 23 bool in_slow_start, 24 QuicBandwidth bandwidth, 25 QuicTime estimate_time, 26 QuicWallTime wall_time, 27 QuicTime::Delta srtt) { 28 if (in_recovery) { 29 is_recording_ = false; 30 DVLOG(1) << "Stopped recording at: " << estimate_time.ToDebuggingValue(); 31 return; 32 } 33 34 if (!is_recording_) { 35 // This is the first estimate of a new recording period. 36 start_time_ = estimate_time; 37 is_recording_ = true; 38 DVLOG(1) << "Started recording at: " << start_time_.ToDebuggingValue(); 39 return; 40 } 41 42 // If we have been recording for at least 3 * srtt, then record the latest 43 // bandwidth estimate as a valid sustained bandwidth estimate. 44 if (estimate_time.Subtract(start_time_) >= srtt.Multiply(3)) { 45 has_estimate_ = true; 46 bandwidth_estimate_recorded_during_slow_start_ = in_slow_start; 47 bandwidth_estimate_ = bandwidth; 48 DVLOG(1) << "New sustained bandwidth estimate (KBytes/s): " 49 << bandwidth_estimate_.ToKBytesPerSecond(); 50 } 51 52 // Check for an increase in max bandwidth. 53 if (bandwidth > max_bandwidth_estimate_) { 54 max_bandwidth_estimate_ = bandwidth; 55 max_bandwidth_timestamp_ = wall_time.ToUNIXSeconds(); 56 DVLOG(1) << "New max bandwidth estimate (KBytes/s): " 57 << max_bandwidth_estimate_.ToKBytesPerSecond(); 58 } 59} 60 61} // namespace net 62