<?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-04" 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-04"/>
    <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="2023" month="February" day="13"/>
    <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>
    <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: The CDDL unwrap operator (~) makes 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_field_section_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>The stream_type_value field is the numerical value without VLIE encoding.</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"
    ? stream_type_value: 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>This event is emitted when the HTTP/3 framing actually happens. This does not
necessarily coincide with HTTP/3 data getting passed 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>This event is emitted when the HTTP/3 frame is parsed. 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>HTTP/3 DATA frames can have arbitrarily large lengths to reduce frame header
overhead. As such, DATA frames can span multiple QUIC packets. 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: RawInfo
}
]]></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>
          <t>The frame_type_value field is the numerical value without VLIE encoding.</t>
          <figure anchor="httpunknownframe-def">
            <name>UnknownFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTPUnknownFrame = {
    frame_type: "unknown"
    frame_type_value: uint64
    ? raw: RawInfo
}
]]></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]

    ? raw: RawInfo
}
]]></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]

    ? raw: RawInfo
}
]]></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
    ? raw: RawInfo
}
]]></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

    ? raw: RawInfo
}
]]></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>Akamai</organization>
          </author>
          <author fullname="Luca Niccolini" initials="L." surname="Niccolini">
            <organization>Meta</organization>
          </author>
          <author fullname="Marten Seemann" initials="M." surname="Seemann">
            <organization>Protocol Labs</organization>
          </author>
          <author fullname="Lucas Pardue" initials="L." surname="Pardue">
            <organization>Cloudflare</organization>
          </author>
          <date day="24" month="October" 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-04"/>
      </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">
            <organization>Protocol Labs</organization>
          </author>
          <author fullname="Lucas Pardue" initials="L." surname="Pardue">
            <organization>Cloudflare</organization>
          </author>
          <date day="24" month="October" 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-03"/>
      </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-03">
        <name>Since draft-ietf-quic-qlog-h3-events-03:</name>
        <ul spacing="normal">
          <li>Ensured consistent use of RawInfo to indicate raw wire bytes (#243)</li>
          <li>Changed HTTPStreamTypeSet:raw_stream_type to stream_type_value (#54)</li>
          <li>Changed HTTPUnknownFrame:raw_frame_type to frame_type_value (#54)</li>
          <li>Renamed max_header_list_size to max_field_section_size (#282)</li>
        </ul>
      </section>
      <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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

-->

</rfc>
