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_QUIC_QUIC_SESSION_POOL_H_ 6*6777b538SAndroid Build Coastguard Worker #define NET_QUIC_QUIC_SESSION_POOL_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 <map> 12*6777b538SAndroid Build Coastguard Worker #include <memory> 13*6777b538SAndroid Build Coastguard Worker #include <set> 14*6777b538SAndroid Build Coastguard Worker #include <string> 15*6777b538SAndroid Build Coastguard Worker #include <vector> 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard Worker #include "base/containers/lru_cache.h" 18*6777b538SAndroid Build Coastguard Worker #include "base/gtest_prod_util.h" 19*6777b538SAndroid Build Coastguard Worker #include "base/memory/memory_pressure_monitor.h" 20*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h" 21*6777b538SAndroid Build Coastguard Worker #include "base/memory/scoped_refptr.h" 22*6777b538SAndroid Build Coastguard Worker #include "base/memory/weak_ptr.h" 23*6777b538SAndroid Build Coastguard Worker #include "base/task/sequenced_task_runner.h" 24*6777b538SAndroid Build Coastguard Worker #include "base/time/default_clock.h" 25*6777b538SAndroid Build Coastguard Worker #include "base/time/default_tick_clock.h" 26*6777b538SAndroid Build Coastguard Worker #include "base/time/tick_clock.h" 27*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h" 28*6777b538SAndroid Build Coastguard Worker #include "net/base/address_list.h" 29*6777b538SAndroid Build Coastguard Worker #include "net/base/completion_once_callback.h" 30*6777b538SAndroid Build Coastguard Worker #include "net/base/connection_endpoint_metadata.h" 31*6777b538SAndroid Build Coastguard Worker #include "net/base/host_port_pair.h" 32*6777b538SAndroid Build Coastguard Worker #include "net/base/http_user_agent_settings.h" 33*6777b538SAndroid Build Coastguard Worker #include "net/base/ip_endpoint.h" 34*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h" 35*6777b538SAndroid Build Coastguard Worker #include "net/base/network_change_notifier.h" 36*6777b538SAndroid Build Coastguard Worker #include "net/base/network_handle.h" 37*6777b538SAndroid Build Coastguard Worker #include "net/base/proxy_server.h" 38*6777b538SAndroid Build Coastguard Worker #include "net/base/session_usage.h" 39*6777b538SAndroid Build Coastguard Worker #include "net/cert/cert_database.h" 40*6777b538SAndroid Build Coastguard Worker #include "net/dns/public/secure_dns_policy.h" 41*6777b538SAndroid Build Coastguard Worker #include "net/http/http_server_properties.h" 42*6777b538SAndroid Build Coastguard Worker #include "net/http/http_stream_factory.h" 43*6777b538SAndroid Build Coastguard Worker #include "net/log/net_log_with_source.h" 44*6777b538SAndroid Build Coastguard Worker #include "net/quic/network_connection.h" 45*6777b538SAndroid Build Coastguard Worker #include "net/quic/quic_chromium_client_session.h" 46*6777b538SAndroid Build Coastguard Worker #include "net/quic/quic_clock_skew_detector.h" 47*6777b538SAndroid Build Coastguard Worker #include "net/quic/quic_connectivity_monitor.h" 48*6777b538SAndroid Build Coastguard Worker #include "net/quic/quic_context.h" 49*6777b538SAndroid Build Coastguard Worker #include "net/quic/quic_crypto_client_config_handle.h" 50*6777b538SAndroid Build Coastguard Worker #include "net/quic/quic_proxy_datagram_client_socket.h" 51*6777b538SAndroid Build Coastguard Worker #include "net/quic/quic_session_key.h" 52*6777b538SAndroid Build Coastguard Worker #include "net/socket/client_socket_pool.h" 53*6777b538SAndroid Build Coastguard Worker #include "net/ssl/ssl_config_service.h" 54*6777b538SAndroid Build Coastguard Worker #include "net/third_party/quiche/src/quiche/quic/core/crypto/quic_client_session_cache.h" 55*6777b538SAndroid Build Coastguard Worker #include "net/third_party/quiche/src/quiche/quic/core/deterministic_connection_id_generator.h" 56*6777b538SAndroid Build Coastguard Worker #include "net/third_party/quiche/src/quiche/quic/core/quic_config.h" 57*6777b538SAndroid Build Coastguard Worker #include "net/third_party/quiche/src/quiche/quic/core/quic_connection_id.h" 58*6777b538SAndroid Build Coastguard Worker #include "net/third_party/quiche/src/quiche/quic/core/quic_crypto_stream.h" 59*6777b538SAndroid Build Coastguard Worker #include "net/third_party/quiche/src/quiche/quic/core/quic_packets.h" 60*6777b538SAndroid Build Coastguard Worker #include "net/third_party/quiche/src/quiche/quic/core/quic_server_id.h" 61*6777b538SAndroid Build Coastguard Worker #include "net/third_party/quiche/src/quiche/quic/core/quic_versions.h" 62*6777b538SAndroid Build Coastguard Worker #include "url/scheme_host_port.h" 63*6777b538SAndroid Build Coastguard Worker 64*6777b538SAndroid Build Coastguard Worker namespace base { 65*6777b538SAndroid Build Coastguard Worker class Value; 66*6777b538SAndroid Build Coastguard Worker } // namespace base 67*6777b538SAndroid Build Coastguard Worker 68*6777b538SAndroid Build Coastguard Worker namespace quic { 69*6777b538SAndroid Build Coastguard Worker class QuicAlarmFactory; 70*6777b538SAndroid Build Coastguard Worker class QuicClock; 71*6777b538SAndroid Build Coastguard Worker } // namespace quic 72*6777b538SAndroid Build Coastguard Worker 73*6777b538SAndroid Build Coastguard Worker namespace quiche { 74*6777b538SAndroid Build Coastguard Worker class QuicRandom; 75*6777b538SAndroid Build Coastguard Worker } // namespace quiche 76*6777b538SAndroid Build Coastguard Worker 77*6777b538SAndroid Build Coastguard Worker namespace net { 78*6777b538SAndroid Build Coastguard Worker 79*6777b538SAndroid Build Coastguard Worker class CertVerifier; 80*6777b538SAndroid Build Coastguard Worker class ClientSocketFactory; 81*6777b538SAndroid Build Coastguard Worker class HostResolver; 82*6777b538SAndroid Build Coastguard Worker class HttpServerProperties; 83*6777b538SAndroid Build Coastguard Worker class NetLog; 84*6777b538SAndroid Build Coastguard Worker class NetworkAnonymizationKey; 85*6777b538SAndroid Build Coastguard Worker struct NetworkTrafficAnnotationTag; 86*6777b538SAndroid Build Coastguard Worker class ProxyDelegate; 87*6777b538SAndroid Build Coastguard Worker class QuicChromiumConnectionHelper; 88*6777b538SAndroid Build Coastguard Worker class QuicCryptoClientStreamFactory; 89*6777b538SAndroid Build Coastguard Worker class QuicServerInfo; 90*6777b538SAndroid Build Coastguard Worker class QuicSessionPool; 91*6777b538SAndroid Build Coastguard Worker class QuicContext; 92*6777b538SAndroid Build Coastguard Worker class SCTAuditingDelegate; 93*6777b538SAndroid Build Coastguard Worker class SocketPerformanceWatcherFactory; 94*6777b538SAndroid Build Coastguard Worker class SocketTag; 95*6777b538SAndroid Build Coastguard Worker class TransportSecurityState; 96*6777b538SAndroid Build Coastguard Worker 97*6777b538SAndroid Build Coastguard Worker namespace test { 98*6777b538SAndroid Build Coastguard Worker class QuicSessionPoolPeer; 99*6777b538SAndroid Build Coastguard Worker } // namespace test 100*6777b538SAndroid Build Coastguard Worker 101*6777b538SAndroid Build Coastguard Worker // Maximum number of not currently in use QuicCryptoClientConfig that can be 102*6777b538SAndroid Build Coastguard Worker // stored in |recent_crypto_config_map_|. 103*6777b538SAndroid Build Coastguard Worker // 104*6777b538SAndroid Build Coastguard Worker // TODO(mmenke): Should figure out a reasonable value of this, using field 105*6777b538SAndroid Build Coastguard Worker // trials. The optimal value may increase over time, as QUIC becomes more 106*6777b538SAndroid Build Coastguard Worker // prevalent. Whether or not NetworkAnonymizationKeys end up including subframe 107*6777b538SAndroid Build Coastguard Worker // URLs will also influence the ideal value. 108*6777b538SAndroid Build Coastguard Worker const int kMaxRecentCryptoConfigs = 100; 109*6777b538SAndroid Build Coastguard Worker 110*6777b538SAndroid Build Coastguard Worker enum QuicPlatformNotification { 111*6777b538SAndroid Build Coastguard Worker NETWORK_CONNECTED, 112*6777b538SAndroid Build Coastguard Worker NETWORK_MADE_DEFAULT, 113*6777b538SAndroid Build Coastguard Worker NETWORK_DISCONNECTED, 114*6777b538SAndroid Build Coastguard Worker NETWORK_SOON_TO_DISCONNECT, 115*6777b538SAndroid Build Coastguard Worker NETWORK_IP_ADDRESS_CHANGED, 116*6777b538SAndroid Build Coastguard Worker NETWORK_NOTIFICATION_MAX 117*6777b538SAndroid Build Coastguard Worker }; 118*6777b538SAndroid Build Coastguard Worker 119*6777b538SAndroid Build Coastguard Worker enum AllActiveSessionsGoingAwayReason { 120*6777b538SAndroid Build Coastguard Worker kClockSkewDetected, 121*6777b538SAndroid Build Coastguard Worker kIPAddressChanged, 122*6777b538SAndroid Build Coastguard Worker kCertDBChanged, 123*6777b538SAndroid Build Coastguard Worker kCertVerifierChanged 124*6777b538SAndroid Build Coastguard Worker }; 125*6777b538SAndroid Build Coastguard Worker 126*6777b538SAndroid Build Coastguard Worker enum CreateSessionFailure { 127*6777b538SAndroid Build Coastguard Worker CREATION_ERROR_CONNECTING_SOCKET, 128*6777b538SAndroid Build Coastguard Worker CREATION_ERROR_SETTING_RECEIVE_BUFFER, 129*6777b538SAndroid Build Coastguard Worker CREATION_ERROR_SETTING_SEND_BUFFER, 130*6777b538SAndroid Build Coastguard Worker CREATION_ERROR_SETTING_DO_NOT_FRAGMENT, 131*6777b538SAndroid Build Coastguard Worker CREATION_ERROR_SETTING_RECEIVE_ECN, 132*6777b538SAndroid Build Coastguard Worker CREATION_ERROR_MAX 133*6777b538SAndroid Build Coastguard Worker }; 134*6777b538SAndroid Build Coastguard Worker 135*6777b538SAndroid Build Coastguard Worker // Encapsulates a pending request for a QuicChromiumClientSession. 136*6777b538SAndroid Build Coastguard Worker // If the request is still pending when it is destroyed, it will 137*6777b538SAndroid Build Coastguard Worker // cancel the request with the pool. 138*6777b538SAndroid Build Coastguard Worker class NET_EXPORT_PRIVATE QuicSessionRequest { 139*6777b538SAndroid Build Coastguard Worker public: 140*6777b538SAndroid Build Coastguard Worker explicit QuicSessionRequest(QuicSessionPool* pool); 141*6777b538SAndroid Build Coastguard Worker 142*6777b538SAndroid Build Coastguard Worker QuicSessionRequest(const QuicSessionRequest&) = delete; 143*6777b538SAndroid Build Coastguard Worker QuicSessionRequest& operator=(const QuicSessionRequest&) = delete; 144*6777b538SAndroid Build Coastguard Worker 145*6777b538SAndroid Build Coastguard Worker ~QuicSessionRequest(); 146*6777b538SAndroid Build Coastguard Worker 147*6777b538SAndroid Build Coastguard Worker // `cert_verify_flags` is bitwise OR'd of CertVerifier::VerifyFlags and it is 148*6777b538SAndroid Build Coastguard Worker // passed to CertVerifier::Verify. 149*6777b538SAndroid Build Coastguard Worker // `destination` will be resolved and resulting IPEndPoint used to open a 150*6777b538SAndroid Build Coastguard Worker // quic::QuicConnection. This can be different than 151*6777b538SAndroid Build Coastguard Worker // HostPortPair::FromURL(url). 152*6777b538SAndroid Build Coastguard Worker // When `session_usage` is `kDestination`, any DNS aliases found in host 153*6777b538SAndroid Build Coastguard Worker // resolution are stored in the `dns_aliases_by_session_key_` map. 154*6777b538SAndroid Build Coastguard Worker int Request( 155*6777b538SAndroid Build Coastguard Worker url::SchemeHostPort destination, 156*6777b538SAndroid Build Coastguard Worker quic::ParsedQuicVersion quic_version, 157*6777b538SAndroid Build Coastguard Worker const ProxyChain& proxy_chain, 158*6777b538SAndroid Build Coastguard Worker const std::optional<NetworkTrafficAnnotationTag> proxy_annotation_tag, 159*6777b538SAndroid Build Coastguard Worker const HttpUserAgentSettings* http_user_agent_settings, 160*6777b538SAndroid Build Coastguard Worker SessionUsage session_usage, 161*6777b538SAndroid Build Coastguard Worker PrivacyMode privacy_mode, 162*6777b538SAndroid Build Coastguard Worker RequestPriority priority, 163*6777b538SAndroid Build Coastguard Worker const SocketTag& socket_tag, 164*6777b538SAndroid Build Coastguard Worker const NetworkAnonymizationKey& network_anonymization_key, 165*6777b538SAndroid Build Coastguard Worker SecureDnsPolicy secure_dns_policy, 166*6777b538SAndroid Build Coastguard Worker bool require_dns_https_alpn, 167*6777b538SAndroid Build Coastguard Worker int cert_verify_flags, 168*6777b538SAndroid Build Coastguard Worker const GURL& url, 169*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& net_log, 170*6777b538SAndroid Build Coastguard Worker NetErrorDetails* net_error_details, 171*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback failed_on_default_network_callback, 172*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback); 173*6777b538SAndroid Build Coastguard Worker 174*6777b538SAndroid Build Coastguard Worker // This function must be called after Request() returns ERR_IO_PENDING. 175*6777b538SAndroid Build Coastguard Worker // Returns true if Request() requires host resolution and it hasn't completed 176*6777b538SAndroid Build Coastguard Worker // yet. If true is returned, |callback| will run when host resolution 177*6777b538SAndroid Build Coastguard Worker // completes. It will be called with the result after host resolution during 178*6777b538SAndroid Build Coastguard Worker // the connection process. For example, if host resolution returns OK and then 179*6777b538SAndroid Build Coastguard Worker // crypto handshake returns ERR_IO_PENDING, then |callback| will run with 180*6777b538SAndroid Build Coastguard Worker // ERR_IO_PENDING. 181*6777b538SAndroid Build Coastguard Worker bool WaitForHostResolution(CompletionOnceCallback callback); 182*6777b538SAndroid Build Coastguard Worker 183*6777b538SAndroid Build Coastguard Worker // This function must be called after Request() returns ERR_IO_PENDING. 184*6777b538SAndroid Build Coastguard Worker // Returns true if no QUIC session has been created yet. If true is returned, 185*6777b538SAndroid Build Coastguard Worker // `callback` will be run when the QUIC session has been created and will be 186*6777b538SAndroid Build Coastguard Worker // called with the result of OnCreateSessionComplete. For example, if session 187*6777b538SAndroid Build Coastguard Worker // creation returned OK but CryptoConnect returns ERR_IO_PENDING then 188*6777b538SAndroid Build Coastguard Worker // `callback` will be run with ERR_IO_PENDING. 189*6777b538SAndroid Build Coastguard Worker bool WaitForQuicSessionCreation(CompletionOnceCallback callback); 190*6777b538SAndroid Build Coastguard Worker 191*6777b538SAndroid Build Coastguard Worker // QuicSessionPool::Jobs may notify associated requests at two points in the 192*6777b538SAndroid Build Coastguard Worker // connection process before completion: host resolution and session creation. 193*6777b538SAndroid Build Coastguard Worker // The `Expect` methods below inform the request whether it should expect 194*6777b538SAndroid Build Coastguard Worker // these notifications. 195*6777b538SAndroid Build Coastguard Worker 196*6777b538SAndroid Build Coastguard Worker // Tells QuicSessionRequest that `QuicSessionPool::Job` will call 197*6777b538SAndroid Build Coastguard Worker // `OnHostResolutionComplete()` in the future. Must be called before 198*6777b538SAndroid Build Coastguard Worker // `WaitForHostResolution()` 199*6777b538SAndroid Build Coastguard Worker void ExpectOnHostResolution(); 200*6777b538SAndroid Build Coastguard Worker 201*6777b538SAndroid Build Coastguard Worker // Will be called by the associated `QuicSessionPool::Job` when host 202*6777b538SAndroid Build Coastguard Worker // resolution completes asynchronously after Request(), if 203*6777b538SAndroid Build Coastguard Worker // `ExpectOnHostResolution()` was called. This is called after the Job can 204*6777b538SAndroid Build Coastguard Worker // make no further progress, and includes the result of that progress, perhaps 205*6777b538SAndroid Build Coastguard Worker // `ERR_IO_PENDING`. 206*6777b538SAndroid Build Coastguard Worker void OnHostResolutionComplete(int rv); 207*6777b538SAndroid Build Coastguard Worker 208*6777b538SAndroid Build Coastguard Worker // Tells QuicSessionRequest that `QuicSessionPool::Job` will call 209*6777b538SAndroid Build Coastguard Worker // `OnQuicSessionCreationComplete()` in the future. Must be called before 210*6777b538SAndroid Build Coastguard Worker // `WaitForQuicSessionCreation()`. 211*6777b538SAndroid Build Coastguard Worker void ExpectQuicSessionCreation(); 212*6777b538SAndroid Build Coastguard Worker 213*6777b538SAndroid Build Coastguard Worker // Will be called by the associated `QuicSessionPool::Job` when session 214*6777b538SAndroid Build Coastguard Worker // creation completes asynchronously after Request(), if 215*6777b538SAndroid Build Coastguard Worker // `ExpectQuicSessionCreation` was called. 216*6777b538SAndroid Build Coastguard Worker void OnQuicSessionCreationComplete(int rv); 217*6777b538SAndroid Build Coastguard Worker 218*6777b538SAndroid Build Coastguard Worker void OnRequestComplete(int rv); 219*6777b538SAndroid Build Coastguard Worker 220*6777b538SAndroid Build Coastguard Worker // Called when the original connection created on the default network for 221*6777b538SAndroid Build Coastguard Worker // |this| fails and a new connection has been created on the alternate 222*6777b538SAndroid Build Coastguard Worker // network. 223*6777b538SAndroid Build Coastguard Worker void OnConnectionFailedOnDefaultNetwork(); 224*6777b538SAndroid Build Coastguard Worker 225*6777b538SAndroid Build Coastguard Worker // Helper method that calls |pool_|'s GetTimeDelayForWaitingJob(). It 226*6777b538SAndroid Build Coastguard Worker // returns the amount of time waiting job should be delayed. 227*6777b538SAndroid Build Coastguard Worker base::TimeDelta GetTimeDelayForWaitingJob() const; 228*6777b538SAndroid Build Coastguard Worker 229*6777b538SAndroid Build Coastguard Worker // If host resolution is underway, changes the priority of the host resolver 230*6777b538SAndroid Build Coastguard Worker // request. 231*6777b538SAndroid Build Coastguard Worker void SetPriority(RequestPriority priority); 232*6777b538SAndroid Build Coastguard Worker 233*6777b538SAndroid Build Coastguard Worker // Releases the handle to the QUIC session retrieved as a result of Request(). 234*6777b538SAndroid Build Coastguard Worker std::unique_ptr<QuicChromiumClientSession::Handle> ReleaseSessionHandle(); 235*6777b538SAndroid Build Coastguard Worker 236*6777b538SAndroid Build Coastguard Worker // Sets |session_|. 237*6777b538SAndroid Build Coastguard Worker void SetSession(std::unique_ptr<QuicChromiumClientSession::Handle> session); 238*6777b538SAndroid Build Coastguard Worker net_error_details()239*6777b538SAndroid Build Coastguard Worker NetErrorDetails* net_error_details() { return net_error_details_; } 240*6777b538SAndroid Build Coastguard Worker session_key()241*6777b538SAndroid Build Coastguard Worker const QuicSessionKey& session_key() const { return session_key_; } 242*6777b538SAndroid Build Coastguard Worker net_log()243*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& net_log() const { return net_log_; } 244*6777b538SAndroid Build Coastguard Worker 245*6777b538SAndroid Build Coastguard Worker bool CanUseExistingSession( 246*6777b538SAndroid Build Coastguard Worker const GURL& url, 247*6777b538SAndroid Build Coastguard Worker const ProxyChain& proxy_chain, 248*6777b538SAndroid Build Coastguard Worker PrivacyMode privacy_mode, 249*6777b538SAndroid Build Coastguard Worker SessionUsage session_usage, 250*6777b538SAndroid Build Coastguard Worker const SocketTag& socket_tag, 251*6777b538SAndroid Build Coastguard Worker const NetworkAnonymizationKey& network_anonymization_key, 252*6777b538SAndroid Build Coastguard Worker SecureDnsPolicy secure_dns_policy, 253*6777b538SAndroid Build Coastguard Worker bool require_dns_https_alpn, 254*6777b538SAndroid Build Coastguard Worker const url::SchemeHostPort& destination) const; 255*6777b538SAndroid Build Coastguard Worker 256*6777b538SAndroid Build Coastguard Worker private: 257*6777b538SAndroid Build Coastguard Worker raw_ptr<QuicSessionPool> pool_; 258*6777b538SAndroid Build Coastguard Worker QuicSessionKey session_key_; 259*6777b538SAndroid Build Coastguard Worker NetLogWithSource net_log_; 260*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback_; 261*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback failed_on_default_network_callback_; 262*6777b538SAndroid Build Coastguard Worker raw_ptr<NetErrorDetails> net_error_details_; // Unowned. 263*6777b538SAndroid Build Coastguard Worker std::unique_ptr<QuicChromiumClientSession::Handle> session_; 264*6777b538SAndroid Build Coastguard Worker 265*6777b538SAndroid Build Coastguard Worker // Set in Request(). If true, then OnHostResolutionComplete() is expected to 266*6777b538SAndroid Build Coastguard Worker // be called in the future. 267*6777b538SAndroid Build Coastguard Worker bool expect_on_host_resolution_ = false; 268*6777b538SAndroid Build Coastguard Worker 269*6777b538SAndroid Build Coastguard Worker bool expect_on_quic_session_creation_ = false; 270*6777b538SAndroid Build Coastguard Worker // Callback passed to WaitForHostResolution(). 271*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback host_resolution_callback_; 272*6777b538SAndroid Build Coastguard Worker 273*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback create_session_callback_; 274*6777b538SAndroid Build Coastguard Worker }; 275*6777b538SAndroid Build Coastguard Worker 276*6777b538SAndroid Build Coastguard Worker // Manages a pool of QuicChromiumClientSessions. 277*6777b538SAndroid Build Coastguard Worker class NET_EXPORT_PRIVATE QuicSessionPool 278*6777b538SAndroid Build Coastguard Worker : public NetworkChangeNotifier::IPAddressObserver, 279*6777b538SAndroid Build Coastguard Worker public NetworkChangeNotifier::NetworkObserver, 280*6777b538SAndroid Build Coastguard Worker public CertDatabase::Observer, 281*6777b538SAndroid Build Coastguard Worker public CertVerifier::Observer { 282*6777b538SAndroid Build Coastguard Worker public: 283*6777b538SAndroid Build Coastguard Worker // This class encompasses |destination| and |server_id|. 284*6777b538SAndroid Build Coastguard Worker // |destination| is a HostPortPair which is resolved 285*6777b538SAndroid Build Coastguard Worker // and a quic::QuicConnection is made to the resulting IP address. 286*6777b538SAndroid Build Coastguard Worker // |server_id| identifies the origin of the request, 287*6777b538SAndroid Build Coastguard Worker // the crypto handshake advertises |server_id.host()| to the server, 288*6777b538SAndroid Build Coastguard Worker // and the certificate is also matched against |server_id.host()|. 289*6777b538SAndroid Build Coastguard Worker class NET_EXPORT_PRIVATE QuicSessionAliasKey { 290*6777b538SAndroid Build Coastguard Worker public: 291*6777b538SAndroid Build Coastguard Worker QuicSessionAliasKey() = default; 292*6777b538SAndroid Build Coastguard Worker QuicSessionAliasKey(url::SchemeHostPort destination, 293*6777b538SAndroid Build Coastguard Worker QuicSessionKey session_key); 294*6777b538SAndroid Build Coastguard Worker ~QuicSessionAliasKey() = default; 295*6777b538SAndroid Build Coastguard Worker 296*6777b538SAndroid Build Coastguard Worker // Needed to be an element of std::set. 297*6777b538SAndroid Build Coastguard Worker bool operator<(const QuicSessionAliasKey& other) const; 298*6777b538SAndroid Build Coastguard Worker bool operator==(const QuicSessionAliasKey& other) const; 299*6777b538SAndroid Build Coastguard Worker destination()300*6777b538SAndroid Build Coastguard Worker const url::SchemeHostPort& destination() const { return destination_; } server_id()301*6777b538SAndroid Build Coastguard Worker const quic::QuicServerId& server_id() const { 302*6777b538SAndroid Build Coastguard Worker return session_key_.server_id(); 303*6777b538SAndroid Build Coastguard Worker } session_key()304*6777b538SAndroid Build Coastguard Worker const QuicSessionKey& session_key() const { return session_key_; } 305*6777b538SAndroid Build Coastguard Worker 306*6777b538SAndroid Build Coastguard Worker private: 307*6777b538SAndroid Build Coastguard Worker url::SchemeHostPort destination_; 308*6777b538SAndroid Build Coastguard Worker QuicSessionKey session_key_; 309*6777b538SAndroid Build Coastguard Worker }; 310*6777b538SAndroid Build Coastguard Worker 311*6777b538SAndroid Build Coastguard Worker QuicSessionPool( 312*6777b538SAndroid Build Coastguard Worker NetLog* net_log, 313*6777b538SAndroid Build Coastguard Worker HostResolver* host_resolver, 314*6777b538SAndroid Build Coastguard Worker SSLConfigService* ssl_config_service, 315*6777b538SAndroid Build Coastguard Worker ClientSocketFactory* client_socket_factory, 316*6777b538SAndroid Build Coastguard Worker HttpServerProperties* http_server_properties, 317*6777b538SAndroid Build Coastguard Worker CertVerifier* cert_verifier, 318*6777b538SAndroid Build Coastguard Worker TransportSecurityState* transport_security_state, 319*6777b538SAndroid Build Coastguard Worker ProxyDelegate* proxy_delegate, 320*6777b538SAndroid Build Coastguard Worker SCTAuditingDelegate* sct_auditing_delegate, 321*6777b538SAndroid Build Coastguard Worker SocketPerformanceWatcherFactory* socket_performance_watcher_factory, 322*6777b538SAndroid Build Coastguard Worker QuicCryptoClientStreamFactory* quic_crypto_client_stream_factory, 323*6777b538SAndroid Build Coastguard Worker QuicContext* context); 324*6777b538SAndroid Build Coastguard Worker 325*6777b538SAndroid Build Coastguard Worker QuicSessionPool(const QuicSessionPool&) = delete; 326*6777b538SAndroid Build Coastguard Worker QuicSessionPool& operator=(const QuicSessionPool&) = delete; 327*6777b538SAndroid Build Coastguard Worker 328*6777b538SAndroid Build Coastguard Worker ~QuicSessionPool() override; 329*6777b538SAndroid Build Coastguard Worker 330*6777b538SAndroid Build Coastguard Worker // Returns true if there is an existing session for |session_key| or if the 331*6777b538SAndroid Build Coastguard Worker // request can be pooled to an existing session to the IP address of 332*6777b538SAndroid Build Coastguard Worker // |destination|. 333*6777b538SAndroid Build Coastguard Worker bool CanUseExistingSession(const QuicSessionKey& session_key, 334*6777b538SAndroid Build Coastguard Worker const url::SchemeHostPort& destination) const; 335*6777b538SAndroid Build Coastguard Worker 336*6777b538SAndroid Build Coastguard Worker // Requests a QuicChromiumClientSession to |host_port_pair|, a handle for 337*6777b538SAndroid Build Coastguard Worker // which will be owned by |request|. 338*6777b538SAndroid Build Coastguard Worker // If a matching session already exists, this method will return OK. If no 339*6777b538SAndroid Build Coastguard Worker // matching session exists, this will return ERR_IO_PENDING and will invoke 340*6777b538SAndroid Build Coastguard Worker // OnRequestComplete asynchronously. 341*6777b538SAndroid Build Coastguard Worker // When |use_dns_aliases| is true, any DNS aliases found in host resolution 342*6777b538SAndroid Build Coastguard Worker // are stored in the |dns_aliases_by_session_key_| map. |use_dns_aliases| 343*6777b538SAndroid Build Coastguard Worker // should be false in the case of a proxy. 344*6777b538SAndroid Build Coastguard Worker // When the `proxy_chain` in the session key is not direct, 345*6777b538SAndroid Build Coastguard Worker // `proxy_annotation_tag` must be set. 346*6777b538SAndroid Build Coastguard Worker // This method is virtual to facilitate mocking for tests. 347*6777b538SAndroid Build Coastguard Worker virtual int RequestSession( 348*6777b538SAndroid Build Coastguard Worker const QuicSessionKey& session_key, 349*6777b538SAndroid Build Coastguard Worker url::SchemeHostPort destination, 350*6777b538SAndroid Build Coastguard Worker quic::ParsedQuicVersion quic_version, 351*6777b538SAndroid Build Coastguard Worker const std::optional<NetworkTrafficAnnotationTag> proxy_annotation_tag, 352*6777b538SAndroid Build Coastguard Worker const HttpUserAgentSettings* http_user_agent_settings, 353*6777b538SAndroid Build Coastguard Worker RequestPriority priority, 354*6777b538SAndroid Build Coastguard Worker bool use_dns_aliases, 355*6777b538SAndroid Build Coastguard Worker int cert_verify_flags, 356*6777b538SAndroid Build Coastguard Worker const GURL& url, 357*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& net_log, 358*6777b538SAndroid Build Coastguard Worker QuicSessionRequest* request); 359*6777b538SAndroid Build Coastguard Worker 360*6777b538SAndroid Build Coastguard Worker // Called by a session when it is going away and no more streams should be 361*6777b538SAndroid Build Coastguard Worker // created on it. 362*6777b538SAndroid Build Coastguard Worker void OnSessionGoingAway(QuicChromiumClientSession* session); 363*6777b538SAndroid Build Coastguard Worker 364*6777b538SAndroid Build Coastguard Worker // Called by a session after it shuts down. 365*6777b538SAndroid Build Coastguard Worker void OnSessionClosed(QuicChromiumClientSession* session); 366*6777b538SAndroid Build Coastguard Worker 367*6777b538SAndroid Build Coastguard Worker // Called by a session when it blackholes after the handshake is confirmed. 368*6777b538SAndroid Build Coastguard Worker void OnBlackholeAfterHandshakeConfirmed(QuicChromiumClientSession* session); 369*6777b538SAndroid Build Coastguard Worker 370*6777b538SAndroid Build Coastguard Worker // Cancels a pending request. 371*6777b538SAndroid Build Coastguard Worker // This method is virtual to facilitate mocking for tests. 372*6777b538SAndroid Build Coastguard Worker virtual void CancelRequest(QuicSessionRequest* request); 373*6777b538SAndroid Build Coastguard Worker 374*6777b538SAndroid Build Coastguard Worker // Sets priority of a request. 375*6777b538SAndroid Build Coastguard Worker void SetRequestPriority(QuicSessionRequest* request, 376*6777b538SAndroid Build Coastguard Worker RequestPriority priority); 377*6777b538SAndroid Build Coastguard Worker 378*6777b538SAndroid Build Coastguard Worker // Closes all current sessions with specified network, QUIC error codes. 379*6777b538SAndroid Build Coastguard Worker // It sends connection close packet when closing connections. 380*6777b538SAndroid Build Coastguard Worker void CloseAllSessions(int error, quic::QuicErrorCode quic_error); 381*6777b538SAndroid Build Coastguard Worker 382*6777b538SAndroid Build Coastguard Worker base::Value QuicSessionPoolInfoToValue() const; 383*6777b538SAndroid Build Coastguard Worker 384*6777b538SAndroid Build Coastguard Worker // Delete cached state objects in |crypto_config_|. If |origin_filter| is not 385*6777b538SAndroid Build Coastguard Worker // null, only objects on matching origins will be deleted. 386*6777b538SAndroid Build Coastguard Worker void ClearCachedStatesInCryptoConfig( 387*6777b538SAndroid Build Coastguard Worker const base::RepeatingCallback<bool(const GURL&)>& origin_filter); 388*6777b538SAndroid Build Coastguard Worker 389*6777b538SAndroid Build Coastguard Worker // Helper method that connects a DatagramClientSocket. Socket is 390*6777b538SAndroid Build Coastguard Worker // bound to the default network if the |network| param is 391*6777b538SAndroid Build Coastguard Worker // handles::kInvalidNetworkHandle. This method calls 392*6777b538SAndroid Build Coastguard Worker // DatagramClientSocket::ConnectAsync and completes asynchronously. Returns 393*6777b538SAndroid Build Coastguard Worker // ERR_IO_PENDING. 394*6777b538SAndroid Build Coastguard Worker int ConnectAndConfigureSocket(CompletionOnceCallback callback, 395*6777b538SAndroid Build Coastguard Worker DatagramClientSocket* socket, 396*6777b538SAndroid Build Coastguard Worker IPEndPoint addr, 397*6777b538SAndroid Build Coastguard Worker handles::NetworkHandle network, 398*6777b538SAndroid Build Coastguard Worker const SocketTag& socket_tag); 399*6777b538SAndroid Build Coastguard Worker 400*6777b538SAndroid Build Coastguard Worker // Helper method that configures a DatagramClientSocket once 401*6777b538SAndroid Build Coastguard Worker // DatagramClientSocket::ConnectAsync completes. Posts a task to run 402*6777b538SAndroid Build Coastguard Worker // `callback` with a net_error code. 403*6777b538SAndroid Build Coastguard Worker // This method is virtual to facilitate mocking for tests. 404*6777b538SAndroid Build Coastguard Worker virtual void FinishConnectAndConfigureSocket(CompletionOnceCallback callback, 405*6777b538SAndroid Build Coastguard Worker DatagramClientSocket* socket, 406*6777b538SAndroid Build Coastguard Worker const SocketTag& socket_tag, 407*6777b538SAndroid Build Coastguard Worker int rv); 408*6777b538SAndroid Build Coastguard Worker 409*6777b538SAndroid Build Coastguard Worker void OnFinishConnectAndConfigureSocketError(CompletionOnceCallback callback, 410*6777b538SAndroid Build Coastguard Worker enum CreateSessionFailure error, 411*6777b538SAndroid Build Coastguard Worker int rv); 412*6777b538SAndroid Build Coastguard Worker 413*6777b538SAndroid Build Coastguard Worker void DoCallback(CompletionOnceCallback callback, int rv); 414*6777b538SAndroid Build Coastguard Worker 415*6777b538SAndroid Build Coastguard Worker // Helper method that configures a DatagramClientSocket. Socket is 416*6777b538SAndroid Build Coastguard Worker // bound to the default network if the |network| param is 417*6777b538SAndroid Build Coastguard Worker // handles::kInvalidNetworkHandle. This method calls 418*6777b538SAndroid Build Coastguard Worker // DatagramClientSocket::Connect and completes synchronously. Returns 419*6777b538SAndroid Build Coastguard Worker // net_error code. 420*6777b538SAndroid Build Coastguard Worker // TODO(liza): Remove this once QuicSessionPool::Job calls 421*6777b538SAndroid Build Coastguard Worker // ConnectAndConfigureSocket. 422*6777b538SAndroid Build Coastguard Worker int ConfigureSocket(DatagramClientSocket* socket, 423*6777b538SAndroid Build Coastguard Worker IPEndPoint addr, 424*6777b538SAndroid Build Coastguard Worker handles::NetworkHandle network, 425*6777b538SAndroid Build Coastguard Worker const SocketTag& socket_tag); 426*6777b538SAndroid Build Coastguard Worker 427*6777b538SAndroid Build Coastguard Worker // Finds an alternative to |old_network| from the platform's list of connected 428*6777b538SAndroid Build Coastguard Worker // networks. Returns handles::kInvalidNetworkHandle if no 429*6777b538SAndroid Build Coastguard Worker // alternative is found. 430*6777b538SAndroid Build Coastguard Worker handles::NetworkHandle FindAlternateNetwork( 431*6777b538SAndroid Build Coastguard Worker handles::NetworkHandle old_network); 432*6777b538SAndroid Build Coastguard Worker 433*6777b538SAndroid Build Coastguard Worker // Creates a datagram socket. |source| is the NetLogSource for the entity 434*6777b538SAndroid Build Coastguard Worker // trying to create the socket, if it has one. 435*6777b538SAndroid Build Coastguard Worker std::unique_ptr<DatagramClientSocket> CreateSocket( 436*6777b538SAndroid Build Coastguard Worker NetLog* net_log, 437*6777b538SAndroid Build Coastguard Worker const NetLogSource& source); 438*6777b538SAndroid Build Coastguard Worker 439*6777b538SAndroid Build Coastguard Worker // NetworkChangeNotifier::IPAddressObserver methods: 440*6777b538SAndroid Build Coastguard Worker 441*6777b538SAndroid Build Coastguard Worker // Until the servers support roaming, close all connections when the local 442*6777b538SAndroid Build Coastguard Worker // IP address changes. 443*6777b538SAndroid Build Coastguard Worker void OnIPAddressChanged() override; 444*6777b538SAndroid Build Coastguard Worker 445*6777b538SAndroid Build Coastguard Worker // NetworkChangeNotifier::NetworkObserver methods: 446*6777b538SAndroid Build Coastguard Worker void OnNetworkConnected(handles::NetworkHandle network) override; 447*6777b538SAndroid Build Coastguard Worker void OnNetworkDisconnected(handles::NetworkHandle network) override; 448*6777b538SAndroid Build Coastguard Worker void OnNetworkSoonToDisconnect(handles::NetworkHandle network) override; 449*6777b538SAndroid Build Coastguard Worker void OnNetworkMadeDefault(handles::NetworkHandle network) override; 450*6777b538SAndroid Build Coastguard Worker 451*6777b538SAndroid Build Coastguard Worker // CertDatabase::Observer methods: 452*6777b538SAndroid Build Coastguard Worker 453*6777b538SAndroid Build Coastguard Worker // We close all sessions when certificate database is changed. 454*6777b538SAndroid Build Coastguard Worker void OnTrustStoreChanged() override; 455*6777b538SAndroid Build Coastguard Worker 456*6777b538SAndroid Build Coastguard Worker // CertVerifier::Observer: 457*6777b538SAndroid Build Coastguard Worker // We close all sessions when certificate verifier settings have changed. 458*6777b538SAndroid Build Coastguard Worker void OnCertVerifierChanged() override; 459*6777b538SAndroid Build Coastguard Worker is_quic_known_to_work_on_current_network()460*6777b538SAndroid Build Coastguard Worker bool is_quic_known_to_work_on_current_network() const { 461*6777b538SAndroid Build Coastguard Worker return is_quic_known_to_work_on_current_network_; 462*6777b538SAndroid Build Coastguard Worker } 463*6777b538SAndroid Build Coastguard Worker allow_server_migration()464*6777b538SAndroid Build Coastguard Worker bool allow_server_migration() const { return params_.allow_server_migration; } 465*6777b538SAndroid Build Coastguard Worker 466*6777b538SAndroid Build Coastguard Worker // Returns true is gQUIC 0-RTT is disabled from quic_context. gquic_zero_rtt_disabled()467*6777b538SAndroid Build Coastguard Worker bool gquic_zero_rtt_disabled() const { 468*6777b538SAndroid Build Coastguard Worker return params_.disable_gquic_zero_rtt; 469*6777b538SAndroid Build Coastguard Worker } 470*6777b538SAndroid Build Coastguard Worker 471*6777b538SAndroid Build Coastguard Worker void set_is_quic_known_to_work_on_current_network( 472*6777b538SAndroid Build Coastguard Worker bool is_quic_known_to_work_on_current_network); 473*6777b538SAndroid Build Coastguard Worker 474*6777b538SAndroid Build Coastguard Worker // It returns the amount of time waiting job should be delayed. 475*6777b538SAndroid Build Coastguard Worker base::TimeDelta GetTimeDelayForWaitingJob(const QuicSessionKey& session_key); 476*6777b538SAndroid Build Coastguard Worker helper()477*6777b538SAndroid Build Coastguard Worker QuicChromiumConnectionHelper* helper() { return helper_.get(); } 478*6777b538SAndroid Build Coastguard Worker alarm_factory()479*6777b538SAndroid Build Coastguard Worker quic::QuicAlarmFactory* alarm_factory() { return alarm_factory_.get(); } 480*6777b538SAndroid Build Coastguard Worker default_network()481*6777b538SAndroid Build Coastguard Worker handles::NetworkHandle default_network() const { return default_network_; } 482*6777b538SAndroid Build Coastguard Worker 483*6777b538SAndroid Build Coastguard Worker // Returns the stored DNS aliases for the session key. 484*6777b538SAndroid Build Coastguard Worker const std::set<std::string>& GetDnsAliasesForSessionKey( 485*6777b538SAndroid Build Coastguard Worker const QuicSessionKey& key) const; 486*6777b538SAndroid Build Coastguard Worker 487*6777b538SAndroid Build Coastguard Worker // Returns the QUIC version that would be used with an endpoint associated 488*6777b538SAndroid Build Coastguard Worker // with `metadata`, or `quic::ParsedQuicVersion::Unsupported()` if the 489*6777b538SAndroid Build Coastguard Worker // endpoint cannot be used with QUIC. 490*6777b538SAndroid Build Coastguard Worker quic::ParsedQuicVersion SelectQuicVersion( 491*6777b538SAndroid Build Coastguard Worker const quic::ParsedQuicVersion& known_quic_version, 492*6777b538SAndroid Build Coastguard Worker const ConnectionEndpointMetadata& metadata, 493*6777b538SAndroid Build Coastguard Worker bool svcb_optional) const; 494*6777b538SAndroid Build Coastguard Worker 495*6777b538SAndroid Build Coastguard Worker private: 496*6777b538SAndroid Build Coastguard Worker class Job; 497*6777b538SAndroid Build Coastguard Worker class DirectJob; 498*6777b538SAndroid Build Coastguard Worker class ProxyJob; 499*6777b538SAndroid Build Coastguard Worker class QuicCryptoClientConfigOwner; 500*6777b538SAndroid Build Coastguard Worker class CryptoClientConfigHandle; 501*6777b538SAndroid Build Coastguard Worker class SessionAttempt; 502*6777b538SAndroid Build Coastguard Worker friend class MockQuicSessionPool; 503*6777b538SAndroid Build Coastguard Worker friend class test::QuicSessionPoolPeer; 504*6777b538SAndroid Build Coastguard Worker 505*6777b538SAndroid Build Coastguard Worker using SessionMap = std::map<QuicSessionKey, QuicChromiumClientSession*>; 506*6777b538SAndroid Build Coastguard Worker using SessionIdMap = 507*6777b538SAndroid Build Coastguard Worker std::map<QuicChromiumClientSession*, QuicSessionAliasKey>; 508*6777b538SAndroid Build Coastguard Worker using AliasSet = std::set<QuicSessionAliasKey>; 509*6777b538SAndroid Build Coastguard Worker using SessionAliasMap = std::map<QuicChromiumClientSession*, AliasSet>; 510*6777b538SAndroid Build Coastguard Worker using SessionSet = 511*6777b538SAndroid Build Coastguard Worker std::set<raw_ptr<QuicChromiumClientSession, SetExperimental>>; 512*6777b538SAndroid Build Coastguard Worker using IPAliasMap = std::map<IPEndPoint, SessionSet>; 513*6777b538SAndroid Build Coastguard Worker using SessionPeerIPMap = std::map<QuicChromiumClientSession*, IPEndPoint>; 514*6777b538SAndroid Build Coastguard Worker using JobMap = std::map<QuicSessionKey, std::unique_ptr<Job>>; 515*6777b538SAndroid Build Coastguard Worker using DnsAliasesBySessionKeyMap = 516*6777b538SAndroid Build Coastguard Worker std::map<QuicSessionKey, std::set<std::string>>; 517*6777b538SAndroid Build Coastguard Worker using QuicCryptoClientConfigMap = 518*6777b538SAndroid Build Coastguard Worker std::map<NetworkAnonymizationKey, 519*6777b538SAndroid Build Coastguard Worker std::unique_ptr<QuicCryptoClientConfigOwner>>; 520*6777b538SAndroid Build Coastguard Worker 521*6777b538SAndroid Build Coastguard Worker // Records whether an active session already exists for a given IP address 522*6777b538SAndroid Build Coastguard Worker // during connection. 523*6777b538SAndroid Build Coastguard Worker static void LogConnectionIpPooling(bool pooled); 524*6777b538SAndroid Build Coastguard Worker 525*6777b538SAndroid Build Coastguard Worker bool HasMatchingIpSession(const QuicSessionAliasKey& key, 526*6777b538SAndroid Build Coastguard Worker const std::vector<IPEndPoint>& ip_endpoints, 527*6777b538SAndroid Build Coastguard Worker const std::set<std::string>& aliases, 528*6777b538SAndroid Build Coastguard Worker bool use_dns_aliases); 529*6777b538SAndroid Build Coastguard Worker void OnJobComplete(Job* job, int rv); 530*6777b538SAndroid Build Coastguard Worker bool HasActiveSession(const QuicSessionKey& session_key) const; 531*6777b538SAndroid Build Coastguard Worker bool HasActiveJob(const QuicSessionKey& session_key) const; 532*6777b538SAndroid Build Coastguard Worker int CreateSessionSync(const QuicSessionAliasKey& key, 533*6777b538SAndroid Build Coastguard Worker quic::ParsedQuicVersion quic_version, 534*6777b538SAndroid Build Coastguard Worker int cert_verify_flags, 535*6777b538SAndroid Build Coastguard Worker bool require_confirmation, 536*6777b538SAndroid Build Coastguard Worker IPEndPoint peer_address, 537*6777b538SAndroid Build Coastguard Worker ConnectionEndpointMetadata metadata, 538*6777b538SAndroid Build Coastguard Worker base::TimeTicks dns_resolution_start_time, 539*6777b538SAndroid Build Coastguard Worker base::TimeTicks dns_resolution_end_time, 540*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& net_log, 541*6777b538SAndroid Build Coastguard Worker raw_ptr<QuicChromiumClientSession>* session, 542*6777b538SAndroid Build Coastguard Worker handles::NetworkHandle* network); 543*6777b538SAndroid Build Coastguard Worker int CreateSessionAsync(CompletionOnceCallback callback, 544*6777b538SAndroid Build Coastguard Worker const QuicSessionAliasKey& key, 545*6777b538SAndroid Build Coastguard Worker quic::ParsedQuicVersion quic_version, 546*6777b538SAndroid Build Coastguard Worker int cert_verify_flags, 547*6777b538SAndroid Build Coastguard Worker bool require_confirmation, 548*6777b538SAndroid Build Coastguard Worker IPEndPoint peer_address, 549*6777b538SAndroid Build Coastguard Worker ConnectionEndpointMetadata metadata, 550*6777b538SAndroid Build Coastguard Worker base::TimeTicks dns_resolution_start_time, 551*6777b538SAndroid Build Coastguard Worker base::TimeTicks dns_resolution_end_time, 552*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& net_log, 553*6777b538SAndroid Build Coastguard Worker raw_ptr<QuicChromiumClientSession>* session, 554*6777b538SAndroid Build Coastguard Worker handles::NetworkHandle* network); 555*6777b538SAndroid Build Coastguard Worker int CreateSessionOnProxyStream( 556*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback, 557*6777b538SAndroid Build Coastguard Worker const QuicSessionAliasKey& key, 558*6777b538SAndroid Build Coastguard Worker quic::ParsedQuicVersion quic_version, 559*6777b538SAndroid Build Coastguard Worker int cert_verify_flags, 560*6777b538SAndroid Build Coastguard Worker bool require_confirmation, 561*6777b538SAndroid Build Coastguard Worker IPEndPoint local_address, 562*6777b538SAndroid Build Coastguard Worker IPEndPoint proxy_peer_address, 563*6777b538SAndroid Build Coastguard Worker std::unique_ptr<QuicChromiumClientStream::Handle> proxy_stream, 564*6777b538SAndroid Build Coastguard Worker std::string user_agent, 565*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& net_log, 566*6777b538SAndroid Build Coastguard Worker raw_ptr<QuicChromiumClientSession>* session); 567*6777b538SAndroid Build Coastguard Worker void FinishCreateSession(CompletionOnceCallback callback, 568*6777b538SAndroid Build Coastguard Worker const QuicSessionAliasKey& key, 569*6777b538SAndroid Build Coastguard Worker quic::ParsedQuicVersion quic_version, 570*6777b538SAndroid Build Coastguard Worker int cert_verify_flags, 571*6777b538SAndroid Build Coastguard Worker bool require_confirmation, 572*6777b538SAndroid Build Coastguard Worker IPEndPoint peer_address, 573*6777b538SAndroid Build Coastguard Worker ConnectionEndpointMetadata metadata, 574*6777b538SAndroid Build Coastguard Worker base::TimeTicks dns_resolution_start_time, 575*6777b538SAndroid Build Coastguard Worker base::TimeTicks dns_resolution_end_time, 576*6777b538SAndroid Build Coastguard Worker quic::QuicPacketLength max_packet_length, 577*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& net_log, 578*6777b538SAndroid Build Coastguard Worker raw_ptr<QuicChromiumClientSession>* session, 579*6777b538SAndroid Build Coastguard Worker handles::NetworkHandle* network, 580*6777b538SAndroid Build Coastguard Worker std::unique_ptr<DatagramClientSocket> socket, 581*6777b538SAndroid Build Coastguard Worker int rv); 582*6777b538SAndroid Build Coastguard Worker bool CreateSessionHelper(const QuicSessionAliasKey& key, 583*6777b538SAndroid Build Coastguard Worker quic::ParsedQuicVersion quic_version, 584*6777b538SAndroid Build Coastguard Worker int cert_verify_flags, 585*6777b538SAndroid Build Coastguard Worker bool require_confirmation, 586*6777b538SAndroid Build Coastguard Worker IPEndPoint peer_address, 587*6777b538SAndroid Build Coastguard Worker ConnectionEndpointMetadata metadata, 588*6777b538SAndroid Build Coastguard Worker base::TimeTicks dns_resolution_start_time, 589*6777b538SAndroid Build Coastguard Worker base::TimeTicks dns_resolution_end_time, 590*6777b538SAndroid Build Coastguard Worker quic::QuicPacketLength max_packet_length, 591*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& net_log, 592*6777b538SAndroid Build Coastguard Worker raw_ptr<QuicChromiumClientSession>* session, 593*6777b538SAndroid Build Coastguard Worker handles::NetworkHandle* network, 594*6777b538SAndroid Build Coastguard Worker std::unique_ptr<DatagramClientSocket> socket); 595*6777b538SAndroid Build Coastguard Worker 596*6777b538SAndroid Build Coastguard Worker // Called when the Job for the given key has created and confirmed a session. 597*6777b538SAndroid Build Coastguard Worker void ActivateSession(const QuicSessionAliasKey& key, 598*6777b538SAndroid Build Coastguard Worker QuicChromiumClientSession* session, 599*6777b538SAndroid Build Coastguard Worker std::set<std::string> dns_aliases); 600*6777b538SAndroid Build Coastguard Worker 601*6777b538SAndroid Build Coastguard Worker // Go away all active sessions. May disable session's connectivity monitoring 602*6777b538SAndroid Build Coastguard Worker // based on the |reason|. 603*6777b538SAndroid Build Coastguard Worker void MarkAllActiveSessionsGoingAway(AllActiveSessionsGoingAwayReason reason); 604*6777b538SAndroid Build Coastguard Worker 605*6777b538SAndroid Build Coastguard Worker void ConfigureInitialRttEstimate( 606*6777b538SAndroid Build Coastguard Worker const quic::QuicServerId& server_id, 607*6777b538SAndroid Build Coastguard Worker const NetworkAnonymizationKey& network_anonymization_key, 608*6777b538SAndroid Build Coastguard Worker quic::QuicConfig* config); 609*6777b538SAndroid Build Coastguard Worker 610*6777b538SAndroid Build Coastguard Worker // Returns |srtt| in micro seconds from ServerNetworkStats. Returns 0 if there 611*6777b538SAndroid Build Coastguard Worker // is no |http_server_properties_| or if |http_server_properties_| doesn't 612*6777b538SAndroid Build Coastguard Worker // have ServerNetworkStats for the given |server_id|. 613*6777b538SAndroid Build Coastguard Worker int64_t GetServerNetworkStatsSmoothedRttInMicroseconds( 614*6777b538SAndroid Build Coastguard Worker const quic::QuicServerId& server_id, 615*6777b538SAndroid Build Coastguard Worker const NetworkAnonymizationKey& network_anonymization_key) const; 616*6777b538SAndroid Build Coastguard Worker 617*6777b538SAndroid Build Coastguard Worker // Returns |srtt| from ServerNetworkStats. Returns null if there 618*6777b538SAndroid Build Coastguard Worker // is no |http_server_properties_| or if |http_server_properties_| doesn't 619*6777b538SAndroid Build Coastguard Worker // have ServerNetworkStats for the given |server_id|. 620*6777b538SAndroid Build Coastguard Worker const base::TimeDelta* GetServerNetworkStatsSmoothedRtt( 621*6777b538SAndroid Build Coastguard Worker const quic::QuicServerId& server_id, 622*6777b538SAndroid Build Coastguard Worker const NetworkAnonymizationKey& network_anonymization_key) const; 623*6777b538SAndroid Build Coastguard Worker 624*6777b538SAndroid Build Coastguard Worker // Helper methods. 625*6777b538SAndroid Build Coastguard Worker bool WasQuicRecentlyBroken(const QuicSessionKey& session_key) const; 626*6777b538SAndroid Build Coastguard Worker 627*6777b538SAndroid Build Coastguard Worker // Helper method to initialize the following migration options and check 628*6777b538SAndroid Build Coastguard Worker // pre-requisites: 629*6777b538SAndroid Build Coastguard Worker // - |params_.migrate_sessions_on_network_change_v2| 630*6777b538SAndroid Build Coastguard Worker // - |params_.migrate_sessions_early_v2| 631*6777b538SAndroid Build Coastguard Worker // - |params_.migrate_idle_sessions| 632*6777b538SAndroid Build Coastguard Worker // - |params_.retry_on_alternate_network_before_handshake| 633*6777b538SAndroid Build Coastguard Worker // If pre-requisites are not met, turn off the corresponding options. 634*6777b538SAndroid Build Coastguard Worker void InitializeMigrationOptions(); 635*6777b538SAndroid Build Coastguard Worker 636*6777b538SAndroid Build Coastguard Worker // Initializes the cached state associated with |server_id| in 637*6777b538SAndroid Build Coastguard Worker // |crypto_config_| with the information in |server_info|. 638*6777b538SAndroid Build Coastguard Worker void InitializeCachedStateInCryptoConfig( 639*6777b538SAndroid Build Coastguard Worker const CryptoClientConfigHandle& crypto_config_handle, 640*6777b538SAndroid Build Coastguard Worker const quic::QuicServerId& server_id, 641*6777b538SAndroid Build Coastguard Worker const std::unique_ptr<QuicServerInfo>& server_info); 642*6777b538SAndroid Build Coastguard Worker 643*6777b538SAndroid Build Coastguard Worker void ProcessGoingAwaySession(QuicChromiumClientSession* session, 644*6777b538SAndroid Build Coastguard Worker const quic::QuicServerId& server_id, 645*6777b538SAndroid Build Coastguard Worker bool was_session_active); 646*6777b538SAndroid Build Coastguard Worker 647*6777b538SAndroid Build Coastguard Worker // Insert the given alias `key` in the AliasSet for the given `session` in 648*6777b538SAndroid Build Coastguard Worker // the map `session_aliases_`, and add the given `dns_aliases` for 649*6777b538SAndroid Build Coastguard Worker // `key.session_key()` in `dns_aliases_by_session_key_`. 650*6777b538SAndroid Build Coastguard Worker void MapSessionToAliasKey(QuicChromiumClientSession* session, 651*6777b538SAndroid Build Coastguard Worker const QuicSessionAliasKey& key, 652*6777b538SAndroid Build Coastguard Worker std::set<std::string> dns_aliases); 653*6777b538SAndroid Build Coastguard Worker 654*6777b538SAndroid Build Coastguard Worker // For all alias keys for `session` in `session_aliases_`, erase the 655*6777b538SAndroid Build Coastguard Worker // corresponding DNS aliases in `dns_aliases_by_session_key_`. Then erase 656*6777b538SAndroid Build Coastguard Worker // `session` from `session_aliases_`. 657*6777b538SAndroid Build Coastguard Worker void UnmapSessionFromSessionAliases(QuicChromiumClientSession* session); 658*6777b538SAndroid Build Coastguard Worker 659*6777b538SAndroid Build Coastguard Worker // Creates a CreateCryptoConfigHandle for the specified 660*6777b538SAndroid Build Coastguard Worker // NetworkAnonymizationKey. If there's already a corresponding entry in 661*6777b538SAndroid Build Coastguard Worker // |active_crypto_config_map_|, reuses it. If there's a corresponding entry in 662*6777b538SAndroid Build Coastguard Worker // |recent_crypto_config_map_|, promotes it to |active_crypto_config_map_| and 663*6777b538SAndroid Build Coastguard Worker // then reuses it. Otherwise, creates a new entry in 664*6777b538SAndroid Build Coastguard Worker // |active_crypto_config_map_|. 665*6777b538SAndroid Build Coastguard Worker std::unique_ptr<CryptoClientConfigHandle> CreateCryptoConfigHandle( 666*6777b538SAndroid Build Coastguard Worker const NetworkAnonymizationKey& network_anonymization_key); 667*6777b538SAndroid Build Coastguard Worker 668*6777b538SAndroid Build Coastguard Worker // Salled when the indicated member of |active_crypto_config_map_| has no 669*6777b538SAndroid Build Coastguard Worker // outstanding references. The QuicCryptoClientConfigOwner is then moved to 670*6777b538SAndroid Build Coastguard Worker // |recent_crypto_config_map_|, an MRU cache. 671*6777b538SAndroid Build Coastguard Worker void OnAllCryptoClientRefReleased( 672*6777b538SAndroid Build Coastguard Worker QuicCryptoClientConfigMap::iterator& map_iterator); 673*6777b538SAndroid Build Coastguard Worker 674*6777b538SAndroid Build Coastguard Worker // Called when a network change happens. 675*6777b538SAndroid Build Coastguard Worker // Collect platform notification metrics, and if the change affects the 676*6777b538SAndroid Build Coastguard Worker // original default network interface, collect connectivity degradation 677*6777b538SAndroid Build Coastguard Worker // metrics from |connectivity_monitor_| and add to histograms. 678*6777b538SAndroid Build Coastguard Worker void CollectDataOnPlatformNotification( 679*6777b538SAndroid Build Coastguard Worker enum QuicPlatformNotification notification, 680*6777b538SAndroid Build Coastguard Worker handles::NetworkHandle affected_network) const; 681*6777b538SAndroid Build Coastguard Worker 682*6777b538SAndroid Build Coastguard Worker std::unique_ptr<QuicCryptoClientConfigHandle> GetCryptoConfigForTesting( 683*6777b538SAndroid Build Coastguard Worker const NetworkAnonymizationKey& network_anonymization_key); 684*6777b538SAndroid Build Coastguard Worker 685*6777b538SAndroid Build Coastguard Worker bool CryptoConfigCacheIsEmptyForTesting( 686*6777b538SAndroid Build Coastguard Worker const quic::QuicServerId& server_id, 687*6777b538SAndroid Build Coastguard Worker const NetworkAnonymizationKey& network_anonymization_key); 688*6777b538SAndroid Build Coastguard Worker supported_versions()689*6777b538SAndroid Build Coastguard Worker const quic::ParsedQuicVersionVector& supported_versions() const { 690*6777b538SAndroid Build Coastguard Worker return params_.supported_versions; 691*6777b538SAndroid Build Coastguard Worker } 692*6777b538SAndroid Build Coastguard Worker 693*6777b538SAndroid Build Coastguard Worker // Whether QUIC is known to work on current network. This is true when QUIC is 694*6777b538SAndroid Build Coastguard Worker // expected to work in general, rather than whether QUIC was broken / recently 695*6777b538SAndroid Build Coastguard Worker // broken when used with a particular server. That information is stored in 696*6777b538SAndroid Build Coastguard Worker // the broken alternative service map in HttpServerProperties. 697*6777b538SAndroid Build Coastguard Worker bool is_quic_known_to_work_on_current_network_ = false; 698*6777b538SAndroid Build Coastguard Worker 699*6777b538SAndroid Build Coastguard Worker NetLogWithSource net_log_; 700*6777b538SAndroid Build Coastguard Worker const raw_ptr<HostResolver> host_resolver_; 701*6777b538SAndroid Build Coastguard Worker const raw_ptr<ClientSocketFactory> client_socket_factory_; 702*6777b538SAndroid Build Coastguard Worker const raw_ptr<HttpServerProperties> http_server_properties_; 703*6777b538SAndroid Build Coastguard Worker const raw_ptr<CertVerifier> cert_verifier_; 704*6777b538SAndroid Build Coastguard Worker const raw_ptr<TransportSecurityState> transport_security_state_; 705*6777b538SAndroid Build Coastguard Worker const raw_ptr<ProxyDelegate> proxy_delegate_; 706*6777b538SAndroid Build Coastguard Worker const raw_ptr<SCTAuditingDelegate> sct_auditing_delegate_; 707*6777b538SAndroid Build Coastguard Worker const raw_ptr<QuicCryptoClientStreamFactory> 708*6777b538SAndroid Build Coastguard Worker quic_crypto_client_stream_factory_; 709*6777b538SAndroid Build Coastguard Worker const raw_ptr<quic::QuicRandom> random_generator_; // Unowned. 710*6777b538SAndroid Build Coastguard Worker const raw_ptr<const quic::QuicClock> clock_; // Unowned. 711*6777b538SAndroid Build Coastguard Worker QuicParams params_; 712*6777b538SAndroid Build Coastguard Worker QuicClockSkewDetector clock_skew_detector_; 713*6777b538SAndroid Build Coastguard Worker 714*6777b538SAndroid Build Coastguard Worker // Factory which is used to create socket performance watcher. A new watcher 715*6777b538SAndroid Build Coastguard Worker // is created for every QUIC connection. 716*6777b538SAndroid Build Coastguard Worker // |socket_performance_watcher_factory_| may be null. 717*6777b538SAndroid Build Coastguard Worker const raw_ptr<SocketPerformanceWatcherFactory> 718*6777b538SAndroid Build Coastguard Worker socket_performance_watcher_factory_; 719*6777b538SAndroid Build Coastguard Worker 720*6777b538SAndroid Build Coastguard Worker // The helper used for all connections. 721*6777b538SAndroid Build Coastguard Worker std::unique_ptr<QuicChromiumConnectionHelper> helper_; 722*6777b538SAndroid Build Coastguard Worker 723*6777b538SAndroid Build Coastguard Worker // The alarm factory used for all connections. 724*6777b538SAndroid Build Coastguard Worker std::unique_ptr<quic::QuicAlarmFactory> alarm_factory_; 725*6777b538SAndroid Build Coastguard Worker 726*6777b538SAndroid Build Coastguard Worker // Contains owning pointers to all sessions that currently exist. 727*6777b538SAndroid Build Coastguard Worker SessionIdMap all_sessions_; 728*6777b538SAndroid Build Coastguard Worker // Contains non-owning pointers to currently active session 729*6777b538SAndroid Build Coastguard Worker // (not going away session, once they're implemented). 730*6777b538SAndroid Build Coastguard Worker SessionMap active_sessions_; 731*6777b538SAndroid Build Coastguard Worker // Map from session to set of aliases that this session is known by. 732*6777b538SAndroid Build Coastguard Worker SessionAliasMap session_aliases_; 733*6777b538SAndroid Build Coastguard Worker // Map from IP address to sessions which are connected to this address. 734*6777b538SAndroid Build Coastguard Worker IPAliasMap ip_aliases_; 735*6777b538SAndroid Build Coastguard Worker // Map from session to its original peer IP address. 736*6777b538SAndroid Build Coastguard Worker SessionPeerIPMap session_peer_ip_; 737*6777b538SAndroid Build Coastguard Worker 738*6777b538SAndroid Build Coastguard Worker // Origins which have gone away recently. 739*6777b538SAndroid Build Coastguard Worker AliasSet gone_away_aliases_; 740*6777b538SAndroid Build Coastguard Worker 741*6777b538SAndroid Build Coastguard Worker // A map of DNS alias vectors by session keys. 742*6777b538SAndroid Build Coastguard Worker DnsAliasesBySessionKeyMap dns_aliases_by_session_key_; 743*6777b538SAndroid Build Coastguard Worker 744*6777b538SAndroid Build Coastguard Worker // When a QuicCryptoClientConfig is in use, it has one or more live 745*6777b538SAndroid Build Coastguard Worker // CryptoClientConfigHandles, and is stored in |active_crypto_config_map_|. 746*6777b538SAndroid Build Coastguard Worker // Once all the handles are deleted, it's moved to 747*6777b538SAndroid Build Coastguard Worker // |recent_crypto_config_map_|. If reused before it is evicted from LRUCache, 748*6777b538SAndroid Build Coastguard Worker // it will be removed from the cache and return to the active config map. 749*6777b538SAndroid Build Coastguard Worker // These two maps should never both have entries with the same 750*6777b538SAndroid Build Coastguard Worker // NetworkAnonymizationKey. 751*6777b538SAndroid Build Coastguard Worker QuicCryptoClientConfigMap active_crypto_config_map_; 752*6777b538SAndroid Build Coastguard Worker base::LRUCache<NetworkAnonymizationKey, 753*6777b538SAndroid Build Coastguard Worker std::unique_ptr<QuicCryptoClientConfigOwner>> 754*6777b538SAndroid Build Coastguard Worker recent_crypto_config_map_; 755*6777b538SAndroid Build Coastguard Worker 756*6777b538SAndroid Build Coastguard Worker const quic::QuicConfig config_; 757*6777b538SAndroid Build Coastguard Worker 758*6777b538SAndroid Build Coastguard Worker JobMap active_jobs_; 759*6777b538SAndroid Build Coastguard Worker 760*6777b538SAndroid Build Coastguard Worker // PING timeout for connections. 761*6777b538SAndroid Build Coastguard Worker quic::QuicTime::Delta ping_timeout_; 762*6777b538SAndroid Build Coastguard Worker quic::QuicTime::Delta reduced_ping_timeout_; 763*6777b538SAndroid Build Coastguard Worker 764*6777b538SAndroid Build Coastguard Worker // Timeout for how long the wire can have no retransmittable packets. 765*6777b538SAndroid Build Coastguard Worker quic::QuicTime::Delta retransmittable_on_wire_timeout_; 766*6777b538SAndroid Build Coastguard Worker 767*6777b538SAndroid Build Coastguard Worker // If more than |yield_after_packets_| packets have been read or more than 768*6777b538SAndroid Build Coastguard Worker // |yield_after_duration_| time has passed, then 769*6777b538SAndroid Build Coastguard Worker // QuicChromiumPacketReader::StartReading() yields by doing a PostTask(). 770*6777b538SAndroid Build Coastguard Worker int yield_after_packets_; 771*6777b538SAndroid Build Coastguard Worker quic::QuicTime::Delta yield_after_duration_; 772*6777b538SAndroid Build Coastguard Worker 773*6777b538SAndroid Build Coastguard Worker // If |migrate_sessions_early_v2_| is true, tracks the current default 774*6777b538SAndroid Build Coastguard Worker // network, and is updated OnNetworkMadeDefault. 775*6777b538SAndroid Build Coastguard Worker // Otherwise, always set to NetworkChangeNotifier::kInvalidNetwork. 776*6777b538SAndroid Build Coastguard Worker handles::NetworkHandle default_network_; 777*6777b538SAndroid Build Coastguard Worker 778*6777b538SAndroid Build Coastguard Worker // Local address of socket that was created in CreateSession. 779*6777b538SAndroid Build Coastguard Worker IPEndPoint local_address_; 780*6777b538SAndroid Build Coastguard Worker // True if we need to check HttpServerProperties if QUIC was supported last 781*6777b538SAndroid Build Coastguard Worker // time. 782*6777b538SAndroid Build Coastguard Worker bool need_to_check_persisted_supports_quic_ = true; 783*6777b538SAndroid Build Coastguard Worker bool prefer_aes_gcm_recorded_ = false; 784*6777b538SAndroid Build Coastguard Worker 785*6777b538SAndroid Build Coastguard Worker NetworkConnection network_connection_; 786*6777b538SAndroid Build Coastguard Worker 787*6777b538SAndroid Build Coastguard Worker QuicConnectivityMonitor connectivity_monitor_; 788*6777b538SAndroid Build Coastguard Worker 789*6777b538SAndroid Build Coastguard Worker raw_ptr<const base::TickClock, DanglingUntriaged> tick_clock_ = nullptr; 790*6777b538SAndroid Build Coastguard Worker 791*6777b538SAndroid Build Coastguard Worker scoped_refptr<base::SequencedTaskRunner> task_runner_ = nullptr; 792*6777b538SAndroid Build Coastguard Worker 793*6777b538SAndroid Build Coastguard Worker const raw_ptr<SSLConfigService> ssl_config_service_; 794*6777b538SAndroid Build Coastguard Worker 795*6777b538SAndroid Build Coastguard Worker // Whether NetworkAnonymizationKeys should be used for 796*6777b538SAndroid Build Coastguard Worker // `active_crypto_config_map_`. If false, there will just be one config with 797*6777b538SAndroid Build Coastguard Worker // an empty NetworkAnonymizationKey. Whether QuicSessionAliasKeys all have an 798*6777b538SAndroid Build Coastguard Worker // empty NAK is based on whether socket pools are respecting NAKs, but whether 799*6777b538SAndroid Build Coastguard Worker // those NAKs are also used when accessing `active_crypto_config_map_` is also 800*6777b538SAndroid Build Coastguard Worker // gated this, which is set based on whether HttpServerProperties is 801*6777b538SAndroid Build Coastguard Worker // respecting NAKs, as that data is fed into the crypto config map using the 802*6777b538SAndroid Build Coastguard Worker // corresponding NAK. 803*6777b538SAndroid Build Coastguard Worker const bool use_network_anonymization_key_for_crypto_configs_; 804*6777b538SAndroid Build Coastguard Worker 805*6777b538SAndroid Build Coastguard Worker quic::DeterministicConnectionIdGenerator connection_id_generator_{ 806*6777b538SAndroid Build Coastguard Worker quic::kQuicDefaultConnectionIdLength}; 807*6777b538SAndroid Build Coastguard Worker 808*6777b538SAndroid Build Coastguard Worker base::WeakPtrFactory<QuicSessionPool> weak_factory_{this}; 809*6777b538SAndroid Build Coastguard Worker }; 810*6777b538SAndroid Build Coastguard Worker 811*6777b538SAndroid Build Coastguard Worker // Refcounted class that owns quic::QuicCryptoClientConfig and tracks how many 812*6777b538SAndroid Build Coastguard Worker // consumers are using it currently. When the last reference is freed, the 813*6777b538SAndroid Build Coastguard Worker // QuicCryptoClientConfigHandle informs the owning QuicSessionPool, moves it 814*6777b538SAndroid Build Coastguard Worker // into an MRU cache. 815*6777b538SAndroid Build Coastguard Worker class QuicSessionPool::QuicCryptoClientConfigOwner { 816*6777b538SAndroid Build Coastguard Worker public: 817*6777b538SAndroid Build Coastguard Worker QuicCryptoClientConfigOwner( 818*6777b538SAndroid Build Coastguard Worker std::unique_ptr<quic::ProofVerifier> proof_verifier, 819*6777b538SAndroid Build Coastguard Worker std::unique_ptr<quic::QuicClientSessionCache> session_cache, 820*6777b538SAndroid Build Coastguard Worker QuicSessionPool* quic_session_pool); 821*6777b538SAndroid Build Coastguard Worker 822*6777b538SAndroid Build Coastguard Worker QuicCryptoClientConfigOwner(const QuicCryptoClientConfigOwner&) = delete; 823*6777b538SAndroid Build Coastguard Worker QuicCryptoClientConfigOwner& operator=(const QuicCryptoClientConfigOwner&) = 824*6777b538SAndroid Build Coastguard Worker delete; 825*6777b538SAndroid Build Coastguard Worker 826*6777b538SAndroid Build Coastguard Worker ~QuicCryptoClientConfigOwner(); 827*6777b538SAndroid Build Coastguard Worker config()828*6777b538SAndroid Build Coastguard Worker quic::QuicCryptoClientConfig* config() { return &config_; } 829*6777b538SAndroid Build Coastguard Worker num_refs()830*6777b538SAndroid Build Coastguard Worker int num_refs() const { return num_refs_; } 831*6777b538SAndroid Build Coastguard Worker quic_session_pool()832*6777b538SAndroid Build Coastguard Worker QuicSessionPool* quic_session_pool() { return quic_session_pool_; } 833*6777b538SAndroid Build Coastguard Worker 834*6777b538SAndroid Build Coastguard Worker void OnMemoryPressure( 835*6777b538SAndroid Build Coastguard Worker base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level); 836*6777b538SAndroid Build Coastguard Worker 837*6777b538SAndroid Build Coastguard Worker private: 838*6777b538SAndroid Build Coastguard Worker friend class CryptoClientConfigHandle; 839*6777b538SAndroid Build Coastguard Worker 840*6777b538SAndroid Build Coastguard Worker // Simple ref counting. Not using scoped_refptr allows for both keeping around 841*6777b538SAndroid Build Coastguard Worker // an MRU cache of 0-reference objects, and DCHECKing that there are no 842*6777b538SAndroid Build Coastguard Worker // outstanding referenced QuicCryptoClientConfigOwner on destruction. Private 843*6777b538SAndroid Build Coastguard Worker // so that only CryptoClientConfigHandle can add and remove refs. 844*6777b538SAndroid Build Coastguard Worker AddRef()845*6777b538SAndroid Build Coastguard Worker void AddRef() { num_refs_++; } 846*6777b538SAndroid Build Coastguard Worker ReleaseRef()847*6777b538SAndroid Build Coastguard Worker void ReleaseRef() { 848*6777b538SAndroid Build Coastguard Worker DCHECK_GT(num_refs_, 0); 849*6777b538SAndroid Build Coastguard Worker num_refs_--; 850*6777b538SAndroid Build Coastguard Worker } 851*6777b538SAndroid Build Coastguard Worker 852*6777b538SAndroid Build Coastguard Worker int num_refs_ = 0; 853*6777b538SAndroid Build Coastguard Worker quic::QuicCryptoClientConfig config_; 854*6777b538SAndroid Build Coastguard Worker raw_ptr<base::Clock> clock_; 855*6777b538SAndroid Build Coastguard Worker std::unique_ptr<base::MemoryPressureListener> memory_pressure_listener_; 856*6777b538SAndroid Build Coastguard Worker const raw_ptr<QuicSessionPool> quic_session_pool_; 857*6777b538SAndroid Build Coastguard Worker }; 858*6777b538SAndroid Build Coastguard Worker 859*6777b538SAndroid Build Coastguard Worker // Class that owns a reference to a QuicCryptoClientConfigOwner. Handles 860*6777b538SAndroid Build Coastguard Worker // incrementing the refcount on construction, and decrementing it on 861*6777b538SAndroid Build Coastguard Worker // destruction. 862*6777b538SAndroid Build Coastguard Worker class QuicSessionPool::CryptoClientConfigHandle 863*6777b538SAndroid Build Coastguard Worker : public QuicCryptoClientConfigHandle { 864*6777b538SAndroid Build Coastguard Worker public: 865*6777b538SAndroid Build Coastguard Worker explicit CryptoClientConfigHandle( 866*6777b538SAndroid Build Coastguard Worker const QuicCryptoClientConfigMap::iterator& map_iterator); 867*6777b538SAndroid Build Coastguard Worker CryptoClientConfigHandle(const CryptoClientConfigHandle & other)868*6777b538SAndroid Build Coastguard Worker CryptoClientConfigHandle(const CryptoClientConfigHandle& other) 869*6777b538SAndroid Build Coastguard Worker : CryptoClientConfigHandle(other.map_iterator_) {} 870*6777b538SAndroid Build Coastguard Worker 871*6777b538SAndroid Build Coastguard Worker CryptoClientConfigHandle& operator=(const CryptoClientConfigHandle&) = delete; 872*6777b538SAndroid Build Coastguard Worker 873*6777b538SAndroid Build Coastguard Worker ~CryptoClientConfigHandle() override; 874*6777b538SAndroid Build Coastguard Worker 875*6777b538SAndroid Build Coastguard Worker quic::QuicCryptoClientConfig* GetConfig() const override; 876*6777b538SAndroid Build Coastguard Worker 877*6777b538SAndroid Build Coastguard Worker private: 878*6777b538SAndroid Build Coastguard Worker QuicCryptoClientConfigMap::iterator map_iterator_; 879*6777b538SAndroid Build Coastguard Worker }; 880*6777b538SAndroid Build Coastguard Worker 881*6777b538SAndroid Build Coastguard Worker } // namespace net 882*6777b538SAndroid Build Coastguard Worker 883*6777b538SAndroid Build Coastguard Worker #endif // NET_QUIC_QUIC_SESSION_POOL_H_ 884