<?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-14" 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-14"/>
    <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>Apple</organization>
      <address>
        <email>lucas@lucaspardue.com</email>
      </address>
    </author>
    <date year="2026" month="November" day="02"/>
    <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"/>, <xref target="GREASEBIT"/>, and
<xref target="RESET-STREAM-AT"/>).</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 <tt>data</tt> field and defining their
<tt>name</tt> field values and semantics. The data types that the events use are
defined in <xref target="quic-data-types"/>.</t>
      <section anchor="use-of-group-ids">
        <name>Use of Group IDs</name>
        <t>QUIC's Original Destination Connection ID (ODCID) can be used as the value of
the qlog <tt>group_id</tt> field. The ODCID is the connection ID that the client
chooses for its first Initial packet. It stays the same for the whole
connection, unlike the connection IDs that endpoints use, which can change. It
can also link packets such as Retry and Version Negotiation to the connection.</t>
        <t>The ODCID can also be used as the qlog filename or file identifier, optionally
suffixed by the vantage point 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>Protected QUIC packets (Initial, 0-RTT, Handshake, and 1-RTT) end with an AEAD
authentication tag. Every cipher suite that QUIC version 1 can use has a
16-byte tag; see <xref section="5.3" sectionFormat="of" target="QUIC-TLS"/>. When calculating the lengths in
RawInfo fields (<xref section="10" sectionFormat="of" target="QLOG-MAIN"/>) for these packets, the tag is
treated as a 16-byte trailer.</t>
      </section>
      <section anchor="handling-unknown-connections">
        <name>Events without a Known Connection</name>
        <t>A qlog trace is typically associated with a single QUIC connection. However,
some events cannot be tied to a specific connection, especially on the server.
For example, a <tt>packet_dropped</tt> event (<xref target="quic-packetdropped"/>) with the trigger
"connection_unknown" is for a packet that matches no known connection.</t>
        <t>There are various ways to handle these events, each with tradeoffs between file
size overhead, flexibility, ease of use, and 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 to identify the connection, for example the
four-tuple in addition to the connection ID.</li>
          <li>Buffer events until they can be assigned to a connection, for example events
about the Version Negotiation and Retry packets that a server sends before it
creates connection state.</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>This document uses the following from <xref target="QLOG-MAIN"/>: the event namespace and
event type concepts; the name, data, tuple, group_id, and time-related fields;
and the RawInfo type.</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: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:datagram_dropped</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-datagramdropped"/></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 /
                QUICStreamDataMoved /
                QUICDatagramDataMoved /
                QUICDatagramDropped /
                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, Transport,
Security, 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>The <tt>server_listening</tt> event is 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 = {
    ? address_v4: IPAddressPort
    ? address_v6: IPAddressPort

    ; the server will always answer client Initial packets with a Retry
    ; packet (no 1-RTT connection setups by choice)
    ? retry_required: bool

    * $$quic-serverlistening-extension
}
]]></sourcecode>
        </figure>
        <t>Some QUIC stacks do not handle sockets directly, so they cannot log IP
addresses or ports.</t>
      </section>
      <section anchor="quic-connectionstarted">
        <name>connection_started</name>
        <t>The <tt>connection_started</tt> event is emitted when a client attempts a new
connection, or when a server accepts one. It overlaps with the
<tt>connection_state_updated</tt> event, but it also logs the local and remote
endpoint information. 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, so they cannot log IP
addresses or ports. All fields of TupleEndpointInfo
(<xref target="tupleendpointinfo-def"/>) are optional, so such a stack can log <tt>local</tt> and
<tt>remote</tt> with only the fields it knows, such as <tt>connection_ids</tt>.</t>
      </section>
      <section anchor="quic-connectionclosed">
        <name>connection_closed</name>
        <t>The <tt>connection_closed</tt> event is emitted when a connection closes, typically
because of an error or a timeout. It has Base importance level.</t>
        <t>This event overlaps with the <tt>connection_state_updated</tt> event and the
CONNECTION_CLOSE frame. However, when analyzing large deployments, it can be
useful to have a single event for each closure, with a <tt>reason</tt> field for more
detail. This event can also log closures due to timeouts or explicit
application actions, such as racing several connections and aborting the
slowest, which the other events cannot easily capture.</t>
        <t>The <tt>connection_closed</tt> event is logged when the local endpoint does one of the
following; see <xref section="10" sectionFormat="of" target="QUIC-TRANSPORT"/>:</t>
        <ul spacing="normal">
          <li>silently discards the connection after an idle timeout;</li>
          <li>sends a CONNECTION_CLOSE frame, and enters the closing state;</li>
          <li>receives a CONNECTION_CLOSE frame, and enters the draining state; or</li>
          <li>receives a Stateless Reset, and enters the draining state.</li>
        </ul>
        <t>Later changes, such as leaving the closing or draining state, are logged with
the <tt>connection_state_updated</tt> event.</t>
        <t>QUIC has two kinds of connection error, transport errors and application
errors, each with defined codes and semantics; see <xref section="20" sectionFormat="of" target="QUIC-TRANSPORT"/>. An implementation can also have internal errors, which it
might or might not map to these codes. So this event can carry two levels of
error: <tt>connection_error</tt> or <tt>application_error</tt> for the QUIC error, and
<tt>internal_code</tt> for a more specific internal error.</t>
        <t>If an error code has no known string, <tt>connection_error</tt> or <tt>application_error</tt>
can be "unknown", and <tt>error_code</tt> then holds the 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>Implementations <bcp14>SHOULD</bcp14> use the most descriptive <tt>trigger</tt> value that they can
determine. This is often clear at the endpoint that closes the connection, but
can be less clear at the endpoint that receives the CONNECTION_CLOSE frame.</t>
      </section>
      <section anchor="quic-connectionidupdated">
        <name>connection_id_updated</name>
        <t>The <tt>connection_id_updated</tt> event is emitted when either endpoint updates its
