<?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-07" 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-07"/>
    <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="2024" month="March" day="04"/>
    <area>Transport</area>
    <workgroup>QUIC</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>This document describes concrete qlog event definitions and their metadata for
QUIC events. These events can then be embedded in the higher level schema defined
in <xref target="QLOG-MAIN"/>.</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 describes the values of the qlog name ("category" + "event") and
"data" fields and their semantics for the 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>
      <section anchor="notational-conventions">
        <name>Notational Conventions</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <t>The event and data structure definitions in ths document are expressed
in the Concise Data Definition Language <xref target="CDDL"/> and its
extensions described in <xref target="QLOG-MAIN"/>.</t>
        <t>The following fields from <xref target="QLOG-MAIN"/> are imported and used: name, category,
type, data, group_id, protocol_type, importance, RawInfo, and time-related
fields.</t>
        <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="overview">
      <name>Overview</name>
      <t>This document describes how the QUIC protocol can be expressed in qlog using
the schema defined in <xref target="QLOG-MAIN"/>. QUIC protocol events are defined with a
category, a name (the concatenation of "category" and "event"), an "importance",
an optional "trigger", and "data" fields.</t>
      <t>Some data fields use complex datastructures. These are represented as enums or
re-usable definitions, which are grouped together on the bottom of this document
for clarity.</t>
      <t>When any event from this document is included in a qlog trace, the
<tt>protocol_type</tt> qlog array field <bcp14>MUST</bcp14> contain an entry with the value "QUIC".</t>
      <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 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.</t>
        <dl>
          <dt>Note:</dt>
          <dd>
            <t>As QUIC appends an authentication tag after the packet payload, the packet
header_lengths can be calculated as:</t>
          </dd>
          <dt/>
          <dd>
            <t>header_length = length - payload_length - 16</t>
          </dd>
          <dt/>
          <dd>
            <t>For UDP datagrams, the calculation is simpler:</t>
          </dd>
          <dt/>
          <dd>
            <t>header_length = length - payload_length</t>
          </dd>
          <dt>Note:</dt>
          <dd>
            <t>In some cases, the length fields are also explicitly reflected inside of packet
headers. For example, the QUIC STREAM frame has a <tt>length</tt> field indicating its
payload size. Similarly, the QUIC Long Header has a <tt>length</tt> field which is equal
to the payload length plus the packet number length. In these cases, those fields
are intentionally preserved in the event definitions. Even though this can lead to
duplicate data when the full RawInfo is logged, it allows a more direct mapping of
the QUIC specifications to qlog, making it easier for users to interpret.</t>
          </dd>
        </dl>
      </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>
    <section anchor="quic-event-overview">
      <name>QUIC Event Overview</name>
      <t>QUIC connections consist of different phases and interaction events. In order to
model this, QUIC event types are divided into general categories: connectivity
(<xref target="conn-ev"/>), security (<xref target="sec-ev"/>), quic <xref target="quic-ev"/>, and recovery
<xref target="rec-ev"/>.</t>
      <t>As described in <xref section="3.4.2" sectionFormat="of" target="QLOG-MAIN"/>, the qlog <tt>name</tt> field is the
