From 5ae259ee4f87156f1df22b48241dc0ba1f80b4a5 Mon Sep 17 00:00:00 2001 From: Qingsi Wang Date: Wed, 13 Feb 2019 15:46:07 -0800 Subject: [PATCH] Use a provider in rtc::Network to access the mDNS responder. Bug: chromium:930339 Change-Id: I42c22f4417f2f12b606bb9791edc074561c78518 Reviewed-on: https://webrtc-review.googlesource.com/c/122680 Commit-Queue: Qingsi Wang Reviewed-by: Steve Anton Reviewed-by: Sergey Ulanov Cr-Commit-Position: refs/heads/master@{#26674} --- rtc_base/network.cc | 14 +++++++++++--- rtc_base/network.h | 42 +++++++++++++++++++++++++----------------- 2 files changed, 36 insertions(+), 20 deletions(-) diff --git a/rtc_base/network.cc b/rtc_base/network.cc index 0bbb260b20..496c769b17 100644 --- a/rtc_base/network.cc +++ b/rtc_base/network.cc @@ -283,8 +283,8 @@ void NetworkManagerBase::GetAnyAddressNetworks(NetworkList* networks) { ipv4_any_address_network_.reset( new rtc::Network("any", "any", ipv4_any_address, 0, ADAPTER_TYPE_ANY)); ipv4_any_address_network_->set_default_local_address_provider(this); + ipv4_any_address_network_->set_mdns_responder_provider(this); ipv4_any_address_network_->AddIP(ipv4_any_address); - ipv4_any_address_network_->SetMdnsResponder(GetMdnsResponder()); } networks->push_back(ipv4_any_address_network_.get()); @@ -293,8 +293,8 @@ void NetworkManagerBase::GetAnyAddressNetworks(NetworkList* networks) { ipv6_any_address_network_.reset( new rtc::Network("any", "any", ipv6_any_address, 0, ADAPTER_TYPE_ANY)); ipv6_any_address_network_->set_default_local_address_provider(this); + ipv6_any_address_network_->set_mdns_responder_provider(this); ipv6_any_address_network_->AddIP(ipv6_any_address); - ipv6_any_address_network_->SetMdnsResponder(GetMdnsResponder()); } networks->push_back(ipv6_any_address_network_.get()); } @@ -383,7 +383,7 @@ void NetworkManagerBase::MergeNetworkList(const NetworkList& new_networks, delete net; } } - networks_map_[key]->SetMdnsResponder(GetMdnsResponder()); + networks_map_[key]->set_mdns_responder_provider(this); } // It may still happen that the merged list is a subset of |networks_|. // To detect this change, we compare their sizes. @@ -739,6 +739,7 @@ bool BasicNetworkManager::CreateNetworks(bool include_ignored, std::unique_ptr network(new Network( name, description, prefix, prefix_length, adapter_type)); network->set_default_local_address_provider(this); + network->set_mdns_responder_provider(this); network->set_scope_id(scope_id); network->AddIP(ip); bool ignored = IsIgnoredNetwork(*network); @@ -1049,6 +1050,13 @@ IPAddress Network::GetBestIP() const { return static_cast(selected_ip); } +webrtc::MdnsResponderInterface* Network::GetMdnsResponder() const { + if (mdns_responder_provider_ == nullptr) { + return nullptr; + } + return mdns_responder_provider_->GetMdnsResponder(); +} + uint16_t Network::GetCost() const { AdapterType type = IsVpn() ? underlying_type_for_vpn_ : type_; return ComputeNetworkCostByType(type); diff --git a/rtc_base/network.h b/rtc_base/network.h index aa806af514..d202f6eb6c 100644 --- a/rtc_base/network.h +++ b/rtc_base/network.h @@ -57,12 +57,24 @@ AdapterType GetAdapterTypeFromName(const char* network_name); class DefaultLocalAddressProvider { public: virtual ~DefaultLocalAddressProvider() = default; + // The default local address is the local address used in multi-homed endpoint // when the any address (0.0.0.0 or ::) is used as the local address. It's // important to check the return value as a IP family may not be enabled. virtual bool GetDefaultLocalAddress(int family, IPAddress* ipaddr) const = 0; }; +class MdnsResponderProvider { + public: + virtual ~MdnsResponderProvider() = default; + + // Returns the mDNS responder that can be used to obfuscate the local IP + // addresses of ICE host candidates by mDNS hostnames. + // + // The provider MUST outlive the mDNS responder. + virtual webrtc::MdnsResponderInterface* GetMdnsResponder() const = 0; +}; + // Generic network manager interface. It provides list of local // networks. // @@ -72,7 +84,8 @@ class DefaultLocalAddressProvider { // // This allows constructing a NetworkManager subclass on one thread and // passing it into an object that uses it on a different thread. -class NetworkManager : public DefaultLocalAddressProvider { +class NetworkManager : public DefaultLocalAddressProvider, + public MdnsResponderProvider { public: typedef std::vector NetworkList; @@ -139,9 +152,8 @@ class NetworkManager : public DefaultLocalAddressProvider { } }; - // Returns the mDNS responder that can be used to obfuscate the local IP - // addresses of ICE host candidates by mDNS hostnames. - virtual webrtc::MdnsResponderInterface* GetMdnsResponder() const; + // MdnsResponderProvider interface. + webrtc::MdnsResponderInterface* GetMdnsResponder() const override; }; // Base class for NetworkManager implementations. @@ -303,7 +315,11 @@ class Network { default_local_address_provider_ = provider; } - // Returns the name of the interface this network is associated wtih. + void set_mdns_responder_provider(const MdnsResponderProvider* provider) { + mdns_responder_provider_ = provider; + } + + // Returns the name of the interface this network is associated with. const std::string& name() const { return name_; } // Returns the OS-assigned name for this network. This is useful for @@ -322,7 +338,7 @@ class Network { // Returns the Network's current idea of the 'best' IP it has. // Or return an unset IP if this network has no active addresses. // Here is the rule on how we mark the IPv6 address as ignorable for WebRTC. - // 1) return all global temporary dynamic and non-deprecrated ones. + // 1) return all global temporary dynamic and non-deprecated ones. // 2) if #1 not available, return global ones. // 3) if #2 not available, use ULA ipv6 as last resort. (ULA stands // for unique local address, which is not route-able in open @@ -354,19 +370,11 @@ class Network { const std::vector& GetIPs() const { return ips_; } // Clear the network's list of addresses. void ClearIPs() { ips_.clear(); } - // Sets the mDNS responder that can be used to obfuscate the local IP + // Returns the mDNS responder that can be used to obfuscate the local IP // addresses of host candidates by mDNS names in ICE gathering. After a // name-address mapping is created by the mDNS responder, queries for the // created name will be resolved by the responder. - // - // The mDNS responder, if not null, should outlive this rtc::Network. - void SetMdnsResponder(webrtc::MdnsResponderInterface* mdns_responder) { - mdns_responder_ = mdns_responder; - } - // Returns the mDNS responder, which is null by default. - webrtc::MdnsResponderInterface* GetMdnsResponder() const { - return mdns_responder_; - } + webrtc::MdnsResponderInterface* GetMdnsResponder() const; // Returns the scope-id of the network's address. // Should only be relevant for link-local IPv6 addresses. @@ -433,13 +441,13 @@ class Network { private: const DefaultLocalAddressProvider* default_local_address_provider_ = nullptr; + const MdnsResponderProvider* mdns_responder_provider_ = nullptr; std::string name_; std::string description_; IPAddress prefix_; int prefix_length_; std::string key_; std::vector ips_; - webrtc::MdnsResponderInterface* mdns_responder_ = nullptr; int scope_id_; bool ignored_; AdapterType type_;