<?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-quic-events-13" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.14.2 -->
  <front>
    <title>QUIC event definitions for qlog</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-quic-events-13"/>
    <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/>
      <address>
        <email>martenseemann@gmail.com</email>
      </address>
    </author>
    <author initials="L." surname="Pardue" fullname="Lucas Pardue" role="editor">
      <organization>Cloudflare</organization>
      <address>
        <email>lucas@lucaspardue.com</email>
      </address>
    </author>
    <date year="2026" month="July" day="06"/>
    <area>Transport</area>
    <workgroup>QUIC</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>This document describes a qlog event schema containing concrete qlog event
definitions and their metadata for the core QUIC protocol and selected
extensions.</t>
    </abstract>
    <note>
      <name>Note to Readers</name>
      <ul empty="true">
        <li>
          <t>Note to RFC editor: Please remove 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>
    </note>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>This document defines a qlog event schema (<xref section="8" sectionFormat="of" target="QLOG-MAIN"/>)
containing concrete events for the core QUIC protocol (see
<xref target="QUIC-TRANSPORT"/>, <xref target="QUIC-RECOVERY"/>, and
<xref target="QUIC-TLS"/>) and some of its extensions (see
<xref target="QUIC-DATAGRAM"/> and <xref target="GREASEBIT"/>).</t>
      <t>The event namespace with identifier <tt>quic</tt> is defined; see <xref target="schema-def"/>. In
this namespace multiple events derive from the qlog abstract Event class
(<xref section="7" sectionFormat="of" target="QLOG-MAIN"/>), each extending the "data" field and defining their
"name" field values and semantics. Some event data fields use complex data
types. These are represented as enums or re-usable definitions, which are
grouped together on the bottom of this document for clarity.</t>
      <section anchor="use-of-group-ids">
        <name>Use of group IDs</name>
        <t>When the qlog <tt>group_id</tt> field is used, it is recommended to use QUIC's Original
Destination Connection ID (ODCID, the CID chosen by the client when first
contacting the server), as this is the only value that does not change over the
course of the connection and can be used to link more advanced QUIC packets (e.g.,
Retry, Version Negotiation) to a given connection. Similarly, the ODCID should be
used 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 ODCID abcd1234).</t>
      </section>
      <section anchor="raw-packet-and-frame-information">
        <name>Raw packet and frame information</name>
        <t>QUIC packets always include an AEAD authentication tag at the end. In general,
the length of the AEAD tag depends on the TLS cipher suite, although all cipher
suites used in QUIC v1 use a 16 byte tag. For the purposes of calculating the
lengths in fields of type RawInfo (as defined in <xref section="10" sectionFormat="of" target="QLOG-MAIN"/>) related to QUIC
packets, the AEAD tag is regarded as a trailer with a fixed size of 16 bytes.</t>
      </section>
      <section anchor="handling-unknown-connections">
        <name>Events not belonging to a single connection</name>
        <t>A single qlog event trace is typically associated with a single QUIC connection.
However, for several types of events (for example, a <xref target="quic-packetdropped"/>
event with trigger value of <tt>connection_unknown</tt>), it can be impossible to tie
them to a specific QUIC connection, especially on the server.</t>
        <t>There are various ways to handle these events, each making certain tradeoffs
between file size overhead, flexibility, ease of use, or ease of
implementation. Some options include:</t>
        <ul spacing="normal">
          <li>Log them in a separate endpoint-wide trace (or use a special <tt>group_id</tt> value)
not associated with a single connection.</li>
          <li>Log them in the most recently used trace.</li>
          <li>Use additional heuristics for connection identification (for example use the
four-tuple in addition to the Connection ID).</li>
          <li>Buffer events until they can be assigned to a connection (for example for
version negotiation and retry events).</li>
        </ul>
      </section>
      <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 this document are expressed
in the Concise Data Definition Language <xref target="CDDL"/> and its
extensions described in <xref section="1.2" sectionFormat="of" target="QLOG-MAIN"/>.</t>
        <t>The following fields from <xref target="QLOG-MAIN"/> are imported and used: name, namespace,
type, data, tuple, group_id, RawInfo, and time-related fields.</t>
        <t>Events are defined with an importance level as described in <xref section="8.3" sectionFormat="of" target="QLOG-MAIN"/>.</t>
        <t>As is the case for <xref target="QLOG-MAIN"/>, the qlog schema definitions in this document
are intentionally agnostic to serialization formats. The choice of format is an
implementation decision.</t>
      </section>
    </section>
    <section anchor="schema-def">
      <name>Event Schema Definition</name>
      <t>This document describes how the core QUIC protocol and selected extensions can
be expressed in qlog using a newly defined event schema. Per the requirements in
<xref section="8" sectionFormat="of" target="QLOG-MAIN"/>, this document registers the <tt>quic</tt> namespace. The
event schema URI is <tt>urn:ietf:params:qlog:events:quic</tt>.</t>
      <section removeInRFC="true" anchor="draft-event-schema-identification">
        <name>Draft Event Schema Identification</name>
        <t>Only implementations of the final, published RFC can use the events belonging to
the event schema with the URI <tt>urn:ietf:params:qlog:events:quic</tt>. Until such an
RFC exists, implementations <bcp14>MUST NOT</bcp14> identify themselves using this URI.</t>
        <t>Implementations of draft versions of the event schema <bcp14>MUST</bcp14> append the string
"-" and the corresponding draft number to the URI. For example, draft 07 of this
document is identified using the URI <tt>urn:ietf:params:qlog:events:quic-07</tt>.</t>
        <t>The namespace identifier itself is not affected by this requirement.</t>
      </section>
    </section>
    <section anchor="quic-event-overview">
      <name>QUIC Event Overview</name>
      <t><xref target="quic-events"/> summarizes the name value of each event type that is defined in
this specification.</t>
      <table anchor="quic-events">
        <name>QUIC 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">quic:server_listening</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-serverlistening"/></td>
          </tr>
          <tr>
            <td align="left">quic:connection_started</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-connectionstarted"/></td>
          </tr>
          <tr>
            <td align="left">quic:connection_closed</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-connectionclosed"/></td>
          </tr>
          <tr>
            <td align="left">quic:connection_id_updated</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-connectionidupdated"/></td>
          </tr>
          <tr>
            <td align="left">quic:spin_bit_updated</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-spinbitupdated"/></td>
          </tr>
          <tr>
            <td align="left">quic:connection_state_updated</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-connectionstateupdated"/></td>
          </tr>
          <tr>
            <td align="left">quic:tuple_assigned</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-tupleassigned"/></td>
          </tr>
          <tr>
            <td align="left">quic:mtu_updated</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-mtuupdated"/></td>
          </tr>
          <tr>
            <td align="left">quic:version_information</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="quic-versioninformation"/></td>
          </tr>
          <tr>
            <td align="left">quic:alpn_information</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="quic-alpninformation"/></td>
          </tr>
          <tr>
            <td align="left">quic:parameters_set</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="quic-parametersset"/></td>
          </tr>
          <tr>
            <td align="left">quic:parameters_restored</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-parametersrestored"/></td>
          </tr>
          <tr>
            <td align="left">quic:packet_sent</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="quic-packetsent"/></td>
          </tr>
          <tr>
            <td align="left">quic:packet_received</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="quic-packetreceived"/></td>
          </tr>
          <tr>
            <td align="left">quic:packet_dropped</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-packetdropped"/></td>
          </tr>
          <tr>
            <td align="left">quic:packet_buffered</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-packetbuffered"/></td>
          </tr>
          <tr>
            <td align="left">quic:packets_acked</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-packetsacked"/></td>
          </tr>
          <tr>
            <td align="left">quic:udp_datagrams_sent</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-udpdatagramssent"/></td>
          </tr>
          <tr>
            <td align="left">quic:udp_datagrams_received</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-udpdatagramsreceived"/></td>
          </tr>
          <tr>
            <td align="left">quic:udp_datagram_dropped</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-udpdatagramdropped"/></td>
          </tr>
          <tr>
            <td align="left">quic:stream_state_updated</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-streamstateupdated"/></td>
          </tr>
          <tr>
            <td align="left">quic:frames_created</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-framescreated"/></td>
          </tr>
          <tr>
            <td align="left">quic:frames_parsed</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-framesparsed"/></td>
          </tr>
          <tr>
            <td align="left">quic:frames_processed</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-framesprocessed"/></td>
          </tr>
          <tr>
            <td align="left">quic:stream_data_moved</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-streamdatamoved"/></td>
          </tr>
          <tr>
            <td align="left">quic:datagram_data_moved</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-datagramdatamoved"/></td>
          </tr>
          <tr>
            <td align="left">quic:connection_data_blocked_updated</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-connectiondatablockedupdated"/></td>
          </tr>
          <tr>
            <td align="left">quic:stream_data_blocked_updated</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-streamdatablockedupdated"/></td>
          </tr>
          <tr>
            <td align="left">quic:datagram_data_blocked_updated</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-datagramdatablockedupdated"/></td>
          </tr>
          <tr>
            <td align="left">quic:migration_state_updated</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-migrationstateupdated"/></td>
          </tr>
          <tr>
            <td align="left">quic:timer_updated</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-timerupdated"/></td>
          </tr>
          <tr>
            <td align="left">quic:key_updated</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-keyupdated"/></td>
          </tr>
          <tr>
            <td align="left">quic:key_discarded</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-keydiscarded"/></td>
          </tr>
          <tr>
            <td align="left">quic:recovery_parameters_set</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-recoveryparametersset"/></td>
          </tr>
          <tr>
            <td align="left">quic:recovery_metrics_updated</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="quic-recoverymetricsupdated"/></td>
          </tr>
          <tr>
            <td align="left">quic:congestion_state_updated</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-congestionstateupdated"/></td>
          </tr>
          <tr>
            <td align="left">quic:packet_lost</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="quic-packetlost"/></td>
          </tr>
          <tr>
            <td align="left">quic:marked_for_retransmit</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-markedforretransmit"/></td>
          </tr>
          <tr>
            <td align="left">quic:ecn_state_updated</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-ecnstateupdated"/></td>
          </tr>
        </tbody>
      </table>
      <t>QUIC events extend the <tt>$ProtocolEventData</tt> extension point defined in
<xref section="8.2" sectionFormat="of" target="QLOG-MAIN"/>. Additionally, they allow for direct extensibility by their use of
per-event extension points via the <tt>$$</tt> CDDL "group socket" syntax, as also
described in <xref section="8.2" sectionFormat="of" target="QLOG-MAIN"/>.</t>
      <figure anchor="quicevent-data-def">
        <name>QuicEventData definition and ProtocolEventData extension</name>
        <sourcecode type="cddl"><![CDATA[
QuicEventData = QUICServerListening /
                QUICConnectionStarted /
                QUICConnectionClosed /
                QUICConnectionIDUpdated /
                QUICSpinBitUpdated /
                QUICConnectionStateUpdated /
                QUICTupleAssigned /
                QUICMTUUpdated /
                QUICVersionInformation /
                QUICALPNInformation /
                QUICParametersSet /
                QUICParametersRestored /
                QUICPacketSent /
                QUICPacketReceived /
                QUICPacketDropped /
                QUICPacketBuffered /
                QUICPacketsAcked /
                QUICUDPDatagramsSent /
                QUICUDPDatagramsReceived /
                QUICUDPDatagramDropped /
                QUICStreamStateUpdated /
                QUICFramesCreated /
                QUICFramesParsed /
                QUICFramesProcessed /
                QUICStreamDataMoved /
                QUICDatagramDataMoved /
                QUICConnectionDataBlockedUpdated /
                QUICStreamDataBlockedUpdated /
                QUICDatagramDataBlockedUpdated /
                QUICMigrationStateUpdated /
                QUICTimerUpdated /
                QUICKeyUpdated /
                QUICKeyDiscarded /
                QUICRecoveryParametersSet /
                QUICRecoveryMetricsUpdated /
                QUICCongestionStateUpdated /
                QUICPacketLost /
                QUICMarkedForRetransmit /
                QUICECNStateUpdated

$ProtocolEventData /= QuicEventData
]]></sourcecode>
      </figure>
      <t>The concrete QUIC event types are further defined below, their type identifier
is the heading name. The subdivisions in sections on Connectivity, Security,
Transport and Recovery are purely for readability.</t>
    </section>
    <section anchor="conn-ev">
      <name>Connectivity events</name>
      <section anchor="quic-serverlistening">
        <name>server_listening</name>
        <t>Emitted when the server starts accepting connections. It has Extra importance
level.</t>
        <figure anchor="quic-serverlistening-def">
          <name>QUICServerListening definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICServerListening = {
    ? ip_v4: IPAddress
    ? port_v4: uint16
    ? ip_v6: IPAddress
    ? port_v6: uint16

    ; the server will always answer client initials with a retry
    ; (no 1-RTT connection setups by choice)
    ? retry_required: bool

    * $$quic-serverlistening-extension
}
]]></sourcecode>
        </figure>
        <t>Some QUIC stacks do not handle sockets directly and are thus unable to log
IP and/or port information.</t>
      </section>
      <section anchor="quic-connectionstarted">
        <name>connection_started</name>
        <t>The <tt>connection_started</tt> event is used for both attempting (client-perspective)
and accepting (server-perspective) new connections. Note that while there is
overlap with the <tt>connection_state_updated</tt> event, this is a separate event
in order to capture additional data that can be useful to log. It has Base
importance level.</t>
        <figure anchor="quic-connectionstarted-def">
          <name>QUICConnectionStarted definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICConnectionStarted = {
    local: TupleEndpointInfo
    remote: TupleEndpointInfo

    * $$quic-connectionstarted-extension
}
]]></sourcecode>
        </figure>
        <t>Some QUIC stacks do not handle sockets directly and are thus unable to log
IP and/or port information.</t>
      </section>
      <section anchor="quic-connectionclosed">
        <name>connection_closed</name>
        <t>The <tt>connection_closed</tt> event is used for logging when a connection was closed,
