<?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-09" 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-09"/>
    <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="October" day="21"/>
    <area>Transport</area>
    <workgroup>QUIC</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>This document describes a qlog event schema containing concrete qlog event
definitions and their metadata for the core QUIC protocol and selected
extensions.</t>
    </abstract>
    <note>
      <name>Note to Readers</name>
      <ul empty="true">
        <li>
          <t>Note to RFC editor: Please remove this section before publication.</t>
        </li>
      </ul>
      <t>Feedback and discussion are welcome at
<eref target="https://github.com/quicwg/qlog">https://github.com/quicwg/qlog</eref>. Readers are
advised to refer to the "editor's draft" at that URL for an up-to-date version
of this document.</t>
      <t>Concrete examples of integrations of this schema in
various programming languages can be found at
<eref target="https://github.com/quiclog/qlog/">https://github.com/quiclog/qlog/</eref>.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>This document defines a qlog event schema (<xref section="8" sectionFormat="of" target="QLOG-MAIN"/>)
containing concrete events for the core QUIC protocol (see
<xref target="QUIC-TRANSPORT"/>, <xref target="QUIC-RECOVERY"/>, and
<xref target="QUIC-TLS"/>) and some of its extensions (see
<xref target="QUIC-DATAGRAM"/> and <xref target="GREASEBIT"/>).</t>
      <t>The event namespace with identifier <tt>quic</tt> is defined; see <xref target="schema-def"/>. In
this namespace multiple events derive from the qlog abstract Event class
(<xref section="7" sectionFormat="of" target="QLOG-MAIN"/>), each extending the "data" field and defining their
"name" field values and semantics. Some event data fields use complex data
types. These are represented as enums or re-usable definitions, which are
grouped together on the bottom of this document for clarity.</t>
      <t>When any event from this document is included in a qlog trace, the
<tt>protocol_types</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, namespace,
type, data, group_id, protocol_types, importance, RawInfo, and time-related
fields.</t>
        <t>As is the case for <xref target="QLOG-MAIN"/>, the qlog schema definitions in this document
are intentionally agnostic to serialization formats. The choice of format is an
implementation decision.</t>
      </section>
    </section>
    <section anchor="schema-def">
      <name>Event Schema Definition</name>
      <t>This document describes how the core QUIC protocol and selected extensions can
be expressed in qlog using a newly defined event schema. Per the requirements in
<xref section="8" sectionFormat="of" target="QLOG-MAIN"/>, this document registers the <tt>quic</tt> namespace. The
event schema URI is <tt>urn:ietf:params:qlog:events:quic</tt>.</t>
      <section removeInRFC="true" anchor="draft-event-schema-identification">
        <name>Draft Event Schema Identification</name>
        <t>Only implementations of the final, published RFC can use the events belonging to
the event schema with the URI <tt>urn:ietf:params:qlog:events:quic</tt>. Until such an
RFC exists, implementations <bcp14>MUST NOT</bcp14> identify themselves using this URI.</t>
        <t>Implementations of draft versions of the event schema <bcp14>MUST</bcp14> append the string
"-" and the corresponding draft number to the URI. For example, draft 07 of this
document is identified using the URI <tt>urn:ietf:params:qlog:events:quic-07</tt>.</t>
        <t>The namespace identifier itself is not affected by this requirement.</t>
      </section>
    </section>
    <section anchor="quic-event-overview">
      <name>QUIC Event Overview</name>
      <t><xref target="quic-events"/> summarizes the name value of each event type that is defined in
