<?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.6.17 (Ruby 3.0.2) -->
<?rfc docindent="yes"?>
<?rfc strict="yes"?>
<?rfc compact="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-quic-qlog-h3-events-03" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.14.2 -->
  <front>
    <title>HTTP/3 and QPACK qlog event definitions</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-h3-events-03"/>
    <author initials="R." surname="Marx" fullname="Robin Marx" role="editor">
      <organization>Akamai</organization>
      <address>
        <email>rmarx@akamai.com</email>
      </address>
    </author>
    <author initials="L." surname="Niccolini" fullname="Luca Niccolini" role="editor">
      <organization>Meta</organization>
      <address>
        <email>lniccolini@meta.com</email>
      </address>
    </author>
    <author initials="M." surname="Seemann" fullname="Marten Seemann" role="editor">
      <organization>Protocol Labs</organization>
      <address>
        <email>marten@protocol.ai</email>
      </address>
    </author>
    <author initials="L." surname="Pardue" fullname="Lucas Pardue" role="editor">
      <organization>Cloudflare</organization>
      <address>
        <email>lucaspardue.24.7@gmail.com</email>
      </address>
    </author>
    <date year="2022" month="October" day="24"/>
    <area>Transport</area>
    <workgroup>QUIC</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>This document describes concrete qlog event definitions and their metadata for
HTTP/3 and QPACK-related events. These events can then be embedded in the higher
level schema defined in <xref target="QLOG-MAIN"/>.</t>
    </abstract>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>This document describes the values of the qlog name ("category" + "event") and
"data" fields and their semantics for HTTP/3 <xref target="RFC9114"/> and QPACK
<xref target="QPACK"/>.</t>
      <ul empty="true">
        <li>
          <t>Note to RFC editor: Please remove the follow paragraphs in this section before
publication.</t>
        </li>
      </ul>
      <t>Feedback and discussion are welcome at
<eref target="https://github.com/quicwg/qlog">https://github.com/quicwg/qlog</eref>.
Readers are advised to refer to the "editor's draft" at that URL for an up-to-date
version of this document.</t>
      <t>Concrete examples of integrations of this schema in
various programming languages can be found at
<eref target="https://github.com/quiclog/qlog/">https://github.com/quiclog/qlog/</eref>.</t>
      <section anchor="notational-conventions">
        <name>Notational Conventions</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>
        <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, category,
type, data, group_id, protocol_type, importance, RawInfo, and time-related
fields.</t>
      </section>
    </section>
    <section anchor="overview">
      <name>Overview</name>
      <t>This document describes how the HTTP/3 and QPACK can be expressed in qlog using
the schema defined in <xref target="QLOG-MAIN"/>. HTTP/3 and QPACK events are defined with a
category, a name (the concatenation of "category" and "event"), an "importance",
an optional "trigger", and "data" fields.</t>
      <t>Some data fields use complex datastructures. These are represented as enums or
re-usable definitions, which are grouped together on the bottom of this document
for clarity.</t>
      <t>When any event from this document is included in a qlog trace, the
"protocol_type" qlog array field <bcp14>MUST</bcp14> contain an entry with the value "HTTP3".</t>
      <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 HTTP/3 connection. 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 anchor="raw-packet-and-frame-information">
        <name>Raw packet and frame information</name>
        <t>This document re-uses the definition of the RawInfo data class from <xref target="QLOG-MAIN"/>.</t>
        <dl>
          <dt>Note:</dt>
          <dd>
            <t>As HTTP/3 does not use trailers in frames, each HTTP/3 frame header_length can
be calculated as header_length = RawInfo:length - RawInfo:payload_length</t>
          </dd>
          <dt>Note:</dt>
          <dd>
            <t>In some cases, the length fields are also explicitly reflected inside of frame
headers. For example, all HTTP/3 frames include their explicit payload lengths in
the frame header. In these cases, those fields are intentionally preserved in the
event definitions. Even though this can lead to duplicate data when the full
RawInfo is logged, it allows a more direct mapping of the HTTP/3 specifications to
qlog, making it easier for users to interpret. In this case, both fields <bcp14>MUST</bcp14> have
the same value.</t>
          </dd>
        </dl>
      </section>
    </section>
    <section anchor="http3-and-qpack-event-overview">
      <name>HTTP/3 and QPACK Event Overview</name>
      <t>This document defines events in two categories, written as lowercase to follow convention: http (<xref target="http-ev"/>) and qpack
(<xref target="qpack-ev"/>).</t>
      <t>As described in <xref section="3.4.2" sectionFormat="of" target="QLOG-MAIN"/>, the qlog "name" field is the
concatenation of category and type.</t>
      <t><xref target="h3-qpack-events"/> summarizes the name value of each event type that is defined
