xref: /aosp_15_r20/external/cronet/net/third_party/quiche/src/quiche/quic/test_tools/packet_reordering_writer.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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 "quiche/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,const QuicPacketWriterParams & params)14 WriteResult PacketReorderingWriter::WritePacket(
15     const char* buffer, size_t buf_len, const QuicIpAddress& self_address,
16     const QuicSocketAddress& peer_address, PerPacketOptions* options,
17     const QuicPacketWriterParams& params) {
18   if (!delay_next_) {
19     QUIC_VLOG(2) << "Writing a non-delayed packet";
20     WriteResult wr = QuicPacketWriterWrapper::WritePacket(
21         buffer, buf_len, self_address, peer_address, options, params);
22     --num_packets_to_wait_;
23     if (num_packets_to_wait_ == 0) {
24       QUIC_VLOG(2) << "Writing a delayed packet";
25       // It's time to write the delayed packet.
26       QuicPacketWriterWrapper::WritePacket(
27           delayed_data_.data(), delayed_data_.length(), delayed_self_address_,
28           delayed_peer_address_, delayed_options_.get(), delayed_params_);
29     }
30     return wr;
31   }
32   // Still have packet to wait.
33   QUICHE_DCHECK_LT(0u, num_packets_to_wait_)
34       << "Only allow one packet to be delayed";
35   delayed_data_ = std::string(buffer, buf_len);
36   delayed_self_address_ = self_address;
37   delayed_peer_address_ = peer_address;
38   if (options != nullptr) {
39     delayed_options_ = options->Clone();
40   }
41   delayed_params_ = params;
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   QUICHE_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