<?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.39 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-pardue-moq-qlog-moq-events-07" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.0 -->
  <front>
    <title>MoQ qlog event definitions</title>
    <seriesInfo name="Internet-Draft" value="draft-pardue-moq-qlog-moq-events-07"/>
    <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>
    <author fullname="Aman Sharma">
      <organization>Meta</organization>
      <address>
        <email>amsharma@meta.com</email>
      </address>
    </author>
    <date year="2026" month="July" day="20"/>
    <area/>
    <workgroup>Media Over QUIC</workgroup>
    <keyword>hi fidelity</keyword>
    <abstract>
      <?line 48?>

<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 53?>

<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: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>
      <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, RawInfo, and time-related
fields.</t>
      <t>Events are defined with an importance level as described in <xref section="8.3" sectionFormat="of" target="QLOG-MAIN"/>.</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 /
                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.</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: uint16
    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.</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: uint16
    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.</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 /=  "control" /
                    "subgroup_header" /
                    "fetch_header" /
                    "subscribe_namespace"
]]></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.</t>
        <t>If the publisher_priority is absent, it means that the object inherits the
Publisher Priority specified in the control message that established the subscription.</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
    ? properties_length: uint64
    ? properties: [* MOQTProperty]
    ? object_status: uint64
    ? object_payload: RawInfo
    end_of_group: bool

    * $$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.</t>
        <t>If the publisher_priority is absent, it means that the object inherits the
Publisher Priority specified in the control message that established the subscription.</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
    ? properties_length: uint64
    ? properties: [* MOQTProperty]
    ? object_status: uint64
    ? object_payload: RawInfo
    end_of_group: bool

    * $$moqt-objectdatagramparsed-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>
        <t>The SUBGROUP_HEADER object in MoQT uses 5 bits in the type value to convey
various properties. The <tt>subgroup_header_created</tt> event conveys these as
explicit fields, such as contains_end_of_group.</t>
        <t>If the publisher_priority is absent, it means that the subgroup inherits the
Publisher Priority specified in the control message that established the
subscription.</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_mode: uint8
    ? subgroup_id: uint64
    ? publisher_priority: uint8
    contains_end_of_group: bool
    properties_present: bool

    * $$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.</t>
        <t>The SUBGROUP_HEADER object in MoQT uses 5 bits in the type value to convey
various properties. The <tt>subgroup_header_created</tt> event conveys these as explicit
fields, such as contains_end_of_group.</t>
        <t>If the publisher_priority is absent, it means that the subgroup inherits the
