From 519d74a5fcd869478f2bd8cc3a38eca7dfb608e6 Mon Sep 17 00:00:00 2001 From: Artem Titov Date: Fri, 17 May 2019 12:01:00 +0200 Subject: [PATCH] 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 Reviewed-by: Sebastian Jansson Cr-Commit-Position: refs/heads/master@{#27973} --- test/scenario/network/fake_network_socket.cc | 10 ++++- .../network/network_emulation_unittest.cc | 41 +++++++++++-------- 2 files changed, 33 insertions(+), 18 deletions(-) diff --git a/test/scenario/network/fake_network_socket.cc b/test/scenario/network/fake_network_socket.cc index 5d4ad3f514..59699f5700 100644 --- a/test/scenario/network/fake_network_socket.cc +++ b/test/scenario/network/fake_network_socket.cc @@ -56,6 +56,11 @@ bool FakeNetworkSocket::ProcessIo() { pending_read_events_count_--; RTC_DCHECK_GE(pending_read_events_count_, 0); } + if (!endpoint_->Enabled()) { + // If endpoint disabled then just pop and discard packet. + PopFrontPacket(); + return true; + } SignalReadEvent(this); return true; } @@ -111,6 +116,10 @@ int FakeNetworkSocket::SendTo(const void* pv, const rtc::SocketAddress& addr) { RTC_CHECK(!local_addr_.IsNil()) << "Socket have to be bind to some local address"; + if (!endpoint_->Enabled()) { + error_ = ENETDOWN; + return -1; + } rtc::CopyOnWriteBuffer packet(static_cast(pv), cb); endpoint_->SendPacket(local_addr_, addr, packet); return cb; @@ -176,7 +185,6 @@ int FakeNetworkSocket::Close() { } int FakeNetworkSocket::GetError() const { - RTC_CHECK(error_ == 0); return error_; } diff --git a/test/scenario/network/network_emulation_unittest.cc b/test/scenario/network/network_emulation_unittest.cc index 87b2b22016..e965dbcdb9 100644 --- a/test/scenario/network/network_emulation_unittest.cc +++ b/test/scenario/network/network_emulation_unittest.cc @@ -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_, ×tamp); - { + network_thread_->PostTask(RTC_FROM_HERE, [this]() { + int64_t timestamp; + len_ = socket_->Recv(buf_, size_, ×tamp); + 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 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