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:
parent
80f53b785b
commit
d8aff21849
@ -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
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@ -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_;
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user