blob: 8eb8573a793788ac5764fb5c5ed53bcca51f3539 [file] [log] [blame]
// Copyright 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 "quiche/quic/test_tools/packet_reordering_writer.h"
namespace quic {
namespace test {
PacketReorderingWriter::PacketReorderingWriter() = default;
PacketReorderingWriter::~PacketReorderingWriter() = default;
WriteResult PacketReorderingWriter::WritePacket(
const char* buffer, size_t buf_len, const QuicIpAddress& self_address,
const QuicSocketAddress& peer_address, PerPacketOptions* options) {
if (!delay_next_) {
QUIC_VLOG(2) << "Writing a non-delayed packet";
WriteResult wr = QuicPacketWriterWrapper::WritePacket(
buffer, buf_len, self_address, peer_address, options);
--num_packets_to_wait_;
if (num_packets_to_wait_ == 0) {
QUIC_VLOG(2) << "Writing a delayed packet";
// It's time to write the delayed packet.
QuicPacketWriterWrapper::WritePacket(
delayed_data_.data(), delayed_data_.length(), delayed_self_address_,
delayed_peer_address_, delayed_options_.get());
}
return wr;
}
// Still have packet to wait.
QUICHE_DCHECK_LT(0u, num_packets_to_wait_)
<< "Only allow one packet to be delayed";
delayed_data_ = std::string(buffer, buf_len);
delayed_self_address_ = self_address;
delayed_peer_address_ = peer_address;
if (options != nullptr) {
delayed_options_ = options->Clone();
}
delay_next_ = false;
return WriteResult(WRITE_STATUS_OK, buf_len);
}
void PacketReorderingWriter::SetDelay(size_t num_packets_to_wait) {
QUICHE_DCHECK_GT(num_packets_to_wait, 0u);
num_packets_to_wait_ = num_packets_to_wait;
delay_next_ = true;
}
} // namespace test
} // namespace quic