in this specification.</t>
      <table anchor="h3-qpack-events">
        <name>HTTP/3 and QPACK 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">http:parameters_set</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="http-parametersset"/></td>
          </tr>
          <tr>
            <td align="left">http:parameters_restored</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="http-parametersrestored"/></td>
          </tr>
          <tr>
            <td align="left">http:stream_type_set</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="http-streamtypeset"/></td>
          </tr>
          <tr>
            <td align="left">http:frame_created</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="http-framecreated"/></td>
          </tr>
          <tr>
            <td align="left">http:frame_parsed</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="http-frameparsed"/></td>
          </tr>
          <tr>
            <td align="left">http:push_resolved</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="http-pushresolved"/></td>
          </tr>
          <tr>
            <td align="left">qpack:state_updated</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="qpack-stateupdated"/></td>
          </tr>
          <tr>
            <td align="left">qpack:stream_state_updated</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="qpack-streamstateupdate"/></td>
          </tr>
          <tr>
            <td align="left">qpack:dynamic_table_updated</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="qpack-dynamictableupdate"/></td>
          </tr>
          <tr>
            <td align="left">qpack:headers_encoded</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="qpack-headersencoded"/></td>
          </tr>
          <tr>
            <td align="left">qpack:headers_decoded</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="qpack-headersdecoded"/></td>
          </tr>
          <tr>
            <td align="left">qpack:instruction_created</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="qpack-instructioncreated"/></td>
          </tr>
          <tr>
            <td align="left">qpack:instruction_parsed</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="qpack-instructionparsed"/></td>
          </tr>
        </tbody>
      </table>
    </section>
    <section anchor="http-ev">
      <name>HTTP/3 Events</name>
      <t>HTTP/3 events extend the <tt>$ProtocolEventBody</tt> extension point defined in <xref target="QLOG-MAIN"/>.</t>
      <figure anchor="httpevents-def">
        <name>HTTPEvents definition and ProtocolEventBody extension</name>
        <sourcecode type="cddl"><![CDATA[
HTTPEvents = HTTPParametersSet / HTTPParametersRestored /
             HTTPStreamTypeSet / HTTPFrameCreated /
             HTTPFrameParsed / HTTPPushResolved

$ProtocolEventBody /= HTTPEvents
]]></sourcecode>
      </figure>
      <section anchor="http-parametersset">
        <name>parameters_set</name>
        <t>Importance: Base</t>
        <t>This event contains HTTP/3 and QPACK-level settings, mostly those received from
the HTTP/3 SETTINGS frame. All these parameters are typically set once and never
change. However, they are typically set at different times during the connection,
so there can be several instances of this event with different fields set.</t>
        <t>Note that some settings have two variations (one set locally, one requested by the
remote peer). This is reflected in the "owner" field. As such, this field <bcp14>MUST</bcp14> be
correct for all settings included a single event instance. If you need to log
settings from two sides, you <bcp14>MUST</bcp14> emit two separate event instances.</t>
        <t>Note: we use the CDDL unwrap operator (~) here to make HTTPParameters
into a re-usable list of fields. The unwrap operator copies the fields
from the referenced type into the target type directly, extending the
target with the unwrapped fields. TODO: explain this better + provide
reference and maybe an example.</t>
        <t>Definition:</t>
        <figure anchor="http-parametersset-def">
          <name>HTTPParametersSet definition</name>
          <sourcecode type="cddl"><![CDATA[
HTTPParametersSet = {
    ? owner: Owner

    ~HTTPParameters

    ; qlog-specific
    ; indicates whether this implementation waits for a SETTINGS
    ; frame before processing requests
    ? waits_for_settings: bool
}

HTTPParameters = {
    ? max_header_list_size: uint64
    ? max_table_capacity: uint64
    ? blocked_streams_count: uint64

    ; additional settings for grease and extensions
    * text => uint64
}
]]></sourcecode>
        </figure>
        <t>Note: enabling server push is not explicitly done in HTTP/3 by use of a setting or
parameter. Instead, it is communicated by use of the MAX_PUSH_ID frame, which
should be logged using the frame_created and frame_parsed events below.</t>
        <t>Additionally, this event can contain any number of unspecified fields. This is to
reflect setting of for example unknown (greased) settings or parameters of
(proprietary) extensions.</t>
      </section>
      <section anchor="http-parametersrestored">
        <name>parameters_restored</name>
        <t>Importance: Base</t>
        <t>When using QUIC 0-RTT, HTTP/3 clients are expected to remember and reuse the
server's SETTINGs from the previous connection. This event is used to indicate
which HTTP/3 settings were restored and to which values when utilizing 0-RTT.</t>
        <t>Definition:</t>
        <figure anchor="http-parametersrestored-def">
          <name>HTTPParametersRestored definition</name>
          <sourcecode type="cddl"><![CDATA[
HTTPParametersRestored = {

    ~HTTPParameters

}
]]></sourcecode>
        </figure>
        <t>Note that, like for parameters_set above, this event can contain any number of
unspecified fields to allow for additional and custom settings.</t>
      </section>
      <section anchor="http-streamtypeset">
        <name>stream_type_set</name>
        <t>Importance: Base</t>
        <t>Emitted when a stream's type becomes known. This is typically when a stream is
opened and the stream's type indicator is sent or received.</t>
        <t>Note: most of this information can also be inferred by looking at a stream's id,
since id's are strictly partitioned at the QUIC level. Even so, this event has a
"Base" importance because it helps a lot in debugging to have this information
clearly spelled out.</t>
        <t>Definition:</t>
        <figure anchor="https-streamtypeset-def">
          <name>HTTPStreamTypeSet definition</name>
          <sourcecode type="cddl"><![CDATA[
HTTPStreamTypeSet = {
    ? owner: Owner
    stream_id: uint64

    stream_type: HTTPStreamType

    ; only when stream_type === "unknown"
    ? raw_stream_type: uint64

    ; only when stream_type === "push"
    ? associated_push_id: uint64
}

HTTPStreamType =  "request" /
                  "control" /
                  "push" /
                  "reserved" /
                  "unknown" /
                  "qpack_encode" /
                  "qpack_decode"
]]></sourcecode>
        </figure>
      </section>
      <section anchor="http-framecreated">
        <name>frame_created</name>
        <t>Importance: Core</t>
        <t>HTTP equivalent to the packet_sent event. This event is emitted when the HTTP/3
