xref: /aosp_15_r20/external/cronet/net/quic/quic_context.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2019 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_CONTEXT_H_
6*6777b538SAndroid Build Coastguard Worker #define NET_QUIC_QUIC_CONTEXT_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <memory>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include "base/containers/contains.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/feature_list.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h"
13*6777b538SAndroid Build Coastguard Worker #include "net/base/features.h"
14*6777b538SAndroid Build Coastguard Worker #include "net/base/host_port_pair.h"
15*6777b538SAndroid Build Coastguard Worker #include "net/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_client_config.h"
16*6777b538SAndroid Build Coastguard Worker #include "net/third_party/quiche/src/quiche/quic/core/quic_connection.h"
17*6777b538SAndroid Build Coastguard Worker 
18*6777b538SAndroid Build Coastguard Worker namespace net {
19*6777b538SAndroid Build Coastguard Worker 
20*6777b538SAndroid Build Coastguard Worker // Default QUIC supported versions used in absence of any external
21*6777b538SAndroid Build Coastguard Worker // configuration.
22*6777b538SAndroid Build Coastguard Worker inline NET_EXPORT_PRIVATE quic::ParsedQuicVersionVector
DefaultSupportedQuicVersions()23*6777b538SAndroid Build Coastguard Worker DefaultSupportedQuicVersions() {
24*6777b538SAndroid Build Coastguard Worker   // The ordering of this list does not matter for Chrome because it respects
25*6777b538SAndroid Build Coastguard Worker   // the ordering received from the server via Alt-Svc. However, cronet offers
26*6777b538SAndroid Build Coastguard Worker   // an addQuicHint() API which uses the first version from this list until
27*6777b538SAndroid Build Coastguard Worker   // it receives Alt-Svc from the server.
28*6777b538SAndroid Build Coastguard Worker   return quic::ParsedQuicVersionVector{quic::ParsedQuicVersion::RFCv1()};
29*6777b538SAndroid Build Coastguard Worker }
30*6777b538SAndroid Build Coastguard Worker 
31*6777b538SAndroid Build Coastguard Worker // Obsolete QUIC supported versions are versions that are supported by the
32*6777b538SAndroid Build Coastguard Worker // QUIC shared code but that Chrome refuses to use because modern clients
33*6777b538SAndroid Build Coastguard Worker // should only use versions at least as recent as the oldest default version.
ObsoleteQuicVersions()34*6777b538SAndroid Build Coastguard Worker inline NET_EXPORT_PRIVATE quic::ParsedQuicVersionVector ObsoleteQuicVersions() {
35*6777b538SAndroid Build Coastguard Worker   return quic::ParsedQuicVersionVector{quic::ParsedQuicVersion::Q046(),
36*6777b538SAndroid Build Coastguard Worker                                        quic::ParsedQuicVersion::Draft29()};
37*6777b538SAndroid Build Coastguard Worker }
38*6777b538SAndroid Build Coastguard Worker 
39*6777b538SAndroid Build Coastguard Worker // All of the QUIC versions that Chrome can support. This is the subset of
40*6777b538SAndroid Build Coastguard Worker // QUIC versions that the QUIC shared code supports that are not on the list
41*6777b538SAndroid Build Coastguard Worker // of versions that Chrome considers obsolete.
42*6777b538SAndroid Build Coastguard Worker inline NET_EXPORT_PRIVATE quic::ParsedQuicVersionVector
AllSupportedQuicVersions()43*6777b538SAndroid Build Coastguard Worker AllSupportedQuicVersions() {
44*6777b538SAndroid Build Coastguard Worker   quic::ParsedQuicVersionVector obsolete_versions = ObsoleteQuicVersions();
45*6777b538SAndroid Build Coastguard Worker   quic::ParsedQuicVersionVector all_supported_versions =
46*6777b538SAndroid Build Coastguard Worker       quic::AllSupportedVersions();
47*6777b538SAndroid Build Coastguard Worker   quic::ParsedQuicVersionVector filtered_versions;
48*6777b538SAndroid Build Coastguard Worker   for (const auto& version : all_supported_versions) {
49*6777b538SAndroid Build Coastguard Worker     if (!base::Contains(obsolete_versions, version)) {
50*6777b538SAndroid Build Coastguard Worker       filtered_versions.push_back(version);
51*6777b538SAndroid Build Coastguard Worker     }
52*6777b538SAndroid Build Coastguard Worker   }
53*6777b538SAndroid Build Coastguard Worker   return filtered_versions;
54*6777b538SAndroid Build Coastguard Worker }
55*6777b538SAndroid Build Coastguard Worker 
56*6777b538SAndroid Build Coastguard Worker // When a connection is idle for 30 seconds it will be closed.
57*6777b538SAndroid Build Coastguard Worker constexpr base::TimeDelta kIdleConnectionTimeout = base::Seconds(30);
58*6777b538SAndroid Build Coastguard Worker 
59*6777b538SAndroid Build Coastguard Worker // Sessions can migrate if they have been idle for less than this period.
60*6777b538SAndroid Build Coastguard Worker constexpr base::TimeDelta kDefaultIdleSessionMigrationPeriod =
61*6777b538SAndroid Build Coastguard Worker     base::Seconds(30);
62*6777b538SAndroid Build Coastguard Worker 
63*6777b538SAndroid Build Coastguard Worker // The default maximum time allowed to have no retransmittable packets on the
64*6777b538SAndroid Build Coastguard Worker // wire (after sending the first retransmittable packet) if
65*6777b538SAndroid Build Coastguard Worker // |migrate_session_early_v2_| is true. PING frames will be sent as needed to
66*6777b538SAndroid Build Coastguard Worker // enforce this.
67*6777b538SAndroid Build Coastguard Worker constexpr base::TimeDelta kDefaultRetransmittableOnWireTimeout =
68*6777b538SAndroid Build Coastguard Worker     base::Milliseconds(200);
69*6777b538SAndroid Build Coastguard Worker 
70*6777b538SAndroid Build Coastguard Worker // The default maximum time QUIC session could be on non-default network before
71*6777b538SAndroid Build Coastguard Worker // migrate back to default network.
72*6777b538SAndroid Build Coastguard Worker constexpr base::TimeDelta kMaxTimeOnNonDefaultNetwork = base::Seconds(128);
73*6777b538SAndroid Build Coastguard Worker 
74*6777b538SAndroid Build Coastguard Worker // The default maximum number of migrations to non default network on write
75*6777b538SAndroid Build Coastguard Worker // error per network.
76*6777b538SAndroid Build Coastguard Worker const int64_t kMaxMigrationsToNonDefaultNetworkOnWriteError = 5;
77*6777b538SAndroid Build Coastguard Worker 
78*6777b538SAndroid Build Coastguard Worker // The default maximum number of migrations to non default network on path
79*6777b538SAndroid Build Coastguard Worker // degrading per network.
80*6777b538SAndroid Build Coastguard Worker const int64_t kMaxMigrationsToNonDefaultNetworkOnPathDegrading = 5;
81*6777b538SAndroid Build Coastguard Worker 
82*6777b538SAndroid Build Coastguard Worker // QUIC's socket receive buffer size.
83*6777b538SAndroid Build Coastguard Worker // We should adaptively set this buffer size, but for now, we'll use a size
84*6777b538SAndroid Build Coastguard Worker // that seems large enough to receive data at line rate for most connections,
85*6777b538SAndroid Build Coastguard Worker // and does not consume "too much" memory.
86*6777b538SAndroid Build Coastguard Worker const int32_t kQuicSocketReceiveBufferSize = 1024 * 1024;  // 1MB
87*6777b538SAndroid Build Coastguard Worker 
88*6777b538SAndroid Build Coastguard Worker // Structure containing simple configuration options and experiments for QUIC.
89*6777b538SAndroid Build Coastguard Worker struct NET_EXPORT QuicParams {
90*6777b538SAndroid Build Coastguard Worker   QuicParams();
91*6777b538SAndroid Build Coastguard Worker   QuicParams(const QuicParams& other);
92*6777b538SAndroid Build Coastguard Worker   ~QuicParams();
93*6777b538SAndroid Build Coastguard Worker 
94*6777b538SAndroid Build Coastguard Worker   // QUIC runtime configuration options.
95*6777b538SAndroid Build Coastguard Worker 
96*6777b538SAndroid Build Coastguard Worker   // Versions of QUIC which may be used.
97*6777b538SAndroid Build Coastguard Worker   quic::ParsedQuicVersionVector supported_versions =
98*6777b538SAndroid Build Coastguard Worker       DefaultSupportedQuicVersions();
99*6777b538SAndroid Build Coastguard Worker   // Limit on the size of QUIC packets.
100*6777b538SAndroid Build Coastguard Worker   size_t max_packet_length = quic::kDefaultMaxPacketSize;
101*6777b538SAndroid Build Coastguard Worker   // Maximum number of server configs that are to be stored in
102*6777b538SAndroid Build Coastguard Worker   // HttpServerProperties, instead of the disk cache.
103*6777b538SAndroid Build Coastguard Worker   size_t max_server_configs_stored_in_properties = 0u;
104*6777b538SAndroid Build Coastguard Worker   // QUIC will be used for all connections in this set.
105*6777b538SAndroid Build Coastguard Worker   std::set<HostPortPair> origins_to_force_quic_on;
106*6777b538SAndroid Build Coastguard Worker   // WebTransport developer mode disables the requirement that all QUIC
107*6777b538SAndroid Build Coastguard Worker   // connections are anchored to a system certificate root, but only for
108*6777b538SAndroid Build Coastguard Worker   // WebTransport connections.
109*6777b538SAndroid Build Coastguard Worker   bool webtransport_developer_mode = false;
110*6777b538SAndroid Build Coastguard Worker   // Set of QUIC tags to send in the handshake's connection options.
111*6777b538SAndroid Build Coastguard Worker   quic::QuicTagVector connection_options;
112*6777b538SAndroid Build Coastguard Worker   // Set of QUIC tags to send in the handshake's connection options that only
113*6777b538SAndroid Build Coastguard Worker   // affect the client.
114*6777b538SAndroid Build Coastguard Worker   quic::QuicTagVector client_connection_options;
115*6777b538SAndroid Build Coastguard Worker   // Enables experimental optimization for receiving data in UDPSocket.
116*6777b538SAndroid Build Coastguard Worker   bool enable_socket_recv_optimization = false;
117*6777b538SAndroid Build Coastguard Worker 
118*6777b538SAndroid Build Coastguard Worker   // Active QUIC experiments
119*6777b538SAndroid Build Coastguard Worker 
120*6777b538SAndroid Build Coastguard Worker   // Retry requests which fail with QUIC_PROTOCOL_ERROR, and mark QUIC
121*6777b538SAndroid Build Coastguard Worker   // broken if the retry succeeds.
122*6777b538SAndroid Build Coastguard Worker   bool retry_without_alt_svc_on_quic_errors = true;
123*6777b538SAndroid Build Coastguard Worker   // If true, all QUIC sessions are closed when any local IP address changes.
124*6777b538SAndroid Build Coastguard Worker   bool close_sessions_on_ip_change = false;
125*6777b538SAndroid Build Coastguard Worker   // If true, all QUIC sessions are marked as goaway when any local IP address
126*6777b538SAndroid Build Coastguard Worker   // changes.
127*6777b538SAndroid Build Coastguard Worker   bool goaway_sessions_on_ip_change = false;
128*6777b538SAndroid Build Coastguard Worker   // Specifies QUIC idle connection state lifetime.
129*6777b538SAndroid Build Coastguard Worker   base::TimeDelta idle_connection_timeout = kIdleConnectionTimeout;
130*6777b538SAndroid Build Coastguard Worker   // Specifies the reduced ping timeout subsequent connections should use when
131*6777b538SAndroid Build Coastguard Worker   // a connection was timed out with open streams.
132*6777b538SAndroid Build Coastguard Worker   base::TimeDelta reduced_ping_timeout = base::Seconds(quic::kPingTimeoutSecs);
133*6777b538SAndroid Build Coastguard Worker   // Maximum time that a session can have no retransmittable packets on the
134*6777b538SAndroid Build Coastguard Worker   // wire. Set to zero if not specified and no retransmittable PING will be
135*6777b538SAndroid Build Coastguard Worker   // sent to peer when the wire has no retransmittable packets.
136*6777b538SAndroid Build Coastguard Worker   base::TimeDelta retransmittable_on_wire_timeout;
137*6777b538SAndroid Build Coastguard Worker   // Maximum time the session can be alive before crypto handshake is
138*6777b538SAndroid Build Coastguard Worker   // finished.
139*6777b538SAndroid Build Coastguard Worker   base::TimeDelta max_time_before_crypto_handshake =
140*6777b538SAndroid Build Coastguard Worker       base::Seconds(quic::kMaxTimeForCryptoHandshakeSecs);
141*6777b538SAndroid Build Coastguard Worker   // Maximum idle time before the crypto handshake has completed.
142*6777b538SAndroid Build Coastguard Worker   base::TimeDelta max_idle_time_before_crypto_handshake =
143*6777b538SAndroid Build Coastguard Worker       base::Seconds(quic::kInitialIdleTimeoutSecs);
144*6777b538SAndroid Build Coastguard Worker   // If true, connection migration v2 will be used to migrate existing
145*6777b538SAndroid Build Coastguard Worker   // sessions to network when the platform indicates that the default network
146*6777b538SAndroid Build Coastguard Worker   // is changing.
147*6777b538SAndroid Build Coastguard Worker   // Use the value of the flag as the default value. This is needed because unit
148*6777b538SAndroid Build Coastguard Worker   // tests does not go through network_session_configuration which causes
149*6777b538SAndroid Build Coastguard Worker   // discrepancy.
150*6777b538SAndroid Build Coastguard Worker   bool migrate_sessions_on_network_change_v2 =
151*6777b538SAndroid Build Coastguard Worker       base::FeatureList::IsEnabled(features::kMigrateSessionsOnNetworkChangeV2);
152*6777b538SAndroid Build Coastguard Worker   // If true, connection migration v2 may be used to migrate active QUIC
153*6777b538SAndroid Build Coastguard Worker   // sessions to alternative network if current network connectivity is poor.
154*6777b538SAndroid Build Coastguard Worker   bool migrate_sessions_early_v2 = false;
155*6777b538SAndroid Build Coastguard Worker   // If true, a new connection may be kicked off on an alternate network when
156*6777b538SAndroid Build Coastguard Worker   // a connection fails on the default network before handshake is confirmed.
157*6777b538SAndroid Build Coastguard Worker   bool retry_on_alternate_network_before_handshake = false;
158*6777b538SAndroid Build Coastguard Worker   // If true, an idle session will be migrated within the idle migration
159*6777b538SAndroid Build Coastguard Worker   // period.
160*6777b538SAndroid Build Coastguard Worker   bool migrate_idle_sessions = false;
161*6777b538SAndroid Build Coastguard Worker   // If true, sessions with open streams will attempt to migrate to a different
162*6777b538SAndroid Build Coastguard Worker   // port when the current path is poor.
163*6777b538SAndroid Build Coastguard Worker   bool allow_port_migration = true;
164*6777b538SAndroid Build Coastguard Worker   // A session can be migrated if its idle time is within this period.
165*6777b538SAndroid Build Coastguard Worker   base::TimeDelta idle_session_migration_period =
166*6777b538SAndroid Build Coastguard Worker       kDefaultIdleSessionMigrationPeriod;
167*6777b538SAndroid Build Coastguard Worker   // Probing frequency for the multi-port alt path, represented in the number of
168*6777b538SAndroid Build Coastguard Worker   // seconds. When this param is 0, quiche will ignore it and use its own
169*6777b538SAndroid Build Coastguard Worker   // default.
170*6777b538SAndroid Build Coastguard Worker   int multi_port_probing_interval = 0;
171*6777b538SAndroid Build Coastguard Worker   // Maximum time the session could be on the non-default network before
172*6777b538SAndroid Build Coastguard Worker   // migrates back to default network. Defaults to
173*6777b538SAndroid Build Coastguard Worker   // kMaxTimeOnNonDefaultNetwork.
174*6777b538SAndroid Build Coastguard Worker   base::TimeDelta max_time_on_non_default_network = kMaxTimeOnNonDefaultNetwork;
175*6777b538SAndroid Build Coastguard Worker   // Maximum number of migrations to the non-default network on write error
176*6777b538SAndroid Build Coastguard Worker   // per network for each session.
177*6777b538SAndroid Build Coastguard Worker   int max_migrations_to_non_default_network_on_write_error =
178*6777b538SAndroid Build Coastguard Worker       kMaxMigrationsToNonDefaultNetworkOnWriteError;
179*6777b538SAndroid Build Coastguard Worker   // Maximum number of migrations to the non-default network on path
180*6777b538SAndroid Build Coastguard Worker   // degrading per network for each session.
181*6777b538SAndroid Build Coastguard Worker   int max_migrations_to_non_default_network_on_path_degrading =
182*6777b538SAndroid Build Coastguard Worker       kMaxMigrationsToNonDefaultNetworkOnPathDegrading;
183*6777b538SAndroid Build Coastguard Worker   // If true, allows migration of QUIC connections to a server-specified
184*6777b538SAndroid Build Coastguard Worker   // alternate server address.
185*6777b538SAndroid Build Coastguard Worker   bool allow_server_migration = false;
186*6777b538SAndroid Build Coastguard Worker   // If true, allows QUIC to use alternative services with a different
187*6777b538SAndroid Build Coastguard Worker   // hostname from the origin.
188*6777b538SAndroid Build Coastguard Worker   bool allow_remote_alt_svc = true;
189*6777b538SAndroid Build Coastguard Worker   // If true, estimate the initial RTT for QUIC connections based on network.
190*6777b538SAndroid Build Coastguard Worker   bool estimate_initial_rtt = false;
191*6777b538SAndroid Build Coastguard Worker   // The initial rtt that will be used in crypto handshake if no cached
192*6777b538SAndroid Build Coastguard Worker   // smoothed rtt is present.
193*6777b538SAndroid Build Coastguard Worker   base::TimeDelta initial_rtt_for_handshake;
194*6777b538SAndroid Build Coastguard Worker   // If true, QUIC with TLS will not try 0-RTT connection.
195*6777b538SAndroid Build Coastguard Worker   bool disable_tls_zero_rtt = false;
196*6777b538SAndroid Build Coastguard Worker   // If true, gQUIC requests will always require confirmation.
197*6777b538SAndroid Build Coastguard Worker   bool disable_gquic_zero_rtt = false;
198*6777b538SAndroid Build Coastguard Worker   // Network Service Type of the socket for iOS. Default is NET_SERVICE_TYPE_BE
199*6777b538SAndroid Build Coastguard Worker   // (best effort).
200*6777b538SAndroid Build Coastguard Worker   int ios_network_service_type = 0;
201*6777b538SAndroid Build Coastguard Worker   // Delay for the 1st time the alternative service is marked broken.
202*6777b538SAndroid Build Coastguard Worker   std::optional<base::TimeDelta> initial_delay_for_broken_alternative_service;
203*6777b538SAndroid Build Coastguard Worker   // If true, the delay for broke alternative service would be initial_delay *
204*6777b538SAndroid Build Coastguard Worker   // (1 << broken_count). Otherwise, the delay would be initial_delay, 5min,
205*6777b538SAndroid Build Coastguard Worker   // 10min and so on.
206*6777b538SAndroid Build Coastguard Worker   std::optional<bool> exponential_backoff_on_initial_delay;
207*6777b538SAndroid Build Coastguard Worker   // If true, delay main job even the request can be sent immediately on an
208*6777b538SAndroid Build Coastguard Worker   // available SPDY session.
209*6777b538SAndroid Build Coastguard Worker   bool delay_main_job_with_available_spdy_session = false;
210*6777b538SAndroid Build Coastguard Worker 
211*6777b538SAndroid Build Coastguard Worker   // If true, ALPS uses new codepoint to negotiates application settings.
212*6777b538SAndroid Build Coastguard Worker   bool use_new_alps_codepoint = false;
213*6777b538SAndroid Build Coastguard Worker };
214*6777b538SAndroid Build Coastguard Worker 
215*6777b538SAndroid Build Coastguard Worker // QuicContext contains QUIC-related variables that are shared across all of the
216*6777b538SAndroid Build Coastguard Worker // QUIC connections, both HTTP and non-HTTP ones.
217*6777b538SAndroid Build Coastguard Worker class NET_EXPORT_PRIVATE QuicContext {
218*6777b538SAndroid Build Coastguard Worker  public:
219*6777b538SAndroid Build Coastguard Worker   QuicContext();
220*6777b538SAndroid Build Coastguard Worker   explicit QuicContext(
221*6777b538SAndroid Build Coastguard Worker       std::unique_ptr<quic::QuicConnectionHelperInterface> helper);
222*6777b538SAndroid Build Coastguard Worker   virtual ~QuicContext();
223*6777b538SAndroid Build Coastguard Worker 
helper()224*6777b538SAndroid Build Coastguard Worker   quic::QuicConnectionHelperInterface* helper() { return helper_.get(); }
clock()225*6777b538SAndroid Build Coastguard Worker   const quic::QuicClock* clock() { return helper_->GetClock(); }
random_generator()226*6777b538SAndroid Build Coastguard Worker   quic::QuicRandom* random_generator() { return helper_->GetRandomGenerator(); }
227*6777b538SAndroid Build Coastguard Worker 
params()228*6777b538SAndroid Build Coastguard Worker   QuicParams* params() { return &params_; }
GetDefaultVersion()229*6777b538SAndroid Build Coastguard Worker   quic::ParsedQuicVersion GetDefaultVersion() {
230*6777b538SAndroid Build Coastguard Worker     return params_.supported_versions[0];
231*6777b538SAndroid Build Coastguard Worker   }
supported_versions()232*6777b538SAndroid Build Coastguard Worker   const quic::ParsedQuicVersionVector& supported_versions() {
233*6777b538SAndroid Build Coastguard Worker     return params_.supported_versions;
234*6777b538SAndroid Build Coastguard Worker   }
235*6777b538SAndroid Build Coastguard Worker 
SetHelperForTesting(std::unique_ptr<quic::QuicConnectionHelperInterface> helper)236*6777b538SAndroid Build Coastguard Worker   void SetHelperForTesting(
237*6777b538SAndroid Build Coastguard Worker       std::unique_ptr<quic::QuicConnectionHelperInterface> helper) {
238*6777b538SAndroid Build Coastguard Worker     helper_ = std::move(helper);
239*6777b538SAndroid Build Coastguard Worker   }
240*6777b538SAndroid Build Coastguard Worker 
241*6777b538SAndroid Build Coastguard Worker  private:
242*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<quic::QuicConnectionHelperInterface> helper_;
243*6777b538SAndroid Build Coastguard Worker 
244*6777b538SAndroid Build Coastguard Worker   QuicParams params_;
245*6777b538SAndroid Build Coastguard Worker };
246*6777b538SAndroid Build Coastguard Worker 
247*6777b538SAndroid Build Coastguard Worker // Initializes QuicConfig based on the specified parameters.
248*6777b538SAndroid Build Coastguard Worker quic::QuicConfig InitializeQuicConfig(const QuicParams& params);
249*6777b538SAndroid Build Coastguard Worker 
250*6777b538SAndroid Build Coastguard Worker // Configures QuicCryptoClientConfig with Chromium-specific settings.
251*6777b538SAndroid Build Coastguard Worker void ConfigureQuicCryptoClientConfig(
252*6777b538SAndroid Build Coastguard Worker     quic::QuicCryptoClientConfig& crypto_config);
253*6777b538SAndroid Build Coastguard Worker 
254*6777b538SAndroid Build Coastguard Worker }  // namespace net
255*6777b538SAndroid Build Coastguard Worker 
256*6777b538SAndroid Build Coastguard Worker #endif  // NET_QUIC_QUIC_CONTEXT_H_
257