Chromium Code Reviews| 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..5cb78e97353f6b2289c72185d0fafc503392b0c1 |
| --- /dev/null |
| +++ b/net/quic/congestion_control/send_algorithm_simulator.h |
| @@ -0,0 +1,135 @@ |
| +// 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 { |
| + |
| +const QuicByteCount kPacketSize = 1200; |
|
wtc
2014/06/16 19:35:56
Nit: in the net namespace, the constant name "kPac
ramant (doing other things)
2014/06/16 21:13:52
Done.
|
| + |
| +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); |
| + virtual ~SendAlgorithmSimulator(); |
|
wtc
2014/06/16 19:35:56
Nit: does the destructor need to be virtual? There
ramant (doing other things)
2014/06/16 21:13:52
Done.
|
| + |
| + 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() { return rtt_stats_; } |
| + |
| + QuicByteCount max_cwnd() { return max_cwnd_; } |
| + QuicByteCount min_cwnd() { return min_cwnd_; } |
| + QuicByteCount max_cwnd_drop() { return max_cwnd_drop_; } |
| + QuicByteCount last_cwnd() { return last_cwnd_; } |
|
wtc
2014/06/16 19:35:56
Nit: declare these getter methods as const.
ramant (doing other things)
2014/06/16 21:13:52
Done.
|
| + |
| + 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_ |