• 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() == 5u,
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_q050_ !=
48           GetQuicReloadableFlag(quic_disable_version_q050) ||
49       disable_version_q046_ !=
50           GetQuicReloadableFlag(quic_disable_version_q046)) {
51     enable_version_2_draft_08_ =
52         GetQuicReloadableFlag(quic_enable_version_rfcv2);
53     disable_version_rfcv1_ = GetQuicReloadableFlag(quic_disable_version_rfcv1);
54     disable_version_draft_29_ =
55         GetQuicReloadableFlag(quic_disable_version_draft_29);
56     disable_version_q050_ = GetQuicReloadableFlag(quic_disable_version_q050);
57     disable_version_q046_ = GetQuicReloadableFlag(quic_disable_version_q046);
58 
59     RefilterSupportedVersions();
60   }
61 }
62 
RefilterSupportedVersions()63 void QuicVersionManager::RefilterSupportedVersions() {
64   filtered_supported_versions_ =
65       FilterSupportedVersions(allowed_supported_versions_);
66   filtered_supported_versions_with_http3_.clear();
67   filtered_transport_versions_.clear();
68   filtered_supported_alpns_.clear();
69   for (const ParsedQuicVersion& version : filtered_supported_versions_) {
70     auto transport_version = version.transport_version;
71     if (std::find(filtered_transport_versions_.begin(),
72                   filtered_transport_versions_.end(),
73                   transport_version) == filtered_transport_versions_.end()) {
74       filtered_transport_versions_.push_back(transport_version);
75     }
76     if (version.UsesHttp3()) {
77       filtered_supported_versions_with_http3_.push_back(version);
78     }
79     if (std::find(filtered_supported_alpns_.begin(),
80                   filtered_supported_alpns_.end(),
81                   AlpnForVersion(version)) == filtered_supported_alpns_.end()) {
82       filtered_supported_alpns_.emplace_back(AlpnForVersion(version));
83     }
84   }
85 }
86 
AddCustomAlpn(const std::string & alpn)87 void QuicVersionManager::AddCustomAlpn(const std::string& alpn) {
88   filtered_supported_alpns_.push_back(alpn);
89 }
90 
91 }  // namespace quic
92