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