this specification.</t>
      <table anchor="quic-events">
        <name>QUIC Events</name>
        <thead>
          <tr>
            <th align="left">Name value</th>
            <th align="left">Importance</th>
            <th align="left">Definition</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">quic:server_listening</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-serverlistening"/></td>
          </tr>
          <tr>
            <td align="left">quic:connection_started</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-connectionstarted"/></td>
          </tr>
          <tr>
            <td align="left">quic:connection_closed</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-connectionclosed"/></td>
          </tr>
          <tr>
            <td align="left">quic:connection_id_updated</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-connectionidupdated"/></td>
          </tr>
          <tr>
            <td align="left">quic:spin_bit_updated</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-spinbitupdated"/></td>
          </tr>
          <tr>
            <td align="left">quic:connection_state_updated</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-connectionstateupdated"/></td>
          </tr>
          <tr>
            <td align="left">quic:path_assigned</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-pathassigned"/></td>
          </tr>
          <tr>
            <td align="left">quic:mtu_updated</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-mtuupdated"/></td>
          </tr>
          <tr>
            <td align="left">quic:version_information</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="quic-versioninformation"/></td>
          </tr>
          <tr>
            <td align="left">quic:alpn_information</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="quic-alpninformation"/></td>
          </tr>
          <tr>
            <td align="left">quic:parameters_set</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="quic-parametersset"/></td>
          </tr>
          <tr>
            <td align="left">quic:parameters_restored</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-parametersrestored"/></td>
          </tr>
          <tr>
            <td align="left">quic:packet_sent</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="quic-packetsent"/></td>
          </tr>
          <tr>
            <td align="left">quic:packet_received</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="quic-packetreceived"/></td>
          </tr>
          <tr>
            <td align="left">quic:packet_dropped</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-packetdropped"/></td>
          </tr>
          <tr>
            <td align="left">quic:packet_buffered</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-packetbuffered"/></td>
          </tr>
          <tr>
            <td align="left">quic:packets_acked</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-packetsacked"/></td>
          </tr>
          <tr>
            <td align="left">quic:udp_datagrams_sent</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-udpdatagramssent"/></td>
          </tr>
          <tr>
            <td align="left">quic:udp_datagrams_received</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-udpdatagramsreceived"/></td>
          </tr>
          <tr>
            <td align="left">quic:udp_datagram_dropped</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-udpdatagramdropped"/></td>
          </tr>
          <tr>
            <td align="left">quic:stream_state_updated</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-streamstateupdated"/></td>
          </tr>
          <tr>
            <td align="left">quic:frames_processed</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-framesprocessed"/></td>
          </tr>
          <tr>
            <td align="left">quic:stream_data_moved</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-streamdatamoved"/></td>
          </tr>
          <tr>
            <td align="left">quic:datagram_data_moved</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-datagramdatamoved"/></td>
          </tr>
          <tr>
            <td align="left">quic:migration_state_updated</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-migrationstateupdated"/></td>
          </tr>
          <tr>
            <td align="left">quic:key_updated</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-keyupdated"/></td>
          </tr>
          <tr>
            <td align="left">quic:key_discarded</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-keydiscarded"/></td>
          </tr>
          <tr>
            <td align="left">quic:recovery_parameters_set</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-recoveryparametersset"/></td>
          </tr>
          <tr>
            <td align="left">quic:recovery_metrics_updated</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="quic-recoverymetricsupdated"/></td>
          </tr>
          <tr>
            <td align="left">quic:congestion_state_updated</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="quic-congestionstateupdated"/></td>
          </tr>
          <tr>
            <td align="left">quic:loss_timer_updated</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-losstimerupdated"/></td>
          </tr>
          <tr>
            <td align="left">quic:packet_lost</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="quic-packetlost"/></td>
          </tr>
          <tr>
            <td align="left">quic:marked_for_retransmit</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-markedforretransmit"/></td>
          </tr>
          <tr>
            <td align="left">quic:ecn_state_updated</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="quic-ecnstateupdated"/></td>
          </tr>
        </tbody>
      </table>
      <t>QUIC events extend the <tt>$ProtocolEventData</tt> extension point defined in
<xref target="QLOG-MAIN"/>. Additionally, they allow for direct extensibility by their use of
per-event extension points via the <tt>$$</tt> CDDL "group socket" syntax, as also
described in <xref target="QLOG-MAIN"/>.</t>
      <figure anchor="quicevent-data-def">
        <name>QuicEventData definition and ProtocolEventData extension</name>
        <sourcecode type="cddl"><![CDATA[
QuicEventData = QUICServerListening /
                QUICConnectionStarted /
                QUICConnectionClosed /
                QUICConnectionIDUpdated /
                QUICSpinBitUpdated /
                QUICConnectionStateUpdated /
                QUICPathAssigned /
                QUICMTUUpdated /
                QUICKeyUpdated /
                QUICKeyDiscarded /
                QUICVersionInformation /
                QUICALPNInformation /
                QUICParametersSet /
                QUICParametersRestored /
                QUICPacketSent /
                QUICPacketReceived /
                QUICPacketDropped /
                QUICPacketBuffered /
                QUICPacketsAcked /
                QUICUDPDatagramsSent /
                QUICUDPDatagramsReceived /
                QUICUDPDatagramDropped /
                QUICStreamStateUpdated /
                QUICFramesProcessed /
                QUICStreamDataMoved /
                QUICDatagramDataMoved /
                QUICRecoveryParametersSet /
                QUICRecoveryMetricsUpdated /
                QUICCongestionStateUpdated /
                QUICLossTimerUpdated /
                QUICPacketLost

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

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

    * $$quic-connectionstarted-extension
}
]]></sourcecode>
        </figure>
        <t>Some QUIC stacks do not handle sockets directly and are thus unable to log
