/* * Copyright 2019 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. */ #include "test/network/feedback_generator.h" #include "absl/memory/memory.h" #include "rtc_base/checks.h" namespace webrtc { FeedbackGeneratorImpl::FeedbackGeneratorImpl( FeedbackGeneratorImpl::Config config) : conf_(config), net_(TimeMode::kSimulated), send_link_{new SimulatedNetwork(conf_.send_link)}, ret_link_{new SimulatedNetwork(conf_.return_link)}, route_(this, net_.CreateRoute( {net_.CreateEmulatedNode(absl::WrapUnique(send_link_))}), net_.CreateRoute( {net_.CreateEmulatedNode(absl::WrapUnique(ret_link_))})) {} Timestamp FeedbackGeneratorImpl::Now() { return net_.Now(); } void FeedbackGeneratorImpl::Sleep(TimeDelta duration) { net_.time_controller()->AdvanceTime(duration); } void FeedbackGeneratorImpl::SendPacket(size_t size) { SentPacket sent; sent.send_time = Now(); sent.size = DataSize::Bytes(size); sent.sequence_number = sequence_number_++; route_.SendRequest(size, sent); } std::vector FeedbackGeneratorImpl::PopFeedback() { std::vector ret; ret.swap(feedback_); return ret; } void FeedbackGeneratorImpl::SetSendConfig(BuiltInNetworkBehaviorConfig config) { conf_.send_link = config; send_link_->SetConfig(conf_.send_link); } void FeedbackGeneratorImpl::SetReturnConfig( BuiltInNetworkBehaviorConfig config) { conf_.return_link = config; ret_link_->SetConfig(conf_.return_link); } void FeedbackGeneratorImpl::SetSendLinkCapacity(DataRate capacity) { conf_.send_link.link_capacity_kbps = capacity.kbps(); send_link_->SetConfig(conf_.send_link); } void FeedbackGeneratorImpl::OnRequest(SentPacket packet, Timestamp arrival_time) { PacketResult result; result.sent_packet = packet; result.receive_time = arrival_time; builder_.packet_feedbacks.push_back(result); Timestamp first_recv = builder_.packet_feedbacks.front().receive_time; if (Now() - first_recv > conf_.feedback_interval) { route_.SendResponse(conf_.feedback_packet_size.bytes(), builder_); builder_ = {}; } } void FeedbackGeneratorImpl::OnResponse(TransportPacketsFeedback packet, Timestamp arrival_time) { packet.feedback_time = arrival_time; feedback_.push_back(packet); } } // namespace webrtc