The network control tester did not handle congestion windows correctly. Time passed when no packets were sent were not counted. This hindered the buffer delays from decreasing in congested mode. Bug: webrtc:8415 Change-Id: Id46116c6125eb5a50caa5766a3cc7291404ff920 Reviewed-on: https://webrtc-review.googlesource.com/77761 Commit-Queue: Sebastian Jansson <srte@webrtc.org> Reviewed-by: Stefan Holmer <stefan@webrtc.org> Cr-Commit-Position: refs/heads/master@{#23361}
74 lines
2.8 KiB
C++
74 lines
2.8 KiB
C++
/*
|
|
* Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#ifndef API_TRANSPORT_TEST_NETWORK_CONTROL_TESTER_H_
|
|
#define API_TRANSPORT_TEST_NETWORK_CONTROL_TESTER_H_
|
|
|
|
#include <deque>
|
|
#include <functional>
|
|
#include <memory>
|
|
|
|
#include "api/optional.h"
|
|
#include "api/transport/network_control.h"
|
|
|
|
namespace webrtc {
|
|
namespace test {
|
|
|
|
// Produces one packet per time delta
|
|
class SimpleTargetRateProducer {
|
|
public:
|
|
static SentPacket ProduceNext(const NetworkControlUpdate& state,
|
|
Timestamp current_time,
|
|
TimeDelta time_delta);
|
|
};
|
|
|
|
class NetworkControllerTester {
|
|
public:
|
|
// A PacketProducer is a function that takes a network control state, a
|
|
// timestamp representing the expected send time and a time delta of the send
|
|
// times (This allows the PacketProducer to be stateless). It returns a
|
|
// SentPacket struct with actual send time and packet size.
|
|
using PacketProducer = std::function<
|
|
SentPacket(const NetworkControlUpdate&, Timestamp, TimeDelta)>;
|
|
NetworkControllerTester(NetworkControllerFactoryInterface* factory,
|
|
NetworkControllerConfig initial_config);
|
|
~NetworkControllerTester();
|
|
|
|
// Runs the simulations for the given duration, the PacketProducer will be
|
|
// called repeatedly based on the given packet interval and the network will
|
|
// be simulated using given bandwidth and propagation delay. The simulation
|
|
// will call the controller under test with OnSentPacket and
|
|
// OnTransportPacketsFeedback.
|
|
|
|
// Note that OnTransportPacketsFeedback will only be called for
|
|
// packets with resulting feedback time within the simulated duration. Packets
|
|
// with later feedback time are saved and used in the next call to
|
|
// RunSimulation where enough simulated time has passed.
|
|
void RunSimulation(TimeDelta duration,
|
|
TimeDelta packet_interval,
|
|
DataRate actual_bandwidth,
|
|
TimeDelta propagation_delay,
|
|
PacketProducer next_packet);
|
|
NetworkControlUpdate GetState() { return state_; }
|
|
|
|
private:
|
|
std::unique_ptr<NetworkControllerInterface> controller_;
|
|
TimeDelta process_interval_ = TimeDelta::PlusInfinity();
|
|
Timestamp current_time_;
|
|
int64_t packet_sequence_number_;
|
|
DataSize accumulated_buffer_;
|
|
std::deque<PacketResult> outstanding_packets_;
|
|
NetworkControlUpdate state_;
|
|
};
|
|
} // namespace test
|
|
} // namespace webrtc
|
|
|
|
#endif // API_TRANSPORT_TEST_NETWORK_CONTROL_TESTER_H_
|