<?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-08" 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-08"/>
    <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="July" day="08"/>
    <area>Transport</area>
    <workgroup>QUIC</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>This document describes a qlog event schema containing concrete qlog event
definitions and their metadata for the core QUIC protocol and selected
extensions.</t>
    </abstract>
    <note>
      <name>Note to Readers</name>
      <ul empty="true">
        <li>
          <t>Note to RFC editor: Please remove this section before publication.</t>
        </li>
      </ul>
      <t>Feedback and discussion are welcome at
<eref target="https://github.com/quicwg/qlog">https://github.com/quicwg/qlog</eref>. Readers are
advised to refer to the "editor's draft" at that URL for an up-to-date version
of this document.</t>
      <t>Concrete examples of integrations of this schema in
various programming languages can be found at
<eref target="https://github.com/quiclog/qlog/">https://github.com/quiclog/qlog/</eref>.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>This document defines a qlog event schema (<xref section="8" sectionFormat="of" target="QLOG-MAIN"/>)
containing concrete events for the core QUIC protocol (see
<xref target="QUIC-TRANSPORT"/>, <xref target="QUIC-RECOVERY"/>, and
<xref target="QUIC-TLS"/>) and some of its extensions (see
<xref target="QUIC-DATAGRAM"/> and <xref target="GREASEBIT"/>).</t>
      <t>The event schema namespace <tt>quic</tt> is defined, containing the categories:
<tt>connectivity</tt> (<xref target="conn-ev"/>), <tt>security</tt> (<xref target="sec-ev"/>), <tt>quic</tt> <xref target="quic-ev"/>, and
<tt>recovery</tt> <xref target="rec-ev"/>. Across these categories multiple events derive from the
qlog abstract Event class (<xref section="7" sectionFormat="of" target="QLOG-MAIN"/>), each extending the
"data" field and defining their "name" field values and semantics. Some 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>
      <figure anchor="protocoltype-extension-quic">
        <name>ProtocolType extension for QUIC</name>
        <sourcecode type="cddl"><![CDATA[
$ProtocolType /= "QUIC"
]]></sourcecode>
      </figure>
      <section anchor="use-of-group-ids">
        <name>Use of group IDs</name>
        <t>When the qlog <tt>group_id</tt> field is used, it is recommended to use QUIC's Original
Destination Connection ID (ODCID, the CID chosen by the client when first
contacting the server), as this is the only value that does not change over the
course of the connection and can be used to link more advanced QUIC packets (e.g.,
Retry, Version Negotiation) to a given connection. Similarly, the ODCID should be
used as the qlog filename or file identifier, potentially suffixed by the
vantagepoint type (For example, abcd1234_server.qlog would contain the server-side
trace of the connection with ODCID abcd1234).</t>
      </section>
      <section anchor="raw-packet-and-frame-information">
        <name>Raw packet and frame information</name>
        <t>QUIC packets always include an AEAD authentication tag at the end. In general,
the length of the AEAD tag depends on the TLS cipher suite, although all cipher
suites used in QUIC v1 use a 16 byte tag. For the purposes of calculating the
lengths in fields of type RawInfo (as defined in <xref target="QLOG-MAIN"/>) related to QUIC
packets, the AEAD tag is regarded as a trailer.</t>
      </section>
      <section anchor="handling-unknown-connections">
        <name>Events not belonging to a single connection</name>
        <t>A single qlog event trace is typically associated with a single QUIC connection.
However, for several types of events (for example, a <xref target="quic-packetdropped"/>
event with trigger value of <tt>connection_unknown</tt>), it can be impossible to tie
them to a specific QUIC connection, especially on the server.</t>
        <t>There are various ways to handle these events, each making certain tradeoffs
between file size overhead, flexibility, ease of use, or ease of
implementation. Some options include:</t>
        <ul spacing="normal">
          <li>Log them in a separate endpoint-wide trace (or use a special <tt>group_id</tt> value)
