summaryrefslogtreecommitdiff
path: root/chromium/net/quic/congestion_control/channel_estimator.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/net/quic/congestion_control/channel_estimator.h')
-rw-r--r--chromium/net/quic/congestion_control/channel_estimator.h61
1 files changed, 61 insertions, 0 deletions
diff --git a/chromium/net/quic/congestion_control/channel_estimator.h b/chromium/net/quic/congestion_control/channel_estimator.h
new file mode 100644
index 00000000000..9be8031145b
--- /dev/null
+++ b/chromium/net/quic/congestion_control/channel_estimator.h
@@ -0,0 +1,61 @@
+// 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.
+
+// Based on the inter arrival time of the received packets relative to the time
+// those packets where sent we can estimate the max capacity of the channel.
+// We can only use packet pair that are sent out faster than the acctual
+// channel capacity.
+#ifndef NET_QUIC_CONGESTION_CONTROL_CHANNEL_ESTIMATOR_H_
+#define NET_QUIC_CONGESTION_CONTROL_CHANNEL_ESTIMATOR_H_
+
+#include <list>
+#include <map>
+
+#include "base/basictypes.h"
+#include "net/base/net_export.h"
+#include "net/quic/congestion_control/quic_max_sized_map.h"
+#include "net/quic/quic_bandwidth.h"
+#include "net/quic/quic_protocol.h"
+#include "net/quic/quic_time.h"
+
+namespace net {
+
+enum ChannelEstimateState {
+ kChannelEstimateUnknown = 0,
+ kChannelEstimateUncertain = 1,
+ kChannelEstimateGood = 2
+};
+
+class NET_EXPORT_PRIVATE ChannelEstimator {
+ public:
+ ChannelEstimator();
+ ~ChannelEstimator();
+
+ // This method should be called each time we acquire a receive time for a
+ // packet we previously sent. It calculates deltas between consecutive
+ // receive times, and may use that to update the channel bandwidth estimate.
+ void OnAcknowledgedPacket(QuicPacketSequenceNumber sequence_number,
+ QuicByteCount packet_size,
+ QuicTime send_time,
+ QuicTime receive_time);
+
+ // Get the current estimated state and channel capacity.
+ // Note: estimate will not be valid when kChannelEstimateUnknown is returned.
+ ChannelEstimateState GetChannelEstimate(QuicBandwidth* estimate) const;
+
+ private:
+ void UpdateFilter(QuicTime::Delta received_delta, QuicByteCount size_delta,
+ QuicPacketSequenceNumber sequence_number);
+
+ QuicPacketSequenceNumber last_sequence_number_;
+ QuicTime last_send_time_;
+ QuicTime last_receive_time_;
+ QuicMaxSizedMap<QuicBandwidth, QuicPacketSequenceNumber>
+ sorted_bitrate_estimates_;
+
+ DISALLOW_COPY_AND_ASSIGN(ChannelEstimator);
+};
+
+} // namespace net
+#endif // NET_QUIC_CONGESTION_CONTROL_CHANNEL_ESTIMATOR_H_