typically when an error or timeout occurred. It has Base importance level.</t>
        <t>Note that this event has overlap with the <tt>connection_state_updated</tt> event, as
well as the CONNECTION_CLOSE frame. However, in practice, when analyzing large
deployments, it can be useful to have a single event representing a
<tt>connection_closed</tt> event, which also includes an additional reason field to
provide more information. Furthermore, it is useful to log closures due to
timeouts or explicit application actions (such as racing multiple connections
and aborting the slowest), which are difficult to reflect using the other
options.</t>
        <t>The <tt>connection_closed</tt> event is intended to be logged either when the local
endpoint silently discards the connection due to an idle timeout, when a
CONNECTION_CLOSE frame is sent (the connection enters the 'closing' state on the
sender side), when a CONNECTION_CLOSE frame is received (the connection enters
the 'draining' state on the receiver side) or when a Stateless Reset packet is
received (the connection is discarded at the receiver side).
Connectivity-related updates after this point (e.g., exiting a 'closing' or
'draining' state), should be logged using the <tt>connection_state_updated</tt> event
instead.</t>
        <t>In QUIC there are two main connection-closing error categories: connection and
application errors. They have well-defined error codes and semantics. Next to
these however, there can be internal errors that occur that may or may not get
mapped to the official error codes in implementation-specific ways. As such,
multiple error codes can be set on the same event to reflect this, and more
fine-grained internal error codes can be reflected in the internal_code field.</t>
        <t>If the error code does not map to a known error string, the connection_error or
application_error value of "unknown" type can be used and the raw value captured
in the error_code field; a numerical value without variable-length integer
encoding.</t>
        <figure anchor="quic-connectionclosed-def">
          <name>QUICConnectionClosed definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICConnectionClosed = {

    ; which side closed the connection
    ? initiator: Initiator
    ? connection_error: $TransportError /
                        CryptoError
    ? application_error: $ApplicationError

    ; if connection_error or application_error === "unknown"
    ? error_code: uint64

    ? internal_code: uint64
    ? reason: text
    ? trigger:
        "idle_timeout" /
        "application" /
        "error" /
        "version_mismatch" /
        ; when received from peer
        "stateless_reset" /
        "aborted" /
        ; when it is unclear what triggered the CONNECTION_CLOSE
        "unspecified"

    * $$quic-connectionclosed-extension
}
]]></sourcecode>
        </figure>
        <t>Loggers <bcp14>SHOULD</bcp14> use the most descriptive trigger for a <tt>connection_closed</tt> event
that they are able to deduce. This is often clear at the peer closing the
connection (and sending the CONNECTION_CLOSE), but can sometimes be more opaque
at the receiving end.</t>
      </section>
      <section anchor="quic-connectionidupdated">
        <name>connection_id_updated</name>
        <t>The <tt>connection_id_updated</tt> event is emitted when either party updates their
current Connection ID. As this typically happens only sparingly over the course
of a connection, using this event is more efficient than logging the observed
CID with each and every <tt>packet_sent</tt> or <tt>packet_received</tt> events. It has Base
importance level.</t>
        <t>The <tt>connection_id_updated</tt> event is viewed from the perspective of the endpoint
applying the new ID. As such, when the endpoint receives a new connection ID
from the peer, the initiator field will be "remote". When the endpoint updates its
own connection ID, the initiator field will be "local".</t>
        <figure anchor="quic-connectionidupdated-def">
          <name>QUICConnectionIDUpdated definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICConnectionIDUpdated = {
    initiator: Initiator
    ? old: ConnectionID
    ? new: ConnectionID

    * $$quic-connectionidupdated-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="quic-spinbitupdated">
        <name>spin_bit_updated</name>
        <t>The <tt>spin_bit_updated</tt> event conveys information about the QUIC latency spin
bit; see <xref section="17.4" sectionFormat="of" target="QUIC-TRANSPORT"/>. The event is emitted when the spin
bit changes value, it <bcp14>SHOULD NOT</bcp14> be emitted if the spin bit is set without
changing its value. It has Base importance level.</t>
        <figure anchor="quic-spinbitupdated-def">
          <name>QUICSpinBitUpdated definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICSpinBitUpdated = {
    state: bool

    * $$quic-spinbitupdated-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="quic-connectionstateupdated">
        <name>connection_state_updated</name>
        <t>The <tt>connection_state_updated</tt> event is used to track progress through QUIC's
complex handshake and connection close procedures. It has Base importance
level.</t>
        <t><xref target="QUIC-TRANSPORT"/> does not contain an exhaustive flow diagram with possible
connection states nor their transitions (though some are explicitly mentioned,
like the 'closing' and 'draining' states). As such, this document
<strong>non-exhaustively</strong> defines those states that are most likely to be useful for
debugging QUIC connections.</t>
        <t>QUIC implementations <bcp14>SHOULD</bcp14> mainly log the simplified BaseConnectionStates,
adding the more fine-grained GranularConnectionStates when more in-depth
debugging is required. Tools <bcp14>SHOULD</bcp14> be able to deal with both types equally.</t>
        <figure anchor="quic-connectionstateupdated-def">
          <name>QUICConnectionStateUpdated definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICConnectionStateUpdated = {
    ? old: $ConnectionState
    new: $ConnectionState

    * $$quic-connectionstateupdated-extension
}

BaseConnectionStates =
    ; Initial packet sent/received
    "attempted" /

    ; Handshake packet sent/received
    "handshake_started" /

    ; Both sent a TLS Finished message
    ; and verified the peer's TLS Finished message
    ; 1-RTT packets can be sent
    ; RFC 9001 Section 4.1.1
    "handshake_complete" /

    ; CONNECTION_CLOSE sent/received,
    ; stateless reset received or idle timeout
    "closed"

GranularConnectionStates =
    ; RFC 9000 Section 8.1
    ; client sent Handshake packet OR
    ; client used connection ID chosen by the server OR
    ; client used valid address validation token
    "peer_validated" /

    ; 1-RTT data can be sent by the server,
    ; but handshake is not done yet
    ; (server has sent TLS Finished; sometimes called 0.5 RTT data)
    "early_write" /

    ; HANDSHAKE_DONE sent/received.
    ; RFC 9001 Section 4.1.2
    "handshake_confirmed" /

    ; CONNECTION_CLOSE sent
    "closing" /

    ; CONNECTION_CLOSE received
    "draining" /

    ; draining or closing period done, connection state discarded
    "closed"

$ConnectionState /= BaseConnectionStates / GranularConnectionStates
]]></sourcecode>
        </figure>
        <t>The <tt>connection_state_updated</tt> event has some overlap with the
<tt>connection_closed</tt> and <tt>connection_started</tt> events, and the handling of various
frames (for example in a <tt>packet_received</tt> event). Still, it can be useful to
log these logical state transitions separately, especially if they map to an
internal implementation state machine, to explicitly track progress. As such,
implementations are allowed to use other ConnectionState values that adhere more
closely to their internal logic. Tools <bcp14>SHOULD</bcp14> be able to deal with these custom
states in a similar way to the pre-defined states in this document.</t>
      </section>
      <section anchor="quic-tupleassigned">
        <name>tuple_assigned</name>
        <t>This event is used to associate a single TupleID's value with other parameters
that describe a unique network tuple. It has Base importance level.</t>
        <t>As described in <xref section="7.2" sectionFormat="of" target="QLOG-MAIN"/>, each qlog event can be linked to a single network
tuple by means of the top-level "tuple" field, whose value is a TupleID. However,
since it can be cumbersome to encode additional tuple metadata (such as IP
addresses or Connection IDs) directly into the TupleID, this event allows such an
association to happen separately. As such, TupleIDs can be short and unique, and
can even be updated to be associated with new metadata as the connection's state
evolves.</t>
        <t>Definition:</t>
        <figure anchor="quic-tupleassigned-def">
          <name>QUICTupleAssigned definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICTupleAssigned = {
    tuple_id: TupleID

    ; the information for traffic going towards the remote receiver
    ? tuple_remote: TupleEndpointInfo

    ; the information for traffic coming in at the local endpoint
    ? tuple_local: TupleEndpointInfo

    * $$quic-tupleassigned-extension
}
]]></sourcecode>
        </figure>
        <t>Choosing the different <tt>tuple_id</tt> values is left up to the implementation. Some
options include using a uniquely incrementing integer, using the (first)
Destination Connection ID associated with a tuple (or its sequence number), or
using (a hash of) the two endpoint IP addresses.</t>
        <t>It is important to note that the empty string ("") is a valid TupleID and that
it is the default assigned to events that do not explicitly set a "tuple" field.
Put differently, the initial tuple of a QUIC connection on which the handshake
occurs (see also <xref target="quic-connectionstarted"/>) is implicitly associated with the
TupleID with value "". Associating metadata with this default tuple is possible by
logging the QUICTupleAssigned event with a value of "" for the <tt>tuple_id</tt> field.</t>
        <t>As the usage of TupleIDs and their metadata can evolve over time, multiple
QUICTupleAssigned events can be emitted for each unique TupleID. The latest
event contains the most up-to-date information for that TupleID. As such, the
first time a TupleID is seen in a QUICTupleAssigned event, it is an indication
that the TupleID is created. Subsequent occurrences indicate the TupleID is
updated, while a final occurrence with both <tt>tuple_local</tt> and <tt>tuple_remote</tt>
fields omitted implicitly indicates the TupleID has been abandoned.</t>
      </section>
      <section anchor="quic-mtuupdated">
        <name>mtu_updated</name>
        <t>The <tt>mtu_updated</tt> event indicates that the estimated Path MTU was updated. This
happens as part of the Path MTU discovery process. It has Extra importance
level.</t>
        <figure anchor="quic-mtuupdated-def">
          <name>QUICMTUUpdated definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICMTUUpdated = {
    ? old: uint32
    new: uint32

    ; at some point, MTU discovery stops, as a "good enough"
    ; packet size has been found
    ? done: bool .default false

    * $$quic-mtuupdated-extension
}
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section anchor="quic-ev">
      <name>Transport events</name>
      <section anchor="quic-versioninformation">
        <name>version_information</name>
        <t>The <tt>version_information</tt> event supports QUIC version negotiation; see <xref section="6" sectionFormat="of" target="QUIC-TRANSPORT"/>. It has Core importance level.</t>
        <t>QUIC endpoints each have their own list of QUIC versions they support. The
client uses the most likely version in their first initial. If the server does
not support that version, it replies with a Version Negotiation packet, which
contains its supported versions. From this, the client selects a version. The
<tt>version_information</tt> event aggregates all this information in a single event
type. It also allows logging of supported versions at an endpoint without actual
version negotiation needing to happen.</t>
        <figure anchor="quic-versioninformation-def">
          <name>QUICVersionInformation definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICVersionInformation = {
    ? server_versions: [+ QuicVersion]
    ? client_versions: [+ QuicVersion]
    ? chosen_version: QuicVersion

    * $$quic-versioninformation-extension
}
]]></sourcecode>
        </figure>
        <t>Intended use:</t>
        <ul spacing="normal">
          <li>When sending an initial, the client logs this event with <tt>client_versions</tt> and
<tt>chosen_version</tt> set</li>
          <li>Upon receiving a client initial with a supported version, the server logs this
event with <tt>server_versions</tt> and <tt>chosen_version</tt> set</li>
          <li>Upon receiving a client initial with an unsupported version, the server logs
this event with <tt>server_versions</tt> set and <tt>client_versions</tt> to the
single-element array containing the client's attempted version. The absence of
chosen_version implies no overlap was found</li>
          <li>Upon receiving a version negotiation packet from the server, the client logs
this event with <tt>client_versions</tt> set and <tt>server_versions</tt> to the versions in
the version negotiation packet and chosen_version to the version it will use
for the next initial packet. If the client receives a set of <tt>server_versions</tt>
with no viable overlap with its own supported versions, this event should be
logged without the <tt>chosen_version</tt> set</li>
        </ul>
      </section>
      <section anchor="quic-alpninformation">
        <name>alpn_information</name>
        <t>The <tt>alpn_information</tt> event supports Application-Layer Protocol Negotiation
(ALPN) over the QUIC transport; see <xref target="RFC7301"/> and <xref section="8.1" sectionFormat="of" target="QUIC-TLS"/>. It has Core importance level.</t>
        <t>QUIC endpoints are configured with a list of supported ALPN identifiers. Clients send the list in a TLS ClientHello, and servers match against their list. On success, a single ALPN identifier is chosen and sent back in a TLS ServerHello. If no match is found, the connection is closed.</t>
        <t>ALPN identifiers are byte sequences that may be presentable as UTF-8.
The <tt>ALPNIdentifier</tt> type supports either format. Implementations <bcp14>SHOULD</bcp14> log at
least one format, but <bcp14>MAY</bcp14> log both or none.</t>
        <figure anchor="quic-alpninformation-def">
          <name>QUICALPNInformation definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICALPNInformation = {
    ? server_alpns: [* ALPNIdentifier]
    ? client_alpns: [* ALPNIdentifier]
    ? chosen_alpn: ALPNIdentifier

    * $$quic-alpninformation-extension
}

ALPNIdentifier = {
  ? byte_value: hexstring
  ? string_value: text
}
]]></sourcecode>
        </figure>
        <t>Intended use:</t>
        <ul spacing="normal">
          <li>When sending an initial, the client logs this event with <tt>client_alpns</tt> set</li>
          <li>When receiving an initial with a supported alpn, the server logs this event
with <tt>server_alpns</tt> set, <tt>client_alpns</tt> equalling the client-provided list,
and chosen_alpn to the value it will send back to the client.</li>
          <li>When receiving an initial with an alpn, the client logs this event with
<tt>chosen_alpn</tt> to the received value.</li>
          <li>Alternatively, a client can choose to not log the first event, but wait for