current connection ID. This typically happens rarely during a connection, so
logging this event is more efficient than logging the connection ID in every
<tt>packet_sent</tt> or <tt>packet_received</tt> event. 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. When the endpoint receives a new connection ID
from the peer, the <tt>initiator</tt> field is "remote". When the endpoint updates its
own connection ID, the <tt>initiator</tt> field is "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 is emitted when the value of the QUIC latency spin
bit changes; see <xref section="17.4" sectionFormat="of" target="QUIC-TRANSPORT"/>. It <bcp14>SHOULD NOT</bcp14> be emitted
when the spin bit is set to the value it already has. 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 emitted when the connection changes
state, to track progress through the QUIC handshake and connection close. It
has Base importance level.</t>
        <t><xref target="QUIC-TRANSPORT"/> does not define a complete set of connection states or their
transitions, though it names some, such as the closing and draining states.
This document defines the states most likely to be useful for debugging QUIC
connections; the list is not exhaustive.</t>
        <t>QUIC implementations <bcp14>SHOULD</bcp14> log the BaseConnectionStates, and can add the
GranularConnectionStates when more in-depth debugging is required. Tools
<bcp14>SHOULD</bcp14> handle both kinds 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 or Stateless Reset received
    "draining" /

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

$ConnectionState /= BaseConnectionStates / GranularConnectionStates
]]></sourcecode>
        </figure>
        <t>The <tt>connection_state_updated</tt> event overlaps with the <tt>connection_closed</tt> and
<tt>connection_started</tt> events, and with the frames logged in events such as
<tt>packet_received</tt>. Still, it can be useful to log state transitions separately,
especially if they map to an internal state machine. Implementations can
therefore use other ConnectionState values that match their internal logic.
Tools <bcp14>SHOULD</bcp14> handle these custom states in a similar way to the states defined
in this document.</t>
      </section>
      <section anchor="quic-tupleassigned">
        <name>tuple_assigned</name>
        <t>The <tt>tuple_assigned</tt> event associates a TupleID with the details of a network
tuple, such as its IP addresses, ports, and connection IDs. 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 its top-level <tt>tuple</tt> field, whose value is a
TupleID. Encoding tuple details, such as IP addresses or connection IDs, into
the TupleID itself can be cumbersome. This event records them separately, so
TupleIDs can stay short, and their details can be updated as the connection
evolves.</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>Implementations choose their own <tt>tuple_id</tt> values. For example, a TupleID can
be an incrementing integer, the first Destination Connection ID associated with
the tuple (or its sequence number), or the two endpoint IP addresses or a hash
of them.</t>
        <t>The empty string ("") is a valid TupleID, and it is the default for events that
do not set the <tt>tuple</tt> field. So the initial tuple of a QUIC connection, on
which the handshake occurs (see <xref target="quic-connectionstarted"/>), is implicitly
associated with the TupleID "". Details for this default tuple can be logged
with a <tt>tuple_assigned</tt> event whose <tt>tuple_id</tt> is "".</t>
        <t>Because a tuple's details can change during the connection, a TupleID can
appear in several <tt>tuple_assigned</tt> events, and the latest one holds its current
details. The first <tt>tuple_assigned</tt> event for a TupleID indicates that the
TupleID was created, and later ones indicate updates. An event with both
<tt>tuple_local</tt> and <tt>tuple_remote</tt> omitted indicates that the TupleID was
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 Path MTU discovery; see <xref section="14" sectionFormat="of" target="QUIC-TRANSPORT"/>. 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

    * $$quic-mtuupdated-extension
}
]]></sourcecode>
        </figure>
        <t>The <tt>done</tt> field defaults to false.</t>
      </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>Each QUIC endpoint supports one or more versions. The client sends its first
Initial packet using one of them. A server that does not support that version
can reply with a Version Negotiation packet, which lists the versions the
server supports. This event records the versions that each endpoint supports,
and the chosen version if there is one.</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>A client logs this event when it sends its first Initial packet. The event
includes <tt>client_versions</tt>, and <tt>chosen_version</tt> holds the version used in that
packet.</t>
        <t>If the client then processes a Version Negotiation packet, it logs this event
again with <tt>client_versions</tt>. The event also includes <tt>server_versions</tt>, which
holds the versions from that packet. If the client selects one of them,
<tt>chosen_version</tt> holds it; otherwise, <tt>chosen_version</tt> is absent.</t>
        <t>A Version Negotiation packet can also list reserved versions, which an endpoint
adds to check that its peer ignores unknown versions; see <xref section="6.3" sectionFormat="of" target="QUIC-TRANSPORT"/>. Because <tt>server_versions</tt> holds the versions from the packet,
it can include reserved versions.</t>
        <t>A server logs this event when it receives a client's first Initial packet. The
event includes <tt>server_versions</tt>. If the server supports the client's version,
<tt>chosen_version</tt> holds the version that the server uses for the connection.
Otherwise, <tt>chosen_version</tt> is absent, and <tt>client_versions</tt> holds the version
the client used.</t>
      </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. During
the TLS handshake, the client sends its list, and the server chooses one
identifier from both lists and sends it back. If no match is found, the
connection is closed.</t>
        <t>ALPN identifiers are byte sequences, which are often valid UTF-8. The
<tt>ALPNIdentifier</tt> type can hold either form: <tt>byte_value</tt> holds the raw bytes,
and <tt>string_value</tt> holds the identifier as text. Implementations <bcp14>SHOULD</bcp14> log at
least one form and <bcp14>MAY</bcp14> log both.</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>A client usually logs this event twice: first with <tt>client_alpns</tt> when it
offers its list, then with <tt>chosen_alpn</tt> when it learns the server's choice. It
can instead log a single event with both fields once it learns the choice.</t>
        <t>A server logs this event once, after it chooses, with <tt>client_alpns</tt>,