concatenation of category and type.</t>
      <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">connectivity:server_listening</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="connectivity-serverlistening"/></td>
          </tr>
          <tr>
            <td align="left">connectivity:connection_started</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="connectivity-connectionstarted"/></td>
          </tr>
          <tr>
            <td align="left">connectivity:connection_closed</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="connectivity-connectionclosed"/></td>
          </tr>
          <tr>
            <td align="left">connectivity:connection_id_updated</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="connectivity-connectionidupdated"/></td>
          </tr>
          <tr>
            <td align="left">connectivity:spin_bit_updated</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="connectivity-spinbitupdated"/></td>
          </tr>
          <tr>
            <td align="left">connectivity:connection_state_updated</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="connectivity-connectionstateupdated"/></td>
          </tr>
          <tr>
            <td align="left">connectivity:path_assigned</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="connectivity-pathassigned"/></td>
          </tr>
          <tr>
            <td align="left">connectivity:mtu_updated</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="connectivity-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:datagrams_sent</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-datagramssent"/></td>
          </tr>
          <tr>
            <td align="left">quic:datagrams_received</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-datagramsreceived"/></td>
          </tr>
          <tr>
            <td align="left">quic:datagram_dropped</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-datagramdropped"/></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">security:key_updated</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="security-keyupdated"/></td>
          </tr>
          <tr>
            <td align="left">security:key_discarded</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="security-keydiscarded"/></td>
          </tr>
          <tr>
            <td align="left">recovery:parameters_set</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="recovery-parametersset"/></td>
          </tr>
          <tr>
            <td align="left">recovery:metrics_updated</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="recovery-metricsupdated"/></td>
          </tr>
          <tr>
            <td align="left">recovery:congestion_state_updated</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="recovery-congestionstateupdated"/></td>
          </tr>
          <tr>
            <td align="left">recovery:loss_timer_updated</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="recovery-losstimerupdated"/></td>
          </tr>
          <tr>
            <td align="left">recovery:packet_lost</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="recovery-packetlost"/></td>
          </tr>
          <tr>
            <td align="left">recovery:marked_for_retransmit</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="recovery-markedforretransmit"/></td>
          </tr>
          <tr>
            <td align="left">recovery:ecn_state_updated</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="recovery-ecnstateupdated"/></td>
          </tr>
        </tbody>
      </table>
      <t>QUIC events extend the <tt>$ProtocolEventData</tt> extension point defined in