not associated with a single connection.</li>
          <li>Log them in the most recently used trace.</li>
          <li>Use additional heuristics for connection identification (for example use the
four-tuple in addition to the Connection ID).</li>
          <li>Buffer events until they can be assigned to a connection (for example for
version negotiation and retry events).</li>
        </ul>
      </section>
      <section anchor="notational-conventions">
        <name>Notational Conventions</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <t>The event and data structure definitions in ths document are expressed
in the Concise Data Definition Language <xref target="CDDL"/> and its
extensions described in <xref target="QLOG-MAIN"/>.</t>
        <t>The following fields from <xref target="QLOG-MAIN"/> are imported and used: name, 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="schema-def">
      <name>Event Schema Definition</name>
      <t>This document describes how the core QUIC protocol and selected extensions can
be expressed in qlog using a newly defined event schema. Per the requirements in
<xref section="8" sectionFormat="of" target="QLOG-MAIN"/>, this document registers the <tt>quic</tt> namespace and the
following category identifiers and URIs.</t>
      <ul spacing="normal">
        <li>
          <tt>connectivity</tt> - <tt>urn:ietf:params:qlog:events:quic#connectivity</tt></li>
        <li>
          <tt>security</tt> - <tt>urn:ietf:params:qlog:events:quic#security</tt></li>
        <li>
          <tt>quic</tt> - <tt>urn:ietf:params:qlog:events:quic#quic</tt></li>
        <li>
          <tt>recovery</tt> - <tt>urn:ietf:params:qlog:events:quic#recovery</tt></li>
      </ul>
      <section removeInRFC="true" anchor="draft-event-schema-identification">
        <name>Draft Event Schema Identification</name>
        <t>Only implementations of the final, published RFC can use the events belonging to
the category with the URIs <tt>urn:ietf:params:qlog:events:quic#connectivity</tt>,
<tt>urn:ietf:params:qlog:events:quic#security</tt>,
<tt>urn:ietf:params:qlog:events:quic#quic</tt>, and
<tt>urn:ietf:params:qlog:events:quic#recovery</tt>. Until such an RFC exists,
implementations <bcp14>MUST NOT</bcp14> identify themselves using this URI.</t>
        <t>Implementations of draft versions of the event schema <bcp14>MUST</bcp14> append the string
"-" and the corresponding draft number to the URI. For example, draft 07 of this
document is identified using the URI <tt>urn:ietf:params:qlog:events:quic#quic-07</tt>.</t>
        <t>The category identifier itself is not affected by this requirement.</t>
      </section>
    </section>
    <section anchor="quic-event-overview">
      <name>QUIC Event Overview</name>
      <t><xref target="quic-events"/> summarizes the name value of each event type that is defined in
this specification.</t>
      <table anchor="quic-events">
        <name>QUIC Events</name>
        <thead>
          <tr>
            <th align="left">Name value</th>
            <th align="left">Importance</th>
            <th align="left">Definition</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">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:udp_datagrams_sent</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-udpdatagramssent"/></td>
          </tr>
          <tr>
            <td align="left">quic:udp_datagrams_received</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-udpdatagramsreceived"/></td>
          </tr>
          <tr>
            <td align="left">quic:udp_datagram_dropped</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-udpdatagramdropped"/></td>
          </tr>
          <tr>
            <td align="left">quic:stream_state_updated</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-streamstateupdated"/></td>
          </tr>
          <tr>
            <td align="left">quic:frames_processed</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-framesprocessed"/></td>
          </tr>
          <tr>
            <td align="left">quic:stream_data_moved</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-streamdatamoved"/></td>
          </tr>
          <tr>
            <td align="left">quic:datagram_data_moved</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-datagramdatamoved"/></td>
          </tr>
          <tr>
            <td align="left">quic:migration_state_updated</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-migrationstateupdated"/></td>
          </tr>
          <tr>
            <td align="left">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"/>. Additionally, they allow for direct extensibility by their use of