<tt>server_alpns</tt>, and <tt>chosen_alpn</tt>.</t>
      </section>
      <section anchor="quic-parametersset">
        <name>parameters_set</name>
        <t>The <tt>parameters_set</tt> event groups settings from several sources, such as
transport parameters and the TLS cipher suite, into a single event. This keeps
the number of events low, and lets a reader reason about what the settings do
without needing to know which mechanism set each one. It has Core importance
level.</t>
        <t>Most of these settings are set once and never change. However, they are often
set at different times during the connection, so a trace can contain several
<tt>parameters_set</tt> events with different fields set.</t>
        <t>Some settings have two values: one set by the local endpoint, and one requested
by the peer. The <tt>initiator</tt> field says which side the settings in an event
come from, so it <bcp14>MUST</bcp14> be correct for every setting in that event. Local and
remote settings <bcp14>MUST</bcp14> be logged in separate events. If the local endpoint
changes its behavior based on the peer's settings, the outcome can be logged
with a new event type, or with fields added through
<tt>$$quic-parametersset-extension</tt>; see <xref section="8.2" sectionFormat="of" target="QLOG-MAIN"/>.</t>
        <t>The <tt>initiator</tt> field is required. Settings that both endpoints negotiate, such
as <tt>tls_cipher</tt>, are logged in both the local and the remote event.</t>
        <t>Each setting starts the connection with its default value, or with no value if
it has no default. A <tt>parameters_set</tt> event that includes a setting replaces
its previous value; settings that the event omits keep their values.</t>
        <t>The <tt>grease_quic_bit</tt> and <tt>reset_stream_at</tt> settings are true if the transport
parameter is present, and default to false.</t>
        <t>Implementations are not required to recognize, process, or support every
parameter that they receive. For example, QUIC implementations ignore
transport parameters that they do not support; see <xref section="7.4.2" sectionFormat="of" target="QUIC-TRANSPORT"/>. The <tt>unknown_parameters</tt> field can log the raw values of such
parameters, for example reserved (GREASE) parameters, private extensions, or
experiments.</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
    ? grease_quic_bit: bool

    ; draft-ietf-quic-reliable-stream-reset
    ? reset_stream_at: bool

    * $$quic-parametersset-extension
}

PreferredAddress = {
    ? address_v4: IPAddressPort
    ? address_v6: IPAddressPort
    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 that a QUIC 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"
    ? stateless_reset_token: StatelessResetToken

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

    ? 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 encryption level and packet number space are not logged explicitly,
because <tt>header.packet_type</tt> implies them for the packet types that have them.</t>
        <t>The <tt>datagram_payload_checksum</tt> field is described in <xref target="packet-coalescing"/>.</t>
        <t>The <tt>is_mtu_probe_packet</tt> field defaults to false.</t>
      </section>
      <section anchor="quic-packetreceived">
        <name>packet_received</name>
        <t>The <tt>packet_received</tt> event indicates that a QUIC 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"
    ? stateless_reset_token: StatelessResetToken

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

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

    * $$quic-packetreceived-extension
}
]]></sourcecode>
        </figure>
        <t>The encryption level and packet number space are not logged explicitly,
because <tt>header.packet_type</tt> implies them for the packet types that have them.</t>
        <t>The <tt>datagram_payload_checksum</tt> field is described in <xref target="packet-coalescing"/>.</t>
      </section>
      <section anchor="quic-packetdropped">
        <name>packet_dropped</name>
        <t>The <tt>packet_dropped</tt> event indicates that a QUIC packet was dropped. It has
Base importance level.</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_payload_checksum: uint32
    ? details: {* text => any}
    ? trigger:
        "internal_error" /
        "rejected" /
        "unsupported" /
        "invalid" /
        "duplicate" /
        "connection_unknown" /
        "decryption_failure" /
        "keys_unavailable" /
        "general"

    * $$quic-packetdropped-extension
}
]]></sourcecode>
        </figure>
        <t>The <tt>trigger</tt> field gives a general reason for dropping the packet, and the
<tt>details</tt> field can hold additional implementation-specific information. Some
example situations for each trigger value include:</t>
        <ul spacing="normal">
          <li>"internal_error": not initialized, out of memory</li>
          <li>"rejected": limits reached, DDoS protection, unwilling to track more paths</li>
          <li>"unsupported": unknown or unsupported version</li>
          <li>"invalid": packet parsing or validation error</li>
          <li>"duplicate": duplicate packet</li>
          <li>"connection_unknown": packet does not relate to a known connection or
connection ID</li>
          <li>"decryption_failure": decryption failed</li>
          <li>"keys_unavailable": decryption keys were unavailable</li>
          <li>"general": situations not clearly covered in the other categories</li>
        </ul>
        <t>Packets dropped as "unsupported" or "connection_unknown" often cannot be tied to
a connection; see <xref target="handling-unknown-connections"/>.</t>
        <t>The <tt>datagram_payload_checksum</tt> field is described in <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, for example because the keys to decrypt it are not
yet available. Its full contents can be logged later, in a <tt>packet_received</tt>
event, once it is processed. It 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_payload_checksum: 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_payload_checksum</tt> field is described in <xref target="packet-coalescing"/>.</t>
      </section>
      <section anchor="quic-packetsacked">
        <name>packets_acked</name>
        <t>The <tt>packets_acked</tt> event is emitted when one or more sent packets are
acknowledged by the peer for the first time. It has Extra importance level.</t>
        <t>Successive ACK frames can acknowledge the same packet, but this event is
