1*d9f75844SAndroid Build Coastguard Worker /* 2*d9f75844SAndroid Build Coastguard Worker * Copyright 2009 The WebRTC Project Authors. All rights reserved. 3*d9f75844SAndroid Build Coastguard Worker * 4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*d9f75844SAndroid Build Coastguard Worker */ 10*d9f75844SAndroid Build Coastguard Worker 11*d9f75844SAndroid Build Coastguard Worker #ifndef RTC_BASE_FAKE_NETWORK_H_ 12*d9f75844SAndroid Build Coastguard Worker #define RTC_BASE_FAKE_NETWORK_H_ 13*d9f75844SAndroid Build Coastguard Worker 14*d9f75844SAndroid Build Coastguard Worker #include <memory> 15*d9f75844SAndroid Build Coastguard Worker #include <string> 16*d9f75844SAndroid Build Coastguard Worker #include <utility> 17*d9f75844SAndroid Build Coastguard Worker #include <vector> 18*d9f75844SAndroid Build Coastguard Worker 19*d9f75844SAndroid Build Coastguard Worker #include "absl/memory/memory.h" 20*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/mdns_responder_interface.h" 21*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/network.h" 22*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/socket_address.h" 23*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/string_encode.h" 24*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/thread.h" 25*d9f75844SAndroid Build Coastguard Worker 26*d9f75844SAndroid Build Coastguard Worker namespace rtc { 27*d9f75844SAndroid Build Coastguard Worker 28*d9f75844SAndroid Build Coastguard Worker const int kFakeIPv4NetworkPrefixLength = 24; 29*d9f75844SAndroid Build Coastguard Worker const int kFakeIPv6NetworkPrefixLength = 64; 30*d9f75844SAndroid Build Coastguard Worker 31*d9f75844SAndroid Build Coastguard Worker // Fake network manager that allows us to manually specify the IPs to use. 32*d9f75844SAndroid Build Coastguard Worker class FakeNetworkManager : public NetworkManagerBase { 33*d9f75844SAndroid Build Coastguard Worker public: FakeNetworkManager()34*d9f75844SAndroid Build Coastguard Worker FakeNetworkManager() {} 35*d9f75844SAndroid Build Coastguard Worker 36*d9f75844SAndroid Build Coastguard Worker struct Iface { 37*d9f75844SAndroid Build Coastguard Worker SocketAddress socket_address; 38*d9f75844SAndroid Build Coastguard Worker AdapterType adapter_type; 39*d9f75844SAndroid Build Coastguard Worker absl::optional<AdapterType> underlying_vpn_adapter_type; 40*d9f75844SAndroid Build Coastguard Worker }; 41*d9f75844SAndroid Build Coastguard Worker typedef std::vector<Iface> IfaceList; 42*d9f75844SAndroid Build Coastguard Worker AddInterface(const SocketAddress & iface)43*d9f75844SAndroid Build Coastguard Worker void AddInterface(const SocketAddress& iface) { 44*d9f75844SAndroid Build Coastguard Worker // Ensure a unique name for the interface if its name is not given. 45*d9f75844SAndroid Build Coastguard Worker AddInterface(iface, "test" + rtc::ToString(next_index_++)); 46*d9f75844SAndroid Build Coastguard Worker } 47*d9f75844SAndroid Build Coastguard Worker AddInterface(const SocketAddress & iface,absl::string_view if_name)48*d9f75844SAndroid Build Coastguard Worker void AddInterface(const SocketAddress& iface, absl::string_view if_name) { 49*d9f75844SAndroid Build Coastguard Worker AddInterface(iface, if_name, ADAPTER_TYPE_UNKNOWN); 50*d9f75844SAndroid Build Coastguard Worker } 51*d9f75844SAndroid Build Coastguard Worker 52*d9f75844SAndroid Build Coastguard Worker void AddInterface( 53*d9f75844SAndroid Build Coastguard Worker const SocketAddress& iface, 54*d9f75844SAndroid Build Coastguard Worker absl::string_view if_name, 55*d9f75844SAndroid Build Coastguard Worker AdapterType type, 56*d9f75844SAndroid Build Coastguard Worker absl::optional<AdapterType> underlying_vpn_adapter_type = absl::nullopt) { 57*d9f75844SAndroid Build Coastguard Worker SocketAddress address(if_name, 0); 58*d9f75844SAndroid Build Coastguard Worker address.SetResolvedIP(iface.ipaddr()); 59*d9f75844SAndroid Build Coastguard Worker ifaces_.push_back({address, type, underlying_vpn_adapter_type}); 60*d9f75844SAndroid Build Coastguard Worker DoUpdateNetworks(); 61*d9f75844SAndroid Build Coastguard Worker } 62*d9f75844SAndroid Build Coastguard Worker RemoveInterface(const SocketAddress & iface)63*d9f75844SAndroid Build Coastguard Worker void RemoveInterface(const SocketAddress& iface) { 64*d9f75844SAndroid Build Coastguard Worker for (IfaceList::iterator it = ifaces_.begin(); it != ifaces_.end(); ++it) { 65*d9f75844SAndroid Build Coastguard Worker if (it->socket_address.EqualIPs(iface)) { 66*d9f75844SAndroid Build Coastguard Worker ifaces_.erase(it); 67*d9f75844SAndroid Build Coastguard Worker break; 68*d9f75844SAndroid Build Coastguard Worker } 69*d9f75844SAndroid Build Coastguard Worker } 70*d9f75844SAndroid Build Coastguard Worker DoUpdateNetworks(); 71*d9f75844SAndroid Build Coastguard Worker } 72*d9f75844SAndroid Build Coastguard Worker StartUpdating()73*d9f75844SAndroid Build Coastguard Worker void StartUpdating() override { 74*d9f75844SAndroid Build Coastguard Worker ++start_count_; 75*d9f75844SAndroid Build Coastguard Worker if (start_count_ == 1) { 76*d9f75844SAndroid Build Coastguard Worker sent_first_update_ = false; 77*d9f75844SAndroid Build Coastguard Worker Thread::Current()->PostTask([this] { DoUpdateNetworks(); }); 78*d9f75844SAndroid Build Coastguard Worker } else if (sent_first_update_) { 79*d9f75844SAndroid Build Coastguard Worker Thread::Current()->PostTask([this] { SignalNetworksChanged(); }); 80*d9f75844SAndroid Build Coastguard Worker } 81*d9f75844SAndroid Build Coastguard Worker } 82*d9f75844SAndroid Build Coastguard Worker StopUpdating()83*d9f75844SAndroid Build Coastguard Worker void StopUpdating() override { --start_count_; } 84*d9f75844SAndroid Build Coastguard Worker 85*d9f75844SAndroid Build Coastguard Worker using NetworkManagerBase::set_default_local_addresses; 86*d9f75844SAndroid Build Coastguard Worker using NetworkManagerBase::set_enumeration_permission; 87*d9f75844SAndroid Build Coastguard Worker 88*d9f75844SAndroid Build Coastguard Worker // rtc::NetworkManager override. GetMdnsResponder()89*d9f75844SAndroid Build Coastguard Worker webrtc::MdnsResponderInterface* GetMdnsResponder() const override { 90*d9f75844SAndroid Build Coastguard Worker return mdns_responder_.get(); 91*d9f75844SAndroid Build Coastguard Worker } 92*d9f75844SAndroid Build Coastguard Worker set_mdns_responder(std::unique_ptr<webrtc::MdnsResponderInterface> mdns_responder)93*d9f75844SAndroid Build Coastguard Worker void set_mdns_responder( 94*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<webrtc::MdnsResponderInterface> mdns_responder) { 95*d9f75844SAndroid Build Coastguard Worker mdns_responder_ = std::move(mdns_responder); 96*d9f75844SAndroid Build Coastguard Worker } 97*d9f75844SAndroid Build Coastguard Worker 98*d9f75844SAndroid Build Coastguard Worker private: DoUpdateNetworks()99*d9f75844SAndroid Build Coastguard Worker void DoUpdateNetworks() { 100*d9f75844SAndroid Build Coastguard Worker if (start_count_ == 0) 101*d9f75844SAndroid Build Coastguard Worker return; 102*d9f75844SAndroid Build Coastguard Worker std::vector<std::unique_ptr<Network>> networks; 103*d9f75844SAndroid Build Coastguard Worker for (IfaceList::iterator it = ifaces_.begin(); it != ifaces_.end(); ++it) { 104*d9f75844SAndroid Build Coastguard Worker int prefix_length = 0; 105*d9f75844SAndroid Build Coastguard Worker if (it->socket_address.ipaddr().family() == AF_INET) { 106*d9f75844SAndroid Build Coastguard Worker prefix_length = kFakeIPv4NetworkPrefixLength; 107*d9f75844SAndroid Build Coastguard Worker } else if (it->socket_address.ipaddr().family() == AF_INET6) { 108*d9f75844SAndroid Build Coastguard Worker prefix_length = kFakeIPv6NetworkPrefixLength; 109*d9f75844SAndroid Build Coastguard Worker } 110*d9f75844SAndroid Build Coastguard Worker IPAddress prefix = TruncateIP(it->socket_address.ipaddr(), prefix_length); 111*d9f75844SAndroid Build Coastguard Worker auto net = std::make_unique<Network>( 112*d9f75844SAndroid Build Coastguard Worker it->socket_address.hostname(), it->socket_address.hostname(), prefix, 113*d9f75844SAndroid Build Coastguard Worker prefix_length, it->adapter_type, /*field_trials=*/nullptr); 114*d9f75844SAndroid Build Coastguard Worker if (it->underlying_vpn_adapter_type.has_value()) { 115*d9f75844SAndroid Build Coastguard Worker net->set_underlying_type_for_vpn(*it->underlying_vpn_adapter_type); 116*d9f75844SAndroid Build Coastguard Worker } 117*d9f75844SAndroid Build Coastguard Worker net->set_default_local_address_provider(this); 118*d9f75844SAndroid Build Coastguard Worker net->AddIP(it->socket_address.ipaddr()); 119*d9f75844SAndroid Build Coastguard Worker networks.push_back(std::move(net)); 120*d9f75844SAndroid Build Coastguard Worker } 121*d9f75844SAndroid Build Coastguard Worker bool changed; 122*d9f75844SAndroid Build Coastguard Worker MergeNetworkList(std::move(networks), &changed); 123*d9f75844SAndroid Build Coastguard Worker if (changed || !sent_first_update_) { 124*d9f75844SAndroid Build Coastguard Worker SignalNetworksChanged(); 125*d9f75844SAndroid Build Coastguard Worker sent_first_update_ = true; 126*d9f75844SAndroid Build Coastguard Worker } 127*d9f75844SAndroid Build Coastguard Worker } 128*d9f75844SAndroid Build Coastguard Worker 129*d9f75844SAndroid Build Coastguard Worker IfaceList ifaces_; 130*d9f75844SAndroid Build Coastguard Worker int next_index_ = 0; 131*d9f75844SAndroid Build Coastguard Worker int start_count_ = 0; 132*d9f75844SAndroid Build Coastguard Worker bool sent_first_update_ = false; 133*d9f75844SAndroid Build Coastguard Worker 134*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<webrtc::MdnsResponderInterface> mdns_responder_; 135*d9f75844SAndroid Build Coastguard Worker }; 136*d9f75844SAndroid Build Coastguard Worker 137*d9f75844SAndroid Build Coastguard Worker } // namespace rtc 138*d9f75844SAndroid Build Coastguard Worker 139*d9f75844SAndroid Build Coastguard Worker #endif // RTC_BASE_FAKE_NETWORK_H_ 140