|  | // Copyright (c) 2019 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_TEST_RANDOM_DELAY_LINK_H_ | 
|  | #define QUICHE_QUIC_QUARTC_TEST_RANDOM_DELAY_LINK_H_ | 
|  |  | 
|  | #include "net/third_party/quiche/src/quic/core/crypto/quic_random.h" | 
|  | #include "net/third_party/quiche/src/quic/core/quic_bandwidth.h" | 
|  | #include "net/third_party/quiche/src/quic/core/quic_time.h" | 
|  | #include "net/third_party/quiche/src/quic/test_tools/simulator/link.h" | 
|  | #include "net/third_party/quiche/src/quic/test_tools/simulator/port.h" | 
|  | #include "net/third_party/quiche/src/quic/test_tools/simulator/simulator.h" | 
|  |  | 
|  | namespace quic { | 
|  | namespace simulator { | 
|  |  | 
|  | // A reliable simplex link between two endpoints with constrained bandwidth.  A | 
|  | // random delay is added to each packet.  The random values are chosen | 
|  | // separately for each packet, following an exponential distribution. | 
|  | class RandomDelayLink : public OneWayLink { | 
|  | public: | 
|  | RandomDelayLink(Simulator* simulator, | 
|  | std::string name, | 
|  | UnconstrainedPortInterface* sink, | 
|  | QuicBandwidth bandwidth, | 
|  | QuicTime::Delta propagation_delay); | 
|  | RandomDelayLink(const RandomDelayLink&) = delete; | 
|  | RandomDelayLink& operator=(const RandomDelayLink&) = delete; | 
|  | ~RandomDelayLink() override; | 
|  |  | 
|  | // Sets the median value of the random delay introduced by this link.  Random | 
|  | // delays are chosen according to an exponential distribution, clipped and | 
|  | // scaled to reach this as a median value. | 
|  | inline void set_median_random_delay(QuicTime::Delta delta) { | 
|  | median_random_delay_ = delta; | 
|  | } | 
|  |  | 
|  | protected: | 
|  | QuicTime::Delta GetRandomDelay(QuicTime::Delta transfer_time) override; | 
|  |  | 
|  | private: | 
|  | QuicTime::Delta median_random_delay_; | 
|  | }; | 
|  |  | 
|  | // A full-duplex link between two endpoints, functionally equivalent to two | 
|  | // RandomDelayLink objects tied together. | 
|  | class SymmetricRandomDelayLink { | 
|  | public: | 
|  | SymmetricRandomDelayLink(Simulator* simulator, | 
|  | std::string name, | 
|  | UnconstrainedPortInterface* sink_a, | 
|  | UnconstrainedPortInterface* sink_b, | 
|  | QuicBandwidth bandwidth, | 
|  | QuicTime::Delta propagation_delay); | 
|  | SymmetricRandomDelayLink(Endpoint* endpoint_a, | 
|  | Endpoint* endpoint_b, | 
|  | QuicBandwidth bandwidth, | 
|  | QuicTime::Delta propagation_delay); | 
|  | SymmetricRandomDelayLink(const SymmetricRandomDelayLink&) = delete; | 
|  | SymmetricRandomDelayLink& operator=(const SymmetricRandomDelayLink&) = delete; | 
|  |  | 
|  | inline QuicBandwidth bandwidth() { return a_to_b_link_.bandwidth(); } | 
|  |  | 
|  | inline void set_median_random_delay(QuicTime::Delta delay) { | 
|  | a_to_b_link_.set_median_random_delay(delay); | 
|  | b_to_a_link_.set_median_random_delay(delay); | 
|  | } | 
|  |  | 
|  | private: | 
|  | RandomDelayLink a_to_b_link_; | 
|  | RandomDelayLink b_to_a_link_; | 
|  | }; | 
|  |  | 
|  | }  // namespace simulator | 
|  | }  // namespace quic | 
|  |  | 
|  | #endif  // QUICHE_QUIC_QUARTC_TEST_RANDOM_DELAY_LINK_H_ |