1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "net/third_party/quiche/src/quic/test_tools/packet_reordering_writer.h"
6
7 namespace quic {
8 namespace test {
9
10 PacketReorderingWriter::PacketReorderingWriter() = default;
11
12 PacketReorderingWriter::~PacketReorderingWriter() = default;
13
WritePacket(const char * buffer,size_t buf_len,const QuicIpAddress & self_address,const QuicSocketAddress & peer_address,PerPacketOptions * options)14 WriteResult PacketReorderingWriter::WritePacket(
15 const char* buffer,
16 size_t buf_len,
17 const QuicIpAddress& self_address,
18 const QuicSocketAddress& peer_address,
19 PerPacketOptions* options) {
20 if (!delay_next_) {
21 QUIC_VLOG(2) << "Writing a non-delayed packet";
22 WriteResult wr = QuicPacketWriterWrapper::WritePacket(
23 buffer, buf_len, self_address, peer_address, options);
24 --num_packets_to_wait_;
25 if (num_packets_to_wait_ == 0) {
26 QUIC_VLOG(2) << "Writing a delayed packet";
27 // It's time to write the delayed packet.
28 QuicPacketWriterWrapper::WritePacket(
29 delayed_data_.data(), delayed_data_.length(), delayed_self_address_,
30 delayed_peer_address_, delayed_options_.get());
31 }
32 return wr;
33 }
34 // Still have packet to wait.
35 DCHECK_LT(0u, num_packets_to_wait_) << "Only allow one packet to be delayed";
36 delayed_data_ = std::string(buffer, buf_len);
37 delayed_self_address_ = self_address;
38 delayed_peer_address_ = peer_address;
39 if (options != nullptr) {
40 delayed_options_ = options->Clone();
41 }
42 delay_next_ = false;
43 return WriteResult(WRITE_STATUS_OK, buf_len);
44 }
45
SetDelay(size_t num_packets_to_wait)46 void PacketReorderingWriter::SetDelay(size_t num_packets_to_wait) {
47 DCHECK_GT(num_packets_to_wait, 0u);
48 num_packets_to_wait_ = num_packets_to_wait;
49 delay_next_ = true;
50 }
51
52 } // namespace test
53 } // namespace quic
54