the receipt of the server initial to log this event with both <tt>client_alpns</tt>
and <tt>chosen_alpn</tt> set.</li>
        </ul>
      </section>
      <section anchor="quic-parametersset">
        <name>parameters_set</name>
        <t>The <tt>parameters_set</tt> event groups settings from several different sources
(transport parameters, TLS ciphers, etc.) into a single event. This is done to
minimize the amount of events and to decouple conceptual setting impacts from
their underlying mechanism for easier high-level reasoning. The event has Core
importance level.</t>
        <t>Most of these settings are typically set once and never change. However, they
are usually set at different times during the connection, so there will
regularly 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 <tt>initiator</tt> field. As such, this
field <bcp14>MUST</bcp14> be correct for all settings included in a single event instance. If the
settings from two sides are required, they <bcp14>MUST</bcp14> be logged as two separate event
instances. If the local peer decides to change its behavior based on remote
peer's settings, a new event type can be used to reflect the outcome.</t>
        <t>By default, each setting is assumed to either be absent (has an <tt>undefined</tt>
value) or have its default value (if it exists) at the start of the connection.
Subsequently, each setting's value in a <tt>parameters_set</tt> event supersedes the
previous value of that parameter if present. If a setting does not appear in a
given <tt>parameters_set</tt> event, its value is unchanged.</t>
        <t>Implementations are not required to recognize, process or support every
setting/parameter received in all situations. For example, QUIC implementations
<bcp14>MUST</bcp14> discard transport parameters that they do not understand <xref section="7.4.2" sectionFormat="of" target="QUIC-TRANSPORT"/>. The <tt>unknown_parameters</tt> field can be used to log the raw
values of any unknown parameters (e.g., GREASE, private extensions, peer-side
experimentation).</t>
        <t>In the case of connection resumption and 0-RTT, some of the server's parameters
are stored up-front at the client and used for the initial connection startup.
They are later updated with the server's reply. In these cases, utilize the
separate <tt>parameters_restored</tt> event to indicate the initial values, and this
event to indicate the updated values, as normal.</t>
        <figure anchor="quic-parametersset-def">
          <name>QUICParametersSet definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICParametersSet = {
    ? initiator: Initiator

    ; true if valid session ticket was received
    ? resumption_allowed: bool

    ; true if early data extension was enabled on the TLS layer
    ? early_data_enabled: bool

    ; e.g., "AES_128_GCM_SHA256"
    ? tls_cipher: text

    ; RFC9000
    ? original_destination_connection_id: ConnectionID
    ? initial_source_connection_id: ConnectionID
    ? retry_source_connection_id: ConnectionID
    ? stateless_reset_token: StatelessResetToken
    ? disable_active_migration: bool
    ? max_idle_timeout: uint64
    ? max_udp_payload_size: uint64
    ? ack_delay_exponent: uint64
    ? max_ack_delay: uint64
    ? active_connection_id_limit: uint64
    ? initial_max_data: uint64
    ? initial_max_stream_data_bidi_local: uint64
    ? initial_max_stream_data_bidi_remote: uint64
    ? initial_max_stream_data_uni: uint64
    ? initial_max_streams_bidi: uint64
    ? initial_max_streams_uni: uint64
    ? preferred_address: PreferredAddress
    ? unknown_parameters: [* UnknownParameter]

    ; RFC9221
    ? max_datagram_frame_size: uint64

    ; RFC9287
    ; true if present, absent or false if extension not negotiated
    ? grease_quic_bit: bool

    ; draft-ietf-quic-reliable-stream-reset
    ; true if present, absent or false if extension not negotiated
    ? reset_stream_at: bool

    * $$quic-parametersset-extension
}

PreferredAddress = {
    ? ip_v4: IPAddress
    ? port_v4: uint16
    ? ip_v6: IPAddress
    ? port_v6: uint16
    connection_id: ConnectionID
    stateless_reset_token: StatelessResetToken
}

UnknownParameter = {
    id: uint64
    ? value: hexstring
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="quic-parametersrestored">
        <name>parameters_restored</name>
        <t>When using QUIC 0-RTT, clients are expected to remember and restore the server's
transport parameters from the previous connection. The <tt>parameters_restored</tt>
event is used to indicate which parameters were restored and to which values
when utilizing 0-RTT. It has Base importance level.</t>
        <t>Note that not all transport parameters should be restored (many are even
prohibited from being re-utilized). The ones listed here are the ones expected
to be useful for correct 0-RTT usage.</t>
        <figure anchor="quic-parametersrestored-def">
          <name>QUICParametersRestored definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICParametersRestored = {

    ; RFC9000
    ? disable_active_migration: bool
    ? max_idle_timeout: uint64
    ? max_udp_payload_size: uint64
    ? active_connection_id_limit: uint64
    ? initial_max_data: uint64
    ? initial_max_stream_data_bidi_local: uint64
    ? initial_max_stream_data_bidi_remote: uint64
    ? initial_max_stream_data_uni: uint64
    ? initial_max_streams_bidi: uint64
    ? initial_max_streams_uni: uint64

    ; RFC9221
    ? max_datagram_frame_size: uint64

    ; RFC9287
    ; can only be restored at the client.
    ; servers MUST NOT restore this parameter!
    ? grease_quic_bit: bool

    * $$quic-parametersrestored-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="quic-packetsent">
        <name>packet_sent</name>
        <t>The <tt>packet_sent</tt> event indicates a QUIC-level packet was sent. It has Core
importance level.</t>
        <figure anchor="quic-packetsent-def">
          <name>QUICPacketSent definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICPacketSent = {
    header: PacketHeader
    ? frames: [* $QuicFrame]

    ; only if header.packet_type === "stateless_reset"
    ; is always 128 bits in length.
    ? stateless_reset_token: StatelessResetToken

    ; only if header.packet_type === "version_negotiation"
    ? supported_versions: [+ QuicVersion]
    ? raw: RawInfo
    ? datagram_id: uint32
    ? is_mtu_probe_packet: bool .default false

    ? trigger:
      ; RFC 9002 Section 6.1.1
      "retransmit_reordered" /
      ; RFC 9002 Section 6.1.2
      "retransmit_timeout" /
      ; RFC 9002 Section 6.2.4
      "pto_probe" /
      ; RFC 9002 6.2.3
      "retransmit_crypto" /
      ; needed for some CCs to figure out bandwidth allocations
      ; when there are no normal sends
      "cc_bandwidth_probe"

    * $$quic-packetsent-extension
}
]]></sourcecode>
        </figure>
        <t>The <tt>encryption_level</tt> and <tt>packet_number_space</tt> are not logged explicitly:
the <tt>header.packet_type</tt> specifies this by inference (assuming correct
implementation)</t>
        <t>The <tt>datagram_id</tt> field is used to track packet coalescing, see
<xref target="packet-coalescing"/>.</t>
      </section>
      <section anchor="quic-packetreceived">
        <name>packet_received</name>
        <t>The <tt>packet_received</tt> event indicates a QUIC-level packet was received. It has
Core importance level.</t>
        <figure anchor="quic-packetreceived-def">
          <name>QUICPacketReceived definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICPacketReceived = {
    header: PacketHeader
    ? frames: [* $QuicFrame]

    ; only if header.packet_type === "stateless_reset"
    ; Is always 128 bits in length.
    ? stateless_reset_token: StatelessResetToken

    ; only if header.packet_type === "version_negotiation"
    ? supported_versions: [+ QuicVersion]
    ? raw: RawInfo
    ? datagram_id: uint32

    ? trigger:
        ; if packet was buffered because it couldn't be
        ; decrypted before
        "keys_available"

    * $$quic-packetreceived-extension
}
]]></sourcecode>
        </figure>
        <t>The <tt>encryption_level</tt> and <tt>packet_number_space</tt> are not logged explicitly: the
<tt>header.packet_type</tt> specifies this by inference (assuming correct
implementation).</t>
        <t>The <tt>datagram_id</tt> field is used to track packet coalescing, see
<xref target="packet-coalescing"/>.</t>
      </section>
      <section anchor="quic-packetdropped">
        <name>packet_dropped</name>
        <t>The <tt>packet_dropped</tt> event indicates a QUIC-level packet was dropped. It has
Base importance level.</t>
        <t>The trigger field indicates a general reason category for dropping the packet,
while the details field can contain additional implementation-specific
information.</t>
        <figure anchor="quic-packetdropped-def">
          <name>QUICPacketDropped definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICPacketDropped = {

    ; Primarily packet_type should be filled here,
    ; as other fields might not be decryptable or parsable
    ? header: PacketHeader
    ? raw: RawInfo
    ? datagram_id: uint32
    ? details: {* text => any}
    ? trigger:
        "internal_error" /
        "rejected" /
        "unsupported" /
        "invalid" /
        "duplicate" /
        "connection_unknown" /
        "decryption_failure" /
        "key_unavailable" /
        "general"

    * $$quic-packetdropped-extension
}
]]></sourcecode>
        </figure>
        <t>Some example situations for each of the trigger categories include:</t>
        <ul spacing="normal">
          <li>
            <tt>internal_error</tt>: not initialized, out of memory</li>
          <li>
            <tt>rejected</tt>: limits reached, DDoS protection, unwilling to track more paths, duplicate packet</li>
          <li>
            <tt>unsupported</tt>: unknown or unsupported version. See also <xref target="handling-unknown-connections"/>.</li>
          <li>
            <tt>invalid</tt>: packet parsing or validation error</li>
          <li>
            <tt>duplicate</tt>: duplicate packet</li>
          <li>
            <tt>connection_unknown</tt>: packet does not relate to a known connection or Connection ID</li>
          <li>
            <tt>decryption_failure</tt>: decryption failed</li>
          <li>
            <tt>key_unavailable</tt>: decryption key was unavailable</li>
          <li>
            <tt>general</tt>: situations not clearly covered in the other categories</li>
        </ul>
        <t>The <tt>datagram_id</tt> field is used to track packet coalescing, see
<xref target="packet-coalescing"/>.</t>
      </section>
      <section anchor="quic-packetbuffered">
        <name>packet_buffered</name>
        <t>The <tt>packet_buffered</tt> event is emitted when a packet is buffered because it
cannot be processed yet. Typically, this is because the packet cannot be parsed
yet, and thus only the full packet contents can be logged when it was parsed in
a <tt>packet_received</tt> event. The event has Base importance level.</t>
        <figure anchor="quic-packetbuffered-def">
          <name>QUICPacketBuffered definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICPacketBuffered = {

    ; primarily packet_type should be filled here as other elements
    ; might not be available yet
    ? header: PacketHeader
    ? raw: RawInfo
    ? datagram_id: uint32
    ? trigger:
        ; indicates the parser cannot keep up, temporarily buffers
        ; packet for later processing
        "backpressure" /
        ; if packet cannot be decrypted because the proper keys were
        ; not yet available
        "keys_unavailable"

    * $$quic-packetbuffered-extension
}
]]></sourcecode>
        </figure>
        <t>The <tt>datagram_id</tt> field is used to track packet coalescing, see
<xref target="packet-coalescing"/>.</t>
      </section>
      <section anchor="quic-packetsacked">
        <name>packets_acked</name>
        <t>The <tt>packets_acked</tt> event is emitted when a (group of) sent packet(s) is
acknowledged by the remote peer <em>for the first time</em>. It has Extra importance
level.</t>
        <t>This information could also be deduced from the contents of received ACK frames.
However, ACK frames require additional processing logic to determine when a
given packet is acknowledged for the first time, as QUIC uses ACK ranges which
can include repeated ACKs. Additionally, this event can be used by
implementations that do not log frame contents.</t>
        <figure anchor="quic-packetsacked-def">
          <name>QUICPacketsAcked definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICPacketsAcked = {
    ? packet_number_space: $PacketNumberSpace
    ? packet_numbers: [+ uint64]

    * $$quic-packetsacked-extension
}
]]></sourcecode>
        </figure>
        <t>If <tt>packet_number_space</tt> is omitted, it assumes the default value of
<tt>application_data</tt>, as this is by far the most prevalent packet
number space a typical QUIC connection will use.</t>
      </section>
      <section anchor="quic-udpdatagramssent">
        <name>udp_datagrams_sent</name>
        <t>The <tt>udp_datagrams_sent</tt> event indicates when one or more UDP-level datagrams are
passed to the underlying network socket. This is useful for determining how QUIC
packet buffers are drained to the OS. The event has Extra importance level.</t>
        <figure anchor="quic-udpdatagramssent-def">
          <name>QUICUDPDatagramsSent definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICUDPDatagramsSent = {

    ; to support passing multiple at once
    ? count: uint16

    ; The RawInfo fields do not include the UDP headers,
    ; only the UDP payload
    ? raw: [+ RawInfo]

    ; ECN bits in the IP header
    ; if not set, defaults to the value used on the last
    ; QUICUDPDatagramsSent event
    ? ecn: [+ ECN]

    ? datagram_ids: [+ uint32]

    * $$quic-udpdatagramssent-extension
}
]]></sourcecode>
        </figure>
        <t>Since QUIC implementations rarely control UDP logic directly, the raw data
excludes UDP-level headers in all RawInfo fields.</t>
        <t>The <tt>datagram_ids</tt> field is used to track packet coalescing, see
<xref target="packet-coalescing"/>.</t>
      </section>
      <section anchor="quic-udpdatagramsreceived">
        <name>udp_datagrams_received</name>
        <t>When one or more UDP-level datagrams are received from the socket. This is
useful for determining how datagrams are passed to the user space stack from the
OS. The event has Extra importance level.</t>
        <figure anchor="quic-udpdatagramsreceived-def">
          <name>QUICUDPDatagramsReceived definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICUDPDatagramsReceived = {

    ; to support passing multiple at once
    ? count: uint16

    ; The RawInfo fields do not include the UDP headers,
    ; only the UDP payload
    ? raw: [+ RawInfo]

    ; ECN bits in the IP header
    ; if not set, defaults to the value on the last
    ; QUICUDPDatagramsReceived event
    ? ecn: [+ ECN]

    ? datagram_ids: [+ uint32]

    * $$quic-udpdatagramsreceived-extension
}
]]></sourcecode>
        </figure>
        <t>The <tt>datagram_ids</tt> field is used to track packet coalescing, see
