<?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-11" 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-11"/>
    <author initials="R." surname="Marx" fullname="Robin Marx" role="editor">
      <organization>Akamai</organization>
      <address>
        <email>rmarx@akamai.com</email>
      </address>
    </author>
    <author initials="L." surname="Niccolini" fullname="Luca Niccolini" role="editor">
      <organization>Meta</organization>
      <address>
        <email>lniccolini@meta.com</email>
      </address>
    </author>
    <author initials="M." surname="Seemann" fullname="Marten Seemann" role="editor">
      <organization/>
      <address>
        <email>martenseemann@gmail.com</email>
      </address>
    </author>
    <author initials="L." surname="Pardue" fullname="Lucas Pardue" role="editor">
      <organization>Cloudflare</organization>
      <address>
        <email>lucas@lucaspardue.com</email>
      </address>
    </author>
    <date year="2025" month="July" day="07"/>
    <area>Transport</area>
    <workgroup>QUIC</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>This document describes a qlog event schema containing concrete qlog event
definitions and their metadata for the core QUIC protocol and selected
extensions.</t>
    </abstract>
    <note>
      <name>Note to Readers</name>
      <ul empty="true">
        <li>
          <t>Note to RFC editor: Please remove this section before publication.</t>
        </li>
      </ul>
      <t>Feedback and discussion are welcome at
<eref target="https://github.com/quicwg/qlog">https://github.com/quicwg/qlog</eref>. Readers are
advised to refer to the "editor's draft" at that URL for an up-to-date version
of this document.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>This document defines a qlog event schema (<xref section="8" sectionFormat="of" target="QLOG-MAIN"/>)
containing concrete events for the core QUIC protocol (see
<xref target="QUIC-TRANSPORT"/>, <xref target="QUIC-RECOVERY"/>, and
<xref target="QUIC-TLS"/>) and some of its extensions (see
<xref target="QUIC-DATAGRAM"/> and <xref target="GREASEBIT"/>).</t>
      <t>The event namespace with identifier <tt>quic</tt> is defined; see <xref target="schema-def"/>. In
this namespace multiple events derive from the qlog abstract Event class
(<xref section="7" sectionFormat="of" target="QLOG-MAIN"/>), each extending the "data" field and defining their
"name" field values and semantics. Some event data fields use complex data
types. These are represented as enums or re-usable definitions, which are
grouped together on the bottom of this document for clarity.</t>
      <section anchor="use-of-group-ids">
        <name>Use of group IDs</name>
        <t>When the qlog <tt>group_id</tt> field is used, it is recommended to use QUIC's Original
Destination Connection ID (ODCID, the CID chosen by the client when first
contacting the server), as this is the only value that does not change over the
course of the connection and can be used to link more advanced QUIC packets (e.g.,
Retry, Version Negotiation) to a given connection. Similarly, the ODCID should be
used as the qlog filename or file identifier, potentially suffixed by the
vantagepoint type (For example, abcd1234_server.qlog would contain the server-side
trace of the connection with ODCID abcd1234).</t>
      </section>
      <section anchor="raw-packet-and-frame-information">
        <name>Raw packet and frame information</name>
        <t>QUIC packets always include an AEAD authentication tag at the end. In general,
the length of the AEAD tag depends on the TLS cipher suite, although all cipher
suites used in QUIC v1 use a 16 byte tag. For the purposes of calculating the
lengths in fields of type RawInfo (as defined in <xref target="QLOG-MAIN"/>) related to QUIC
packets, the AEAD tag is regarded as a trailer.</t>
      </section>
      <section anchor="handling-unknown-connections">
        <name>Events not belonging to a single connection</name>
        <t>A single qlog event trace is typically associated with a single QUIC connection.
However, for several types of events (for example, a <xref target="quic-packetdropped"/>
event with trigger value of <tt>connection_unknown</tt>), it can be impossible to tie
them to a specific QUIC connection, especially on the server.</t>
        <t>There are various ways to handle these events, each making certain tradeoffs
between file size overhead, flexibility, ease of use, or ease of
implementation. Some options include:</t>
        <ul spacing="normal">
          <li>Log them in a separate endpoint-wide trace (or use a special <tt>group_id</tt> value)
not associated with a single connection.</li>
          <li>Log them in the most recently used trace.</li>
          <li>Use additional heuristics for connection identification (for example use the
four-tuple in addition to the Connection ID).</li>
          <li>Buffer events until they can be assigned to a connection (for example for
version negotiation and retry events).</li>
        </ul>
      </section>
      <section anchor="notational-conventions">
        <name>Notational Conventions</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <t>The event and data structure definitions in ths document are expressed
in the Concise Data Definition Language <xref target="CDDL"/> and its
extensions described in <xref target="QLOG-MAIN"/>.</t>
        <t>The following fields from <xref target="QLOG-MAIN"/> are imported and used: name, namespace,
type, data, group_id, RawInfo, and time-related
fields.</t>
        <t>Events are defined with an importance level as described in <xref section="8.3" sectionFormat="of" target="QLOG-MAIN"/>.</t>
        <t>As is the case for <xref target="QLOG-MAIN"/>, the qlog schema definitions in this document
are intentionally agnostic to serialization formats. The choice of format is an
implementation decision.</t>
      </section>
    </section>
    <section anchor="schema-def">
      <name>Event Schema Definition</name>
      <t>This document describes how the core QUIC protocol and selected extensions can
be expressed in qlog using a newly defined event schema. Per the requirements in
<xref section="8" sectionFormat="of" target="QLOG-MAIN"/>, this document registers the <tt>quic</tt> namespace. The
event schema URI is <tt>urn:ietf:params:qlog:events:quic</tt>.</t>
      <section removeInRFC="true" anchor="draft-event-schema-identification">
        <name>Draft Event Schema Identification</name>
        <t>Only implementations of the final, published RFC can use the events belonging to
