xref: /aosp_15_r20/external/cronet/net/third_party/quiche/src/quiche/quic/core/quic_version_manager.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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)16 QuicVersionManager::QuicVersionManager(
17     ParsedQuicVersionVector supported_versions)
18     : allowed_supported_versions_(std::move(supported_versions)) {}
19 
~QuicVersionManager()20 QuicVersionManager::~QuicVersionManager() {}
21 
GetSupportedVersions()22 const ParsedQuicVersionVector& QuicVersionManager::GetSupportedVersions() {
23   MaybeRefilterSupportedVersions();
24   return filtered_supported_versions_;
25 }
26 
27 const ParsedQuicVersionVector&
GetSupportedVersionsWithOnlyHttp3()28 QuicVersionManager::GetSupportedVersionsWithOnlyHttp3() {
29   MaybeRefilterSupportedVersions();
30   return filtered_supported_versions_with_http3_;
31 }
32 
GetSupportedAlpns()33 const std::vector<std::string>& QuicVersionManager::GetSupportedAlpns() {
34   MaybeRefilterSupportedVersions();
35   return filtered_supported_alpns_;
36 }
37 
MaybeRefilterSupportedVersions()38 void QuicVersionManager::MaybeRefilterSupportedVersions() {
39   static_assert(SupportedVersions().size() == 4u,
40                 "Supported versions out of sync");
41   if (enable_version_2_draft_08_ !=
42           GetQuicReloadableFlag(quic_enable_version_rfcv2) ||
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_q046_ !=
48           GetQuicReloadableFlag(quic_disable_version_q046)) {
49     enable_version_2_draft_08_ =
50         GetQuicReloadableFlag(quic_enable_version_rfcv2);
51     disable_version_rfcv1_ = GetQuicReloadableFlag(quic_disable_version_rfcv1);
52     disable_version_draft_29_ =
53         GetQuicReloadableFlag(quic_disable_version_draft_29);
54     disable_version_q046_ = GetQuicReloadableFlag(quic_disable_version_q046);
55 
56     RefilterSupportedVersions();
57   }
58 }
59 
RefilterSupportedVersions()60 void QuicVersionManager::RefilterSupportedVersions() {
61   filtered_supported_versions_ =
62       FilterSupportedVersions(allowed_supported_versions_);
63   filtered_supported_versions_with_http3_.clear();
64   filtered_transport_versions_.clear();
65   filtered_supported_alpns_.clear();
66   for (const ParsedQuicVersion& version : filtered_supported_versions_) {
67     auto transport_version = version.transport_version;
68     if (std::find(filtered_transport_versions_.begin(),
69                   filtered_transport_versions_.end(),
70                   transport_version) == filtered_transport_versions_.end()) {
71       filtered_transport_versions_.push_back(transport_version);
72     }
73     if (version.UsesHttp3()) {
74       filtered_supported_versions_with_http3_.push_back(version);
75     }
76     if (std::find(filtered_supported_alpns_.begin(),
77                   filtered_supported_alpns_.end(),
78                   AlpnForVersion(version)) == filtered_supported_alpns_.end()) {
79       filtered_supported_alpns_.emplace_back(AlpnForVersion(version));
80     }
81   }
82 }
83 
AddCustomAlpn(const std::string & alpn)84 void QuicVersionManager::AddCustomAlpn(const std::string& alpn) {
85   filtered_supported_alpns_.push_back(alpn);
86 }
87 
88 }  // namespace quic
89