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}
diff --git a/test/scenario/network/fake_network_socket.cc b/test/scenario/network/fake_network_socket.cc
index 5d4ad3f..59699f5 100644
--- a/test/scenario/network/fake_network_socket.cc
+++ b/test/scenario/network/fake_network_socket.cc
@@ -56,6 +56,11 @@
     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 @@
                               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<const uint8_t*>(pv), cb);
   endpoint_->SendPacket(local_addr_, addr, packet);
   return cb;
@@ -176,7 +185,6 @@
 }
 
 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 87b2b22..e965dbc 100644
--- a/test/scenario/network/network_emulation_unittest.cc
+++ b/test/scenario/network/network_emulation_unittest.cc
@@ -33,7 +33,8 @@
 
 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 @@
 
   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 @@
   }
 
  private:
-  rtc::AsyncSocket* socket_;
+  rtc::AsyncSocket* const socket_;
+  rtc::Thread* const network_thread_;
   char* buf_;
   size_t size_;
   int len_;
@@ -204,8 +207,8 @@
     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 @@
     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 @@
   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 @@
   // 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 @@
   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