xref: /aosp_15_r20/external/cronet/net/quic/quic_session_pool.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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