blob: 1d4dcca70e4b6db28586a5d0b7c30addff982003 [file] [log] [blame]
QUICHE teama6ef0a62019-03-07 20:34:33 -05001// 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 team5be974e2020-12-29 18:35:24 -05005#include "quic/core/quic_version_manager.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -05006
bnc4e9283d2019-12-17 07:08:57 -08007#include <algorithm>
8
vasilvvbed67c62020-10-20 06:38:43 -07009#include "absl/base/macros.h"
QUICHE team5be974e2020-12-29 18:35:24 -050010#include "quic/core/quic_versions.h"
11#include "quic/platform/api/quic_flag_utils.h"
12#include "quic/platform/api/quic_flags.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050013
14namespace quic {
15
16QuicVersionManager::QuicVersionManager(
17 ParsedQuicVersionVector supported_versions)
dschinazi869e4342021-02-01 15:41:46 -080018 : enable_version_rfcv1_(GetQuicReloadableFlag(quic_enable_version_rfcv1)),
19 disable_version_draft_29_(
dschinazi30326412020-07-28 04:32:35 -070020 GetQuicReloadableFlag(quic_disable_version_draft_29)),
dschinazie2896c82020-09-14 11:04:13 -070021 disable_version_t051_(GetQuicReloadableFlag(quic_disable_version_t051)),
dschinazi47692202020-07-30 11:09:42 -070022 disable_version_q050_(GetQuicReloadableFlag(quic_disable_version_q050)),
dschinazi76881f02019-12-09 14:56:14 -080023 disable_version_q046_(GetQuicReloadableFlag(quic_disable_version_q046)),
24 disable_version_q043_(GetQuicReloadableFlag(quic_disable_version_q043)),
QUICHE teama6ef0a62019-03-07 20:34:33 -050025 allowed_supported_versions_(std::move(supported_versions)) {
dschinazi869e4342021-02-01 15:41:46 -080026 static_assert(SupportedVersions().size() == 6u,
dschinazic73506e2019-09-20 13:26:46 -070027 "Supported versions out of sync");
QUICHE teama6ef0a62019-03-07 20:34:33 -050028 RefilterSupportedVersions();
29}
30
31QuicVersionManager::~QuicVersionManager() {}
32
QUICHE teama6ef0a62019-03-07 20:34:33 -050033const ParsedQuicVersionVector& QuicVersionManager::GetSupportedVersions() {
34 MaybeRefilterSupportedVersions();
35 return filtered_supported_versions_;
36}
37
fayange4524052020-04-03 09:09:20 -070038const ParsedQuicVersionVector&
39QuicVersionManager::GetSupportedVersionsWithQuicCrypto() {
40 MaybeRefilterSupportedVersions();
41 return filtered_supported_versions_with_quic_crypto_;
42}
43
dschinazi71116fd2020-04-22 16:07:04 -070044const std::vector<std::string>& QuicVersionManager::GetSupportedAlpns() {
45 MaybeRefilterSupportedVersions();
46 return filtered_supported_alpns_;
47}
48
QUICHE teama6ef0a62019-03-07 20:34:33 -050049void QuicVersionManager::MaybeRefilterSupportedVersions() {
dschinazi869e4342021-02-01 15:41:46 -080050 static_assert(SupportedVersions().size() == 6u,
dschinazic73506e2019-09-20 13:26:46 -070051 "Supported versions out of sync");
dschinazi869e4342021-02-01 15:41:46 -080052 if (enable_version_rfcv1_ !=
53 GetQuicReloadableFlag(quic_enable_version_rfcv1) ||
54 disable_version_draft_29_ !=
dschinazi30326412020-07-28 04:32:35 -070055 GetQuicReloadableFlag(quic_disable_version_draft_29) ||
dschinazie2896c82020-09-14 11:04:13 -070056 disable_version_t051_ !=
57 GetQuicReloadableFlag(quic_disable_version_t051) ||
dschinazi47692202020-07-30 11:09:42 -070058 disable_version_q050_ !=
59 GetQuicReloadableFlag(quic_disable_version_q050) ||
dschinazi76881f02019-12-09 14:56:14 -080060 disable_version_q046_ !=
61 GetQuicReloadableFlag(quic_disable_version_q046) ||
62 disable_version_q043_ !=
63 GetQuicReloadableFlag(quic_disable_version_q043)) {
dschinazi869e4342021-02-01 15:41:46 -080064 enable_version_rfcv1_ = GetQuicReloadableFlag(quic_enable_version_rfcv1);
dschinazi30326412020-07-28 04:32:35 -070065 disable_version_draft_29_ =
66 GetQuicReloadableFlag(quic_disable_version_draft_29);
dschinazie2896c82020-09-14 11:04:13 -070067 disable_version_t051_ = GetQuicReloadableFlag(quic_disable_version_t051);
dschinazi47692202020-07-30 11:09:42 -070068 disable_version_q050_ = GetQuicReloadableFlag(quic_disable_version_q050);
dschinazi76881f02019-12-09 14:56:14 -080069 disable_version_q046_ = GetQuicReloadableFlag(quic_disable_version_q046);
70 disable_version_q043_ = GetQuicReloadableFlag(quic_disable_version_q043);
71
QUICHE teama6ef0a62019-03-07 20:34:33 -050072 RefilterSupportedVersions();
73 }
74}
75
76void QuicVersionManager::RefilterSupportedVersions() {
77 filtered_supported_versions_ =
78 FilterSupportedVersions(allowed_supported_versions_);
fayange4524052020-04-03 09:09:20 -070079 filtered_supported_versions_with_quic_crypto_.clear();
QUICHE teama6ef0a62019-03-07 20:34:33 -050080 filtered_transport_versions_.clear();
dschinazi71116fd2020-04-22 16:07:04 -070081 filtered_supported_alpns_.clear();
82 for (const ParsedQuicVersion& version : filtered_supported_versions_) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050083 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 }
fayange4524052020-04-03 09:09:20 -070089 if (version.handshake_protocol == PROTOCOL_QUIC_CRYPTO) {
90 filtered_supported_versions_with_quic_crypto_.push_back(version);
91 }
dschinazi71116fd2020-04-22 16:07:04 -070092 filtered_supported_alpns_.emplace_back(AlpnForVersion(version));
QUICHE teama6ef0a62019-03-07 20:34:33 -050093 }
94}
95
dschinazi71116fd2020-04-22 16:07:04 -070096void QuicVersionManager::AddCustomAlpn(const std::string& alpn) {
97 filtered_supported_alpns_.push_back(alpn);
98}
99
QUICHE teama6ef0a62019-03-07 20:34:33 -0500100} // namespace quic