the event schema with the URI <tt>urn:ietf:params:qlog:events:quic</tt>. Until such an
RFC exists, implementations <bcp14>MUST NOT</bcp14> identify themselves using this URI.</t>
        <t>Implementations of draft versions of the event schema <bcp14>MUST</bcp14> append the string
"-" and the corresponding draft number to the URI. For example, draft 07 of this
document is identified using the URI <tt>urn:ietf:params:qlog:events:quic-07</tt>.</t>
        <t>The namespace identifier itself is not affected by this requirement.</t>
      </section>
    </section>
    <section anchor="quic-event-overview">
      <name>QUIC Event Overview</name>
      <t><xref target="quic-events"/> summarizes the name value of each event type that is defined in
this specification.</t>
      <table anchor="quic-events">
        <name>QUIC Events</name>
        <thead>
          <tr>
            <th align="left">Name value</th>
            <th align="left">Importance</th>
            <th align="left">Definition</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">quic:server_listening</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-serverlistening"/></td>
          </tr>
          <tr>
            <td align="left">quic:connection_started</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-connectionstarted"/></td>
          </tr>
          <tr>
            <td align="left">quic:connection_closed</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-connectionclosed"/></td>
          </tr>
          <tr>
            <td align="left">quic:connection_id_updated</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-connectionidupdated"/></td>
          </tr>
          <tr>
            <td align="left">quic:spin_bit_updated</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-spinbitupdated"/></td>
          </tr>
          <tr>
            <td align="left">quic:connection_state_updated</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-connectionstateupdated"/></td>
          </tr>
          <tr>
            <td align="left">quic:path_assigned</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-pathassigned"/></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_processed</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-framesprocessed"/></td>
          </tr>
          <tr>
            <td align="left">quic:stream_data_moved</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-streamdatamoved"/></td>
          </tr>
          <tr>
            <td align="left">quic:datagram_data_moved</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-datagramdatamoved"/></td>
          </tr>
          <tr>
            <td align="left">quic:connection_data_blocked_updated</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-connectiondatablockedupdated"/></td>
          </tr>
          <tr>
            <td align="left">quic:stream_data_blocked_updated</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-streamdatablockedupdated"/></td>
          </tr>
          <tr>
            <td align="left">quic:datagram_data_blocked_updated</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-datagramdatablockedupdated"/></td>
          </tr>
          <tr>
            <td align="left">quic:migration_state_updated</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-migrationstateupdated"/></td>
          </tr>
          <tr>
            <td align="left">quic: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:loss_timer_updated</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-losstimerupdated"/></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 target="QLOG-MAIN"/>. Additionally, they allow for direct extensibility by their use of
per-event extension points via the <tt>$$</tt> CDDL "group socket" syntax, as also
described in <xref target="QLOG-MAIN"/>.</t>
      <figure anchor="quicevent-data-def">
        <name>QuicEventData definition and ProtocolEventData extension</name>
        <sourcecode type="cddl"><![CDATA[
QuicEventData = QUICServerListening /
                QUICConnectionStarted /
                QUICConnectionClosed /
                QUICConnectionIDUpdated /
                QUICSpinBitUpdated /
                QUICConnectionStateUpdated /
                QUICPathAssigned /
                QUICMTUUpdated /
                QUICVersionInformation /
                QUICALPNInformation /
                QUICParametersSet /
                QUICParametersRestored /
                QUICPacketSent /
                QUICPacketReceived /
                QUICPacketDropped /
                QUICPacketBuffered /
                QUICPacketsAcked /
                QUICUDPDatagramsSent /
                QUICUDPDatagramsReceived /
                QUICUDPDatagramDropped /
                QUICStreamStateUpdated /
                QUICFramesProcessed /
                QUICStreamDataMoved /
                QUICDatagramDataMoved /
                QUICConnectionDataBlockedUpdated /
                QUICStreamDataBlockedUpdated /
                QUICDatagramDataBlockedUpdated /
                QUICMigrationStateUpdated /
                QUICKeyUpdated /
                QUICKeyDiscarded /
                QUICRecoveryParametersSet /
                QUICRecoveryMetricsUpdated /
                QUICCongestionStateUpdated /
                QUICLossTimerUpdated /
                QUICPacketLost /
                QUICMarkedForRetransmit /
                QUICECNStateUpdated

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

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

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

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

    ; which side closed the connection
    ? owner: Owner
    ? connection_code: $TransportError /
                       CryptoError
    ? application_code: $ApplicationError

    ; if connection_code or application_code === "unknown"
    ? code_bytes: uint32

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

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

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

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

    * $$quic-connectionstateupdated-extension
}

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

    ; Handshake packet sent/received
    "handshake_started" /

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

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

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

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

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

    ; CONNECTION_CLOSE sent
    "closing" /

    ; CONNECTION_CLOSE received
    "draining" /

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

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

    ; the information for traffic going towards the remote receiver
    ? path_remote: PathEndpointInfo

    ; the information for traffic coming in at the local endpoint
    ? path_local: PathEndpointInfo

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

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

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

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

    * $$quic-alpninformation-extension
}

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

    ; 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: uint32
    ? ack_delay_exponent: uint16
    ? max_ack_delay: uint16
    ? active_connection_id_limit: uint32
    ? initial_max_data: uint64
    ? initial_max_stream_data_bidi_local: uint64
    ? initial_max_stream_data_bidi_remote: uint64
    ? initial_max_stream_data_uni: uint64
    ? initial_max_streams_bidi: uint64
    ? initial_max_streams_uni: uint64
    ? preferred_address: PreferredAddress
    ? unknown_parameters: [* UnknownParameter]

    ; RFC9221
    ? max_datagram_frame_size: uint64

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

    * $$quic-parametersset-extension
}

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

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

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

    ; RFC9221
    ? max_datagram_frame_size: uint64

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    ; to support passing multiple at once
    ? count: uint16

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

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

    ? datagram_ids: [+ uint32]

    * $$quic-udpdatagramssent-extension
}
]]></sourcecode>
        </figure>
        <t>Since QUIC implementations rarely control UDP logic directly, the raw data
