Skip to content

Commit 686a55a

Browse files
Aman Sharmameta-codesync[bot]
authored andcommitted
Create MOQTSetupParameters
Summary: In this commit, I'm creating the MOQTSetupParameters, in order to bring our implementation closer to the mLog specification (https://lpardue.github.io/draft-pardue-moq-qlog-moq-events/draft-pardue-moq-qlog-moq-events.html) Reviewed By: sandarsh Differential Revision: D88975026 fbshipit-source-id: 66a15e09c57a8df51c12c9b9b2e017678a4b3390
1 parent 1b6213a commit 686a55a

File tree

4 files changed

+270
-31
lines changed

4 files changed

+270
-31
lines changed

moxygen/mlog/MLogTypes.cpp

Lines changed: 113 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -37,32 +37,36 @@ folly::dynamic MOQTControlMessageParsed::toDynamic() const {
3737
folly::dynamic MOQTClientSetupMessage::toDynamic() const {
3838
folly::dynamic clientSetupObj = folly::dynamic::object;
3939
clientSetupObj["type"] = type;
40-
clientSetupObj["numberOfSupportedVersions"] = numberOfSupportedVersions;
41-
clientSetupObj["supportedVersions"] =
40+
clientSetupObj["number_of_supported_versions"] = numberOfSupportedVersions;
41+
clientSetupObj["supported_versions"] =
4242
folly::dynamic::array(supportedVersions.begin(), supportedVersions.end());
43-
clientSetupObj["numberOfParameters"] = numberOfParameters;
43+
clientSetupObj["number_of_parameters"] = numberOfParameters;
4444

45-
std::vector<folly::dynamic> paramObjects;
46-
paramObjects.reserve(setupParameters.size());
47-
for (auto& param : setupParameters) {
48-
paramObjects.push_back(param.toDynamic());
45+
if (!setupParameters.empty()) {
46+
std::vector<folly::dynamic> paramObjects;
47+
paramObjects.reserve(setupParameters.size());
48+
for (const auto& param : setupParameters) {
49+
paramObjects.push_back(setupParameterToDynamic(param));
50+
}
51+
clientSetupObj["setup_parameters"] = folly::dynamic::array(paramObjects);
4952
}
50-
clientSetupObj["setupParameters"] = folly::dynamic::array(paramObjects);
5153
return clientSetupObj;
5254
}
5355

5456
folly::dynamic MOQTServerSetupMessage::toDynamic() const {
5557
folly::dynamic serverSetupObj = folly::dynamic::object;
5658
serverSetupObj["type"] = type;
57-
serverSetupObj["selectedVersion"] = selectedVersion;
58-
serverSetupObj["numberOfParameters"] = numberOfParameters;
59+
serverSetupObj["selected_version"] = selectedVersion;
60+
serverSetupObj["number_of_parameters"] = numberOfParameters;
5961

60-
std::vector<folly::dynamic> paramObjects;
61-
paramObjects.reserve(setupParameters.size());
62-
for (auto& param : setupParameters) {
63-
paramObjects.push_back(param.toDynamic());
62+
if (!setupParameters.empty()) {
63+
std::vector<folly::dynamic> paramObjects;
64+
paramObjects.reserve(setupParameters.size());
65+
for (const auto& param : setupParameters) {
66+
paramObjects.push_back(setupParameterToDynamic(param));
67+
}
68+
serverSetupObj["setup_parameters"] = folly::dynamic::array(paramObjects);
6469
}
65-
serverSetupObj["setupParameters"] = folly::dynamic::array(paramObjects);
6670
return serverSetupObj;
6771
}
6872

@@ -81,6 +85,100 @@ folly::dynamic MOQTParameter::toDynamic() const {
8185
return obj;
8286
}
8387

88+
// Setup Parameter toDynamic implementations
89+
folly::dynamic MOQTAuthoritySetupParameter::toDynamic() const {
90+
folly::dynamic obj = folly::dynamic::object;
91+
obj["name"] = name;
92+
obj["value"] = value;
93+
return obj;
94+
}
95+
96+
folly::dynamic MOQTAuthorizationTokenSetupParameter::toDynamic() const {
97+
folly::dynamic obj = folly::dynamic::object;
98+
obj["name"] = name;
99+
100+
std::string aliasTypeStr;
101+
switch (aliasType) {
102+
case MOQTAliasType::DELETE:
103+
aliasTypeStr = "delete";
104+
break;
105+
case MOQTAliasType::REGISTER:
106+
aliasTypeStr = "register";
107+
break;
108+
case MOQTAliasType::USE_ALIAS:
109+
aliasTypeStr = "use_alias";
110+
break;
111+
case MOQTAliasType::USE_VALUE:
112+
aliasTypeStr = "use_value";
113+
break;
114+
}
115+
obj["alias_type"] = aliasTypeStr;
116+
117+
if (tokenAlias.hasValue()) {
118+
obj["token_alias"] = tokenAlias.value();
119+
}
120+
if (tokenType.hasValue()) {
121+
obj["token_type"] = tokenType.value();
122+
}
123+
if (tokenValue) {
124+
obj["token_value"] = std::string(
125+
reinterpret_cast<const char*>(tokenValue->data()),
126+
tokenValue->length());
127+
}
128+
return obj;
129+
}
130+
131+
folly::dynamic MOQTPathSetupParameter::toDynamic() const {
132+
folly::dynamic obj = folly::dynamic::object;
133+
obj["name"] = name;
134+
obj["value"] = value;
135+
return obj;
136+
}
137+
138+
folly::dynamic MOQTMaxRequestIdSetupParameter::toDynamic() const {
139+
folly::dynamic obj = folly::dynamic::object;
140+
obj["name"] = name;
141+
obj["value"] = value;
142+
return obj;
143+
}
144+
145+
folly::dynamic MOQTMaxAuthTokenCacheSizeSetupParameter::toDynamic() const {
146+
folly::dynamic obj = folly::dynamic::object;
147+
obj["name"] = name;
148+
obj["value"] = value;
149+
return obj;
150+
}
151+
152+
folly::dynamic MOQTImplementationSetupParameter::toDynamic() const {
153+
folly::dynamic obj = folly::dynamic::object;
154+
obj["name"] = name;
155+
obj["value"] = value;
156+
return obj;
157+
}
158+
159+
folly::dynamic MOQTUnknownSetupParameter::toDynamic() const {
160+
folly::dynamic obj = folly::dynamic::object;
161+
obj["name"] = name;
162+
obj["name_bytes"] = nameBytes;
163+
if (length.hasValue()) {
164+
obj["length"] = length.value();
165+
}
166+
if (value.hasValue()) {
167+
obj["value"] = value.value();
168+
}
169+
if (valueBytes) {
170+
obj["value_bytes"] = std::string(
171+
reinterpret_cast<const char*>(valueBytes->data()),
172+
valueBytes->length());
173+
}
174+
return obj;
175+
}
176+
177+
folly::dynamic setupParameterToDynamic(const MOQTSetupParameter& param) {
178+
return std::visit(
179+
[](const auto& p) -> folly::dynamic { return p.toDynamic(); }, param);
180+
}
181+
84182
folly::dynamic MOQTLocation::toDynamic() const {
85183
folly::dynamic obj = folly::dynamic::object;
86184
obj["group"] = group;

moxygen/mlog/MLogTypes.h

Lines changed: 73 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
#include <cstdint>
1212
#include <string>
13+
#include <variant>
1314
#include <vector>
1415
#include "folly/Optional.h"
1516
#include "folly/io/IOBuf.h"
@@ -63,6 +64,76 @@ class MOQTParameter {
6364
folly::dynamic toDynamic() const;
6465
};
6566

67+
// Setup Parameter Types (Section 5.2 of the mLog spec)
68+
enum MOQTAliasType { DELETE, REGISTER, USE_ALIAS, USE_VALUE };
69+
70+
struct MOQTAuthoritySetupParameter {
71+
std::string name = "authority";
72+
std::string value;
73+
74+
folly::dynamic toDynamic() const;
75+
};
76+
77+
struct MOQTAuthorizationTokenSetupParameter {
78+
std::string name = "authorization_token";
79+
MOQTAliasType aliasType;
80+
folly::Optional<uint64_t> tokenAlias;
81+
folly::Optional<uint64_t> tokenType;
82+
std::unique_ptr<folly::IOBuf> tokenValue;
83+
84+
folly::dynamic toDynamic() const;
85+
};
86+
87+
struct MOQTPathSetupParameter {
88+
std::string name = "path";
89+
std::string value;
90+
91+
folly::dynamic toDynamic() const;
92+
};
93+
94+
struct MOQTMaxRequestIdSetupParameter {
95+
std::string name = "max_request_id";
96+
uint64_t value{0};
97+
98+
folly::dynamic toDynamic() const;
99+
};
100+
101+
struct MOQTMaxAuthTokenCacheSizeSetupParameter {
102+
std::string name = "max_auth_token_cache_size";
103+
uint64_t value{0};
104+
105+
folly::dynamic toDynamic() const;
106+
};
107+
108+
struct MOQTImplementationSetupParameter {
109+
std::string name = "implementation";
110+
std::string value;
111+
112+
folly::dynamic toDynamic() const;
113+
};
114+
115+
struct MOQTUnknownSetupParameter {
116+
std::string name = "unknown";
117+
uint64_t nameBytes{0};
118+
folly::Optional<uint64_t> length;
119+
folly::Optional<uint64_t> value;
120+
std::unique_ptr<folly::IOBuf> valueBytes;
121+
122+
folly::dynamic toDynamic() const;
123+
};
124+
125+
using MOQTSetupParameter = std::variant<
126+
MOQTAuthoritySetupParameter,
127+
MOQTAuthorizationTokenSetupParameter,
128+
MOQTPathSetupParameter,
129+
MOQTMaxRequestIdSetupParameter,
130+
MOQTMaxAuthTokenCacheSizeSetupParameter,
131+
MOQTImplementationSetupParameter,
132+
MOQTUnknownSetupParameter>;
133+
134+
// Helper to convert variant to dynamic
135+
folly::dynamic setupParameterToDynamic(const MOQTSetupParameter& param);
136+
66137
enum MOQTByteStringType { STRING_VALUE, VALUE_BYTES, UNKNOWN_VALUE };
67138
struct MOQTByteString {
68139
std::string value;
@@ -105,7 +176,7 @@ class MOQTClientSetupMessage : public MOQTBaseControlMessage {
105176
uint64_t numberOfSupportedVersions{0};
106177
std::vector<uint64_t> supportedVersions;
107178
uint64_t numberOfParameters{0};
108-
std::vector<MOQTParameter> setupParameters;
179+
std::vector<MOQTSetupParameter> setupParameters;
109180
};
110181

111182
class MOQTServerSetupMessage : public MOQTBaseControlMessage {
@@ -116,7 +187,7 @@ class MOQTServerSetupMessage : public MOQTBaseControlMessage {
116187
folly::dynamic toDynamic() const override;
117188
uint64_t selectedVersion{0};
118189
uint64_t numberOfParameters{0};
119-
std::vector<MOQTParameter> setupParameters;
190+
std::vector<MOQTSetupParameter> setupParameters;
120191
};
121192

122193
class MOQTGoaway : public MOQTBaseControlMessage {

moxygen/mlog/MLogger.cpp

Lines changed: 80 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ MOQTClientSetupMessage MLogger::createClientSetupControlMessage(
9898
uint64_t numberOfSupportedVersions,
9999
std::vector<uint64_t> supportedVersions,
100100
uint64_t numberOfParameters,
101-
std::vector<MOQTParameter> params) {
101+
std::vector<MOQTSetupParameter> params) {
102102
MOQTClientSetupMessage client;
103103
client.numberOfSupportedVersions = numberOfSupportedVersions;
104104
client.supportedVersions = std::move(supportedVersions);
@@ -110,7 +110,7 @@ MOQTClientSetupMessage MLogger::createClientSetupControlMessage(
110110
MOQTServerSetupMessage MLogger::createServerSetupControlMessage(
111111
uint64_t selectedVersion,
112112
uint64_t number_of_parameters,
113-
std::vector<MOQTParameter> params) {
113+
std::vector<MOQTSetupParameter> params) {
114114
MOQTServerSetupMessage server;
115115
server.selectedVersion = selectedVersion;
116116
server.numberOfParameters = number_of_parameters;
@@ -189,12 +189,15 @@ void MLogger::logClientSetup(
189189
std::vector<uint64_t> versions = setup.supportedVersions;
190190

191191
// Add Params to params vector
192-
std::vector<MOQTParameter> params =
193-
convertSetupParamsToMoQTParams(setup.params);
192+
std::vector<MOQTSetupParameter> params =
193+
convertSetupParamsToMoQTSetupParams(setup.params);
194+
195+
auto msg = std::make_unique<MOQTClientSetupMessage>();
196+
msg->numberOfSupportedVersions = versions.size();
197+
msg->supportedVersions = std::move(versions);
198+
msg->numberOfParameters = params.size();
199+
msg->setupParameters = std::move(params);
194200

195-
std::unique_ptr<MOQTBaseControlMessage> msg =
196-
std::make_unique<MOQTClientSetupMessage>(createClientSetupControlMessage(
197-
versions.size(), versions, params.size(), params));
198201
logControlMessage(
199202
controlType, kFirstBidiStreamId, folly::none, std::move(msg));
200203
}
@@ -203,11 +206,14 @@ void MLogger::logServerSetup(
203206
const ServerSetup& setup,
204207
ControlMessageType controlType) {
205208
// Add Params to params vector
206-
std::vector<MOQTParameter> params =
207-
convertSetupParamsToMoQTParams(setup.params);
208-
std::unique_ptr<MOQTBaseControlMessage> msg =
209-
std::make_unique<MOQTServerSetupMessage>(createServerSetupControlMessage(
210-
setup.selectedVersion, params.size(), params));
209+
std::vector<MOQTSetupParameter> params =
210+
convertSetupParamsToMoQTSetupParams(setup.params);
211+
212+
auto msg = std::make_unique<MOQTServerSetupMessage>();
213+
msg->selectedVersion = setup.selectedVersion;
214+
msg->numberOfParameters = params.size();
215+
msg->setupParameters = std::move(params);
216+
211217
logControlMessage(
212218
controlType, kFirstBidiStreamId, folly::none, std::move(msg));
213219
}
@@ -760,6 +766,68 @@ std::vector<MOQTParameter> MLogger::convertSetupParamsToMoQTParams(
760766
return moqParams;
761767
}
762768

769+
std::vector<MOQTSetupParameter> MLogger::convertSetupParamsToMoQTSetupParams(
770+
const SetupParameters& params) {
771+
std::vector<MOQTSetupParameter> moqSetupParams;
772+
773+
for (const auto& param : params) {
774+
switch (param.key) {
775+
case folly::to_underlying(SetupKey::PATH): {
776+
MOQTPathSetupParameter p;
777+
p.value = param.asString;
778+
moqSetupParams.emplace_back(std::move(p));
779+
break;
780+
}
781+
case folly::to_underlying(SetupKey::MAX_REQUEST_ID): {
782+
MOQTMaxRequestIdSetupParameter p;
783+
p.value = param.asUint64;
784+
moqSetupParams.emplace_back(std::move(p));
785+
break;
786+
}
787+
case folly::to_underlying(SetupKey::MAX_AUTH_TOKEN_CACHE_SIZE): {
788+
MOQTMaxAuthTokenCacheSizeSetupParameter p;
789+
p.value = param.asUint64;
790+
moqSetupParams.emplace_back(std::move(p));
791+
break;
792+
}
793+
case folly::to_underlying(SetupKey::AUTHORITY): {
794+
MOQTAuthoritySetupParameter p;
795+
p.value = param.asString;
796+
moqSetupParams.emplace_back(std::move(p));
797+
break;
798+
}
799+
case folly::to_underlying(SetupKey::MOQT_IMPLEMENTATION): {
800+
MOQTImplementationSetupParameter p;
801+
p.value = param.asString;
802+
moqSetupParams.emplace_back(std::move(p));
803+
break;
804+
}
805+
case folly::to_underlying(SetupKey::AUTHORIZATION_TOKEN): {
806+
// AUTHORIZATION_TOKEN is more complex, using unknown for now
807+
// TODO: properly parse authorization token
808+
MOQTUnknownSetupParameter p;
809+
p.nameBytes = param.key;
810+
moqSetupParams.emplace_back(std::move(p));
811+
break;
812+
}
813+
default: {
814+
MOQTUnknownSetupParameter p;
815+
p.nameBytes = param.key;
816+
// Check if string value is initialized (odd keys are strings per MoQ
817+
// spec)
818+
if (param.key % 2) {
819+
p.valueBytes = folly::IOBuf::copyBuffer(param.asString);
820+
} else {
821+
p.value = param.asUint64;
822+
}
823+
moqSetupParams.emplace_back(std::move(p));
824+
break;
825+
}
826+
}
827+
}
828+
return moqSetupParams;
829+
}
830+
763831
std::vector<MOQTParameter> MLogger::convertTrackParamsToMoQTParams(
764832
const TrackRequestParameters& params) {
765833
std::vector<MOQTParameter> moqParams;

0 commit comments

Comments
 (0)