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 5 #include "quiche/quic/core/quic_version_manager.h" 6 7 #include <algorithm> 8 9 #include "absl/base/macros.h" 10 #include "quiche/quic/core/quic_versions.h" 11 #include "quiche/quic/platform/api/quic_flag_utils.h" 12 #include "quiche/quic/platform/api/quic_flags.h" 13 14 namespace quic { 15 QuicVersionManager(ParsedQuicVersionVector supported_versions)16QuicVersionManager::QuicVersionManager( 17 ParsedQuicVersionVector supported_versions) 18 : allowed_supported_versions_(std::move(supported_versions)) {} 19 ~QuicVersionManager()20QuicVersionManager::~QuicVersionManager() {} 21 GetSupportedVersions()22const ParsedQuicVersionVector& QuicVersionManager::GetSupportedVersions() { 23 MaybeRefilterSupportedVersions(); 24 return filtered_supported_versions_; 25 } 26 27 const ParsedQuicVersionVector& GetSupportedVersionsWithOnlyHttp3()28QuicVersionManager::GetSupportedVersionsWithOnlyHttp3() { 29 MaybeRefilterSupportedVersions(); 30 return filtered_supported_versions_with_http3_; 31 } 32 GetSupportedAlpns()33const std::vector<std::string>& QuicVersionManager::GetSupportedAlpns() { 34 MaybeRefilterSupportedVersions(); 35 return filtered_supported_alpns_; 36 } 37 MaybeRefilterSupportedVersions()38void QuicVersionManager::MaybeRefilterSupportedVersions() { 39 static_assert(SupportedVersions().size() == 6u, 40 "Supported versions out of sync"); 41 if (enable_version_2_draft_08_ != 42 GetQuicReloadableFlag(quic_enable_version_2_draft_08) || 43 disable_version_rfcv1_ != 44 GetQuicReloadableFlag(quic_disable_version_rfcv1) || 45 disable_version_draft_29_ != 46 GetQuicReloadableFlag(quic_disable_version_draft_29) || 47 disable_version_q050_ != 48 GetQuicReloadableFlag(quic_disable_version_q050) || 49 disable_version_q046_ != 50 GetQuicReloadableFlag(quic_disable_version_q046) || 51 disable_version_q043_ != 52 GetQuicReloadableFlag(quic_disable_version_q043)) { 53 enable_version_2_draft_08_ = 54 GetQuicReloadableFlag(quic_enable_version_2_draft_08); 55 disable_version_rfcv1_ = GetQuicReloadableFlag(quic_disable_version_rfcv1); 56 disable_version_draft_29_ = 57 GetQuicReloadableFlag(quic_disable_version_draft_29); 58 disable_version_q050_ = GetQuicReloadableFlag(quic_disable_version_q050); 59 disable_version_q046_ = GetQuicReloadableFlag(quic_disable_version_q046); 60 disable_version_q043_ = GetQuicReloadableFlag(quic_disable_version_q043); 61 62 RefilterSupportedVersions(); 63 } 64 } 65 RefilterSupportedVersions()66void QuicVersionManager::RefilterSupportedVersions() { 67 filtered_supported_versions_ = 68 FilterSupportedVersions(allowed_supported_versions_); 69 filtered_supported_versions_with_http3_.clear(); 70 filtered_transport_versions_.clear(); 71 filtered_supported_alpns_.clear(); 72 for (const ParsedQuicVersion& version : filtered_supported_versions_) { 73 auto transport_version = version.transport_version; 74 if (std::find(filtered_transport_versions_.begin(), 75 filtered_transport_versions_.end(), 76 transport_version) == filtered_transport_versions_.end()) { 77 filtered_transport_versions_.push_back(transport_version); 78 } 79 if (version.UsesHttp3()) { 80 filtered_supported_versions_with_http3_.push_back(version); 81 } 82 if (std::find(filtered_supported_alpns_.begin(), 83 filtered_supported_alpns_.end(), 84 AlpnForVersion(version)) == filtered_supported_alpns_.end()) { 85 filtered_supported_alpns_.emplace_back(AlpnForVersion(version)); 86 } 87 } 88 } 89 AddCustomAlpn(const std::string & alpn)90void QuicVersionManager::AddCustomAlpn(const std::string& alpn) { 91 filtered_supported_alpns_.push_back(alpn); 92 } 93 94 } // namespace quic 95