excludes UDP-level headers in all RawInfo fields.</t>
        <t>Multiple QUIC packets can be coalesced in a single UDP datagram, especially
during the handshake (see <xref section="12.2" sectionFormat="of" target="QUIC-TRANSPORT"/>). However, neither
QUIC nor UDP themselves provide an explicit mechanism to track this behaviour.
To make it possible for implementations to track coalescing across packet-level
and datagram-level qlog events, this document defines a qlog-specific mechanism
for tracking coalescing across packet-level and datagram-level qlog events: a
"datagram identifier" carried in <tt>datagram_id</tt> fields. qlog implementations that
want to track coalescing can use this mechanism, where multiple events sharing
the same <tt>datagram_id</tt> indicate they were coalesced in the same UDP datagram.
The selection of specific and locally-unique <tt>datagram_id</tt> values is an
implementation choice.</t>
      </section>
      <section anchor="quic-udpdatagramsreceived">
        <name>udp_datagrams_received</name>
        <t>When one or more UDP-level datagrams are received from the socket. This is
useful for determining how datagrams are passed to the user space stack from the
OS. The event has Extra importance level.</t>
        <figure anchor="quic-udpdatagramsreceived-def">
          <name>QUICUDPDatagramsReceived definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICUDPDatagramsReceived = {

    ; to support passing multiple at once
    ? count: uint16

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

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

    ? datagram_ids: [+ uint32]

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

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

    * $$quic-udpdatagramdropped-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="quic-streamstateupdated">
        <name>stream_state_updated</name>
        <t>The <tt>stream_state_updated</tt> event is emitted whenever the internal state of a
QUIC stream is updated; see <xref section="3" sectionFormat="of" target="QUIC-TRANSPORT"/>. Most of this can be
inferred from several types of frames going over the wire, but it's much easier
to have explicit signals for these state changes. The event has Base importance
level.</t>
        <figure anchor="quic-streamstateupdated-def">
          <name>QUICStreamStateUpdated definition</name>
          <sourcecode type="cddl"><![CDATA[
StreamType = "unidirectional" /
             "bidirectional"

QUICStreamStateUpdated = {
    stream_id: uint64

    ; mainly useful when opening the stream
    ? stream_type: StreamType
    ? old: $StreamState
    new: $StreamState
    ? stream_side: "sending" /
                   "receiving"

    * $$quic-streamstateupdated-extension
}

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

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

$StreamState /= BaseStreamStates / GranularStreamStates
]]></sourcecode>
        </figure>
        <t>QUIC implementations <bcp14>SHOULD</bcp14> mainly log the simplified (HTTP/2-alike)
BaseStreamStates instead of the more fine-grained GranularStreamStates. These
latter ones are mainly for more in-depth debugging. Tools <bcp14>SHOULD</bcp14> be able to deal
with both types equally.</t>
      </section>
      <section anchor="quic-framesprocessed">
        <name>frames_processed</name>
        <t>The <tt>frame_processed</tt> event is intended to prevent a large proliferation of
specific purpose events (e.g., <tt>packets_acknowledged</tt>, <tt>flow_control_updated</tt>,
<tt>stream_data_received</tt>). It has Extra importance level.</t>
        <t>Implementations have the opportunity to (selectively) log this type of
signal without having to log packet-level details (e.g., in <tt>packet_received</tt>).
Since for almost all cases, the effects of applying a frame to the internal state
of an implementation can be inferred from that frame's contents, these events
are aggregated into this single <tt>frames_processed</tt> event.</t>
        <t>The <tt>frame_processed</tt> event can be used to signal internal state change not
resulting directly from the actual "parsing" of a frame (e.g., the frame could
have been parsed, data put into a buffer, then later processed, then logged with
this event).</t>
        <t>The <tt>packet_received</tt> event can convey all constituent frames. It is not
expected that the <tt>frames_processed</tt> event will also be used for a redundant
purpose. Rather, implementations can use this event to avoid having to log full
packets or to convey extra information about when frames are processed (for
example, if frame processing is deferred for any reason).</t>
        <t>Note that for some events, this approach will lose some information (e.g., for which
encryption level are packets being acknowledged?). If this information is
important, the <tt>packet_received</tt> event can be used instead.</t>
        <t>In some implementations, it can be difficult to log frames directly, even when
using <tt>packet_sent</tt> and <tt>packet_received</tt> events. For these cases, the
<tt>frames_processed</tt> event also contains the <tt>packet_numbers</tt> field, which can be
used to more explicitly link this event to the <tt>packet_sent</tt>/<tt>received events</tt>.
The field is an array, which supports using a single <tt>frames_processed</tt> event
for multiple frames received over multiple packets. To map between frames and
packets, the position and order of entries in the <tt>frames</tt> and <tt>packet_numbers</tt>
is used. If the optional <tt>packet_numbers</tt> field is used, each frame <bcp14>MUST</bcp14> have a
corresponding packet number at the same index.</t>
        <figure anchor="quic-framesprocessed-def">
          <name>QUICFramesProcessed definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICFramesProcessed = {
    frames: [* $QuicFrame]
    ? packet_numbers: [* uint64]

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

    ; byte length of the moved data
    ? length: uint64

    ? from: $DataLocation
    ? to: $DataLocation

    ? additional_info: $DataMovedAdditionalInfo

    ? raw: RawInfo

    * $$quic-streamdatamoved-extension
}

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

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

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

    ? reason: $BlockedReason
}