per-event extension points via the <tt>$$</tt> CDDL "group socket" syntax, as also
described in <xref target="QLOG-MAIN"/>.</t>
      <figure anchor="quicevent-data-def">
        <name>QuicEventData definition and ProtocolEventData extension</name>
        <sourcecode type="cddl"><![CDATA[
QuicEventData = ConnectivityServerListening /
                ConnectivityConnectionStarted /
                ConnectivityConnectionClosed /
                ConnectivityConnectionIDUpdated /
                ConnectivitySpinBitUpdated /
                ConnectivityConnectionStateUpdated /
                ConnectivityPathAssigned /
                ConnectivityMTUUpdated /
                SecurityKeyUpdated /
                SecurityKeyDiscarded /
                QUICVersionInformation /
                QUICALPNInformation /
                QUICParametersSet /
                QUICParametersRestored /
                QUICPacketSent /
                QUICPacketReceived /
                QUICPacketDropped /
                QUICPacketBuffered /
                QUICPacketsAcked /
                QUICUDPDatagramsSent /
                QUICUDPDatagramsReceived /
                QUICUDPDatagramDropped /
                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

    * $$connectivity-serverlistening-extension
}
]]></sourcecode>
        </figure>
        <t>Some QUIC stacks do not handle sockets directly and are thus unable to log
IP and/or port information.</t>
      </section>
      <section anchor="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

    * $$connectivity-connectionstarted-extension
}
]]></sourcecode>
        </figure>
        <t>Some QUIC stacks do not handle sockets directly and are thus unable to log
IP and/or port information.</t>
      </section>
      <section anchor="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>The <tt>connection_closed</tt> event is intended to be logged either when the local
endpoint silently discards the connection due to an idle timeout, when a
CONNECTION_CLOSE frame is sent (the connection enters the 'closing' state on the
sender side), when a CONNECTION_CLOSE frame is received (the connection enters
the 'draining' state on the receiver side) or when a Stateless Reset packet is
received (the connection is discarded at the receiver side).
Connectivity-related updates after this point (e.g., exiting a 'closing' or
'draining' state), should be logged using the <tt>connection_state_updated</tt> event
instead.</t>
        <t>In QUIC there are two main connection-closing error categories: connection and
application errors. They have well-defined error codes and semantics. Next to
these however, there can be internal errors that occur that may or may not get
mapped to the official error codes in implementation-specific ways. As such,
multiple error codes can be set on the same event to reflect this.</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:
        "idle_timeout" /
        "application" /
        "error" /
        "version_mismatch" /
        ; when received from peer
        "stateless_reset" /
        ; when it is unclear what triggered the CONNECTION_CLOSE
        "unspecified"

    * $$connectivity-connectionclosed-extension
}
]]></sourcecode>
        </figure>
        <t>Loggers <bcp14>SHOULD</bcp14> use the most descriptive trigger for a <tt>connection_closed</tt> event
that they are able to deduce. This is often clear at the peer closing the
connection (and sending the CONNECTION_CLOSE), but can sometimes be more opaque
at the receiving end.</t>
      </section>
      <section anchor="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

    * $$connectivity-connectionidupdated-extension
}
]]></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

    * $$connectivity-spinbitupdated-extension
}
]]></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><xref target="QUIC-TRANSPORT"/> does not contain an exhaustive flow diagram with possible
connection states nor their transitions (though some are explicitly mentioned,
like the 'closing' and 'draining' states). As such, this document
<strong>non-exhaustively</strong> defines those states that are most likely to be useful for
debugging QUIC connections.</t>
        <t>QUIC implementations <bcp14>SHOULD</bcp14> mainly log the simplified BaseConnectionStates,
adding the more fine-grained GranularConnectionStates when more in-depth
debugging is required. Tools <bcp14>SHOULD</bcp14> be able to deal with both types equally.</t>
        <figure anchor="connectivity-connectionstateupdated-def">
          <name>ConnectivityConnectionStateUpdated definition</name>
          <sourcecode type="cddl"><![CDATA[
ConnectivityConnectionStateUpdated = {
    ? old: $ConnectionState
    new: $ConnectionState

    * $$connectivity-connectionstateupdated-extension
}

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

    ; Handshake packet sent/received
    "handshake_started" /

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

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

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

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

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

    ; CONNECTION_CLOSE sent
    "closing" /

    ; CONNECTION_CLOSE received
    "draining" /

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

$ConnectionState /= BaseConnectionStates / GranularConnectionStates
]]></sourcecode>
        </figure>
        <t>The <tt>connection_state_changed</tt> event has some overlap with the
