Drop data for disabled endpoints.

Drop packets received from disabled endpoint and return socket error
when trying to send data from disabled endpoint.

Bug: webrtc:10138
Change-Id: I55259d2ac47adea78b47aeb25842e63a98a405c3
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/134643
Commit-Queue: Artem Titov <titovartem@webrtc.org>
Reviewed-by: Sebastian Jansson <srte@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#27973}
This commit is contained in:
Artem Titov
2019-05-17 12:01:00 +02:00
committed by Commit Bot
parent fd26ef732f
commit 519d74a5fc
2 changed files with 33 additions and 18 deletions

View File

@ -33,7 +33,8 @@ constexpr int kStatsWaitTimeoutMs = 1000;
class SocketReader : public sigslot::has_slots<> {
public:
explicit SocketReader(rtc::AsyncSocket* socket) : socket_(socket) {
explicit SocketReader(rtc::AsyncSocket* socket, rtc::Thread* network_thread)
: socket_(socket), network_thread_(network_thread) {
socket_->SignalReadEvent.connect(this, &SocketReader::OnReadEvent);
size_ = 128 * 1024;
buf_ = new char[size_];
@ -42,12 +43,13 @@ class SocketReader : public sigslot::has_slots<> {
void OnReadEvent(rtc::AsyncSocket* socket) {
RTC_DCHECK(socket_ == socket);
int64_t timestamp;
len_ = socket_->Recv(buf_, size_, &timestamp);
{
network_thread_->PostTask(RTC_FROM_HERE, [this]() {
int64_t timestamp;
len_ = socket_->Recv(buf_, size_, &timestamp);
rtc::CritScope crit(&lock_);
received_count_++;
}
});
}
int ReceivedCount() {
@ -56,7 +58,8 @@ class SocketReader : public sigslot::has_slots<> {
}
private:
rtc::AsyncSocket* socket_;
rtc::AsyncSocket* const socket_;
rtc::Thread* const network_thread_;
char* buf_;
size_t size_;
int len_;
@ -204,8 +207,8 @@ TEST(NetworkEmulationManagerTest, Run) {
auto* s2 = nt2->network_thread()->socketserver()->CreateAsyncSocket(
AF_INET, SOCK_DGRAM);
SocketReader r1(s1);
SocketReader r2(s2);
SocketReader r1(s1, nt1->network_thread());
SocketReader r2(s2, nt2->network_thread());
rtc::SocketAddress a1(alice_endpoint->GetPeerLocalAddress(), 0);
rtc::SocketAddress a2(bob_endpoint->GetPeerLocalAddress(), 0);
@ -217,8 +220,10 @@ TEST(NetworkEmulationManagerTest, Run) {
s2->Connect(s1->GetLocalAddress());
for (uint64_t i = 0; i < 1000; i++) {
s1->Send(data.data(), data.size());
s2->Send(data.data(), data.size());
nt1->network_thread()->PostTask(
RTC_FROM_HERE, [&]() { s1->Send(data.data(), data.size()); });
nt2->network_thread()->PostTask(
RTC_FROM_HERE, [&]() { s2->Send(data.data(), data.size()); });
}
rtc::Event wait;
@ -279,8 +284,8 @@ TEST(NetworkEmulationManagerTest, ThroughputStats) {
auto* s2 = nt2->network_thread()->socketserver()->CreateAsyncSocket(
AF_INET, SOCK_DGRAM);
SocketReader r1(s1);
SocketReader r2(s2);
SocketReader r1(s1, nt1->network_thread());
SocketReader r2(s2, nt2->network_thread());
rtc::SocketAddress a1(alice_endpoint->GetPeerLocalAddress(), 0);
rtc::SocketAddress a2(bob_endpoint->GetPeerLocalAddress(), 0);
@ -294,14 +299,13 @@ TEST(NetworkEmulationManagerTest, ThroughputStats) {
// Send 10 packets for 1
rtc::Event wait;
for (uint64_t i = 0; i < 11; i++) {
s1->Send(data.data(), data.size());
s2->Send(data.data(), data.size());
nt1->network_thread()->PostTask(
RTC_FROM_HERE, [&]() { s1->Send(data.data(), data.size()); });
nt2->network_thread()->PostTask(
RTC_FROM_HERE, [&]() { s2->Send(data.data(), data.size()); });
wait.Wait(100);
}
delete s1;
delete s2;
std::atomic<int> received_stats_count{0};
nt1->GetStats([&](EmulatedNetworkStats st) {
EXPECT_EQ(st.packets_sent, 11l);
@ -314,6 +318,9 @@ TEST(NetworkEmulationManagerTest, ThroughputStats) {
ASSERT_EQ_WAIT(received_stats_count.load(), 1, kStatsWaitTimeoutMs);
EXPECT_EQ(r1.ReceivedCount(), 11);
EXPECT_EQ(r2.ReceivedCount(), 11);
delete s1;
delete s2;
}
// Testing that packets are delivered via all routes using a routing scheme as