• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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() == 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()66 void 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)90 void QuicVersionManager::AddCustomAlpn(const std::string& alpn) {
91   filtered_supported_alpns_.push_back(alpn);
92 }
93 
94 }  // namespace quic
95