blob: 691b0c82dbd9fe04b35eaa50df9d0cf8b6f41083 [file] [log] [blame]
// 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 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_