<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.24 (Ruby 3.3.6) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-pardue-moq-qlog-moq-events-00" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.28.0 -->
  <front>
    <title>MoQ qlog event definitions</title>
    <seriesInfo name="Internet-Draft" value="draft-pardue-moq-qlog-moq-events-00"/>
    <author fullname="Lucas Pardue">
      <organization>Cloudflare</organization>
      <address>
        <email>lucas@lucaspardue.com</email>
      </address>
    </author>
    <author fullname="Mathis Engelbart">
      <organization>Technical University of Munich</organization>
      <address>
        <email>mathis.engelbart@gmail.com</email>
      </address>
    </author>
    <date year="2025" month="March" day="03"/>
    <area/>
    <workgroup>Media Over QUIC</workgroup>
    <keyword>hi fidelity</keyword>
    <abstract>
      <?line 44?>

<t>This document defines a qlog event schema containing concrete events for MoQ.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://LPardue.github.io/draft-pardue-moq-qlog-moq-events/draft-pardue-moq-qlog-moq-events.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-pardue-moq-qlog-moq-events/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Media Over QUIC  mailing list (<eref target="mailto:moq@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/moq/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/moq/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/LPardue/draft-pardue-moq-qlog-moq-events"/>.</t>
    </note>
  </front>
  <middle>
    <?line 49?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document defines a qlog event schema (<xref section="8" sectionFormat="of" target="QLOG-MAIN"/>)
containing concrete events for Media over QUIC Transport <xref target="MOQT"/>.</t>
      <t>The event namespace with identifier <tt>moqt</tt> is defined; see <xref target="schema-def"/>. In
this namespace multiple events derive from the qlog abstract Event class
(<xref section="7" sectionFormat="of" target="QLOG-MAIN"/>), each extending the "data" field and defining
their "name" field values and semantics.</t>
      <t><xref target="events-table"/> summarizes the name value of each event type that is defined in
this specification. Some event data fields use complex data types. These are
represented as enums or re-usable definitions, which are grouped together on the
bottom of this document for clarity.</t>
      <table anchor="events-table">
        <name>MOQT Events</name>
        <thead>
          <tr>
            <th align="left">Name value</th>
            <th align="left">Importance</th>
            <th align="left">Definition</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">moqt:control_message_created</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="controlmessagecreated"/></td>
          </tr>
          <tr>
            <td align="left">moqt:control_message_parsed</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="controlmessageparsed"/></td>
          </tr>
          <tr>
            <td align="left">moqt:stream_type_set</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="streamtypeset"/></td>
          </tr>
          <tr>
            <td align="left">moqt:object_datagram_created</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="objectdatagramcreated"/></td>
          </tr>
          <tr>
            <td align="left">moqt:object_datagram_parsed</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="objectdatagramparsed"/></td>
          </tr>
          <tr>
            <td align="left">moqt:object_datagram_status_created</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="objectdatagramstatuscreated"/></td>
          </tr>
          <tr>
            <td align="left">moqt:object_datagram_status_parsed</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="objectdatagramstatusparsed"/></td>
          </tr>
          <tr>
            <td align="left">moqt:subgroup_header_created</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="subgroupheadercreated"/></td>
          </tr>
          <tr>
            <td align="left">moqt:subgroup_header_parsed</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="subgroupheaderparsed"/></td>
          </tr>
          <tr>
            <td align="left">moqt:subgroup_object_created</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="subgroupobjectcreated"/></td>
          </tr>
          <tr>
            <td align="left">moqt:subgroup_object_parsed</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="subgroupobjectparsed"/></td>
          </tr>
          <tr>
            <td align="left">moqt:fetch_header_created</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="fetchheadercreated"/></td>
          </tr>
          <tr>
            <td align="left">moqt:fetch_header_parsed</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="fetchheaderparsed"/></td>
          </tr>
          <tr>
            <td align="left">moqt:fetch_object_created</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="fetchobjectcreated"/></td>
          </tr>
          <tr>
            <td align="left">moqt:fetch_object_parsed</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="fetchobjectparsed"/></td>
          </tr>
        </tbody>
      </table>
      <t>When any event from this document is included in a qlog trace, the
"protocol_types" qlog array field <bcp14>MUST</bcp14> contain an entry with the value "MOQT":</t>
      <figure anchor="protocoltype-extension-moqt">
        <name>ProtocolType extension for MOQT</name>
        <sourcecode type="cddl"><![CDATA[
$ProtocolType /= "MOQT"
]]></sourcecode>
      </figure>
      <section anchor="usage-with-quic">
        <name>Usage with QUIC</name>
        <t>The events described in this document can be used with or without logging the