emitted only for the first acknowledgment of each packet. This information can
also be deduced from received ACK frames, though finding the first
acknowledgment needs extra processing. Implementations that do not log frame
contents can use this event instead.</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>The <tt>packet_number_space</tt> field defaults to "application_data", the
packet number space that most packets in a typical QUIC connection use.</t>
      </section>
      <section anchor="quic-udpdatagramssent">
        <name>udp_datagrams_sent</name>
        <t>The <tt>udp_datagrams_sent</tt> event indicates that one or more UDP datagrams were
passed to the network socket. It can show how QUIC packet buffers are drained
to the operating system. It 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
    ? ecn: [+ ECN]

    ? datagram_payload_checksums: [+ uint32]

    * $$quic-udpdatagramssent-extension
}
]]></sourcecode>
        </figure>
        <t>The RawInfo fields exclude UDP headers, because QUIC implementations do not
always handle UDP directly.</t>
        <t>If an event omits the <tt>ecn</tt> field, the ECN bits are the same as on the last
<tt>udp_datagrams_sent</tt> event.</t>
        <t>The <tt>datagram_payload_checksums</tt> field is described in <xref target="packet-coalescing"/>.</t>
      </section>
      <section anchor="quic-udpdatagramsreceived">
        <name>udp_datagrams_received</name>
        <t>The <tt>udp_datagrams_received</tt> event indicates that one or more UDP datagrams
were received from the network socket. It can show how the operating system
passes datagrams to the user-space stack. It 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
    ? ecn: [+ ECN]

    ? datagram_payload_checksums: [+ uint32]

    * $$quic-udpdatagramsreceived-extension
}
]]></sourcecode>
        </figure>
        <t>If an event omits the <tt>ecn</tt> field, the ECN bits are the same as on the last
<tt>udp_datagrams_received</tt> event.</t>
        <t>The <tt>datagram_payload_checksums</tt> field is described in <xref target="packet-coalescing"/>.</t>
      </section>
      <section anchor="quic-udpdatagramdropped">
        <name>udp_datagram_dropped</name>
        <t>The <tt>udp_datagram_dropped</tt> event indicates that a UDP datagram was dropped,
typically because it does not contain a valid QUIC packet. If the datagram
contains a valid QUIC packet that is dropped for another reason, the
<tt>packet_dropped</tt> event (<xref target="quic-packetdropped"/>) is used instead. It 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 when the state of a QUIC stream
changes; see <xref section="3" sectionFormat="of" target="QUIC-TRANSPORT"/>. Most state changes can be
inferred from the frames that are sent and received, but an explicit event can
be easier to use. It has Base importance level.</t>
        <t>QUIC stream IDs encode whether a stream is unidirectional or bidirectional
(see <xref section="2.1" sectionFormat="of" target="QUIC-TRANSPORT"/>), but the optional <tt>stream_type</tt> field
states it directly.</t>
        <t><xref section="3" sectionFormat="of" target="QUIC-TRANSPORT"/> describes the sending and receiving parts of a
stream, each with its own state machine. The <tt>stream_side</tt> field says which
part's state changed. If both parts change state at the same time, for example
when both become "closed", two events with different <tt>stream_side</tt> values
<bcp14>SHOULD</bcp14> be logged.</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" /
    ; receive-side stream states, RFC 9000 Section 3.2.
    "receive" /
    "size_known" /
    "data_read" /
    "reset_read" /
    ; both-side states
    "data_received" /
    "reset_received" /
    ; qlog-defined: memory actually freed
    "destroyed"

$StreamState /= BaseStreamStates / GranularStreamStates
]]></sourcecode>
        </figure>
        <t>QUIC implementations <bcp14>SHOULD</bcp14> log the BaseStreamStates, and can add the
GranularStreamStates when more in-depth debugging is required. Tools <bcp14>SHOULD</bcp14>
handle both kinds equally.</t>
        <t>The <tt>trigger</tt> field can show which endpoint initiated a state change, for
example when a stream is closed because of a RESET_STREAM or STOP_SENDING
frame.</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>The <tt>frames_created</tt> and <tt>frames_parsed</tt> events log frames independently of
packets.</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 link
frames to packets explicitly. The field is an array so that a single event can
log frames that belong to different packets. The <tt>frames</tt> and <tt>packet_numbers</tt>
arrays are mapped to each other by the position and order of their entries. If
the <tt>packet_numbers</tt> field is logged, every frame <bcp14>MUST</bcp14> have a corresponding
packet number at the same index.</t>
        <t>For example, an instance of the <tt>frames_parsed</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, such as the packet's encryption
level. Use cases that need such information are better served by those events.</t>
        <t>Extensions can use frame-related events to log information that is not
available when a packet event is logged, for example because frame processing
was deferred.</t>
        <section anchor="quic-framescreated">
          <name>frames_created</name>
          <t>The <tt>frames_created</tt> event indicates that a set of QUIC frames was 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 that a set of QUIC frames was 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>
      <section anchor="quic-streamdatamoved">
        <name>stream_data_moved</name>
        <t>The <tt>stream_data_moved</tt> event indicates that QUIC stream data moved between
layers. It has Base importance level.</t>
        <t>For example, data can move from an application protocol such as HTTP/3 to QUIC
stream buffers, or the other way. Logging these moves can show the flow of
data, how long data stays in each buffer, and the overhead introduced by each
layer.</t>
        <t>This event can also show whether received stream data is passed to the
application protocol immediately or in batches. Data can be passed, for
example, once per received packet, or in a batch after all received packets
are processed. This can help identify bottlenecks, flow control issues, or
scheduling problems.</t>
        <t>The <tt>raw.length</tt> field gives the number of bytes moved. Because this event
covers stream data only, there are no packet or frame headers, and
<tt>raw.length</tt> <bcp14>MUST</bcp14> reflect that.</t>
        <t>The <tt>additional_info</tt> field can log information about the stream state. For