<xref target="QLOG-MAIN"/>.</t>
      <figure anchor="quicevent-data-def">
        <name>QuicEventData definition and ProtocolEventData extension</name>
        <sourcecode type="cddl"><![CDATA[
QuicEventData = ConnectivityServerListening /
                ConnectivityConnectionStarted /
                ConnectivityConnectionClosed /
                ConnectivityConnectionIDUpdated /
                ConnectivitySpinBitUpdated /
                ConnectivityConnectionStateUpdated /
                ConnectivityPathAssigned /
                ConnectivityMTUUpdated /
                SecurityKeyUpdated /
                SecurityKeyDiscarded /
                QUICVersionInformation /
                QUICALPNInformation /
                QUICParametersSet /
                QUICParametersRestored /
                QUICPacketSent /
                QUICPacketReceived /
                QUICPacketDropped /
                QUICPacketBuffered /
                QUICPacketsAcked /
                QUICDatagramsSent /
                QUICDatagramsReceived /
                QUICDatagramDropped /
                QUICStreamStateUpdated /
                QUICFramesProcessed /
                QUICStreamDataMoved /
                QUICDatagramDataMoved /
                RecoveryParametersSet /
                RecoveryMetricsUpdated /
                RecoveryCongestionStateUpdated /
                RecoveryLossTimerUpdated /
                RecoveryPacketLost

$ProtocolEventData /= QuicEventData
]]></sourcecode>
      </figure>
    </section>
    <section anchor="conn-ev">
      <name>Connectivity events</name>
      <section anchor="connectivity-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="connectivity-serverlistening-def">
          <name>ConnectivityServerListening definition</name>
          <sourcecode type="cddl"><![CDATA[
ConnectivityServerListening = {
    ? ip_v4: IPAddress
    ? ip_v6: IPAddress
    ? port_v4: uint16
    ? port_v6: uint16

    ; the server will always answer client initials with a retry
    ; (no 1-RTT connection setups by choice)
    ? retry_required: bool
}
]]></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="connectivity-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="connectivity-connectionstarted-def">
          <name>ConnectivityConnectionStarted definition</name>
          <sourcecode type="cddl"><![CDATA[
ConnectivityConnectionStarted = {
    ? ip_version: IPVersion
    src_ip: IPAddress
    dst_ip: IPAddress

    ; transport layer protocol
    ? protocol: text .default "QUIC"
    ? src_port: uint16
    ? dst_port: uint16
    ? src_cid: ConnectionID
    ? dst_cid: ConnectionID
}
]]></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="connectivity-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, which are difficult to reflect using the other options.</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.</t>
        <figure anchor="connectivity-connectionclosed-def">
          <name>ConnectivityConnectionClosed definition</name>
          <sourcecode type="cddl"><![CDATA[
ConnectivityConnectionClosed = {

    ; which side closed the connection
    ? owner: Owner
    ? connection_code: TransportError /
                       CryptoError /
                       uint32
    ? application_code: $ApplicationError /
                        uint32
    ? internal_code: uint32
    ? reason: text
    ? trigger:
        "clean" /
        "handshake_timeout" /
        "idle_timeout" /
        ; this is called the "immediate close" in the QUIC RFC
        "error" /
        "stateless_reset" /
        "version_mismatch" /
        ; for example HTTP/3's GOAWAY frame
        "application"
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="connectivity-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="connectivity-connectionidupdated-def">
          <name>ConnectivityConnectionIDUpdated definition</name>
          <sourcecode type="cddl"><![CDATA[
ConnectivityConnectionIDUpdated = {
    owner: Owner
    ? old: ConnectionID
    ? new: ConnectionID
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="connectivity-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="connectivity-spinbitupdated-def">
          <name>ConnectivitySpinBitUpdated definition</name>
          <sourcecode type="cddl"><![CDATA[
ConnectivitySpinBitUpdated = {
    state: bool
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="connectivity-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>It is intended to provide exhaustive options to log each state individually, but
also provides a more basic, simpler set for implementations less interested in
tracking each smaller state transition. As such, users should not expect to see
all these states reflected in all qlogs and implementers should focus on support
for the SimpleConnectionState set.</t>
        <figure anchor="connectivity-connectionstateupdated-def">
          <name>ConnectivityConnectionStateUpdated definition</name>
          <sourcecode type="cddl"><![CDATA[
ConnectivityConnectionStateUpdated = {
    ? old: ConnectionState /
           SimpleConnectionState
    new: ConnectionState /
         SimpleConnectionState
}

ConnectionState =
    ; initial sent/received
    "attempted" /
    ; peer address validated by: client sent Handshake packet OR
    ; client used CONNID chosen by the server.
    ; RFC 9000 Section 8.1
    "peer_validated" /
    "handshake_started" /
    ; 1 RTT can be sent, but handshake isn't done yet
    "early_write" /
    ; TLS handshake complete: Finished received and sent
    ; RFC 9001 Section 4.1.1
    "handshake_complete" /
    ; HANDSHAKE_DONE sent/received (connection is now "active", 1RTT
    ; can be sent). RFC 9001 Section 4.1.2
    "handshake_confirmed" /
    "closing" /
    ; connection_close sent/received
    "draining" /
    ; draining period done, connection state discarded
    "closed"

SimpleConnectionState =
    "attempted" /
    "handshake_started" /
    "handshake_confirmed" /
    "closed"
]]></sourcecode>
        </figure>
        <t>These states correspond to the following transitions for both client and server:</t>
        <t><strong>Client:</strong></t>
        <ul spacing="normal">
          <li>
            <t>send initial
            </t>
            <ul spacing="normal">
              <li>state = attempted</li>
            </ul>
          </li>
          <li>
            <t>get initial
            </t>
            <ul spacing="normal">
              <li>state = validated <em>(not really "needed" at the client, but somewhat useful to indicate progress nonetheless)</em></li>
            </ul>
          </li>
          <li>
            <t>get first Handshake packet
            </t>
            <ul spacing="normal">
              <li>state = handshake_started</li>
            </ul>
          </li>
          <li>
            <t>get Handshake packet containing ServerFinished
            </t>
            <ul spacing="normal">
              <li>state = handshake_complete</li>
            </ul>
          </li>
          <li>
            <t>send ClientFinished
            </t>
            <ul spacing="normal">
              <li>state = early_write
  (1RTT can now be sent)</li>
            </ul>
          </li>
          <li>
            <t>get HANDSHAKE_DONE
            </t>
            <ul spacing="normal">
              <li>state = handshake_confirmed</li>
            </ul>
          </li>
        </ul>
        <t><strong>Server:</strong></t>
        <ul spacing="normal">
          <li>
            <t>get initial
            </t>
            <ul spacing="normal">
              <li>state = attempted</li>
            </ul>
          </li>
          <li>send initial <em>(TODO don't think this needs a separate state, since some handshake will always be sent in the same flight as this?)</em></li>
          <li>
            <t>send handshake EE, CERT, CV, ...
            </t>
            <ul spacing="normal">
              <li>state = handshake_started</li>
            </ul>
          </li>
          <li>
            <t>send ServerFinished
            </t>
            <ul spacing="normal">
              <li>state = early_write
  (1RTT can now be sent)</li>
            </ul>
          </li>
          <li>
            <t>get first handshake packet / something using a server-issued CID of min length
            </t>
            <ul spacing="normal">
              <li>state = validated</li>
            </ul>
          </li>
          <li>
            <t>get handshake packet containing ClientFinished
            </t>
            <ul spacing="normal">
              <li>state = handshake_complete</li>
            </ul>
          </li>
          <li>
            <t>send HANDSHAKE_DONE
            </t>
            <ul spacing="normal">
              <li>state = handshake_confirmed</li>
            </ul>
          </li>
        </ul>
        <dl>
          <dt>Note:</dt>
          <dd>
            <t><tt>connection_state_changed</tt> with a new state of <tt>attempted</tt> is the same
conceptual event as the <tt>connection_started</tt><tt> event above from the client's
perspective. Similarly, a state of </tt>closing<tt> or </tt>draining<tt> corresponds to the
</tt>connection_closed` event.</t>
          </dd>
        </dl>
      </section>
      <section anchor="connectivity-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="connectivity-pathassigned-def">
          <name>ConnectivityPathAssigned definition</name>
          <sourcecode type="cddl"><![CDATA[
ConnectivityPathAssigned = {
    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
}
]]></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="connectivity-connectionstarted"/>) is implicitly associated with the
PathID with value "". Associating metadata with this default path is possible by
logging the ConnectivityPathAssigned event with a value of "" for the <tt>path_id</tt>
field.</t>
        <t>As paths and their metadata can evolve over time, multiple
ConnectivityPathAssigned 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 ConnectivityPathAssigned 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="connectivity-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="connectivity-mtuupdated-def">
          <name>ConnectivityMTUUpdated definition</name>
          <sourcecode type="cddl"><![CDATA[
ConnectivityMTUUpdated = {
  ? old: uint32
  new: uint32

  ; at some point, MTU discovery stops, as a "good enough"
  ; packet size has been found
  ? done: bool .default false
}
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section anchor="quic-ev">
      <name>QUIC 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
}
]]></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
}

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>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

    ; 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
    ip_v6: IPAddress
    port_v4: uint16
    port_v6: uint16
    connection_id: ConnectionID
    stateless_reset_token: StatelessResetToken
}
]]></sourcecode>
        </figure>
        <t>The generic <tt>$$quic-parametersset-extension</tt> is defined here as a CDDL extension
point (a "group socket"). It can be used to support additional, unknown, custom,
and greased parameters. An example of such an extension can be found in
<xref target="parametersset-extension-example"/>.</t>
        <figure anchor="parametersset-extension-example">
          <name>quic-parametersset-extension example</name>
          <artwork><![CDATA[
$$quic-parametersset-extension //= (
  ? new_transport_parameter: uint64
)
]]></artwork>
        </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 = {
    ? 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

    * $$quic-parametersrestored-extension
}
]]></sourcecode>
        </figure>
        <t>The generic <tt>$$quic-parametersrestored-extension</tt> is defined here as a CDDL
extension point (a "group socket"). It can be used to support additional and
custom parameters.</t>
      </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]
    ? is_coalesced: bool .default false

    ; 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"
}
]]></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>For more details on <tt>datagram_id</tt>, see <xref target="quic-datagramssent"/>. It is only needed
when keeping track of packet coalescing.</t>
      </section>
      <section anchor="quic-packetreceived">
        <name>packet_received</name>
        <t>The <tt>packet_received</tt> event indicates a QUIC-level packet was received. It has
Core importance level; 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]
    ? is_coalesced: bool .default false

    ; 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"
}
]]></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>For more details on <tt>datagram_id</tt>, see <xref target="quic-datagramssent"/>. It is only needed
when keeping track of packet coalescing.</t>
      </section>
      <section anchor="quic-packetdropped">
        <name>packet_dropped</name>
        <t>The <tt>packet_dropped</tt> event indicates a QUIC-level packet was dropped. It has
Base importance level; 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"
}
]]></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>For more details on <tt>datagram_id</tt>, see <xref target="quic-datagramssent"/>.</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"
}
]]></sourcecode>
        </figure>
        <t>For more details on <tt>datagram_id</tt>, see <xref target="quic-datagramssent"/>. It is only needed
when keeping track of packet coalescing.</t>
      </section>
      <section anchor="quic-packetsacked">
        <name>packets_acked</name>
        <t>The <tt>packets_acked</tt> event is emitted when a (group of) sent packet(s) is
acknowledged by the remote peer <em>for the first time</em>. It has Extra importance
level; 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]
}
]]></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-datagramssent">
        <name>datagrams_sent</name>
        <t>When one or more UDP-level datagrams are passed to the 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-datagramssent-def">
          <name>QUICDatagramsSent definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICDatagramsSent = {

    ; 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]
}
]]></sourcecode>
        </figure>
        <t>Since QUIC implementations rarely control UDP logic directly, the raw data
excludes UDP-level headers in all fields.</t>
        <t>The <tt>datagram_id</tt> is a qlog-specific concept to allow tracking of QUIC packet
coalescing inside UDP datagrams. Since QUIC generates many UDP datagrams, unique
identifiers are required to be able to track them individually in qlog traces.
However, neither UDP nor QUIC exchanges datagram identifiers on the wire.
Selecting identifier values is thus left to qlog implementations, which should
consider how to generate unique values within the scope of their created traces.</t>
      </section>
      <section anchor="quic-datagramsreceived">
        <name>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-datagramsreceived-def">
          <name>QUICDatagramsReceived definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICDatagramsReceived = {

    ; 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]
}
]]></sourcecode>
        </figure>
        <t>For more details on <tt>datagram_ids</tt>, see <xref target="quic-datagramssent"/>.</t>
      </section>
      <section anchor="quic-datagramdropped">
        <name>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-datagramdropped-def">
          <name>QUICDatagramDropped definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICDatagramDropped = {

    ; The RawInfo fields do not include the UDP headers,
    ; only the UDP payload
    ? raw: RawInfo
}
]]></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"
}

StreamState =
    ; bidirectional stream states, RFC 9000 Section 3.4.
    "idle" /
    "open" /
    "half_closed_local" /
    "half_closed_remote" /
    "closed" /
    ; 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"
]]></sourcecode>
        </figure>
        <t>QUIC implementations <bcp14>SHOULD</bcp14> mainly log the simplified bidirectional
(HTTP/2-alike) stream states (e.g., <tt>idle</tt>, <tt>open</tt>, <tt>closed</tt>) instead of the more
fine-grained stream states (e.g., <tt>data_sent</tt>, <tt>reset_received</tt>). 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]
}
]]></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>For example, it can be useful to understand when when data moves from an
application protocol (e.g., HTTP) to QUIC stream buffers and vice versa.
Similarly, when data moves from the application protocol layer into a
user-facing application such as a web browser.</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>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: "user" /
            "application" /
            "transport" /
            "network" /
            text
    ? to: "user" /
          "application" /
          "transport" /
          "network" /
          text
    ? raw: RawInfo
}
]]></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>For example, passing from the application protocol (e.g., WebTransport) to QUIC
Datagram Frame buffers and vice versa. Similarly, when data moves from the
application protocol layer into a user-facing application such as a web browser.</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: "user" /
            "application" /
            "transport" /
            "network" /
            text
    ? to: "user" /
          "application" /
          "transport" /
          "network" /
          text
    ? raw: RawInfo
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="quic-migrationstateupdated">
        <name>migration_state_updated</name>
        <t>Importance: Extra</t>
        <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 ConnectivityPathAssigned event, it can be useful to
explicitly log the progression of the migration and potentially made decisions
in a single location/event.</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
}

; 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="security-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="security-keyupdated-def">
          <name>SecurityKeyUpdated definition</name>
          <sourcecode type="cddl"><![CDATA[
SecurityKeyUpdated = {
    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"
}
]]></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="security-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="security-keydiscarded-def">
          <name>SecurityKeyDiscarded definition</name>
          <sourcecode type="cddl"><![CDATA[
SecurityKeyDiscarded = {
    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"
}
]]></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="recovery-parametersset">
        <name>parameters_set</name>
        <t>The <tt>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>parameters_set</tt> event more than once.</t>
        <figure anchor="recovery-parametersset-def">
          <name>RecoveryParametersSet definition</name>
          <sourcecode type="cddl"><![CDATA[
RecoveryParametersSet = {

    ; 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
}
]]></sourcecode>
        </figure>
        <t>Additionally, this event can contain any number of unspecified fields to support
different recovery approaches.</t>
      </section>
      <section anchor="recovery-metricsupdated">
        <name>metrics_updated</name>
        <t>The <tt>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>metrics_updated</tt> entry, rather
than split out into two). Consequently, a <tt>metrics_updated</tt> event is only
guaranteed to contain at least one of the listed metrics.</t>
        <figure anchor="recovery-metricsupdated-def">
          <name>RecoveryMetricsUpdated definition</name>
          <sourcecode type="cddl"><![CDATA[
RecoveryMetricsUpdated = {

    ; 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
}
]]></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 RecoveryMetricsUpdated 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>metrics_updated</tt> event can contain any number of unspecified fields to support
different recovery approaches.</t>
      </section>
      <section anchor="recovery-congestionstateupdated">
        <name>congestion_state_updated</name>
        <t>The <tt>congestion_state_updated</tt> event signifies 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 event is generic to support different Congestion Control algorithms. For
example, for the algorithm defined in the Recovery draft ("enhanced" New Reno),
the following states are defined:</t>
        <ul spacing="normal">
          <li>slow_start</li>
          <li>congestion_avoidance</li>
          <li>application_limited</li>
          <li>recovery</li>
        </ul>
        <figure anchor="recovery-congestionstateupdated-def">
          <name>RecoveryCongestionStateUpdated definition</name>
          <sourcecode type="cddl"><![CDATA[
RecoveryCongestionStateUpdated = {
    ? old: text
    new: text
    ? trigger:
        "persistent_congestion" /
        "ECN"
}
]]></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 (e.g., slow start is exited only when ssthresh is exceeded).</t>
      </section>
      <section anchor="recovery-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="recovery-losstimerupdated-def">
          <name>RecoveryLossTimerUpdated definition</name>
          <sourcecode type="cddl"><![CDATA[
RecoveryLossTimerUpdated = {

    ; 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
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="recovery-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="recovery-packetlost-def">
          <name>RecoveryPacketLost definition</name>
          <sourcecode type="cddl"><![CDATA[
RecoveryPacketLost = {

    ; 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"
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="recovery-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="recovery-markedforretransmit-def">
          <name>RecoveryMarkedForRetransmit definition</name>
          <sourcecode type="cddl"><![CDATA[
RecoveryMarkedForRetransmit = {
    frames: [+ $QuicFrame]
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="recovery-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="recovery-ecnstateupdated-def">
          <name>ECNStateUpdated definition</name>
          <sourcecode type="cddl"><![CDATA[
ECNStateUpdated = {
   ? old: ECNState
    new: ECNState
}

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-field-definitions">
      <name>QUIC data field 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-and-ipversion">
        <name>IPAddress and IPVersion</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>
        <figure anchor="ipversion-def">
          <name>IPVersion definition</name>
          <sourcecode type="cddl"><![CDATA[
IPVersion = "v4" /
            "v6"
]]></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
    ? ip_v6: IPAddress
    ? port_v4: uint16
    ? 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]
}
]]></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>
        <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 === "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
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="token">
        <name>Token</name>
        <figure anchor="token-def">
          <name>Token definition</name>
          <sourcecode type="cddl"><![CDATA[
Token = {
    ? type: "retry" /
            "resumption"

    ; decoded fields included in the token
    ; (typically: peer's IP address, creation time)
    ? details: {
      * text => any
    }
    ? raw: RawInfo
}
]]></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 extension point (a "socket"
or "plug"). It can be extended to support additional QUIC frame types.</t>
        <figure anchor="quicframe-def">
          <name>QuicFrame plug definition</name>
          <sourcecode type="cddl"><![CDATA[
; The QuicFrame is any key-value map (e.g., JSON object)
$QuicFrame /= {
    * text => any
}
]]></sourcecode>
        </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 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"

    ; total frame length, including frame header
    ? length: uint32
    payload_length: uint32
}
]]></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"

    ; total frame length, including frame header
    ? length: uint32
    ? payload_length: uint32
}
]]></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

    ; total frame length, including frame header
    ? length: uint32
    ? payload_length: uint32
}
]]></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>
          <figure anchor="resetstreamframe-def">
            <name>ResetStreamFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
ResetStreamFrame = {
    frame_type: "reset_stream"
    stream_id: uint64
    error_code: $ApplicationError /
                uint64

    ; in bytes
    final_size: uint64

    ; total frame length, including frame header
    ? length: uint32
    ? payload_length: uint32
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="stopsendingframe">
          <name>StopSendingFrame</name>
          <figure anchor="stopsendingframe-def">
            <name>StopSendingFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
StopSendingFrame = {
    frame_type: "stop_sending"
    stream_id: uint64
    error_code: $ApplicationError /
                uint64

    ; total frame length, including frame header
    ? length: uint32
    ? payload_length: uint32
}
]]></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
    ? payload_length: uint32
    ? 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
}
]]></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
}
]]></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
}
]]></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
}
]]></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
}
]]></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
}
]]></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
}
]]></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
}
]]></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
}
]]></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-bit
  ? data: hexstring
}
]]></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-bit
  ? data: hexstring
}
]]></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. For unknown
frame types, the numerical value without variable-length integer encoding is
used.</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 /
                  uint64
    ? reason: text

    ; when error_space === "transport"
    ? trigger_frame_type: uint64 /
                          text
}
]]></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";
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="unknownframe">
          <name>UnknownFrame</name>
          <t>The frame_type_value field is the numerical value without VLIE encoding.</t>
          <figure anchor="unknownframe-def">
            <name>UnknownFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
UnknownFrame = {
    frame_type: "unknown"
    frame_type_value: 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>
          <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"
                 ; 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 directly. Applications <bcp14>MAY</bcp14> use the provided
extension point through the use of the CDDL "socket" mechanism.</t>
          <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>There are no IANA considerations.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="QLOG-MAIN">
          <front>
            <title>Main logging schema for qlog</title>
            <author fullname="Robin Marx" initials="R." surname="Marx">
              <organization>Akamai</organization>
            </author>
            <author fullname="Luca Niccolini" initials="L." surname="Niccolini">
              <organization>Meta</organization>
            </author>
            <author fullname="Marten Seemann" initials="M." surname="Seemann">
              <organization>Protocol Labs</organization>
            </author>
            <author fullname="Lucas Pardue" initials="L." surname="Pardue">
              <organization>Cloudflare</organization>
            </author>
            <date day="23" month="October" year="2023"/>
            <abstract>
              <t>   This document defines qlog, an extensible high-level schema for a
   standardized logging format.  It allows easy sharing of data,
   benefitting common debug and analysis methods and tooling.  The high-
   level schema is independent of protocol; separate documents extend
   qlog for protocol-specific data.  The schema is also independent of
   serialization format, allowing logs to be represented in many 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-07"/>
        </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, and Christian Huitema 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-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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
aGq49TYBAA==

-->

</rfc>
