Add support for lost packets to FeedbackGenerator

Feedback can include lost packets. Ensure FeedbackGenerator support lost packets to be able to use this class properly when testing with loss.

Bug: none
Change-Id: Ibd740dfae358c0543fbee62cd40ef13a7ac1123f
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/247372
Reviewed-by: Erik Språng <sprang@webrtc.org>
Commit-Queue: Per Kjellander <perkj@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#35740}
This commit is contained in:
Per Kjellander
2022-01-19 14:14:02 +01:00
committed by WebRTC LUCI CQ
parent a62dcd815d
commit 1ca57b9015
4 changed files with 57 additions and 12 deletions

View File

@ -157,6 +157,7 @@ if (rtc_include_tests) {
]
deps = [
":emulated_network",
"../../api/transport:network_control",
"../../api/transport:test_feedback_generator_interface",
"../../call:simulated_network",
"../../rtc_base:checks",

View File

@ -10,6 +10,7 @@
#include "test/network/feedback_generator.h"
#include "absl/memory/memory.h"
#include "api/transport/network_types.h"
#include "rtc_base/checks.h"
namespace webrtc {
@ -39,6 +40,7 @@ void FeedbackGeneratorImpl::SendPacket(size_t size) {
sent.send_time = Now();
sent.size = DataSize::Bytes(size);
sent.sequence_number = sequence_number_++;
sent_packets_.push(sent);
route_.SendRequest(size, sent);
}
@ -69,18 +71,41 @@ void FeedbackGeneratorImpl::OnRequest(SentPacket packet,
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;
received_packets_.push_back(result);
Timestamp first_recv = received_packets_.front().receive_time;
if (Now() - first_recv > conf_.feedback_interval) {
route_.SendResponse(conf_.feedback_packet_size.bytes<size_t>(), builder_);
builder_ = {};
route_.SendResponse(conf_.feedback_packet_size.bytes<size_t>(),
std::move(received_packets_));
received_packets_ = {};
}
}
void FeedbackGeneratorImpl::OnResponse(TransportPacketsFeedback packet,
void FeedbackGeneratorImpl::OnResponse(std::vector<PacketResult> packet_results,
Timestamp arrival_time) {
packet.feedback_time = arrival_time;
feedback_.push_back(packet);
TransportPacketsFeedback feedback;
feedback.feedback_time = arrival_time;
std::vector<PacketResult>::const_iterator received_packet_iterator =
packet_results.begin();
while (received_packet_iterator != packet_results.end()) {
RTC_DCHECK(!sent_packets_.empty() &&
sent_packets_.front().sequence_number <=
received_packet_iterator->sent_packet.sequence_number)
<< "reordering not implemented";
if (sent_packets_.front().sequence_number <
received_packet_iterator->sent_packet.sequence_number) {
// Packet lost.
PacketResult lost;
lost.sent_packet = sent_packets_.front();
feedback.packet_feedbacks.push_back(lost);
}
if (sent_packets_.front().sequence_number ==
received_packet_iterator->sent_packet.sequence_number) {
feedback.packet_feedbacks.push_back(*received_packet_iterator);
++received_packet_iterator;
}
sent_packets_.pop();
}
feedback_.push_back(feedback);
}
} // namespace webrtc

View File

@ -10,10 +10,12 @@
#ifndef TEST_NETWORK_FEEDBACK_GENERATOR_H_
#define TEST_NETWORK_FEEDBACK_GENERATOR_H_
#include <map>
#include <cstdint>
#include <queue>
#include <utility>
#include <vector>
#include "api/transport/network_types.h"
#include "api/transport/test/feedback_generator_interface.h"
#include "call/simulated_network.h"
#include "test/network/network_emulation.h"
@ -24,7 +26,7 @@ namespace webrtc {
class FeedbackGeneratorImpl
: public FeedbackGenerator,
public TwoWayFakeTrafficRoute<SentPacket, TransportPacketsFeedback>::
public TwoWayFakeTrafficRoute<SentPacket, std::vector<PacketResult>>::
TrafficHandlerInterface {
public:
explicit FeedbackGeneratorImpl(Config config);
@ -39,7 +41,7 @@ class FeedbackGeneratorImpl
void SetSendLinkCapacity(DataRate capacity) override;
void OnRequest(SentPacket packet, Timestamp arrival_time) override;
void OnResponse(TransportPacketsFeedback packet,
void OnResponse(std::vector<PacketResult> packet_results,
Timestamp arrival_time) override;
private:
@ -47,9 +49,10 @@ class FeedbackGeneratorImpl
::webrtc::test::NetworkEmulationManagerImpl net_;
SimulatedNetwork* const send_link_;
SimulatedNetwork* const ret_link_;
TwoWayFakeTrafficRoute<SentPacket, TransportPacketsFeedback> route_;
TwoWayFakeTrafficRoute<SentPacket, std::vector<PacketResult>> route_;
TransportPacketsFeedback builder_;
std::queue<SentPacket> sent_packets_;
std::vector<PacketResult> received_packets_;
std::vector<TransportPacketsFeedback> feedback_;
int64_t sequence_number_ = 1;
};

View File

@ -28,4 +28,20 @@ TEST(FeedbackGeneratorTest, ReportsFeedbackForSentPackets) {
}
}
}
TEST(FeedbackGeneratorTest, FeedbackIncludesLostPackets) {
size_t kPacketSize = 1000;
auto gen = CreateFeedbackGenerator(FeedbackGenerator::Config());
BuiltInNetworkBehaviorConfig send_config_with_loss;
send_config_with_loss.loss_percent = 50;
gen->SetSendConfig(send_config_with_loss);
for (int i = 0; i < 20; ++i) {
gen->SendPacket(kPacketSize);
gen->Sleep(TimeDelta::Millis(5));
}
auto feedback_list = gen->PopFeedback();
ASSERT_GT(feedback_list.size(), 0u);
EXPECT_NEAR(feedback_list[0].LostWithSendInfo().size(),
feedback_list[0].ReceivedWithSendInfo().size(), 2);
}
} // namespace webrtc