example, an application that moves data into the transport and ends the stream
at the same time can log "fin_set". A transport that has received an
instruction to reset a stream can tell the application with "stream_reset". In
both cases, <tt>raw.length</tt> can be omitted or be zero.</t>
        <t>This event covers only data in QUIC streams. For data in QUIC datagrams, see
the <tt>datagram_data_moved</tt> event (<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 indicates that QUIC datagram data (see
<xref target="QUIC-DATAGRAM"/>) moved between layers. It has Base importance level.</t>
        <t>For example, data can move from an application protocol such as WebTransport to
QUIC buffers, or the other way. Logging these moves can show the flow of data,
how long data stays in each buffer, and the overhead introduced by each layer.</t>
        <t>This event can also show whether received datagram data is passed to the
application protocol immediately or in batches. Data can be passed, for
example, once per received packet, or in a batch after all received packets
are processed. This can help identify bottlenecks or scheduling problems.</t>
        <t>The <tt>raw.length</tt> field gives the number of bytes moved. Because this event
covers datagram data only, there are no packet or frame headers, and
<tt>raw.length</tt> <bcp14>MUST</bcp14> reflect that.</t>
        <t>This event covers only data in QUIC datagrams. For data in QUIC streams, see
the <tt>stream_data_moved</tt> event (<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-datagramdropped">
        <name>datagram_dropped</name>
        <t>The <tt>datagram_dropped</tt> event indicates that QUIC DATAGRAM data (see
<xref target="RFC9221"/>) was discarded locally, before sending or after reception. It has
Base importance level.</t>
        <t>The <tt>direction</tt> field identifies the sending or receiving side, and <tt>trigger</tt>
indicates the reason for discarding the data. The <tt>raw.length</tt> field <bcp14>MUST</bcp14> count
discarded payload bytes, excluding packet and frame headers.</t>
        <t>Received DATAGRAM data can be discarded while its packet is still acknowledged.
For drops of entire QUIC packets, use <tt>packet_dropped</tt> (<xref target="quic-packetdropped"/>).</t>
        <figure anchor="quic-datagramdropped-def">
          <name>QUICDatagramDropped definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICDatagramDropped = {
    ? direction: "sending" /
                 "receiving"
    ? raw: RawInfo
    ? trigger:
        ; insufficient space in a send or receive buffer
        "buffer_full" /
        ; datagram data exceeds the maximum payload size
        "too_large" /
        text

    * $$quic-datagramdropped-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="quic-connectiondatablockedupdated">
        <name>connection_data_blocked_updated</name>
        <t>The <tt>connection_data_blocked_updated</tt> event indicates that the QUIC connection
became blocked or unblocked for sending data. It has Extra importance level.</t>
        <t>Depending on the reason, a blocked connection cannot send stream data, datagram
data, or both, until that reason is resolved. The <tt>stream_data_blocked_updated</tt>
and <tt>datagram_data_blocked_updated</tt> events give more detail for each type of
data.</t>
        <figure anchor="quic-connectiondatablockedupdated-def">
          <name>QUICConnectionDataBlockedUpdated definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICConnectionDataBlockedUpdated = {
    ? old: $BlockedState
    new: $BlockedState

    ? reason: $BlockedReason

    * $$quic-connectiondatablockedupdated-extension
}

$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 indicates that a QUIC stream became
blocked or unblocked for sending. It 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

    * $$quic-streamdatablockedupdated-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="quic-datagramdatablockedupdated">
        <name>datagram_data_blocked_updated</name>
        <t>The <tt>datagram_data_blocked_updated</tt> event indicates that QUIC datagrams became
blocked or unblocked for sending. It 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

    * $$quic-datagramdatablockedupdated-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="quic-migrationstateupdated">
        <name>migration_state_updated</name>
        <t>The <tt>migration_state_updated</tt> event logs the progress of a connection migration
by a client; see <xref section="9" sectionFormat="of" target="QUIC-TRANSPORT"/>. It has Extra importance level.</t>
        <t>Most details of a migration can be inferred from PATH_CHALLENGE and
PATH_RESPONSE frames, together with <tt>tuple_assigned</tt> events. However, it can
be useful to log the progress of the migration, and any decisions made, in a
single event.</t>
        <t>The MigrationState values follow the steps in <xref section="9" sectionFormat="of" target="QUIC-TRANSPORT"/>:
the <tt>probing_*</tt> values cover probing a new path (<xref section="9.1" sectionFormat="of" target="QUIC-TRANSPORT"/>), and the <tt>migration_*</tt> values cover migrating the connection
(<xref section="9.2" sectionFormat="of" target="QUIC-TRANSPORT"/>).</t>
        <t>Implementations that log per-path information in <tt>migration_state_updated</tt>
events <bcp14>SHOULD</bcp14> also emit <tt>tuple_assigned</tt> events, to serve as the ground truth
for tuple information.</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 <tt>event_type</tt> field takes one of three values:</t>
        <ul spacing="normal">
          <li>"set": the timer is set, and <tt>delta</tt> gives the time until it triggers</li>
          <li>"expired": the timer expired</li>
          <li>"cancelled": the timer was cancelled</li>
        </ul>
        <t>An update to an active timer's timeout is logged as a new "set" event.</t>
        <t>The recovery timer types correspond to timers in <xref section="6" sectionFormat="of" target="QUIC-RECOVERY"/> and <xref section="A.8" sectionFormat="of" target="QUIC-RECOVERY"/>:</t>
        <ul spacing="normal">
          <li>"ack": the time threshold loss detection timeout</li>
          <li>"pto": the probe timeout</li>
          <li>"loss_timeout": the single, multi-modal loss detection timer that covers
both</li>
        </ul>
        <t>QUIC uses a variety of timers, and how they are used can depend on the
implementation. Implementers can add fields to this event through
<tt>$$quic-timerupdated-extension</tt>, or add timer types through <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 indicates that a key was installed or updated. It has
Base importance level.</t>
        <t>This happens when TLS provides new keys during the handshake, and at each 1-RTT
key update; see <xref section="6" sectionFormat="of" target="QUIC-TLS"/>.</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>The <tt>key_phase</tt> field holds the full key phase, which identifies the
generation of keys; it corresponds to @M and @N in Figure 9 of <xref section="6" sectionFormat="of" target="QUIC-TLS"/>. The Key Phase bit in the packet header is the least significant
bit of this value.</t>
      </section>
      <section anchor="quic-keydiscarded">
        <name>key_discarded</name>
        <t>The <tt>key_discarded</tt> event indicates that a key was discarded. It has Base
importance level.</t>
        <t>Keys are discarded, for example, when the connection moves to a new encryption
level during the handshake, or after a key update; see <xref section="4.9" sectionFormat="of" target="QUIC-TLS"/>.</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 section are kept generic to support different
recovery approaches and congestion control algorithms. The <tt>old</tt>, <tt>new</tt>, and
<tt>trigger</tt> fields of <tt>congestion_state_updated</tt>, for instance, are free text, so
their values depend on the algorithm.</t>
      <t>Tools that process these events <bcp14>SHOULD</bcp14> try to handle such values even when they
don't recognize them. For example, a tool that plots congestion states on a
timeline can label an unknown state with the value of the <tt>new</tt> field.</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>These parameters are typically set once and never change. Implementations that
change them during the connection <bcp14>MAY</bcp14> emit the <tt>recovery_parameters_set</tt> event
more than once.</t>
        <t>The <tt>reordering_threshold</tt> field contains the packet threshold for loss detection,
or "disabled" if packet-threshold loss detection is disabled.</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 / "disabled"

    ; 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>Parameters that this document does not define, such as those of other loss
detection and recovery algorithms, can be added through
<tt>$$quic-recoveryparametersset-extension</tt>.</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 change value. It has Core importance level.</t>
        <t>Implementations <bcp14>SHOULD</bcp14> group all metric updates that happen at or around the
same time into a single <tt>recovery_metrics_updated</tt> event. For example, if
<tt>min_rtt</tt> and <tt>smoothed_rtt</tt> change at the same time, they are logged in one
event, not two. Each 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>To make logging easier, implementations <bcp14>MAY</bcp14> log values that are the same as
previously reported values; for example, two consecutive
<tt>recovery_metrics_updated</tt> events can report the same <tt>min_rtt</tt>. However,
implementations <bcp14>SHOULD</bcp14> try to log only values that changed.</t>
        <t>Metrics that this document does not define, such as those of other loss
detection and recovery algorithms, can be added through
<tt>$$quic-recoverymetricsupdated-extension</tt>.</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 new state that changes its behavior. It has Base importance level.</t>
        <t>This document does not define values for the event's fields. Congestion
control algorithms have different states and different causes for moving
between them, and stacks can implement the same algorithm differently. For
example, the NewReno controller in <xref section="7.3" sectionFormat="of" target="QUIC-RECOVERY"/> has three
states: slow start, recovery, and congestion avoidance.</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 a state change can have more than one
cause. For example, NewReno enters recovery when it detects packet loss or
when the ECN-CE count increases, so the <tt>trigger</tt> field shows which of the two
caused the change.</t>
      </section>
      <section anchor="quic-packetlost">
        <name>packet_lost</name>
        <t>The <tt>packet_lost</tt> event is emitted when loss detection declares a packet lost.
It has Core importance level.</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

    ? frames: [* $QuicFrame]
    ? is_mtu_probe_packet: bool
    ? trigger:
        "reordering_threshold" /
        "time_threshold" /
        "pto_expired"

    * $$quic-packetlost-extension
}
]]></sourcecode>
        </figure>
        <t>The <tt>frames</tt> field lists the frames that the lost packet carried. It is
