Adds support for stopping fake TCP cross traffic.

Bug: webrtc:9510
Change-Id: I95bca7e620e0b3916f1ae633ff1b7067f19bd8ab
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/156500
Commit-Queue: Sebastian Jansson <srte@webrtc.org>
Reviewed-by: Artem Titov <titovartem@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#29451}
This commit is contained in:
Sebastian Jansson 2019-10-11 17:00:39 +02:00 committed by Commit Bot
parent 80f53b785b
commit d8aff21849
7 changed files with 50 additions and 27 deletions

View File

@ -803,9 +803,7 @@ TEST_F(GoogCcNetworkControllerTest, IsFairToTCP) {
auto* route = s.CreateRoutes(
client, send_net, s.CreateClient("return", CallClientConfig()), ret_net);
s.CreateVideoStream(route->forward(), VideoStreamConfig());
s.net()->StartFakeTcpCrossTraffic(s.net()->CreateRoute(send_net),
s.net()->CreateRoute(ret_net),
FakeTcpConfig());
s.net()->StartFakeTcpCrossTraffic(send_net, ret_net, FakeTcpConfig());
s.RunFor(TimeDelta::seconds(10));
// Currently only testing for the upper limit as we in practice back out

View File

@ -107,9 +107,7 @@ TEST(ReceiveSideCongestionControllerTest, IsFairToTCP) {
VideoStreamConfig video;
video.stream.packet_feedback = false;
s.CreateVideoStream(route->forward(), video);
s.net()->StartFakeTcpCrossTraffic(s.net()->CreateRoute(send_net),
s.net()->CreateRoute(ret_net),
FakeTcpConfig());
s.net()->StartFakeTcpCrossTraffic(send_net, ret_net, FakeTcpConfig());
s.RunFor(TimeDelta::seconds(30));
// For some reason we get outcompeted by TCP here, this should probably be
// fixed and a lower bound should be added to the test.

View File

@ -115,10 +115,22 @@ ColumnPrinter PulsedPeaksCrossTraffic::StatsPrinter() {
32);
}
FakeTcpCrossTraffic::FakeTcpCrossTraffic(FakeTcpConfig config,
FakeTcpCrossTraffic::FakeTcpCrossTraffic(Clock* clock,
FakeTcpConfig config,
EmulatedRoute* send_route,
EmulatedRoute* ret_route)
: conf_(config), route_(this, send_route, ret_route) {}
: clock_(clock), conf_(config), route_(this, send_route, ret_route) {}
void FakeTcpCrossTraffic::Start(TaskQueueBase* task_queue) {
repeating_task_handle_ = RepeatingTaskHandle::Start(task_queue, [this] {
Process(clock_->CurrentTime());
return conf_.process_interval;
});
}
void FakeTcpCrossTraffic::Stop() {
repeating_task_handle_.Stop();
}
void FakeTcpCrossTraffic::Process(Timestamp at_time) {
SendPackets(at_time);

View File

@ -95,7 +95,6 @@ class PulsedPeaksCrossTraffic {
struct FakeTcpConfig {
DataSize packet_size = DataSize::bytes(1200);
DataSize send_limit = DataSize::PlusInfinity();
int packet_window;
TimeDelta process_interval = TimeDelta::ms(200);
TimeDelta packet_timeout = TimeDelta::seconds(1);
};
@ -103,9 +102,12 @@ struct FakeTcpConfig {
class FakeTcpCrossTraffic
: public TwoWayFakeTrafficRoute<int, int>::TrafficHandlerInterface {
public:
FakeTcpCrossTraffic(FakeTcpConfig config,
FakeTcpCrossTraffic(Clock* clock,
FakeTcpConfig config,
EmulatedRoute* send_route,
EmulatedRoute* ret_route);
void Start(TaskQueueBase* task_queue);
void Stop();
void Process(Timestamp at_time);
void OnRequest(int sequence_number, Timestamp at_time) override;
void OnResponse(int sequence_number, Timestamp at_time) override;
@ -115,6 +117,7 @@ class FakeTcpCrossTraffic
void SendPackets(Timestamp at_time);
private:
Clock* const clock_;
const FakeTcpConfig conf_;
TwoWayFakeTrafficRoute<int, int> route_;
@ -127,6 +130,7 @@ class FakeTcpCrossTraffic
Timestamp last_reduction_time_ = Timestamp::MinusInfinity();
TimeDelta last_rtt_ = TimeDelta::Zero();
DataSize total_sent_ = DataSize::Zero();
RepeatingTaskHandle repeating_task_handle_;
};
} // namespace test

View File

@ -268,6 +268,8 @@ class FakePacketRoute : public EmulatedNetworkReceiverInterface {
recv_addr_(route_->to->GetPeerLocalAddress(),
*route_->to->BindReceiver(0, this)) {}
~FakePacketRoute() { route_->to->UnbindReceiver(recv_addr_.port()); }
void SendPacket(size_t size, FakePacketType packet) {
RTC_CHECK_GE(size, sizeof(int));
sent_.emplace(next_packet_id_, packet);

View File

@ -212,21 +212,28 @@ NetworkEmulationManagerImpl::CreatePulsedPeaksCrossTraffic(
return out;
}
void NetworkEmulationManagerImpl::StartFakeTcpCrossTraffic(
EmulatedRoute* send_route,
EmulatedRoute* ret_route,
FakeTcpCrossTraffic* NetworkEmulationManagerImpl::StartFakeTcpCrossTraffic(
std::vector<EmulatedNetworkNode*> send_link,
std::vector<EmulatedNetworkNode*> ret_link,
FakeTcpConfig config) {
task_queue_.PostTask([=]() {
auto traffic =
std::make_unique<FakeTcpCrossTraffic>(config, send_route, ret_route);
auto* traffic_ptr = traffic.get();
auto traffic = std::make_unique<FakeTcpCrossTraffic>(
clock_, config, CreateRoute(send_link), CreateRoute(ret_link));
auto* traffic_ptr = traffic.get();
task_queue_.PostTask([this, traffic = std::move(traffic)]() mutable {
traffic->Start(task_queue_.Get());
tcp_cross_traffics_.push_back(std::move(traffic));
TimeDelta process_interval = config.process_interval;
RepeatingTaskHandle::Start(task_queue_.Get(),
[this, process_interval, traffic_ptr] {
traffic_ptr->Process(Now());
return process_interval;
});
});
return traffic_ptr;
}
void NetworkEmulationManagerImpl::StopCrossTraffic(
FakeTcpCrossTraffic* traffic) {
task_queue_.PostTask([=]() {
traffic->Stop();
tcp_cross_traffics_.remove_if(
[=](const std::unique_ptr<FakeTcpCrossTraffic>& ptr) {
return ptr.get() == traffic;
});
});
}

View File

@ -72,9 +72,11 @@ class NetworkEmulationManagerImpl : public NetworkEmulationManager {
PulsedPeaksCrossTraffic* CreatePulsedPeaksCrossTraffic(
TrafficRoute* traffic_route,
PulsedPeaksConfig config);
void StartFakeTcpCrossTraffic(EmulatedRoute* send_route,
EmulatedRoute* ret_route,
FakeTcpConfig config);
FakeTcpCrossTraffic* StartFakeTcpCrossTraffic(
std::vector<EmulatedNetworkNode*> send_link,
std::vector<EmulatedNetworkNode*> ret_link,
FakeTcpConfig config);
void StopCrossTraffic(FakeTcpCrossTraffic* traffic);
EmulatedNetworkManagerInterface* CreateEmulatedNetworkManagerInterface(
const std::vector<EmulatedEndpoint*>& endpoints) override;
@ -98,7 +100,7 @@ class NetworkEmulationManagerImpl : public NetworkEmulationManager {
std::vector<std::unique_ptr<TrafficRoute>> traffic_routes_;
std::vector<std::unique_ptr<RandomWalkCrossTraffic>> random_cross_traffics_;
std::vector<std::unique_ptr<PulsedPeaksCrossTraffic>> pulsed_cross_traffics_;
std::vector<std::unique_ptr<FakeTcpCrossTraffic>> tcp_cross_traffics_;
std::list<std::unique_ptr<FakeTcpCrossTraffic>> tcp_cross_traffics_;
std::vector<std::unique_ptr<EndpointsContainer>> endpoints_containers_;
std::vector<std::unique_ptr<EmulatedNetworkManager>> network_managers_;