<xref target="packet-coalescing"/>.</t>
      </section>
      <section anchor="quic-udpdatagramdropped">
        <name>udp_datagram_dropped</name>
        <t>When a UDP-level datagram is dropped. This is typically done if it does not
contain a valid QUIC packet. If it does, but the QUIC packet is dropped for
other reasons, the <tt>packet_dropped</tt> event (<xref target="quic-packetdropped"/>) should be
used instead. The event has Extra importance level.</t>
        <figure anchor="quic-udpdatagramdropped-def">
          <name>QUICUDPDatagramDropped definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICUDPDatagramDropped = {

    ; The RawInfo fields do not include the UDP headers,
    ; only the UDP payload
    ? raw: RawInfo

    * $$quic-udpdatagramdropped-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="quic-streamstateupdated">
        <name>stream_state_updated</name>
        <t>The <tt>stream_state_updated</tt> event is emitted whenever the internal state of a
QUIC stream is updated; see <xref section="3" sectionFormat="of" target="QUIC-TRANSPORT"/>. Most of this can be
inferred from several types of frames going over the wire, but it's often easier
to have explicit signals for these state changes. The event has Base importance
level.</t>
        <t>While QUIC stream IDs encode the type of stream, (see <xref section="2.1" sectionFormat="of" target="QUIC-TRANSPORT"/>), the optional <tt>stream_type</tt> field can be used to provide a
more-accessible form of the information.</t>
        <t><xref section="3" sectionFormat="of" target="QUIC-TRANSPORT"/> describes streams in terms of their send and
receive components, with a state machine for each. The <tt>stream_side</tt> field is
used to indicate which side's state is updated in the logged event. In case both
sides of the stream change state at the same time (for example both become
<tt>closed</tt>), two separate events with different <tt>stream_side</tt> fields <bcp14>SHOULD</bcp14> be
logged.</t>
        <t>In cases where it is useful to know which side of the connection initiated a
state change (for example, closed due to either RESET_STREAM or STOP_SENDING),
this can be reflected using the <tt>trigger</tt> field.</t>
        <figure anchor="quic-streamstateupdated-def">
          <name>QUICStreamStateUpdated definition</name>
          <sourcecode type="cddl"><![CDATA[
StreamType = "unidirectional" /
             "bidirectional"

QUICStreamStateUpdated = {
    stream_id: uint64
    ? stream_type: StreamType
    ? old: $StreamState
    new: $StreamState
    stream_side: "sending" /
                 "receiving"
    ? trigger:
      ; stream state change was initiated by a local action
      "local" /
      ; stream state change was initiated by a remote action
      "remote"

    * $$quic-streamstateupdated-extension
}

BaseStreamStates =  "idle" /
                    "open" /
                    "closed"

GranularStreamStates =
    ; bidirectional stream states, RFC 9000 Section 3.4.
    "half_closed_local" /
    "half_closed_remote" /
    ; sending-side stream states, RFC 9000 Section 3.1.
    "ready" /
    "send" /
    "data_sent" /
    "reset_sent" /
    "reset_received" /
    ; receive-side stream states, RFC 9000 Section 3.2.
    "receive" /
    "size_known" /
    "data_read" /
    "reset_read" /
    ; both-side states
    "data_received" /
    ; qlog-defined: memory actually freed
    "destroyed"

$StreamState /= BaseStreamStates / GranularStreamStates
]]></sourcecode>
        </figure>
        <t>QUIC implementations <bcp14>SHOULD</bcp14> mainly log the simplified BaseStreamStates instead
of the more fine-grained GranularStreamStates. These latter ones are mainly for
more in-depth debugging. Tools <bcp14>SHOULD</bcp14> be able to deal with both types equally.</t>
      </section>
      <section anchor="frame-related-events">
        <name>Frame-related events</name>
        <t>While the <tt>packet_sent</tt> (<xref target="quic-packetsent"/>) and <tt>packet_received</tt>
(<xref target="quic-packetreceived"/>) events can convey all frames contained in a single
QUIC packet, some implementations might not be able or willing to include frame
information at the moment either event is logged.</t>
        <t>In order to support logging frame-related operations independent of packets, the
<tt>frames_created</tt>, <tt>frames_parsed</tt>, and <tt>frames_processed</tt> events are defined.</t>
        <t>A qlog trace can contain both packet and frame-related events. However, it is
<bcp14>RECOMMENDED</bcp14> that implementations avoid generating events with duplicate or
redundant frame information, since doing so inflates the size of logs.</t>
        <t>Where an implementation logs both packet and frame-related events, the optional
<tt>packet_numbers</tt> field in frame-related events can be used to explicitly link
frames to packets. The field is an array, which supports using a single event
for multiple frames related to multiple packets. To map between the two, the
position and order of entries in the <tt>frames</tt> and <tt>packet_numbers</tt> is used. If
the <tt>packet_numbers</tt> field is logged, each and every frame <bcp14>MUST</bcp14> have a
corresponding packet number at the same index.</t>
        <t>For example, an instance of the <tt>frames_processed</tt> event that represents four
STREAM frames received over two packets can be serialized as:</t>
        <artwork><![CDATA[
"frames":[
  {"frame_type":"stream","stream_id":0,"offset":0,"raw":{"length":5}},
  {"frame_type":"stream","stream_id":0,"offset":5,"raw":{"length":5}},
  {"frame_type":"stream","stream_id":1,"offset":0,"raw":{"length":9}},
  {"frame_type":"stream","stream_id":1,"offset":9,"raw":{"length":9}}
  ],
"packet_numbers":[
  1,
  1,
  2,
  2
]
]]></artwork>
        <t>Frame-related events omit information that is available in the <tt>packet_received</tt>
or <tt>packet_sent</tt> event. For instance, the packet encryption level. For use
cases that require such information, the packet events are preferable.</t>
        <t>Frame-related events make it possible to log, in extensions, information that is
otherwise not available at the moment a packet event occurs. For instance, if
frame processing was deferred for any reason.</t>
        <section anchor="quic-framescreated">
          <name>frames_created</name>
          <t>The <tt>frames_created</tt> event indicates when a set of QUIC frames have been
created. It has Extra importance level.</t>
          <figure anchor="quic-framescreated-def">
            <name>QUICFramesCreated definition</name>
            <sourcecode type="cddl"><![CDATA[
QUICFramesCreated = {
    frames: [* $QuicFrame]
    ? packet_numbers: [* uint64]

    * $$quic-framescreated-extension
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="quic-framesparsed">
          <name>frames_parsed</name>
          <t>The <tt>frames_parsed</tt> event indicates when a set of QUIC frames have been parsed.
It has Extra importance level.</t>
          <figure anchor="quic-framesparsed-def">
            <name>QUICFramesParsed definition</name>
            <sourcecode type="cddl"><![CDATA[
QUICFramesParsed = {
    frames: [* $QuicFrame]
    ? packet_numbers: [* uint64]

    * $$quic-framesparsed-extension
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="quic-framesprocessed">
          <name>frames_processed</name>
          <t>The <tt>frames_processed</tt> event indicates when a set of QUIC frames have been
processed at the receiver. It has Extra importance level.</t>
          <t>This event exists to eliminate the need to define specific-purpose events, where
the effect of processing a frame can be easily inferred from its contents. For
example, there would be no need to define a hypothetical <tt>packets_acknowledged</tt>
event, when an ACK frame contains all relevant information.</t>
          <t>The <tt>frames_processed</tt> event can be used to signal internal state change not
resulting directly from the actual parsing of a frame (e.g., the frame could
have been parsed, data put into a buffer, then later processed and logged).
Using <tt>frames_processed</tt> in additional to <tt>packet_received</tt> and/or
<tt>frames_parsed</tt> allows an implementation to log its full sequence of events.</t>
          <figure anchor="quic-framesprocessed-def">
            <name>QUICFramesProcessed definition</name>
            <sourcecode type="cddl"><![CDATA[
QUICFramesProcessed = {
    frames: [* $QuicFrame]
    ? packet_numbers: [* uint64]

    * $$quic-framesprocessed-extension
}
]]></sourcecode>
          </figure>
        </section>
      </section>
      <section anchor="quic-streamdatamoved">
        <name>stream_data_moved</name>
        <t>The <tt>stream_data_moved</tt> event is used to indicate when QUIC stream data moves
between the different layers. This helps make clear the flow of data, how long
data remains in various buffers, and the overheads introduced by individual
layers. The event has Base importance level.</t>
        <t>The <tt>raw.length</tt> field is used to reflect how many bytes were moved. As this
event relates to stream data only, there are no packet or frame headers and the
<tt>raw.length</tt> field <bcp14>MUST</bcp14> reflect that.</t>
        <t>For example, it can be useful to understand when data moves from an
application protocol (e.g., HTTP) to QUIC stream buffers and vice versa.</t>
        <t>The <tt>stream_data_moved</tt> event can provide insight into whether received data on
a QUIC stream is moved to the application protocol immediately (for example per
received packet) or in larger batches (for example, all QUIC packets are
processed first and afterwards the application layer reads from the streams with
newly available data). This can help identify bottlenecks, flow control issues,
or scheduling problems.</t>
        <t>The <tt>additional_info</tt> field supports optional logging of information related to
the stream state. For example, an application layer that moves data into
transport and simultaneously ends the stream, can log <tt>fin_set</tt>. As another
example, a transport layer that has received an instruction to reset a stream
can indicate this to the application layer using <tt>stream_reset</tt>. In both cases,
the <tt>raw.length</tt> field can be omitted or have a zero value.</t>
        <t>This event is only for data in QUIC streams. For data in QUIC Datagram Frames,
see the <tt>datagram_data_moved</tt> event defined in <xref target="quic-datagramdatamoved"/>.</t>
        <figure anchor="quic-streamdatamoved-def">
          <name>QUICStreamDataMoved definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICStreamDataMoved = {
    ? stream_id: uint64
    ? offset: uint64

    ? from: $DataLocation
    ? to: $DataLocation

    ? additional_info: $DataMovedAdditionalInfo

    ? raw: RawInfo

    * $$quic-streamdatamoved-extension
}

$DataLocation /=  "application" /
                  "transport" /
                  "network"

$DataMovedAdditionalInfo /= "fin_set" /
                            "stream_reset"
]]></sourcecode>
        </figure>
      </section>
      <section anchor="quic-datagramdatamoved">
        <name>datagram_data_moved</name>
        <t>The <tt>datagram_data_moved</tt> event is used to indicate when QUIC Datagram Frame
data (see <xref target="RFC9221"/>) moves between the different layers. This helps make
clear the flow of data, how long data remains in various buffers, and the
overheads introduced by individual layers. The event has Base importance level.</t>
        <t>The <tt>raw.length</tt> field is used to reflect how many bytes were moved. As this
event relates to datagram data only, there are no packet or frame headers and
the <tt>raw.length</tt> field <bcp14>MUST</bcp14> reflect that.</t>
        <t>For example, passing from the application protocol (e.g., WebTransport) to QUIC
Datagram Frame buffers and vice versa.</t>
        <t>The <tt>datagram_data_moved</tt> event can provide insight into whether received data
in a QUIC Datagram Frame is moved to the application protocol immediately (for
example per received packet) or in larger batches (for example, all QUIC packets
are processed first and afterwards the application layer reads all Datagrams at
once). This can help identify bottlenecks, flow control issues, or scheduling
problems.</t>
        <t>This event is only for data in QUIC Datagram Frames. For data in QUIC streams,
see the <tt>stream_data_moved</tt> event defined in <xref target="quic-streamdatamoved"/>.</t>
        <figure anchor="quic-datagramdatamoved-def">
          <name>QUICDatagramDataMoved definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICDatagramDataMoved = {
    ? from: $DataLocation
    ? to: $DataLocation
    ? raw: RawInfo

    * $$quic-datagramdatamoved-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="quic-connectiondatablockedupdated">
        <name>connection_data_blocked_updated</name>
        <t>The <tt>connection_data_blocked_updated</tt> event is used to indicate when the QUIC
connection becomes blocked or unblocked for sending data. When a connection is
"blocked", data can't be sent in streams and/or datagrams until the blocking
reason has been resolved. The event has Extra importance level.</t>
        <t>Use the <tt>stream_data_blocked_updated</tt> or <tt>datagram_data_blocked_updated</tt> event to
provide more fine-grained information for individual data types.</t>
        <figure anchor="quic-connectiondatablockedupdated-def">
          <name>QUICConnectionDataBlockedUpdated definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICConnectionDataBlockedUpdated = {
    ? old: $BlockedState
    new: $BlockedState

    ? reason: $BlockedReason
}

$BlockedState /= "blocked" /
               "unblocked"

$BlockedReason /= "scheduling" /
                  "pacing" /
                  "amplification_protection" /
                  "congestion_control" /
                  "connection_flow_control" /
                  "stream_flow_control" /
                  "stream_id" /
                  "application"
]]></sourcecode>
        </figure>
      </section>
      <section anchor="quic-streamdatablockedupdated">
        <name>stream_data_blocked_updated</name>
        <t>The <tt>stream_data_blocked_updated</tt> event is used to indicate when a QUIC stream
becomes blocked or unblocked for sending. The event has Extra importance level.</t>
        <figure anchor="quic-streamdatablockedupdated-def">
          <name>QUICStreamDataBlockedUpdated definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICStreamDataBlockedUpdated = {
    ? old: $BlockedState
    new: $BlockedState

    stream_id: uint64

    ? reason: $BlockedReason
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="quic-datagramdatablockedupdated">
        <name>datagram_data_blocked_updated</name>
        <t>The <tt>datagram_data_blocked_updated</tt> event is used to indicate when QUIC
datagrams become blocked or unblocked for sending. The event has Extra
importance level.</t>
        <figure anchor="quic-datagramdatablockedupdated-def">
          <name>QUICDatagramDataBlockedUpdated definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICDatagramDataBlockedUpdated = {
    ? old: $BlockedState
    new: $BlockedState

    ? reason: $BlockedReason
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="quic-migrationstateupdated">
        <name>migration_state_updated</name>
        <t>Use to provide additional information when attempting (client-side) connection
migration. While most details of the QUIC connection migration process can be
inferred by observing the PATH_CHALLENGE and PATH_RESPONSE frames, in
combination with the QUICTupleAssigned event, it can be useful to explicitly log
the progression of the migration and potentially made decisions in a single
location/event. The event has Extra importance level.</t>
        <t>Generally speaking, connection migration goes through two phases: a probing
phase (which is not always needed/present), and a migration phase (which can be
abandoned upon error).</t>
        <t>Implementations that log per-path information in a QUICMigrationStateUpdated,
<bcp14>SHOULD</bcp14> also emit QUICTupleAssigned events, to serve as a ground-truth source of
information.</t>
        <t>Definition:</t>
        <figure anchor="quic-migrationstateupdated-def">
          <name>QUICMigrationStateUpdated definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICMigrationStateUpdated = {
    ? old: MigrationState
    new: MigrationState

    ? tuple_id: TupleID

    ; the information for traffic going towards the remote receiver
    ? tuple_remote: TupleEndpointInfo

    ; the information for traffic coming in at the local endpoint
    ? tuple_local: TupleEndpointInfo

    * $$quic-migrationstateupdated-extension
}

; Note that MigrationState does not describe a full state machine
; These entries are not necessarily chronological,
; nor will they always all appear during
; a connection migration attempt.
MigrationState =
    ; probing packets are sent, migration not initiated yet
    "probing_started" /
    ; did not get reply to probing packets,
    ; discarding path as an option
    "probing_abandoned" /
    ; received reply to probing packets, path is migration candidate
    "probing_successful" /
    ; non-probing packets are sent, attempting migration
    "migration_started" /
    ; something went wrong during the migration, abandoning attempt
    "migration_abandoned" /
    ; new path is now fully used, old path is discarded
    "migration_complete"
]]></sourcecode>
        </figure>
      </section>
      <section anchor="quic-timerupdated">
        <name>timer_updated</name>
        <t>The <tt>timer_updated</tt> event is emitted when a timer changes state. It has Extra
importance level.</t>
        <t>The three main event types are:</t>
        <ul spacing="normal">
          <li>set: the timer is set with a delta timeout for when it will trigger next</li>
          <li>expired: when the timer effectively expires after the delta timeout</li>
          <li>cancelled: when a timer is cancelled</li>
        </ul>
        <t>In order to indicate an active timer's timeout update, a new <tt>set</tt> event is used.</t>
        <t>QUICTimerUpdated events with the <tt>timer_type</tt> set to <tt>ack</tt> or <tt>pto</tt> indicate
changes to the individual timeouts defined by RFC 9002: the threshold loss
detection timeout (see <xref section="6.1.2" sectionFormat="of" target="QUIC-RECOVERY"/>) and the probe timeout
(see <xref section="6.2" sectionFormat="of" target="QUIC-RECOVERY"/>). Those set to <tt>loss_timeout</tt> represent
changes to the multi-modal loss detection timer (see <xref section="A.8" sectionFormat="of" target="QUIC-RECOVERY"/>).</t>
        <t>The QUIC protocol conceptually employs a variety of timers, but their usage can
be implementation-dependent. Implementers can add additional fields to this
event if needed via <tt>$$quic-timerupdated-extension</tt> or specify other/additional
timer types via <tt>$TimerType</tt>.</t>
        <figure anchor="quic-timerupdated-def">
          <name>QUICTimerUpdated definition</name>
          <sourcecode type="cddl"><![CDATA[
; a non-exhaustive list of typically employed timers
$TimerType /= "ack" /
              "pto" /
              "loss_timeout" /
              "path_validation" /
              "handshake_timeout" /
              "idle_timeout"

QUICTimerUpdated = {
    ? timer_type: $TimerType

    ; to disambiguate in case there are multiple timers
    ; of the same type
    ? timer_id: uint64

    ; if used for recovery timers, this can be useful information
    ? packet_number_space: $PacketNumberSpace
    event_type: "set" /
                "expired" /
                "cancelled"

    ; if event_type === "set": delta time is in ms from
    ; this event's timestamp until when the timer should trigger
    ? delta: float32

    * $$quic-timerupdated-extension
}
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section anchor="sec-ev">
      <name>Security Events</name>
      <section anchor="quic-keyupdated">
        <name>key_updated</name>
        <t>The <tt>key_updated</tt> event has Base importance level.</t>
        <figure anchor="quic-keyupdated-def">
          <name>QUICKeyUpdated definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICKeyUpdated = {
    key_type: $KeyType
    ? old: hexstring
    ? new: hexstring

    ; needed for 1RTT key updates
    ? key_phase: uint64
    ? trigger:
        ; (e.g., initial, handshake and 0-RTT keys
        ; are generated by TLS)
        "tls" /
        "remote_update" /
        "local_update"

    * $$quic-keyupdated-extension
}
]]></sourcecode>
        </figure>
        <t>Note that the key_phase is the full value of the key phase (as indicated by
@M and @N in Figure 9 of <xref target="QUIC-TLS"/>). The key phase bit used on
the packet header is the least significant bit of the key phase.</t>
      </section>
      <section anchor="quic-keydiscarded">
        <name>key_discarded</name>
        <t>The <tt>key_discarded</tt> event has Base importance level.</t>
        <figure anchor="quic-keydiscarded-def">
          <name>QUICKeyDiscarded definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICKeyDiscarded = {
    key_type: $KeyType
    ? key: hexstring

    ; needed for 1RTT key updates
    ? key_phase: uint64
    ? trigger:
        ; (e.g., initial, handshake and 0-RTT keys
        ; are generated by TLS)
        "tls" /
        "remote_update" /
        "local_update"

    * $$quic-keydiscarded-extension
}
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section anchor="rec-ev">
      <name>Recovery events</name>
      <t>Most of the events in this category are kept generic to support different
recovery approaches and various congestion control algorithms. Tool creators
<bcp14>SHOULD</bcp14> make an effort to support and visualize even unknown data in these events
(e.g., plot unknown congestion states by name on a timeline visualization).</t>
      <section anchor="quic-recoveryparametersset">
        <name>recovery_parameters_set</name>
        <t>The <tt>recovery_parameters_set</tt> event groups initial parameters from both loss
detection and congestion control into a single event. It has Base importance
level.</t>
        <t>All these settings are typically set once and never change. Implementations that
do, for some reason, change these parameters during execution, <bcp14>MAY</bcp14> emit the
<tt>recovery_parameters_set</tt> event more than once.</t>
        <figure anchor="quic-recoveryparametersset-def">
          <name>QUICRecoveryParametersSet definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICRecoveryParametersSet = {

    ; Loss detection, see RFC 9002 Appendix A.2
    ; in amount of packets
    ? reordering_threshold: uint16

    ; as RTT multiplier
    ? time_threshold: float32

    ; in ms
    timer_granularity: uint16

    ; in ms
    ? initial_rtt:float32

    ; congestion control, see RFC 9002 Appendix B.2
    ; in bytes. Note that this could be updated after pmtud
    ? max_datagram_size: uint32

    ; in bytes
    ? initial_congestion_window: uint64

    ; Note that this could change when max_datagram_size changes
    ; in bytes
    ? minimum_congestion_window: uint64
    ? loss_reduction_factor: float32

    ; as PTO multiplier
    ? persistent_congestion_threshold: uint16

    * $$quic-recoveryparametersset-extension
}
]]></sourcecode>
        </figure>
        <t>Additionally, this event can contain any number of unspecified fields to support
different recovery approaches.</t>
      </section>
      <section anchor="quic-recoverymetricsupdated">
        <name>recovery_metrics_updated</name>
        <t>The <tt>recovery_metrics_updated</tt> event is emitted when one or more of the observable
recovery metrics changes value. It has Core importance level.</t>
        <t>This event <bcp14>SHOULD</bcp14> group all possible metric updates that happen at or around the
same time in a single event (e.g., if <tt>min_rtt</tt> and <tt>smoothed_rtt</tt> change at the
same time, they should be bundled in a single <tt>recovery_metrics_updated</tt> entry,
rather than split out into two). Consequently, a <tt>recovery_metrics_updated</tt>
event is only guaranteed to contain at least one of the listed metrics.</t>
        <figure anchor="quic-recoverymetricsupdated-def">
          <name>QUICRecoveryMetricsUpdated definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICRecoveryMetricsUpdated = {

    ; Loss detection, see RFC 9002 Appendix A.3
    ; all following rtt fields are expressed in ms
    ? min_rtt: float32
    ? smoothed_rtt: float32
    ? latest_rtt: float32
    ? rtt_variance: float32
    ? pto_count: uint16

    ; Congestion control, see RFC 9002 Appendix B.2.
    ; in bytes
    ? congestion_window: uint64
    ? bytes_in_flight: uint64

    ; in bytes
    ? ssthresh: uint64

    ; qlog defined
    ; sum of all packet number spaces
    ? packets_in_flight: uint64

    ; in bits per second
    ? pacing_rate: uint64

    * $$quic-recoverymetricsupdated-extension
}
]]></sourcecode>
        </figure>
        <t>In order to make logging easier, implementations <bcp14>MAY</bcp14> log values even if they are
