Move some non-message-related data structures out of moqt_messages.h This is a precursor to allowing greater application control of session parameters. PiperOrigin-RevId: 903583565
diff --git a/quiche/quic/moqt/moqt_messages.cc b/quiche/quic/moqt/moqt_messages.cc index 013b1f2..7281cf8 100644 --- a/quiche/quic/moqt/moqt_messages.cc +++ b/quiche/quic/moqt/moqt_messages.cc
@@ -4,42 +4,17 @@ #include "quiche/quic/moqt/moqt_messages.h" -#include <array> #include <cstdint> #include <string> -#include "absl/algorithm/container.h" #include "absl/strings/str_cat.h" -#include "quiche/quic/core/quic_time.h" -#include "quiche/quic/core/quic_types.h" #include "quiche/quic/moqt/moqt_error.h" #include "quiche/quic/moqt/moqt_key_value_pair.h" +#include "quiche/quic/moqt/moqt_types.h" #include "quiche/quic/platform/api/quic_bug_tracker.h" namespace moqt { -void MoqtSessionParameters::ToSetupParameters(SetupParameters& out) const { - if (perspective == quic::Perspective::IS_CLIENT && !using_webtrans) { - out.path = path; - out.authority = authority; - } - if (max_request_id != kDefaultMaxRequestId) { - out.max_request_id = max_request_id; - } - if (max_auth_token_cache_size != kDefaultMaxAuthTokenCacheSize) { - out.max_auth_token_cache_size = max_auth_token_cache_size; - } - if (support_object_acks != kDefaultSupportObjectAcks) { - out.support_object_acks = support_object_acks; - } - if (!moqt_implementation.empty()) { - out.moqt_implementation = moqt_implementation; - } - for (const AuthToken& token : authorization_token) { - out.authorization_tokens.push_back(token); - } -} - MoqtObjectStatus IntegerToObjectStatus(uint64_t integer) { if (integer >= static_cast<uint64_t>(MoqtObjectStatus::kInvalidObjectStatus)) {
diff --git a/quiche/quic/moqt/moqt_messages.h b/quiche/quic/moqt/moqt_messages.h index c956c8f..3c7552f 100644 --- a/quiche/quic/moqt/moqt_messages.h +++ b/quiche/quic/moqt/moqt_messages.h
@@ -7,20 +7,14 @@ #ifndef QUICHE_QUIC_MOQT_MOQT_MESSAGES_H_ #define QUICHE_QUIC_MOQT_MOQT_MESSAGES_H_ -#include <algorithm> -#include <bit> #include <cstddef> #include <cstdint> #include <initializer_list> #include <optional> #include <string> -#include <utility> #include <variant> -#include <vector> -#include "absl/strings/string_view.h" #include "quiche/quic/core/quic_time.h" -#include "quiche/quic/core/quic_types.h" #include "quiche/quic/core/quic_versions.h" #include "quiche/quic/moqt/moqt_error.h" #include "quiche/quic/moqt/moqt_key_value_pair.h" @@ -29,7 +23,6 @@ #include "quiche/quic/moqt/moqt_priority.h" #include "quiche/quic/moqt/moqt_types.h" #include "quiche/common/platform/api/quiche_export.h" -#include "quiche/common/quiche_endian.h" namespace moqt { @@ -37,53 +30,6 @@ return quic::ParsedQuicVersionVector{quic::ParsedQuicVersion::RFCv1()}; } -inline constexpr absl::string_view kDraft16 = "moqt-16"; -inline constexpr absl::string_view kDefaultMoqtVersion = kDraft16; -inline constexpr absl::string_view kUnrecognizedVersionForTests = "moqt-15"; - -inline constexpr absl::string_view kImplementationName = - "Google QUICHE MOQT draft 16"; -inline constexpr uint64_t kDefaultInitialMaxRequestId = 100; -struct QUICHE_EXPORT MoqtSessionParameters { - // TODO: support multiple versions. - MoqtSessionParameters() = default; - explicit MoqtSessionParameters(quic::Perspective perspective) - : perspective(perspective), using_webtrans(true) {} - MoqtSessionParameters(quic::Perspective perspective, std::string path, - std::string authority) - : perspective(perspective), - using_webtrans(false), - path(std::move(path)), - authority(std::move(authority)) {} - MoqtSessionParameters(quic::Perspective perspective, std::string path, - std::string authority, uint64_t max_request_id) - : perspective(perspective), - using_webtrans(true), - path(std::move(path)), - max_request_id(max_request_id), - authority(std::move(authority)) {} - MoqtSessionParameters(quic::Perspective perspective, uint64_t max_request_id) - : perspective(perspective), max_request_id(max_request_id) {} - bool operator==(const MoqtSessionParameters& other) const = default; - - std::string version = std::string(kDefaultMoqtVersion); - bool deliver_partial_objects = false; - quic::Perspective perspective = quic::Perspective::IS_SERVER; - bool using_webtrans = true; - std::string path; - uint64_t max_request_id = kDefaultInitialMaxRequestId; - uint64_t max_auth_token_cache_size = kDefaultMaxAuthTokenCacheSize; - bool support_object_acks = false; - // TODO(martinduke): Turn authorization_token into structured data. - std::vector<AuthToken> authorization_token; - std::string authority; - std::string moqt_implementation; - - // Takes the relevant fields from this object and populates |out| if not the - // protocol default value. - void ToSetupParameters(SetupParameters& out) const; -}; - // The maximum length of a message, excluding any OBJECT payload. This prevents // DoS attack via forcing the parser to buffer a large message (OBJECT payloads // are not buffered by the parser). @@ -279,25 +225,6 @@ kObjectAck = 0x3184, }; -// A tuple uniquely identifying a WebTransport data stream associated with a -// subscription. By convention, if a DataStreamIndex is necessary for a datagram -// track, `subgroup` is set to zero. -struct DataStreamIndex { - uint64_t group = 0; - uint64_t subgroup = 0; - - DataStreamIndex() = default; - DataStreamIndex(uint64_t group, uint64_t subgroup) - : group(group), subgroup(subgroup) {} - - auto operator<=>(const DataStreamIndex&) const = default; - - template <typename H> - friend H AbslHashValue(H h, const DataStreamIndex& index) { - return H::combine(std::move(h), index.group, index.subgroup); - } -}; - struct SubgroupPriority { uint8_t publisher_priority = 0xf0; uint64_t subgroup_id = 0; @@ -506,13 +433,6 @@ std::string new_session_uri; }; -enum class QUICHE_EXPORT SubscribeNamespaceOption : uint64_t { - kPublish = 0x00, - kNamespace = 0x01, - kBoth = 0x02, -}; -static constexpr uint64_t kMaxSubscribeOption = 0x02; - struct QUICHE_EXPORT MoqtSubscribeNamespace { uint64_t request_id; TrackNamespace track_namespace_prefix;
diff --git a/quiche/quic/moqt/moqt_session.cc b/quiche/quic/moqt/moqt_session.cc index 10522fa..c5c2ab8 100644 --- a/quiche/quic/moqt/moqt_session.cc +++ b/quiche/quic/moqt/moqt_session.cc
@@ -2594,4 +2594,26 @@ message.delta_from_deadline); } +void MoqtSessionParameters::ToSetupParameters(SetupParameters& out) const { + if (perspective == quic::Perspective::IS_CLIENT && !using_webtrans) { + out.path = path; + out.authority = authority; + } + if (max_request_id != kDefaultMaxRequestId) { + out.max_request_id = max_request_id; + } + if (max_auth_token_cache_size != kDefaultMaxAuthTokenCacheSize) { + out.max_auth_token_cache_size = max_auth_token_cache_size; + } + if (support_object_acks != kDefaultSupportObjectAcks) { + out.support_object_acks = support_object_acks; + } + if (!moqt_implementation.empty()) { + out.moqt_implementation = moqt_implementation; + } + for (const AuthToken& token : authorization_token) { + out.authorization_tokens.push_back(token); + } +} + } // namespace moqt
diff --git a/quiche/quic/moqt/moqt_session_interface.h b/quiche/quic/moqt/moqt_session_interface.h index 91a68c5..1df78b3 100644 --- a/quiche/quic/moqt/moqt_session_interface.h +++ b/quiche/quic/moqt/moqt_session_interface.h
@@ -8,23 +8,74 @@ #include <cstdint> #include <memory> #include <optional> +#include <string> +#include <utility> #include <variant> +#include <vector> #include "absl/strings/string_view.h" #include "quiche/quic/core/quic_time.h" +#include "quiche/quic/core/quic_types.h" #include "quiche/quic/moqt/moqt_error.h" #include "quiche/quic/moqt/moqt_fetch_task.h" #include "quiche/quic/moqt/moqt_key_value_pair.h" -#include "quiche/quic/moqt/moqt_messages.h" #include "quiche/quic/moqt/moqt_names.h" #include "quiche/quic/moqt/moqt_object.h" -#include "quiche/quic/moqt/moqt_priority.h" #include "quiche/quic/moqt/moqt_session_callbacks.h" +#include "quiche/quic/moqt/moqt_types.h" +#include "quiche/common/platform/api/quiche_export.h" #include "quiche/common/quiche_callbacks.h" #include "quiche/common/quiche_weak_ptr.h" namespace moqt { +inline constexpr absl::string_view kDraft16 = "moqt-16"; +inline constexpr absl::string_view kDefaultMoqtVersion = kDraft16; +inline constexpr absl::string_view kUnrecognizedVersionForTests = "moqt-15"; + +inline constexpr absl::string_view kImplementationName = + "Google QUICHE MOQT draft 16"; +inline constexpr uint64_t kDefaultInitialMaxRequestId = 100; +struct QUICHE_EXPORT MoqtSessionParameters { + // TODO: support multiple versions. + MoqtSessionParameters() = default; + explicit MoqtSessionParameters(quic::Perspective perspective) + : perspective(perspective), using_webtrans(true) {} + MoqtSessionParameters(quic::Perspective perspective, std::string path, + std::string authority) + : perspective(perspective), + using_webtrans(false), + path(std::move(path)), + authority(std::move(authority)) {} + MoqtSessionParameters(quic::Perspective perspective, std::string path, + std::string authority, uint64_t max_request_id) + : perspective(perspective), + using_webtrans(true), + path(std::move(path)), + max_request_id(max_request_id), + authority(std::move(authority)) {} + MoqtSessionParameters(quic::Perspective perspective, uint64_t max_request_id) + : perspective(perspective), max_request_id(max_request_id) {} + bool operator==(const MoqtSessionParameters& other) const = default; + + std::string version = std::string(kDefaultMoqtVersion); + bool deliver_partial_objects = false; + quic::Perspective perspective = quic::Perspective::IS_SERVER; + bool using_webtrans = true; + std::string path; + uint64_t max_request_id = kDefaultInitialMaxRequestId; + uint64_t max_auth_token_cache_size = kDefaultMaxAuthTokenCacheSize; + bool support_object_acks = false; + // TODO(martinduke): Turn authorization_token into structured data. + std::vector<AuthToken> authorization_token; + std::string authority; + std::string moqt_implementation; + + // Takes the relevant fields from this object and populates |out| if not the + // protocol default value. + void ToSetupParameters(SetupParameters& out) const; +}; + using MoqtObjectAckFunction = quiche::MultiUseCallback<void(uint64_t group_id, uint64_t object_id, quic::QuicTimeDelta delta_from_deadline)>;
diff --git a/quiche/quic/moqt/moqt_types.h b/quiche/quic/moqt/moqt_types.h index 4698a3c..32f38d6 100644 --- a/quiche/quic/moqt/moqt_types.h +++ b/quiche/quic/moqt/moqt_types.h
@@ -60,6 +60,32 @@ kInvalidObjectStatus = 0x5, }; +// A tuple uniquely identifying a WebTransport data stream associated with a +// subscription. By convention, if a DataStreamIndex is necessary for a datagram +// track, `subgroup` is set to zero. +struct DataStreamIndex { + uint64_t group = 0; + uint64_t subgroup = 0; + + DataStreamIndex() = default; + DataStreamIndex(uint64_t group, uint64_t subgroup) + : group(group), subgroup(subgroup) {} + + auto operator<=>(const DataStreamIndex&) const = default; + + template <typename H> + friend H AbslHashValue(H h, const DataStreamIndex& index) { + return H::combine(std::move(h), index.group, index.subgroup); + } +}; + +enum class QUICHE_EXPORT SubscribeNamespaceOption : uint64_t { + kPublish = 0x00, + kNamespace = 0x01, + kBoth = 0x02, +}; +static constexpr uint64_t kMaxSubscribeOption = 0x02; + } // namespace moqt #endif // QUICHE_QUIC_MOQT_MOQT_TYPES_H_