<tt>connection_closed</tt> and <tt>connection_started</tt> events, and the handling of various
frames (for example in a <tt>packet_received</tt> event). Still, it can be useful to
log these logical state transitions separately, especially if they map to an
internal implementation state machine, to explicitly track progress. As such,
implementations are allowed to use other ConnectionState values that adhere more
closely to their internal logic. Tools <bcp14>SHOULD</bcp14> be able to deal with these custom
states in a similar way to the pre-defined states in this document.</t>
      </section>
      <section anchor="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

    * $$connectivity-pathassigned-extension
}
]]></sourcecode>
        </figure>
        <t>Choosing the different <tt>path_id</tt> values is left up to the implementation. Some
options include using a uniquely incrementing integer, using the (first)
Destination Connection ID associated with a path (or its sequence number), or
using (a hash of) the two endpoint IP addresses.</t>
        <t>It is important to note that the empty string ("") is a valid PathID and that it
is the default assigned to events that do not explicitly set a "path" field. Put
differently, the initial path of a QUIC connection on which the handshake occurs
(see also <xref target="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

    * $$connectivity-mtuupdated-extension
}
]]></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

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

    * $$quic-alpninformation-extension
}

ALPNIdentifier = {
  ? byte_value: hexstring
  ? string_value: text
}
]]></sourcecode>
        </figure>
        <t>Intended use:</t>
        <ul spacing="normal">
          <li>When sending an initial, the client logs this event with <tt>client_alpns</tt> set</li>
          <li>When receiving an initial with a supported alpn, the server logs this event
with <tt>server_alpns</tt> set, <tt>client_alpns</tt> equalling the client-provided list,
and chosen_alpn to the value it will send back to the client.</li>
          <li>When receiving an initial with an alpn, the client logs this event with
<tt>chosen_alpn</tt> to the received value.</li>
          <li>Alternatively, a client can choose to not log the first event, but wait for
the receipt of the server initial to log this event with both <tt>client_alpns</tt>
and <tt>chosen_alpn</tt> set.</li>
        </ul>
      </section>
      <section anchor="quic-parametersset">
        <name>parameters_set</name>
        <t>The <tt>parameters_set</tt> event groups settings from several different sources
(transport parameters, TLS ciphers, etc.) into a single event. This is done to
minimize the amount of events and to decouple conceptual setting impacts from
their underlying mechanism for easier high-level reasoning. The event has Core
importance level; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</t>
        <t>Most of these settings are typically set once and never change. However, they
are usually set at different times during the connection, so there will
regularly be several instances of this event with different fields set.</t>
        <t>Note that some settings have two variations (one set locally, one requested by the
remote peer). This is reflected in the <tt>owner</tt> field. As such, this field <bcp14>MUST</bcp14> be
correct for all settings included a single event instance. If you need to log
settings from two sides, you <bcp14>MUST</bcp14> emit two separate event instances.</t>
        <t>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>
      </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>
      </section>
      <section anchor="quic-packetsent">
        <name>packet_sent</name>
        <t>The <tt>packet_sent</tt> event indicates a QUIC-level packet was sent. It has Core
importance level; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</t>
        <figure anchor="quic-packetsent-def">
          <name>QUICPacketSent definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICPacketSent = {
    header: PacketHeader
    ? frames: [* $QuicFrame]

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

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

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

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

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

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

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

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

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

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

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

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

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

    ; to support passing multiple at once
    ? count: uint16

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

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

    ? datagram_ids: [+ uint32]

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

    ; to support passing multiple at once
    ? count: uint16

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

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

    ? datagram_ids: [+ uint32]

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

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

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

QUICStreamStateUpdated = {
    stream_id: uint64

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

    * $$quic-streamstateupdated-extension
}

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

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

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

    * $$quic-framesprocessed-extension
}
]]></sourcecode>
        </figure>
        <t>For example, an instance of the <tt>frames_processed</tt> event that represents four