$BlockedState /= "blocked" /
               "unblocked"

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

    stream_id: uint64

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

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

    ? path_id: PathID

    ; the information for traffic going towards the remote receiver
    ? path_remote: PathEndpointInfo

    ; the information for traffic coming in at the local endpoint
    ? path_local: PathEndpointInfo

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

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

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

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

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

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

    ; as RTT multiplier
    ? time_threshold: float32

    ; in ms
    timer_granularity: uint16

    ; in ms
    ? initial_rtt:float32

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

    ; in bytes
    ? initial_congestion_window: uint64

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

    ; as PTO multiplier
    ? persistent_congestion_threshold: uint16

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

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

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

    ; in bytes
    ? ssthresh: uint64

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

    ; in bits per second
    ? pacing_rate: uint64

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

    * $$quic-congestionstateupdated-extension
}
]]></sourcecode>
        </figure>
        <t>The <tt>trigger</tt> field <bcp14>SHOULD</bcp14> be logged if there are multiple ways in which a state
change can occur but <bcp14>MAY</bcp14> be omitted if a given state can only be due to a single
event occurring (for example Slow Start is often exited only when ssthresh is
exceeded).</t>
      </section>
      <section anchor="quic-losstimerupdated">
        <name>loss_timer_updated</name>
        <t>The <tt>loss_timer_updated</tt> event is emitted when a recovery loss timer changes
