Skip to content

Commit 1f222b0

Browse files
committed
Fix draft-18 setup option delta encoding
1 parent f73427a commit 1f222b0

2 files changed

Lines changed: 29 additions & 10 deletions

File tree

src/transport/moqt_control_messages.cpp

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -365,13 +365,15 @@ void append_parameter(std::vector<std::uint8_t>& out,
365365
}
366366
}
367367

368-
void append_setup_option(std::vector<std::uint8_t>& out,
369-
DraftVersion draft,
370-
std::uint64_t type,
371-
std::span<const std::uint8_t> value) {
372-
append_moqint(out, draft, type);
368+
void append_setup_option_delta(std::vector<std::uint8_t>& out,
369+
DraftVersion draft,
370+
std::uint64_t& previous_type,
371+
std::uint64_t type,
372+
std::span<const std::uint8_t> value) {
373+
append_moqint(out, draft, type - previous_type);
373374
append_moqint(out, draft, value.size());
374375
out.insert(out.end(), value.begin(), value.end());
376+
previous_type = type;
375377
}
376378

377379
void append_parameter_delta(std::vector<std::uint8_t>& out,
@@ -547,8 +549,9 @@ std::vector<std::uint8_t> encode_setup_message(const SetupMessage& message) {
547549
if (message.transport == TransportKind::kRawQuic) {
548550
const std::vector<std::uint8_t> path = to_bytes(message.path);
549551
const std::vector<std::uint8_t> authority = to_bytes(message.authority);
550-
append_setup_option(payload, message.draft, kSetupParamPath, path);
551-
append_setup_option(payload, message.draft, kSetupParamAuthority, authority);
552+
std::uint64_t previous_option_type = 0;
553+
append_setup_option_delta(payload, message.draft, previous_option_type, kSetupParamPath, path);
554+
append_setup_option_delta(payload, message.draft, previous_option_type, kSetupParamAuthority, authority);
552555
}
553556

554557
std::vector<std::uint8_t> message_bytes;
@@ -631,10 +634,16 @@ bool decode_server_setup_message(std::span<const std::uint8_t> bytes, ServerSetu
631634

632635
if (message_type == kSetupType) {
633636
message.draft = DraftVersion::kDraft18;
637+
std::uint64_t previous_option_type = 0;
634638
while (offset < payload_end) {
635639
std::uint64_t option_type = 0;
636640
std::uint64_t option_length = 0;
637-
if (!decode_moqint_impl(payload_bytes, offset, message_draft, option_type) ||
641+
if (!decode_parameter_type(payload_bytes,
642+
offset,
643+
message_draft,
644+
previous_option_type,
645+
true,
646+
option_type) ||
638647
!decode_moqint_impl(payload_bytes, offset, message_draft, option_length) ||
639648
offset + option_length > payload_end) {
640649
return false;

tests/moqt_control_messages_test.cpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -477,15 +477,25 @@ bool test_setup_serdes_for_all_drafts() {
477477
if (uses_vi64(draft)) {
478478
bool saw_path = false;
479479
bool saw_authority = false;
480+
std::uint64_t previous_option_type = 0;
481+
std::uint64_t option_index = 0;
480482
while (offset < frame.payload_end) {
481-
std::uint64_t option_type = 0;
483+
std::uint64_t option_delta = 0;
482484
std::uint64_t option_length = 0;
483-
ok &= expect(read_moqint(bytes, offset, draft, option_type), label + " option type");
485+
ok &= expect(read_moqint(bytes, offset, draft, option_delta), label + " option delta type");
486+
if (option_index == 0) {
487+
ok &= expect(option_delta == 0x01, label + " first setup option is PATH delta");
488+
} else if (option_index == 1) {
489+
ok &= expect(option_delta == 0x04, label + " second setup option is AUTHORITY delta");
490+
}
491+
const std::uint64_t option_type = previous_option_type + option_delta;
484492
ok &= expect(read_moqint(bytes, offset, draft, option_length), label + " option length");
485493
ok &= expect(offset + option_length <= frame.payload_end, label + " option length fits");
486494
saw_path = saw_path || option_type == 0x01;
487495
saw_authority = saw_authority || option_type == 0x05;
488496
offset += static_cast<std::size_t>(option_length);
497+
previous_option_type = option_type;
498+
++option_index;
489499
}
490500
ok &= expect(saw_path, label + " path option placement");
491501
ok &= expect(saw_authority, label + " authority option placement");

0 commit comments

Comments
 (0)