the same as previously reported values (e.g., two subsequent
QUICRecoveryMetricsUpdated entries can both report the exact same value for
<tt>min_rtt</tt>). However, applications <bcp14>SHOULD</bcp14> try to log only actual updates to
values.</t>
        <t>Additionally, the <tt>recovery_metrics_updated</tt> event can contain any number of
unspecified fields to support different recovery approaches.</t>
      </section>
      <section anchor="quic-congestionstateupdated">
        <name>congestion_state_updated</name>
        <t>The <tt>congestion_state_updated</tt> event indicates when the congestion controller
enters a significant new state and changes its behaviour. It has Base importance
level.</t>
        <t>The values of the event's fields are intentionally unspecified here in order to
support different Congestion Control algorithms, as these typically have
different states and even different implementations of these states across
stacks. For example, for the algorithm defined in the QUIC Recovery RFC
("enhanced" New Reno), the following states are used: Slow Start, Congestion
Avoidance, Application Limited and Recovery. Similarly, states can be triggered
by a variety of events, including detection of Persistent Congestion or receipt
of ECN markings.</t>
        <figure anchor="quic-congestionstateupdated-def">
          <name>QUICCongestionStateUpdated definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICCongestionStateUpdated = {
    ? old: text
    new: text
    ? trigger: text

    * $$quic-congestionstateupdated-extension
}
]]></sourcecode>
        </figure>
        <t>The <tt>trigger</tt> field <bcp14>SHOULD</bcp14> be logged if there are multiple ways in which a state
change can occur but <bcp14>MAY</bcp14> be omitted if a given state can only be due to a single
event occurring (for example Slow Start is often exited only when ssthresh is
exceeded).</t>
      </section>
      <section anchor="quic-packetlost">
        <name>packet_lost</name>
        <t>The <tt>packet_lost</tt> event is emitted when a packet is deemed lost by loss
detection. It has Core importance level.</t>
        <t>It is <bcp14>RECOMMENDED</bcp14> to populate the optional <tt>trigger</tt> field in order to help