Publisher Priority specified in the control message that established the
subscription.</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_mode: uint8
    ? subgroup_id: uint64
    ? publisher_priority: uint8
    contains_end_of_group: bool
    properties_present: bool

    * $$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.</t>
        <figure anchor="subgroupobjectcreated-def">
          <name>MOQTSubgroupObjectCreated definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTSubgroupObjectCreated = {
    stream_id: uint64
    object_id_delta: uint64
    ? properties: [* MOQTProperty]
    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.</t>
        <figure anchor="subgroupobjectparsed-def">
          <name>MOQTSubgroupObjectParsed definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTSubgroupObjectParsed = {
    stream_id: uint64
    object_id_delta: uint64
    ? properties: [* MOQTProperty]
    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.</t>
        <figure anchor="fetchheadercreated-def">
          <name>MOQTFetchHeaderCreated definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTFetchHeaderCreated = {
    stream_id: uint64
    request_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.</t>
        <figure anchor="fetchheaderparsedd-def">
          <name>MOQTFetchHeaderParsed   definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTFetchHeaderParsed = {
    stream_id: uint64
    request_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.</t>
        <t>The FETCH object in MoQT uses serialization flags to encode various
properties. The event conveys these as explicit fields, such as
end_of_unknown_range.</t>
        <figure anchor="fetchobjectcreated-def">
          <name>MOQTFetchObjectCreated definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTFetchObjectCreated = {
    stream_id: uint64
    datagram: bool
    end_of_nonexistent_range: bool
    end_of_unknown_range: bool
    ? subgroup_id_bits: uint8
    ? group_id: uint64
    ? subgroup_id: uint64
    ? object_id: uint64
    ? publisher_priority: uint8
    ? properties_length: uint64
    ? properties: [* MOQTProperty]
    object_payload_length: 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.</t>
        <t>The FETCH object in MoQT uses serialization flags to encode various
properties. The event conveys these as explicit fields, such as
end_of_unknown_range.</t>
        <figure anchor="fetchobjectparsed-def">
          <name>MOQTFetchObjectParsed definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTFetchObjectParsed = {
    stream_id: uint64
    datagram: bool
    end_of_nonexistent_range: bool
    end_of_unknown_range: bool
    ? subgroup_id_bits: uint8
    ? group_id: uint64
    ? subgroup_id: uint64
    ? object_id: uint64
    ? publisher_priority: uint8
    ? properties_length: uint64
    ? properties: [* MOQTProperty]
    object_payload_length: 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="moqtlocation">
        <name>MOQTLocation</name>
        <t>A Location, as defined in <xref section="1.4.2" sectionFormat="of" target="MOQT"/></t>
        <figure anchor="moqtlocation-def">
          <name>MOQTLocation definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTLocation = {
  group: uint64
  object: uint64
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="moqtsubscriptionfilter">
        <name>MOQTSubscriptionFilter</name>
        <t>A Subscription Filter, as defined in <xref section="5.1.2" sectionFormat="of" target="MOQT"/></t>
        <figure anchor="moqtsubscriptionfilter-def">
          <name>MOQTSubscriptionFilter definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTSubscriptionFilter = {
  filter_type: uint64
  ? start_location: MOQTLocation
  ? end_group_delta: uint64
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="moqtsetupoption">
        <name>MOQTSetupOption</name>
        <t>The generic $MOQTSetupOption is defined here as a CDDL "type socket"
extension point. It can be extended to support additional MOQT Setup Options.</t>
        <figure anchor="moqtsetupoption-def">
          <name>MOQTSetupOption type socket definition</name>
          <sourcecode type="cddl"><![CDATA[
; The MOQTSetupOption is any key-value map (e.g., JSON object)
$MOQTSetupOption /= {
    * text => any
}
]]></sourcecode>
        </figure>
        <figure anchor="moqtbasesetupoptions-def">
          <name>MOQTBaseSetupOptions definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTBaseSetupOptions /=  MOQTAuthoritySetupOption /
                         MOQTPathSetupOption /
                         MOQTMaxAuthTokenCacheSizeSetupOption /
                         MOQTAuthorizationTokenSetupOption /
                         MOQTImplementationSetupOption /
                         MOQTUnknownSetupOption

$MOQTSetupOption /= MOQTBaseSetupOptions
]]></sourcecode>
        </figure>
        <section anchor="moqtauthoritysetupoption">
          <name>MOQTAuthoritySetupOption</name>
          <figure anchor="moqtauthoritysetupoption-def">
            <name>MOQTAuthoritySetupOption definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTAuthoritySetupOption = {
  name: "authority"
  value: text
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtpathsetupoption">
          <name>MOQTPathSetupOption</name>
          <figure anchor="moqtpathsetupoption-def">
            <name>MOQTPathSetupOption definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTPathSetupOption = {
  name: "path"
  value: text
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtmaxauthtokencachesizesetupoption">
          <name>MOQTMaxAuthTokenCacheSizeSetupOption</name>
          <figure anchor="moqtmaxauthtokencachesizesetupoption-def">
            <name>MOQTMaxAuthTokenCacheSizeSetupOption definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTMaxAuthTokenCacheSizeSetupOption = {
  name: "max_auth_token_cache_size"
  value: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtauthorizationtokensetupoption">
          <name>MOQTAuthorizationTokenSetupOption</name>
          <figure anchor="moqtauthorizationtokensetupoption-def">
            <name>MOQTAuthorizationTokenSetupOption definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTAuthorizationTokenSetupOption = {
  name: "authorization_token"
  alias_type: $MOQTAliasType
  ? token_alias: uint64
  ? token_type: uint64
  ? token_value: RawInfo
}

$MOQTAliasType /=  "delete" /
                   "register" /
                   "use_alias" /
                   "use_value"
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtimplementationsetupoption">
          <name>MOQTImplementationSetupOption</name>
          <figure anchor="moqtimplementationsetupoption-def">
            <name>MOQTImplementationSetupOption definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTImplementationSetupOption = {
  name: "implementation"
  value: text
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtunknownsetupoption">
          <name>MOQTUnknownSetupOption</name>
          <figure anchor="moqtunknownsetupoption-def">
            <name>MOQTUnknownSetupOption definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTUnknownSetupOption = {
  name:"unknown"
  name_bytes: uint64
  ? length: uint64
  ? value: uint64
  ? value_bytes: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
      </section>
      <section anchor="moqtparameter">
        <name>MOQTParameter</name>
        <t>The generic $MOQTParameter is defined here as a CDDL "type socket" extension
point. It can be extended to support additional MOQT Parameters.</t>
        <figure anchor="moqtparameter-def">
          <name>MOQTParameter type socket definition</name>
          <sourcecode type="cddl"><![CDATA[
; The MOQTParameter is any key-value map (e.g., JSON object)
$MOQTParameter /= {
    * text => any
}
]]></sourcecode>
        </figure>
        <figure anchor="moqtbaseparameters-def">
          <name>MOQTBaseParameters definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTBaseParameters /= MOQTAuthorizationTokenParameter /
                      MOQTDeliveryTimeoutParameter /
                      MOQTRendezvousTimeoutParameter /
                      MOQTSubscriberPriorityParameter /
                      MOQTGroupOrderParameter /
                      MOQTSubscriptionFilterParameter /
                      MOQTExpiresParameter /
                      MOQTLargestObjectParameter /
                      MOQTForwardParameter /
                      MOQTNewGroupRequestParameter /
                      MOQTUnknownParameter

$MOQTParameter /= MOQTBaseParameters
]]></sourcecode>
        </figure>
        <section anchor="moqtauthorizationtokenparameter">
          <name>MOQTAuthorizationTokenParameter</name>
          <figure anchor="moqtauthorizationTokenparameter-def">
            <name>MOQTAuthorizationTokenParameter definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTAuthorizationTokenParameter = {
  name: "authorization_token"
  alias_type: uint64
  ? token_alias: uint64
  ? token_type: uint64
  ? token_value: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtdeliverytimeoutparameter">
          <name>MOQTDeliveryTimeoutParameter</name>
          <figure anchor="moqtdeliverytimeoutparameter-def">
            <name>MOQTDeliveryTimeoutParameter definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTDeliveryTimeoutParameter = {
  name: "delivery_timeout"
  value: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtrendezvoustimeoutparameter">
          <name>MOQTRendezvousTimeoutParameter</name>
          <figure anchor="moqtrendezvoustimeoutparameter-def">
            <name>MOQTRendezvousTimeoutParameter definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTRendezvousTimeoutParameter = {
  name: "rendezvous_timeout"
  value: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtsubscriberpriorityparameter">
          <name>MOQTSubscriberPriorityParameter</name>
          <figure anchor="moqtsubscriberpriorityparameter-def">
            <name>MOQTSubscriberPriorityParameter definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTSubscriberPriorityParameter = {
  name: "subscriber_priority"
  value: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtgrouporderparameter">
          <name>MOQTGroupOrderParameter</name>
          <figure anchor="moqtgrouporderparameter-def">
            <name>MOQTGroupOrderParameter definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTGroupOrderParameter = {
  name: "group_order"
  value: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtsubscriptionfilterparameter">
          <name>MOQTSubscriptionFilterParameter</name>
          <figure anchor="moqtsubscriptionfilterparameter-def">
            <name>MOQTSubscriptionFilterParameter definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTSubscriptionFilterParameter = {
  name: "subscription_filter"
  value: MOQTSubscriptionFilter
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtexpiresparameter">
          <name>MOQTExpiresParameter</name>
          <figure anchor="moqtexpiresparameter-def">
            <name>MOQTExpiresParameter definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTExpiresParameter = {
  name: "expires"
  value: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtlargestobjectparameter">
          <name>MOQTLargestObjectParameter</name>
          <figure anchor="moqtlargestobjectparameter-def">
            <name>MOQTLargestObjectParameter definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTLargestObjectParameter = {
  name: "largest_object"
  value: MOQTLocation
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtforwardparameter">
          <name>MOQTForwardParameter</name>
          <figure anchor="moqtforwardparameter-def">
            <name>MOQTForwardParameter definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTForwardParameter = {
  name: "forward"
  value: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtnewgrouprequestparameter">
          <name>MOQTNewGroupRequestParameter</name>
          <figure anchor="moqtnewgrouprequestparameter-def">
            <name>MOQTNewGroupRequestParameter definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTNewGroupRequestParameter = {
  name: "new_group_request"
  value: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtunknownparameter">
          <name>MOQTUnknownParameter</name>
          <figure anchor="moqtunknownparameter-def">
            <name>MOQTUnknownParameter definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTUnknownParameter = {
  name:"unknown"
  name_bytes: uint64
  ? length: uint64
  ? value: uint64
  ? value_bytes: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
      </section>
      <section anchor="moqtbytestring">
        <name>MOQTByteString</name>
        <t>The MOQTByteString type allows representing MOQT bytestrings, such as the value
of a Track or Track Namespace tuple field, using two different encodings. The
<tt>value</tt> field can be used for bytestrings that can be encoded in UTF-8. The
<tt>value_bytes</tt> field can be used for bytestrings of any type by using the
<tt>hexstring</tt> encoding.</t>
        <t>Implementations <bcp14>SHOULD</bcp14> populate one of either the <tt>value</tt> or <tt>value_bytes</tt>
field. Populating both fields is redundant.</t>
        <figure anchor="MOQTByteString-def">
          <name>MOQTByteString definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTByteString = {
  ? value: text
  ? value_bytes: hexstring
}
]]></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 = MOQTSetupMessage /
                          MOQTGoaway /
                          MOQTRequestOk /
                          MOQTRequestError /
                          MOQTSubscribe /
                          MOQTSubscribeOk /
                          MOQTRequestUpdate /
                          MOQTPublish /
                          MOQTPublishOk /
                          MOQTPublishDone /
                          MOQTFetch /
                          MOQTFetchOk /
                          MOQTTrackStatus /
                          MOQTPublishNamespace /
                          MOQTNamespace /
                          MOQTNamespaceDone /
                          MOQTSubscribeNamespace /
                          MOQTPublishBlocked

$MOQTControlMessage /= MOQTBaseControlMessages
]]></sourcecode>
        </figure>
        <section anchor="moqtsetupmessage">
          <name>MOQTSetupMessage</name>
          <figure anchor="setup-def">
            <name>MOQTSetupMessage definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTSetupMessage = {
  type: "setup"
  ? setup_options: [* $MOQTSetupOption]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtgoaway">
          <name>MOQTGoaway</name>
          <figure anchor="goaway-def">
            <name>MOQTGoaway definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTGoaway = {
  type: "goaway"
  new_session_uri: RawInfo
  timeout: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtrequestok">
          <name>MOQTRequestOk</name>
          <figure anchor="requestok-def">
            <name>MOQTRequestOk definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTRequestOk = {
  type: "request_ok"
  request_id: uint64
  number_of_parameters: uint64
  ? parameters: [* $MOQTParameter]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtrequesterror">
          <name>MOQTRequestError</name>
          <figure anchor="requesterror-def">
            <name>MOQTRequestError definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTRequestError = {
  type: "request_error"
  request_id: uint64
  error_code: uint64
  retry_interval: uint64
  ? reason: text
  ? reason_bytes: hexstring
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtsubscribe">
          <name>MOQTSubscribe</name>
          <figure anchor="subscribe-def">
            <name>MOQTSubscribe definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTSubscribe = {
  type: "subscribe"
  request_id: uint64
  required_request_id_delta: uint64
  track_namespace: [ *MOQTByteString]
  track_name: MOQTByteString
  number_of_parameters: uint64
  ? parameters: [* $MOQTParameter]
}
]]></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"
  request_id: uint64
  track_alias: uint64
  number_of_parameters: uint64
  ? parameters: [* $MOQTParameter]
  ? track_properties: [* MOQTProperty]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtrequestupdate">
          <name>MOQTRequestUpdate</name>
          <figure anchor="requestupdate-def">
            <name>MOQTRequestUpdate definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTRequestUpdate = {
  type: "request_update"
  request_id: uint64
  required_request_id_delta: uint64
  existing_request_id: uint64
  number_of_parameters: uint64
  ? parameters: [* $MOQTParameter]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtpublish">
          <name>MOQTPublish</name>
          <figure anchor="publish-def">
            <name>MOQTPublish definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTPublish = {
  type: "publish"
  request_id: uint64
  required_request_id_delta: uint64
  track_namespace: [ *MOQTByteString]
  track_name: MOQTByteString
  track_alias: uint64
  number_of_parameters: uint64
  ? parameters: [* $MOQTParameter]
  ? track_properties: [* MOQTProperty]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtpublishok">
          <name>MOQTPublishOk</name>
          <figure anchor="publishok-def">
            <name>MOQTPublishOk definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTPublishOk = {
  type: "publish_ok"
  request_id: uint64
  number_of_parameters: uint64
  ? parameters: [* $MOQTParameter]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtpublishdone">
          <name>MOQTPublishDone</name>
          <figure anchor="publishdone-def">
            <name>MOQTPublishDone definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTPublishDone = {
  type: "publish_done"
  request_id: uint64
  status_code: uint64
  stream_count: uint64
  ? reason: text
  ? reason_bytes: hexstring
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtfetch">
          <name>MOQTFetch</name>
          <figure anchor="fetch-def">
            <name>MOQTFetch definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTFetch = {
  type: "fetch"
  request_id: uint64
  required_request_id_delta: uint64
  fetch_type: $MOQTFetchType
  ? standalone_fetch: $MOQTStandaloneFetch
  ? joining_fetch: $MOQTJoiningFetch
  number_of_parameters: uint64
  ? parameters: [* $MOQTParameter]
}

$MOQTStandaloneFetch = {
  track_namespace: [ *MOQTByteString]
  track_name: MOQTByteString
  start_location: MOQTLocation
  end_location: MOQTLocation
}

$MOQTJoiningFetch = {
  joining_request_id: uint64
  joining_start: uint64
}

$MOQTFetchType /=  "standalone" /
                   "absolute_joining" /
                   "relative_joining"
]]></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"
  request_id: uint64
  end_of_track: uint8
  end_location: MOQTLocation
  number_of_parameters: uint64
  ? parameters: [* $MOQTParameter]
  ? track_properties: [* MOQTProperty]
}
]]></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"
  request_id: uint64
  required_request_id_delta: uint64
  track_namespace: [ *MOQTByteString]
  track_name: MOQTByteString
  number_of_parameters: uint64
  ? parameters: [* $MOQTParameter]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtpublishnamespace">
          <name>MOQTPublishNamespace</name>
          <figure anchor="publishnamespace-def">
            <name>MOQTPublishNamespace definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTPublishNamespace = {
  type: "publish_namespace"
  request_id: uint64
  required_request_id_delta: uint64
  track_namespace: [ *MOQTByteString]
  number_of_parameters: uint64
  ? parameters: [* $MOQTParameter]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtnamespace">
          <name>MOQTNamespace</name>
          <figure anchor="namespace-def">
            <name>MOQTNamespace definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTNamespace = {
  type: "namespace"
  track_namespace_suffix: [ *MOQTByteString]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtnamespacedone">
          <name>MOQTNamespaceDone</name>
          <figure anchor="namespacedone-def">
            <name>MOQTNamespaceDone definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTNamespaceDone = {
  type: "namespace_done"
  track_namespace_suffix: [ *MOQTByteString]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtsubscribenamespace">
          <name>MOQTSubscribeNamespace</name>
          <figure anchor="subscribenamespace-def">
            <name>MOQTSubscribeNamespace definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTSubscribeNamespace = {
  type: "subscribe_namespace"
  request_id: uint64
  required_request_id_delta: uint64
  track_namespace_prefix: [ *MOQTByteString]
  subscribe_options: $MOQTSubscribeOptions
  number_of_parameters: uint64
  ? parameters: [* $MOQTParameter]
}

$MOQTSubscribeOptions /=  "publish" /
                          "namespace" /
                          "both"
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtpublishblocked">
          <name>MOQTPublishBlocked</name>
          <figure anchor="publishblocked-def">
            <name>MOQTPublishBlocked definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTPublishBlocked = {
  type: "publish_blocked"
  track_namespace_suffix: [ *MOQTByteString]
  track_name: MOQTByteString
}
]]></sourcecode>
          </figure>
        </section>
      </section>
      <section anchor="moqtproperty">
        <name>MOQTProperty</name>
        <figure anchor="property-def">
          <name>Property definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTProperty = {
  type: uint64
  ? value: uint64
  ? length: uint64
  ? value_bytes: RawInfo
}
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The security and privacy considerations discussed in <xref target="QLOG-MAIN"/> apply to this
document as well.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document registers a new entry in the "qlog event schema URIs" registry (created in <xref section="15" sectionFormat="of" target="QLOG-MAIN"/>).</t>
      <dl>
        <dt>Event schema URI:</dt>
        <dd>
          <t>urn:ietf:params:qlog:events:moqt</t>
        </dd>
        <dt>Namespace</dt>
        <dd>
          <t>moqt</t>
        </dd>
        <dt>Event Types</dt>
        <dd>
          <t>control_message_created,
control_message_parsed,
stream_type_set,
object_datagram_created,
object_datagram_parsed,
subgroup_header_created,
subgroup_header_parsed,
subgroup_object_created,
subgroup_object_parsed,
fetch_header_created,
fetch_header_parsed,
fetch_object_created,
fetch_object_parsed</t>
        </dd>
        <dt>Description:</dt>
        <dd>
          <t>Event definitions related to the MOQT protocol.</t>
        </dd>
        <dt>Reference:</dt>
        <dd>
          <t>This Document</t>
        </dd>
      </dl>
    </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="6" month="July" year="2026"/>
          <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.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-main-schema-14"/>
      </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="6" month="July" year="2026"/>
          <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.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-quic-events-13"/>
      </reference>
      <reference anchor="MOQT">
        <front>
          <title>Media over QUIC Transport</title>
          <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>
          <author fullname="Alan Frindell" initials="A." surname="Frindell">
            <organization>Meta</organization>
          </author>
          <date day="6" month="July" year="2026"/>
          <abstract>
            <t>   This document defines Media over QUIC Transport (MOQT), a publish/
   subscribe protocol that runs over QUIC and WebTransport.  MOQT
   leverages the features of these transports, such as streams,
   datagrams, priorities, and partial reliability.  MOQT operates both
   point-to-point and through intermediate relays, enabling scalable
   low-latency delivery.  Despite its name, MOQT is media agnostic and
   can be used for a wide range of use cases.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-moq-transport-19"/>
      </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 1142?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>Thanks to Lorenzo Miniero, Sujay Patel, and Aman Sharm for feedback and contributions to this document.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
1E3ejlkKVnZ/U01cE/n1Dm7p+n1cnHW5eHhprbtEvpfnlzKP5hPo16Xv3c7d
e8WFoAKMj+J9J2qYxjrowEGfCXpwGLJemwWF2evDZb4KntNp8eD+fNV0V7Zl
nvoT+iK3vsj+v/jiVt3qX9UVO3JpELDTEXtzae30VuWI/jmtuif6wzpyqTUp
60OKbdshBe3D3wroNpCy7JrMZZyL+xZPfnkUrsB+TXkV1r0n7k7l+5At2vfl
1Kv+Rhj2ztW1KL9vRayp+21XxDpUv1Vo+D+o+S283gPs1Hub1wfPkt49CBwZ
NSoPDbhf4fzi4GLv5X2r5roJBLYVuw0At9Ah/biXfeE3WQ6KPgBWE3yAtG6x
l67WPFobEvrvWeu0yXgrH7uPiDuMuwHVJeFTeyq4RcSNZBY4cewJeds0RtBO
HHOsmPVVk+QBwRqydj4rFktFB2Rpf8xu7bF6+dhTJNYbNmZqkyKhJetJhnu+
QeXfJ7faft4pdsw8uOOGJ4WASD1XE8QjxbntFWITrK/9Mq2lRmuv3t7bwss9
MkhPlmhacLsbdVYGARV3e5EfqEIFQQB8exfyYxT7C3nQVuHzPw70xztQXxrq
KrCa+q15j94qpHNCtLHWOK9fHW0un9zzDve6D5agkVfHh/QBBr0/WFkdfQcr
G8TpTHh7dwM8ZJo7u2q0w+hypMc2/B/nPErNoSO2y+3nHX3M2Xl4xa5nPh49
oRVNGvr2bc0p7HjjC6Y9LpWo5V1e8E8AxGZsXRElziD1584aw4sozlFiu9y9
yvXldpY+HT3uYKk5gWFuQV/M9mzJIjhXLrJ8YrkZ+zJGAPRp7X5+s+KLw108
0VMFWoA6ZWER4WM/JxutYzTMpQRjiGZmT7m66z6mSmeK8HymOcBJ1mvOb7La
iU+K6caa9RFVfbZJFRt63rg6TKWNnKbkek7lxtW/U7QOUCWSW3z8ZahX3NZi
wz+Qo+Voh397fvLKmNWHrMHPIxuSP+I5EMaffYmY6oLGAfqAU0PCDi5HADUx
e+aCBwOcYYr22/HGLr0ZAAKnR2Bwx5z+UYgU+eoe4MfiBme5SF/LZE/MVvI8
+kneY7whUSdXwnKPwf7hrXsMvNS5zbPSkCZD0vUUOYWbjjIb5zobqql7y4NW
RdWUHNSltjX9YoSBsBD4Agqy2jGZYM32SrAOIwxOFia9Zi81quvW5BG8gZvd
tCJEB5l17GEK+0y0RnKvRXs8rMXNBCU6yRF+MsMBEwUjHMaCsRYG4jgaRqNw
UAevvWR1WlbYv8Im1uKLIVvToJp3escKLpS7p4d28QIdHsIspGVUX0231xtZ
TV82QrSFlz1eVGLWp4sgrUmoRsKOP7AP5bTdh3pIk9UFQIQMQr6kxUDk9jtV
i3jD6muNcDXVtUdCT23+YzXdvld7BKedr/a5wzyFgq/HTBPA5WJgGpOBuaAP
/nqG06jkv6q5YnnFDq6syxWBmamD9wCpwXroFB/ikVQpNqqh8t62tVD19Av7
VbVQOWFLIeQRdI8yqBq3VRG0seDNsG7x3KMAqpiyibvpbw6BLfUBjtuXMb6u
6PYiWsu0yLcbdIZS/+lNWqh7DTu35xQzu++53bhvaB0+08uV28/j1O3bjTu4
2USZVNsBH4lsKVVeNrBbDHmRZtcim28H/EpeE99nelV4u0HGQx0HbNpq04Ya
RV5prMESzzG+bdOwQ1BPEq5IvW8KbuTSd029rbmPCG116C6ewvJq88GasFpd
1ZPU3EBNcg3WV5pZeAPeylbr7GGe2kNEjauOWOLxlZVw23JWjejjrYOGMHcd
kSy8uhGMeR5/5SHuagWwj8FqiB3RymEXGWEWA0G3xlooLHssmb1thOhjRW/H
ZnrPKsxCaLpO7YTif+/aU7d2CHCiV4scllrWyfrWm/q0FSQrzHI9ddWf6q1n
No85qe/26ciAtVLdmCRMajhx1tc5w9nVIzvWMGa7pKaOckGwtgaqx5Tr0mFO
WmYP81PP6vVtjHrS93hY6Lt9ojdgrQQ3JgmT2lZT1EhuLT080hN5bVZZzcZ1
HxMwgOANeCszrdN3dlhtzNRvv9/uqpXpBpnBzuo5THGu39TAbANTXdMdBL1m
QPkPgVInRPQRoHPgUb+bCchn9EDrBR4BxMc89YdX5csWoOWLpX0zlHl7w3XK
59FiAc0bvqTAPi9LO4LsipBemRc/ujsx+ESrQ0r1aDA2dOZB1iixT+lWuOwz
r/0YkRNo5PTTZbfVuybY1UreaKCrkt7AGzTMY7HQBRf4Hht6ChxfPBnRA9P0
4gXDHUzsEafPk474qR5Kj43jc7Pm1Tv0Kop5kcwFvYjCb+sqNWoL/cpbrmiY
WcmKY2g+nkbtXs3gG5e1rtqjiF7zfhV4WPHq/j282c9g9+vhG4dh6R2dJECn
k/eJu2c7Xxvc29MbkoaGpO4HKztae0t8mEd3P635KjChzBaoGgfWCHwSlHmf
By3elFy2bxzoGjAV1+K2F8wE6pPX20IeZFna3sha4LJm3R5yexIuN/S0fx+0
Oaq9LdwW8xvIfQwqfbC0Rb4d1BYzU0g/p+OV21JZxf++Ab8CcisRlKrdfgJD
+/MY/W3O2vy7xU8aiyH+c9ShBZG6pzWi64OG69X7ENcrdegx73in5diB3vfG
jxOz90anPOq7eN+7Z1zxcnC/1c7T0veRz9dbPR0IPMqWdI1KJ6gEzZsnJ0UW
uc+9mc47UBHq4Y0mT0/UtqZg4kxjCcHGH49Ae54yfY1EBk5XcvM6KzwAVC15
eZWde9kKvKzRXHEb9Onr5tqCJa6TKQqJYb50tAyyJvFWK3d0dzIrH86gi5nM
s9sJvT8S0qLHrH63iFNwuC8bCVccZl6aqYVzTX7POkrbqknNGezlVpbNm77m
k+pu48S6fsylfFQeFMs/8uuj7z2ocb30/i3tpmSpdcWmT3QNd3CzYVh8XS4R
fgjoXRmmZVbC3HlQLSCXpke5/HX6lM7xYacy+T/oVQXdeycbo/OGYCuTPybs
aIpbHNCw2nKiQSfL+kkGU/Z44jFHFN+37/1JDNRIo7GdZyTXKe2Gy1blY0ji
f0wGM5M1/a0irpMpLOfCbFGhF2RsDndaWdNPAtXzlzn8O0uLJH/X7GXIQCpa
mCbSW9b9sOwOnVn2WaVzsO/kM/pQuHPOhGYpz5mAmJK5iIHQCUGWr7KxlzWh
CPpDSj/N4cF9q69ZoHe3Jxaa3srk3d2/5/Qnnv1suWlJczk2dFnBBHVkb9LM
TiXLfGXoozmVNtpO14ipSuMilxODt/0YT0y/pFPC+Uerg8epu0y1EXRs39g0
166AYw7Mk46qI+odYn8PsVmfPW8EMstwWEhOe1wTlNs4e8LSROk49b7T4m+X
CGgazVRdgq4kOpNB2a2HM0LVzAfTgvMaq99dqL95Ai0nbEkpFe8tmzQtomuR
mSerGssT/SsMQc4rulsJ3prSQOr3V3nCFJfp/93IDqVvf/qeDqpN4oG1p5Z+
6ncxWHzDQZsYOHeaObsi9NDvjswJ7t8wp9dQ64xn24LOdTnHTLvhcLtk0OwC
W200oKPOwFSuCobCkrkZDkpTffOe9toZtRuxw8zREjkseeFDlyYP1jkzlz2e
Ojcz23Y82/c3TVb2FvPKeesPdZ3LWUGvPNkDC4rmUv90jnmiS9mb+Kj7Jove
iNkt7ow4gHweqVlhf92g9jsWm018q19O77563vyQDb36/XD31W5gandrpfpR
A4FLm1Db5NmtfS/LoPkbgpdnh2pgRgHgB/Zhaf+xrk/rP6dnfxbDQTNmIPae
V+EzVoWrMddXNB4sQhVca3nB7g7jLe9t3WG8/o5PvNTyGsfQLQdP+E08oVuB
Qf7T46Fb1aDQmxQa1+vgzQkCj9wyti/L8zeok4P679Fy+1tU5ocQaAfP/gQH
KPZM0q44FB0wmqxr3/5kBv1u5RRCAlrj7gx3/WM5X9KPb4A36Vgt588GCxEr
qbcIRfKansI9SgHpTyk/Bjpklu7w8+IHcctPgZRYv8y8+sFQ2hVfSDnHuege
KT+aFpoD4yWl2Y/Y/wKC9Eo5i3cAAA==

-->

</rfc>