related QUIC events defined in <xref target="QLOG-QUIC"/>. If used with QUIC events, the QUIC
document takes precedence in terms of recommended filenames and trace separation
setups.</t>
        <t>If used without QUIC events, it is recommended that the implementation assign a
globally unique identifier to each MOQT session. This ID can then be used as the
value of the qlog "group_id" field, as well as the qlog filename or file
identifier, potentially suffixed by the vantagepoint type (For example,
abcd1234_server.qlog would contain the server-side trace of the connection with
GUID abcd1234).</t>
      </section>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t>The event and data structure definitions in ths document are expressed
in the Concise Data Definition Language <xref target="CDDL"/> and its
extensions described in <xref target="QLOG-MAIN"/>.</t>
      <t>The following fields from <xref target="QLOG-MAIN"/> are imported and used: name, namespace,
type, data, group_id, protocol_types, importance, RawInfo, and time-related
fields.</t>
      <t>As is the case for <xref target="QLOG-MAIN"/>, the qlog schema definitions in this document
are intentionally agnostic to serialization formats. The choice of format is an
implementation decision.</t>
    </section>
    <section anchor="schema-def">
      <name>Event Schema Definition</name>
      <t>This document describes how the MOQT protocol is expressed in qlog with an event
schema. Per the requirements in <xref section="8" sectionFormat="of" target="QLOG-MAIN"/>, this document
registers the <tt>moqt</tt> namespace. The event schema URI is
<tt>urn:ietf:params:qlog:events:moqt</tt>.</t>
      <section removeInRFC="true" anchor="draft-event-schema-identification">
        <name>Draft Event Schema Identification</name>
        <t>Only implementations of the final, published RFC can use the events belonging to
the event schema with the URI <tt>urn:ietf:params:qlog:events:moqt</tt>. Until such an
RFC exists, implementations <bcp14>MUST NOT</bcp14> identify themselves using this URI.</t>
        <t>Implementations of draft versions of the event schema <bcp14>MUST</bcp14> append the string
"-" and the corresponding draft number to the URI. For example, draft 99 of this
document is identified using the URI <tt>urn:ietf:params:qlog:events:moqt-99</tt>.</t>
        <t>The namespace identifier itself is not affected by this requirement.</t>
      </section>
    </section>
    <section anchor="moqt-events">
      <name>MOQT Events</name>
      <t>MOQT events extend the <tt>$ProtocolEventData</tt> extension point defined in
<xref target="QLOG-MAIN"/>. Additionally, they allow for direct extensibility by their use of
per-event extension points via the <tt>$$</tt> CDDL "group socket" syntax, as also
described in <xref target="QLOG-MAIN"/>.</t>
      <figure anchor="moqt-events-def">
        <name>MOQTEventData definition and ProtocolEventData extension</name>
        <sourcecode type="cddl"><![CDATA[
MOQTEventData = MOQTControlMessageCreated /
                MOQTControlMessageParsed /
                MOQTStreamTypeSet /
                MOQTObjectDatagramCreated /
                MOQTObjectDatagramParsed /
                MOQTObjectDatagramStatusCreated /
                MOQTObjectDatagramStatusParsed /
                MOQTSubgroupHeaderCreated /
                MOQTSubgroupHeaderParsed /
                MOQTSubgroupObjectCreated /
                MOQTSubgroupObjectParsed /
                MOQTFetchHeaderCreated /
                MOQTFetchHeaderParsed /
                MOQTFetchObjectCreated /
                MOQTFetchObjectParsed

$ProtocolEventData /= MOQTEventData
]]></sourcecode>
      </figure>
      <t>MOQT events are logged when a certain condition happens at the application
layer, and there isn't always a one to one mapping between HTTP and QUIC events.
The exchange of data between the HTTP and QUIC layer is logged via the
"stream_data_moved" and "datagram_data_moved" events in <xref target="QLOG-QUIC"/>.</t>
      <t>The concrete MOQT event types are further defined below, their type identifier
is the heading name.</t>
      <t>Some MOQT messages include a reason phrase that can provide additional
