<?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-10" 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-10"/>
    <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="March" day="17"/>
    <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>
      <t>Concrete examples of integrations of this schema in
various programming languages can be found at
<eref target="https://github.com/quiclog/qlog/">https://github.com/quiclog/qlog/</eref>.</t>
    </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, path, group_id, importance, RawInfo, and time-related fields.</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: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 /
                QUICKeyUpdated /
                QUICKeyDiscarded /
                QUICVersionInformation /
                QUICALPNInformation /
                QUICParametersSet /
                QUICParametersRestored /
                QUICPacketSent /
                QUICPacketReceived /
                QUICPacketDropped /
                QUICPacketBuffered /
                QUICPacketsAcked /
                QUICUDPDatagramsSent /
                QUICUDPDatagramsReceived /
                QUICUDPDatagramDropped /
                QUICStreamStateUpdated /
                QUICFramesProcessed /
                QUICStreamDataMoved /
                QUICDatagramDataMoved /
                QUICRecoveryParametersSet /
                QUICRecoveryMetricsUpdated /
                QUICCongestionStateUpdated /
                QUICLossTimerUpdated /
                QUICPacketLost

$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; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</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; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</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; see
<xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</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; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</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; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</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; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</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; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</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; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</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; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</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; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</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; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</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; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</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; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</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; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</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; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</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; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</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; see
<xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</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; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</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; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</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; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</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; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</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; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</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;
see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</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-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; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</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; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</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; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</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; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</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; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</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; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</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; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</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; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</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; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</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; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</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:</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="21" month="October" year="2024"/>
            <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-10"/>
        </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:
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

-->

</rfc>