IP and/or port information.</t>
      </section>
      <section anchor="quic-connectionclosed">
        <name>connection_closed</name>
        <t>The <tt>connection_closed</tt> event is used for logging when a connection was closed,
typically when an error or timeout occurred. It has Base importance level; see
<xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</t>
        <t>Note that this event has overlap with the <tt>connection_state_updated</tt> event, as
well as the CONNECTION_CLOSE frame. However, in practice, when analyzing large
deployments, it can be useful to have a single event representing a
<tt>connection_closed</tt> event, which also includes an additional reason field to
provide more information. Furthermore, it is useful to log closures due to
timeouts, 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="quic-connectionclosed-def">
          <name>QUICConnectionClosed definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICConnectionClosed = {

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

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

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

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

    * $$quic-connectionstateupdated-extension
}

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

    ; Handshake packet sent/received
    "handshake_started" /

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

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

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

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

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

    ; CONNECTION_CLOSE sent
    "closing" /

    ; CONNECTION_CLOSE received
    "draining" /

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

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

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

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

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

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

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

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

    * $$quic-alpninformation-extension
}

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

    ; true if valid session ticket was received
    ? resumption_allowed: bool

    ; true if early data extension was enabled on the TLS layer
    ? early_data_enabled: bool

    ; e.g., "AES_128_GCM_SHA256"
    ? tls_cipher: text

    ; RFC9000
    ? original_destination_connection_id: ConnectionID
    ? initial_source_connection_id: ConnectionID
    ? retry_source_connection_id: ConnectionID
    ? stateless_reset_token: StatelessResetToken
    ? disable_active_migration: bool
    ? max_idle_timeout: uint64
    ? max_udp_payload_size: uint32
    ? ack_delay_exponent: uint16
    ? max_ack_delay: uint16
    ? active_connection_id_limit: uint32
    ? initial_max_data: uint64
    ? initial_max_stream_data_bidi_local: uint64
    ? initial_max_stream_data_bidi_remote: uint64
    ? initial_max_stream_data_uni: uint64
    ? initial_max_streams_bidi: uint64
    ? initial_max_streams_uni: uint64
    ? preferred_address: PreferredAddress
    ? unknown_parameters: [* UnknownParameter]

    ; RFC9221
    ? max_datagram_frame_size: uint64

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

    * $$quic-parametersset-extension
}

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

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

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

    ; RFC9221
    ? max_datagram_frame_size: uint64

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    ; to support passing multiple at once
    ? count: uint16

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

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

    ? datagram_ids: [+ uint32]

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

    ; to support passing multiple at once
    ? count: uint16

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

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

    ? datagram_ids: [+ uint32]

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

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

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

QUICStreamStateUpdated = {
    stream_id: uint64

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

    * $$quic-streamstateupdated-extension
}

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

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

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

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

    ; byte length of the moved data
    ? length: uint64

    ? from: $DataLocation
    ? to: $DataLocation

    ? additional_info: $DataMovedAdditionalInfo

    ? raw: RawInfo

    * $$quic-streamdatamoved-extension
}

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

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

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

    ? path_id: PathID

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

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

    * $$quic-migrationstateupdated-extension
}