information in the format of a byte sequences. However, these sequences are not
guaranteed to be presentable as UTF-8. In order to accomodate various encodings,
where the wire image of a message includes a reason phrase, the MOQT qlog event
type, includes two option fields: <tt>reason</tt> (for UTF-8) and <tt>reason_bytes</tt> (a
hex-encoded string representing raw bytes). Implementations <bcp14>SHOULD</bcp14> log at least
one format, but <bcp14>MAY</bcp14> log both or none.</t>
      <section anchor="controlmessagecreated">
        <name>control_message_created</name>
        <t>The <tt>control_message_created</tt> event is emitted when a control message is created.
It has Core importance level; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</t>
        <t>The definition of control message content is in <xref target="moqtcontrolmessage"/>.</t>
        <figure anchor="moqt-controlmessagecreated-def">
          <name>MOQTControlMessageCreated definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTControlMessageCreated = {
    stream_id: uint64
    ? length: uint64
    message: $MOQTControlMessage
    ? raw: RawInfo

    * $$moqt-controlmessagecreated-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="controlmessageparsed">
        <name>control_message_parsed</name>
        <t>The <tt>control_message_parsed</tt> event is emitted when a control message is parsed.
It has Core importance level; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</t>
        <t>The definition of control message content is in <xref target="moqtcontrolmessage"/>.</t>
        <figure anchor="controlmessageparsed-def">
          <name>MOQTControlMessageParsed definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTControlMessageParsed = {
    stream_id: uint64
    ? length: uint64
    message: $MOQTControlMessage
    ? raw: RawInfo

    * $$moqt-controlmessageparsed-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="streamtypeset">
        <name>stream_type_set</name>
        <t>The <tt>stream_type_set</tt> event conveys when a MOQT stream type becomes known. It
has Base importance level; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</t>
        <figure anchor="streamtypeset-def">
          <name>MOQTStreamTypeSet definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTStreamTypeSet = {
    ? owner: Owner
    stream_id: uint64
    stream_type: $MOQTStreamType

    * $$moqt-streamtypeset-extension
}

$MOQTStreamType /=   "subgroup_header" /
                     "fetch_header"
]]></sourcecode>
        </figure>
      </section>
      <section anchor="objectdatagramcreated">
        <name>object_datagram_created</name>
        <t>The <tt>object_datagram_created</tt> event is emitted when the OBJECT_DATAGRAM message
