Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1039)

Unified Diff: webrtc/test/fake_network_pipe.cc

Issue 1606183002: Allow packets to be reordered in the fake network pipe. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: uint8_t[] instead of uint8_t Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webrtc/test/fake_network_pipe.h ('k') | webrtc/test/fake_network_pipe_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webrtc/test/fake_network_pipe.cc
diff --git a/webrtc/test/fake_network_pipe.cc b/webrtc/test/fake_network_pipe.cc
index 4e431222dac108bafcfc8dc4003c4c08b688d3d1..8276717ada32ae01f1328fc884724456cb3ce22d 100644
--- a/webrtc/test/fake_network_pipe.cc
+++ b/webrtc/test/fake_network_pipe.cc
@@ -20,60 +20,16 @@
namespace webrtc {
-const double kPi = 3.14159265;
-
-static int GaussianRandom(int mean_delay_ms, int standard_deviation_ms) {
- // Creating a Normal distribution variable from two independent uniform
- // variables based on the Box-Muller transform.
- double uniform1 = (rand() + 1.0) / (RAND_MAX + 1.0); // NOLINT
- double uniform2 = (rand() + 1.0) / (RAND_MAX + 1.0); // NOLINT
- return static_cast<int>(mean_delay_ms + standard_deviation_ms *
- sqrt(-2 * log(uniform1)) * cos(2 * kPi * uniform2));
-}
-
-static bool UniformLoss(int loss_percent) {
- int outcome = rand() % 100;
- return outcome < loss_percent;
-}
-
-class NetworkPacket {
- public:
- NetworkPacket(const uint8_t* data, size_t length, int64_t send_time,
- int64_t arrival_time)
- : data_(NULL),
- data_length_(length),
- send_time_(send_time),
- arrival_time_(arrival_time) {
- data_ = new uint8_t[length];
- memcpy(data_, data, length);
- }
- ~NetworkPacket() {
- delete [] data_;
- }
-
- uint8_t* data() const { return data_; }
- size_t data_length() const { return data_length_; }
- int64_t send_time() const { return send_time_; }
- int64_t arrival_time() const { return arrival_time_; }
- void IncrementArrivalTime(int64_t extra_delay) {
- arrival_time_+= extra_delay;
- }
-
- private:
- // The packet data.
- uint8_t* data_;
- // Length of data_.
- size_t data_length_;
- // The time the packet was sent out on the network.
- const int64_t send_time_;
- // The time the packet should arrive at the reciver.
- int64_t arrival_time_;
-};
-
FakeNetworkPipe::FakeNetworkPipe(Clock* clock,
const FakeNetworkPipe::Config& config)
+ : FakeNetworkPipe(clock, config, 1) {}
+
+FakeNetworkPipe::FakeNetworkPipe(Clock* clock,
+ const FakeNetworkPipe::Config& config,
+ uint64_t seed)
: clock_(clock),
packet_receiver_(NULL),
+ random_(seed),
config_(config),
dropped_packets_(0),
sent_packets_(0),
@@ -86,8 +42,8 @@ FakeNetworkPipe::~FakeNetworkPipe() {
capacity_link_.pop();
}
while (!delay_link_.empty()) {
- delete delay_link_.front();
- delay_link_.pop();
+ delete *delay_link_.begin();
+ delay_link_.erase(delay_link_.begin());
}
}
@@ -123,7 +79,7 @@ void FakeNetworkPipe::SendPacket(const uint8_t* data, size_t data_length) {
// Check if there already are packets on the link and change network start
// time if there is.
- if (capacity_link_.size() > 0)
+ if (!capacity_link_.empty())
network_start_time = capacity_link_.back()->arrival_time();
int64_t arrival_time = network_start_time + capacity_delay_ms;
@@ -155,41 +111,42 @@ void FakeNetworkPipe::Process() {
{
rtc::CritScope crit(&lock_);
// Check the capacity link first.
- while (capacity_link_.size() > 0 &&
+ while (!capacity_link_.empty() &&
time_now >= capacity_link_.front()->arrival_time()) {
// Time to get this packet.
NetworkPacket* packet = capacity_link_.front();
capacity_link_.pop();
// Packets are randomly dropped after being affected by the bottleneck.
- if (UniformLoss(config_.loss_percent)) {
+ if (random_.Rand(100) < static_cast<uint32_t>(config_.loss_percent)) {
delete packet;
continue;
}
- // Add extra delay and jitter, but make sure the arrival time is not
- // earlier than the last packet in the queue.
- int extra_delay = GaussianRandom(config_.queue_delay_ms,
- config_.delay_standard_deviation_ms);
- if (delay_link_.size() > 0 &&
- packet->arrival_time() + extra_delay <
- delay_link_.back()->arrival_time()) {
- extra_delay = delay_link_.back()->arrival_time() -
- packet->arrival_time();
+ int arrival_time_jitter = random_.Gaussian(
+ config_.queue_delay_ms, config_.delay_standard_deviation_ms);
+
+ // If reordering is not allowed then adjust arrival_time_jitter
+ // to make sure all packets are sent in order.
+ if (!config_.allow_reordering && !delay_link_.empty() &&
+ packet->arrival_time() + arrival_time_jitter <
+ (*delay_link_.rbegin())->arrival_time()) {
+ arrival_time_jitter =
+ (*delay_link_.rbegin())->arrival_time() - packet->arrival_time();
}
- packet->IncrementArrivalTime(extra_delay);
+ packet->IncrementArrivalTime(arrival_time_jitter);
if (packet->arrival_time() < next_process_time_)
next_process_time_ = packet->arrival_time();
- delay_link_.push(packet);
+ delay_link_.insert(packet);
}
// Check the extra delay queue.
- while (delay_link_.size() > 0 &&
- time_now >= delay_link_.front()->arrival_time()) {
+ while (!delay_link_.empty() &&
+ time_now >= (*delay_link_.begin())->arrival_time()) {
// Deliver this packet.
- NetworkPacket* packet = delay_link_.front();
+ NetworkPacket* packet = *delay_link_.begin();
packets_to_deliver.push(packet);
- delay_link_.pop();
+ delay_link_.erase(delay_link_.begin());
// |time_now| might be later than when the packet should have arrived, due
// to NetworkProcess being called too late. For stats, use the time it
// should have been on the link.
@@ -209,7 +166,7 @@ void FakeNetworkPipe::Process() {
int64_t FakeNetworkPipe::TimeUntilNextProcess() const {
rtc::CritScope crit(&lock_);
const int64_t kDefaultProcessIntervalMs = 30;
- if (capacity_link_.size() == 0 || delay_link_.size() == 0)
+ if (capacity_link_.empty() || delay_link_.empty())
return kDefaultProcessIntervalMs;
return std::max<int64_t>(next_process_time_ - clock_->TimeInMilliseconds(),
0);
« no previous file with comments | « webrtc/test/fake_network_pipe.h ('k') | webrtc/test/fake_network_pipe_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698