| Index: net/quic/congestion_control/send_algorithm_simulator.h
|
| diff --git a/net/quic/congestion_control/send_algorithm_simulator.h b/net/quic/congestion_control/send_algorithm_simulator.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..0c9a66b5d742768bfed288db5304c093ca14cfc4
|
| --- /dev/null
|
| +++ b/net/quic/congestion_control/send_algorithm_simulator.h
|
| @@ -0,0 +1,133 @@
|
| +// Copyright 2014 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.
|
| +
|
| +// A test only class to enable simulations of send algorithms.
|
| +
|
| +#ifndef NET_QUIC_CONGESTION_CONTROL_SEND_ALGORITHM_SIMULATOR_H_
|
| +#define NET_QUIC_CONGESTION_CONTROL_SEND_ALGORITHM_SIMULATOR_H_
|
| +
|
| +#include <algorithm>
|
| +
|
| +#include "base/basictypes.h"
|
| +#include "net/quic/congestion_control/send_algorithm_interface.h"
|
| +#include "net/quic/quic_protocol.h"
|
| +#include "net/quic/quic_time.h"
|
| +#include "net/quic/test_tools/mock_clock.h"
|
| +#include "net/quic/test_tools/quic_test_utils.h"
|
| +
|
| +namespace net {
|
| +
|
| +class NET_EXPORT_PRIVATE SendAlgorithmSimulator {
|
| + public:
|
| + struct SentPacket {
|
| + SentPacket(QuicPacketSequenceNumber sequence_number,
|
| + QuicTime send_time,
|
| + QuicTime ack_time) :
|
| + sequence_number(sequence_number),
|
| + send_time(send_time),
|
| + ack_time(ack_time) {}
|
| + QuicPacketSequenceNumber sequence_number;
|
| + QuicTime send_time;
|
| + QuicTime ack_time;
|
| + };
|
| +
|
| + // |rtt_stats| should be the same RttStats used by the |send_algorithm|.
|
| + SendAlgorithmSimulator(SendAlgorithmInterface* send_algorithm,
|
| + MockClock* clock_,
|
| + RttStats* rtt_stats,
|
| + QuicBandwidth bandwidth,
|
| + QuicTime::Delta rtt);
|
| + ~SendAlgorithmSimulator();
|
| +
|
| + void set_forward_loss_rate(float loss_rate) {
|
| + DCHECK_LT(loss_rate, 1.0f);
|
| + forward_loss_rate_ = loss_rate;
|
| + }
|
| +
|
| + void set_reverse_loss_rate(float loss_rate) {
|
| + DCHECK_LT(loss_rate, 1.0f);
|
| + reverse_loss_rate_ = loss_rate;
|
| + }
|
| +
|
| + void set_loss_correlation(float loss_correlation) {
|
| + DCHECK_LT(loss_correlation, 1.0f);
|
| + loss_correlation_ = loss_correlation;
|
| + }
|
| +
|
| + void set_buffer_size(size_t buffer_size_bytes) {
|
| + buffer_size_ = buffer_size_bytes;
|
| + }
|
| +
|
| + // Sends the specified number of bytes as quickly as possible and returns the
|
| + // average bandwidth in bytes per second. The time elapsed is based on
|
| + // waiting for all acks to arrive.
|
| + QuicBandwidth SendBytes(size_t num_bytes);
|
| +
|
| + const RttStats* rtt_stats() const { return rtt_stats_; }
|
| +
|
| + QuicByteCount max_cwnd() const { return max_cwnd_; }
|
| + QuicByteCount min_cwnd() const { return min_cwnd_; }
|
| + QuicByteCount max_cwnd_drop() const { return max_cwnd_drop_; }
|
| + QuicByteCount last_cwnd() const { return last_cwnd_; }
|
| +
|
| + private:
|
| + // NextAckTime takes into account packet loss in both forward and reverse
|
| + // direction, as well as delayed ack behavior.
|
| + QuicTime::Delta NextAckDelta();
|
| +
|
| + // Whether all packets in sent_packets_ are lost.
|
| + bool AllPacketsLost();
|
| +
|
| + // Sets the next acked.
|
| + void FindNextAcked();
|
| +
|
| + // Process all the acks that should have arrived by the current time, and
|
| + // lose any packets that are missing. Returns the number of bytes acked.
|
| + int HandlePendingAck();
|
| +
|
| + void SendDataNow();
|
| + void RecordStats();
|
| +
|
| + // Advance the time by |delta| without sending anything.
|
| + void AdvanceTime(QuicTime::Delta delta);
|
| +
|
| + // Elapsed time from the start of the connection.
|
| + QuicTime ElapsedTime();
|
| +
|
| + SendAlgorithmInterface* send_algorithm_;
|
| + MockClock* clock_;
|
| + RttStats* rtt_stats_;
|
| + // Next packet sequence number to send.
|
| + QuicPacketSequenceNumber next_sent_;
|
| + // Last packet sequence number acked.
|
| + QuicPacketSequenceNumber last_acked_;
|
| + // Packet sequence number to ack up to.
|
| + QuicPacketSequenceNumber next_acked_;
|
| + // Whether the next ack should be lost.
|
| + bool lose_next_ack_;
|
| + QuicByteCount bytes_in_flight_;
|
| + // The times acks are expected, assuming acks are not lost and every packet
|
| + // is acked.
|
| + std::list<SentPacket> sent_packets_;
|
| +
|
| + test::SimpleRandom simple_random_;
|
| + float forward_loss_rate_; // Loss rate on the forward path.
|
| + float reverse_loss_rate_; // Loss rate on the reverse path.
|
| + float loss_correlation_; // Likelihood the subsequent packet is lost.
|
| + QuicBandwidth bandwidth_;
|
| + QuicTime::Delta rtt_;
|
| + size_t buffer_size_; // In bytes.
|
| +
|
| + // Stats collected for understanding the congestion control.
|
| + QuicByteCount max_cwnd_;
|
| + QuicByteCount min_cwnd_;
|
| + QuicByteCount max_cwnd_drop_;
|
| + QuicByteCount last_cwnd_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(SendAlgorithmSimulator);
|
| +};
|
| +
|
| +} // namespace net
|
| +
|
| +#endif // NET_QUIC_CONGESTION_CONTROL_SEND_ALGORITHM_SIMULATOR_H_
|
|
|