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_DNS_TRANSACTION_H_ 6*6777b538SAndroid Build Coastguard Worker #define NET_DNS_DNS_TRANSACTION_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <stdint.h> 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker #include <memory> 11*6777b538SAndroid Build Coastguard Worker #include <optional> 12*6777b538SAndroid Build Coastguard Worker #include <string> 13*6777b538SAndroid Build Coastguard Worker #include <string_view> 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback.h" 16*6777b538SAndroid Build Coastguard Worker #include "base/memory/weak_ptr.h" 17*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h" 18*6777b538SAndroid Build Coastguard Worker #include "net/base/request_priority.h" 19*6777b538SAndroid Build Coastguard Worker #include "net/dns/opt_record_rdata.h" 20*6777b538SAndroid Build Coastguard Worker #include "net/dns/public/secure_dns_mode.h" 21*6777b538SAndroid Build Coastguard Worker #include "net/dns/record_rdata.h" 22*6777b538SAndroid Build Coastguard Worker #include "url/gurl.h" 23*6777b538SAndroid Build Coastguard Worker 24*6777b538SAndroid Build Coastguard Worker namespace net { 25*6777b538SAndroid Build Coastguard Worker 26*6777b538SAndroid Build Coastguard Worker class DnsResponse; 27*6777b538SAndroid Build Coastguard Worker class DnsSession; 28*6777b538SAndroid Build Coastguard Worker class NetLogWithSource; 29*6777b538SAndroid Build Coastguard Worker class ResolveContext; 30*6777b538SAndroid Build Coastguard Worker 31*6777b538SAndroid Build Coastguard Worker // The hostname probed by CreateDohProbeRunner(). 32*6777b538SAndroid Build Coastguard Worker inline constexpr std::string_view kDohProbeHostname = "www.gstatic.com"; 33*6777b538SAndroid Build Coastguard Worker 34*6777b538SAndroid Build Coastguard Worker // DnsTransaction implements a stub DNS resolver as defined in RFC 1034. 35*6777b538SAndroid Build Coastguard Worker // The DnsTransaction takes care of retransmissions, name server fallback (or 36*6777b538SAndroid Build Coastguard Worker // round-robin), suffix search, and simple response validation ("does it match 37*6777b538SAndroid Build Coastguard Worker // the query") to fight poisoning. 38*6777b538SAndroid Build Coastguard Worker // 39*6777b538SAndroid Build Coastguard Worker // Destroying DnsTransaction cancels the underlying network effort. 40*6777b538SAndroid Build Coastguard Worker class NET_EXPORT_PRIVATE DnsTransaction { 41*6777b538SAndroid Build Coastguard Worker public: 42*6777b538SAndroid Build Coastguard Worker // Called with the response or nullptr if no matching response was received. 43*6777b538SAndroid Build Coastguard Worker // Note that the `GetDottedName()` of the response may be different than the 44*6777b538SAndroid Build Coastguard Worker // original `hostname` (passed to `DnsTransactionFactory::CreateTransaction()` 45*6777b538SAndroid Build Coastguard Worker // as a result of suffix search. 46*6777b538SAndroid Build Coastguard Worker using ResponseCallback = 47*6777b538SAndroid Build Coastguard Worker base::OnceCallback<void(int neterror, const DnsResponse* response)>; 48*6777b538SAndroid Build Coastguard Worker 49*6777b538SAndroid Build Coastguard Worker virtual ~DnsTransaction() = default; 50*6777b538SAndroid Build Coastguard Worker 51*6777b538SAndroid Build Coastguard Worker // Returns the original |hostname|. 52*6777b538SAndroid Build Coastguard Worker virtual const std::string& GetHostname() const = 0; 53*6777b538SAndroid Build Coastguard Worker 54*6777b538SAndroid Build Coastguard Worker // Returns the |qtype|. 55*6777b538SAndroid Build Coastguard Worker virtual uint16_t GetType() const = 0; 56*6777b538SAndroid Build Coastguard Worker 57*6777b538SAndroid Build Coastguard Worker // Starts the transaction. Always completes asynchronously. 58*6777b538SAndroid Build Coastguard Worker virtual void Start(ResponseCallback callback) = 0; 59*6777b538SAndroid Build Coastguard Worker 60*6777b538SAndroid Build Coastguard Worker virtual void SetRequestPriority(RequestPriority priority) = 0; 61*6777b538SAndroid Build Coastguard Worker }; 62*6777b538SAndroid Build Coastguard Worker 63*6777b538SAndroid Build Coastguard Worker // Startable/Cancellable object to represent a DNS probe sequence. 64*6777b538SAndroid Build Coastguard Worker class DnsProbeRunner { 65*6777b538SAndroid Build Coastguard Worker public: 66*6777b538SAndroid Build Coastguard Worker // Destruction cancels the probes. 67*6777b538SAndroid Build Coastguard Worker virtual ~DnsProbeRunner() = default; 68*6777b538SAndroid Build Coastguard Worker 69*6777b538SAndroid Build Coastguard Worker // Starts all applicable probes that are not already running. May be called 70*6777b538SAndroid Build Coastguard Worker // multiple times, but should not be called after destruction of the 71*6777b538SAndroid Build Coastguard Worker // DnsTransactionFactory. 72*6777b538SAndroid Build Coastguard Worker // 73*6777b538SAndroid Build Coastguard Worker // Set |network_change| to indicate if this start or restart was triggered by 74*6777b538SAndroid Build Coastguard Worker // a network connection change. Only used for logging and metrics. 75*6777b538SAndroid Build Coastguard Worker virtual void Start(bool network_change) = 0; 76*6777b538SAndroid Build Coastguard Worker 77*6777b538SAndroid Build Coastguard Worker // Gets the delay until the next scheduled probe to the specified DoH server. 78*6777b538SAndroid Build Coastguard Worker // Returns base::TimeDelta() if no probe scheduled. 79*6777b538SAndroid Build Coastguard Worker virtual base::TimeDelta GetDelayUntilNextProbeForTest( 80*6777b538SAndroid Build Coastguard Worker size_t doh_server_index) const = 0; 81*6777b538SAndroid Build Coastguard Worker }; 82*6777b538SAndroid Build Coastguard Worker 83*6777b538SAndroid Build Coastguard Worker // Creates DnsTransaction which performs asynchronous DNS search. 84*6777b538SAndroid Build Coastguard Worker // It does NOT perform caching, aggregation or prioritization of transactions. 85*6777b538SAndroid Build Coastguard Worker // 86*6777b538SAndroid Build Coastguard Worker // Destroying the factory does NOT affect any already created DnsTransactions. 87*6777b538SAndroid Build Coastguard Worker // 88*6777b538SAndroid Build Coastguard Worker // DnsProbeRunners, however, will safely abort themselves on destruction of 89*6777b538SAndroid Build Coastguard Worker // their creating factory, and they should only be started or restarted while 90*6777b538SAndroid Build Coastguard Worker // the factory is still alive. 91*6777b538SAndroid Build Coastguard Worker class NET_EXPORT_PRIVATE DnsTransactionFactory { 92*6777b538SAndroid Build Coastguard Worker public: 93*6777b538SAndroid Build Coastguard Worker DnsTransactionFactory(); 94*6777b538SAndroid Build Coastguard Worker virtual ~DnsTransactionFactory(); 95*6777b538SAndroid Build Coastguard Worker 96*6777b538SAndroid Build Coastguard Worker // Creates DnsTransaction for the given |hostname| and |qtype| (assuming 97*6777b538SAndroid Build Coastguard Worker // QCLASS is IN). |hostname| should be in the dotted form. A dot at the end 98*6777b538SAndroid Build Coastguard Worker // implies the domain name is fully-qualified and will be exempt from suffix 99*6777b538SAndroid Build Coastguard Worker // search. |hostname| should not be an IP literal. 100*6777b538SAndroid Build Coastguard Worker // 101*6777b538SAndroid Build Coastguard Worker // The |net_log| is used as the parent log. 102*6777b538SAndroid Build Coastguard Worker // 103*6777b538SAndroid Build Coastguard Worker // |secure| specifies whether DNS lookups should be performed using DNS-over- 104*6777b538SAndroid Build Coastguard Worker // HTTPS (DoH) or using plaintext DNS. 105*6777b538SAndroid Build Coastguard Worker // 106*6777b538SAndroid Build Coastguard Worker // When |fast_timeout| is true, the transaction will timeout quickly after 107*6777b538SAndroid Build Coastguard Worker // making its DNS attempts, without necessarily waiting long enough to allow 108*6777b538SAndroid Build Coastguard Worker // slower-than-average requests to complete. Intended as an optimization for 109*6777b538SAndroid Build Coastguard Worker // cases where the caller has reasonable fallback options to the transaction 110*6777b538SAndroid Build Coastguard Worker // and it would be beneficial to move on to those options sooner on signals 111*6777b538SAndroid Build Coastguard Worker // that the transaction is potentially slow or problematic. 112*6777b538SAndroid Build Coastguard Worker [[nodiscard]] virtual std::unique_ptr<DnsTransaction> CreateTransaction( 113*6777b538SAndroid Build Coastguard Worker std::string hostname, 114*6777b538SAndroid Build Coastguard Worker uint16_t qtype, 115*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& net_log, 116*6777b538SAndroid Build Coastguard Worker bool secure, 117*6777b538SAndroid Build Coastguard Worker SecureDnsMode secure_dns_mode, 118*6777b538SAndroid Build Coastguard Worker ResolveContext* resolve_context, 119*6777b538SAndroid Build Coastguard Worker bool fast_timeout) = 0; 120*6777b538SAndroid Build Coastguard Worker 121*6777b538SAndroid Build Coastguard Worker // Creates a runner to run the DoH probe sequence for all configured DoH 122*6777b538SAndroid Build Coastguard Worker // resolvers. 123*6777b538SAndroid Build Coastguard Worker [[nodiscard]] virtual std::unique_ptr<DnsProbeRunner> CreateDohProbeRunner( 124*6777b538SAndroid Build Coastguard Worker ResolveContext* resolve_context) = 0; 125*6777b538SAndroid Build Coastguard Worker 126*6777b538SAndroid Build Coastguard Worker // The given EDNS0 option will be included in all DNS queries performed by 127*6777b538SAndroid Build Coastguard Worker // transactions from this factory. 128*6777b538SAndroid Build Coastguard Worker virtual void AddEDNSOption(std::unique_ptr<OptRecordRdata::Opt> opt) = 0; 129*6777b538SAndroid Build Coastguard Worker 130*6777b538SAndroid Build Coastguard Worker // Returns the default SecureDnsMode in the config. 131*6777b538SAndroid Build Coastguard Worker virtual SecureDnsMode GetSecureDnsModeForTest() = 0; 132*6777b538SAndroid Build Coastguard Worker 133*6777b538SAndroid Build Coastguard Worker // Creates a DnsTransactionFactory which creates DnsTransactionImpl using the 134*6777b538SAndroid Build Coastguard Worker // |session|. 135*6777b538SAndroid Build Coastguard Worker [[nodiscard]] static std::unique_ptr<DnsTransactionFactory> CreateFactory( 136*6777b538SAndroid Build Coastguard Worker DnsSession* session); 137*6777b538SAndroid Build Coastguard Worker 138*6777b538SAndroid Build Coastguard Worker base::WeakPtrFactory<DnsTransactionFactory> weak_factory_{this}; 139*6777b538SAndroid Build Coastguard Worker }; 140*6777b538SAndroid Build Coastguard Worker 141*6777b538SAndroid Build Coastguard Worker } // namespace net 142*6777b538SAndroid Build Coastguard Worker 143*6777b538SAndroid Build Coastguard Worker #endif // NET_DNS_DNS_TRANSACTION_H_ 144