-
Notifications
You must be signed in to change notification settings - Fork 32
Expand file tree
/
Copy pathMoQVersions.h
More file actions
121 lines (102 loc) · 5.12 KB
/
Copy pathMoQVersions.h
File metadata and controls
121 lines (102 loc) · 5.12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
* This source code is licensed under the Apache 2.0 license found in the
* LICENSE file in the root directory of this source tree.
*/
#pragma once
#include <array>
#include <cstdint>
#include <optional>
#include <string>
#include <string_view>
#include <vector>
namespace moxygen {
constexpr uint64_t kVersionDraft01 = 0xff000001;
constexpr uint64_t kVersionDraft02 = 0xff000002;
constexpr uint64_t kVersionDraft03 = 0xff000003;
constexpr uint64_t kVersionDraft04 = 0xff000004;
constexpr uint64_t kVersionDraft05 = 0xff000005;
constexpr uint64_t kVersionDraft06 = 0xff000006;
constexpr uint64_t kVersionDraft06_exp =
0xff060004; // Draft 6 in progress version
constexpr uint64_t kVersionDraft07 = 0xff000007;
constexpr uint64_t kVersionDraft07_exp = 0xff070001; // Draft 7 FETCH support
constexpr uint64_t kVersionDraft07_exp2 =
0xff070002; // Draft 7 FETCH + removal of Subscribe ID on objects
constexpr uint64_t kVersionDraft08 = 0xff000008;
constexpr uint64_t kVersionDraft08_exp1 = 0xff080001; // Draft 8 no ROLE
// PUBLISH_DONE stream count
constexpr uint64_t kVersionDraft08_exp2 = 0xff080002;
constexpr uint64_t kVersionDraft08_exp3 = 0xff080003; // Draft 8 datagram status
constexpr uint64_t kVersionDraft08_exp4 = 0xff080004; // Draft 8 END_OF_TRACK
constexpr uint64_t kVersionDraft08_exp5 = 0xff080005; // Draft 8 Joining FETCH
constexpr uint64_t kVersionDraft08_exp6 = 0xff080006; // Draft 8 End Group
constexpr uint64_t kVersionDraft08_exp7 = 0xff080007; // Draft 8 Error Codes
constexpr uint64_t kVersionDraft08_exp8 = 0xff080008; // Draft 8 Sub Done codes
constexpr uint64_t kVersionDraft08_exp9 = 0xff080009; // Draft 8 Extensions
constexpr uint64_t kVersionDraft09 = 0xff000009;
constexpr uint64_t kVersionDraft10 = 0xff00000A;
constexpr uint64_t kVersionDraft12 = 0xff00000C;
constexpr uint64_t kVersionDraft13 = 0xff00000D;
constexpr uint64_t kVersionDraft14 = 0xff00000E;
constexpr uint64_t kVersionDraft15 = 0xff00000F;
constexpr uint64_t kVersionDraft16 = 0xff000010;
constexpr uint64_t kVersionDraft17 = 0xff000011;
constexpr uint64_t kVersionDraft18 = 0xff000012;
constexpr uint64_t kVersionDraftCurrent = kVersionDraft14;
// ALPN constants for version negotiation
constexpr std::string_view kAlpnMoqtLegacy = "moq-00";
constexpr std::string_view kAlpnMoqtDraft15Meta00 = "moqt-15-meta-00";
constexpr std::string_view kAlpnMoqtDraft15Meta01 = "moqt-15-meta-01";
constexpr std::string_view kAlpnMoqtDraft15Meta02 = "moqt-15-meta-02";
constexpr std::string_view kAlpnMoqtDraft15Meta03 = "moqt-15-meta-03";
constexpr std::string_view kAlpnMoqtDraft15Meta04 = "moqt-15-meta-04";
constexpr std::string_view kAlpnMoqtDraft15Meta05 = "moqt-15-meta-05";
constexpr std::string_view kAlpnMoqtDraft15Latest = kAlpnMoqtDraft15Meta05;
// ALPN constants for draft 16 version negotiations
constexpr std::string_view kAlpnMoqtDraft16Meta00 = "moqt-16-meta-00";
constexpr std::string_view kAlpnMoqtDraft16Latest = kAlpnMoqtDraft16Meta00;
// ALPN constants for draft 18 (uni control streams)
constexpr std::string_view kAlpnMoqtDraft18 = "moqt-18";
constexpr std::string_view kAlpnMoqtDraft18Latest = kAlpnMoqtDraft18;
constexpr std::array<uint64_t, 4> kSupportedVersions{
kVersionDraft14,
kVersionDraft15,
kVersionDraft16,
kVersionDraft18};
// In the terminology I'm using for this function, each draft has a "major"
// and a "minor" version. For example, kVersionDraft08_exp2 has the major
// version 8 and minor version 2.
uint64_t getDraftMajorVersion(uint64_t version);
// ALPN utility functions
bool isLegacyAlpn(std::string_view alpn);
std::vector<uint64_t> getSupportedLegacyVersions();
std::optional<uint64_t> getVersionFromAlpn(std::string_view alpn);
std::optional<std::string> getAlpnFromVersion(
uint64_t version,
bool useStandard = false);
// Returns the default list of supported MoQT protocols
// includeExperimental: if true, includes experimental/draft protocols
// useStandard: if true, uses standard ALPNs (moqt-NN) instead of Meta-specific
std::vector<std::string> getDefaultMoqtProtocols(
bool includeExperimental = false,
bool useStandard = false);
// Returns a list of MoQT ALPNs for the given draft versions.
// versions: comma-separated draft numbers (e.g. "14,16"). Empty = all
// supported. useStandard: if true, uses standard ALPNs (moqt-NN) instead of
// Meta-specific
std::vector<std::string> getMoqtProtocols(
const std::string& versions = "",
bool useStandard = false);
bool isSupportedVersion(uint64_t version);
// Returns true if the given version uses unidirectional control streams
bool useUniControlStreams(uint64_t version);
// True if each request travels on its own bidi stream (draft >= 18). QUIC
// bidi stream limits govern request flow control (MAX_REQUEST_ID /
// REQUESTS_BLOCKED and the MAX_REQUEST_ID setup parameter were removed in
// draft 18); also disables request-order-dependent encodings (e.g. auth
// token aliasing) and request-frame-on-control-stream patterns.
bool useBidiRequestStreams(uint64_t version);
// Returns a comma-separated list of supported versions, useful for logging.
std::string getSupportedVersionsString();
} // namespace moxygen