framing actually happens. Note: this is not necessarily the same as when the
HTTP/3 data is passed on to the QUIC layer. For that, see the "data_moved" event
in <xref target="QLOG-QUIC"/>.</t>
        <t>Definition:</t>
        <figure anchor="http-framecreated-def">
          <name>HTTPFrameCreated definition</name>
          <sourcecode type="cddl"><![CDATA[
HTTPFrameCreated = {
    stream_id: uint64
    ? length: uint64
    frame: $HTTPFrame
    ? raw: RawInfo
}
]]></sourcecode>
        </figure>
        <t>Note: in HTTP/3, DATA frames can have arbitrarily large lengths to reduce frame
header overhead. As such, DATA frames can span many QUIC packets and can be
created in a streaming fashion. In this case, the frame_created event is emitted
once for the frame header, and further streamed data is indicated using the
data_moved event.</t>
      </section>
      <section anchor="http-frameparsed">
        <name>frame_parsed</name>
        <t>Importance: Core</t>
        <t>HTTP equivalent to the packet_received event. This event is emitted when we
actually parse the HTTP/3 frame. Note: this is not necessarily the same as when
the HTTP/3 data is actually received on the QUIC layer. For that, see the
"data_moved" event in <xref target="QLOG-QUIC"/>.</t>
        <t>Definition:</t>
        <figure anchor="http-frameparsed-def">
          <name>HTTPFrameParsed definition</name>
          <sourcecode type="cddl"><![CDATA[
HTTPFrameParsed = {
    stream_id: uint64
    ? length: uint64
    frame: $HTTPFrame
    ? raw: RawInfo
}
]]></sourcecode>
        </figure>
        <t>Note: in HTTP/3, DATA frames can have arbitrarily large lengths to reduce frame
header overhead. As such, DATA frames can span many QUIC packets and can be
processed in a streaming fashion. In this case, the frame_parsed event is emitted
once for the frame header, and further streamed data is indicated using the
data_moved event.</t>
      </section>
      <section anchor="http-pushresolved">
        <name>push_resolved</name>
        <t>Importance: Extra</t>
        <t>This event is emitted when a pushed resource is successfully claimed (used) or,
