webrtc_m130/test/network/emulated_network_manager.h
Sebastian Jansson f4cf4c789a Don't allow creation of sockets for wild card IPs in emulated networks.
The network emulation framework does not support creation sockets that
receive from all addresses (e.g. 0.0.0.0) but would instead crash at
runtime. This CL explicitly ensures that we don't provide such networks.

Bug: webrtc:9883
Change-Id: I1d77df0f2c68f878eace30e4b037ebc7eb9f1aa6
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/162482
Reviewed-by: Per Kjellander <perkj@webrtc.org>
Commit-Queue: Sebastian Jansson <srte@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#30104}
2019-12-17 10:16:59 +00:00

73 lines
2.5 KiB
C++

/*
* Copyright (c) 2019 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#ifndef TEST_NETWORK_EMULATED_NETWORK_MANAGER_H_
#define TEST_NETWORK_EMULATED_NETWORK_MANAGER_H_
#include <memory>
#include <vector>
#include "api/test/network_emulation_manager.h"
#include "rtc_base/critical_section.h"
#include "rtc_base/ip_address.h"
#include "rtc_base/network.h"
#include "rtc_base/socket_server.h"
#include "rtc_base/thread.h"
#include "rtc_base/thread_checker.h"
#include "test/network/fake_network_socket_server.h"
#include "test/network/network_emulation.h"
namespace webrtc {
namespace test {
// Framework assumes that rtc::NetworkManager is called from network thread.
class EmulatedNetworkManager : public rtc::NetworkManagerBase,
public sigslot::has_slots<>,
public EmulatedNetworkManagerInterface {
public:
EmulatedNetworkManager(Clock* clock,
TaskQueueForTest* task_queue,
EndpointsContainer* endpoints_container);
void EnableEndpoint(EmulatedEndpointImpl* endpoint);
void DisableEndpoint(EmulatedEndpointImpl* endpoint);
// NetworkManager interface. All these methods are supposed to be called from
// the same thread.
void StartUpdating() override;
void StopUpdating() override;
// We don't support any address interfaces in the network emulation framework.
void GetAnyAddressNetworks(NetworkList* networks) override {}
// EmulatedNetworkManagerInterface API
rtc::Thread* network_thread() override { return &network_thread_; }
rtc::NetworkManager* network_manager() override { return this; }
void GetStats(
std::function<void(EmulatedNetworkStats)> stats_callback) const override;
private:
void UpdateNetworksOnce();
void MaybeSignalNetworksChanged();
TaskQueueForTest* const task_queue_;
EndpointsContainer* const endpoints_container_;
FakeNetworkSocketServer socket_server_;
rtc::Thread network_thread_;
bool sent_first_update_ RTC_GUARDED_BY(network_thread_);
int start_count_ RTC_GUARDED_BY(network_thread_);
};
} // namespace test
} // namespace webrtc
#endif // TEST_NETWORK_EMULATED_NETWORK_MANAGER_H_