blob: cec2ffc75cd6920caaab2f0ae7f0df856c4208ed [file] [log] [blame]
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001/*
2 * Copyright 2009 The WebRTC Project Authors. All rights reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Steve Anton10542f22019-01-11 09:11:00 -080011#ifndef RTC_BASE_FAKE_NETWORK_H_
12#define RTC_BASE_FAKE_NETWORK_H_
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000013
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020014#include <memory>
15#include <string>
16#include <utility>
17#include <vector>
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000018
Qingsi Wang09619332018-09-12 22:51:55 -070019#include "absl/memory/memory.h"
20#include "rtc_base/checks.h"
Qingsi Wangecd30542019-05-22 14:34:56 -070021#include "rtc_base/mdns_responder_interface.h"
Steve Anton10542f22019-01-11 09:11:00 -080022#include "rtc_base/message_handler.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020023#include "rtc_base/network.h"
Steve Anton10542f22019-01-11 09:11:00 -080024#include "rtc_base/socket_address.h"
25#include "rtc_base/string_encode.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020026#include "rtc_base/thread.h"
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020027
28namespace rtc {
29
30const int kFakeIPv4NetworkPrefixLength = 24;
31const int kFakeIPv6NetworkPrefixLength = 64;
32
33// Fake network manager that allows us to manually specify the IPs to use.
Tomas Gunnarssonabdb4702020-09-05 18:43:36 +020034class FakeNetworkManager : public NetworkManagerBase,
35 public MessageHandlerAutoCleanup {
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020036 public:
37 FakeNetworkManager() {}
38
Jonas Orelandc8fa1ee2021-08-25 08:58:04 +020039 struct Iface {
40 SocketAddress socket_address;
41 AdapterType adapter_type;
42 absl::optional<AdapterType> underlying_vpn_adapter_type;
43 };
44 typedef std::vector<Iface> IfaceList;
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020045
46 void AddInterface(const SocketAddress& iface) {
47 // Ensure a unique name for the interface if its name is not given.
48 AddInterface(iface, "test" + rtc::ToString(next_index_++));
49 }
50
Ali Tofighd3890782022-04-29 14:02:22 +020051 void AddInterface(const SocketAddress& iface, absl::string_view if_name) {
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020052 AddInterface(iface, if_name, ADAPTER_TYPE_UNKNOWN);
53 }
54
Jonas Orelandc8fa1ee2021-08-25 08:58:04 +020055 void AddInterface(
56 const SocketAddress& iface,
Ali Tofighd3890782022-04-29 14:02:22 +020057 absl::string_view if_name,
Jonas Orelandc8fa1ee2021-08-25 08:58:04 +020058 AdapterType type,
59 absl::optional<AdapterType> underlying_vpn_adapter_type = absl::nullopt) {
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020060 SocketAddress address(if_name, 0);
61 address.SetResolvedIP(iface.ipaddr());
Jonas Orelandc8fa1ee2021-08-25 08:58:04 +020062 ifaces_.push_back({address, type, underlying_vpn_adapter_type});
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020063 DoUpdateNetworks();
64 }
65
66 void RemoveInterface(const SocketAddress& iface) {
Yves Gerey665174f2018-06-19 15:03:05 +020067 for (IfaceList::iterator it = ifaces_.begin(); it != ifaces_.end(); ++it) {
Jonas Orelandc8fa1ee2021-08-25 08:58:04 +020068 if (it->socket_address.EqualIPs(iface)) {
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020069 ifaces_.erase(it);
70 break;
71 }
72 }
73 DoUpdateNetworks();
74 }
75
Mirko Bonadei1916cbc2019-03-01 15:20:35 +010076 void StartUpdating() override {
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020077 ++start_count_;
78 if (start_count_ == 1) {
79 sent_first_update_ = false;
Jonas Orelanda186f422020-11-23 14:31:26 +010080 rtc::Thread::Current()->Post(RTC_FROM_HERE, this, kUpdateNetworksMessage);
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020081 } else {
82 if (sent_first_update_) {
Jonas Orelanda186f422020-11-23 14:31:26 +010083 rtc::Thread::Current()->Post(RTC_FROM_HERE, this,
84 kSignalNetworksMessage);
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020085 }
86 }
87 }
88
Mirko Bonadei1916cbc2019-03-01 15:20:35 +010089 void StopUpdating() override { --start_count_; }
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020090
91 // MessageHandler interface.
Jonas Orelanda186f422020-11-23 14:31:26 +010092 void OnMessage(Message* msg) override {
93 if (msg->message_id == kUpdateNetworksMessage) {
94 DoUpdateNetworks();
95 } else if (msg->message_id == kSignalNetworksMessage) {
96 SignalNetworksChanged();
97 } else {
98 RTC_CHECK(false);
99 }
100 }
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +0200101
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +0200102 using NetworkManagerBase::set_default_local_addresses;
Jonas Olssona4d87372019-07-05 19:08:33 +0200103 using NetworkManagerBase::set_enumeration_permission;
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +0200104
Qingsi Wang1dac6d82018-12-12 15:28:47 -0800105 // rtc::NetworkManager override.
Qingsi Wang7852d292018-10-31 11:17:07 -0700106 webrtc::MdnsResponderInterface* GetMdnsResponder() const override {
Qingsi Wang09619332018-09-12 22:51:55 -0700107 return mdns_responder_.get();
108 }
109
Qingsi Wangecd30542019-05-22 14:34:56 -0700110 void set_mdns_responder(
111 std::unique_ptr<webrtc::MdnsResponderInterface> mdns_responder) {
112 mdns_responder_ = std::move(mdns_responder);
Qingsi Wang1dac6d82018-12-12 15:28:47 -0800113 }
114
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +0200115 private:
116 void DoUpdateNetworks() {
117 if (start_count_ == 0)
118 return;
Niels Möllerd959f3a2022-04-19 11:29:19 +0200119 std::vector<std::unique_ptr<Network>> networks;
Yves Gerey665174f2018-06-19 15:03:05 +0200120 for (IfaceList::iterator it = ifaces_.begin(); it != ifaces_.end(); ++it) {
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +0200121 int prefix_length = 0;
Jonas Orelandc8fa1ee2021-08-25 08:58:04 +0200122 if (it->socket_address.ipaddr().family() == AF_INET) {
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +0200123 prefix_length = kFakeIPv4NetworkPrefixLength;
Jonas Orelandc8fa1ee2021-08-25 08:58:04 +0200124 } else if (it->socket_address.ipaddr().family() == AF_INET6) {
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +0200125 prefix_length = kFakeIPv6NetworkPrefixLength;
126 }
Jonas Orelandc8fa1ee2021-08-25 08:58:04 +0200127 IPAddress prefix = TruncateIP(it->socket_address.ipaddr(), prefix_length);
Niels Möllerd959f3a2022-04-19 11:29:19 +0200128 auto net = std::make_unique<Network>(
Jonas Orelandc8fa1ee2021-08-25 08:58:04 +0200129 it->socket_address.hostname(), it->socket_address.hostname(), prefix,
Niels Möllerd959f3a2022-04-19 11:29:19 +0200130 prefix_length, it->adapter_type);
Jonas Orelandc8fa1ee2021-08-25 08:58:04 +0200131 if (it->underlying_vpn_adapter_type.has_value()) {
132 net->set_underlying_type_for_vpn(*it->underlying_vpn_adapter_type);
133 }
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +0200134 net->set_default_local_address_provider(this);
Jonas Orelandc8fa1ee2021-08-25 08:58:04 +0200135 net->AddIP(it->socket_address.ipaddr());
Niels Möllerd959f3a2022-04-19 11:29:19 +0200136 networks.push_back(std::move(net));
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +0200137 }
138 bool changed;
Niels Möllerd959f3a2022-04-19 11:29:19 +0200139 MergeNetworkList(std::move(networks), &changed);
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +0200140 if (changed || !sent_first_update_) {
141 SignalNetworksChanged();
142 sent_first_update_ = true;
143 }
144 }
145
146 IfaceList ifaces_;
147 int next_index_ = 0;
148 int start_count_ = 0;
149 bool sent_first_update_ = false;
150
Jonas Orelanda186f422020-11-23 14:31:26 +0100151 static constexpr uint32_t kUpdateNetworksMessage = 1;
152 static constexpr uint32_t kSignalNetworksMessage = 2;
153
Qingsi Wangecd30542019-05-22 14:34:56 -0700154 std::unique_ptr<webrtc::MdnsResponderInterface> mdns_responder_;
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +0200155};
156
157} // namespace rtc
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000158
Steve Anton10542f22019-01-11 09:11:00 -0800159#endif // RTC_BASE_FAKE_NETWORK_H_