conversely, abandoned (rejected) by the application on top of HTTP/3 (e.g., the
web browser). This event is added to help debug problems with unexpected PUSH
behaviour, which is commonplace with HTTP/2.</t>
        <t>Definition:</t>
        <figure anchor="http-pushresolved-def">
          <name>HTTPPushResolved definition</name>
          <sourcecode type="cddl"><![CDATA[
HTTPPushResolved = {
    ? push_id: uint64

    ; in case this is logged from a place that does not have access
    ; to the push_id
    ? stream_id: uint64

    decision: HTTPPushDecision
}

HTTPPushDecision = "claimed" / "abandoned"
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section anchor="http3-data-field-definitions">
      <name>HTTP/3 Data Field Definitions</name>
      <t>The following data field definitions can be used in HTTP/3 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="httpframe">
        <name>HTTPFrame</name>
        <t>The generic <tt>$HTTPFrame</tt> is defined here as a CDDL extension point (a "socket"
or "plug"). It can be extended to support additional HTTP/3 frame types.</t>
        <figure anchor="httpframe-def">
          <name>HTTPFrame plug definition</name>
          <sourcecode type="cddl"><![CDATA[
; The HTTPFrame is any key-value map (e.g., JSON object)
$HTTPFrame /= {
    * text => any
}
]]></sourcecode>
        </figure>
        <t>The HTTP/3 frame types defined in this document are as follows:</t>
        <figure anchor="httpbaseframe-def">
          <name>HTTPBaseFrames definition</name>
          <sourcecode type="cddl"><![CDATA[
HTTPBaseFrames =  HTTPDataFrame /
             HTTPHeadersFrame /
             HTTPCancelPushFrame /
             HTTPSettingsFrame /
             HTTPPushPromiseFrame /
             HTTPGoawayFrame /
             HTTPMaxPushIDFrame /
             HTTPReservedFrame /
             HTTPUnknownFrame

$HTTPFrame /= HTTPBaseFrames
]]></sourcecode>
        </figure>
        <section anchor="httpdataframe">
          <name>HTTPDataFrame</name>
          <figure anchor="httpdataframe-def">
            <name>HTTPDataFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTPDataFrame = {
    frame_type: "data"
    ? raw: hexstring
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="httpheadersframe">
          <name>HTTPHeadersFrame</name>
          <t>This represents an <em>uncompressed</em>, plaintext HTTP Headers frame (e.g., no QPACK
compression is applied).</t>
          <t>For example:</t>
          <figure anchor="http-headersframe-ex">
            <name>HTTPHeadersFrame example</name>
            <artwork><![CDATA[
headers: [
  {
    "name": ":path",
    "value": "/"
  },
  {
    "name": ":method",
    "value": "GET"
  },
  {
    "name": ":authority",
    "value": "127.0.0.1:4433"
  },
  {
    "name": ":scheme",
    "value": "https"
  }
]
]]></artwork>
          </figure>
          <figure anchor="http-headersframe-def">
            <name>HTTPHeadersFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTPHeadersFrame = {
    frame_type: "headers"
    headers: [* HTTPField]
}
]]></sourcecode>
          </figure>
          <figure anchor="httpfield-def">
            <name>HTTPField definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTPField = {
    name: text
    value: text
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="httpcancelpushframe">
          <name>HTTPCancelPushFrame</name>
          <figure anchor="http-cancelpushframe-def">
            <name>HTTPCancelPushFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTPCancelPushFrame = {
    frame_type: "cancel_push"
    push_id: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="httpsettingsframe">
          <name>HTTPSettingsFrame</name>
          <figure anchor="httpsettingsframe-def">
            <name>HTTPSettingsFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTPSettingsFrame = {
    frame_type: "settings"
    settings: [* HTTPSetting]
}

HTTPSetting = {
    name: text
    value: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="httppushpromiseframe">
          <name>HTTPPushPromiseFrame</name>
          <figure anchor="httppushpromiseframe-def">
            <name>HTTPPushPromiseFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTPPushPromiseFrame = {
    frame_type: "push_promise"
    push_id: uint64
    headers: [* HTTPField]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="httpgoawayframe">
          <name>HTTPGoAwayFrame</name>
          <figure anchor="httpgoawayframe-def">
            <name>HTTPGoawayFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTPGoawayFrame = {
    frame_type: "goaway"

    ; Either stream_id or push_id.
    ; This is implicit from the sender of the frame
    id: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="httpmaxpushidframe">
          <name>HTTPMaxPushIDFrame</name>
          <figure anchor="httpmaxpushidframe-def">
            <name>HTTPMaxPushIDFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTPMaxPushIDFrame = {
    frame_type: "max_push_id"
    push_id: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="httpreservedframe">
          <name>HTTPReservedFrame</name>
          <figure anchor="httpreservedframe-def">
            <name>HTTPReservedFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTPReservedFrame = {
    frame_type: "reserved"

    ? length: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="httpunknownframe">
          <name>HTTPUnknownFrame</name>
          <figure anchor="httpunknownframe-def">
            <name>UnknownFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTPUnknownFrame = {
    frame_type: "unknown"
    raw_frame_type: uint64

    ? raw_length: uint32
    ? raw: hexstring
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="httpapplicationerror">
          <name>HTTPApplicationError</name>
          <figure anchor="httpapplicationerror-def">
            <name>HTTPApplicationError definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTPApplicationError =  "http_no_error" /
                        "http_general_protocol_error" /
                        "http_internal_error" /
                        "http_stream_creation_error" /
                        "http_closed_critical_stream" /
                        "http_frame_unexpected" /
                        "http_frame_error" /
                        "http_excessive_load" /
                        "http_id_error" /
                        "http_settings_error" /
                        "http_missing_settings" /
                        "http_request_rejected" /
                        "http_request_cancelled" /
                        "http_request_incomplete" /
                        "http_early_response" /
                        "http_connect_error" /
                        "http_version_fallback"
]]></sourcecode>
          </figure>
          <t>The HTTPApplicationError defines the general $ApplicationError
definition in the qlog QUIC definition, see <xref target="QLOG-QUIC"/>.</t>
          <sourcecode type="cddl"><![CDATA[
; ensure HTTP errors are properly validate in QUIC events as well
; e.g., QUIC's ConnectionClose Frame
$ApplicationError /= HTTPApplicationError
]]></sourcecode>
        </section>
      </section>
    </section>
    <section anchor="qpack-ev">
      <name>QPACK Events</name>
      <t>QPACK events extend the <tt>$ProtocolEventBody</tt> extension point defined in
<xref target="QLOG-MAIN"/>.</t>
      <figure anchor="qpackevents-def">
        <name>QPACKEvents definition and ProtocolEventBody extension</name>
        <sourcecode type="cddl"><![CDATA[
QPACKEvents = QPACKStateUpdate / QPACKStreamStateUpdate /
              QPACKDynamicTableUpdate / QPACKHeadersEncoded /
              QPACKHeadersDecoded / QPACKInstructionCreated /
              QPACKInstructionParsed

$ProtocolEventBody /= QPACKEvents
]]></sourcecode>
      </figure>
      <t>QPACK events mainly serve as an aid to debug low-level QPACK issues.The
higher-level, plaintext header values <bcp14>SHOULD</bcp14> (also) be logged in the
http.frame_created and http.frame_parsed event data (instead).</t>
      <t>Note: qpack does not have its own parameters_set event. This was merged with
http.parameters_set for brevity, since qpack is a required extension for HTTP/3
anyway. Other HTTP/3 extensions <bcp14>MAY</bcp14> also log their SETTINGS fields in
http.parameters_set or <bcp14>MAY</bcp14> define their own events.</t>
      <section anchor="qpack-stateupdated">
        <name>state_updated</name>
        <t>Importance: Base</t>
        <t>This event is emitted when one or more of the internal QPACK variables changes
value. Note that some variables have two variations (one set locally, one
requested by the remote peer). This is reflected in the "owner" field. As such,
this field <bcp14>MUST</bcp14> be correct for all variables included a single event instance. If
you need to log settings from two sides, you <bcp14>MUST</bcp14> emit two separate event
instances.</t>
        <t>Definition:</t>
        <figure anchor="qpack-stateupdate-def">
          <name>QPACKStateUpdate definition</name>
          <sourcecode type="cddl"><![CDATA[
QPACKStateUpdate = {
    owner: Owner
    ? dynamic_table_capacity: uint64

    ; effective current size, sum of all the entries
    ? dynamic_table_size: uint64
    ? known_received_count: uint64
    ? current_insert_count: uint64
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="qpack-streamstateupdate">
        <name>stream_state_updated</name>
        <t>Importance: Core</t>
        <t>This event is emitted when a stream becomes blocked or unblocked by header
decoding requests or QPACK instructions.</t>
        <t>Note: This event is of "Core" importance, as it might have a large impact on
HTTP/3's observed performance.</t>
        <t>Definition:</t>
        <figure anchor="qpack-streamstateupdate-def">
          <name>QPACKStreamStateUpdate definition</name>
          <sourcecode type="cddl"><![CDATA[
QPACKStreamStateUpdate = {
    stream_id: uint64
    ; streams are assumed to start "unblocked"
    ; until they become "blocked"
    state: QPACKStreamState
}

QPACKStreamState = "blocked" / "unblocked"
]]></sourcecode>
        </figure>
      </section>
      <section anchor="qpack-dynamictableupdate">
        <name>dynamic_table_updated</name>
        <t>Importance: Extra</t>
        <t>This event is emitted when one or more entries are inserted or evicted from QPACK's dynamic table.</t>
        <t>Definition:</t>
        <figure anchor="qpack-dynamictableupdate-def">
          <name>QPACKDynamicTableUpdate definition</name>
          <sourcecode type="cddl"><![CDATA[
QPACKDynamicTableUpdate = {
    ; local = the encoder's dynamic table
    ; remote = the decoder's dynamic table
    owner: Owner

    update_type: QPACKDynamicTableUpdateType
    entries: [+ QPACKDynamicTableEntry]
}

QPACKDynamicTableUpdateType = "inserted" / "evicted"

QPACKDynamicTableEntry = {
    index: uint64
    ? name: text / hexstring
    ? value: text / hexstring
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="qpack-headersencoded">
        <name>headers_encoded</name>
        <t>Importance: Base</t>
        <t>This event is emitted when an uncompressed header block is encoded successfully.</t>
        <t>Note: this event has overlap with http.frame_created for the HeadersFrame type.
When outputting both events, implementers <bcp14>MAY</bcp14> omit the "headers" field in this
event.</t>
        <t>Definition:</t>
        <figure anchor="qpack-headersencoded-def">
          <name>QPACKHeadersEncoded definition</name>
          <sourcecode type="cddl"><![CDATA[
QPACKHeadersEncoded = {
    ? stream_id: uint64
    ? headers: [+ HTTPField]

    block_prefix: QPACKHeaderBlockPrefix
    header_block: [+ QPACKHeaderBlockRepresentation]

    ? length: uint
    ? raw: hexstring
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="qpack-headersdecoded">
        <name>headers_decoded</name>
        <t>Importance: Base</t>
        <t>This event is emitted when a compressed header block is decoded successfully.</t>
        <t>Note: this event has overlap with http.frame_parsed for the HeadersFrame type.
When outputting both events, implementers <bcp14>MAY</bcp14> omit the "headers" field in this
event.</t>
        <t>Definition:</t>
        <figure anchor="qpack-headersdecoded-def">
          <name>QPACKHeadersDecoded definition</name>
          <sourcecode type="cddl"><![CDATA[
QPACKHeadersDecoded = {
    ? stream_id: uint64
    ? headers: [+ HTTPField]

    block_prefix: QPACKHeaderBlockPrefix
    header_block: [+ QPACKHeaderBlockRepresentation]

    ? length: uint32
    ? raw: hexstring
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="qpack-instructioncreated">
        <name>instruction_created</name>
        <t>Importance: Base</t>
        <t>This event is emitted when a QPACK instruction (both decoder and encoder) is
created and added to the encoder/decoder stream.</t>
        <t>Definition:</t>
        <figure anchor="qpack-instructioncreated-def">
          <name>QPACKInstructionCreated definition</name>
          <sourcecode type="cddl"><![CDATA[
QPACKInstructionCreated = {
    ; see definition in appendix
    instruction: QPACKInstruction
    ? length: uint32
    ? raw: hexstring
}
]]></sourcecode>
        </figure>
        <t>Note: encoder/decoder semantics and stream_id's are implicit in either the
instruction types or can be logged via other events (e.g., http.stream_type_set)</t>
      </section>
      <section anchor="qpack-instructionparsed">
        <name>instruction_parsed</name>
        <t>Importance: Base</t>
        <t>This event is emitted when a QPACK instruction (both decoder and encoder) is read
from the encoder/decoder stream.</t>
        <t>Definition:</t>
        <figure anchor="qpack-instructionparsed-def">
          <name>QPACKInstructionParsed definition</name>
          <sourcecode type="cddl"><![CDATA[
QPACKInstructionParsed = {
    ; see QPACKInstruction definition in appendix
    instruction: QPACKInstruction

    ? length: uint32
    ? raw: hexstring
}
]]></sourcecode>
        </figure>
        <t>Note: encoder/decoder semantics and stream_id's are implicit in either the
instruction types or can be logged via other events (e.g., http.stream_type_set)</t>
      </section>
    </section>
    <section anchor="qpack-data-field-definitions">
      <name>QPACK Data Field Definitions</name>
      <t>The following data field definitions can be used in QPACK events.</t>
      <section anchor="qpackinstruction">
        <name>QPACKInstruction</name>
        <t>Note: the instructions do not have explicit encoder/decoder types, since there is
no overlap between the instructions of both types in neither name nor function.</t>
        <figure anchor="qpackinstruction-def">
          <name>QPACKInstruction definition</name>
          <sourcecode type="cddl"><![CDATA[
QPACKInstruction =  SetDynamicTableCapacityInstruction /
                    InsertWithNameReferenceInstruction /
                    InsertWithoutNameReferenceInstruction /
                    DuplicateInstruction /
                    SectionAcknowledgementInstruction /
                    StreamCancellationInstruction /
                    InsertCountIncrementInstruction
]]></sourcecode>
        </figure>
        <section anchor="setdynamictablecapacityinstruction">
          <name>SetDynamicTableCapacityInstruction</name>
          <figure anchor="setdynamictablecapacityinstruction-def">
            <name>SetDynamicTableCapacityInstruction definition</name>
            <sourcecode type="cddl"><![CDATA[
SetDynamicTableCapacityInstruction = {
    instruction_type: "set_dynamic_table_capacity"
    capacity: uint32
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="insertwithnamereferenceinstruction">
          <name>InsertWithNameReferenceInstruction</name>
          <figure anchor="insertwithnamereferenceinstruction-def">
            <name>InsertWithNameReferenceInstruction definition</name>
            <sourcecode type="cddl"><![CDATA[
InsertWithNameReferenceInstruction = {
    instruction_type: "insert_with_name_reference"
    table_type: QPACKTableType
    name_index: uint32
    huffman_encoded_value: bool
    ? value_length: uint32
    ? value: text
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="insertwithoutnamereferenceinstruction">
          <name>InsertWithoutNameReferenceInstruction</name>
          <figure anchor="insertwithoutnamereferenceinstruction-def">
            <name>InsertWithoutNameReferenceInstruction definition</name>
            <sourcecode type="cddl"><![CDATA[
InsertWithoutNameReferenceInstruction = {
    instruction_type: "insert_without_name_reference"
    huffman_encoded_name: bool
    ? name_length: uint32
    ? name: text
    huffman_encoded_value: bool
    ? value_length: uint32
    ? value: text
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="duplicateinstruction">
          <name>DuplicateInstruction</name>
          <figure anchor="duplicateinstruction-def">
            <name>DuplicateInstruction definition</name>
            <sourcecode type="cddl"><![CDATA[
DuplicateInstruction = {
    instruction_type: "duplicate"
    index: uint32
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="sectionacknowledgementinstruction">
          <name>SectionAcknowledgementInstruction</name>
          <figure anchor="sectionacknowledgementinstruction-def">
            <name>SectionAcknowledgementInstruction definition</name>
            <sourcecode type="cddl"><![CDATA[
SectionAcknowledgementInstruction = {
    instruction_type: "section_acknowledgement"
    stream_id: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="streamcancellationinstruction">
          <name>StreamCancellationInstruction</name>
          <figure anchor="streamcancellationinstruction-def">
            <name>StreamCancellationInstruction definition</name>
            <sourcecode type="cddl"><![CDATA[
StreamCancellationInstruction = {
    instruction_type: "stream_cancellation"
    stream_id: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="insertcountincrementinstruction">
          <name>InsertCountIncrementInstruction</name>
          <figure anchor="insertcountincrementinstruction-def">
            <name>InsertCountIncrementInstruction definition</name>
            <sourcecode type="cddl"><![CDATA[
InsertCountIncrementInstruction = {
    instruction_type: "insert_count_increment"
    increment: uint32
}
]]></sourcecode>
          </figure>
        </section>
      </section>
      <section anchor="qpackheaderblockrepresentation">
        <name>QPACKHeaderBlockRepresentation</name>
        <figure anchor="qpackheaderblockrepresentation-def">
          <name>QPACKHeaderBlockRepresentation definition</name>
          <sourcecode type="cddl"><![CDATA[
QPACKHeaderBlockRepresentation =  IndexedHeaderField /
                                  LiteralHeaderFieldWithName /
                                  LiteralHeaderFieldWithoutName
]]></sourcecode>
        </figure>
        <section anchor="indexedheaderfield">
          <name>IndexedHeaderField</name>
          <t>Note: also used for "indexed header field with post-base index"</t>
          <figure anchor="indexedheaderfield-def">
            <name>IndexedHeaderField definition</name>
            <sourcecode type="cddl"><![CDATA[
IndexedHeaderField = {
    header_field_type: "indexed_header"

    ; MUST be "dynamic" if is_post_base is true
    table_type: QPACKTableType
    index: uint32

    ; to represent the "indexed header field with post-base index"
    ; header field type
    is_post_base: bool .default false
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="literalheaderfieldwithname">
          <name>LiteralHeaderFieldWithName</name>
          <t>Note: also used for "Literal header field with post-base name reference"</t>
          <figure anchor="literalheaderfieldwithname-def">
            <name>LiteralHeaderFieldWithName definition</name>
            <sourcecode type="cddl"><![CDATA[
LiteralHeaderFieldWithName = {
    header_field_type: "literal_with_name"

    ; the 3rd "N" bit
    preserve_literal: bool

    ; MUST be "dynamic" if is_post_base is true
    table_type: QPACKTableType
    name_index: uint32
    huffman_encoded_value: bool
    ? value_length: uint32
    ? value: text

    ; to represent the "indexed header field with post-base index"
    ; header field type
    is_post_base: bool .default false
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="literalheaderfieldwithoutname">
          <name>LiteralHeaderFieldWithoutName</name>
          <figure anchor="literalheaderfieldwithoutname-def">
            <name>LiteralHeaderFieldWithoutName definition</name>
            <sourcecode type="cddl"><![CDATA[
LiteralHeaderFieldWithoutName = {
    header_field_type: "literal_without_name"

    ; the 3rd "N" bit
    preserve_literal: bool
    huffman_encoded_name: bool
    ? name_length: uint32
    ? name: text

    huffman_encoded_value: bool
    ? value_length: uint32
    ? value: text
}
]]></sourcecode>
          </figure>
        </section>
      </section>
      <section anchor="qpackheaderblockprefix">
        <name>QPACKHeaderBlockPrefix</name>
        <figure anchor="qpackheaderblockprefix-def">
          <name>QPACKHeaderBlockPrefix definition</name>
          <sourcecode type="cddl"><![CDATA[
QPACKHeaderBlockPrefix = {
    required_insert_count: uint32
    sign_bit: bool
    delta_base: uint32
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="qpacktabletype">
        <name>QPACKTableType</name>
        <figure anchor="qpacktabletype-def">
          <name>QPACKTableType definition</name>
          <sourcecode type="cddl"><![CDATA[
QPACKTableType = "static" / "dynamic"
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section anchor="security-and-privacy-considerations">
      <name>Security and Privacy 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>TBD</t>
    </section>
  </middle>
  <back>
    <displayreference target="RFC9114" to="HTTP/3"/>
    <references>
      <name>Normative References</name>
      <reference anchor="RFC9114">
        <front>
          <title>HTTP/3</title>
          <author fullname="M. Bishop" initials="M." role="editor" surname="Bishop">
            <organization/>
          </author>
          <date month="June" year="2022"/>
          <abstract>
            <t>The QUIC transport protocol has several features that are desirable in a transport for HTTP, such as stream multiplexing, per-stream flow control, and low-latency connection establishment.  This document describes a mapping of HTTP semantics over QUIC.  This document also identifies HTTP/2 features that are subsumed by QUIC and describes how HTTP/2 extensions can be ported to HTTP/3.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="9114"/>
        <seriesInfo name="DOI" value="10.17487/RFC9114"/>
      </reference>
      <reference anchor="QLOG-MAIN">
        <front>
          <title>Main logging schema for qlog</title>
          <author fullname="Robin Marx" initials="R." surname="Marx">
            <organization>KU Leuven</organization>
          </author>
          <author fullname="Luca Niccolini" initials="L." surname="Niccolini">
            <organization>Facebook</organization>
          </author>
          <author fullname="Marten Seemann" initials="M." surname="Seemann">
            <organization>Protocol Labs</organization>
          </author>
          <date day="31" month="August" year="2022"/>
          <abstract>
            <t>   This document describes a high-level schema for a standardized
   logging format called qlog.  This format allows easy sharing of data
   and the creation of reusable visualization and debugging tools.  The
   high-level schema in this document is intended to be protocol-
   agnostic.  Separate documents specify how the format should be used
   for specific protocol data.  The schema is also format-agnostic, and
   can be represented in for example JSON, csv or protobuf.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-main-schema-03"/>
      </reference>
      <reference anchor="QLOG-QUIC">
        <front>
          <title>QUIC event definitions for qlog</title>
          <author fullname="Robin Marx" initials="R." surname="Marx">
            <organization>KU Leuven</organization>
          </author>
          <author fullname="Luca Niccolini" initials="L." surname="Niccolini">
            <organization>Facebook</organization>
          </author>
          <author fullname="Marten Seemann" initials="M." surname="Seemann">
            <organization>Protocol Labs</organization>
          </author>
          <date day="31" month="August" year="2022"/>
          <abstract>
            <t>   This document describes concrete qlog event definitions and their
   metadata for QUIC events.  These events can then be embedded in the
   higher level schema defined in [QLOG-MAIN].

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-quic-events-02"/>
      </reference>
      <reference anchor="QPACK">
        <front>
          <title>QPACK: Field Compression for HTTP/3</title>
          <author fullname="C. Krasic" initials="C." surname="Krasic">
            <organization/>
          </author>
          <author fullname="M. Bishop" initials="M." surname="Bishop">
            <organization/>
          </author>
          <author fullname="A. Frindell" initials="A." role="editor" surname="Frindell">
            <organization/>
          </author>
          <date month="June" year="2022"/>
          <abstract>
            <t>This specification defines QPACK: a compression format for efficiently representing HTTP fields that is to be used in HTTP/3. This is a variation of HPACK compression that seeks to reduce head-of-line blocking.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="9204"/>
        <seriesInfo name="DOI" value="10.17487/RFC9204"/>
      </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">
            <organization/>
          </author>
          <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">
            <organization/>
          </author>
          <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">
            <organization/>
          </author>
          <author fullname="C. Vigano" initials="C." surname="Vigano">
            <organization/>
          </author>
          <author fullname="C. Bormann" initials="C." surname="Bormann">
            <organization/>
          </author>
          <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>
    <section anchor="change-log">
      <name>Change Log</name>
      <section anchor="since-draft-ietf-quic-qlog-h3-events-02">
        <name>Since draft-ietf-quic-qlog-h3-events-02:</name>
        <ul spacing="normal">
          <li>Renamed HTTPStreamType data to request (#222)</li>
          <li>Added HTTPStreamType value unknown (#227)</li>
          <li>Added HTTPUnknownFrame (#224)</li>
          <li>Replaced old and new fields with stream_type in HTTPStreamTypeSet (#240)</li>
          <li>Changed HTTPFrame to a CDDL plug type (#257)</li>
          <li>Moved data definitions out of the appendix into separate sections</li>
          <li>Added overview Table of Contents</li>
        </ul>
      </section>
      <section anchor="since-draft-ietf-quic-qlog-h3-events-01">
        <name>Since draft-ietf-quic-qlog-h3-events-01:</name>
        <ul spacing="normal">
          <li>No changes - new draft to prevent expiration</li>
        </ul>
      </section>
      <section anchor="since-draft-ietf-quic-qlog-h3-events-00">
        <name>Since draft-ietf-quic-qlog-h3-events-00:</name>
        <ul spacing="normal">
          <li>Change the data definition language from TypeScript to CDDL (#143)</li>
        </ul>
      </section>
      <section anchor="since-draft-marx-qlog-event-definitions-quic-h3-02">
        <name>Since draft-marx-qlog-event-definitions-quic-h3-02:</name>
        <ul spacing="normal">
          <li>These changes were done in preparation of the adoption of the drafts by the QUIC
working group (#137)</li>
          <li>Split QUIC and HTTP/3 events into two separate documents</li>
          <li>Moved RawInfo, Importance, Generic events and Simulation events to the main
schema document.</li>
        </ul>
      </section>
      <section anchor="since-draft-marx-qlog-event-definitions-quic-h3-01">
        <name>Since draft-marx-qlog-event-definitions-quic-h3-01:</name>
        <t>Major changes:</t>
        <ul spacing="normal">
          <li>Moved data_moved from http to transport. Also made the "from" and "to" fields
flexible strings instead of an enum (#111,#65)</li>
          <li>Moved packet_type fields to PacketHeader. Moved packet_size field out of
PacketHeader to RawInfo:length (#40)</li>
          <li>Made events that need to log packet_type and packet_number use a header field
instead of logging these fields individually</li>
          <li>Added support for logging retry, stateless reset and initial tokens (#94,#86,#117)</li>
          <li>Moved separate general event categories into a single category "generic" (#47)</li>
          <li>Added "transport:connection_closed" event (#43,#85,#78,#49)</li>
          <li>Added version_information and alpn_information events (#85,#75,#28)</li>
          <li>Added parameters_restored events to help clarify 0-RTT behaviour (#88)</li>
        </ul>
        <t>Smaller changes:</t>
        <ul spacing="normal">
          <li>Merged loss_timer events into one loss_timer_updated event</li>
          <li>Field data types are now strongly defined (#10,#39,#36,#115)</li>
          <li>Renamed qpack instruction_received and instruction_sent to instruction_created
and instruction_parsed (#114)</li>
          <li>Updated qpack:dynamic_table_updated.update_type. It now has the value "inserted"
instead of "added" (#113)</li>
          <li>Updated qpack:dynamic_table_updated. It now has an "owner" field to
differentiate encoder vs decoder state (#112)</li>
          <li>Removed push_allowed from http:parameters_set (#110)</li>
          <li>Removed explicit trigger field indications from events, since this was moved to
be a generic property of the "data" field (#80)</li>
          <li>Updated transport:connection_id_updated to be more in line with other similar
events. Also dropped importance from Core to Base (#45)</li>
          <li>Added length property to PaddingFrame (#34)</li>
          <li>Added packet_number field to transport:frames_processed (#74)</li>
          <li>Added a way to generically log packet header flags (first 8 bits) to
PacketHeader</li>
          <li>Added additional guidance on which events to log in which situations (#53)</li>
          <li>Added "simulation:scenario" event to help indicate simulation details</li>
          <li>Added "packets_acked" event (#107)</li>
          <li>Added "datagram_ids" to the datagram_X and packet_X events to allow tracking of
coalesced QUIC packets (#91)</li>
          <li>Extended connection_state_updated with more fine-grained states (#49)</li>
        </ul>
      </section>
      <section anchor="since-draft-marx-qlog-event-definitions-quic-h3-00">
        <name>Since draft-marx-qlog-event-definitions-quic-h3-00:</name>
        <ul spacing="normal">
          <li>Event and category names are now all lowercase</li>
          <li>Added many new events and their definitions</li>
          <li>"type" fields have been made more specific (especially important for PacketType
fields, which are now called packet_type instead of type)</li>
          <li>Events are given an importance indicator (issue #22)</li>
          <li>Event names are more consistent and use past tense (issue #21)</li>
          <li>Triggers have been redefined as properties of the "data" field and updated for most events (issue #23)</li>
        </ul>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>Much of the initial work by Robin Marx was done at the Hasselt and KU Leuven
Universities.</t>
      <t>Thanks to Jana Iyengar, Brian Trammell, Dmitri Tikhonov, Stephen Petrides, Jari
Arkko, Marcus Ihlar, Victor Vasiliev, Mirja Kuehlewind, Jeremy Laine, Kazu
Yamamoto, and Christian Huitema for their feedback and suggestions.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
5CuIq2GB/w8NljSBhnsAAA==

-->

</rfc>
