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_, ×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 @@
}
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