; Note that MigrationState does not describe a full state machine
; These entries are not necessarily chronological,
; nor will they always all appear during
; a connection migration attempt.
MigrationState =
    ; probing packets are sent, migration not initiated yet
    "probing_started" /
    ; did not get reply to probing packets,
    ; discarding path as an option
    "probing_abandoned" /
    ; received reply to probing packets, path is migration candidate
    "probing_successful" /
    ; non-probing packets are sent, attempting migration
    "migration_started" /
    ; something went wrong during the migration, abandoning attempt
    "migration_abandoned" /
    ; new path is now fully used, old path is discarded
    "migration_complete"
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section anchor="sec-ev">
      <name>Security Events</name>
      <section anchor="quic-keyupdated">
        <name>key_updated</name>
        <t>The <tt>key_updated</tt> event has Base importance level; see <xref section="9.2" sectionFormat="of" target="QLOG-MAIN"/>.</t>
        <figure anchor="quic-keyupdated-def">
          <name>QUICKeyUpdated definition</name>
          <sourcecode type="cddl"><![CDATA[
QUICKeyUpdated = {
    key_type: $KeyType
    ? old: hexstring
    ? new: hexstring

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

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

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

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

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

    ; as RTT multiplier
    ? time_threshold: float32

    ; in ms
    timer_granularity: uint16

    ; in ms
    ? initial_rtt:float32

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

    ; in bytes
    ? initial_congestion_window: uint64

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

    ; as PTO multiplier
    ? persistent_congestion_threshold: uint16

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

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

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

    ; in bytes
    ? ssthresh: uint64

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

    ; in bits per second
    ? pacing_rate: uint64

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

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

    ; called "mode" in RFC 9002 A.9.
    ? timer_type: "ack" /
                  "pto"
    ? packet_number_space: $PacketNumberSpace
    event_type: "set" /
                "expired" /
                "cancelled"

    ; if event_type === "set": delta time is in ms from
    ; this event's timestamp until when the timer will trigger
    ? delta: float32

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

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

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

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

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

    * $$quic-ecnstateupdated-extension
}

ECNState =
  ; ECN testing in progress
  "testing" /
  ; ECN state unknown, waiting for acknowledgements
  ; for testing packets
  "unknown" /
  ; ECN testing failed
  "failed" /
  ; testing was successful, the endpoint now
  ; sends packets with ECT(0) marking
  "capable"
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section anchor="quic-data-type-definitions">
      <name>QUIC data type definitions</name>
      <section anchor="quicversion">
        <name>QuicVersion</name>
        <figure anchor="quicversion-def">
          <name>QuicVersion definition</name>
          <sourcecode type="cddl"><![CDATA[
QuicVersion = hexstring
]]></sourcecode>
        </figure>
      </section>
      <section anchor="connectionid">
        <name>ConnectionID</name>
        <figure anchor="connectionid-def">
          <name>ConnectionID definition</name>
          <sourcecode type="cddl"><![CDATA[
ConnectionID = hexstring
]]></sourcecode>
        </figure>
      </section>
      <section anchor="owner">
        <name>Owner</name>
        <figure anchor="owner-def">
          <name>Owner definition</name>
          <sourcecode type="cddl"><![CDATA[
Owner = "local" /
        "remote"
]]></sourcecode>
        </figure>
      </section>
      <section anchor="ipaddress-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 a new entry in the "qlog event schema URIs" registry:</t>
      <dl>
        <dt>Event schema URI:</dt>
        <dd>
          <t>urn:ietf:params:qlog:events:quic</t>
        </dd>
        <dt>Namespace</dt>
        <dd>
          <t>quic</t>
        </dd>
        <dt>Event Types</dt>
        <dd>
          <t>server_listening,connection_started,connection_closed,connection_id_updated,spin_bit_updated,connection_state_updated,path_assigned,mtu_updated,version_information,alpn_information,parameters_set,parameters_restored,packet_sent,packet_received,packet_dropped,packet_buffered,packets_acked,udp_datagrams_sent,udp_datagrams_received,udp_datagram_dropped,stream_state_updated,frames_processed,stream_data_moved,datagram_data_moved,migration_state_updated,key_updated,key_discarded,recovery_parameters_set,recovery_metrics_updated,congestion_state_updated,loss_timer_updated,packet_lost,marked_for_retransmit,ecn_state_updated</t>
        </dd>
        <dt>Description:</dt>
        <dd>
          <t>Event definitions related to the QUIC transport protocol.</t>
        </dd>
        <dt>Reference:</dt>
        <dd>
          <t>This Document</t>
        </dd>
      </dl>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="QLOG-MAIN">
          <front>
            <title>qlog: Structured Logging for Network Protocols</title>
            <author fullname="Robin Marx" initials="R." surname="Marx">
              <organization>Akamai</organization>
            </author>
            <author fullname="Luca Niccolini" initials="L." surname="Niccolini">
              <organization>Meta</organization>
            </author>
            <author fullname="Marten Seemann" initials="M." surname="Seemann">
         </author>
            <author fullname="Lucas Pardue" initials="L." surname="Pardue">
              <organization>Cloudflare</organization>
            </author>
            <date day="8" month="July" year="2024"/>
            <abstract>
              <t>   qlog provides extensible structured logging for network protocols,
   allowing for easy sharing of data that benefits common debug and
   analysis methods and tooling.  This document describes key concepts
   of qlog: formats, files, traces, events, and extension points.  This
   definition includes the high-level log file schemas, and generic
   event schemas.  Requirements and guidelines for creating protocol-
   specific event schemas are also presented.  All schemas are defined
   independent of serialization format, allowing logs to be represented
   in various ways such as JSON, CSV, or protobuf.

Note to Readers

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

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

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

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

-->

</rfc>