optional, because not all implementations keep sent packets in full. The data
that is then marked for retransmission can be logged with the
<tt>marked_for_retransmit</tt> event (<xref target="quic-markedforretransmit"/>).</t>
        <t>The <tt>is_mtu_probe_packet</tt> field marks a packet that was sent as a Path MTU
probe. The loss of such a packet is not a reliable sign of congestion; see
<xref section="14.4" sectionFormat="of" target="QUIC-TRANSPORT"/>. It defaults to false.</t>
        <t>The <tt>trigger</tt> field <bcp14>SHOULD</bcp14> be logged. Its value shows how loss detection
declared the packet lost:</t>
        <ul spacing="normal">
          <li>
            <tt>reordering_threshold</tt>: the packet threshold was exceeded; see <xref section="6.1.1" sectionFormat="of" target="QUIC-RECOVERY"/>.</li>
          <li>
            <tt>time_threshold</tt>: the time threshold was exceeded; see <xref section="6.1.2" sectionFormat="of" target="QUIC-RECOVERY"/>.</li>
          <li>
            <tt>pto_expired</tt>: the probe timeout expired, and the sender declared the packet
lost instead of sending a probe; see <xref section="6.2.4" sectionFormat="of" target="QUIC-RECOVERY"/>.</li>
        </ul>
      </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 after packet loss was detected. It has Extra importance level.</t>
        <t>This single event covers all types of retransmittable data, which it logs using
the existing QUIC frame definitions.</t>
        <t>A <tt>packet_lost</tt> event (<xref target="quic-packetlost"/>) records that a packet was declared
