• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2019 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "net/quic/quic_context.h"
6 
7 #include "base/containers/contains.h"
8 #include "net/quic/platform/impl/quic_chromium_clock.h"
9 #include "net/quic/quic_chromium_connection_helper.h"
10 #include "net/ssl/cert_compression.h"
11 #include "net/ssl/ssl_key_logger.h"
12 #include "net/third_party/quiche/src/quiche/quic/core/crypto/crypto_protocol.h"
13 #include "net/third_party/quiche/src/quiche/quic/core/crypto/quic_random.h"
14 #include "net/third_party/quiche/src/quiche/quic/core/quic_constants.h"
15 
16 namespace net {
17 
18 namespace {
19 
20 // The maximum receive window sizes for QUIC sessions and streams.
21 const int32_t kQuicSessionMaxRecvWindowSize = 15 * 1024 * 1024;  // 15 MB
22 const int32_t kQuicStreamMaxRecvWindowSize = 6 * 1024 * 1024;    // 6 MB
23 
24 // Set the maximum number of undecryptable packets the connection will store.
25 const int32_t kMaxUndecryptablePackets = 100;
26 
27 }  // namespace
28 
29 QuicParams::QuicParams() = default;
30 
31 QuicParams::QuicParams(const QuicParams& other) = default;
32 
33 QuicParams::~QuicParams() = default;
34 
QuicContext()35 QuicContext::QuicContext()
36     : QuicContext(std::make_unique<QuicChromiumConnectionHelper>(
37           quic::QuicChromiumClock::GetInstance(),
38           quic::QuicRandom::GetInstance())) {}
39 
QuicContext(std::unique_ptr<quic::QuicConnectionHelperInterface> helper)40 QuicContext::QuicContext(
41     std::unique_ptr<quic::QuicConnectionHelperInterface> helper)
42     : helper_(std::move(helper)) {}
43 
44 QuicContext::~QuicContext() = default;
45 
SelectQuicVersion(const quic::ParsedQuicVersionVector & advertised_versions)46 quic::ParsedQuicVersion QuicContext::SelectQuicVersion(
47     const quic::ParsedQuicVersionVector& advertised_versions) {
48   const quic::ParsedQuicVersionVector& supported_versions =
49       params()->supported_versions;
50   if (advertised_versions.empty()) {
51     return supported_versions[0];
52   }
53 
54   for (const quic::ParsedQuicVersion& advertised : advertised_versions) {
55     for (const quic::ParsedQuicVersion& supported : supported_versions) {
56       if (supported == advertised) {
57         DCHECK_NE(quic::ParsedQuicVersion::Unsupported(), supported);
58         return supported;
59       }
60     }
61   }
62 
63   return quic::ParsedQuicVersion::Unsupported();
64 }
65 
InitializeQuicConfig(const QuicParams & params)66 quic::QuicConfig InitializeQuicConfig(const QuicParams& params) {
67   DCHECK_GT(params.idle_connection_timeout, base::TimeDelta());
68   quic::QuicConfig config;
69   config.SetIdleNetworkTimeout(
70       quic::QuicTime::Delta::FromMicroseconds(
71           params.idle_connection_timeout.InMicroseconds()));
72   config.set_max_time_before_crypto_handshake(
73       quic::QuicTime::Delta::FromMicroseconds(
74           params.max_time_before_crypto_handshake.InMicroseconds()));
75   config.set_max_idle_time_before_crypto_handshake(
76       quic::QuicTime::Delta::FromMicroseconds(
77           params.max_idle_time_before_crypto_handshake.InMicroseconds()));
78   config.SetConnectionOptionsToSend(params.connection_options);
79   config.SetClientConnectionOptions(params.client_connection_options);
80   config.set_max_undecryptable_packets(kMaxUndecryptablePackets);
81   config.SetInitialSessionFlowControlWindowToSend(
82       kQuicSessionMaxRecvWindowSize);
83   config.SetInitialStreamFlowControlWindowToSend(kQuicStreamMaxRecvWindowSize);
84   config.SetBytesForConnectionIdToSend(0);
85   return config;
86 }
87 
ConfigureQuicCryptoClientConfig(quic::QuicCryptoClientConfig & crypto_config)88 void ConfigureQuicCryptoClientConfig(
89     quic::QuicCryptoClientConfig& crypto_config) {
90   if (SSLKeyLoggerManager::IsActive()) {
91     SSL_CTX_set_keylog_callback(crypto_config.ssl_ctx(),
92                                 SSLKeyLoggerManager::KeyLogCallback);
93   }
94   ConfigureCertificateCompression(crypto_config.ssl_ctx());
95 }
96 
97 }  // namespace net
98