disambiguate among the various possible causes of a loss declaration.</t>
        <figure anchor="quic-packetlost-def">
          <name>QUICPacketLost definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICPacketLost = {

    ; should include at least the packet_type and packet_number
    ? header: PacketHeader

    ; not all implementations will keep track of full
    ; packets, so these are optional
    ? frames: [* $QuicFrame]
    ? is_mtu_probe_packet: bool .default false
    ? trigger:
        "reordering_threshold" /
        "time_threshold" /
        ; RFC 9002 Section 6.2.4 paragraph 6, MAY
        "pto_expired"

    * $$quic-packetlost-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="quic-markedforretransmit">
        <name>marked_for_retransmit</name>
        <t>The <tt>marked_for_retransmit</tt> event indicates which data was marked for
retransmission upon detection of packet loss (see <tt>packet_lost</tt>). It has Extra
importance level.</t>
        <t>Similar to the reasoning for the <tt>frames_processed</tt> event,
in order to keep the amount of different events low, this signal is grouped into
in a single event based on existing QUIC frame definitions for all types of
retransmittable data.</t>
        <t>Implementations retransmitting full packets or frames directly can just log the
constituent frames of the lost packet here (or do away with this event and use the
contents of the <tt>packet_lost</tt> event instead). Conversely, implementations that have
more complex logic (e.g., marking ranges in a stream's data buffer as in-flight),
or that do not track sent frames in full (e.g., only stream offset + length), can
translate their internal behaviour into the appropriate frame instance here even
if that frame was never or will never be put on the wire.</t>
        <t>Much of this data can be inferred if implementations log <tt>packet_sent</tt> events
(e.g., looking at overlapping stream data offsets and length, one can determine
when data was retransmitted).</t>
        <figure anchor="quic-markedforretransmit-def">
          <name>QUICMarkedForRetransmit definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICMarkedForRetransmit = {
    frames: [+ $QuicFrame]

    * $$quic-markedforretransmit-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="quic-ecnstateupdated">
        <name>ecn_state_updated</name>
        <t>The <tt>ecn_state_updated</tt> event indicates a progression in the ECN state machine
as described in <xref section="A.4" sectionFormat="of" target="QUIC-TRANSPORT"/>. It has Extra importance
level.</t>
        <figure anchor="quic-ecnstateupdated-def">
          <name>QUICECNStateUpdated definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICECNStateUpdated = {
   ? old: ECNState
    new: ECNState

    * $$quic-ecnstateupdated-extension
}

ECNState =
  ; ECN testing in progress
  "testing" /
  ; ECN state unknown, waiting for acknowledgements
  ; for testing packets
  "unknown" /
  ; ECN testing failed
  "failed" /
  ; testing was successful
  "capable"
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section anchor="quic-data-type-definitions">
      <name>QUIC data type definitions</name>
      <section anchor="quicversion">
        <name>QuicVersion</name>
        <figure anchor="quicversion-def">
          <name>QuicVersion definition</name>
          <sourcecode type="cddl"><![CDATA[
QuicVersion = hexstring
]]></sourcecode>
        </figure>
      </section>
      <section anchor="connectionid">
        <name>ConnectionID</name>
        <figure anchor="connectionid-def">
          <name>ConnectionID definition</name>
          <sourcecode type="cddl"><![CDATA[
ConnectionID = hexstring
]]></sourcecode>
        </figure>
      </section>
      <section anchor="initiator">
        <name>Initiator</name>
        <figure anchor="initiator-def">
          <name>Initiator definition</name>
          <sourcecode type="cddl"><![CDATA[
Initiator = "local" /
            "remote"
]]></sourcecode>
        </figure>
      </section>
      <section anchor="ipaddress">
        <name>IPAddress</name>
        <figure anchor="ipaddress-def">
          <name>IPAddress definition</name>
          <sourcecode type="cddl"><![CDATA[
; an IPAddress can either be a "human readable" form
; (e.g., "127.0.0.1" for v4 or
; "2001:0db8:85a3:0000:0000:8a2e:0370:7334" for v6) or
; use a raw byte-form (as the string forms can be ambiguous).
; Additionally, a hash-based or redacted representation
; can be used if needed for privacy or security reasons.
IPAddress = text /
            hexstring
]]></sourcecode>
        </figure>
      </section>
      <section anchor="tupleendpointinfo">
        <name>TupleEndpointInfo</name>
        <t>TupleEndpointInfo indicates a single half/direction of a four-tuple. A full tuple
is comprised of two halves. Firstly: the server sends to the remote client IP
+ port using a specific destination Connection ID. Secondly: the client sends to
the remote server IP + port using a different destination Connection ID.</t>
        <t>As such, structures logging tuple information <bcp14>SHOULD</bcp14> include two different
TupleEndpointInfo instances, one for each half of the tuple.</t>
        <figure anchor="tupleendpointinfo-def">
          <name>TupleEndpointInfo definition</name>
          <sourcecode type="cddl"><![CDATA[
TupleEndpointInfo = {
    ? ip_v4: IPAddress
    ? port_v4: uint16
    ? ip_v6: IPAddress
    ? port_v6: uint16

    ; Even though usually only a single ConnectionID
    ; is associated with a given tuple/path at a time,
    ; there are situations where there can be an overlap
    ; or a need to keep track of previous ConnectionIDs
    ? connection_ids: [+ ConnectionID]

    * $$quic-tupleendpointinfo-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="packettype">
        <name>PacketType</name>
        <figure anchor="packettype-def">
          <name>PacketType definition</name>
          <sourcecode type="cddl"><![CDATA[
$PacketType /=  "initial" /
                "handshake" /
                "0RTT" /
                "1RTT" /
                "retry" /
                "version_negotiation" /
                "stateless_reset" /
                "unknown"
]]></sourcecode>
        </figure>
      </section>
      <section anchor="packetnumberspace">
        <name>PacketNumberSpace</name>
        <figure anchor="packetnumberspace-def">
          <name>PacketNumberSpace definition</name>
          <sourcecode type="cddl"><![CDATA[
$PacketNumberSpace /= "initial" /
                      "handshake" /
                      "application_data"
]]></sourcecode>
        </figure>
      </section>
      <section anchor="packetheader">
        <name>PacketHeader</name>
        <t>If the <tt>packet_type</tt> numerical value does not map to a known <tt>$PacketType</tt>
string, the <tt>packet_type</tt> value of "unknown" can be used and the raw value
captured in the <tt>packet_type_bytes</tt> field; a numerical value without
variable-length integer encoding.</t>
        <t>The fixed and reserved bits are omitted here because they must be 0; see
<xref target="QUIC-TRANSPORT"/>. If these bits have an invalid value, the raw values can be
captured in the <tt>raw.data</tt> field of the event logging the PacketHeader.</t>
        <t>QUIC extensions that do utilize these bits are expected to create new events
(analogous to <tt>spin_bit_updated</tt>) or use qlog extension mechanisms to reflect
that usage.</t>
        <t>For long header packets of type initial, handshake, and 0RTT, the length field
of the packet header is logged in the qlog <tt>raw.length</tt> field, and the value
signifies the length of the packet number plus the payload.</t>
        <figure anchor="packetheader-def">
          <name>PacketHeader definition</name>
          <sourcecode type="cddl"><![CDATA[
PacketHeader = {
    packet_type: $PacketType

    ; only if packet_type === "unknown"
    ? packet_type_bytes: uint64

    ; only if packet_type === "1RTT"
    ? spin_bit: bool

    ; only if packet_type === "1RTT", and if the key phase was
    ; determined from the key_phase_bit
    ? key_phase: uint64

    ; only if packet_type === "1RTT", and if key_phase is not set
    ? key_phase_bit: bool

    ; only if packet_type === "initial" || "handshake" || "0RTT" ||
    ;                         "1RTT"
    ? packet_number_length: uint8

    ; only if packet_type === "initial" || "handshake" || "0RTT" ||
    ;                         "1RTT"
    ? packet_number: uint64

    ; only if packet_type === "initial" || "retry"
    ? token: Token

    ; only if packet_type === "initial" || "handshake" || "0RTT"
    ; Signifies length of the packet_number plus the payload
    ? length: uint16

    ; only if present in the header.
    ; if correctly using transport:connection_id_updated events,
    ; dcid can be skipped for 1RTT packets
    ? version: QuicVersion
    ? scil: uint8
    ? dcil: uint8
    ? scid: ConnectionID
    ? dcid: ConnectionID

    * $$quic-packetheader-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="token">
        <name>Token</name>
        <figure anchor="token-def">
          <name>Token definition</name>
          <sourcecode type="cddl"><![CDATA[
Token = {
    ? type: $TokenType

    ; decoded fields included in the token
    ; (typically: peer's IP address, creation time)
    ? details: {
      * text => any
    }
    ? raw: RawInfo

    * $$quic-token-extension
}

$TokenType /= "retry" /
              "resumption"
]]></sourcecode>
        </figure>
        <t>The token carried in an Initial packet can either be a retry token from a Retry
packet, or one originally provided by the server in a NEW_TOKEN frame used when
resuming a connection (e.g., for address validation purposes). Retry and
resumption tokens typically contain encoded metadata to check the token's
validity when it is used, but this metadata and its format is implementation
specific. For that, <tt>Token</tt> includes a general-purpose <tt>details</tt> field.</t>
      </section>
      <section anchor="stateless-reset-token">
        <name>Stateless Reset Token</name>
        <figure anchor="stateless-reset-token-def">
          <name>Stateless Reset Token definition</name>
          <sourcecode type="cddl"><![CDATA[
StatelessResetToken = hexstring .size 16
]]></sourcecode>
        </figure>
        <t>The stateless reset token is carried in stateless reset packets, in transport
parameters and in NEW_CONNECTION_ID frames.</t>
      </section>
      <section anchor="keytype">
        <name>KeyType</name>
        <figure anchor="keytype-def">
          <name>KeyType definition</name>
          <sourcecode type="cddl"><![CDATA[
$KeyType /= "server_initial_secret" /
            "client_initial_secret" /
            "server_handshake_secret" /
            "client_handshake_secret" /
            "server_0rtt_secret" /
            "client_0rtt_secret" /
            "server_1rtt_secret" /
            "client_1rtt_secret"
]]></sourcecode>
        </figure>
      </section>
      <section anchor="ecn">
        <name>ECN</name>
        <figure anchor="ecn-def">
          <name>ECN definition</name>
          <sourcecode type="cddl"><![CDATA[
ECN = "Not-ECT" / "ECT(1)" / "ECT(0)" / "CE"
]]></sourcecode>
        </figure>
        <t>The ECN bits carried in the IP header.</t>
      </section>
      <section anchor="quic-frames">
        <name>QUIC Frames</name>
        <t>The generic <tt>$QuicFrame</tt> is defined here as a CDDL "type socket" extension
point. It can be extended to support additional QUIC frame types.</t>
        <figure anchor="quicframe-def">
          <name>QuicFrame type socket definition</name>
          <artwork><![CDATA[
; The QuicFrame is any key-value map (e.g., JSON object)
$QuicFrame /= {
    * text => any
}
]]></artwork>
        </figure>
        <t>The QUIC frame types defined in this document are as follows:</t>
        <figure anchor="quicbaseframe-def">
          <name>QuicBaseFrames definition</name>
          <sourcecode type="cddl"><![CDATA[
QuicBaseFrames =  PaddingFrame /
                  PingFrame /
                  AckFrame /
                  ResetStreamFrame /
                  ResetStreamAtFrame /
                  StopSendingFrame /
                  CryptoFrame /
                  NewTokenFrame /
                  StreamFrame /
                  MaxDataFrame /
                  MaxStreamDataFrame /
                  MaxStreamsFrame /
                  DataBlockedFrame /
                  StreamDataBlockedFrame /
                  StreamsBlockedFrame /
                  NewConnectionIDFrame /
                  RetireConnectionIDFrame /
                  PathChallengeFrame /
                  PathResponseFrame /
                  ConnectionCloseFrame /
                  HandshakeDoneFrame /
                  UnknownFrame /
                  DatagramFrame

$QuicFrame /= QuicBaseFrames
]]></sourcecode>
        </figure>
        <section anchor="paddingframe">
          <name>PaddingFrame</name>
          <t>In QUIC, PADDING frames are simply identified as a single byte of value 0. As
such, each padding byte could be theoretically interpreted and logged as an
individual PaddingFrame.</t>
          <t>However, as this leads to heavy logging overhead, implementations <bcp14>SHOULD</bcp14> instead
emit just a single PaddingFrame and set the <tt>raw.payload_length</tt> property to the
amount of PADDING bytes/frames included in the packet.</t>
          <figure anchor="paddingframe-def">
            <name>PaddingFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
PaddingFrame = {
    frame_type: "padding"
    ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="pingframe">
          <name>PingFrame</name>
          <figure anchor="pingframe-def">
            <name>PingFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
PingFrame = {
    frame_type: "ping"
    ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="ackframe">
          <name>AckFrame</name>
          <figure anchor="ackframe-def">
            <name>AckFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
; either a single number (e.g., [1]) or two numbers (e.g., [1,2]).
; For two numbers:
; the first number is "from": lowest packet number in interval
; the second number is "to": up to and including the highest
; packet number in the interval
AckRange = [1*2 uint64]

AckFrame = {
    frame_type: "ack"

    ; in ms
    ? ack_delay: float32

    ; e.g., looks like [[1,2],[4,5], [7], [10,22]] serialized
    ? acked_ranges: [+ AckRange]

    ; ECN (explicit congestion notification) related fields
    ; (not always present)
    ? ect1: uint64
    ? ect0: uint64
    ? ce: uint64
    ? raw: RawInfo
}
]]></sourcecode>
          </figure>
          <t>Note that the packet ranges in AckFrame.acked_ranges do not necessarily have to be
ordered (e.g., [[5,9],[1,4]] is a valid value).</t>
          <t>Note that the two numbers in the packet range can be the same (e.g., [120,120] means
that packet with number 120 was ACKed). However, in that case, implementers <bcp14>SHOULD</bcp14>
log [120] instead and tools <bcp14>MUST</bcp14> be able to deal with both notations.</t>
        </section>
        <section anchor="resetstreamframe">
          <name>ResetStreamFrame</name>
          <t>If the error numerical value does not map to a known ApplicationError string,
the error value of "unknown" can be used and the raw value captured in the
error_code field; a numerical value without variable-length integer encoding.</t>
          <figure anchor="resetstreamframe-def">
            <name>ResetStreamFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
ResetStreamFrame = {
    frame_type: "reset_stream"
    stream_id: uint64
    error: $ApplicationError

    ; if error === "unknown"
    ? error_code: uint64

    ; in bytes
    final_size: uint64
    ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="resetstreamatframe">
          <name>ResetStreamAtFrame</name>
          <t>If the error_code numerical value does not map to a known ApplicationError string,
the error_code value of "unknown" can be used and the raw value captured in the
error_code_bytes field; a numerical value without variable-length integer
encoding.</t>
          <figure anchor="resetstreamatframe-def">
            <name>ResetStreamAtFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
ResetStreamAtFrame = {
    frame_type: "reset_stream_at"
    stream_id: uint64
    error: $ApplicationError

    ; if error === "unknown"
    ? error_code: uint64

    ; in bytes
    final_size: uint64

    ; in bytes
    reliable_size: uint64

    ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="stopsendingframe">
          <name>StopSendingFrame</name>
          <t>If the error numerical value does not map to a known ApplicationError string,
the error value of "unknown" can be used and the raw value captured in the
error_code field; a numerical value without variable-length integer encoding.</t>
          <figure anchor="stopsendingframe-def">
            <name>StopSendingFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
StopSendingFrame = {
    frame_type: "stop_sending"
    stream_id: uint64
    error: $ApplicationError

    ; if error === "unknown"
    ? error_code: uint64

    ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="cryptoframe">
          <name>CryptoFrame</name>
          <t>The length field of the Crypto frame <bcp14>MUST</bcp14> be logged in the qlog <tt>raw.length</tt>
field. The other sub-fields of the <tt>raw</tt> field are optional.</t>
          <figure anchor="cryptoframe-def">
            <name>CryptoFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
CryptoFrame = {
    frame_type: "crypto"
    offset: uint64
    raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="newtokenframe">
          <name>NewTokenFrame</name>
          <figure anchor="newtokenframe-def">
            <name>NewTokenFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
NewTokenFrame = {
  frame_type: "new_token"
  token: Token
  ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="streamframe">
          <name>StreamFrame</name>
          <t>If the stream frame contains a length field, it <bcp14>MUST</bcp14> be logged in the qlog
<tt>raw.length</tt> field. If it does not, the implementation <bcp14>MAY</bcp14> calculate the actual
frame byte length itself and log that in <tt>raw.length</tt> if necessary.</t>
          <figure anchor="streamframe-def">
            <name>StreamFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
StreamFrame = {
    frame_type: "stream"
    stream_id: uint64
    ? offset: uint64 .default 0
    ? fin: bool .default false
    ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="maxdataframe">
          <name>MaxDataFrame</name>
          <figure anchor="maxdataframe-def">
            <name>MaxDataFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
MaxDataFrame = {
  frame_type: "max_data"
  maximum: uint64
  ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="maxstreamdataframe">
          <name>MaxStreamDataFrame</name>
          <figure anchor="maxstreamdataframe-def">
            <name>MaxStreamDataFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
MaxStreamDataFrame = {
  frame_type: "max_stream_data"
  stream_id: uint64
  maximum: uint64
  ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="maxstreamsframe">
          <name>MaxStreamsFrame</name>
          <figure anchor="maxstreamsframe-def">
            <name>MaxStreamsFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
MaxStreamsFrame = {
  frame_type: "max_streams"
  stream_type: StreamType
  maximum: uint64
  ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="datablockedframe">
          <name>DataBlockedFrame</name>
          <figure anchor="datablockedframe-def">
            <name>DataBlockedFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
DataBlockedFrame = {
  frame_type: "data_blocked"
  limit: uint64
  ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="streamdatablockedframe">
          <name>StreamDataBlockedFrame</name>
          <figure anchor="streamdatablockedframe-def">
            <name>StreamDataBlockedFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
StreamDataBlockedFrame = {
  frame_type: "stream_data_blocked"
  stream_id: uint64
  limit: uint64
  ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="streamsblockedframe">
          <name>StreamsBlockedFrame</name>
          <figure anchor="streamsblockedframe-def">
            <name>StreamsBlockedFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
StreamsBlockedFrame = {
  frame_type: "streams_blocked"
  stream_type: StreamType
  limit: uint64
  ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="newconnectionidframe">
          <name>NewConnectionIDFrame</name>
          <figure anchor="newconnectionidframe-def">
            <name>NewConnectionIDFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
NewConnectionIDFrame = {
  frame_type: "new_connection_id"
  sequence_number: uint64
  retire_prior_to: uint64

  ; mainly used if e.g., for privacy reasons the full
  ; connection_id cannot be logged
  ? connection_id_length: uint8
  connection_id: ConnectionID
  ? stateless_reset_token: StatelessResetToken
  ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="retireconnectionidframe">
          <name>RetireConnectionIDFrame</name>
          <figure anchor="retireconnectionid-def">
            <name>RetireConnectionIDFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
RetireConnectionIDFrame = {
  frame_type: "retire_connection_id"
  sequence_number: uint64
  ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="pathchallengeframe">
          <name>PathChallengeFrame</name>
          <figure anchor="pathchallengeframe-def">
            <name>PathChallengeFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
PathChallengeFrame = {
  frame_type: "path_challenge"

  ; always 64 bits
  ? data: hexstring
  ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="pathresponseframe">
          <name>PathResponseFrame</name>
          <figure anchor="pathresponseframe-def">
            <name>PathResponseFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
PathResponseFrame = {
  frame_type: "path_response"

  ; always 64 bits
  ? data: hexstring
  ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="connectioncloseframe">
          <name>ConnectionCloseFrame</name>
          <t>An endpoint that receives unknown error codes can record it in the error_code
field using the numerical value without variable-length integer encoding.</t>
          <t>When the connection is closed due a connection-level error, the
<tt>trigger_frame_type</tt> field can be used to log the frame that triggered the
error. For known frame types, the appropriate string value is used in the error field. For
unknown frame types, the error field has the value "unknown" and the numerical
value without variable-length integer encoding can be logged in error_code.</t>
          <t>The CONNECTION_CLOSE reason phrase is a byte sequence. It is likely that this
sequence is presentable as UTF-8, in which case it can be logged in the <tt>reason</tt>
field. The <tt>reason_bytes</tt> field supports logging the raw bytes, which can be useful
when the value is not UTF-8 or when an endpoint does not want to decode it.
Implementations <bcp14>SHOULD</bcp14> log at least one format, but <bcp14>MAY</bcp14> log both or none.</t>
          <figure anchor="connectioncloseframe-def">
            <name>ConnectionCloseFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
ErrorSpace = "transport" /
             "application"

ConnectionCloseFrame = {
    frame_type: "connection_close"
    ? error_space: ErrorSpace
    ? error: $TransportError / CryptoError /
             $ApplicationError

    ; if error === "unknown"
    ? error_code: uint64

    ? reason: text
    ? reason_bytes: hexstring

    ; when error_space === "transport"
    ? trigger_frame_type: uint64 /
                          text
    ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="handshakedoneframe">
          <name>HandshakeDoneFrame</name>
          <figure anchor="handshakedoneframe-def">
            <name>HandshakeDoneFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
HandshakeDoneFrame = {
  frame_type: "handshake_done"
  ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="unknownframe">
          <name>UnknownFrame</name>
          <t>The frame_type_bytes field is the numerical value without variable-length
integer encoding.</t>
          <figure anchor="unknownframe-def">
            <name>UnknownFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
UnknownFrame = {
    frame_type: "unknown"
    frame_type_bytes: uint64
    ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="datagramframe">
          <name>DatagramFrame</name>
          <t>The QUIC DATAGRAM frame is defined in <xref section="4" sectionFormat="of" target="RFC9221"/>.</t>
          <t>If the datagram frame contains a length field, it <bcp14>MUST</bcp14> be logged in the qlog
<tt>raw.length</tt> field. If it does not, the implementation <bcp14>MAY</bcp14> calculate the actual
datagram byte length itself and log that in <tt>raw.length</tt> if necessary.</t>
          <figure anchor="datagramframe-def">
            <name>DatagramFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
DatagramFrame = {
    frame_type: "datagram"
    ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="transporterror">
          <name>TransportError</name>
          <t>The generic <tt>$TransportError</tt> is defined here as a CDDL "type socket" extension
point. It can be extended to support additional Transport errors.</t>
          <figure anchor="transporterror-def">
            <name>TransportError definition</name>
            <sourcecode type="cddl"><![CDATA[
$TransportError /= "no_error" /
                 "internal_error" /
                 "connection_refused" /
                 "flow_control_error" /
                 "stream_limit_error" /
                 "stream_state_error" /
                 "final_size_error" /
                 "frame_encoding_error" /
                 "transport_parameter_error" /
                 "connection_id_limit_error" /
                 "protocol_violation" /
                 "invalid_token" /
                 "application_error" /
                 "crypto_buffer_exceeded" /
                 "key_update_error" /
                 "aead_limit_reached" /
                 "no_viable_path" /
                 "unknown"
                 ; there is no value to reflect CRYPTO_ERROR
                 ; use the CryptoError type instead
]]></sourcecode>
          </figure>
        </section>
        <section anchor="applicationerror">
          <name>ApplicationError</name>
          <t>By definition, an application error is defined by the application-level
protocol running on top of QUIC (e.g., HTTP/3).</t>
          <t>As such, it cannot be defined here completely. It is instead defined as a CDDL
"type socket" extension point, with a single "unknown" value.</t>
          <figure anchor="applicationerror-def">
            <name>ApplicationError definition</name>
            <sourcecode type="cddl"><![CDATA[
$ApplicationError /= "unknown"
]]></sourcecode>
          </figure>
          <t>Application-level qlog definitions that wish to define new ApplicationError
strings <bcp14>MUST</bcp14> do so by extending the $ApplicationError socket as such:</t>
          <artwork><![CDATA[
$ApplicationError /= "new_error_name" /
                     "another_new_error_name"
]]></artwork>
        </section>
        <section anchor="cryptoerror">
          <name>CryptoError</name>
          <t>These errors are defined in the TLS document as "A TLS alert is turned into a QUIC
connection error by converting the one-byte alert description into a QUIC error
code. The alert description is added to 0x100 to produce a QUIC error code from
the range reserved for CRYPTO_ERROR."</t>
          <t>This approach maps badly to a pre-defined enum. As such, the crypto_error
string is defined as having a dynamic component here, which should include the
hex-encoded and zero-padded value of the TLS alert description.</t>
          <figure anchor="cryptoerror-def">
            <name>CryptoError definition</name>
            <sourcecode type="cddl"><![CDATA[
; all strings from "crypto_error_0x100" to "crypto_error_0x1ff"
CryptoError = text .regexp "crypto_error_0x1[0-9a-f][0-9a-f]"
]]></sourcecode>
          </figure>
        </section>
      </section>
    </section>
    <section anchor="packet-coalescing">
      <name>Handling Packet Coalescing</name>
      <t>Multiple QUIC packets can be coalesced in a single UDP datagram, especially
during the handshake (see <xref section="12.2" sectionFormat="of" target="QUIC-TRANSPORT"/>). However, neither
QUIC nor UDP themselves provide an explicit mechanism to track this behaviour.
To make it possible for implementations to track coalescing across packet-level
and datagram-level qlog events, this document defines a qlog-specific mechanism
for tracking coalescing across packet-level and datagram-level qlog events: a
"datagram identifier" carried in <tt>datagram_id</tt> fields. qlog implementations that
want to track coalescing can use this mechanism, where multiple events sharing
the same <tt>datagram_id</tt> indicate they were coalesced in the same UDP datagram.
The selection of specific and locally-unique <tt>datagram_id</tt> values is an
implementation choice.</t>
    </section>
    <section anchor="security-and-privacy-considerations">
      <name>Security and Privacy Considerations</name>
      <t>The security and privacy considerations discussed in <xref section="14" sectionFormat="of" target="QLOG-MAIN"/> apply to this
document as well.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document registers a new entry in the "qlog event schema URIs" registry (created in <xref section="15" sectionFormat="of" target="QLOG-MAIN"/>):</t>
      <dl>
        <dt>Event schema URI:</dt>
        <dd>
          <t>urn:ietf:params:qlog:events:quic</t>
        </dd>
        <dt>Namespace</dt>
        <dd>
          <t>quic</t>
        </dd>
        <dt>Event Types</dt>
        <dd>
          <t>server_listening,
connection_started,
connection_closed,
connection_id_updated,
spin_bit_updated,
connection_state_updated,
tuple_assigned,
mtu_updated,
version_information,
alpn_information,
parameters_set,
parameters_restored,
packet_sent,
packet_received,
packet_dropped,
packet_buffered,
packets_acked,
udp_datagrams_sent,
udp_datagrams_received,
udp_datagram_dropped,
stream_state_updated,
frames_created,
frames_parsed,
frames_processed,
stream_data_moved,
datagram_data_moved,
connection_data_blocked_updated,
stream_data_blocked_updated,
datagram_data_blocked_updated,
migration_state_updated,
key_updated,
key_discarded,
recovery_parameters_set,
recovery_metrics_updated,
congestion_state_updated,
timer_updated,
packet_lost,
marked_for_retransmit,
ecn_state_updated</t>
        </dd>
        <dt>Description:</dt>
        <dd>
          <t>Event definitions related to the QUIC transport protocol.</t>
        </dd>
        <dt>Reference:</dt>
        <dd>
          <t>This Document</t>
        </dd>
      </dl>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="QLOG-MAIN">
          <front>
            <title>qlog: Structured Logging for Network Protocols</title>
            <author fullname="Robin Marx" initials="R." surname="Marx">
              <organization>Akamai</organization>
            </author>
            <author fullname="Luca Niccolini" initials="L." surname="Niccolini">
              <organization>Meta</organization>
            </author>
            <author fullname="Marten Seemann" initials="M." surname="Seemann">
         </author>
            <author fullname="Lucas Pardue" initials="L." surname="Pardue">
              <organization>Cloudflare</organization>
            </author>
            <date day="20" month="October" year="2025"/>
            <abstract>
              <t>   qlog provides extensible structured logging for network protocols,
   allowing for easy sharing of data that benefits common debug and
   analysis methods and tooling.  This document describes key concepts
   of qlog: formats, files, traces, events, and extension points.  This
   definition includes the high-level log file schemas, and generic
   event schemas.  Requirements and guidelines for creating protocol-
   specific event schemas are also presented.  All schemas are defined
   independent of serialization format, allowing logs to be represented
   in various ways such as JSON, CSV, or protobuf.

Note to Readers

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

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

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-main-schema-13"/>
        </reference>
        <reference anchor="QUIC-TRANSPORT">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="QUIC-RECOVERY">
          <front>
            <title>QUIC Loss Detection and Congestion Control</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="I. Swett" initials="I." role="editor" surname="Swett"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document describes loss detection and congestion control mechanisms for QUIC.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9002"/>
          <seriesInfo name="DOI" value="10.17487/RFC9002"/>
        </reference>
        <reference anchor="QUIC-TLS">
          <front>
            <title>Using TLS to Secure QUIC</title>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <author fullname="S. Turner" initials="S." role="editor" surname="Turner"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document describes how Transport Layer Security (TLS) is used to secure QUIC.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9001"/>
          <seriesInfo name="DOI" value="10.17487/RFC9001"/>
        </reference>
        <reference anchor="QUIC-DATAGRAM">
          <front>
            <title>An Unreliable Datagram Extension to QUIC</title>
            <author fullname="T. Pauly" initials="T." surname="Pauly"/>
            <author fullname="E. Kinnear" initials="E." surname="Kinnear"/>
            <author fullname="D. Schinazi" initials="D." surname="Schinazi"/>
            <date month="March" year="2022"/>
            <abstract>
              <t>This document defines an extension to the QUIC transport protocol to add support for sending and receiving unreliable datagrams over a QUIC connection.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9221"/>
          <seriesInfo name="DOI" value="10.17487/RFC9221"/>
        </reference>
        <reference anchor="GREASEBIT">
          <front>
            <title>Greasing the QUIC Bit</title>
            <author fullname="M. Thomson" initials="M." surname="Thomson"/>
            <date month="August" year="2022"/>
            <abstract>
              <t>This document describes a method for negotiating the ability to send an arbitrary value for the second-most significant bit in QUIC packets.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9287"/>
          <seriesInfo name="DOI" value="10.17487/RFC9287"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="CDDL">
          <front>
            <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <author fullname="C. Vigano" initials="C." surname="Vigano"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="June" year="2019"/>
            <abstract>
              <t>This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049). Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8610"/>
          <seriesInfo name="DOI" value="10.17487/RFC8610"/>
        </reference>
        <reference anchor="RFC9221">
          <front>
            <title>An Unreliable Datagram Extension to QUIC</title>
            <author fullname="T. Pauly" initials="T." surname="Pauly"/>
            <author fullname="E. Kinnear" initials="E." surname="Kinnear"/>
            <author fullname="D. Schinazi" initials="D." surname="Schinazi"/>
            <date month="March" year="2022"/>
            <abstract>
              <t>This document defines an extension to the QUIC transport protocol to add support for sending and receiving unreliable datagrams over a QUIC connection.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9221"/>
          <seriesInfo name="DOI" value="10.17487/RFC9221"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="RFC7301">
          <front>
            <title>Transport Layer Security (TLS) Application-Layer Protocol Negotiation Extension</title>
            <author fullname="S. Friedl" initials="S." surname="Friedl"/>
            <author fullname="A. Popov" initials="A." surname="Popov"/>
            <author fullname="A. Langley" initials="A." surname="Langley"/>
            <author fullname="E. Stephan" initials="E." surname="Stephan"/>
            <date month="July" year="2014"/>
            <abstract>
              <t>This document describes a Transport Layer Security (TLS) extension for application-layer protocol negotiation within the TLS handshake. For instances in which multiple application protocols are supported on the same TCP or UDP port, this extension allows the application layer to negotiate which protocol will be used within the TLS connection.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7301"/>
          <seriesInfo name="DOI" value="10.17487/RFC7301"/>
        </reference>
      </references>
    </references>
    <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, Christian Huitema, Hugo Landau, Will Hawkins, Mathis Engelbart, Kazuho
Oku, and Jonathan Lennox for their feedback and suggestions.</t>
    </section>
    <section numbered="false" removeInRFC="true" anchor="change-log">
      <name>Change Log</name>
      <section numbered="false" anchor="since-draft-ietf-qlog-quic-events-12">
        <name>Since draft-ietf-qlog-quic-events-12:</name>
        <ul spacing="normal">
          <li>Split frames_processed into 3 events (#513)</li>
          <li>Wide range of editorial changes</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-qlog-quic-events-11">
        <name>Since draft-ietf-qlog-quic-events-11:</name>
        <ul spacing="normal">
          <li>Updated several fields to be uint64 per QUIC spec</li>
          <li>Renamed error and error_code fields and logic (#473)</li>
          <li>Clarified parameters_set usage (#493)</li>
          <li>Replaced all length fields with raw.length (#495)</li>
          <li>Change loss_timer_updated to timer_updated (#496)</li>
          <li>Renamed path_assigned to tuple_assigned (#491)</li>
          <li>Reworked stream_state_updated (#497)</li>
          <li>Renamed owner to initiator (#498)</li>
          <li>Split up flags in PacketHeader (#478)</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-qlog-quic-events-09">
        <name>Since draft-ietf-qlog-quic-events-09:</name>
        <ul spacing="normal">
          <li>Several editorial changes</li>
          <li>Reworked QUICConnectionStarted to use PathEndpointInfo (#453)</li>
          <li>Consistent use of RawInfo and _bytes fields to log raw data (#450)</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-qlog-quic-events-08">
        <name>Since draft-ietf-qlog-quic-events-08:</name>
        <ul spacing="normal">
          <li>Removed individual categories and put every event in the single <tt>quic</tt> event
schema namespace. Major change (#439)</li>
          <li>Renamed <tt>recovery:metrics_updated</tt> to <tt>quic:recovery_metrics_updated</tt> and
<tt>recovery:parameters_set</tt> to <tt>quic:recovery_parameters_set</tt> (#439)</li>
          <li>Added <tt>unknown_parameters</tt> field to <tt>parameters_set</tt> (#438)</li>
          <li>Added extra parameters to <tt>parameters_restored</tt> (#441)</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-qlog-quic-events-07">
        <name>Since draft-ietf-qlog-quic-events-07:</name>
        <ul spacing="normal">
          <li>TODO (we forgot...)</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-qlog-quic-events-06">
        <name>Since draft-ietf-qlog-quic-events-06:</name>
        <ul spacing="normal">
          <li>Added PathAssigned and MigrationStateUpdated events (#336)</li>
          <li>Added extension points to parameters_set and parameters_restored (#400)</li>
          <li>Removed error_code_value from connection_closed (#386, #392)</li>
          <li>Renamed generation to key_phase for key_updated and key_discarded (#390)</li>
          <li>Removed retry_token from packet_sent and packet_received (#389)</li>
          <li>Updated ALPN handling (#385)</li>
          <li>Added key_unavailable trigger to packet_dropped (#381)</li>
          <li>Updated several uint32 to uint64</li>
          <li>ProtocolEventBody is now called ProtocolEventData (#352)</li>
          <li>Editorial changes (#402, #404, #394, #393)</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-qlog-quic-events-05">
        <name>Since draft-ietf-qlog-quic-events-05:</name>
        <ul spacing="normal">
          <li>SecurityKeyUpdated: the new key is no longer mandatory to log (#294)</li>
          <li>Added ECN related events and metadata (#263)</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-qlog-quic-events-04">
        <name>Since draft-ietf-qlog-quic-events-04:</name>
        <ul spacing="normal">
          <li>Updated guidance on logging events across connections (#279)</li>
          <li>Renamed 'transport' category to 'quic' (#302)</li>
          <li>Added support for multiple packet numbers in 'quic:frames_processed' (#307)</li>
          <li>Added definitions for RFC9287 (QUIC GREASE Bit extension) (#311)</li>
          <li>Added definitions for RFC9221 (QUIC Datagram Frame extension) (#310)</li>
          <li>(Temporarily) removed definitions for connection migration events (#317)</li>
          <li>Editorial and formatting changes (#298, #299, #304, #306, #327)</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-qlog-quic-events-03">
        <name>Since draft-ietf-qlog-quic-events-03:</name>
        <ul spacing="normal">
          <li>Ensured consistent use of RawInfo to indicate raw wire bytes (#243)</li>
          <li>Renamed UnknownFrame:raw_frame_type to :frame_type_value (#54)</li>
          <li>Renamed ConnectionCloseFrame:raw_error_code to :error_code_value (#54)</li>
          <li>Changed triggers for packet_dropped (#278)</li>
          <li>Added entries to TransportError enum (#285)</li>
          <li>Changed minimum_congestion_window to uint64 (#288)</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-qlog-quic-events-02">
        <name>Since draft-ietf-qlog-quic-events-02:</name>
        <ul spacing="normal">
          <li>Renamed key_retired to key_discarded (#185)</li>
          <li>Added fields and events for DPLPMTUD (#135)</li>
          <li>Made packet_number optional in PacketHeader (#244)</li>
          <li>Removed connection_retried event placeholder (#255)</li>
          <li>Changed QuicFrame 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 numbered="false" anchor="since-draft-ietf-qlog-quic-events-01">
        <name>Since draft-ietf-qlog-quic-events-01:</name>
        <ul spacing="normal">
          <li>Added Stateless Reset Token type (#122)</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-qlog-quic-events-00">
        <name>Since draft-ietf-qlog-quic-events-00:</name>
        <ul spacing="normal">
          <li>Change the data definition language from TypeScript to CDDL (#143)</li>
        </ul>
      </section>
      <section numbered="false" 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>
          <li>Changed to/from value options of the <tt>data_moved</tt> event</li>
        </ul>
      </section>
      <section numbered="false" 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 numbered="false" 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>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+2923bj1pUo+o6vQLM8hiU3qZJUZVeZPu5ElmRbnbq1pEp2
huNBQSQkIUUCDABKpVSqv+W8nn/YT3v/2JnXdcMCqXKc7B6njzNiU8DCus41
75fRaJS0RTvPx+l/vD05TPPbvGzTWX5VlEVbVGWTXlV1+pd5dZ3MqmmZLaDh
rM6u2lGRt1ejv6yK6Qjf8i/6uhntPUmmWZtfV/X9OG3aWZIUy3qctvWqafd3
d7/e3U+yOs/G6Xmdlc2yqtvkrqrfXdfVasnzSN7l9/BoNk5Pyjavy7wdHeGo
SdK0WTmbZPOqhJnc502yLMbpT201HaYwwaKcwQyGaQN91vlVA7/uF/KjrYsp
vJpWi2UmPxY43WFalPOizH9OkmzV3lT1OEnTEfw/hRfNOD3dSV9m9Xt6wBtw
Wl0WpX1Y1dfj9OBdtsgK+juHH/NxWi+gwW8zer4Dg9G7usKtzmdFW9X+MC92
0lfFdFrBVApnrBeraRa8oPFe5m3mjjYvtc1vF/DqAQO+3EnPcvi6LJ3hYFFt
XnovZIAFvWn4xW+v8WHvIGZFb7J6tsqD5TTuY1rM4bxaza7mABTekrDtb+nf
S/ogPl5SVrDVbXGbjxN4+x8vXv8wenlw8mpMTU9GRzsBqELv5aiZ3sAwAJnl
lfP5aDRKs0sAFYCQJDm/KRqEqtWCL0UzrYvLvEkzuhByV7gjgKayhX6L8hp/
Tuu8zZ1WiXujAIDT9iYv6hRPapa1GV0yeASf1jlfxGVdAVBXc2rd5PN82uaz
JH+PZ4C97PBky6rNJ6/wX201Oc2zWV43SfJvKT5K2yo9/f5Q9mmcvpnnWZOn
db6obuElLq6BbqG39DK/wpGXq8t5AVcXHkH/3+f57DKbvqMpzIpmumpw6BSO
Kb3L53AYeZq1yU83bbtsxo8fXxftzeoSD+kxbvbd9WPcgJ+31r/f3kll3thx
ks1uiyaf4dzh3uY1/sCdGfAqPm8Y/QxgZHgO/3p7+oK2LyvT1XLUViPY0Dy9
hf5grkl1xQvVU5RtWxSz2TxPkkeIX+pqtqJt6J44HFrPeW99+HAmm/c8hVEM
2H38uJ3EgIFx47qT3oLLlXz48C/4dHR+evDq7M3r0/Nv4Qi/3t3d/fhxmOrL
0+PD178/Pv2jvNvHd3BI9uMXZ/JqD6bDIISnBfMsYA4Wivwxjw7OD344PXhJ
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
Y6QxXRTnKS1sKuNUXUEV5bEzaASWkSh3EtYIRQ4z0wg5Dpt3aLHjsTZ6kd0D
nGtcl0t6ki0Mbt22Pi/sfqochBLu35x+f/jsya7Nj+7YPigbn+Rg/3QqjmpL
Us5foyuiIg+l43avcZpO2BhQwUM6WLI4sDqYPiKShfYHfv1jDiRqKB6teNxN
Ss5sQPqQxLZC4vHTnfQ1Hu4UGdGhpXvBwCQUsJlG3KjalEoGmIE5nogGJiAs
KxmykHsaenZSl6T7RsEtWCdtECVZVuG/sR61l6RGxTkQuMKuvz3/fvR8h0GE
wpZNTxfsEmrgQxyoGIB20jAjnKh5KeF8m6AGBp1oc2nPDmIvD/5IDUiKgatY
QoOQVIex0x06jYCM1PeL1J9vQKc3NuNrhc3GQZOATgcXyjfQ+l/KbH9DBzAh
0Xuc3uTvJfEdrYJ+6jvyyQxofTheQOjDDfpHU3naSCWhf7BenH5/XSqO38VJ
uLCGqU827TjDcGy2z/vkcCThJDO6i2h9dIgBfmcoAeuvhQ7Q5af7J6+5t50H
rK10lrRm4xxGCNsbwmbMyew1BAMezMlewn4bQ8uPoJ5kisrIXDRtxq2CJQtR
SeCNusuKVhIbmzGWRnCWjTeasEo68g+adQrejstu+uuAk2G1QJCIReiOn2NF
qI7fVGkOZbkgvyrUfkmOWc1HbjWvTbWqAX0lW4a8OEMPnXz0mNG7ne5ss3XA
l0Cs1ysZodsqWcB+LFAaxy3KFoBhWyf9Oem70EY1rVYSKIQxjis05fF8kUhl
KDjhtBOmBysMg2Gfx0WOPmJFsxAFV4N44aa4vhEjC7tjo8u747qmBDDmnvmy
avREm9xuGgV7GNdUjlmYssNUiVspHm9OzFhLWZtr1PKtzEeZozpN2eo+W9Xm
rjlerA3BMVa2gYuUgBy4orIM7A7AZ4cUMiOSo6U1HDizw4h+igHKRtGRjsWs
jyX1u4pDB8SvCo8QZ026L7w0+AC9fvKGc3EmjlUD/Rm27fl3oi8ujJem6kF9
NyvWo3EW00tJVTrlIiHZfG5nKgr+WVf8NRui3GXiwzwuD+MYGilzwt5LkmhG
xxWmEK1I2DwMdpUdN/wrG1rInxvzBmPnGAjLtT0KSjkLW1tgmG+GVk8SAHC/
EvHQ0SkOxR3XyUAaFP2w8TDA+q5aLHcEB/rdvSqvxUZp7g1q9prVQvT8zE9c
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

-->

</rfc>