state. It has Extra importance level.</t>
        <t>The three main event types are:</t>
        <ul spacing="normal">
          <li>set: the timer is set with a delta timeout for when it will trigger next</li>
          <li>expired: when the timer effectively expires after the delta timeout</li>
          <li>cancelled: when a timer is cancelled (e.g., all outstanding packets are
acknowledged, start idle period)</li>
        </ul>
        <t>In order to indicate an active timer's timeout update, a new <tt>set</tt> event is used.</t>
        <figure anchor="quic-losstimerupdated-def">
          <name>QUICLossTimerUpdated definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICLossTimerUpdated = {

    ; called "mode" in RFC 9002 A.9.
    ? timer_type: "ack" /
                  "pto"
    ? 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 will trigger
    ? delta: float32

    * $$quic-losstimerupdated-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="quic-packetlost">
        <name>packet_lost</name>
        <t>The <tt>packet_lost</tt> event is emitted when a packet is deemed lost by loss
detection. It has Core importance level.</t>
        <t>It is <bcp14>RECOMMENDED</bcp14> to populate the optional <tt>trigger</tt> field in order to help
disambiguate among the various possible causes of a loss declaration.</t>
        <figure anchor="quic-packetlost-def">
          <name>QUICPacketLost definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICPacketLost = {

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

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

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

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

    * $$quic-ecnstateupdated-extension
}

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

    ; Even though usually only a single ConnectionID
    ; is associated with a given 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-pathendpointinfo-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="packettype">
        <name>PacketType</name>
        <figure anchor="packettype-def">
          <name>PacketType definition</name>
          <sourcecode type="cddl"><![CDATA[
$PacketType /=  "initial" /
                "handshake" /
                "0RTT" /
                "1RTT" /
                "retry" /
                "version_negotiation" /
                "stateless_reset" /
                "unknown"
]]></sourcecode>
        </figure>
      </section>
      <section anchor="packetnumberspace">
        <name>PacketNumberSpace</name>
        <figure anchor="packetnumberspace-def">
          <name>PacketNumberSpace definition</name>
          <sourcecode type="cddl"><![CDATA[
$PacketNumberSpace /= "initial" /
                      "handshake" /
                      "application_data"
]]></sourcecode>
        </figure>
      </section>
      <section anchor="packetheader">
        <name>PacketHeader</name>
        <t>If the packet_type numerical value does not map to a known packet_type string,
the packet_type value of "unknown" can be used and the raw value captured in the
packet_type_bytes field; a numerical value without variable-length integer
encoding.</t>
        <figure anchor="packetheader-def">
          <name>PacketHeader definition</name>
          <sourcecode type="cddl"><![CDATA[
PacketHeader = {
    ? quic_bit: bool .default true
    packet_type: $PacketType

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

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

    ; the bit flags of the packet headers (spin bit, key update bit,
    ; etc. up to and including the packet number length bits
    ; if present
    ? flags: uint8

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

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

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

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

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

    * $$quic-token-extension
}

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

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

AckFrame = {
    frame_type: "ack"

    ; in ms
    ? ack_delay: float32

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

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

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

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

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

    ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="cryptoframe">
          <name>CryptoFrame</name>
          <figure anchor="cryptoframe-def">
            <name>CryptoFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
CryptoFrame = {
    frame_type: "crypto"
    offset: uint64
    length: 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>
          <figure anchor="streamframe-def">
            <name>StreamFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
StreamFrame = {
    frame_type: "stream"
    stream_id: uint64

    ; These two MUST always be set
    ; If not present in the Frame type, log their default values
    offset: uint64
    length: uint64

    ; this MAY be set any time,
    ; but MUST only be set if the value is true
    ; if absent, the value MUST be assumed to be false
    ? fin: bool .default false
    ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="maxdataframe">
          <name>MaxDataFrame</name>
          <figure anchor="maxdataframe-def">
            <name>MaxDataFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
MaxDataFrame = {
  frame_type: "max_data"
  maximum: uint64
  ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="maxstreamdataframe">
          <name>MaxStreamDataFrame</name>
          <figure anchor="maxstreamdataframe-def">
            <name>MaxStreamDataFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
MaxStreamDataFrame = {
  frame_type: "max_stream_data"
  stream_id: uint64
  maximum: uint64
  ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="maxstreamsframe">
          <name>MaxStreamsFrame</name>
          <figure anchor="maxstreamsframe-def">
            <name>MaxStreamsFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
MaxStreamsFrame = {
  frame_type: "max_streams"
  stream_type: StreamType
  maximum: uint64
  ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="datablockedframe">
          <name>DataBlockedFrame</name>
          <figure anchor="datablockedframe-def">
            <name>DataBlockedFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
DataBlockedFrame = {
  frame_type: "data_blocked"
  limit: uint64
  ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="streamdatablockedframe">
          <name>StreamDataBlockedFrame</name>
          <figure anchor="streamdatablockedframe-def">
            <name>StreamDataBlockedFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
StreamDataBlockedFrame = {
  frame_type: "stream_data_blocked"
  stream_id: uint64
  limit: uint64
  ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="streamsblockedframe">
          <name>StreamsBlockedFrame</name>
          <figure anchor="streamsblockedframe-def">
            <name>StreamsBlockedFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
StreamsBlockedFrame = {
  frame_type: "streams_blocked"
  stream_type: StreamType
  limit: uint64
  ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="newconnectionidframe">
          <name>NewConnectionIDFrame</name>
          <figure anchor="newconnectionidframe-def">
            <name>NewConnectionIDFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
NewConnectionIDFrame = {
  frame_type: "new_connection_id"
  sequence_number: uint32
  retire_prior_to: uint32

  ; 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: uint32
  ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="pathchallengeframe">
          <name>PathChallengeFrame</name>
          <figure anchor="pathchallengeframe-def">
            <name>PathChallengeFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
PathChallengeFrame = {
  frame_type: "path_challenge"

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

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

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

    ; only if error_code === "unknown"
    ? error_code_bytes: uint64

    ? reason: text
    ? reason_bytes: hexstring

    ; when error_space === "transport"
    ? trigger_frame_type: uint64 /
                          text
    ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="handshakedoneframe">
          <name>HandshakeDoneFrame</name>
          <figure anchor="handshakedoneframe-def">
            <name>HandshakeDoneFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
HandshakeDoneFrame = {
  frame_type: "handshake_done"
  ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="unknownframe">
          <name>UnknownFrame</name>
          <t>The frame_type_bytes field is the numerical value without variable-length
integer encoding.</t>
          <figure anchor="unknownframe-def">
            <name>UnknownFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
UnknownFrame = {
    frame_type: "unknown"
    frame_type_bytes: uint64
    ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="datagramframe">
          <name>DatagramFrame</name>
          <t>The QUIC DATAGRAM frame is defined in <xref section="4" sectionFormat="of" target="RFC9221"/>.</t>
          <figure anchor="datagramframe-def">
            <name>DatagramFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
DatagramFrame = {
    frame_type: "datagram"
    ? length: uint64
    ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="transporterror">
          <name>TransportError</name>
          <t>The generic <tt>$TransportError</tt> is defined here as a CDDL "type socket" extension
point. It can be extended to support additional Transport errors.</t>
          <figure anchor="transporterror-def">
            <name>TransportError definition</name>
            <sourcecode type="cddl"><![CDATA[
$TransportError /= "no_error" /
                 "internal_error" /
                 "connection_refused" /
                 "flow_control_error" /
                 "stream_limit_error" /
                 "stream_state_error" /
                 "final_size_error" /
                 "frame_encoding_error" /
                 "transport_parameter_error" /
                 "connection_id_limit_error" /
                 "protocol_violation" /
                 "invalid_token" /
                 "application_error" /
                 "crypto_buffer_exceeded" /
                 "key_update_error" /
                 "aead_limit_reached" /
                 "no_viable_path" /
                 "unknown"
                 ; there is no value to reflect CRYPTO_ERROR
                 ; use the CryptoError type instead
]]></sourcecode>
          </figure>
        </section>
        <section anchor="applicationerror">
          <name>ApplicationError</name>
          <t>By definition, an application error is defined by the application-level
protocol running on top of QUIC (e.g., HTTP/3).</t>
          <t>As such, it cannot be defined here completely. It is instead defined as a CDDL
"type socket" extension point, with a single "unknown" value.</t>
          <figure anchor="applicationerror-def">
            <name>ApplicationError definition</name>
            <sourcecode type="cddl"><![CDATA[
$ApplicationError /= "unknown"
]]></sourcecode>
          </figure>
          <t>Application-level qlog definitions that wish to define new ApplicationError
strings <bcp14>MUST</bcp14> do so by extending the $ApplicationError socket as such:</t>
          <artwork><![CDATA[
$ApplicationError /= "new_error_name" /
                     "another_new_error_name"
]]></artwork>
        </section>
        <section anchor="cryptoerror">
          <name>CryptoError</name>
          <t>These errors are defined in the TLS document as "A TLS alert is turned into a QUIC
connection error by converting the one-byte alert description into a QUIC error
code. The alert description is added to 0x100 to produce a QUIC error code from
the range reserved for CRYPTO_ERROR."</t>
          <t>This approach maps badly to a pre-defined enum. As such, the crypto_error
string is defined as having a dynamic component here, which should include the
hex-encoded and zero-padded value of the TLS alert description.</t>
          <figure anchor="cryptoerror-def">
            <name>CryptoError definition</name>
            <sourcecode type="cddl"><![CDATA[
; all strings from "crypto_error_0x100" to "crypto_error_0x1ff"
CryptoError = text .regexp "crypto_error_0x1[0-9a-f][0-9a-f]"
]]></sourcecode>
          </figure>
        </section>
      </section>
    </section>
    <section anchor="security-and-privacy-considerations">
      <name>Security and Privacy Considerations</name>
      <t>The security and privacy considerations discussed in <xref target="QLOG-MAIN"/> apply to this
document as well.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document registers a new entry in the "qlog event schema URIs" registry (created in <xref section="15" sectionFormat="of" target="QLOG-MAIN"/>):</t>
      <dl>
        <dt>Event schema URI:</dt>
        <dd>
          <t>urn:ietf:params:qlog:events:quic</t>
        </dd>
        <dt>Namespace</dt>
        <dd>
          <t>quic</t>
        </dd>
        <dt>Event Types</dt>
        <dd>
          <t>server_listening,connection_started,connection_closed,connection_id_updated,spin_bit_updated,connection_state_updated,path_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_processed,stream_data_moved,datagram_data_moved,migration_state_updated,key_updated,key_discarded,recovery_parameters_set,recovery_metrics_updated,congestion_state_updated,loss_timer_updated,packet_lost,marked_for_retransmit,ecn_state_updated</t>
        </dd>
        <dt>Description:</dt>
        <dd>
          <t>Event definitions related to the QUIC transport protocol.</t>
        </dd>
        <dt>Reference:</dt>
        <dd>
          <t>This Document</t>
        </dd>
      </dl>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="QLOG-MAIN">
          <front>
            <title>qlog: Structured Logging for Network Protocols</title>
            <author fullname="Robin Marx" initials="R." surname="Marx">
              <organization>Akamai</organization>
            </author>
            <author fullname="Luca Niccolini" initials="L." surname="Niccolini">
              <organization>Meta</organization>
            </author>
            <author fullname="Marten Seemann" initials="M." surname="Seemann">
         </author>
            <author fullname="Lucas Pardue" initials="L." surname="Pardue">
              <organization>Cloudflare</organization>
            </author>
            <date day="17" month="March" year="2025"/>
            <abstract>
              <t>   qlog provides extensible structured logging for network protocols,
   allowing for easy sharing of data that benefits common debug and
   analysis methods and tooling.  This document describes key concepts
   of qlog: formats, files, traces, events, and extension points.  This
   definition includes the high-level log file schemas, and generic
   event schemas.  Requirements and guidelines for creating protocol-
   specific event schemas are also presented.  All schemas are defined
   independent of serialization format, allowing logs to be represented
   in various ways such as JSON, CSV, or protobuf.

Note to Readers

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

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

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

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-main-schema-11"/>
        </reference>
        <reference anchor="QUIC-TRANSPORT">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="QUIC-RECOVERY">
          <front>
            <title>QUIC Loss Detection and Congestion Control</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="I. Swett" initials="I." role="editor" surname="Swett"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document describes loss detection and congestion control mechanisms for QUIC.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9002"/>
          <seriesInfo name="DOI" value="10.17487/RFC9002"/>
        </reference>
        <reference anchor="QUIC-TLS">
          <front>
            <title>Using TLS to Secure QUIC</title>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <author fullname="S. Turner" initials="S." role="editor" surname="Turner"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document describes how Transport Layer Security (TLS) is used to secure QUIC.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9001"/>
          <seriesInfo name="DOI" value="10.17487/RFC9001"/>
        </reference>
        <reference anchor="QUIC-DATAGRAM">
          <front>
            <title>An Unreliable Datagram Extension to QUIC</title>
            <author fullname="T. Pauly" initials="T." surname="Pauly"/>
            <author fullname="E. Kinnear" initials="E." surname="Kinnear"/>
            <author fullname="D. Schinazi" initials="D." surname="Schinazi"/>
            <date month="March" year="2022"/>
            <abstract>
              <t>This document defines an extension to the QUIC transport protocol to add support for sending and receiving unreliable datagrams over a QUIC connection.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9221"/>
          <seriesInfo name="DOI" value="10.17487/RFC9221"/>
        </reference>
        <reference anchor="GREASEBIT">
          <front>
            <title>Greasing the QUIC Bit</title>
            <author fullname="M. Thomson" initials="M." surname="Thomson"/>
            <date month="August" year="2022"/>
            <abstract>
              <t>This document describes a method for negotiating the ability to send an arbitrary value for the second-most significant bit in QUIC packets.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9287"/>
          <seriesInfo name="DOI" value="10.17487/RFC9287"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="CDDL">
          <front>
            <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <author fullname="C. Vigano" initials="C." surname="Vigano"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="June" year="2019"/>
            <abstract>
              <t>This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049). Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8610"/>
          <seriesInfo name="DOI" value="10.17487/RFC8610"/>
        </reference>
        <reference anchor="RFC9221">
          <front>
            <title>An Unreliable Datagram Extension to QUIC</title>
            <author fullname="T. Pauly" initials="T." surname="Pauly"/>
            <author fullname="E. Kinnear" initials="E." surname="Kinnear"/>
            <author fullname="D. Schinazi" initials="D." surname="Schinazi"/>
            <date month="March" year="2022"/>
            <abstract>
              <t>This document defines an extension to the QUIC transport protocol to add support for sending and receiving unreliable datagrams over a QUIC connection.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9221"/>
          <seriesInfo name="DOI" value="10.17487/RFC9221"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="RFC7301">
          <front>
            <title>Transport Layer Security (TLS) Application-Layer Protocol Negotiation Extension</title>
            <author fullname="S. Friedl" initials="S." surname="Friedl"/>
            <author fullname="A. Popov" initials="A." surname="Popov"/>
            <author fullname="A. Langley" initials="A." surname="Langley"/>
            <author fullname="E. Stephan" initials="E." surname="Stephan"/>
            <date month="July" year="2014"/>
            <abstract>
              <t>This document describes a Transport Layer Security (TLS) extension for application-layer protocol negotiation within the TLS handshake. For instances in which multiple application protocols are supported on the same TCP or UDP port, this extension allows the application layer to negotiate which protocol will be used within the TLS connection.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7301"/>
          <seriesInfo name="DOI" value="10.17487/RFC7301"/>
        </reference>
      </references>
    </references>
    <section numbered="false" anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>Much of the initial work by Robin Marx was done at the Hasselt and KU Leuven
Universities.</t>
      <t>Thanks to Jana Iyengar, Brian Trammell, Dmitri Tikhonov, Stephen Petrides, Jari
Arkko, Marcus Ihlar, Victor Vasiliev, Mirja Kuehlewind, Jeremy Laine, Kazu
Yamamoto, Christian Huitema, Hugo Landau, Will Hawkins, Mathis Engelbart 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-09">
        <name>Since draft-ietf-qlog-quic-events-09:</name>
        <ul spacing="normal">
          <li>Several editorial changes</li>
          <li>Reworked QUICConnectionStarted to use PathEndpointInfo (#453)</li>
          <li>Consistent use of RawInfo and _bytes fields to log raw data (#450)</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-qlog-quic-events-08">
        <name>Since draft-ietf-qlog-quic-events-08:</name>
        <ul spacing="normal">
          <li>Removed individual categories and put every event in the single <tt>quic</tt> event
schema namespace. Major change (#439)</li>
          <li>Renamed <tt>recovery:metrics_updated</tt> to <tt>quic:recovery_metrics_updated</tt> and
<tt>recovery:parameters_set</tt> to <tt>quic:recovery_parameters_set</tt> (#439)</li>
          <li>Added <tt>unknown_parameters</tt> field to <tt>parameters_set</tt> (#438)</li>
          <li>Added extra parameters to <tt>parameters_restored</tt> (#441)</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-qlog-quic-events-07">
        <name>Since draft-ietf-qlog-quic-events-07:</name>
        <ul spacing="normal">
          <li>TODO (we forgot...)</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-qlog-quic-events-06">
        <name>Since draft-ietf-qlog-quic-events-06:</name>
        <ul spacing="normal">
          <li>Added PathAssigned and MigrationStateUpdated events (#336)</li>
          <li>Added extension points to parameters_set and parameters_restored (#400)</li>
          <li>Removed error_code_value from connection_closed (#386, #392)</li>
          <li>Renamed generation to key_phase for key_updated and key_discarded (#390)</li>
          <li>Removed retry_token from packet_sent and packet_received (#389)</li>
          <li>Updated ALPN handling (#385)</li>
          <li>Added key_unavailable trigger to packet_dropped (#381)</li>
          <li>Updated several uint32 to uint64</li>
          <li>ProtocolEventBody is now called ProtocolEventData (#352)</li>
          <li>Editorial changes (#402, #404, #394, #393)</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-qlog-quic-events-05">
        <name>Since draft-ietf-qlog-quic-events-05:</name>
        <ul spacing="normal">
          <li>SecurityKeyUpdated: the new key is no longer mandatory to log (#294)</li>
          <li>Added ECN related events and metadata (#263)</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-qlog-quic-events-04">
        <name>Since draft-ietf-qlog-quic-events-04:</name>
        <ul spacing="normal">
          <li>Updated guidance on logging events across connections (#279)</li>
          <li>Renamed 'transport' category to 'quic' (#302)</li>
          <li>Added support for multiple packet numbers in 'quic:frames_processed' (#307)</li>
          <li>Added definitions for RFC9287 (QUIC GREASE Bit extension) (#311)</li>
          <li>Added definitions for RFC9221 (QUIC Datagram Frame extension) (#310)</li>
          <li>(Temporarily) removed definitions for connection migration events (#317)</li>
          <li>Editorial and formatting changes (#298, #299, #304, #306, #327)</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-qlog-quic-events-03">
        <name>Since draft-ietf-qlog-quic-events-03:</name>
        <ul spacing="normal">
          <li>Ensured consistent use of RawInfo to indicate raw wire bytes (#243)</li>
          <li>Renamed UnknownFrame:raw_frame_type to :frame_type_value (#54)</li>
          <li>Renamed ConnectionCloseFrame:raw_error_code to :error_code_value (#54)</li>
          <li>Changed triggers for packet_dropped (#278)</li>
          <li>Added entries to TransportError enum (#285)</li>
          <li>Changed minimum_congestion_window to uint64 (#288)</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-qlog-quic-events-02">
        <name>Since draft-ietf-qlog-quic-events-02:</name>
        <ul spacing="normal">
          <li>Renamed key_retired to key_discarded (#185)</li>
          <li>Added fields and events for DPLPMTUD (#135)</li>
          <li>Made packet_number optional in PacketHeader (#244)</li>
          <li>Removed connection_retried event placeholder (#255)</li>
          <li>Changed QuicFrame to a CDDL plug type (#257)</li>
          <li>Moved data definitions out of the appendix into separate sections</li>
          <li>Added overview Table of Contents</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-qlog-quic-events-01">
        <name>Since draft-ietf-qlog-quic-events-01:</name>
        <ul spacing="normal">
          <li>Added Stateless Reset Token type (#122)</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-ietf-qlog-quic-events-00">
        <name>Since draft-ietf-qlog-quic-events-00:</name>
        <ul spacing="normal">
          <li>Change the data definition language from TypeScript to CDDL (#143)</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-marx-qlog-event-definitions-quic-h3-02">
        <name>Since draft-marx-qlog-event-definitions-quic-h3-02:</name>
        <ul spacing="normal">
          <li>These changes were done in preparation of the adoption of the drafts by the QUIC
working group (#137)</li>
          <li>Split QUIC and HTTP/3 events into two separate documents</li>
          <li>Moved RawInfo, Importance, Generic events and Simulation events to the main
schema document.</li>
          <li>Changed to/from value options of the <tt>data_moved</tt> event</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-marx-qlog-event-definitions-quic-h3-01">
        <name>Since draft-marx-qlog-event-definitions-quic-h3-01:</name>
        <t>Major changes:</t>
        <ul spacing="normal">
          <li>Moved data_moved from http to transport. Also made the "from" and "to" fields
flexible strings instead of an enum (#111,#65)</li>
          <li>Moved packet_type fields to PacketHeader. Moved packet_size field out of
PacketHeader to RawInfo:length (#40)</li>
          <li>Made events that need to log packet_type and packet_number use a header field
instead of logging these fields individually</li>
          <li>Added support for logging retry, stateless reset and initial tokens (#94,#86,#117)</li>
          <li>Moved separate general event categories into a single category "generic" (#47)</li>
          <li>Added "transport:connection_closed" event (#43,#85,#78,#49)</li>
          <li>Added version_information and alpn_information events (#85,#75,#28)</li>
          <li>Added parameters_restored events to help clarify 0-RTT behaviour (#88)</li>
        </ul>
        <t>Smaller changes:</t>
        <ul spacing="normal">
          <li>Merged loss_timer events into one loss_timer_updated event</li>
          <li>Field data types are now strongly defined (#10,#39,#36,#115)</li>
          <li>Renamed qpack instruction_received and instruction_sent to instruction_created
and instruction_parsed (#114)</li>
          <li>Updated qpack:dynamic_table_updated.update_type. It now has the value "inserted"
instead of "added" (#113)</li>
          <li>Updated qpack:dynamic_table_updated. It now has an "owner" field to
differentiate encoder vs decoder state (#112)</li>
          <li>Removed push_allowed from http:parameters_set (#110)</li>
          <li>Removed explicit trigger field indications from events, since this was moved to
be a generic property of the "data" field (#80)</li>
          <li>Updated transport:connection_id_updated to be more in line with other similar
events. Also dropped importance from Core to Base (#45)</li>
          <li>Added length property to PaddingFrame (#34)</li>
          <li>Added packet_number field to transport:frames_processed (#74)</li>
          <li>Added a way to generically log packet header flags (first 8 bits) to
PacketHeader</li>
          <li>Added additional guidance on which events to log in which situations (#53)</li>
          <li>Added "simulation:scenario" event to help indicate simulation details</li>
          <li>Added "packets_acked" event (#107)</li>
          <li>Added "datagram_ids" to the datagram_X and packet_X events to allow tracking of
coalesced QUIC packets (#91)</li>
          <li>Extended connection_state_updated with more fine-grained states (#49)</li>
        </ul>
      </section>
      <section numbered="false" anchor="since-draft-marx-qlog-event-definitions-quic-h3-00">
        <name>Since draft-marx-qlog-event-definitions-quic-h3-00:</name>
        <ul spacing="normal">
          <li>Event and category names are now all lowercase</li>
          <li>Added many new events and their definitions</li>
          <li>"type" fields have been made more specific (especially important for PacketType
fields, which are now called packet_type instead of type)</li>
          <li>Events are given an importance indicator (issue #22)</li>
          <li>Event names are more consistent and use past tense (issue #21)</li>
          <li>Triggers have been redefined as properties of the "data" field and updated for most events (issue #23)</li>
        </ul>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+2923bbVpYo+o6vQNMZw5KbpCXZsR3mpFOKpCTqyLJbkrt2
jVQGBZGghDIJsABQMstxf8t5Pf+wn/b+sTOv6waAklOX7rF7p0YlIrCwrnPN
+2UwGER1Vs/TUfxv744P4vQ2zet4ms6yPKuzIq/iWVHGf54X19G0mOTJAhpO
y2RWD7K0ng3+vMomA3zLf9HX1WB3N5okdXpdlOtRXNXTKMqW5Siuy1VV7+3s
fLWzFyVlmoziizLJq2VR1tFdUb6/LovVkucRvU/X8Gg6io/zOi3ztB4c4qhR
VNVJPh0n8yKHmazTKlpmo/jnupj0Y5hglk9hBv24gj7LdFbBX+uF/FGX2QRe
TYrFMpE/Fjjdfpzl8yxPf4miZFXfFOUoiuMB/D+GF9UoPhvGr5PyAz3gDTgr
rrLcPizK61G8/z5ZJBn9TuGP+SguF9Dgdwk9H8Jg9K4scKvTaVYXpT/MyTA+
zSaTAqaSOWOdrCZJ8ILGe53WiTvaPNc2v1vAqwcM+HoYn6fwdZ47w8Gi6jT3
XsgAC3pT8YvfXePDzkHMit4m5XSVBsup3Me0mIN5sZrO5gAU3pKw7e/o30v6
oH28KC9gq+vsNh1F8PbfTt78MHi9f3w6oqbHg8NhAKrQez6oJjcwDEBmPnM+
HwwGcXIFoAIQEkUXN1mFULVa8KWoJmV2lVZxQhdC7gp3BNCU19Bvll/jn5My
rVOnVeTeKADguL5JszLGk5omdUKXDB7Bp2XKF3FZFgDUxZxaV+k8ndTpNEo/
4BlgL0OebF7U6fgU/1UX47M0maZlFUX/EuOjuC7is+8PZJ9G8dt5mlRpXKaL
4hZe4uIq6BZ6i6/SGY68XF3NM7i68Aj6/z5Np1fJ5D1NYZpVk1WFQ8dwTPFd
OofDSOOkjn6+qetlNXr69Dqrb1ZXeEhPcbPvrp/iBvyytfn99jCWeWPHUTK9
zap0inOHe5uW+AfuTI9X8bhi9NODkeE5/Ovd2QltX5LHq+WgLgawoWl8C/3B
XKNixgvVU5RtW2TT6TyNokeIX8piuqJtaJ44HFrHeW99/Hgum/cqhlEM2H36
tB21AQPjxk0nvQWXK/r48Z/w6eDibP/0/O2bs4tv4Ai/2tnZ+fSpH+vLs6OD
N/9+dPYHebeH7+CQ7Mcn5/JqF6bDIISnBfPMYA4WivwxD/cv9n84239N3+7t
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

-->

</rfc>
