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

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

    * $$moqt-fetchheaderparsed-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="fetchobjectcreated">
        <name>fetch_object_created</name>
        <t>The <tt>fetch_object_created</tt> event is emitted when a fetch object is created. It
has Core importance level.</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 /
                            MOQTMaxSubscribeIdSetupParameter /
                            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="moqtmaxsubscribeidsetupparameter">
          <name>MOQTMaxSubscribeIdSetupParameter</name>
          <figure anchor="moqtmaxsubscribeidsetupparameter-def">
            <name>MOQTMaxSubscribeIdSetupParameter definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTMaxSubscribeIdSetupParameter = {
  name: "max_subscribe_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 /= MOQTAuthorizationInfoParameter /
                      MOQTDeliveryTimeoutParameter /
                      MOQTMaxCacheDurationParameter /
                      MOQTUnknownParameter

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

$MOQTControlMessage /= MOQTBaseControlMessages
]]></sourcecode>
        </figure>
        <section anchor="moqtclientsetupmessage">
          <name>MOQTClientSetupMessage</name>
          <figure anchor="clientsetup-def">
            <name>MOQTClientSetupMessage definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTClientSetupMessage = {
  type: "client_setup"
  number_of_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="moqtsubscribe">
          <name>MOQTSubscribe</name>
          <figure anchor="subscribe-def">
            <name>MOQTSubscribe definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTSubscribe = {
  type: "subscribe"
  subscribe_id: uint64
  track_alias: uint64
  track_namespace: [ *MOQTByteString]
  track_name: MOQTByteString
  subscriber_priority: uint8
  group_order: uint8
  filter_type: uint64
  ? start_group: uint64
  ? start_object: uint64
  ? end_group: uint64
  number_of_parameters: uint64
  ? subscribe_parameters: [* $MOQTParameter]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtsubscribeupdate">
          <name>MOQTSubscribeUpdate</name>
          <figure anchor="subscribeupdate-def">
            <name>MOQTSubscribeUpdate definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTSubscribeUpdate = {
  type: "subscribe_update"
  subscribe_id: uint64
  start_group: uint64
  start_object: uint64
  end_group: uint64
  subscriber_priority: uint8
  number_of_parameters: uint64
  ? subscribe_parameters: [* $MOQTParameter]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtunsubscribe">
          <name>MOQTUnsubscribe</name>
          <figure anchor="unsubscribe-def">
            <name>MOQTUnsubscribe definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTUnsubscribe = {
  type: "unsubscribe"
  subscribe_id: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="moqtfetch">
          <name>MOQTFetch</name>
          <figure anchor="fetch-def">
            <name>MOQTFetch definition</name>
            <sourcecode type="cddl"><![CDATA[
MOQTFetch = {
  type: "fetch"
  subscribe_id: uint64
  subscriber_priority: uint8
  group_order: uint8
  fetch_type: uint64

  track_namespace: [ *MOQTByteString]
  ? track_name: MOQTByteString
  ? start_group: uint64
  ? start_object: uint64
  ? end_group: uint64
  ? end_object: uint64

  ? joining_subscribe_id: uint64
  ? preceding_group_offset: uint64

  number_of_parameters: uint64
  ? parameters: [* $MOQTParameter]

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

Note to Readers

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

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

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

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

Note to Readers

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

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

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

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

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

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
VTZiRYBws4UBHBAtaICF7woVLRR0xomeEPE7iQ59gaEnJjyHKS70rR1mXW/5
TPs+unKi3NO65MOJPgJUB+ZOkiovlTM6eXyJWzR4Hld/eFNcvIF4FUl7a9jc
5NklfBEulxB28MKKPdhMN8DYNSG9Nrfaq0UJHj2ukFKe4cZQZE4cQ+FijlOX
uOzh5H6MyAmEIH0M8K68d8Su1/JWA10X9HpuU5nzy9tkm+OdRjquj78hE9LJ
drqEY7iDiR3i9O3HCT/XQ+l8Px5wNtcy6VrSIo8Xgi4luQGpVKO2UNf5Ncys
YKViaC6ehmcvZ/AaV+3IqJN1XHsOlV7vn3yYoo3tl3zUT9nqX9sh+VVSEJe4
PfOQ2uDeZMSQNDYkdR+A7chJLPF+Hqs/fdC8JS6UaQaoqSe5cUlQ9mpXFMJw
Sj8LXjtKN12c4XX8vYZ8m4iduOvHbCuC4ZBXW7pN0Qd/FavBuKklMwzqCJtt
US/sYRwnOUCe3QwGfZGmSXcVXYUeSAf5cH3g5C1eZ1G+W3fukELQdiq1j6yH
DyrmGSCjAnaYkHSLrR8twQ1DWVBwjKGgD9qtdYcjV88jdBH9I6yYB6hGDAWt
2MoHGMk+WiwGkexZm/9t8WONSsa9j+CrZuqe0J9GNj1j/Z5G03XqKGF+BzOg
9zOq/ymhpGvTs2Q5M3FNLmb2enYle/S9/P6hef+Dg6cs2pzsk2Z0XsJ4T1/t
h2r8ImJpZCN2Nfn0S6wZGOrHAJqRw5GY/qGXUmJKRnSH20qiwuVHEYKe3ysE
D+l+IehQV2PcxD+H2RU9G/mLiljuZuZ3fWZ5GvqKCD2+TqeZqUVBdsk1j2eY
2Oiqwz4mXfj2ctuOcOmnxS19kD1/6GacPzhQ03oxU5nPt3VkzrDgtcry4TKM
QJ/mmk3VEjKRZjPzu7WN5zrrc15A/tkA77e3Qj4+m/Obmx3iOath9NGjR539
tGnT5EZ+nc5yetuhWr/cWqTmk1mnCj+qQDVvrWI1gmlrH6iWZVJNIh2h5nH/
UimprEA3i37Vo3pKUnz7ui5FtO/Ypdv9VxftVjuLa/BCf9a91H+lJaqf1oDp
+d8T+jHZWYswnplfgUMQw/tyCVGgiqTXXHuMtL4n7N0H7tK5TvF9mjfJf1P/
s4DeDDBJAtfQXsLMFC2936K6qfd6y7LHIc7moLPkZjTQhkpS7eDkptHWLafr
JtTkmV5adf7vJ1fiu6EUg0tE8Bn2rxxD0TfrK12c6lV7fxvHUkAY29jWlHdz
7jWiWhHp5700pd+Keb951oj3s9+se2si8BTGjhg0z+bCTqohhsuiw/mVbBKQ
nsFMUGfVQ2RPelBUVm0ZQlmftyQJVvhqOLe/1FN6wnlBRWtELxnpDeptQvG2
LdrC/P6C8cb/Vsa8xPRou+F/qz2VFv1qD9wSF+XtNkyd7Q9vZmB+42Cmf8ms
fA5ljUihvjaBvR5z7UvfwbGPmhw2I0dVUD1C9sWOWj+qRdRF9GiT9i/0mP5a
zMO/N4rUeOhIRBpmZvtrngSk07y8xkQp3HJGrJRPOwzpX21G+kRfw4SsEDoE
5zOdSs/RI76PbTI1rryGUaGwZ2lgL7RtZVCftGVhLOBddxlKV7RdLs2J1QBc
Y/ZLmS8mRkpaFwaxMOT0Ved5K1cIvhNWPam6e8iq+1hVn8Zsg7lNa0UD2q85
NZvr9/r/+HMbbvKNv8byyFqZsa3yLibvTmlbkll/GvtbZDF27rbMtTVjEX4O
Kz38WnayL5fVlOQDqazkpO0pdXsu/avk0G0uIhJtEcMbLrypeEcOXpNIR/bd
nphV90v6MvAPqpabmWZyw3l/Gt2fCNV3bXoY7EyNSh5/sxK7KajuNKnGmPf8
RO12Qv1HVt23RjbmSlejiW2eN48amReeY0mNCwwlt8X5Cz26ymVBFjd01e8j
XMggx34h/pY5/iS/PpSFlxHOjs+Kt4z+d1qHbw6bYM65BbwXFScaUtDvBSj7
v+WagwUglsMAT0JFcrGiH6cGBrRzlouno6WIFP3WM00uCkg5Yf8DYvaxscNv
AAA=

-->

</rfc>
