QUICHE team | a6ef0a6 | 2019-03-07 20:34:33 -0500 | [diff] [blame] | 1 | // Copyright (c) 2016 The Chromium Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
QUICHE team | 5be974e | 2020-12-29 18:35:24 -0500 | [diff] [blame] | 5 | #include "quic/core/quic_version_manager.h" |
QUICHE team | a6ef0a6 | 2019-03-07 20:34:33 -0500 | [diff] [blame] | 6 | |
bnc | 4e9283d | 2019-12-17 07:08:57 -0800 | [diff] [blame] | 7 | #include <algorithm> |
| 8 | |
vasilvv | bed67c6 | 2020-10-20 06:38:43 -0700 | [diff] [blame] | 9 | #include "absl/base/macros.h" |
QUICHE team | 5be974e | 2020-12-29 18:35:24 -0500 | [diff] [blame] | 10 | #include "quic/core/quic_versions.h" |
| 11 | #include "quic/platform/api/quic_flag_utils.h" |
| 12 | #include "quic/platform/api/quic_flags.h" |
QUICHE team | a6ef0a6 | 2019-03-07 20:34:33 -0500 | [diff] [blame] | 13 | |
| 14 | namespace quic { |
| 15 | |
| 16 | QuicVersionManager::QuicVersionManager( |
| 17 | ParsedQuicVersionVector supported_versions) |
dschinazi | 869e434 | 2021-02-01 15:41:46 -0800 | [diff] [blame] | 18 | : enable_version_rfcv1_(GetQuicReloadableFlag(quic_enable_version_rfcv1)), |
| 19 | disable_version_draft_29_( |
dschinazi | 3032641 | 2020-07-28 04:32:35 -0700 | [diff] [blame] | 20 | GetQuicReloadableFlag(quic_disable_version_draft_29)), |
dschinazi | e2896c8 | 2020-09-14 11:04:13 -0700 | [diff] [blame] | 21 | disable_version_t051_(GetQuicReloadableFlag(quic_disable_version_t051)), |
dschinazi | 4769220 | 2020-07-30 11:09:42 -0700 | [diff] [blame] | 22 | disable_version_q050_(GetQuicReloadableFlag(quic_disable_version_q050)), |
dschinazi | 76881f0 | 2019-12-09 14:56:14 -0800 | [diff] [blame] | 23 | disable_version_q046_(GetQuicReloadableFlag(quic_disable_version_q046)), |
| 24 | disable_version_q043_(GetQuicReloadableFlag(quic_disable_version_q043)), |
QUICHE team | a6ef0a6 | 2019-03-07 20:34:33 -0500 | [diff] [blame] | 25 | allowed_supported_versions_(std::move(supported_versions)) { |
dschinazi | 869e434 | 2021-02-01 15:41:46 -0800 | [diff] [blame] | 26 | static_assert(SupportedVersions().size() == 6u, |
dschinazi | c73506e | 2019-09-20 13:26:46 -0700 | [diff] [blame] | 27 | "Supported versions out of sync"); |
QUICHE team | a6ef0a6 | 2019-03-07 20:34:33 -0500 | [diff] [blame] | 28 | RefilterSupportedVersions(); |
| 29 | } |
| 30 | |
| 31 | QuicVersionManager::~QuicVersionManager() {} |
| 32 | |
QUICHE team | a6ef0a6 | 2019-03-07 20:34:33 -0500 | [diff] [blame] | 33 | const ParsedQuicVersionVector& QuicVersionManager::GetSupportedVersions() { |
| 34 | MaybeRefilterSupportedVersions(); |
| 35 | return filtered_supported_versions_; |
| 36 | } |
| 37 | |
fayang | e452405 | 2020-04-03 09:09:20 -0700 | [diff] [blame] | 38 | const ParsedQuicVersionVector& |
| 39 | QuicVersionManager::GetSupportedVersionsWithQuicCrypto() { |
| 40 | MaybeRefilterSupportedVersions(); |
| 41 | return filtered_supported_versions_with_quic_crypto_; |
| 42 | } |
| 43 | |
dschinazi | 71116fd | 2020-04-22 16:07:04 -0700 | [diff] [blame] | 44 | const std::vector<std::string>& QuicVersionManager::GetSupportedAlpns() { |
| 45 | MaybeRefilterSupportedVersions(); |
| 46 | return filtered_supported_alpns_; |
| 47 | } |
| 48 | |
QUICHE team | a6ef0a6 | 2019-03-07 20:34:33 -0500 | [diff] [blame] | 49 | void QuicVersionManager::MaybeRefilterSupportedVersions() { |
dschinazi | 869e434 | 2021-02-01 15:41:46 -0800 | [diff] [blame] | 50 | static_assert(SupportedVersions().size() == 6u, |
dschinazi | c73506e | 2019-09-20 13:26:46 -0700 | [diff] [blame] | 51 | "Supported versions out of sync"); |
dschinazi | 869e434 | 2021-02-01 15:41:46 -0800 | [diff] [blame] | 52 | if (enable_version_rfcv1_ != |
| 53 | GetQuicReloadableFlag(quic_enable_version_rfcv1) || |
| 54 | disable_version_draft_29_ != |
dschinazi | 3032641 | 2020-07-28 04:32:35 -0700 | [diff] [blame] | 55 | GetQuicReloadableFlag(quic_disable_version_draft_29) || |
dschinazi | e2896c8 | 2020-09-14 11:04:13 -0700 | [diff] [blame] | 56 | disable_version_t051_ != |
| 57 | GetQuicReloadableFlag(quic_disable_version_t051) || |
dschinazi | 4769220 | 2020-07-30 11:09:42 -0700 | [diff] [blame] | 58 | disable_version_q050_ != |
| 59 | GetQuicReloadableFlag(quic_disable_version_q050) || |
dschinazi | 76881f0 | 2019-12-09 14:56:14 -0800 | [diff] [blame] | 60 | disable_version_q046_ != |
| 61 | GetQuicReloadableFlag(quic_disable_version_q046) || |
| 62 | disable_version_q043_ != |
| 63 | GetQuicReloadableFlag(quic_disable_version_q043)) { |
dschinazi | 869e434 | 2021-02-01 15:41:46 -0800 | [diff] [blame] | 64 | enable_version_rfcv1_ = GetQuicReloadableFlag(quic_enable_version_rfcv1); |
dschinazi | 3032641 | 2020-07-28 04:32:35 -0700 | [diff] [blame] | 65 | disable_version_draft_29_ = |
| 66 | GetQuicReloadableFlag(quic_disable_version_draft_29); |
dschinazi | e2896c8 | 2020-09-14 11:04:13 -0700 | [diff] [blame] | 67 | disable_version_t051_ = GetQuicReloadableFlag(quic_disable_version_t051); |
dschinazi | 4769220 | 2020-07-30 11:09:42 -0700 | [diff] [blame] | 68 | disable_version_q050_ = GetQuicReloadableFlag(quic_disable_version_q050); |
dschinazi | 76881f0 | 2019-12-09 14:56:14 -0800 | [diff] [blame] | 69 | disable_version_q046_ = GetQuicReloadableFlag(quic_disable_version_q046); |
| 70 | disable_version_q043_ = GetQuicReloadableFlag(quic_disable_version_q043); |
| 71 | |
QUICHE team | a6ef0a6 | 2019-03-07 20:34:33 -0500 | [diff] [blame] | 72 | RefilterSupportedVersions(); |
| 73 | } |
| 74 | } |
| 75 | |
| 76 | void QuicVersionManager::RefilterSupportedVersions() { |
| 77 | filtered_supported_versions_ = |
| 78 | FilterSupportedVersions(allowed_supported_versions_); |
fayang | e452405 | 2020-04-03 09:09:20 -0700 | [diff] [blame] | 79 | filtered_supported_versions_with_quic_crypto_.clear(); |
QUICHE team | a6ef0a6 | 2019-03-07 20:34:33 -0500 | [diff] [blame] | 80 | filtered_transport_versions_.clear(); |
dschinazi | 71116fd | 2020-04-22 16:07:04 -0700 | [diff] [blame] | 81 | filtered_supported_alpns_.clear(); |
| 82 | for (const ParsedQuicVersion& version : filtered_supported_versions_) { |
QUICHE team | a6ef0a6 | 2019-03-07 20:34:33 -0500 | [diff] [blame] | 83 | auto transport_version = version.transport_version; |
| 84 | if (std::find(filtered_transport_versions_.begin(), |
| 85 | filtered_transport_versions_.end(), |
| 86 | transport_version) == filtered_transport_versions_.end()) { |
| 87 | filtered_transport_versions_.push_back(transport_version); |
| 88 | } |
fayang | e452405 | 2020-04-03 09:09:20 -0700 | [diff] [blame] | 89 | if (version.handshake_protocol == PROTOCOL_QUIC_CRYPTO) { |
| 90 | filtered_supported_versions_with_quic_crypto_.push_back(version); |
| 91 | } |
dschinazi | 71116fd | 2020-04-22 16:07:04 -0700 | [diff] [blame] | 92 | filtered_supported_alpns_.emplace_back(AlpnForVersion(version)); |
QUICHE team | a6ef0a6 | 2019-03-07 20:34:33 -0500 | [diff] [blame] | 93 | } |
| 94 | } |
| 95 | |
dschinazi | 71116fd | 2020-04-22 16:07:04 -0700 | [diff] [blame] | 96 | void QuicVersionManager::AddCustomAlpn(const std::string& alpn) { |
| 97 | filtered_supported_alpns_.push_back(alpn); |
| 98 | } |
| 99 | |
QUICHE team | a6ef0a6 | 2019-03-07 20:34:33 -0500 | [diff] [blame] | 100 | } // namespace quic |