summaryrefslogtreecommitdiff
path: root/chromium/net/quic/congestion_control/available_channel_estimator.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/net/quic/congestion_control/available_channel_estimator.cc')
-rw-r--r--chromium/net/quic/congestion_control/available_channel_estimator.cc78
1 files changed, 78 insertions, 0 deletions
diff --git a/chromium/net/quic/congestion_control/available_channel_estimator.cc b/chromium/net/quic/congestion_control/available_channel_estimator.cc
new file mode 100644
index 00000000000..ef091abce43
--- /dev/null
+++ b/chromium/net/quic/congestion_control/available_channel_estimator.cc
@@ -0,0 +1,78 @@
+// Copyright (c) 2013 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.
+
+#include "net/quic/congestion_control/available_channel_estimator.h"
+
+static const int kNumberOfSamples = 9;
+
+namespace net {
+
+AvailableChannelEstimator::AvailableChannelEstimator(
+ QuicPacketSequenceNumber sequence_number,
+ QuicTime first_send_time,
+ QuicTime first_receive_time)
+ : first_sequence_number_(sequence_number),
+ first_send_time_(first_send_time),
+ first_receive_time_(first_receive_time),
+ last_incorporated_sequence_number_(sequence_number),
+ last_time_sent_(QuicTime::Zero()),
+ last_receive_time_(QuicTime::Zero()),
+ number_of_sequence_numbers_(0),
+ received_bytes_(0) {
+}
+
+void AvailableChannelEstimator::OnIncomingFeedback(
+ QuicPacketSequenceNumber sequence_number,
+ QuicByteCount packet_size,
+ QuicTime sent_time,
+ QuicTime receive_time) {
+ if (sequence_number <= first_sequence_number_) {
+ // Ignore pre-probe feedback.
+ return;
+ }
+ if (sequence_number <= last_incorporated_sequence_number_) {
+ // Ignore old feedback; will remove duplicates.
+ return;
+ }
+ // Remember the highest received sequence number.
+ last_incorporated_sequence_number_ = sequence_number;
+ if (number_of_sequence_numbers_ < kNumberOfSamples) {
+ // We don't care how many sequence numbers we have after we pass
+ // kNumberOfSamples.
+ number_of_sequence_numbers_++;
+ }
+ last_receive_time_ = receive_time;
+ last_time_sent_ = sent_time;
+ received_bytes_ += packet_size;
+ // TODO(pwestin): the variance here should give us information about accuracy.
+}
+
+AvailableChannelEstimateState
+ AvailableChannelEstimator::GetAvailableChannelEstimate(
+ QuicBandwidth* bandwidth) const {
+ if (number_of_sequence_numbers_ < 2) {
+ return kAvailableChannelEstimateUnknown;
+ }
+ QuicTime::Delta send_delta = last_time_sent_.Subtract(first_send_time_);
+ QuicTime::Delta receive_delta =
+ last_receive_time_.Subtract(first_receive_time_);
+
+ // TODO(pwestin): room for improvement here. Keeping it simple for now.
+ *bandwidth = QuicBandwidth::FromBytesAndTimeDelta(received_bytes_,
+ receive_delta);
+
+ QuicTime::Delta diff = receive_delta.Subtract(send_delta);
+ QuicTime::Delta ten_percent_of_send_time =
+ QuicTime::Delta::FromMicroseconds(send_delta.ToMicroseconds() / 10);
+
+ if (diff < ten_percent_of_send_time) {
+ return kAvailableChannelEstimateSenderLimited;
+ }
+ if (number_of_sequence_numbers_ < kNumberOfSamples) {
+ return kAvailableChannelEstimateUncertain;
+ }
+ return kAvailableChannelEstimateGood;
+}
+
+} // namespace net