is created. It has Core importance level; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</t>
        <figure anchor="objectdatagramcreated-def">
          <name>MOQTObjectDatagramCreated definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTObjectDatagramCreated = {
    track_alias: uint64
    group_id: uint64
    object_id: uint64
    publisher_priority: uint8
    extension_headers_length: uint64
    ? extension_headers: [* MOQTExtensionHeader]
    ? object_payload: RawInfo

    * $$moqt-objectdatagramcreated-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="objectdatagramparsed">
        <name>object_datagram_parsed</name>
        <t>The <tt>object_datagram_parsed</tt> event is emitted when the OBJECT_DATAGRAM message
is parsed. It has Core importance level; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</t>
        <figure anchor="objectdatagramparsed-def">
          <name>MOQTObjectDatagramParsed definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTObjectDatagramParsed = {
    track_alias: uint64
    group_id: uint64
    object_id: uint64
    publisher_priority: uint8
    extension_headers_length: uint64
    ? extension_headers: [* MOQTExtensionHeader]
    ? object_payload: RawInfo

    * $$moqt-objectdatagramparsed-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="objectdatagramstatuscreated">
        <name>object_datagram_status_created</name>
        <t>The <tt>object_datagram_status_created</tt> event is emitted when the
OBJECT_DATAGRAM_STATUS message is created. It has Core importance level; see
<xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</t>
        <figure anchor="objectdatagramstatuscreated-def">
          <name>MOQTObjectDatagramStatusCreated definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTObjectDatagramStatusCreated = {
    track_alias: uint64
    group_id: uint64
    object_id: uint64
    publisher_priority: uint8
    extension_headers_length: uint64
    ? extension_headers: [* MOQTExtensionHeader]
    object_status: uint64

    * $$moqt-objectdatagramstatuscreated-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="objectdatagramstatusparsed">
        <name>object_datagram_status_parsed</name>
        <t>The <tt>object_datagram_status_parsed</tt> event is emitted when the
OBJECT_DATAGRAM_STATUS message is parsed. It has Core importance level; see
<xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</t>
        <figure anchor="objectdatagramstatusparsed-def">
          <name>MOQTObjectDatagramStatusParsed definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTObjectDatagramStatusParsed = {
    track_alias: uint64
    group_id: uint64
    object_id: uint64
    publisher_priority: uint8
    extension_headers_length: uint64
    ? extension_headers: [* MOQTExtensionHeader]
    object_status: uint64

    * $$moqt-objectdatagramstatusparsed-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="subgroupheadercreated">
        <name>subgroup_header_created</name>
        <t>The <tt>subgroup_header_created</tt> event is emitted when a stream begins and a
SUBGROUP_HEADER is created. It has Core importance level; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</t>
        <figure anchor="subgroupheadercreated-def">
          <name>MOQTSubgroupHeaderCreated definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTSubgroupHeaderCreated = {
    stream_id: uint64
    track_alias: uint64
    group_id: uint64
    subgroup_id: uint64
    publisher_priority: uint8

    * $$moqt-subgroupheadercreated-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="subgroupheaderparsed">
        <name>subgroup_header_parsed</name>
        <t>The <tt>subgroup_header_parsed</tt> event is emitted when the SUBGROUP_HEADER is
parsed. It has Core importance level; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</t>
        <figure anchor="subgroupheaderparsed-def">
          <name>MOQTSubgroupHeaderParsed definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTSubgroupHeaderParsed = {
    stream_id: uint64
    track_alias: uint64
    group_id: uint64
    subgroup_id: uint64
    publisher_priority: uint8

    * $$moqt-subgroupheaderparsed-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="subgroupobjectcreated">
        <name>subgroup_object_created</name>
        <t>The <tt>subgroup_object_created</tt> event is emitted when a subgroup object is
created. It has Core importance level; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</t>
        <figure anchor="subgroupobjectcreated-def">
          <name>MOQTSubgroupObjectCreated definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTSubgroupObjectCreated = {
    stream_id: uint64
    ? group_id: uint64
    ? subgroup_id: uint64
    object_id: uint64
    extension_headers_length: uint64
    ? extension_headers: [* MOQTExtensionHeader]
    object_payload_length: uint64
    ? object_status: uint64
    ? object_payload: RawInfo

    * $$moqt-subgroupobjectcreated-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="subgroupobjectparsed">
        <name>subgroup_object_parsed</name>
        <t>The <tt>subgroup_object_parsed</tt> event is emitted when a subgroup object is parsed.
It has Core importance level; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</t>
        <figure anchor="subgroupobjectparsed-def">
          <name>MOQTSubgroupObjectParsed definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTSubgroupObjectParsed = {
    stream_id: uint64
    ? group_id: uint64
    ? subgroup_id: uint64
    object_id: uint64
    extension_headers_length: uint64
    ? extension_headers: [* MOQTExtensionHeader]
    object_payload_length: uint64
    ? object_status: uint64
    ? object_payload: RawInfo

    * $$moqt-subgroupobjectparsed-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="fetchheadercreated">
        <name>fetch_header_created</name>
        <t>The <tt>fetch_header_created</tt> event is emitted when a stream begins and a
FETCH_HEADER is created. It has Core importance level; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</t>
        <figure anchor="fetchheadercreated-def">
          <name>MOQTFetchHeaderCreated definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTFetchHeaderCreated = {
    stream_id: uint64
    subscribe_id: uint64

    * $$moqt-fetchheadercreated-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="fetchheaderparsed">
        <name>fetch_header_parsed</name>
        <t>The <tt>fetch_header_parsed</tt> event is emitted when the SUBGROUP_HEADER is
parsed. It has Core importance level; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</t>
        <figure anchor="fetchheaderparsedd-def">
          <name>MOQTFetchHeaderParsed   definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTFetchHeaderParsed = {
    stream_id: uint64
    subscribe_id: uint64

    * $$moqt-fetchheaderparsed-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="fetchobjectcreated">
        <name>fetch_object_created</name>
        <t>The <tt>fetch_object_created</tt> event is emitted when a fetch object is created. It
has Core importance level; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</t>
        <figure anchor="fetchobjectcreated-def">
          <name>MOQTFetchObjectCreated definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTFetchObjectCreated = {
    stream_id: uint64
    group_id: uint64
    subgroup_id: uint64
    object_id: uint64
    publisher_priority: uint8
    extension_headers_length: uint64
    ? extension_headers: [* MOQTExtensionHeader]
    object_payload_length: uint64
    ? object_status: uint64
    ? object_payload: RawInfo

    * $$moqt-fetchobjectcreated-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="fetchobjectparsed">
        <name>fetch_object_parsed</name>
        <t>The <tt>fetch_object_parsed</tt> event is emitted when a fetch object is parsed. It has
Core importance level; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</t>
        <figure anchor="fetchobjectparsed-def">
          <name>MOQTFetchObjectParsed definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTFetchObjectParsed = {
    stream_id: uint64
    group_id: uint64
    subgroup_id: uint64
    object_id: uint64
    publisher_priority: uint8
    extension_headers_length: uint64
    ? extension_headers: [* MOQTExtensionHeader]
    object_payload_length: uint64
    ? object_status: uint64
    ? object_payload: RawInfo

    * $$moqt-fetchobjectparsed-extension
}
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section anchor="moqt-data-type-definitions">
      <name>MOQT Data Type Definitions</name>
      <t>The following data type definitions can be used in MOQT events.</t>
      <section anchor="owner">
        <name>Owner</name>
        <figure anchor="owner-def">
          <name>Owner definition</name>
          <sourcecode type="cddl"><![CDATA[
Owner = "local" /
        "remote"
]]></sourcecode>
        </figure>
      </section>
      <section anchor="moqtparameter">
        <name>MOQTParameter</name>
        <figure anchor="moqtparameter-def">
          <name>MOQTParameter definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTParameter = {
  name: $MOQTParameterName
  length: uint64
  ? value: RawInfo
}

$MOQTParameterName /= "authorization_info" /
                    "delivery_timeout" /
                    "max_cache_duration" /
                    "path" /
                    "max_subscribe_id"

]]></sourcecode>
        </figure>
      </section>
      <section anchor="moqtcontrolmessage">
        <name>MOQTControlMessage</name>
        <t>The generic <tt>$MOQTControlMessage</tt> is defined here as a CDDL "type socket" extension point.
It can be extended to support additional MOQT control message types.</t>
        <figure anchor="control-message-def">
          <name>MOQTControlMessage type socket definition</name>
          <artwork><![CDATA[
; The MOQTControlMessage is any key-value map (e.g., JSON object)
$MOQTControlMessage /= {
    * text => any
}
]]></artwork>
        </figure>
        <t>The MOQT control message types defined in this document are as follows:</t>
        <figure anchor="moqtbasecontrolmessage-def">
          <name>MOQTBaseControlMessages definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTBaseControlMessages = MOQTClientSetupMessage /
                          MOQTServerSetupMessage /
                          MOQTGoaway /
                          MOQTSubscribe /
                          MOQTSubscribeUpdate /
                          MOQTUnsubscribe /
                          MOQTFetch /
                          MOQTFetchCancel /
                          MOQTAnnounceOk /
                          MOQTAnnounceError /
                          MOQTAnnounceCancel /
                          MOQTTrackStatusRequest /
                          MOQTSubscribeAnnounces /
                          MOQTUnsubscribeAnnounces /
                          MOQTSubscribeOk /
                          MOQTSubscribeError /
                          MOQTFetchOk /
                          MOQTFetchError /
                          MOQTSubscribeDone /
                          MOQTMaxSubscribeId /
                          MOQTSubscribesBlocked /
                          MOQTAnnounce /
                          MOQTUnannounce /
                          MOQTTrackStatus /
                          MOQTSubscribeAnnouncesOk /
                          MOQTSubscribeAnnouncesError

$MOQTControlMessage /= MOQTBaseControlMessages
]]></sourcecode>
        </figure>
        <section anchor="moqtclientsetupmessage">
          <name>MOQTClientSetupMessage</name>
          <figure anchor="clientsetup-def">
            <name>MOQTClientSetupMessage definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTClientSetupMessage = {
  type: "client_setup"
  number_of_support_versions: uint64
  supported_versions: [* uint64]
  number_of_parameters: uint64
  setup_parameters: [* MOQTParameter]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtserversetupmessage">
          <name>MOQTServerSetupMessage</name>
          <figure anchor="serversetup-def">
            <name>MOQTServerSetupMessage definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTServerSetupMessage = {
  type: "server_setup"
  selected_version: uint64
  number_of_parameters: uint64
  setup_parameters: [* MOQTParameter]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtgoaway">
          <name>MOQTGoaway</name>
          <figure anchor="goaway-def">
            <name>MOQTGoaway definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTGoaway = {
  type: "goaway"
  ? length: uint64
  new_session_uri: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtsubscribe">
          <name>MOQTSubscribe</name>
          <figure anchor="subscribe-def">
            <name>MOQTSubscribe definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTSubscribe = {
  type: "subscribe"
  subscribe_id: uint64
  track_alias: uint64
  ; track_namespace: TODO pending tuple decision
  track_name: RawInfo
  subscriber_priority: uint8
  group_order: uint8
  filter_type: uint64
  ? start_group: uint64
  ? start_object: uint64
  ? end_group: uint64
  number_of_parameters: uint64
  subscribe_parameters: [* MOQTParameter]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtsubscribeupdate">
          <name>MOQTSubscribeUpdate</name>
          <figure anchor="subscribeupdate-def">
            <name>MOQTSubscribeUpdate definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTSubscribeUpdate = {
  type: "subscribe_update"
  subscribe_id: uint64
  start_group: uint64
  start_object: uint64
  end_group: uint64
  subscriber_priority: uint8
  number_of_parameters: uint64
  subscribe_parameters: [* MOQTParameter]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtunsubscribe">
          <name>MOQTUnsubscribe</name>
          <figure anchor="unsubscribe-def">
            <name>MOQTUnsubscribe definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTUnsubscribe = {
  type: "unsubscribe"
  subscribe_id: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtfetch">
          <name>MOQTFetch</name>
          <figure anchor="fetch-def">
            <name>MOQTFetch definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTFetch = {
  type: "fetch"
  subscribe_id: uint64
  subscriber_priority: uint8
  group_order: uint8
  fetch_type: uint64

  ; ? track_namespace: TODO pending tuple decision
  ? track_name: RawInfo
  ? start_group: uint64
  ? start_object: uint64
  ? end_group: uint64
  ? end_object: uint64

  ? joining_subscribe_id: uint64
  ? preceding_group_offset: uint64

  number_of_parameters: uint64
  parameters: [* MOQTParameter]

}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtfetchcancel">
          <name>MOQTFetchCancel</name>
          <figure anchor="fetchcancel-def">
            <name>MOQTFetchCancel definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTFetchCancel = {
  type: "fetch_cancel"
  subscribe_id: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtannounceok">
          <name>MOQTAnnounceOk</name>
          <figure anchor="announceok-def">
            <name>MOQTAnnounceOk definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTAnnounceOk = {
  type: "announce_ok"
  ; track_namespace: TODO pending tuple decision
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtannounceerror">
          <name>MOQTAnnounceError</name>
          <figure anchor="announceerror-def">
            <name>MOQTAnnounceError definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTAnnounceError = {
  type: "announce_error"
  ; track_namespace: TODO pending tuple decision
  error_code: uint64
  ? reason: text
  ? reason_bytes: hexstring
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtannouncecancel">
          <name>MOQTAnnounceCancel</name>
          <figure anchor="announcecancel-def">
            <name>MOQTAnnounceCancel definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTAnnounceCancel = {
  type: "announce_cancel"
  ; track_namespace: TODO pending tuple decision
  error_code: uint64
  ? reason: text
  ? reason_bytes: hexstring
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqttrackstatusrequest">
          <name>MOQTTrackStatusRequest</name>
          <figure anchor="trackstatusrequest-def">
            <name>MOQTTrackStatusRequest definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTTrackStatusRequest = {
  type: "track_status_request"
  ; track_namespace: TODO pending tuple decision
  track_name: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtsubscribeannounces">
          <name>MOQTSubscribeAnnounces</name>
          <figure anchor="subscribeannounces-def">
            <name>MOQTSubscribeAnnounces definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTSubscribeAnnounces = {
  type: "subscribe_announces"
  ; track_namespace: TODO pending tuple decision
  number_of_parameters: uint64
  subscribe_parameters: [* MOQTParameter]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtunsubscribeannounces">
          <name>MOQTUnsubscribeAnnounces</name>
          <figure anchor="unsubscribeannounces-def">
            <name>MOQTUnsubscribeAnnounces definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTUnsubscribeAnnounces = {
  type: "subscribe_announces"
  ; track_namespace: TODO pending tuple decision
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtsubscribeok">
          <name>MOQTSubscribeOk</name>
          <figure anchor="subscribeok-def">
            <name>MOQTSubscribeOk definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTSubscribeOk = {
  type: "subscribe_ok"
  subscribe_id: uint64
  expires: uint64
  group_order: uint8
  content_exists: uint8
  ? largest_group_id: uint64
  ? largest_object_id: uint64
  number_of_parameters: uint64
  subscribe_parameters: [* MOQTParameter]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtsubscribeerror">
          <name>MOQTSubscribeError</name>
          <figure anchor="subscribeerror-def">
            <name>MOQTSubscribeError definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTSubscribeError = {
  type: "subscribe_error"
  subscribe_id: uint64
  error_code: uint64
  ? reason: text
  ? reason_bytes: hexstring
  track_alias: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtfetchok">
          <name>MOQTFetchOk</name>
          <figure anchor="fetchok-def">
            <name>MOQTFetchOk definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTFetchOk = {
  type: "fetch_ok"
  subscribe_id: uint64
  group_order: uint8
  end_of_track: uint8
  largest_group_id: uint64
  largest_object_id: uint64
  number_of_parameters: uint64
  subscribe_parameters: [* MOQTParameter]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtfetcherror">
          <name>MOQTFetchError</name>
          <figure anchor="fetcherror-def">
            <name>MOQTFetchError definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTFetchError = {
  type: "fetch_error"
  subscribe_id: uint64
  error_code: uint64
  ? reason: text
  ? reason_bytes: hexstring
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtsubscribedone">
          <name>MOQTSubscribeDone</name>
          <figure anchor="subscribedone-def">
            <name>MOQTSubscribeDone definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTSubscribeDone = {
  type: "subscribe_done"
  subscribe_id: uint64
  status_code: uint64
  stream_count: uint64
  ? reason: text
  ? reason_bytes: hexstring
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtmaxsubscribeid">
          <name>MOQTMaxSubscribeId</name>
          <figure anchor="maxsubscribeid-def">
            <name>MOQTMaxSubscribeId definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTMaxSubscribeId = {
  type: "max_subscribe_id"
  subscribe_id: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtsubscribesblocked">
          <name>MOQTSubscribesBlocked</name>
          <figure anchor="subscribesblocked-def">
            <name>MOQTSubscribesBlocked definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTSubscribesBlocked = {
  type: "subscribes_blocked"
  maximum_subscribe_id: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtannounce">
          <name>MOQTAnnounce</name>
          <figure anchor="announce-def">
            <name>MOQTAnnounce definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTAnnounce = {
  type: "announce"
  ; track_namespace: TODO pending tuple decision
  number_of_parameters: uint64
  subscribe_parameters: [* MOQTParameter]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtunannounce">
          <name>MOQTUnannounce</name>
          <figure anchor="unannounce-def">
            <name>MOQTAnnounce definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTUnannounce = {
  type: "unannounce"
  ; track_namespace: TODO pending tuple decision
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqttrackstatus">
          <name>MOQTTrackStatus</name>
          <figure anchor="trackstatus-def">
            <name>MOQTTrackStatus definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTTrackStatus = {
  type: "track_status"
  ; track_namespace: TODO pending tuple decision
  track_name: RawInfo
  status_code: uint64
  last_group_id: uint64
  last_object_id: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtsubscribeannouncesok">
          <name>MOQTSubscribeAnnouncesOk</name>
          <figure anchor="subscribeannouncesok">
            <name>MOQTSubscribeAnnouncesOk definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTSubscribeAnnouncesOk = {
  type: "subscribe_announces_ok"
  ; track_namespace: TODO pending tuple decision
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtsubscribeannounceserror">
          <name>MOQTSubscribeAnnouncesError</name>
          <figure anchor="subscribeannounceserror-def">
            <name>MOQTSubscribeAnnouncesError definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTSubscribeAnnouncesError = {
  type: "subscribe_announces_error"
  ; track_namespace: TODO pending tuple decision
  error_code: uint64
  ? reason: text
  ? reason_bytes: hexstring
}
]]></sourcecode>
          </figure>
        </section>
      </section>
      <section anchor="moqtextensionheader">
        <name>MOQTExtensionHeader</name>
        <figure anchor="extensionheader-def">
          <name>Extension Header definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTExtensionHeader = {
  header_type: uint64
  ? header_value: uint64
  ? header_length: uint64
  ? payload: RawInfo
}
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>TODO Security</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-normative-references">
      <name>Normative References</name>
      <reference anchor="QLOG-MAIN">
        <front>
          <title>qlog: Structured Logging for Network Protocols</title>
          <author fullname="Robin Marx" initials="R." surname="Marx">
            <organization>Akamai</organization>
          </author>
          <author fullname="Luca Niccolini" initials="L." surname="Niccolini">
            <organization>Meta</organization>
          </author>
          <author fullname="Marten Seemann" initials="M." surname="Seemann">
         </author>
          <author fullname="Lucas Pardue" initials="L." surname="Pardue">
            <organization>Cloudflare</organization>
          </author>
          <date day="21" month="October" year="2024"/>
          <abstract>
            <t>   qlog provides extensible structured logging for network protocols,
   allowing for easy sharing of data that benefits common debug and
   analysis methods and tooling.  This document describes key concepts
   of qlog: formats, files, traces, events, and extension points.  This
   definition includes the high-level log file schemas, and generic
   event schemas.  Requirements and guidelines for creating protocol-
   specific event schemas are also presented.  All schemas are defined
   independent of serialization format, allowing logs to be represented
   in various ways such as JSON, CSV, or protobuf.

Note to Readers

      Note to RFC editor: Please remove this section before publication.

   Feedback and discussion are welcome at https://github.com/quicwg/qlog
   (https://github.com/quicwg/qlog).  Readers are advised to refer to
   the "editor's draft" at that URL for an up-to-date version of this
   document.

   Concrete examples of integrations of this schema in various
   programming languages can be found at https://github.com/quiclog/
   qlog/ (https://github.com/quiclog/qlog/).

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-main-schema-10"/>
      </reference>
      <reference anchor="QLOG-QUIC">
        <front>
          <title>QUIC event definitions for qlog</title>
          <author fullname="Robin Marx" initials="R." surname="Marx">
            <organization>Akamai</organization>
          </author>
          <author fullname="Luca Niccolini" initials="L." surname="Niccolini">
            <organization>Meta</organization>
          </author>
          <author fullname="Marten Seemann" initials="M." surname="Seemann">
         </author>
          <author fullname="Lucas Pardue" initials="L." surname="Pardue">
            <organization>Cloudflare</organization>
          </author>
          <date day="21" month="October" year="2024"/>
          <abstract>
            <t>   This document describes a qlog event schema containing concrete qlog
   event definitions and their metadata for the core QUIC protocol and
   selected extensions.

Note to Readers

      Note to RFC editor: Please remove this section before publication.

   Feedback and discussion are welcome at https://github.com/quicwg/qlog
   (https://github.com/quicwg/qlog).  Readers are advised to refer to
   the "editor's draft" at that URL for an up-to-date version of this
   document.

   Concrete examples of integrations of this schema in various
   programming languages can be found at https://github.com/quiclog/
   qlog/ (https://github.com/quiclog/qlog/).

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-quic-events-09"/>
      </reference>
      <reference anchor="MOQT">
        <front>
          <title>Media over QUIC Transport</title>
          <author fullname="Luke Curley" initials="L." surname="Curley">
            <organization>Discord</organization>
          </author>
          <author fullname="Kirill Pugin" initials="K." surname="Pugin">
            <organization>Meta</organization>
          </author>
          <author fullname="Suhas Nandakumar" initials="S." surname="Nandakumar">
            <organization>Cisco</organization>
          </author>
          <author fullname="Victor Vasiliev" initials="V." surname="Vasiliev">
            <organization>Google</organization>
          </author>
          <author fullname="Ian Swett" initials="I." surname="Swett">
            <organization>Google</organization>
          </author>
          <date day="1" month="March" year="2025"/>
          <abstract>
            <t>   This document defines the core behavior for Media over QUIC Transport
   (MOQT), a media transport protocol designed to operate over QUIC and
   WebTransport, which have similar functionality.  MOQT allows a
   producer of media to publish data and have it consumed via
   subscription by a multiplicity of endpoints.  It supports
   intermediate content distribution networks and is designed for high
   scale and low latency distribution.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-moq-transport-09"/>
      </reference>
      <reference anchor="RFC2119">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author fullname="S. Bradner" initials="S." surname="Bradner"/>
          <date month="March" year="1997"/>
          <abstract>
            <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="2119"/>
        <seriesInfo name="DOI" value="10.17487/RFC2119"/>
      </reference>
      <reference anchor="RFC8174">
        <front>
          <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
          <author fullname="B. Leiba" initials="B." surname="Leiba"/>
          <date month="May" year="2017"/>
          <abstract>
            <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="8174"/>
        <seriesInfo name="DOI" value="10.17487/RFC8174"/>
      </reference>
      <reference anchor="CDDL">
        <front>
          <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
          <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
          <author fullname="C. Vigano" initials="C." surname="Vigano"/>
          <author fullname="C. Bormann" initials="C." surname="Bormann"/>
          <date month="June" year="2019"/>
          <abstract>
            <t>This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049). Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="8610"/>
        <seriesInfo name="DOI" value="10.17487/RFC8610"/>
      </reference>
    </references>
    <?line 945?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
AAA=

-->

</rfc>
