<?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.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-pardue-moq-qlog-moq-events-03" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title>MoQ qlog event definitions</title>
    <seriesInfo name="Internet-Draft" value="draft-pardue-moq-qlog-moq-events-03"/>
    <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="October" day="20"/>
    <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, 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 /
                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.</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.</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.</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"
]]></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>
        <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.</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.</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.</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.</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.</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>
        <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.</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="moqtsetupparameter">
        <name>MOQTSetupParameter</name>
        <t>The generic $MOQTSetupParameter is defined here as a CDDL "type socket"
extension point. It can be extended to support additional MOQT Setup Parameters.</t>
        <figure anchor="moqtsetupparameter-def">
          <name>MOQTSetupParameter type socket definition</name>
          <sourcecode type="cddl"><![CDATA[
; The MOQTSetupParameter is any key-value map (e.g., JSON object)
$MOQTSetupParameter /= {
    * text => any
}
]]></sourcecode>
        </figure>
        <figure anchor="moqtbasesetupparameters-def">
          <name>MOQTBaseSetupParameters definition</name>
          <sourcecode type="cddl"><![CDATA[
MOQTBaseSetupParameters /= MOQTPathSetupParameter /
                            MOQTMaxRequestIdSetupParameter /
                            MOQTUnknownSetupParameter

$MOQTSetupParameter /= MOQTBaseSetupParameters
]]></sourcecode>
        </figure>
        <section anchor="moqtpathsetupparameter">
          <name>MOQTPathSetupParameter</name>
          <figure anchor="moqtpathsetupparameter-def">
            <name>MOQTPathSetupParameter definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTPathSetupParameter = {
  name: "path"
  value: text
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtmaxrequestidsetupparameter">
          <name>MOQTMaxRequestIdSetupParameter</name>
          <figure anchor="moqtmaxsubscribeidsetupparameter-def">
            <name>MOQTMaxRequestIdSetupParameter definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTMaxRequestIdSetupParameter = {
  name: "max_request_id"
  value: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtunknownsetupparameter">
          <name>MOQTUnknownSetupParameter</name>
          <figure anchor="moqtunknownsetupparameter-def">
            <name>MOQTUnknownSetupParameter definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTUnknownSetupParameter = {
  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 /
                      MOQTMaxCacheDurationParameter /
                      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="moqtmaxcachedurationparameter">
          <name>MOQTMaxCacheDurationParameter</name>
          <figure anchor="moqtmaxcachedurationparameter-def">
            <name>MOQTMaxCacheDurationParameter definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTMaxCacheDurationParameter = {
  name: "max_cache_duration"
  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="moqtlocation">
        <name>MOQTLocation</name>
        <t>A Location, as defined in <xref section="1.3.1" sectionFormat="of" target="MOQT"/></t>
        <figure anchor="moqtlocation-def">
          <sourcecode type="cddl"><![CDATA[
MOQTLocation = {
  group: uint64
  object: uint64
}
]]></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 /
                          MOQTMaxRequestId /
                          MOQTRequestsBlocked /
                          MOQTSubscribe /
                          MOQTSubscribeOk /
                          MOQTSubscribeError /
                          MOQTSubscribeUpdate /
                          MOQTUnsubscribe /
                          MOQTPublishDone /
                          MOQTPublish /
                          MOQTPublishOk /
                          MOQTPublishError /
                          MOQTFetch /
                          MOQTFetchOk /
                          MOQTFetchError /
                          MOQTFetchCancel /
                          MOQTTrackStatus /
                          MOQTTrackStatusOk /
                          MOQTTrackStatusError /
                          MOQTPublishNamespace /
                          MOQTPublishNamespaceOk /
                          MOQTPublishNamespaceError /
                          MOQTPublishNamespaceDone /
                          MOQTPublishNamespaceCancel /
                          MOQTSubscribeNamespace /
                          MOQTSubscribeNamespaceOk /
                          MOQTSubscribeNamespaceError /
                          MOQTUnsubscribeNamespace

$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_supported_versions: uint64
  supported_versions: [* uint64]
  number_of_parameters: uint64
  ? setup_parameters: [* $MOQTSetupParameter]
}
]]></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: [* $MOQTSetupParameter]
}
]]></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="moqtmaxrequestid">
          <name>MOQTMaxRequestId</name>
          <figure anchor="maxsubscribeid-def">
            <name>MOQTMaxRequestId definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTMaxRequestId = {
  type: "max_request_id"
  request_id: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtrequestsblocked">
          <name>MOQTRequestsBlocked</name>
          <figure anchor="subscribesblocked-def">
            <name>MOQTRequestsBlocked definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTRequestsBlocked = {
  type: "requests_blocked"
  maximum_request_id: uint64
}
]]></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
  track_namespace: [ *MOQTByteString]
  track_name: MOQTByteString
  subscriber_priority: uint8
  group_order: uint8
  forward: uint8
  filter_type: uint64
  ? start_location: MOQTLocation
  ? end_group: uint64
  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
  expires: uint64
  group_order: uint8
  content_exists: uint8
  ? largest_location: MOQTLocation
  number_of_parameters: uint64
  ? 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"
  request_id: uint64
  error_code: uint64
  ? reason: text
  ? reason_bytes: hexstring
}
]]></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"
  request_id: uint64
  start_location: MOQTLocation
  end_group: uint64
  subscriber_priority: uint8
  forward: uint8
  number_of_parameters: uint64
  ? 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"
  request_id: uint64
}
]]></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="moqtpublish">
          <name>MOQTPublish</name>
          <figure anchor="publish-def">
            <name>MOQTPublish definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTPublish = {
  type: "publish"
  request_id: uint64
  track_namespace: [ *MOQTByteString]
  track_name: MOQTByteString
  track_alias: uint64
  group_order: uint8
  content_exists: uint8
  ? largest: MOQTLocation
  forward: uint8
  number_of_parameters: uint64
  ? parameters: [* $MOQTParameter]
}
]]></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
  forward: uint8
  subscriber_priority: uint8
  group_order: uint8
  filter_type: uint64
  ? start: MOQTLocation
  ? end_group: uint64
  number_of_parameters: uint64
  ? parameters: [* $MOQTParameter]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtpublisherror">
          <name>MOQTPublishError</name>
          <figure anchor="publisherror-def">
            <name>MOQTPublishError definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTPublishError = {
  type: "publish_error"
  request_id: uint64
  error_code: 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
  subscriber_priority: uint8
  group_order: uint8
  fetch_type: uint64

  track_namespace: [ *MOQTByteString]
  ? track_name: MOQTByteString
  ? start_location: MOQTLocation
  ? end_location: MOQTLocation

  ? joining_request_id: uint64
  ? preceding_group_offset: uint64

  number_of_parameters: uint64
  ? parameters: [* $MOQTParameter]

}
]]></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
  group_order: uint8
  end_of_track: uint8
  end_location: MOQTLocation
  number_of_parameters: uint64
  ? 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"
  request_id: uint64
  error_code: uint64
  ? reason: text
  ? reason_bytes: hexstring
}
]]></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"
  request_id: uint64
}
]]></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
  track_namespace: [ *MOQTByteString]
  track_name: MOQTByteString
  subscriber_priority: uint8
  group_order: uint8
  forward: uint8
  filter_type: uint64
  ? start_location: MOQTLocation
  ? end_group: uint64
  number_of_parameters: uint64
  ? parameters: [* $MOQTParameter]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqttrackstatusok">
          <name>MOQTTrackStatusOk</name>
          <figure anchor="trackstatusok-def">
            <name>MOQTTrackStatusOk definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTTrackStatusOk = {
  type: "track_status_ok"
  request_id: uint64
  track_alias: uint64
  expires: uint64
  group_order: uint8
  content_exists: uint8
  ? largest_location: MOQTLocation
  number_of_parameters: uint64
  ? parameters: [* $MOQTParameter]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqttrackstatuserror">
          <name>MOQTTrackStatusError</name>
          <figure anchor="trackstatuserror-def">
            <name>MOQTTrackStatusError definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTTrackStatusError = {
  type: "track_status_error"
  request_id: uint64
  error_code: uint64
  ? reason: text
  ? reason_bytes: hexstring
}
]]></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
  track_namespace: [ *MOQTByteString]
  number_of_parameters: uint64
  ? parameters: [* $MOQTParameter]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtpublishnamespaceok">
          <name>MOQTPublishNamespaceOk</name>
          <figure anchor="publishnamespaceok-def">
            <name>MOQTPublishNamespaceOk definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTPublishNamespaceOk = {
  type: "publish_namespace_ok"
  request_id: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtpublishnamespaceerror">
          <name>MOQTPublishNamespaceError</name>
          <figure anchor="publishnamespaceerror-def">
            <name>MOQTPublishNamespaceError definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTPublishNamespaceError = {
  type: "publish_namespace_error"
  request_id: uint64
  error_code: uint64
  ? reason: text
  ? reason_bytes: hexstring
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtpublishnamespacedone">
          <name>MOQTPublishNamespaceDone</name>
          <figure anchor="publishnamespacedone-def">
            <name>MOQTPublishNamespaceDone definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTPublishNamespaceDone = {
  type: "publish_namespace_done"
  track_namespace: [ *MOQTByteString]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtpublishnamespacecancel">
          <name>MOQTPublishNamespaceCancel</name>
          <figure anchor="publishnamespacecancel-def">
            <name>MOQTPublishNamespaceCancel definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTPublishNamespaceCancel = {
  type: "publish_namespace_cancel"
  track_namespace: [ *MOQTByteString]
  error_code: uint64
  ? reason: text
  ? reason_bytes: hexstring
}
]]></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
  track_namespace_prefix: [ *MOQTByteString]
  number_of_parameters: uint64
  ? parameters: [* $MOQTParameter]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtsubscribenamespaceok">
          <name>MOQTSubscribeNamespaceOk</name>
          <figure anchor="subscribenamespaceok">
            <name>MOQTSubscribeNamespaceOk definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTSubscribeNamespaceOk = {
  type: "subscribe_namespace_ok"
  request_id: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtsubscribenamespaceerror">
          <name>MOQTSubscribeNamespaceError</name>
          <figure anchor="subscribenamespaceerror-def">
            <name>MOQTSubscribeNamespaceError definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTSubscribeNamespaceError = {
  type: "subscribe_namespace_error"
  request_id: uint64
  error_code: uint64
  ? reason: text
  ? reason_bytes: hexstring
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtunsubscribenamespace">
          <name>MOQTUnsubscribeNamespace</name>
          <figure anchor="unsubscribenamespace-def">
            <name>MOQTUnsubscribeNamespace definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTUnsubscribeNamespace = {
  type: "unsubscribe_namespace"
  track_namespace_prefix: [ *MOQTByteString]
}
]]></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>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,
object_datagram_status_created,
object_datagram_status_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="20" month="October" year="2025"/>
          <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-13"/>
      </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="20" month="October" year="2025"/>
          <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-12"/>
      </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="2" month="September" 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-14"/>
      </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 1189?>

<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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
lqV6AAA=

-->

</rfc>
