Introduce padding streams.
Those will be used to probe bandwidth up.
PiperOrigin-RevId: 676674649
diff --git a/quiche/quic/moqt/moqt_messages.cc b/quiche/quic/moqt/moqt_messages.cc
index a1a7729..2ecdbf6 100644
--- a/quiche/quic/moqt/moqt_messages.cc
+++ b/quiche/quic/moqt/moqt_messages.cc
@@ -104,6 +104,8 @@
return "STREAM_HEADER_TRACK";
case MoqtDataStreamType::kStreamHeaderGroup:
return "STREAM_HEADER_GROUP";
+ case MoqtDataStreamType::kPadding:
+ return "PADDING";
}
return "Unknown stream type " + absl::StrCat(static_cast<int>(type));
}
diff --git a/quiche/quic/moqt/moqt_messages.h b/quiche/quic/moqt/moqt_messages.h
index 87f47ac..0a6bc55 100644
--- a/quiche/quic/moqt/moqt_messages.h
+++ b/quiche/quic/moqt/moqt_messages.h
@@ -64,6 +64,9 @@
kObjectDatagram = 0x01,
kStreamHeaderTrack = 0x50,
kStreamHeaderGroup = 0x51,
+
+ // Currently QUICHE-specific. All data on a kPadding stream is ignored.
+ kPadding = 0x26d3,
};
enum class QUICHE_EXPORT MoqtMessageType : uint64_t {
diff --git a/quiche/quic/moqt/moqt_parser.cc b/quiche/quic/moqt/moqt_parser.cc
index 9e9b079..0ae2720 100644
--- a/quiche/quic/moqt/moqt_parser.cc
+++ b/quiche/quic/moqt/moqt_parser.cc
@@ -52,7 +52,7 @@
bool IsAllowedStreamType(uint64_t value) {
constexpr std::array kAllowedStreamTypes = {
MoqtDataStreamType::kObjectStream, MoqtDataStreamType::kStreamHeaderGroup,
- MoqtDataStreamType::kStreamHeaderTrack};
+ MoqtDataStreamType::kStreamHeaderTrack, MoqtDataStreamType::kPadding};
for (MoqtDataStreamType type : kAllowedStreamTypes) {
if (static_cast<uint64_t>(type) == value) {
return true;
@@ -914,7 +914,7 @@
continue;
}
- case kData:
+ case kData: {
if (payload_length_remaining_ == 0) {
// Special case: kObject, which does not have explicit length.
if (metadata_->object_status != MoqtObjectStatus::kNormal) {
@@ -933,6 +933,10 @@
payload_length_remaining_ -= payload.size();
continue;
+ }
+
+ case kPadding:
+ return "";
}
}
return "";
diff --git a/quiche/quic/moqt/moqt_parser.h b/quiche/quic/moqt/moqt_parser.h
index 2f25f02..f129f72 100644
--- a/quiche/quic/moqt/moqt_parser.h
+++ b/quiche/quic/moqt/moqt_parser.h
@@ -176,6 +176,8 @@
kSubheader,
// The next thing to be read is the object payload.
kData,
+ // The next thing to be read (and ignored) is padding.
+ kPadding,
};
// Infers the current state of the parser.
@@ -183,6 +185,9 @@
if (!type_.has_value()) {
return kStreamType;
}
+ if (type_ == MoqtDataStreamType::kPadding) {
+ return kPadding;
+ }
if (!metadata_.has_value()) {
return kHeader;
}
diff --git a/quiche/quic/moqt/moqt_parser_test.cc b/quiche/quic/moqt/moqt_parser_test.cc
index a074f16..53bbdf8 100644
--- a/quiche/quic/moqt/moqt_parser_test.cc
+++ b/quiche/quic/moqt/moqt_parser_test.cc
@@ -175,7 +175,7 @@
std::vector<std::string> object_payloads_;
bool end_of_message_ = false;
- std::optional<absl::string_view> parsing_error_;
+ std::optional<std::string> parsing_error_;
MoqtError parsing_error_code_;
uint64_t messages_received_ = 0;
std::optional<TestMessageBase::MessageStructuredData> last_message_;
@@ -1145,4 +1145,17 @@
"SUBSCRIBE_DONE ContentExists has invalid value");
}
+TEST_F(MoqtMessageSpecificTest, PaddingStream) {
+ MoqtDataParser parser(&visitor_);
+ std::string buffer(32, '\0');
+ quic::QuicDataWriter writer(buffer.size(), buffer.data());
+ ASSERT_TRUE(writer.WriteVarInt62(
+ static_cast<uint64_t>(MoqtDataStreamType::kPadding)));
+ for (int i = 0; i < 100; ++i) {
+ parser.ProcessData(buffer, false);
+ ASSERT_EQ(visitor_.messages_received_, 0);
+ ASSERT_EQ(visitor_.parsing_error_, std::nullopt);
+ }
+}
+
} // namespace moqt::test
diff --git a/quiche/quic/moqt/test_tools/moqt_test_message.h b/quiche/quic/moqt/test_tools/moqt_test_message.h
index f653b26..9633ef3 100644
--- a/quiche/quic/moqt/test_tools/moqt_test_message.h
+++ b/quiche/quic/moqt/test_tools/moqt_test_message.h
@@ -1133,6 +1133,8 @@
return std::make_unique<StreamHeaderTrackMessage>();
case MoqtDataStreamType::kStreamHeaderGroup:
return std::make_unique<StreamHeaderGroupMessage>();
+ case MoqtDataStreamType::kPadding:
+ return nullptr;
}
return nullptr;
}