lost, and can list the frames it carried. A <tt>marked_for_retransmit</tt> event
records what the implementation then marks for retransmission. The two can
differ, because not every frame is retransmitted (ACK and PADDING frames never
are), and retransmitted data need not be sent in the same frames; see
<xref section="13.3" sectionFormat="of" target="QUIC-TRANSPORT"/>.</t>
        <t>An implementation that retransmits the frames of a lost packet unchanged can
log them here, or skip this event and use the frames in the <tt>packet_lost</tt> event
instead. An implementation with more complex logic, such as one that marks
ranges of a stream's send buffer as in flight, or one that does not keep sent
frames in full, can log frames that describe the data it marked for
retransmission. These frames need not match any frame that was sent or will be
sent.</t>
        <t>If an implementation logs <tt>packet_sent</tt> events, tools can infer much of this
data from them. For example, overlapping stream offsets and lengths show 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
    ? trigger: text

    * $$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>
        <t>The <tt>trigger</tt> field can be used to log why the state changed, for example which
ECN validation check in <xref section="13.4.2" sectionFormat="of" target="QUIC-TRANSPORT"/> failed.</t>
      </section>
    </section>
    <section anchor="quic-data-types">
      <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="ipaddressport">
        <name>IPAddressPort</name>
        <figure anchor="ipaddressport-def">
          <name>IPAddressPort definition</name>
          <sourcecode type="cddl"><![CDATA[
; an IP address 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, the IP address and port pair can be logged as an
; application-defined redacted string for privacy or security reasons.
IPAddressPort = {
    ip: text / hexstring
    port: uint16
} / text
]]></sourcecode>
        </figure>
      </section>
      <section anchor="tupleendpointinfo">
        <name>TupleEndpointInfo</name>
        <t>TupleEndpointInfo describes one half, or direction, of a four-tuple. A full
tuple has two halves: the server sends to the client's IP address and port,
and the client sends to the server's IP address and port. Each direction uses
its own destination connection ID.</t>
        <t>Structures that log tuple information <bcp14>SHOULD</bcp14> therefore include two
