|  | // Copyright (c) 2018 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. | 
|  |  | 
|  | #ifndef QUICHE_QUIC_QUARTC_SIMULATED_PACKET_TRANSPORT_H_ | 
|  | #define QUICHE_QUIC_QUARTC_SIMULATED_PACKET_TRANSPORT_H_ | 
|  |  | 
|  | #include <string> | 
|  |  | 
|  | #include "net/third_party/quiche/src/quic/quartc/quartc_packet_writer.h" | 
|  | #include "net/third_party/quiche/src/quic/test_tools/simulator/port.h" | 
|  | #include "net/third_party/quiche/src/quic/test_tools/simulator/queue.h" | 
|  |  | 
|  | namespace quic { | 
|  | namespace simulator { | 
|  |  | 
|  | // Simulated implementation of QuartcPacketTransport.  This packet transport | 
|  | // implementation connects Quartc to a QUIC simulator's network fabric. | 
|  | // Assumes that its caller and delegate run on the same thread as the network | 
|  | // simulation and therefore require no additional synchronization. | 
|  | class SimulatedQuartcPacketTransport : public Endpoint, | 
|  | public QuartcPacketTransport, | 
|  | public UnconstrainedPortInterface, | 
|  | public Queue::ListenerInterface { | 
|  | public: | 
|  | SimulatedQuartcPacketTransport(Simulator* simulator, | 
|  | const std::string& name, | 
|  | const std::string& peer_name, | 
|  | QuicByteCount queue_capacity); | 
|  |  | 
|  | // QuartcPacketTransport methods. | 
|  | int Write(const char* buffer, | 
|  | size_t buf_len, | 
|  | const PacketInfo& info) override; | 
|  | void SetDelegate(Delegate* delegate) override; | 
|  |  | 
|  | // Simulation methods below.  These are implementation details. | 
|  |  | 
|  | // Endpoint methods.  Called by the simulation to connect the transport. | 
|  | UnconstrainedPortInterface* GetRxPort() override; | 
|  | void SetTxPort(ConstrainedPortInterface* port) override; | 
|  |  | 
|  | // UnconstrainedPortInterface method.  Called by the simulation to deliver a | 
|  | // packet to this transport. | 
|  | void AcceptPacket(std::unique_ptr<Packet> packet) override; | 
|  |  | 
|  | // Queue::ListenerInterface method.  Called when the internal egress queue has | 
|  | // dispatched a packet and may have room for more. | 
|  | void OnPacketDequeued() override; | 
|  |  | 
|  | // Actor method.  The transport schedules this to run when the delegate is set | 
|  | // in order to trigger an initial call to |Delegate::OnTransportCanWrite()|. | 
|  | // (The Quartc packet writer starts in a blocked state and needs an initial | 
|  | // callback to unblock it.) | 
|  | void Act() override; | 
|  |  | 
|  | // Changes whether the transport is writable.  If |writable| is false, the | 
|  | // transport will reject calls to |Write| and will not call | 
|  | // |Delegate::OnTransportCanWrite|.  If |writable| is true, the transport will | 
|  | // allow calls to |Write| and will call |Delegate::OnTransportCanWrite| | 
|  | // whenever it is able to write another packet. | 
|  | void SetWritable(bool writable); | 
|  |  | 
|  | // Last packet number sent over this simulated transport. | 
|  | // TODO(b/112561077):  Reorganize tests so that this method can be deleted. | 
|  | // This exists purely for use by quartc_session_test.cc, to test that the | 
|  | // packet writer passes packet numbers to the transport. | 
|  | QuicPacketNumber last_packet_number() { return last_packet_number_; } | 
|  |  | 
|  | private: | 
|  | std::string peer_name_; | 
|  | Delegate* delegate_ = nullptr; | 
|  | Queue egress_queue_; | 
|  | QuicPacketNumber last_packet_number_; | 
|  |  | 
|  | // Controls whether the transport is considered to be writable.  Used to | 
|  | // simulate behavior that arises when the transport is blocked. | 
|  | bool writable_ = true; | 
|  | }; | 
|  |  | 
|  | }  // namespace simulator | 
|  | }  // namespace quic | 
|  |  | 
|  | #endif  // QUICHE_QUIC_QUARTC_SIMULATED_PACKET_TRANSPORT_H_ |