STREAM frames received over two packets would have the fields serialized as:</t>
        <artwork><![CDATA[
"frames":[
  {"frame_type":"stream","stream_id":0,"offset":0,"length":500},
  {"frame_type":"stream","stream_id":0,"offset":500,"length":200},
  {"frame_type":"stream","stream_id":1,"offset":0,"length":300},
  {"frame_type":"stream","stream_id":1,"offset":300,"length":50}
  ],
"packet_numbers":[
  1,
  1,
  2,
  2
]
]]></artwork>
      </section>
      <section anchor="quic-streamdatamoved">
        <name>stream_data_moved</name>
        <t>The <tt>stream_data_moved</tt> event is used to indicate when QUIC stream data moves
between the different layers. This helps make clear the flow of data, how long
data remains in various buffers, and the overheads introduced by individual
layers. The event has Base importance level; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</t>
        <t>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>The <tt>additional_info</tt> field supports optional logging of information
related to the stream state. For example, an application layer that moves data
into transport and simultaneously ends the stream, can log <tt>fin_set</tt>. As
another example, a transport layer that has received an instruction to reset a
stream can indicate this to the application layer using <tt>reset_stream</tt>.
In both cases, the length-carrying fields (<tt>length</tt> or <tt>raw</tt>) can be
omitted or contain zero values.</t>
        <t>This event is only for data in QUIC streams. For data in QUIC Datagram Frames,
see the <tt>datagram_data_moved</tt> event defined in <xref target="quic-datagramdatamoved"/>.</t>
        <figure anchor="quic-streamdatamoved-def">
          <name>QUICStreamDataMoved definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICStreamDataMoved = {
    ? stream_id: uint64
    ? offset: uint64

    ; byte length of the moved data
    ? length: uint64

    ? from: $DataLocation
    ? to: $DataLocation

    ? additional_info: $DataMovedAdditionalInfo

    ? raw: RawInfo

    * $$quic-streamdatamoved-extension
}

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

$DataMovedAdditionalInfo /= "fin_set" /
                            "stream_reset"
]]></sourcecode>
        </figure>
      </section>
      <section anchor="quic-datagramdatamoved">
        <name>datagram_data_moved</name>
        <t>The <tt>datagram_data_moved</tt> event is used to indicate when QUIC Datagram Frame
data (see <xref target="RFC9221"/>) moves between the different layers. This helps make
clear the flow of data, how long data remains in various buffers, and the
overheads introduced by individual layers. The event has Base importance level;
see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</t>
        <t>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: $DataLocation
    ? to: $DataLocation
    ? raw: RawInfo

    * $$quic-datagramdatamoved-extension
}
]]></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

    * $$quic-migrationstateupdated-extension
}

; Note that MigrationState does not describe a full state machine
; These entries are not necessarily chronological,
; nor will they always all appear during
; a connection migration attempt.
MigrationState =
    ; probing packets are sent, migration not initiated yet
    "probing_started" /
    ; did not get reply to probing packets,
    ; discarding path as an option
    "probing_abandoned" /
    ; received reply to probing packets, path is migration candidate
    "probing_successful" /
    ; non-probing packets are sent, attempting migration
    "migration_started" /
    ; something went wrong during the migration, abandoning attempt
    "migration_abandoned" /
    ; new path is now fully used, old path is discarded
    "migration_complete"
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section anchor="sec-ev">
      <name>Security Events</name>
      <section anchor="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"

    * $$quic-keyupdated-extension
}
]]></sourcecode>
        </figure>
        <t>Note that the key_phase is the full value of the key phase (as indicated by
@M and @N in Figure 9 of <xref target="QUIC-TLS"/>). The key phase bit used on
the packet header is the least significant bit of the key phase.</t>
      </section>
      <section anchor="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"

    * $$quic-keydiscarded-extension
}
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section anchor="rec-ev">
      <name>Recovery events</name>
      <t>Most of the events in this category are kept generic to support different