TupleEndpointInfo instances, one for each half of the tuple.</t>
        <figure anchor="tupleendpointinfo-def">
          <name>TupleEndpointInfo definition</name>
          <sourcecode type="cddl"><![CDATA[
TupleEndpointInfo = {
    ? address_v4: IPAddressPort
    ? address_v6: IPAddressPort

    ; 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 a packet type has no known <tt>$PacketType</tt> string, <tt>packet_type</tt> can be
"unknown", and <tt>packet_type_bytes</tt> then holds the numerical value without
variable-length integer encoding.</t>
        <t>PacketHeader omits the fixed bit and the reserved bits because QUIC version 1
gives them fixed values; see <xref section="17" sectionFormat="of" target="QUIC-TRANSPORT"/>. Their values can
be logged in the <tt>raw.data</tt> field of the event that logs the PacketHeader.</t>
        <t>QUIC extensions that use these bits, such as the QUIC Bit greasing extension
(<xref target="GREASEBIT"/>), can log that use with new events, similar to
<tt>spin_bit_updated</tt>, or with fields added to PacketHeader through
<tt>$$quic-packetheader-extension</tt>.</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 present in the header.
    ; if correctly using 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 is either a token from a Retry packet,
or one that the server provided earlier in a NEW_TOKEN frame, for address
validation in a later connection; see <xref section="8.1.3" sectionFormat="of" target="QUIC-TRANSPORT"/>.
Both kinds typically encode metadata that the server uses to check the token,
but the metadata and its format are implementation-specific. The <tt>details</tt>
field can log that metadata.</t>
      </section>
      <section anchor="statelessresettoken">
        <name>StatelessResetToken</name>
        <figure anchor="stateless-reset-token-def">
          <name>StatelessResetToken definition</name>
          <sourcecode type="cddl"><![CDATA[
; always 16 bytes
StatelessResetToken = hexstring
]]></sourcecode>
        </figure>
        <t>The stateless reset token is defined in <xref section="10.3" sectionFormat="of" target="QUIC-TRANSPORT"/>.</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>
        <t>ECN holds the ECN codepoint carried in the IP header; see <xref section="13.4" sectionFormat="of" target="QUIC-TRANSPORT"/>.</t>
        <figure anchor="ecn-def">
          <name>ECN definition</name>
          <sourcecode type="cddl"><![CDATA[
ECN = "Not-ECT" / "ECT(1)" / "ECT(0)" / "CE"
]]></sourcecode>
        </figure>
      </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>A PADDING frame is a single byte with the value 0, so each padding byte is its
own frame; see <xref section="19.1" sectionFormat="of" target="QUIC-TRANSPORT"/>. Logging each one as a
separate PaddingFrame could add hundreds of entries to a single packet event,
for example when a client pads an Initial packet to 1200 bytes. Implementations
<bcp14>SHOULD</bcp14> instead log a single PaddingFrame for the packet, and set its
<tt>raw.payload_length</tt> field to the number of PADDING frames 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>The ranges in <tt>acked_ranges</tt> do not have to be in order; for example,
<tt>[[5,9],[1,4]]</tt> is valid.</t>
          <t>The two numbers in a range can be equal; for example, <tt>[120,120]</tt> means that
packet 120 was acknowledged. In that case, implementations <bcp14>SHOULD</bcp14> log <tt>[120]</tt>
instead, and tools <bcp14>MUST</bcp14> handle both forms.</t>
        </section>
        <section anchor="resetstreamframe">
          <name>ResetStreamFrame</name>
          <t>If an error code has no known ApplicationError string, <tt>error</tt> can be
"unknown", and <tt>error_code</tt> then holds the 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>The RESET_STREAM_AT frame is defined in <xref section="4" sectionFormat="of" target="RESET-STREAM-AT"/>.</t>
          <t>If an error code has no known ApplicationError string, <tt>error</tt> can be
"unknown", and <tt>error_code</tt> then holds the 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 an error code has no known ApplicationError string, <tt>error</tt> can be
"unknown", and <tt>error_code</tt> then holds the 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>
          <t>The <tt>offset</tt> field defaults to 0, and the <tt>fin</tt> field defaults to false.</t>
          <figure anchor="streamframe-def">
            <name>StreamFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
StreamFrame = {
    frame_type: "stream"
    stream_id: uint64
    ? offset: uint64
    ? fin: bool
    ? 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 8 bytes
  ? 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 8 bytes
  ? data: hexstring
  ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="connectioncloseframe">
          <name>ConnectionCloseFrame</name>
          <t>If an error code has no known string, <tt>error</tt> can be "unknown", and
<tt>error_code</tt> then holds the numerical value without variable-length integer
encoding.</t>
          <t>The <tt>trigger_frame_type</tt> field logs the Frame Type field, which only the
transport variant of CONNECTION_CLOSE (type 0x1c) carries; see <xref section="19.19" sectionFormat="of" target="QUIC-TRANSPORT"/>. A known frame type is logged as its frame type string,
such as "stream". An unknown frame type is logged as the numerical value
without variable-length integer encoding.</t>
          <t>The reason phrase in a CONNECTION_CLOSE frame is a byte sequence, which RFC
9000 recommends be UTF-8; see <xref section="19.19" sectionFormat="of" target="QUIC-TRANSPORT"/>. The <tt>reason</tt>
field holds the reason phrase as text, and <tt>reason_bytes</tt> holds the raw bytes,
for example 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 form and <bcp14>MAY</bcp14> log both.</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 <tt>frame_type_bytes</tt> field holds the numerical value of the frame type
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="QUIC-DATAGRAM"/>.</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>
      <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>Application errors are defined by the application protocol that runs on top of
QUIC, such as HTTP/3, so this document cannot list them. <tt>$ApplicationError</tt> 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>Event schemas for application protocols <bcp14>MUST</bcp14> add their error strings by
extending the <tt>$ApplicationError</tt> socket; see <xref section="8.2" sectionFormat="of" target="QLOG-MAIN"/>.</t>
      </section>
      <section anchor="cryptoerror">
        <name>CryptoError</name>
        <t>RFC 9001 converts a TLS alert into a QUIC error code by adding the alert's
AlertDescription value to 0x0100; see <xref section="4.8" sectionFormat="of" target="QUIC-TLS"/>.</t>
        <t>A fixed list of strings does not fit this range well, so a CryptoError value
is <tt>crypto_error_</tt> followed by the resulting QUIC error code in lowercase
hexadecimal, from <tt>crypto_error_0x100</tt> to <tt>crypto_error_0x1ff</tt>. For example, a
handshake_failure alert, which is 0x0128 in QUIC, is logged as
<tt>crypto_error_0x128</tt>.</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 anchor="packet-coalescing">
      <name>Handling Packet Coalescing</name>
      <t>Multiple QUIC packets can be coalesced into a single UDP datagram, especially
during the handshake; see <xref section="12.2" sectionFormat="of" target="QUIC-TRANSPORT"/>. Neither QUIC nor
UDP provides a way to tell which packets shared a datagram.</t>
      <t>To let tools match QUIC packet events to UDP datagram events, the optional
<tt>datagram_payload_checksum</tt> field carries a 32-bit CRC32c of the UDP payload,
calculated as described in <xref section="11.3" sectionFormat="of" target="RFC9868"/>. The UDP datagram
events carry one checksum per datagram, in their <tt>datagram_payload_checksums</tt>
field.</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,
which was 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,
stream_data_moved,
datagram_data_moved,
datagram_dropped,
connection_data_blocked_updated,
stream_data_blocked_updated,
datagram_data_blocked_updated,
migration_state_updated,
timer_updated,
key_updated,
key_discarded,
recovery_parameters_set,
recovery_metrics_updated,
congestion_state_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="6" month="July" year="2026"/>
            <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-14"/>
        </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="RESET-STREAM-AT">
          <front>
            <title>QUIC Stream Resets with Partial Delivery</title>
            <author fullname="Marten Seemann" initials="M." surname="Seemann">
         </author>
            <author fullname="Kazuho Oku" initials="K." surname="Oku">
              <organization>Fastly</organization>
            </author>
            <date day="6" month="September" year="2026"/>
            <abstract>
              <t>   QUIC defines a RESET_STREAM frame to abort sending on a stream.  When
   a sender resets a stream, it also stops retransmitting STREAM frames
   for this stream in the event of packet loss.  On the receiving side,
   there is no guarantee that any data sent on that stream is delivered.

   This document defines a new QUIC frame, the RESET_STREAM_AT frame,
   that allows resetting a stream, while guaranteeing delivery of stream
   data up to a certain byte offset.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-quic-reliable-stream-reset-11"/>
        </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>
        <reference anchor="RFC9868">
          <front>
            <title>Transport Options for UDP</title>
            <author fullname="J. Touch" initials="J." surname="Touch"/>
            <author fullname="C. Heard" initials="C." role="editor" surname="Heard"/>
            <date month="October" year="2025"/>
            <abstract>
              <t>Transport protocols are extended through the use of transport header options. This document updates RFC 768 (UDP) by indicating the location, syntax, and semantics for UDP transport layer options within the surplus area after the end of the UDP user data but before the end of the IP datagram.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9868"/>
          <seriesInfo name="DOI" value="10.17487/RFC9868"/>
        </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-13">
        <name>Since draft-ietf-qlog-quic-events-13:</name>
        <ul spacing="normal">
          <li>Added datagram_dropped (#550)</li>
          <li>Wide range of editorial and consistency changes</li>
        </ul>
      </section>
      <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:
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

-->

</rfc>
