• Home
  • Raw
  • Download

Lines Matching +full:- +full:- +full:network

4  *  Use of this source code is governed by a BSD-style license
11 #include "rtc_base/network.h"
68 std::unique_ptr<Network> net;
72 bool SortNetworks(const Network* a, const Network* b) { in SortNetworks()
73 // Network types will be preferred above everything else while sorting in SortNetworks()
77 if (a->type() != b->type()) { in SortNetworks()
78 return a->type() < b->type(); in SortNetworks()
81 IPAddress ip_a = a->GetBestIP(); in SortNetworks()
82 IPAddress ip_b = b->GetBestIP(); in SortNetworks()
85 // from RFC 3484-bis in SortNetworks()
90 // TODO(mallinath) - Add VPN and Link speed conditions while sorting. in SortNetworks()
93 return a->key() < b->key(); in SortNetworks()
100 // TODO(jonaso) : Rollout support for cellular network cost using A/B in ComputeNetworkCostByType()
128 // Candidates gathered from the any-address/wildcard ports, as backups, in ComputeNetworkCostByType()
132 // (network conditions over the route) are the same. Note that setting the in ComputeNetworkCostByType()
136 // select candidate pairs, where the network cost is among the criteria. in ComputeNetworkCostByType()
139 // The cost of a VPN should be computed using its underlying network type. in ComputeNetworkCostByType()
153 // Link-local addresses require scope id to be bound successfully. in IsIgnoredIPv6()
174 // Note: consider changing to const Network* as arguments
181 if (Network::IsCellular(old_type) && Network::IsCellular(new_type)) in ShouldAdapterChangeTriggerNetworkChange()
190 field_trials->IsEnabled("WebRTC-IPv6NetworkResolutionFixes")) { in PreferGlobalIPv6Address()
195 field_trials->Lookup("WebRTC-IPv6NetworkResolutionFixes")); in PreferGlobalIPv6Address()
204 // on a multi-homed endpoint. They are actually DNS servers.
210 bool CompareNetworks(const std::unique_ptr<Network>& a, in CompareNetworks()
211 const std::unique_ptr<Network>& b) { in CompareNetworks()
212 if (a->prefix_length() != b->prefix_length()) { in CompareNetworks()
213 return a->prefix_length() < b->prefix_length(); in CompareNetworks()
215 if (a->name() != b->name()) { in CompareNetworks()
216 return a->name() < b->name(); in CompareNetworks()
218 return a->prefix() < b->prefix(); in CompareNetworks()
229 // Test if the network name matches the type<number> pattern, e.g. eth0. The
230 // matching is case-sensitive.
242 // result of the downstream network filtering, see e.g.
247 // Note that we have a more robust way to determine if a network interface in GetAdapterTypeFromName()
258 MatchTypeNameWithIndexPattern(network_name, "v4-wlan")) { in GetAdapterTypeFromName()
277 // TODO(honghaiz): Write a proper IOS network manager. in GetAdapterTypeFromName()
283 MatchTypeNameWithIndexPattern(network_name, "v4-rmnet") || in GetAdapterTypeFromName()
284 MatchTypeNameWithIndexPattern(network_name, "v4-rmnet_data") || in GetAdapterTypeFromName()
313 ? field_trials->IsEnabled("WebRTC-SignalNetworkPreferenceChange") in NetworkManagerBase()
321 std::unique_ptr<Network> NetworkManagerBase::CreateNetwork( in CreateNetwork()
327 return std::make_unique<Network>(name, description, prefix, prefix_length, in CreateNetwork()
331 std::vector<const Network*> NetworkManagerBase::GetAnyAddressNetworks() { in GetAnyAddressNetworks()
332 std::vector<const Network*> networks; in GetAnyAddressNetworks()
337 ipv4_any_address_network_->set_default_local_address_provider(this); in GetAnyAddressNetworks()
338 ipv4_any_address_network_->set_mdns_responder_provider(this); in GetAnyAddressNetworks()
339 ipv4_any_address_network_->AddIP(ipv4_any_address); in GetAnyAddressNetworks()
347 ipv6_any_address_network_->set_default_local_address_provider(this); in GetAnyAddressNetworks()
348 ipv6_any_address_network_->set_mdns_responder_provider(this); in GetAnyAddressNetworks()
349 ipv6_any_address_network_->AddIP(ipv6_any_address); in GetAnyAddressNetworks()
355 std::vector<const Network*> NetworkManagerBase::GetNetworks() const { in GetNetworks()
356 std::vector<const Network*> result; in GetNetworks()
362 std::vector<std::unique_ptr<Network>> new_networks, in MergeNetworkList()
369 std::vector<std::unique_ptr<Network>> new_networks, in MergeNetworkList()
377 // First, build a set of network-keys to the ipaddresses. in MergeNetworkList()
378 for (auto& network : new_networks) { in MergeNetworkList() local
380 std::string key = MakeNetworkKey(network->name(), network->prefix(), in MergeNetworkList()
381 network->prefix_length()); in MergeNetworkList()
382 const std::vector<InterfaceAddress>& addresses = network->GetIPs(); in MergeNetworkList()
386 addrlist.net = std::move(network); in MergeNetworkList()
396 stats->ipv4_network_count++; in MergeNetworkList()
399 stats->ipv6_network_count++; in MergeNetworkList()
404 // Next, look for existing network objects to re-use. in MergeNetworkList()
405 // Result of Network merge. Element in this list should have unique key. in MergeNetworkList()
406 std::vector<Network*> merged_list; in MergeNetworkList()
409 std::unique_ptr<Network> net = std::move(kv.second.net); in MergeNetworkList()
412 // This network is new. in MergeNetworkList()
413 net->set_id(next_available_network_id_++); in MergeNetworkList()
416 net->SetIPs(kv.second.ips, true); in MergeNetworkList()
417 // Place it in the network map. in MergeNetworkList()
422 // This network exists in the map already. Reset its IP addresses. in MergeNetworkList()
423 Network* existing_net = existing->second.get(); in MergeNetworkList()
424 *changed = existing_net->SetIPs(kv.second.ips, *changed); in MergeNetworkList()
426 if (net->type() != ADAPTER_TYPE_UNKNOWN && in MergeNetworkList()
427 net->type() != existing_net->type()) { in MergeNetworkList()
428 if (ShouldAdapterChangeTriggerNetworkChange(existing_net->type(), in MergeNetworkList()
429 net->type())) { in MergeNetworkList()
432 existing_net->set_type(net->type()); in MergeNetworkList()
434 // If the existing network was not active, networks have changed. in MergeNetworkList()
435 if (!existing_net->active()) { in MergeNetworkList()
438 if (net->network_preference() != existing_net->network_preference()) { in MergeNetworkList()
439 existing_net->set_network_preference(net->network_preference()); in MergeNetworkList()
444 RTC_DCHECK(net->active()); in MergeNetworkList()
446 networks_map_[key]->set_mdns_responder_provider(this); in MergeNetworkList()
454 // If the network list changes, we re-assign `networks_` to the merged list in MergeNetworkList()
455 // and re-sort it. in MergeNetworkList()
460 const std::unique_ptr<Network>& network = kv.second; in MergeNetworkList() local
461 // If `network` is in the newly generated `networks_`, it is active. in MergeNetworkList()
462 bool found = absl::c_linear_search(networks_, network.get()); in MergeNetworkList()
463 network->set_active(found); in MergeNetworkList()
466 // Now network interfaces are sorted, we should set the preference value in MergeNetworkList()
468 // Preference order of network interfaces might have changed from previous in MergeNetworkList()
469 // sorting due to addition of higher preference network interface. in MergeNetworkList()
470 // Since we have already sorted the network interfaces based on our in MergeNetworkList()
474 for (Network* network : networks_) { in MergeNetworkList()
475 network->set_preference(pref); in MergeNetworkList()
477 --pref; in MergeNetworkList()
479 RTC_LOG(LS_ERROR) << "Too many network interfaces to handle!"; in MergeNetworkList()
502 Network* ipv6_network = GetNetworkFromAddress(default_local_ipv6_address_); in GetDefaultLocalAddress()
504 // If the default ipv6 network's BestIP is different than in GetDefaultLocalAddress()
507 *ipaddr = ipv6_network->GetBestIP(); in GetDefaultLocalAddress()
516 Network* NetworkManagerBase::GetNetworkFromAddress( in GetNetworkFromAddress()
518 for (Network* network : networks_) { in GetNetworkFromAddress()
519 const auto& ips = network->GetIPs(); in GetNetworkFromAddress()
523 return network; in GetNetworkFromAddress()
551 field_trials()->IsEnabled("WebRTC-AllowMACBasedIPv6")), in BasicNetworkManager()
553 !field_trials()->IsDisabled("WebRTC-BindUsingInterfaceName")) { in BasicNetworkManager()
559 task_safety_flag_->SetNotAlive(); in ~BasicNetworkManager()
565 RTC_LOG(LS_INFO) << "Network change was observed"; in OnNetworksChanged()
573 std::vector<std::unique_ptr<Network>>* networks) const { in CreateNetworks()
582 if (cursor->ifa_flags & IFF_LOOPBACK) { in GetInterfaceInfo()
590 return network_monitor_->GetInterfaceInfo(cursor->ifa_name); in GetInterfaceInfo()
592 return {.adapter_type = GetAdapterTypeFromName(cursor->ifa_name), in GetInterfaceInfo()
603 std::vector<std::unique_ptr<Network>>* networks) const { in ConvertIfAddrs()
604 std::map<std::string, Network*> current_networks; in ConvertIfAddrs()
607 cursor = cursor->ifa_next) { in ConvertIfAddrs()
614 if (!cursor->ifa_addr || !cursor->ifa_netmask) { in ConvertIfAddrs()
618 if (!(cursor->ifa_flags & IFF_RUNNING)) { in ConvertIfAddrs()
622 if (cursor->ifa_addr->sa_family != AF_INET && in ConvertIfAddrs()
623 cursor->ifa_addr->sa_family != AF_INET6) { in ConvertIfAddrs()
628 if (!ifaddrs_converter->ConvertIfAddrsToIPAddress(cursor, &ip, &mask)) { in ConvertIfAddrs()
633 if (cursor->ifa_addr->sa_family == AF_INET6) { in ConvertIfAddrs()
638 reinterpret_cast<sockaddr_in6*>(cursor->ifa_addr)->sin6_scope_id; in ConvertIfAddrs()
644 MakeNetworkKey(std::string(cursor->ifa_name), prefix, prefix_length); in ConvertIfAddrs()
648 // We have already added this network, simply add extra IP. in ConvertIfAddrs()
649 iter->second->AddIP(ip); in ConvertIfAddrs()
651 // Validate that different IP of same network has same properties in ConvertIfAddrs()
652 auto existing_network = iter->second; in ConvertIfAddrs()
661 RTC_DCHECK(existing_network->type() == if_info.adapter_type); in ConvertIfAddrs()
662 RTC_DCHECK(existing_network->underlying_type_for_vpn() == in ConvertIfAddrs()
664 RTC_DCHECK(existing_network->network_preference() == in ConvertIfAddrs()
667 RTC_DCHECK(existing_network->ignored()); in ConvertIfAddrs()
673 // Create a new network. in ConvertIfAddrs()
683 auto network = CreateNetwork(cursor->ifa_name, cursor->ifa_name, prefix, in ConvertIfAddrs() local
685 network->set_default_local_address_provider(this); in ConvertIfAddrs()
686 network->set_scope_id(scope_id); in ConvertIfAddrs()
687 network->AddIP(ip); in ConvertIfAddrs()
689 network->set_ignored(true); in ConvertIfAddrs()
691 network->set_ignored(IsIgnoredNetwork(*network)); in ConvertIfAddrs()
693 network->set_underlying_type_for_vpn(if_info.underlying_type_for_vpn); in ConvertIfAddrs()
694 network->set_network_preference(if_info.network_preference); in ConvertIfAddrs()
695 if (include_ignored || !network->ignored()) { in ConvertIfAddrs()
696 current_networks[key] = network.get(); in ConvertIfAddrs()
697 networks->push_back(std::move(network)); in ConvertIfAddrs()
704 std::vector<std::unique_ptr<Network>>* networks) const { in CreateNetworks()
731 if (prefixlist->Address.lpSockaddr == nullptr || in GetPrefix()
732 prefixlist->Address.lpSockaddr->sa_family != ip.family()) { in GetPrefix()
733 prefixlist = prefixlist->Next; in GetPrefix()
736 switch (prefixlist->Address.lpSockaddr->sa_family) { in GetPrefix()
739 reinterpret_cast<sockaddr_in*>(prefixlist->Address.lpSockaddr); in GetPrefix()
740 current_prefix = IPAddress(v4_addr->sin_addr); in GetPrefix()
745 reinterpret_cast<sockaddr_in6*>(prefixlist->Address.lpSockaddr); in GetPrefix()
746 current_prefix = IPAddress(v6_addr->sin6_addr); in GetPrefix()
750 prefixlist = prefixlist->Next; in GetPrefix()
754 if (TruncateIP(ip, prefixlist->PrefixLength) == current_prefix && in GetPrefix()
755 prefixlist->PrefixLength > best_length) { in GetPrefix()
757 best_length = prefixlist->PrefixLength; in GetPrefix()
759 prefixlist = prefixlist->Next; in GetPrefix()
767 std::vector<std::unique_ptr<Network>>* networks) const { in CreateNetworks()
768 std::map<std::string, Network*> current_networks; in CreateNetworks()
788 if (adapter_addrs->OperStatus == IfOperStatusUp) { in CreateNetworks()
789 PIP_ADAPTER_UNICAST_ADDRESS address = adapter_addrs->FirstUnicastAddress; in CreateNetworks()
790 PIP_ADAPTER_PREFIX prefixlist = adapter_addrs->FirstPrefix; in CreateNetworks()
791 std::string description = ToUtf8(adapter_addrs->Description, in CreateNetworks()
792 wcslen(adapter_addrs->Description)); in CreateNetworks()
794 for (; address; address = address->Next) { in CreateNetworks()
797 name = ToUtf8(adapter_addrs->FriendlyName, in CreateNetworks()
798 wcslen(adapter_addrs->FriendlyName)); in CreateNetworks()
803 std::unique_ptr<Network> network; in CreateNetworks() local
804 switch (address->Address.lpSockaddr->sa_family) { in CreateNetworks()
807 reinterpret_cast<sockaddr_in*>(address->Address.lpSockaddr); in CreateNetworks()
808 ip = IPAddress(v4_addr->sin_addr); in CreateNetworks()
813 reinterpret_cast<sockaddr_in6*>(address->Address.lpSockaddr); in CreateNetworks()
814 scope_id = v6_addr->sin6_scope_id; in CreateNetworks()
815 ip = IPAddress(v6_addr->sin6_addr); in CreateNetworks()
834 switch (adapter_addrs->IfType) { in CreateNetworks()
867 adapter_addrs->PhysicalAddress), in CreateNetworks()
868 adapter_addrs->PhysicalAddressLength))) { in CreateNetworks()
869 // With MAC-based detection we do not know the in CreateNetworks()
875 auto network = CreateNetwork(name, description, prefix, prefix_length, in CreateNetworks() local
877 network->set_underlying_type_for_vpn(underlying_type_for_vpn); in CreateNetworks()
878 network->set_default_local_address_provider(this); in CreateNetworks()
879 network->set_mdns_responder_provider(this); in CreateNetworks()
880 network->set_scope_id(scope_id); in CreateNetworks()
881 network->AddIP(ip); in CreateNetworks()
882 bool ignored = IsIgnoredNetwork(*network); in CreateNetworks()
883 network->set_ignored(ignored); in CreateNetworks()
884 if (include_ignored || !network->ignored()) { in CreateNetworks()
885 current_networks[key] = network.get(); in CreateNetworks()
886 networks->push_back(std::move(network)); in CreateNetworks()
889 (*existing_network).second->AddIP(ip); in CreateNetworks()
892 // Count is per-adapter - all 'Networks' created from the same in CreateNetworks()
896 adapter_addrs = adapter_addrs->Next; in CreateNetworks()
902 bool BasicNetworkManager::IsIgnoredNetwork(const Network& network) const { in IsIgnoredNetwork()
905 if (network.name() == ignored_name) { in IsIgnoredNetwork()
913 if (strncmp(network.name().c_str(), "vmnet", 5) == 0 || in IsIgnoredNetwork()
914 strncmp(network.name().c_str(), "vnic", 4) == 0 || in IsIgnoredNetwork()
915 strncmp(network.name().c_str(), "vboxnet", 7) == 0) { in IsIgnoredNetwork()
923 if (strstr(network.description().c_str(), "VMnet") != nullptr) { in IsIgnoredNetwork()
929 if (network.prefix().family() == AF_INET) { in IsIgnoredNetwork()
930 return (network.prefix().v4AddressAsHostOrderInteger() < 0x01000000); in IsIgnoredNetwork()
941 // If network interfaces are already discovered and signal is sent, in StartUpdating()
942 // we should trigger network signal immediately for the new clients in StartUpdating()
945 thread_->PostTask(SafeTask(task_safety_flag_, [this] { in StartUpdating()
952 thread_->PostTask(SafeTask(task_safety_flag_, [this] { in StartUpdating()
966 --start_count_; in StopUpdating()
968 task_safety_flag_->SetNotAlive(); in StopUpdating()
981 network_monitor_factory_->CreateNetworkMonitor(*field_trials())); in StartNetworkMonitor()
985 network_monitor_->SetNetworksChangedCallback( in StartNetworkMonitor()
989 if (network_monitor_->SupportsBindSocketToNetwork()) { in StartNetworkMonitor()
993 // name and then call network_monitor_->BindSocketToNetwork()). in StartNetworkMonitor()
994 thread_->socketserver()->set_network_binder(this); in StartNetworkMonitor()
997 network_monitor_->Start(); in StartNetworkMonitor()
1004 network_monitor_->Stop(); in StopNetworkMonitor()
1006 if (network_monitor_->SupportsBindSocketToNetwork()) { in StopNetworkMonitor()
1008 if (thread_->socketserver()->network_binder() == this) { in StopNetworkMonitor()
1009 thread_->socketserver()->set_network_binder(nullptr); in StopNetworkMonitor()
1018 socket_factory_->CreateSocket(family, SOCK_DGRAM)); in QueryDefaultLocalAddress()
1024 if (socket->Connect(SocketAddress( in QueryDefaultLocalAddress()
1027 if (socket->GetError() != ENETUNREACH && in QueryDefaultLocalAddress()
1028 socket->GetError() != EHOSTUNREACH) { in QueryDefaultLocalAddress()
1029 // Ignore the expected case of "host/net unreachable" - which happens if in QueryDefaultLocalAddress()
1030 // the network is V4- or V6-only. in QueryDefaultLocalAddress()
1031 RTC_LOG(LS_INFO) << "Connect failed with " << socket->GetError(); in QueryDefaultLocalAddress()
1035 return socket->GetLocalAddress().ipaddr(); in QueryDefaultLocalAddress()
1042 std::vector<std::unique_ptr<Network>> list; in UpdateNetworksOnce()
1060 thread_->PostDelayedTask(SafeTask(task_safety_flag_, in UpdateNetworksContinually()
1070 std::vector<const Network*> list = GetNetworks(); in DumpNetworks()
1072 for (const Network* network : list) { in DumpNetworks() local
1073 RTC_LOG(LS_INFO) << network->ToString() << ": " << network->description() in DumpNetworks()
1074 << ", active ? " << network->active() in DumpNetworks()
1075 << ((network->ignored()) ? ", Ignored" : ""); in DumpNetworks()
1085 Network* net = GetNetworkFromAddress(address); in BindSocketToNetwork()
1087 if_name = net->name(); in BindSocketToNetwork()
1090 return network_monitor_->BindSocketToNetwork(socket_fd, address, if_name); in BindSocketToNetwork()
1093 Network::Network(absl::string_view name, in Network() function in rtc::Network
1110 Network::Network(const Network&) = default;
1112 Network::~Network() = default;
1114 // Sets the addresses of this network. Returns true if the address set changed.
1116 bool Network::SetIPs(const std::vector<InterfaceAddress>& ips, bool changed) { in SetIPs()
1117 // Detect changes with a nested loop; n-squared but we expect on the order in SetIPs()
1118 // of 2-3 addresses per network. in SetIPs()
1133 // Select the best IP address to use from this Network.
1134 IPAddress Network::GetBestIP() const { in GetBestIP()
1165 // Search could stop once a temporary non-deprecated one is found. in GetBestIP()
1183 webrtc::MdnsResponderInterface* Network::GetMdnsResponder() const { in GetMdnsResponder()
1187 return mdns_responder_provider_->GetMdnsResponder(); in GetMdnsResponder()
1190 uint16_t Network::GetCost(const webrtc::FieldTrialsView* field_trials) const { in GetCost()
1196 uint16_t Network::GetCost(const webrtc::FieldTrialsView& field_trials) const { in GetCost()
1199 field_trials.IsEnabled("WebRTC-UseDifferentiatedCellularCosts"); in GetCost()
1201 field_trials.IsEnabled("WebRTC-AddNetworkCostToVpn"); in GetCost()
1209 Network::GuessAdapterFromNetworkCost(int network_cost) { in GuessAdapterFromNetworkCost()
1248 RTC_LOG(LS_VERBOSE) << "Unknown network cost: " << network_cost; in GuessAdapterFromNetworkCost()
1252 std::string Network::ToString() const { in ToString()
1254 // Print out the first space-terminated token of the network desc, plus in ToString()
1270 thread_->BlockingCall([this, vpn] { vpn_ = vpn; }); in set_vpn_list()