1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef NET_DNS_HOST_RESOLVER_MANAGER_H_ 6*6777b538SAndroid Build Coastguard Worker #define NET_DNS_HOST_RESOLVER_MANAGER_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <stddef.h> 9*6777b538SAndroid Build Coastguard Worker #include <stdint.h> 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker #include <deque> 12*6777b538SAndroid Build Coastguard Worker #include <map> 13*6777b538SAndroid Build Coastguard Worker #include <memory> 14*6777b538SAndroid Build Coastguard Worker #include <optional> 15*6777b538SAndroid Build Coastguard Worker #include <set> 16*6777b538SAndroid Build Coastguard Worker #include <string> 17*6777b538SAndroid Build Coastguard Worker #include <string_view> 18*6777b538SAndroid Build Coastguard Worker #include <vector> 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback.h" 21*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback_helpers.h" 22*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h" 23*6777b538SAndroid Build Coastguard Worker #include "base/memory/scoped_refptr.h" 24*6777b538SAndroid Build Coastguard Worker #include "base/memory/weak_ptr.h" 25*6777b538SAndroid Build Coastguard Worker #include "base/observer_list.h" 26*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h" 27*6777b538SAndroid Build Coastguard Worker #include "base/timer/timer.h" 28*6777b538SAndroid Build Coastguard Worker #include "base/values.h" 29*6777b538SAndroid Build Coastguard Worker #include "net/base/completion_once_callback.h" 30*6777b538SAndroid Build Coastguard Worker #include "net/base/host_port_pair.h" 31*6777b538SAndroid Build Coastguard Worker #include "net/base/network_anonymization_key.h" 32*6777b538SAndroid Build Coastguard Worker #include "net/base/network_change_notifier.h" 33*6777b538SAndroid Build Coastguard Worker #include "net/base/network_handle.h" 34*6777b538SAndroid Build Coastguard Worker #include "net/base/prioritized_dispatcher.h" 35*6777b538SAndroid Build Coastguard Worker #include "net/dns/dns_config.h" 36*6777b538SAndroid Build Coastguard Worker #include "net/dns/host_cache.h" 37*6777b538SAndroid Build Coastguard Worker #include "net/dns/host_resolver.h" 38*6777b538SAndroid Build Coastguard Worker #include "net/dns/httpssvc_metrics.h" 39*6777b538SAndroid Build Coastguard Worker #include "net/dns/public/dns_config_overrides.h" 40*6777b538SAndroid Build Coastguard Worker #include "net/dns/public/dns_query_type.h" 41*6777b538SAndroid Build Coastguard Worker #include "net/dns/public/secure_dns_mode.h" 42*6777b538SAndroid Build Coastguard Worker #include "net/dns/public/secure_dns_policy.h" 43*6777b538SAndroid Build Coastguard Worker #include "net/dns/resolve_context.h" 44*6777b538SAndroid Build Coastguard Worker #include "net/dns/system_dns_config_change_notifier.h" 45*6777b538SAndroid Build Coastguard Worker #include "net/log/net_log_with_source.h" 46*6777b538SAndroid Build Coastguard Worker #include "net/socket/datagram_client_socket.h" 47*6777b538SAndroid Build Coastguard Worker #include "third_party/abseil-cpp/absl/types/variant.h" 48*6777b538SAndroid Build Coastguard Worker #include "url/gurl.h" 49*6777b538SAndroid Build Coastguard Worker #include "url/scheme_host_port.h" 50*6777b538SAndroid Build Coastguard Worker 51*6777b538SAndroid Build Coastguard Worker namespace base { 52*6777b538SAndroid Build Coastguard Worker class TickClock; 53*6777b538SAndroid Build Coastguard Worker } // namespace base 54*6777b538SAndroid Build Coastguard Worker 55*6777b538SAndroid Build Coastguard Worker namespace net { 56*6777b538SAndroid Build Coastguard Worker 57*6777b538SAndroid Build Coastguard Worker class DnsClient; 58*6777b538SAndroid Build Coastguard Worker class DnsProbeRunner; 59*6777b538SAndroid Build Coastguard Worker class IPAddress; 60*6777b538SAndroid Build Coastguard Worker class MDnsClient; 61*6777b538SAndroid Build Coastguard Worker class ClientSocketFactory; 62*6777b538SAndroid Build Coastguard Worker class MDnsSocketFactory; 63*6777b538SAndroid Build Coastguard Worker class NetLog; 64*6777b538SAndroid Build Coastguard Worker 65*6777b538SAndroid Build Coastguard Worker // Scheduler and controller of host resolution requests. Because of the global 66*6777b538SAndroid Build Coastguard Worker // nature of host resolutions, this class is generally expected to be singleton 67*6777b538SAndroid Build Coastguard Worker // within the browser and only be interacted with through per-context 68*6777b538SAndroid Build Coastguard Worker // ContextHostResolver objects (which are themselves generally interacted with 69*6777b538SAndroid Build Coastguard Worker // though the HostResolver interface). 70*6777b538SAndroid Build Coastguard Worker // 71*6777b538SAndroid Build Coastguard Worker // For each hostname that is requested, HostResolver creates a 72*6777b538SAndroid Build Coastguard Worker // HostResolverManager::Job. When this job gets dispatched it creates a task 73*6777b538SAndroid Build Coastguard Worker // (HostResolverSystemTask for the system resolver or DnsTask for the async 74*6777b538SAndroid Build Coastguard Worker // resolver) which resolves the hostname. If requests for that same host are 75*6777b538SAndroid Build Coastguard Worker // made during the job's lifetime, they are attached to the existing job rather 76*6777b538SAndroid Build Coastguard Worker // than creating a new one. This avoids doing parallel resolves for the same 77*6777b538SAndroid Build Coastguard Worker // host. 78*6777b538SAndroid Build Coastguard Worker // 79*6777b538SAndroid Build Coastguard Worker // The way these classes fit together is illustrated by: 80*6777b538SAndroid Build Coastguard Worker // 81*6777b538SAndroid Build Coastguard Worker // 82*6777b538SAndroid Build Coastguard Worker // +----------- HostResolverManager ----------+ 83*6777b538SAndroid Build Coastguard Worker // | | | 84*6777b538SAndroid Build Coastguard Worker // Job Job Job 85*6777b538SAndroid Build Coastguard Worker // (for host1, fam1) (for host2, fam2) (for hostx, famx) 86*6777b538SAndroid Build Coastguard Worker // / | | / | | / | | 87*6777b538SAndroid Build Coastguard Worker // Request ... Request Request ... Request Request ... Request 88*6777b538SAndroid Build Coastguard Worker // (port1) (port2) (port3) (port4) (port5) (portX) 89*6777b538SAndroid Build Coastguard Worker // 90*6777b538SAndroid Build Coastguard Worker // When a HostResolverManager::Job finishes, the callbacks of each waiting 91*6777b538SAndroid Build Coastguard Worker // request are run on the origin thread. 92*6777b538SAndroid Build Coastguard Worker // 93*6777b538SAndroid Build Coastguard Worker // Thread safety: This class is not threadsafe, and must only be called 94*6777b538SAndroid Build Coastguard Worker // from one thread! 95*6777b538SAndroid Build Coastguard Worker // 96*6777b538SAndroid Build Coastguard Worker // The HostResolverManager enforces limits on the maximum number of concurrent 97*6777b538SAndroid Build Coastguard Worker // threads using PrioritizedDispatcher::Limits. 98*6777b538SAndroid Build Coastguard Worker // 99*6777b538SAndroid Build Coastguard Worker // Jobs are ordered in the queue based on their priority and order of arrival. 100*6777b538SAndroid Build Coastguard Worker class NET_EXPORT HostResolverManager 101*6777b538SAndroid Build Coastguard Worker : public NetworkChangeNotifier::IPAddressObserver, 102*6777b538SAndroid Build Coastguard Worker public NetworkChangeNotifier::ConnectionTypeObserver, 103*6777b538SAndroid Build Coastguard Worker public SystemDnsConfigChangeNotifier::Observer { 104*6777b538SAndroid Build Coastguard Worker public: 105*6777b538SAndroid Build Coastguard Worker using MdnsListener = HostResolver::MdnsListener; 106*6777b538SAndroid Build Coastguard Worker using ResolveHostParameters = HostResolver::ResolveHostParameters; 107*6777b538SAndroid Build Coastguard Worker using PassKey = base::PassKey<HostResolverManager>; 108*6777b538SAndroid Build Coastguard Worker 109*6777b538SAndroid Build Coastguard Worker struct NET_EXPORT_PRIVATE JobKey; 110*6777b538SAndroid Build Coastguard Worker class NET_EXPORT_PRIVATE Job; 111*6777b538SAndroid Build Coastguard Worker class NET_EXPORT_PRIVATE RequestImpl; 112*6777b538SAndroid Build Coastguard Worker class NET_EXPORT_PRIVATE ServiceEndpointRequestImpl; 113*6777b538SAndroid Build Coastguard Worker 114*6777b538SAndroid Build Coastguard Worker // Creates a HostResolver as specified by |options|. Blocking tasks are run in 115*6777b538SAndroid Build Coastguard Worker // ThreadPool. 116*6777b538SAndroid Build Coastguard Worker // 117*6777b538SAndroid Build Coastguard Worker // If Options.enable_caching is true, a cache is created using 118*6777b538SAndroid Build Coastguard Worker // HostCache::CreateDefaultCache(). Otherwise no cache is used. 119*6777b538SAndroid Build Coastguard Worker // 120*6777b538SAndroid Build Coastguard Worker // Options.GetDispatcherLimits() determines the maximum number of jobs that 121*6777b538SAndroid Build Coastguard Worker // the resolver will run at once. This upper-bounds the total number of 122*6777b538SAndroid Build Coastguard Worker // outstanding DNS transactions (not counting retransmissions and retries). 123*6777b538SAndroid Build Coastguard Worker // 124*6777b538SAndroid Build Coastguard Worker // |net_log| and |system_dns_config_notifier|, if non-null, must remain valid 125*6777b538SAndroid Build Coastguard Worker // for the life of the HostResolverManager. 126*6777b538SAndroid Build Coastguard Worker HostResolverManager(const HostResolver::ManagerOptions& options, 127*6777b538SAndroid Build Coastguard Worker SystemDnsConfigChangeNotifier* system_dns_config_notifier, 128*6777b538SAndroid Build Coastguard Worker NetLog* net_log); 129*6777b538SAndroid Build Coastguard Worker 130*6777b538SAndroid Build Coastguard Worker HostResolverManager(const HostResolverManager&) = delete; 131*6777b538SAndroid Build Coastguard Worker HostResolverManager& operator=(const HostResolverManager&) = delete; 132*6777b538SAndroid Build Coastguard Worker 133*6777b538SAndroid Build Coastguard Worker // If any completion callbacks are pending when the resolver is destroyed, 134*6777b538SAndroid Build Coastguard Worker // the host resolutions are cancelled, and the completion callbacks will not 135*6777b538SAndroid Build Coastguard Worker // be called. 136*6777b538SAndroid Build Coastguard Worker ~HostResolverManager() override; 137*6777b538SAndroid Build Coastguard Worker 138*6777b538SAndroid Build Coastguard Worker // Same as constructor above, but binds the HostResolverManager to 139*6777b538SAndroid Build Coastguard Worker // `target_network`: all DNS requests will be performed for `target_network` 140*6777b538SAndroid Build Coastguard Worker // only, requests will fail if `target_network` disconnects. Only 141*6777b538SAndroid Build Coastguard Worker // HostResolvers bound to the same network will be able to use this. 142*6777b538SAndroid Build Coastguard Worker // Only implemented for Android. 143*6777b538SAndroid Build Coastguard Worker static std::unique_ptr<HostResolverManager> 144*6777b538SAndroid Build Coastguard Worker CreateNetworkBoundHostResolverManager( 145*6777b538SAndroid Build Coastguard Worker const HostResolver::ManagerOptions& options, 146*6777b538SAndroid Build Coastguard Worker handles::NetworkHandle target_network, 147*6777b538SAndroid Build Coastguard Worker NetLog* net_log); 148*6777b538SAndroid Build Coastguard Worker 149*6777b538SAndroid Build Coastguard Worker // Creates a host resolution request. `resolve_context` must have already been 150*6777b538SAndroid Build Coastguard Worker // added via RegisterResolveContext(). If `optional_parameters` specifies any 151*6777b538SAndroid Build Coastguard Worker // cache usage other than LOCAL_ONLY, `resolve_context` should have a valid 152*6777b538SAndroid Build Coastguard Worker // `host_cache()` coming from a ContextHostResolver that owns 153*6777b538SAndroid Build Coastguard Worker // `resolve_context`. 154*6777b538SAndroid Build Coastguard Worker std::unique_ptr<HostResolver::ResolveHostRequest> CreateRequest( 155*6777b538SAndroid Build Coastguard Worker absl::variant<url::SchemeHostPort, HostPortPair> host, 156*6777b538SAndroid Build Coastguard Worker NetworkAnonymizationKey network_anonymization_key, 157*6777b538SAndroid Build Coastguard Worker NetLogWithSource net_log, 158*6777b538SAndroid Build Coastguard Worker std::optional<ResolveHostParameters> optional_parameters, 159*6777b538SAndroid Build Coastguard Worker ResolveContext* resolve_context); 160*6777b538SAndroid Build Coastguard Worker std::unique_ptr<HostResolver::ResolveHostRequest> CreateRequest( 161*6777b538SAndroid Build Coastguard Worker HostResolver::Host host, 162*6777b538SAndroid Build Coastguard Worker NetworkAnonymizationKey network_anonymization_key, 163*6777b538SAndroid Build Coastguard Worker NetLogWithSource net_log, 164*6777b538SAndroid Build Coastguard Worker std::optional<ResolveHostParameters> optional_parameters, 165*6777b538SAndroid Build Coastguard Worker ResolveContext* resolve_context); 166*6777b538SAndroid Build Coastguard Worker // |resolve_context| is the context to use for the probes, and it is expected 167*6777b538SAndroid Build Coastguard Worker // to be the context of the calling ContextHostResolver. 168*6777b538SAndroid Build Coastguard Worker std::unique_ptr<HostResolver::ProbeRequest> CreateDohProbeRequest( 169*6777b538SAndroid Build Coastguard Worker ResolveContext* resolve_context); 170*6777b538SAndroid Build Coastguard Worker std::unique_ptr<MdnsListener> CreateMdnsListener(const HostPortPair& host, 171*6777b538SAndroid Build Coastguard Worker DnsQueryType query_type); 172*6777b538SAndroid Build Coastguard Worker 173*6777b538SAndroid Build Coastguard Worker // Creates a service endpoint resolution request. 174*6777b538SAndroid Build Coastguard Worker std::unique_ptr<HostResolver::ServiceEndpointRequest> 175*6777b538SAndroid Build Coastguard Worker CreateServiceEndpointRequest( 176*6777b538SAndroid Build Coastguard Worker url::SchemeHostPort scheme_host_port, 177*6777b538SAndroid Build Coastguard Worker NetworkAnonymizationKey network_anonymization_key, 178*6777b538SAndroid Build Coastguard Worker NetLogWithSource net_log, 179*6777b538SAndroid Build Coastguard Worker ResolveHostParameters parameters, 180*6777b538SAndroid Build Coastguard Worker ResolveContext* resolve_context); 181*6777b538SAndroid Build Coastguard Worker 182*6777b538SAndroid Build Coastguard Worker // Enables or disables the built-in asynchronous DnsClient. If enabled, by 183*6777b538SAndroid Build Coastguard Worker // default (when no |ResolveHostParameters::source| is specified), the 184*6777b538SAndroid Build Coastguard Worker // DnsClient will be used for resolves and, in case of failure, resolution 185*6777b538SAndroid Build Coastguard Worker // will fallback to the system resolver (in tests, HostResolverProc from 186*6777b538SAndroid Build Coastguard Worker // HostResolverSystemTask::Params). If the DnsClient is not pre-configured 187*6777b538SAndroid Build Coastguard Worker // with a valid DnsConfig, a new config is fetched from NetworkChangeNotifier. 188*6777b538SAndroid Build Coastguard Worker // 189*6777b538SAndroid Build Coastguard Worker // Setting to |true| has no effect if |ENABLE_BUILT_IN_DNS| not defined. 190*6777b538SAndroid Build Coastguard Worker virtual void SetInsecureDnsClientEnabled(bool enabled, 191*6777b538SAndroid Build Coastguard Worker bool additional_dns_types_enabled); 192*6777b538SAndroid Build Coastguard Worker 193*6777b538SAndroid Build Coastguard Worker base::Value::Dict GetDnsConfigAsValue() const; 194*6777b538SAndroid Build Coastguard Worker 195*6777b538SAndroid Build Coastguard Worker // Sets overriding configuration that will replace or add to configuration 196*6777b538SAndroid Build Coastguard Worker // read from the system for DnsClient resolution. 197*6777b538SAndroid Build Coastguard Worker void SetDnsConfigOverrides(DnsConfigOverrides overrides); 198*6777b538SAndroid Build Coastguard Worker 199*6777b538SAndroid Build Coastguard Worker void SetIPv6ReachabilityOverride(bool reachability_override); 200*6777b538SAndroid Build Coastguard Worker 201*6777b538SAndroid Build Coastguard Worker // Support for invalidating cached per-context data on changes to network or 202*6777b538SAndroid Build Coastguard Worker // DNS configuration. ContextHostResolvers should register/deregister 203*6777b538SAndroid Build Coastguard Worker // themselves here rather than attempting to listen for relevant network 204*6777b538SAndroid Build Coastguard Worker // change signals themselves because HostResolverManager needs to coordinate 205*6777b538SAndroid Build Coastguard Worker // invalidations with in-progress resolves and because some invalidations are 206*6777b538SAndroid Build Coastguard Worker // triggered by changes to manager properties/configuration rather than pure 207*6777b538SAndroid Build Coastguard Worker // network changes. 208*6777b538SAndroid Build Coastguard Worker // 209*6777b538SAndroid Build Coastguard Worker // Note: Invalidation handling must not call back into HostResolverManager as 210*6777b538SAndroid Build Coastguard Worker // the invalidation is expected to be handled atomically with other clearing 211*6777b538SAndroid Build Coastguard Worker // and aborting actions. 212*6777b538SAndroid Build Coastguard Worker void RegisterResolveContext(ResolveContext* context); 213*6777b538SAndroid Build Coastguard Worker void DeregisterResolveContext(const ResolveContext* context); 214*6777b538SAndroid Build Coastguard Worker set_host_resolver_system_params_for_test(const HostResolverSystemTask::Params & host_resolver_system_params)215*6777b538SAndroid Build Coastguard Worker void set_host_resolver_system_params_for_test( 216*6777b538SAndroid Build Coastguard Worker const HostResolverSystemTask::Params& host_resolver_system_params) { 217*6777b538SAndroid Build Coastguard Worker host_resolver_system_params_ = host_resolver_system_params; 218*6777b538SAndroid Build Coastguard Worker } 219*6777b538SAndroid Build Coastguard Worker InvalidateCachesForTesting()220*6777b538SAndroid Build Coastguard Worker void InvalidateCachesForTesting() { InvalidateCaches(); } 221*6777b538SAndroid Build Coastguard Worker 222*6777b538SAndroid Build Coastguard Worker void SetTickClockForTesting(const base::TickClock* tick_clock); 223*6777b538SAndroid Build Coastguard Worker 224*6777b538SAndroid Build Coastguard Worker // Configures maximum number of Jobs in the queue. Exposed for testing. 225*6777b538SAndroid Build Coastguard Worker // Only allowed when the queue is empty. 226*6777b538SAndroid Build Coastguard Worker void SetMaxQueuedJobsForTesting(size_t value); 227*6777b538SAndroid Build Coastguard Worker 228*6777b538SAndroid Build Coastguard Worker void SetMdnsSocketFactoryForTesting( 229*6777b538SAndroid Build Coastguard Worker std::unique_ptr<MDnsSocketFactory> socket_factory); 230*6777b538SAndroid Build Coastguard Worker void SetMdnsClientForTesting(std::unique_ptr<MDnsClient> client); 231*6777b538SAndroid Build Coastguard Worker 232*6777b538SAndroid Build Coastguard Worker // To simulate modifications it would have received if |dns_client| had been 233*6777b538SAndroid Build Coastguard Worker // in place before calling this, DnsConfig will be set with the configuration 234*6777b538SAndroid Build Coastguard Worker // from the previous DnsClient being replaced (including system config if 235*6777b538SAndroid Build Coastguard Worker // |dns_client| does not already contain a system config). This means tests do 236*6777b538SAndroid Build Coastguard Worker // not normally need to worry about ordering between setting a test client and 237*6777b538SAndroid Build Coastguard Worker // setting DnsConfig. 238*6777b538SAndroid Build Coastguard Worker void SetDnsClientForTesting(std::unique_ptr<DnsClient> dns_client); 239*6777b538SAndroid Build Coastguard Worker 240*6777b538SAndroid Build Coastguard Worker // Explicitly disable the system resolver even if tests have set a catch-all 241*6777b538SAndroid Build Coastguard Worker // DNS block. See `ForceSystemResolverDueToTestOverride`. DisableSystemResolverForTesting()242*6777b538SAndroid Build Coastguard Worker void DisableSystemResolverForTesting() { 243*6777b538SAndroid Build Coastguard Worker system_resolver_disabled_for_testing_ = true; 244*6777b538SAndroid Build Coastguard Worker } 245*6777b538SAndroid Build Coastguard Worker 246*6777b538SAndroid Build Coastguard Worker // Sets the last IPv6 probe result for testing. Uses the standard timeout 247*6777b538SAndroid Build Coastguard Worker // duration, so it's up to the test fixture to ensure it doesn't expire by 248*6777b538SAndroid Build Coastguard Worker // mocking time, if expiration would pose a problem. 249*6777b538SAndroid Build Coastguard Worker void SetLastIPv6ProbeResultForTesting(bool last_ipv6_probe_result); 250*6777b538SAndroid Build Coastguard Worker ResetIPv6ProbeTimeForTesting()251*6777b538SAndroid Build Coastguard Worker void ResetIPv6ProbeTimeForTesting() { 252*6777b538SAndroid Build Coastguard Worker last_ipv6_probe_time_ = base::TimeTicks(); 253*6777b538SAndroid Build Coastguard Worker } 254*6777b538SAndroid Build Coastguard Worker 255*6777b538SAndroid Build Coastguard Worker // Allows the tests to catch slots leaking out of the dispatcher. One 256*6777b538SAndroid Build Coastguard Worker // HostResolverManager::Job could occupy multiple PrioritizedDispatcher job 257*6777b538SAndroid Build Coastguard Worker // slots. num_running_dispatcher_jobs_for_tests()258*6777b538SAndroid Build Coastguard Worker size_t num_running_dispatcher_jobs_for_tests() const { 259*6777b538SAndroid Build Coastguard Worker return dispatcher_->num_running_jobs(); 260*6777b538SAndroid Build Coastguard Worker } 261*6777b538SAndroid Build Coastguard Worker num_jobs_for_testing()262*6777b538SAndroid Build Coastguard Worker size_t num_jobs_for_testing() const { return jobs_.size(); } 263*6777b538SAndroid Build Coastguard Worker check_ipv6_on_wifi_for_testing()264*6777b538SAndroid Build Coastguard Worker bool check_ipv6_on_wifi_for_testing() const { return check_ipv6_on_wifi_; } 265*6777b538SAndroid Build Coastguard Worker target_network_for_testing()266*6777b538SAndroid Build Coastguard Worker handles::NetworkHandle target_network_for_testing() const { 267*6777b538SAndroid Build Coastguard Worker return target_network_; 268*6777b538SAndroid Build Coastguard Worker } 269*6777b538SAndroid Build Coastguard Worker https_svcb_options_for_testing()270*6777b538SAndroid Build Coastguard Worker const HostResolver::HttpsSvcbOptions& https_svcb_options_for_testing() const { 271*6777b538SAndroid Build Coastguard Worker return https_svcb_options_; 272*6777b538SAndroid Build Coastguard Worker } 273*6777b538SAndroid Build Coastguard Worker 274*6777b538SAndroid Build Coastguard Worker // Public to be called from std::make_unique. Not to be called directly. 275*6777b538SAndroid Build Coastguard Worker HostResolverManager(base::PassKey<HostResolverManager>, 276*6777b538SAndroid Build Coastguard Worker const HostResolver::ManagerOptions& options, 277*6777b538SAndroid Build Coastguard Worker SystemDnsConfigChangeNotifier* system_dns_config_notifier, 278*6777b538SAndroid Build Coastguard Worker handles::NetworkHandle target_network, 279*6777b538SAndroid Build Coastguard Worker NetLog* net_log); 280*6777b538SAndroid Build Coastguard Worker 281*6777b538SAndroid Build Coastguard Worker protected: 282*6777b538SAndroid Build Coastguard Worker // Callback from HaveOnlyLoopbackAddresses probe. 283*6777b538SAndroid Build Coastguard Worker void SetHaveOnlyLoopbackAddresses(bool result); 284*6777b538SAndroid Build Coastguard Worker 285*6777b538SAndroid Build Coastguard Worker private: 286*6777b538SAndroid Build Coastguard Worker friend class HostResolverManagerTest; 287*6777b538SAndroid Build Coastguard Worker friend class HostResolverManagerDnsTest; 288*6777b538SAndroid Build Coastguard Worker class LoopbackProbeJob; 289*6777b538SAndroid Build Coastguard Worker class ProbeRequestImpl; 290*6777b538SAndroid Build Coastguard Worker using JobMap = std::map<JobKey, std::unique_ptr<Job>>; 291*6777b538SAndroid Build Coastguard Worker 292*6777b538SAndroid Build Coastguard Worker // Task types that a Job might run. 293*6777b538SAndroid Build Coastguard Worker // These values are persisted to logs. Entries should not be renumbered and 294*6777b538SAndroid Build Coastguard Worker // numeric values should never be reused 295*6777b538SAndroid Build Coastguard Worker enum class TaskType { 296*6777b538SAndroid Build Coastguard Worker SYSTEM = 0, 297*6777b538SAndroid Build Coastguard Worker DNS = 1, 298*6777b538SAndroid Build Coastguard Worker SECURE_DNS = 2, 299*6777b538SAndroid Build Coastguard Worker MDNS = 3, 300*6777b538SAndroid Build Coastguard Worker CACHE_LOOKUP = 4, 301*6777b538SAndroid Build Coastguard Worker INSECURE_CACHE_LOOKUP = 5, 302*6777b538SAndroid Build Coastguard Worker SECURE_CACHE_LOOKUP = 6, 303*6777b538SAndroid Build Coastguard Worker CONFIG_PRESET = 7, 304*6777b538SAndroid Build Coastguard Worker NAT64 = 8, 305*6777b538SAndroid Build Coastguard Worker HOSTS = 9, 306*6777b538SAndroid Build Coastguard Worker 307*6777b538SAndroid Build Coastguard Worker kMaxValue = HOSTS, 308*6777b538SAndroid Build Coastguard Worker }; 309*6777b538SAndroid Build Coastguard Worker 310*6777b538SAndroid Build Coastguard Worker // Returns true if the task is local, synchronous, and instantaneous. 311*6777b538SAndroid Build Coastguard Worker static bool IsLocalTask(TaskType task); 312*6777b538SAndroid Build Coastguard Worker 313*6777b538SAndroid Build Coastguard Worker // Initializes a job key and an IP address using manager properties and IPv6 314*6777b538SAndroid Build Coastguard Worker // reachability. These job key and IP address are used to call 315*6777b538SAndroid Build Coastguard Worker // ResolveLocally() and CreateAndStartJob(). 316*6777b538SAndroid Build Coastguard Worker void InitializeJobKeyAndIPAddress( 317*6777b538SAndroid Build Coastguard Worker const NetworkAnonymizationKey& network_anonymization_key, 318*6777b538SAndroid Build Coastguard Worker const ResolveHostParameters& parameters, 319*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& source_net_log, 320*6777b538SAndroid Build Coastguard Worker JobKey& out_job_key, 321*6777b538SAndroid Build Coastguard Worker IPAddress& out_ip_address); 322*6777b538SAndroid Build Coastguard Worker 323*6777b538SAndroid Build Coastguard Worker // Attempts host resolution using fast local sources: IP literal resolution, 324*6777b538SAndroid Build Coastguard Worker // cache lookup, HOSTS lookup (if enabled), and localhost. Returns results 325*6777b538SAndroid Build Coastguard Worker // with error() OK if successful, ERR_NAME_NOT_RESOLVED if input is invalid, 326*6777b538SAndroid Build Coastguard Worker // or ERR_DNS_CACHE_MISS if the host could not be resolved using local 327*6777b538SAndroid Build Coastguard Worker // sources. 328*6777b538SAndroid Build Coastguard Worker // 329*6777b538SAndroid Build Coastguard Worker // On ERR_DNS_CACHE_MISS and OK, |out_tasks| contains the tentative 330*6777b538SAndroid Build Coastguard Worker // sequence of tasks that a future job should run. 331*6777b538SAndroid Build Coastguard Worker // 332*6777b538SAndroid Build Coastguard Worker // If results are returned from the host cache, |out_stale_info| will be 333*6777b538SAndroid Build Coastguard Worker // filled in with information on how stale or fresh the result is. Otherwise, 334*6777b538SAndroid Build Coastguard Worker // |out_stale_info| will be set to |std::nullopt|. 335*6777b538SAndroid Build Coastguard Worker // 336*6777b538SAndroid Build Coastguard Worker // If |cache_usage == ResolveHostParameters::CacheUsage::STALE_ALLOWED|, then 337*6777b538SAndroid Build Coastguard Worker // stale cache entries can be returned. 338*6777b538SAndroid Build Coastguard Worker HostCache::Entry ResolveLocally( 339*6777b538SAndroid Build Coastguard Worker bool only_ipv6_reachable, 340*6777b538SAndroid Build Coastguard Worker const JobKey& job_key, 341*6777b538SAndroid Build Coastguard Worker const IPAddress& ip_address, 342*6777b538SAndroid Build Coastguard Worker ResolveHostParameters::CacheUsage cache_usage, 343*6777b538SAndroid Build Coastguard Worker SecureDnsPolicy secure_dns_policy, 344*6777b538SAndroid Build Coastguard Worker HostResolverSource source, 345*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& source_net_log, 346*6777b538SAndroid Build Coastguard Worker HostCache* cache, 347*6777b538SAndroid Build Coastguard Worker std::deque<TaskType>* out_tasks, 348*6777b538SAndroid Build Coastguard Worker std::optional<HostCache::EntryStaleness>* out_stale_info); 349*6777b538SAndroid Build Coastguard Worker 350*6777b538SAndroid Build Coastguard Worker // Creates and starts a Job to asynchronously attempt to resolve 351*6777b538SAndroid Build Coastguard Worker // |request|. 352*6777b538SAndroid Build Coastguard Worker void CreateAndStartJob(JobKey key, 353*6777b538SAndroid Build Coastguard Worker std::deque<TaskType> tasks, 354*6777b538SAndroid Build Coastguard Worker RequestImpl* request); 355*6777b538SAndroid Build Coastguard Worker 356*6777b538SAndroid Build Coastguard Worker HostResolverManager::Job* AddJobWithoutRequest( 357*6777b538SAndroid Build Coastguard Worker JobKey key, 358*6777b538SAndroid Build Coastguard Worker ResolveHostParameters::CacheUsage cache_usage, 359*6777b538SAndroid Build Coastguard Worker HostCache* host_cache, 360*6777b538SAndroid Build Coastguard Worker std::deque<TaskType> tasks, 361*6777b538SAndroid Build Coastguard Worker RequestPriority priority, 362*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& source_net_log); 363*6777b538SAndroid Build Coastguard Worker 364*6777b538SAndroid Build Coastguard Worker // Similar to CreateAndStartJob(), but for a ServiceEndpointRequest. 365*6777b538SAndroid Build Coastguard Worker void CreateAndStartJobForServiceEndpointRequest( 366*6777b538SAndroid Build Coastguard Worker JobKey key, 367*6777b538SAndroid Build Coastguard Worker std::deque<TaskType> tasks, 368*6777b538SAndroid Build Coastguard Worker ServiceEndpointRequestImpl* request); 369*6777b538SAndroid Build Coastguard Worker 370*6777b538SAndroid Build Coastguard Worker // Resolves the IP literal hostname represented by `ip_address`. 371*6777b538SAndroid Build Coastguard Worker HostCache::Entry ResolveAsIP(DnsQueryTypeSet query_types, 372*6777b538SAndroid Build Coastguard Worker bool resolve_canonname, 373*6777b538SAndroid Build Coastguard Worker const IPAddress& ip_address); 374*6777b538SAndroid Build Coastguard Worker 375*6777b538SAndroid Build Coastguard Worker // Returns the result iff |cache_usage| permits cache lookups and a positive 376*6777b538SAndroid Build Coastguard Worker // match is found for |key| in |cache|. |out_stale_info| must be non-null, and 377*6777b538SAndroid Build Coastguard Worker // will be filled in with details of the entry's staleness if an entry is 378*6777b538SAndroid Build Coastguard Worker // returned, otherwise it will be set to |std::nullopt|. 379*6777b538SAndroid Build Coastguard Worker std::optional<HostCache::Entry> MaybeServeFromCache( 380*6777b538SAndroid Build Coastguard Worker HostCache* cache, 381*6777b538SAndroid Build Coastguard Worker const HostCache::Key& key, 382*6777b538SAndroid Build Coastguard Worker ResolveHostParameters::CacheUsage cache_usage, 383*6777b538SAndroid Build Coastguard Worker bool ignore_secure, 384*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& source_net_log, 385*6777b538SAndroid Build Coastguard Worker std::optional<HostCache::EntryStaleness>* out_stale_info); 386*6777b538SAndroid Build Coastguard Worker 387*6777b538SAndroid Build Coastguard Worker // Returns any preset resolution result from the active DoH configuration that 388*6777b538SAndroid Build Coastguard Worker // matches |key.host|. 389*6777b538SAndroid Build Coastguard Worker std::optional<HostCache::Entry> MaybeReadFromConfig(const JobKey& key); 390*6777b538SAndroid Build Coastguard Worker 391*6777b538SAndroid Build Coastguard Worker // Populates the secure cache with an optimal entry that supersedes the 392*6777b538SAndroid Build Coastguard Worker // bootstrap result. 393*6777b538SAndroid Build Coastguard Worker void StartBootstrapFollowup(JobKey key, 394*6777b538SAndroid Build Coastguard Worker HostCache* host_cache, 395*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& source_net_log); 396*6777b538SAndroid Build Coastguard Worker 397*6777b538SAndroid Build Coastguard Worker // Iff we have a DnsClient with a valid DnsConfig and we're not about to 398*6777b538SAndroid Build Coastguard Worker // attempt a system lookup, then try to resolve the query using the HOSTS 399*6777b538SAndroid Build Coastguard Worker // file. 400*6777b538SAndroid Build Coastguard Worker std::optional<HostCache::Entry> ServeFromHosts( 401*6777b538SAndroid Build Coastguard Worker std::string_view hostname, 402*6777b538SAndroid Build Coastguard Worker DnsQueryTypeSet query_types, 403*6777b538SAndroid Build Coastguard Worker bool default_family_due_to_no_ipv6, 404*6777b538SAndroid Build Coastguard Worker const std::deque<TaskType>& tasks); 405*6777b538SAndroid Build Coastguard Worker 406*6777b538SAndroid Build Coastguard Worker // Iff |key| is for a localhost name (RFC 6761) and address DNS query type, 407*6777b538SAndroid Build Coastguard Worker // returns a results entry with the loopback IP. 408*6777b538SAndroid Build Coastguard Worker std::optional<HostCache::Entry> ServeLocalhost( 409*6777b538SAndroid Build Coastguard Worker std::string_view hostname, 410*6777b538SAndroid Build Coastguard Worker DnsQueryTypeSet query_types, 411*6777b538SAndroid Build Coastguard Worker bool default_family_due_to_no_ipv6); 412*6777b538SAndroid Build Coastguard Worker 413*6777b538SAndroid Build Coastguard Worker // Returns the secure dns mode to use for a job, taking into account the 414*6777b538SAndroid Build Coastguard Worker // global DnsConfig mode and any per-request policy. 415*6777b538SAndroid Build Coastguard Worker SecureDnsMode GetEffectiveSecureDnsMode(SecureDnsPolicy secure_dns_policy); 416*6777b538SAndroid Build Coastguard Worker 417*6777b538SAndroid Build Coastguard Worker // Returns true when a catch-all DNS block has been set for tests, unless 418*6777b538SAndroid Build Coastguard Worker // `SetDisableSystemResolverForTesting` has been called to explicitly disable 419*6777b538SAndroid Build Coastguard Worker // that safety net. DnsTasks should never be issued when this returns true. 420*6777b538SAndroid Build Coastguard Worker bool ShouldForceSystemResolverDueToTestOverride() const; 421*6777b538SAndroid Build Coastguard Worker 422*6777b538SAndroid Build Coastguard Worker // Helper method to add DnsTasks and related tasks based on the SecureDnsMode 423*6777b538SAndroid Build Coastguard Worker // and fallback parameters. If |prioritize_local_lookups| is true, then we 424*6777b538SAndroid Build Coastguard Worker // may push an insecure cache lookup ahead of a secure DnsTask. 425*6777b538SAndroid Build Coastguard Worker void PushDnsTasks(bool system_task_allowed, 426*6777b538SAndroid Build Coastguard Worker SecureDnsMode secure_dns_mode, 427*6777b538SAndroid Build Coastguard Worker bool insecure_tasks_allowed, 428*6777b538SAndroid Build Coastguard Worker bool allow_cache, 429*6777b538SAndroid Build Coastguard Worker bool prioritize_local_lookups, 430*6777b538SAndroid Build Coastguard Worker ResolveContext* resolve_context, 431*6777b538SAndroid Build Coastguard Worker std::deque<TaskType>* out_tasks); 432*6777b538SAndroid Build Coastguard Worker 433*6777b538SAndroid Build Coastguard Worker // Initialized the sequence of tasks to run to resolve a request. The sequence 434*6777b538SAndroid Build Coastguard Worker // may be adjusted later and not all tasks need to be run. 435*6777b538SAndroid Build Coastguard Worker void CreateTaskSequence(const JobKey& job_key, 436*6777b538SAndroid Build Coastguard Worker ResolveHostParameters::CacheUsage cache_usage, 437*6777b538SAndroid Build Coastguard Worker SecureDnsPolicy secure_dns_policy, 438*6777b538SAndroid Build Coastguard Worker std::deque<TaskType>* out_tasks); 439*6777b538SAndroid Build Coastguard Worker 440*6777b538SAndroid Build Coastguard Worker // Schedules probes to check IPv6 support. Returns OK if probe results are 441*6777b538SAndroid Build Coastguard Worker // already cached, and ERR_IO_PENDING when a probe is scheduled to be 442*6777b538SAndroid Build Coastguard Worker // completed asynchronously. When called repeatedly this method returns OK to 443*6777b538SAndroid Build Coastguard Worker // confirm that results have been cached. 444*6777b538SAndroid Build Coastguard Worker int StartIPv6ReachabilityCheck(const NetLogWithSource& net_log, 445*6777b538SAndroid Build Coastguard Worker ClientSocketFactory* client_socket_factory, 446*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback); 447*6777b538SAndroid Build Coastguard Worker 448*6777b538SAndroid Build Coastguard Worker void FinishIPv6ReachabilityCheck(CompletionOnceCallback callback, int rv); 449*6777b538SAndroid Build Coastguard Worker 450*6777b538SAndroid Build Coastguard Worker // Sets |last_ipv6_probe_result_| and updates |last_ipv6_probe_time_|. 451*6777b538SAndroid Build Coastguard Worker void SetLastIPv6ProbeResult(bool last_ipv6_probe_result); 452*6777b538SAndroid Build Coastguard Worker 453*6777b538SAndroid Build Coastguard Worker // Attempts to connect a UDP socket to |dest|:53. Virtual for testing. Returns 454*6777b538SAndroid Build Coastguard Worker // the value of the attempted socket connection and the reachability check. If 455*6777b538SAndroid Build Coastguard Worker // the return value from the connection is not ERR_IO_PENDING, callers must 456*6777b538SAndroid Build Coastguard Worker // handle the results of the reachability check themselves. Otherwise the 457*6777b538SAndroid Build Coastguard Worker // result of the reachability check will be set when `callback` is run. 458*6777b538SAndroid Build Coastguard Worker // Returns OK if the reachability check succeeded, ERR_FAILED if it failed, 459*6777b538SAndroid Build Coastguard Worker // ERR_IO_PENDING if it will be asynchronous. 460*6777b538SAndroid Build Coastguard Worker virtual int StartGloballyReachableCheck( 461*6777b538SAndroid Build Coastguard Worker const IPAddress& dest, 462*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& net_log, 463*6777b538SAndroid Build Coastguard Worker ClientSocketFactory* client_socket_factory, 464*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback); 465*6777b538SAndroid Build Coastguard Worker 466*6777b538SAndroid Build Coastguard Worker bool FinishGloballyReachableCheck(DatagramClientSocket* socket, int rv); 467*6777b538SAndroid Build Coastguard Worker 468*6777b538SAndroid Build Coastguard Worker void RunFinishGloballyReachableCheck( 469*6777b538SAndroid Build Coastguard Worker scoped_refptr<base::RefCountedData<std::unique_ptr<DatagramClientSocket>>> 470*6777b538SAndroid Build Coastguard Worker socket, 471*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback, 472*6777b538SAndroid Build Coastguard Worker int rv); 473*6777b538SAndroid Build Coastguard Worker 474*6777b538SAndroid Build Coastguard Worker // Asynchronously checks if only loopback IPs are available. 475*6777b538SAndroid Build Coastguard Worker virtual void RunLoopbackProbeJob(); 476*6777b538SAndroid Build Coastguard Worker 477*6777b538SAndroid Build Coastguard Worker // Records the result in cache if cache is present. 478*6777b538SAndroid Build Coastguard Worker void CacheResult(HostCache* cache, 479*6777b538SAndroid Build Coastguard Worker const HostCache::Key& key, 480*6777b538SAndroid Build Coastguard Worker const HostCache::Entry& entry, 481*6777b538SAndroid Build Coastguard Worker base::TimeDelta ttl); 482*6777b538SAndroid Build Coastguard Worker 483*6777b538SAndroid Build Coastguard Worker // Removes |job_it| from |jobs_| and return. 484*6777b538SAndroid Build Coastguard Worker std::unique_ptr<Job> RemoveJob(JobMap::iterator job_it); 485*6777b538SAndroid Build Coastguard Worker 486*6777b538SAndroid Build Coastguard Worker // Removes Jobs for this context. 487*6777b538SAndroid Build Coastguard Worker void RemoveAllJobs(const ResolveContext* context); 488*6777b538SAndroid Build Coastguard Worker 489*6777b538SAndroid Build Coastguard Worker // Aborts all jobs (both scheduled and running) which are not targeting a 490*6777b538SAndroid Build Coastguard Worker // specific network with ERR_NETWORK_CHANGED and notifies their requests. 491*6777b538SAndroid Build Coastguard Worker // Aborts only running jobs if `in_progress_only` is true. Might start new 492*6777b538SAndroid Build Coastguard Worker // jobs. 493*6777b538SAndroid Build Coastguard Worker void AbortJobsWithoutTargetNetwork(bool in_progress_only); 494*6777b538SAndroid Build Coastguard Worker 495*6777b538SAndroid Build Coastguard Worker // Aborts all in progress insecure DnsTasks. In-progress jobs will fall back 496*6777b538SAndroid Build Coastguard Worker // to HostResolverSystemTasks if able and otherwise abort with |error|. Might 497*6777b538SAndroid Build Coastguard Worker // start new jobs, if any jobs were taking up two dispatcher slots. 498*6777b538SAndroid Build Coastguard Worker // 499*6777b538SAndroid Build Coastguard Worker // If |fallback_only|, insecure DnsTasks will only abort if they can fallback 500*6777b538SAndroid Build Coastguard Worker // to HostResolverSystemTasks. 501*6777b538SAndroid Build Coastguard Worker void AbortInsecureDnsTasks(int error, bool fallback_only); 502*6777b538SAndroid Build Coastguard Worker 503*6777b538SAndroid Build Coastguard Worker // Attempts to serve each Job in |jobs_| from the HOSTS file if we have 504*6777b538SAndroid Build Coastguard Worker // a DnsClient with a valid DnsConfig. 505*6777b538SAndroid Build Coastguard Worker void TryServingAllJobsFromHosts(); 506*6777b538SAndroid Build Coastguard Worker 507*6777b538SAndroid Build Coastguard Worker // NetworkChangeNotifier::IPAddressObserver: 508*6777b538SAndroid Build Coastguard Worker void OnIPAddressChanged() override; 509*6777b538SAndroid Build Coastguard Worker 510*6777b538SAndroid Build Coastguard Worker // NetworkChangeNotifier::ConnectionTypeObserver: 511*6777b538SAndroid Build Coastguard Worker void OnConnectionTypeChanged( 512*6777b538SAndroid Build Coastguard Worker NetworkChangeNotifier::ConnectionType type) override; 513*6777b538SAndroid Build Coastguard Worker 514*6777b538SAndroid Build Coastguard Worker // SystemDnsConfigChangeNotifier::Observer: 515*6777b538SAndroid Build Coastguard Worker void OnSystemDnsConfigChanged(std::optional<DnsConfig> config) override; 516*6777b538SAndroid Build Coastguard Worker 517*6777b538SAndroid Build Coastguard Worker void UpdateJobsForChangedConfig(); 518*6777b538SAndroid Build Coastguard Worker 519*6777b538SAndroid Build Coastguard Worker // Called on successful resolve after falling back to HostResolverSystemTask 520*6777b538SAndroid Build Coastguard Worker // after a failed DnsTask resolve. 521*6777b538SAndroid Build Coastguard Worker void OnFallbackResolve(int dns_task_error); 522*6777b538SAndroid Build Coastguard Worker 523*6777b538SAndroid Build Coastguard Worker int GetOrCreateMdnsClient(MDnsClient** out_client); 524*6777b538SAndroid Build Coastguard Worker 525*6777b538SAndroid Build Coastguard Worker // |network_change| indicates whether or not the invalidation was triggered 526*6777b538SAndroid Build Coastguard Worker // by a network connection change. 527*6777b538SAndroid Build Coastguard Worker void InvalidateCaches(bool network_change = false); 528*6777b538SAndroid Build Coastguard Worker 529*6777b538SAndroid Build Coastguard Worker void UpdateConnectionType(NetworkChangeNotifier::ConnectionType type); 530*6777b538SAndroid Build Coastguard Worker IsBoundToNetwork()531*6777b538SAndroid Build Coastguard Worker bool IsBoundToNetwork() const { 532*6777b538SAndroid Build Coastguard Worker return target_network_ != handles::kInvalidNetworkHandle; 533*6777b538SAndroid Build Coastguard Worker } 534*6777b538SAndroid Build Coastguard Worker 535*6777b538SAndroid Build Coastguard Worker // Returns |nullptr| if DoH probes are currently not allowed (due to 536*6777b538SAndroid Build Coastguard Worker // configuration or current connection state). 537*6777b538SAndroid Build Coastguard Worker std::unique_ptr<DnsProbeRunner> CreateDohProbeRunner( 538*6777b538SAndroid Build Coastguard Worker ResolveContext* resolve_context); 539*6777b538SAndroid Build Coastguard Worker 540*6777b538SAndroid Build Coastguard Worker // Used for multicast DNS tasks. Created on first use using 541*6777b538SAndroid Build Coastguard Worker // GetOrCreateMndsClient(). 542*6777b538SAndroid Build Coastguard Worker std::unique_ptr<MDnsSocketFactory> mdns_socket_factory_; 543*6777b538SAndroid Build Coastguard Worker std::unique_ptr<MDnsClient> mdns_client_; 544*6777b538SAndroid Build Coastguard Worker 545*6777b538SAndroid Build Coastguard Worker // Map from HostCache::Key to a Job. 546*6777b538SAndroid Build Coastguard Worker JobMap jobs_; 547*6777b538SAndroid Build Coastguard Worker 548*6777b538SAndroid Build Coastguard Worker // Starts Jobs according to their priority and the configured limits. 549*6777b538SAndroid Build Coastguard Worker std::unique_ptr<PrioritizedDispatcher> dispatcher_; 550*6777b538SAndroid Build Coastguard Worker 551*6777b538SAndroid Build Coastguard Worker // Limit on the maximum number of jobs queued in |dispatcher_|. 552*6777b538SAndroid Build Coastguard Worker size_t max_queued_jobs_ = 0; 553*6777b538SAndroid Build Coastguard Worker 554*6777b538SAndroid Build Coastguard Worker // Parameters for HostResolverSystemTask. 555*6777b538SAndroid Build Coastguard Worker HostResolverSystemTask::Params host_resolver_system_params_; 556*6777b538SAndroid Build Coastguard Worker 557*6777b538SAndroid Build Coastguard Worker raw_ptr<NetLog> net_log_; 558*6777b538SAndroid Build Coastguard Worker 559*6777b538SAndroid Build Coastguard Worker // If present, used by DnsTask and ServeFromHosts to resolve requests. 560*6777b538SAndroid Build Coastguard Worker std::unique_ptr<DnsClient> dns_client_; 561*6777b538SAndroid Build Coastguard Worker 562*6777b538SAndroid Build Coastguard Worker raw_ptr<SystemDnsConfigChangeNotifier> system_dns_config_notifier_; 563*6777b538SAndroid Build Coastguard Worker 564*6777b538SAndroid Build Coastguard Worker handles::NetworkHandle target_network_; 565*6777b538SAndroid Build Coastguard Worker 566*6777b538SAndroid Build Coastguard Worker // False if IPv6 should not be attempted and assumed unreachable when on a 567*6777b538SAndroid Build Coastguard Worker // WiFi connection. See https://crbug.com/696569 for further context. 568*6777b538SAndroid Build Coastguard Worker bool check_ipv6_on_wifi_; 569*6777b538SAndroid Build Coastguard Worker 570*6777b538SAndroid Build Coastguard Worker base::TimeTicks last_ipv6_probe_time_; 571*6777b538SAndroid Build Coastguard Worker bool last_ipv6_probe_result_ = true; 572*6777b538SAndroid Build Coastguard Worker bool probing_ipv6_ = false; 573*6777b538SAndroid Build Coastguard Worker 574*6777b538SAndroid Build Coastguard Worker // When true, query AAAA even when the globally reachable check failed. 575*6777b538SAndroid Build Coastguard Worker bool ipv6_reachability_override_ = false; 576*6777b538SAndroid Build Coastguard Worker 577*6777b538SAndroid Build Coastguard Worker // Any resolver flags that should be added to a request by default. 578*6777b538SAndroid Build Coastguard Worker HostResolverFlags additional_resolver_flags_ = 0; 579*6777b538SAndroid Build Coastguard Worker 580*6777b538SAndroid Build Coastguard Worker // Allow fallback to HostResolverSystemTask if DnsTask fails. 581*6777b538SAndroid Build Coastguard Worker bool allow_fallback_to_systemtask_ = true; 582*6777b538SAndroid Build Coastguard Worker 583*6777b538SAndroid Build Coastguard Worker // Shared tick clock, overridden for testing. 584*6777b538SAndroid Build Coastguard Worker raw_ptr<const base::TickClock> tick_clock_; 585*6777b538SAndroid Build Coastguard Worker 586*6777b538SAndroid Build Coastguard Worker // When true, ignore the catch-all DNS block if it exists. 587*6777b538SAndroid Build Coastguard Worker bool system_resolver_disabled_for_testing_ = false; 588*6777b538SAndroid Build Coastguard Worker 589*6777b538SAndroid Build Coastguard Worker // For per-context cache invalidation notifications. 590*6777b538SAndroid Build Coastguard Worker base::ObserverList<ResolveContext, 591*6777b538SAndroid Build Coastguard Worker true /* check_empty */, 592*6777b538SAndroid Build Coastguard Worker false /* allow_reentrancy */> 593*6777b538SAndroid Build Coastguard Worker registered_contexts_; 594*6777b538SAndroid Build Coastguard Worker bool invalidation_in_progress_ = false; 595*6777b538SAndroid Build Coastguard Worker 596*6777b538SAndroid Build Coastguard Worker // An experimental flag for features::kUseDnsHttpsSvcb. 597*6777b538SAndroid Build Coastguard Worker HostResolver::HttpsSvcbOptions https_svcb_options_; 598*6777b538SAndroid Build Coastguard Worker 599*6777b538SAndroid Build Coastguard Worker std::vector<CompletionOnceCallback> ipv6_request_callbacks_; 600*6777b538SAndroid Build Coastguard Worker 601*6777b538SAndroid Build Coastguard Worker THREAD_CHECKER(thread_checker_); 602*6777b538SAndroid Build Coastguard Worker 603*6777b538SAndroid Build Coastguard Worker base::WeakPtrFactory<HostResolverManager> weak_ptr_factory_{this}; 604*6777b538SAndroid Build Coastguard Worker 605*6777b538SAndroid Build Coastguard Worker base::WeakPtrFactory<HostResolverManager> probe_weak_ptr_factory_{this}; 606*6777b538SAndroid Build Coastguard Worker }; 607*6777b538SAndroid Build Coastguard Worker 608*6777b538SAndroid Build Coastguard Worker // Resolves a local hostname (such as "localhost" or "vhost.localhost") into 609*6777b538SAndroid Build Coastguard Worker // IP endpoints (with port 0). Returns true if |host| is a local 610*6777b538SAndroid Build Coastguard Worker // hostname and false otherwise. Names will resolve to both IPv4 and IPv6. 611*6777b538SAndroid Build Coastguard Worker // This function is only exposed so it can be unit-tested. 612*6777b538SAndroid Build Coastguard Worker // TODO(tfarina): It would be better to change the tests so this function 613*6777b538SAndroid Build Coastguard Worker // gets exercised indirectly through HostResolverManager. 614*6777b538SAndroid Build Coastguard Worker NET_EXPORT_PRIVATE bool ResolveLocalHostname( 615*6777b538SAndroid Build Coastguard Worker std::string_view host, 616*6777b538SAndroid Build Coastguard Worker std::vector<IPEndPoint>* address_list); 617*6777b538SAndroid Build Coastguard Worker 618*6777b538SAndroid Build Coastguard Worker } // namespace net 619*6777b538SAndroid Build Coastguard Worker 620*6777b538SAndroid Build Coastguard Worker #endif // NET_DNS_HOST_RESOLVER_MANAGER_H_ 621