blob: 71e161c93e082e980ef60ae90758779439e1363a [file] [log] [blame]
// 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.
#include "net/third_party/quiche/src/quic/quartc/test/random_delay_link.h"
#include <cmath>
#include <cstdint>
#include "net/third_party/quiche/src/quic/platform/api/quic_str_cat.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 {
namespace {
// Number of buckets used to define an exponential distribution.
constexpr int64_t kNumBuckets = static_cast<int64_t>(2) << 32;
} // namespace
RandomDelayLink::RandomDelayLink(Simulator* simulator,
std::string name,
UnconstrainedPortInterface* sink,
QuicBandwidth bandwidth,
QuicTime::Delta propagation_delay)
: OneWayLink(simulator, name, sink, bandwidth, propagation_delay),
median_random_delay_(QuicTime::Delta::Zero()) {}
RandomDelayLink::~RandomDelayLink() {}
QuicTime::Delta RandomDelayLink::GetRandomDelay(
QuicTime::Delta /*transfer_time*/) {
// Computes a random delay following an exponential distribution, with median
// value |median_random_delay_|. Choose a uniform random value between 1 and
// kNumBuckets, convert this to an exponential, then scale it such that a
// random value from the middle of the distribution (0.5) corresponds to
// |median_random_delay_|.
return std::log(
static_cast<double>(
simulator_->GetRandomGenerator()->RandUint64() % kNumBuckets +
1) /
kNumBuckets) /
std::log(0.5) * median_random_delay_;
}
SymmetricRandomDelayLink::SymmetricRandomDelayLink(
Simulator* simulator,
std::string name,
UnconstrainedPortInterface* sink_a,
UnconstrainedPortInterface* sink_b,
QuicBandwidth bandwidth,
QuicTime::Delta propagation_delay)
: a_to_b_link_(simulator,
QuicStringPrintf("%s (A-to-B)", name.c_str()),
sink_b,
bandwidth,
propagation_delay),
b_to_a_link_(simulator,
QuicStringPrintf("%s (B-to-A)", name.c_str()),
sink_a,
bandwidth,
propagation_delay) {}
SymmetricRandomDelayLink::SymmetricRandomDelayLink(
Endpoint* endpoint_a,
Endpoint* endpoint_b,
QuicBandwidth bandwidth,
QuicTime::Delta propagation_delay)
: SymmetricRandomDelayLink(endpoint_a->simulator(),
QuicStringPrintf("Link [%s]<->[%s]",
endpoint_a->name().c_str(),
endpoint_b->name().c_str()),
endpoint_a->GetRxPort(),
endpoint_b->GetRxPort(),
bandwidth,
propagation_delay) {
endpoint_a->SetTxPort(&a_to_b_link_);
endpoint_b->SetTxPort(&b_to_a_link_);
}
} // namespace simulator
} // namespace quic