recovery approaches and various congestion control algorithms. Tool creators
<bcp14>SHOULD</bcp14> make an effort to support and visualize even unknown data in these events
(e.g., plot unknown congestion states by name on a timeline visualization).</t>
      <section anchor="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

    * $$recovery-parametersset-extension
}
]]></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

    * $$recovery-metricsupdated-extension
}
]]></sourcecode>
        </figure>
        <t>In order to make logging easier, implementations <bcp14>MAY</bcp14> log values even if they are the
same as previously reported values (e.g., two subsequent 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 indicates when the congestion controller
enters a significant new state and changes its behaviour. It has Base importance
level; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</t>
        <t>The values of the event's fields are intentionally unspecified here in order to
support different Congestion Control algorithms, as these typically have
different states and even different implementations of these states across
stacks. For example, for the algorithm defined in the Recovery draft ("enhanced"
New Reno), the following states are used: Slow Start, Congestion Avoidance,
Application Limited and Recovery. Similarly, states can be triggered by a
variety of events, including detection of Persistent Congestion or receipt of
ECN markings.</t>
        <figure anchor="recovery-congestionstateupdated-def">
          <name>RecoveryCongestionStateUpdated definition</name>
          <sourcecode type="cddl"><![CDATA[
RecoveryCongestionStateUpdated = {
    ? old: text
    new: text
    ? trigger: text

    * $$recovery-congestionstateupdated-extension
}
]]></sourcecode>
        </figure>
        <t>The <tt>trigger</tt> field <bcp14>SHOULD</bcp14> be logged if there are multiple ways in which a state
change can occur but <bcp14>MAY</bcp14> be omitted if a given state can only be due to a single
event occurring (for example Slow Start is often exited only when ssthresh is
exceeded).</t>
      </section>
      <section anchor="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

    * $$recovery-losstimerupdated-extension
}
]]></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"

    * $$recovery-packetlost-extension
}
]]></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]

    * $$recovery-markedforretransmit-extension
}
]]></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

    * $$recovery-ecnstateupdated-extension
}

ECNState =
  ; ECN testing in progress
  "testing" /
  ; ECN state unknown, waiting for acknowledgements
  ; for testing packets
  "unknown" /
  ; ECN testing failed
  "failed" /
  ; testing was successful, the endpoint now
  ; sends packets with ECT(0) marking
  "capable"
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section anchor="quic-data-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]

    * $$quic-pathendpointinfo-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="packettype">
        <name>PacketType</name>
        <figure anchor="packettype-def">
          <name>PacketType definition</name>
          <sourcecode type="cddl"><![CDATA[
$PacketType /=  "initial" /
                "handshake" /
                "0RTT" /
                "1RTT" /
                "retry" /
                "version_negotiation" /
                "stateless_reset" /
                "unknown"
]]></sourcecode>
        </figure>
      </section>
      <section anchor="packetnumberspace">
        <name>PacketNumberSpace</name>
        <figure anchor="packetnumberspace-def">
          <name>PacketNumberSpace definition</name>
          <sourcecode type="cddl"><![CDATA[
$PacketNumberSpace /= "initial" /
                      "handshake" /
                      "application_data"
]]></sourcecode>
        </figure>
      </section>
      <section anchor="packetheader">
        <name>PacketHeader</name>
        <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

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

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

    * $$quic-token-extension
}

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

$QuicFrame /= QuicBaseFrames
]]></sourcecode>
        </figure>
        <section anchor="paddingframe">
          <name>PaddingFrame</name>
          <t>In QUIC, PADDING frames are simply identified as a single byte of value 0. As
such, each padding byte could be theoretically interpreted and logged as an
individual PaddingFrame.</t>
          <t>However, as this leads to heavy logging overhead, implementations <bcp14>SHOULD</bcp14> instead
emit just a single PaddingFrame and set the 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>
          <t>The CONNECTION_CLOSE reason phrase is a byte sequences. It is likely that this
sequence is presentable as UTF-8, in which case it can be logged in the <tt>reason</tt>
field. The <tt>reason_bytes</tt> field supports logging the raw bytes, which can be useful
when the value is not UTF-8 or when an endpoint does not want to decode it.
Implementations <bcp14>SHOULD</bcp14> log at least one format, but <bcp14>MAY</bcp14> log both or none.</t>
          <figure anchor="connectioncloseframe-def">
            <name>ConnectionCloseFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
