xref: /aosp_15_r20/external/webrtc/rtc_base/fake_network.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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