ErrorSpace = "transport" /
             "application"

ConnectionCloseFrame = {
    frame_type: "connection_close"
    ? error_space: ErrorSpace
    ? error_code: $TransportError /
                  CryptoError /
                  $ApplicationError /
                  uint64
    ? reason: text
    ? reason_bytes: hexstring

    ; 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_bytes field is the numerical value without variable-length
integer encoding.</t>
          <figure anchor="unknownframe-def">
            <name>UnknownFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
UnknownFrame = {
    frame_type: "unknown"
    frame_type_bytes: uint64
    ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="datagramframe">
          <name>DatagramFrame</name>
          <t>The QUIC DATAGRAM frame is defined in <xref section="4" sectionFormat="of" target="RFC9221"/>.</t>
          <figure anchor="datagramframe-def">
            <name>DatagramFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
DatagramFrame = {
    frame_type: "datagram"
    ? length: uint64
    ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="transporterror">
          <name>TransportError</name>
          <t>The generic <tt>$TransportError</tt> is defined here as a CDDL "type socket" extension
point. It can be extended to support additional Transport errors.</t>
          <figure anchor="transporterror-def">
            <name>TransportError definition</name>
            <sourcecode type="cddl"><![CDATA[
$TransportError /= "no_error" /
                 "internal_error" /
                 "connection_refused" /
                 "flow_control_error" /
                 "stream_limit_error" /
                 "stream_state_error" /
                 "final_size_error" /
                 "frame_encoding_error" /
                 "transport_parameter_error" /
                 "connection_id_limit_error" /
                 "protocol_violation" /
                 "invalid_token" /
                 "application_error" /
                 "crypto_buffer_exceeded" /
                 "key_update_error" /
                 "aead_limit_reached" /
                 "no_viable_path"
                 ; 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. It is instead defined as an empty
CDDL "type socket" extension point.</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>This document registers several new entries in the "qlog event category URIs"
registry.</t>
      <dl>
        <dt>Event Category URI:</dt>
        <dd>
          <t>urn:ietf:params:qlog:events:quic#connectivity</t>
        </dd>
        <dt>Description:</dt>
        <dd>
          <t>Event definitions related to QUIC connectivity.</t>
        </dd>
        <dt>Reference:</dt>
        <dd>
          <t><xref target="conn-ev"/></t>
        </dd>
        <dt>Event Category URI:</dt>
        <dd>
          <t>urn:ietf:params:qlog:events:quic#security</t>
        </dd>
        <dt>Description:</dt>
        <dd>
          <t>Event definitions related to QUIC security.</t>
        </dd>
        <dt>Reference:</dt>
        <dd>
          <t><xref target="sec-ev"/></t>
        </dd>
        <dt>Event Category URI:</dt>
        <dd>
          <t>urn:ietf:params:qlog:events:quic#quic</t>
        </dd>
        <dt>Description:</dt>
        <dd>
          <t>Event definitions related to the QUIC wire image and other concerns.</t>
        </dd>
        <dt>Reference:</dt>
        <dd>
          <t><xref target="quic-ev"/></t>
        </dd>
        <dt>Event Category URI:</dt>
        <dd>
          <t>urn:ietf:params:qlog:events:quic#recovery</t>
        </dd>
        <dt>Description:</dt>
        <dd>
          <t>Event definitions related to QUIC recovery.</t>
        </dd>
        <dt>Reference:</dt>
        <dd>
          <t><xref target="conn-ev"/></t>
        </dd>
      </dl>
    </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">
         </author>
            <author fullname="Lucas Pardue" initials="L." surname="Pardue">
              <organization>Cloudflare</organization>
            </author>
            <date day="4" month="March" year="2024"/>
            <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-08"/>
        </reference>
        <reference anchor="QUIC-TRANSPORT">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="QUIC-RECOVERY">
          <front>
            <title>QUIC Loss Detection and Congestion Control</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="I. Swett" initials="I." role="editor" surname="Swett"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document describes loss detection and congestion control mechanisms for QUIC.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9002"/>
          <seriesInfo name="DOI" value="10.17487/RFC9002"/>
        </reference>
        <reference anchor="QUIC-TLS">
          <front>
            <title>Using TLS to Secure QUIC</title>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <author fullname="S. Turner" initials="S." role="editor" surname="Turner"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document describes how Transport Layer Security (TLS) is used to secure QUIC.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9001"/>
          <seriesInfo name="DOI" value="10.17487/RFC9001"/>
        </reference>
        <reference anchor="QUIC-DATAGRAM">
          <front>
            <title>An Unreliable Datagram Extension to QUIC</title>
            <author fullname="T. Pauly" initials="T." surname="Pauly"/>
            <author fullname="E. Kinnear" initials="E." surname="Kinnear"/>
            <author fullname="D. Schinazi" initials="D." surname="Schinazi"/>
            <date month="March" year="2022"/>
            <abstract>
              <t>This document defines an extension to the QUIC transport protocol to add support for sending and receiving unreliable datagrams over a QUIC connection.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9221"/>
          <seriesInfo name="DOI" value="10.17487/RFC9221"/>
        </reference>
        <reference anchor="GREASEBIT">
          <front>
            <title>Greasing the QUIC Bit</title>
            <author fullname="M. Thomson" initials="M." surname="Thomson"/>
            <date month="August" year="2022"/>
            <abstract>
              <t>This document describes a method for negotiating the ability to send an arbitrary value for the second-most significant bit in QUIC packets.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9287"/>
          <seriesInfo name="DOI" value="10.17487/RFC9287"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="CDDL">
          <front>
            <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <author fullname="C. Vigano" initials="C." surname="Vigano"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="June" year="2019"/>
            <abstract>
              <t>This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049). Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8610"/>
          <seriesInfo name="DOI" value="10.17487/RFC8610"/>
        </reference>
        <reference anchor="RFC9221">
          <front>
            <title>An Unreliable Datagram Extension to QUIC</title>
            <author fullname="T. Pauly" initials="T." surname="Pauly"/>
            <author fullname="E. Kinnear" initials="E." surname="Kinnear"/>
            <author fullname="D. Schinazi" initials="D." surname="Schinazi"/>
            <date month="March" year="2022"/>
            <abstract>
              <t>This document defines an extension to the QUIC transport protocol to add support for sending and receiving unreliable datagrams over a QUIC connection.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9221"/>
          <seriesInfo name="DOI" value="10.17487/RFC9221"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="RFC7301">
          <front>
            <title>Transport Layer Security (TLS) Application-Layer Protocol Negotiation Extension</title>
            <author fullname="S. Friedl" initials="S." surname="Friedl"/>
            <author fullname="A. Popov" initials="A." surname="Popov"/>
            <author fullname="A. Langley" initials="A." surname="Langley"/>
            <author fullname="E. Stephan" initials="E." surname="Stephan"/>
            <date month="July" year="2014"/>
            <abstract>
              <t>This document describes a Transport Layer Security (TLS) extension for application-layer protocol negotiation within the TLS handshake. For instances in which multiple application protocols are supported on the same TCP or UDP port, this extension allows the application layer to negotiate which protocol will be used within the TLS connection.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7301"/>
          <seriesInfo name="DOI" value="10.17487/RFC7301"/>
        </reference>
      </references>
    </references>
    <section numbered="false" anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>Much of the initial work by Robin Marx was done at the Hasselt and KU Leuven
Universities.</t>
      <t>Thanks to Jana Iyengar, Brian Trammell, Dmitri Tikhonov, Stephen Petrides, Jari
Arkko, Marcus Ihlar, Victor Vasiliev, Mirja Kuehlewind, Jeremy Laine, Kazu
Yamamoto, Christian Huitema, Hugo Landau and Jonathan Lennox for their feedback
and suggestions.</t>
    </section>
    <section numbered="false" removeInRFC="true" anchor="change-log">
      <name>Change Log</name>
      <section numbered="false" anchor="since-draft-ietf-qlog-quic-events-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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
4S6aQICEtDVYD0AJuZkJ3tD/BRS5oWhFSAEA

-->

</rfc>
