<?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-03" 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-03"/>
    <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>Protocol Labs</organization>
      <address>
        <email>marten@protocol.ai</email>
      </address>
    </author>
    <author initials="L." surname="Pardue" fullname="Lucas Pardue" role="editor">
      <organization>Cloudflare</organization>
      <address>
        <email>lucaspardue.24.7@gmail.com</email>
      </address>
    </author>
    <date year="2022" month="October" day="24"/>
    <area>Transport</area>
    <workgroup>QUIC</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>This document describes concrete qlog event definitions and their metadata for
QUIC events. These events can then be embedded in the higher level schema defined
in <xref target="QLOG-MAIN"/>.</t>
    </abstract>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>This document describes the values of the qlog name ("category" + "event") and
"data" fields and their semantics for QUIC; see <xref target="QUIC-TRANSPORT"/>,
<xref target="QUIC-RECOVERY"/>, and <xref target="QUIC-TLS"/>.</t>
      <ul empty="true">
        <li>
          <t>Note to RFC editor: Please remove the follow paragraphs in 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>
      <section anchor="notational-conventions">
        <name>Notational Conventions</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <t>The event and data structure definitions in ths document are expressed
in the Concise Data Definition Language <xref target="CDDL"/> and its
extensions described in <xref target="QLOG-MAIN"/>.</t>
        <t>The following fields from <xref target="QLOG-MAIN"/> are imported and used: name, category,
type, data, group_id, protocol_type, importance, RawInfo, and time-related
fields.</t>
      </section>
    </section>
    <section anchor="overview">
      <name>Overview</name>
      <t>This document describes how the QUIC protocol is can be expressed in qlog using
the schema defined in <xref target="QLOG-MAIN"/>. QUIC protocol events are defined with a
category, a name (the concatenation of "category" and "event"), an "importance",
an optional "trigger", and "data" fields.</t>
      <t>Some data fields use complex datastructures. These are represented as enums or
re-usable definitions, which are grouped together on the bottom of this document
for clarity.</t>
      <t>When any event from this document is included in a qlog trace, the
"protocol_type" qlog array field <bcp14>MUST</bcp14> contain an entry with the value "QUIC".</t>
      <t>When the qlog "group_id" field is used, it is recommended to use QUIC's Original
Destination Connection ID (ODCID, the CID chosen by the client when first
contacting the server), as this is the only value that does not change over the
course of the connection and can be used to link more advanced QUIC packets (e.g.,
Retry, Version Negotiation) to a given connection. Similarly, the ODCID should be
used as the qlog filename or file identifier, potentially suffixed by the
vantagepoint type (For example, abcd1234_server.qlog would contain the server-side
trace of the connection with ODCID abcd1234).</t>
      <section anchor="raw-packet-and-frame-information">
        <name>Raw packet and frame information</name>
        <dl>
          <dt>Note:</dt>
          <dd>
            <t>QUIC packets always include an AEAD authentication tag ("trailer") at the end.
As this tag is always the same size for a given connection (it depends on the used
TLS cipher), this document does not define a separate "RawInfo:aead_tag_length"
field here. Instead, this field is reflected in "transport:parameters_set" and can
be logged only once.</t>
          </dd>
          <dt>Note:</dt>
          <dd>
            <t>As QUIC uses trailers in packets, packet header_lengths can be calculated as:</t>
          </dd>
          <dt/>
          <dd>
            <t>header_length = length - payload_length - aead_tag_length</t>
          </dd>
          <dt/>
          <dd>
            <t>For UDP datagrams, the calculation is simpler:</t>
          </dd>
          <dt/>
          <dd>
            <t>header_length = length - payload_length</t>
          </dd>
          <dt>Note:</dt>
          <dd>
            <t>In some cases, the length fields are also explicitly reflected inside of packet
headers. For example, the QUIC STREAM frame has a "length" field indicating its
payload size. Similarly, the QUIC Long Header has a "length" field which is equal
to the payload length plus the packet number length. In these cases, those fields
are intentionally preserved in the event definitions. Even though this can lead to
duplicate data when the full RawInfo is logged, it allows a more direct mapping of
the QUIC specifications to qlog, making it easier for users to interpret.</t>
          </dd>
        </dl>
      </section>
      <section anchor="handling-unknown-connections">
        <name>Events not belonging to a single connection</name>
        <t>For several types of events, it is sometimes impossible to tie them to a specific
conceptual QUIC connection (e.g., a packet_dropped event triggered because the
packet has an unknown connection_id in the header). Since qlog events in a trace
are typically associated with a single connection, it is unclear how to log these
events.</t>
        <t>Ideally, implementers <bcp14>SHOULD</bcp14> create a separate, individual "endpoint-level" trace
file (or group_id value), not associated with a specific connection (for example a
"server.qlog" or group_id = "client"), and log all events that do not belong to a
single connection to this grouping trace. However, this is not always practical,
depending on the implementation. Because the semantics of most of these events are
well-defined in the protocols and because they are difficult to mis-interpret as
belonging to a connection, implementers <bcp14>MAY</bcp14> choose to log events not belonging to
a particular connection in any other trace, even those strongly associated with a
single connection.</t>
        <t>Note that this can make it difficult to match logs from different vantage points
with each other. For example, from the client side, it is easy to log connections
with version negotiation or retry in the same trace, while on the server they
would most likely be logged in separate traces. Servers can take extra efforts
(and keep additional state) to keep these events combined in a single trace
however (for example by also matching connections on their four-tuple instead of
just the connection ID).</t>
      </section>
    </section>
    <section anchor="quic-event-overview">
      <name>QUIC Event Overview</name>
      <t>QUIC connections consist of different phases and interaction events. In order to
model this, QUIC event types are divided into general categories: connectivity
(<xref target="conn-ev"/>), security (<xref target="sec-ev"/>), transport <xref target="trans-ev"/>, and recovery
<xref target="rec-ev"/>.</t>
      <t>As described in <xref section="3.4.2" sectionFormat="of" target="QLOG-MAIN"/>, the qlog "name" field is the
concatenation of category and type.</t>
      <t><xref target="quic-events"/> summarizes the name value of each event type that is defined in
this specification.</t>
      <table anchor="quic-events">
        <name>QUIC Events</name>
        <thead>
          <tr>
            <th align="left">Name value</th>
            <th align="left">Importance</th>
            <th align="left">Definition</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">connectivity:server_listening</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="connectivity-serverlistening"/></td>
          </tr>
          <tr>
            <td align="left">connectivity:connection_started</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="connectivity-connectionstarted"/></td>
          </tr>
          <tr>
            <td align="left">connectivity:connection_closed</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="connectivity-connectionclosed"/></td>
          </tr>
          <tr>
            <td align="left">connectivity:connection_id_updated</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="connectivity-connectionidupdated"/></td>
          </tr>
          <tr>
            <td align="left">connectivity:spin_bit_updated</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="connectivity-spinbitupdated"/></td>
          </tr>
          <tr>
            <td align="left">connectivity:connection_state_updated</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="connectivity-connectionstateupdated"/></td>
          </tr>
          <tr>
            <td align="left">connectivity:mtu_updated</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="connectivity-mtuupdated"/></td>
          </tr>
          <tr>
            <td align="left">transport:version_information</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="transport-versioninformation"/></td>
          </tr>
          <tr>
            <td align="left">transport:alpn_information</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="transport-alpninformation"/></td>
          </tr>
          <tr>
            <td align="left">transport:parameters_set</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="transport-parametersset"/></td>
          </tr>
          <tr>
            <td align="left">transport:parameters_restored</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="transport-parametersrestored"/></td>
          </tr>
          <tr>
            <td align="left">transport:packet_sent</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="transport-packetsent"/></td>
          </tr>
          <tr>
            <td align="left">transport:packet_received</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="transport-packetreceived"/></td>
          </tr>
          <tr>
            <td align="left">transport:packet_dropped</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="transport-packetdropped"/></td>
          </tr>
          <tr>
            <td align="left">transport:packet_buffered</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="transport-packetbuffered"/></td>
          </tr>
          <tr>
            <td align="left">transport:packets_acked</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="transport-packetsacked"/></td>
          </tr>
          <tr>
            <td align="left">transport:datagrams_sent</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="transport-datagramssent"/></td>
          </tr>
          <tr>
            <td align="left">transport:datagrams_received</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="transport-datagramsreceived"/></td>
          </tr>
          <tr>
            <td align="left">transport:datagram_dropped</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="transport-datagramdropped"/></td>
          </tr>
          <tr>
            <td align="left">transport:stream_state_updated</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="transport-streamstateupdated"/></td>
          </tr>
          <tr>
            <td align="left">transport:frames_processed</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="transport-framesprocessed"/></td>
          </tr>
          <tr>
            <td align="left">transport:data_moved</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="transport-datamoved"/></td>
          </tr>
          <tr>
            <td align="left">security:key_updated</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="security-keyupdated"/></td>
          </tr>
          <tr>
            <td align="left">security:key_discarded</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="security-keydiscarded"/></td>
          </tr>
          <tr>
            <td align="left">recovery:parameters_set</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="recovery-parametersset"/></td>
          </tr>
          <tr>
            <td align="left">recovery:metrics_updated</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="recovery-metricsupdated"/></td>
          </tr>
          <tr>
            <td align="left">recovery:congestion_state_updated</td>
            <td align="left">Base</td>
            <td align="left">
              <xref target="recovery-congestionstateupdated"/></td>
          </tr>
          <tr>
            <td align="left">recovery:loss_timer_updated</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="recovery-losstimerupdated"/></td>
          </tr>
          <tr>
            <td align="left">recovery:packet_lost</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="recovery-packetlost"/></td>
          </tr>
          <tr>
            <td align="left">recovery:marked_for_retransmit</td>
            <td align="left">Extra</td>
            <td align="left">
              <xref target="recovery-markedforretransmit"/></td>
          </tr>
        </tbody>
      </table>
      <t>QUIC events extend the <tt>$ProtocolEventBody</tt> extension point defined in
<xref target="QLOG-MAIN"/>.</t>
      <figure anchor="quicevents-def">
        <name>QuicEvents definition and ProtocolEventBody extension</name>
        <sourcecode type="cddl"><![CDATA[
QuicEvents = ConnectivityServerListening /
             ConnectivityConnectionStarted /
             ConnectivityConnectionClosed /
             ConnectivityConnectionIDUpdated /
             ConnectivitySpinBitUpdated /
             ConnectivityConnectionStateUpdated /
             ConnectivityMTUUpdated /
             SecurityKeyUpdated / SecurityKeyDiscarded /
             TransportVersionInformation / TransportALPNInformation /
             TransportParametersSet / TransportParametersRestored /
             TransportPacketSent / TransportPacketReceived /
             TransportPacketDropped / TransportPacketBuffered /
             TransportPacketsAcked / TransportDatagramsSent /
             TransportDatagramsReceived / TransportDatagramDropped /
             TransportStreamStateUpdated / TransportFramesProcessed /
             TransportDataMoved /
             RecoveryParametersSet / RecoveryMetricsUpdated /
             RecoveryCongestionStateUpdated /
             RecoveryLossTimerUpdated /
             RecoveryPacketLost

$ProtocolEventBody /= QuicEvents
]]></sourcecode>
      </figure>
    </section>
    <section anchor="conn-ev">
      <name>Connectivity events</name>
      <section anchor="connectivity-serverlistening">
        <name>server_listening</name>
        <t>Importance: Extra</t>
        <t>Emitted when the server starts accepting connections.</t>
        <t>Definition:</t>
        <figure anchor="connectivity-serverlistening-def">
          <name>ConnectivityServerListening definition</name>
          <sourcecode type="cddl"><![CDATA[
ConnectivityServerListening = {
    ? ip_v4: IPAddress
    ? ip_v6: IPAddress
    ? port_v4: uint16
    ? port_v6: uint16

    ; the server will always answer client initials with a retry
    ; (no 1-RTT connection setups by choice)
    ? retry_required: bool
}
]]></sourcecode>
        </figure>
        <t>Note: some QUIC stacks do not handle sockets directly and are thus unable to log
IP and/or port information.</t>
      </section>
      <section anchor="connectivity-connectionstarted">
        <name>connection_started</name>
        <t>Importance: Base</t>
        <t>Used for both attempting (client-perspective) and accepting (server-perspective)
new connections. Note that this event has overlap with connection_state_updated
and this is a separate event mainly because of all the additional data that should
be logged.</t>
        <t>Definition:</t>
        <figure anchor="connectivity-connectionstarted-def">
          <name>ConnectivityConnectionStarted definition</name>
          <sourcecode type="cddl"><![CDATA[
ConnectivityConnectionStarted = {
    ? ip_version: IPVersion
    src_ip: IPAddress
    dst_ip: IPAddress

    ; transport layer protocol
    ? protocol: text .default "QUIC"
    ? src_port: uint16
    ? dst_port: uint16

    ? src_cid: ConnectionID
    ? dst_cid: ConnectionID
}
]]></sourcecode>
        </figure>
        <t>Note: some QUIC stacks do not handle sockets directly and are thus unable to log
IP and/or port information.</t>
      </section>
      <section anchor="connectivity-connectionclosed">
        <name>connection_closed</name>
        <t>Importance: Base</t>
        <t>Used for logging when a connection was closed, typically when an error or timeout
occurred. Note that this event has overlap with
connectivity:connection_state_updated, 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 connection_closed event, which also includes an
additional reason field to provide additional information. Additionally, it is
useful to log closures due to timeouts, which are difficult to reflect using the
other options.</t>
        <t>In QUIC there are two main connection-closing error categories: connection and
application errors. They have well-defined error codes and semantics. Next to
these however, there can be internal errors that occur that may or may not get
mapped to the official error codes in implementation-specific ways. As such,
multiple error codes can be set on the same event to reflect this.</t>
        <t>Definition:</t>
        <figure anchor="connectivity-connectionclosed-def">
          <name>ConnectivityConnectionClosed definition</name>
          <sourcecode type="cddl"><![CDATA[
ConnectivityConnectionClosed = {
    ; which side closed the connection
    ? owner: Owner

    ? connection_code: TransportError / CryptoError / uint32
    ? application_code: $ApplicationError / uint32
    ? internal_code: uint32

    ? reason: text
    ? trigger:
        "clean" /
        "handshake_timeout" /
        "idle_timeout" /
        ; this is called the "immediate close" in the QUIC RFC
        "error" /
        "stateless_reset" /
        "version_mismatch" /
        ; for example HTTP/3's GOAWAY frame
        "application"
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="connectivity-connectionidupdated">
        <name>connection_id_updated</name>
        <t>Importance: Base</t>
        <t>This event is emitted when either party updates their current Connection ID. As
this typically happens only sparingly over the course of a connection, this event
allows loggers to be more efficient than logging the observed CID with each packet
in the .header field of the "packet_sent" or "packet_received" events.</t>
        <t>This is viewed from the perspective of the one applying the new id. As such, if we
receive a new connection id from our peer, we will see the dst_ fields are set. If
we update our own connection id (e.g., NEW_CONNECTION_ID frame), we log the src_
fields.</t>
        <t>Definition:</t>
        <figure anchor="connectivity-connectionidupdated-def">
          <name>ConnectivityConnectionIDUpdated definition</name>
          <sourcecode type="cddl"><![CDATA[
ConnectivityConnectionIDUpdated = {
    owner: Owner

    ? old: ConnectionID
    ? new: ConnectionID
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="connectivity-spinbitupdated">
        <name>spin_bit_updated</name>
        <t>Importance: Base</t>
        <t>To be emitted when the spin bit changes value. It <bcp14>SHOULD NOT</bcp14> be emitted if the
spin bit is set without changing its value.</t>
        <t>Definition:</t>
        <figure anchor="connectivity-spinbitupdated-def">
          <name>ConnectivitySpinBitUpdated definition</name>
          <sourcecode type="cddl"><![CDATA[
ConnectivitySpinBitUpdated = {
    state: bool
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="connectivity-connectionstateupdated">
        <name>connection_state_updated</name>
        <t>Importance: Base</t>
        <t>This event is used to track progress through QUIC's complex handshake and
connection close procedures. It is intended to provide exhaustive options to log
each state individually, but also provides a more basic, simpler set for
implementations less interested in tracking each smaller state transition. As
such, users should not expect to see -all- these states reflected in all qlogs and
implementers should focus on support for the SimpleConnectionState set.</t>
        <t>Definition:</t>
        <figure anchor="connectivity-connectionstateupdated-def">
          <name>ConnectivityConnectionStateUpdated definition</name>
          <sourcecode type="cddl"><![CDATA[
ConnectivityConnectionStateUpdated = {
    ? old: ConnectionState / SimpleConnectionState
    new: ConnectionState / SimpleConnectionState
}

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

SimpleConnectionState =
    "attempted" /
    "handshake_started" /
    "handshake_confirmed" /
    "closed"
]]></sourcecode>
        </figure>
        <t>These states correspond to the following transitions for both client and server:</t>
        <t><strong>Client:</strong></t>
        <ul spacing="normal">
          <li>
            <t>send initial
            </t>
            <ul spacing="normal">
              <li>state = attempted</li>
            </ul>
          </li>
          <li>
            <t>get initial
            </t>
            <ul spacing="normal">
              <li>state = validated <em>(not really "needed" at the client, but somewhat useful to indicate progress nonetheless)</em></li>
            </ul>
          </li>
          <li>
            <t>get first Handshake packet
            </t>
            <ul spacing="normal">
              <li>state = handshake_started</li>
            </ul>
          </li>
          <li>
            <t>get Handshake packet containing ServerFinished
            </t>
            <ul spacing="normal">
              <li>state = handshake_complete</li>
            </ul>
          </li>
          <li>
            <t>send ClientFinished
            </t>
            <ul spacing="normal">
              <li>state = early_write
  (1RTT can now be sent)</li>
            </ul>
          </li>
          <li>
            <t>get HANDSHAKE_DONE
            </t>
            <ul spacing="normal">
              <li>state = handshake_confirmed</li>
            </ul>
          </li>
        </ul>
        <t><strong>Server:</strong></t>
        <ul spacing="normal">
          <li>
            <t>get initial
            </t>
            <ul spacing="normal">
              <li>state = attempted</li>
            </ul>
          </li>
          <li>send initial <em>(TODO don't think this needs a separate state, since some handshake will always be sent in the same flight as this?)</em></li>
          <li>
            <t>send handshake EE, CERT, CV, ...
            </t>
            <ul spacing="normal">
              <li>state = handshake_started</li>
            </ul>
          </li>
          <li>
            <t>send ServerFinished
            </t>
            <ul spacing="normal">
              <li>state = early_write
  (1RTT can now be sent)</li>
            </ul>
          </li>
          <li>
            <t>get first handshake packet / something using a server-issued CID of min length
            </t>
            <ul spacing="normal">
              <li>state = validated</li>
            </ul>
          </li>
          <li>
            <t>get handshake packet containing ClientFinished
            </t>
            <ul spacing="normal">
              <li>state = handshake_complete</li>
            </ul>
          </li>
          <li>
            <t>send HANDSHAKE_DONE
            </t>
            <ul spacing="normal">
              <li>state = handshake_confirmed</li>
            </ul>
          </li>
        </ul>
        <dl>
          <dt>Note:</dt>
          <dd>
            <t>connection_state_changed with a new state of "attempted" is the same
conceptual event as the connection_started event above from the client's
perspective. Similarly, a state of "closing" or "draining" corresponds to the
connection_closed event.</t>
          </dd>
        </dl>
      </section>
      <section anchor="migration-related-events">
        <name>MIGRATION-related events</name>
        <t>e.g., path_updated</t>
        <t>TODO: read up on the draft how migration works and whether to best fit this here or in TRANSPORT
TODO: integrate https://tools.ietf.org/html/draft-deconinck-quic-multipath-02</t>
        <t>For now, infer from other connectivity events and path_challenge/path_response frames</t>
      </section>
      <section anchor="connectivity-mtuupdated">
        <name>mtu_updated</name>
        <t>Importance: Extra</t>
        <figure anchor="connectivity-mtuupdated-def">
          <name>ConnectivityMTUUpdated definition</name>
          <sourcecode type="ccdl"><![CDATA[
ConnectivityMTUUpdated = {
  ? old: uint16
  new: uint16

  ; at some point, MTU discovery stops, as a "good enough"
  ; packet size has been found
  ? done: bool .default false
}
]]></sourcecode>
        </figure>
        <t>This event indicates that the estimated Path MTU was updated. This happens as
part of the Path MTU discovery process.</t>
      </section>
    </section>
    <section anchor="trans-ev">
      <name>Transport events</name>
      <section anchor="transport-versioninformation">
        <name>version_information</name>
        <t>Importance: Core</t>
        <t>QUIC endpoints each have their own list of of QUIC versions they support. The
client uses the most likely version in their first initial. If the server does
support that version, it replies with a version_negotiation packet, containing
supported versions. From this, the client selects a version. This 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>
        <t>Definition:</t>
        <figure anchor="transport-versioninformation-def">
          <name>TransportVersionInformation definition</name>
          <sourcecode type="cddl"><![CDATA[
TransportVersionInformation = {
    ? server_versions: [+ QuicVersion]
    ? client_versions: [+ QuicVersion]
    ? chosen_version: QuicVersion
}
]]></sourcecode>
        </figure>
        <t>Intended use:</t>
        <ul spacing="normal">
          <li>When sending an initial, the client logs this event with client_versions and
chosen_version set</li>
          <li>Upon receiving a client initial with a supported version, the server logs this
event with server_versions and chosen_version set</li>
          <li>Upon receiving a client initial with an unsupported version, the server logs
this event with server_versions set and client_versions 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 client_versions set and server_versions to the versions in
the version negotiation packet and chosen_version to the version it will use for
the next initial packet</li>
        </ul>
      </section>
      <section anchor="transport-alpninformation">
        <name>alpn_information</name>
        <t>Importance: Core</t>
        <t>QUIC implementations each have their own list of application level protocols and
versions thereof they support. The client includes a list of their supported
options in its first initial as part of the TLS Application Layer Protocol
Negotiation (alpn) extension. If there are common option(s), the server chooses
the most optimal one and communicates this back to the client. If not, the
connection is closed.</t>
        <t>Definition:</t>
        <figure anchor="transport-alpninformation-def">
          <name>TransportALPNInformation definition</name>
          <sourcecode type="cddl"><![CDATA[
TransportALPNInformation = {
    ? server_alpns: [* text]
    ? client_alpns: [* text]
    ? chosen_alpn: text
}
]]></sourcecode>
        </figure>
        <t>Intended use:</t>
        <ul spacing="normal">
          <li>When sending an initial, the client logs this event with client_alpns set</li>
          <li>When receiving an initial with a supported alpn, the server logs this event with
server_alpns set, client_alpns 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
chosen_alpn 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 client_alpns and
chosen_alpn set.</li>
        </ul>
      </section>
      <section anchor="transport-parametersset">
        <name>parameters_set</name>
        <t>Importance: Core</t>
        <t>This 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.</t>
        <t>All these settings are typically set once and never change. However, they are
typically set at different times during the connection, so there will typically 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 "owner" field. As such, this field <bcp14>MUST</bcp14> be
correct for all settings included a single event instance. If you need to log
settings from two sides, you <bcp14>MUST</bcp14> emit two separate event instances.</t>
        <t>In the case of connection resumption and 0-RTT, some of the server's parameters
are stored up-front at the client and used for the initial connection startup.
They are later updated with the server's reply. In these cases, utilize the
separate <tt>parameters_restored</tt> event to indicate the initial values, and this
event to indicate the updated values, as normal.</t>
        <t>Definition:</t>
        <figure anchor="transport-parametersset-def">
          <name>TransportParametersSet definition</name>
          <sourcecode type="cddl"><![CDATA[
TransportParametersSet = {
    ? 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

    ; depends on the TLS cipher, but it's easier to be explicit.
    ; in bytes
    ? aead_tag_length: uint8 .default 16

    ; transport parameters from the TLS layer:
    ? 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
}

PreferredAddress = {
    ip_v4: IPAddress
    ip_v6: IPAddress

    port_v4: uint16
    port_v6: uint16

    connection_id: ConnectionID
    stateless_reset_token: StatelessResetToken
}
]]></sourcecode>
        </figure>
        <t>Additionally, this event can contain any number of unspecified fields. This is to
reflect setting of for example unknown (greased) transport parameters or employed
(proprietary) extensions.</t>
      </section>
      <section anchor="transport-parametersrestored">
        <name>parameters_restored</name>
        <t>Importance: Base</t>
        <t>When using QUIC 0-RTT, clients are expected to remember and restore the server's
transport parameters from the previous connection. This event is used to indicate
which parameters were restored and to which values when utilizing 0-RTT. 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>
        <t>Definition:</t>
        <figure anchor="transport-parametersrestored-def">
          <name>TransportParametersRestored definition</name>
          <sourcecode type="cddl"><![CDATA[
TransportParametersRestored = {
    ? 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
}
]]></sourcecode>
        </figure>
        <t>Note that, like parameters_set above, this event can contain any number of
unspecified fields to allow for additional/custom parameters.</t>
      </section>
      <section anchor="transport-packetsent">
        <name>packet_sent</name>
        <t>Importance: Core</t>
        <t>Definition:</t>
        <figure anchor="transport-packetsent-def">
          <name>TransportPacketSent definition</name>
          <sourcecode type="cddl"><![CDATA[
TransportPacketSent = {
    header: PacketHeader

    ? frames: [* $QuicFrame]

    ? is_coalesced: bool .default false

    ; only if header.packet_type === "retry"
    ? retry_token: Token

    ; 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:
      ; draft-23 5.1.1
      "retransmit_reordered" /
      ; draft-23 5.1.2
      "retransmit_timeout" /
      ; draft-23 5.3.1
      "pto_probe" /
      ; draft-19 6.2
      "retransmit_crypto" /
      ; needed for some CCs to figure out bandwidth allocations
      ; when there are no normal sends
      "cc_bandwidth_probe"
}
]]></sourcecode>
        </figure>
        <t>Note: We do not explicitly log the encryption_level or packet_number_space: the
header.packet_type specifies this by inference (assuming correct implementation)</t>
        <t>Note: for more details on "datagram_id", see <xref target="transport-datagramssent"/>. It is only needed
when keeping track of packet coalescing.</t>
      </section>
      <section anchor="transport-packetreceived">
        <name>packet_received</name>
        <t>Importance: Core</t>
        <t>Definition:</t>
        <figure anchor="transport-packetreceived-def">
          <name>TransportPacketReceived definition</name>
          <sourcecode type="cddl"><![CDATA[
TransportPacketReceived = {
    header: PacketHeader

    ? frames: [* $QuicFrame]

    ? is_coalesced: bool .default false

    ; only if header.packet_type === "retry"
    ? retry_token: Token

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

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

    ? raw: RawInfo
    ? datagram_id: uint32

    ? trigger:
        ; if packet was buffered because
        ; it couldn't be decrypted before
        "keys_available"
}
]]></sourcecode>
        </figure>
        <t>Note: We do not explicitly log the encryption_level or packet_number_space: the
header.packet_type specifies this by inference (assuming correct implementation)</t>
        <t>Note: for more details on "datagram_id", see <xref target="transport-datagramssent"/>. It is only needed
when keeping track of packet coalescing.</t>
      </section>
      <section anchor="transport-packetdropped">
        <name>packet_dropped</name>
        <t>Importance: Base</t>
        <t>This event indicates a QUIC-level packet was dropped after partial or no parsing.</t>
        <t>Definition:</t>
        <figure anchor="transport-packetdropped-def">
          <name>TransportPacketDropped definition</name>
          <sourcecode type="cddl"><![CDATA[
TransportPacketDropped = {
    ; primarily packet_type should be filled here,
    ; as other fields might not be parseable
    ? header: PacketHeader

    ? raw: RawInfo
    ? datagram_id: uint32

    ? trigger:
        "key_unavailable" /
        "unknown_connection_id" /
        "header_parse_error" /
        "payload_decrypt_error" /
        "protocol_violation" /
        "dos_prevention" /
        "unsupported_version" /
        "unexpected_packet" /
        "unexpected_source_connection_id" /
        "unexpected_version" /
        "duplicate" /
        "invalid_initial"
}
]]></sourcecode>
        </figure>
        <t>Note: sometimes packets are dropped before they can be associated with a
particular connection (e.g., in case of "unsupported_version"). This situation is
discussed more in <xref target="handling-unknown-connections"/>.</t>
        <t>Note: for more details on "datagram_id", see <xref target="transport-datagramssent"/>. It is only needed
when keeping track of packet coalescing.</t>
      </section>
      <section anchor="transport-packetbuffered">
        <name>packet_buffered</name>
        <t>Importance: Base</t>
        <t>This 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 we only
log the full packet contents when it was parsed in a packet_received event.</t>
        <t>Definition:</t>
        <figure anchor="transport-packetbuffered-def">
          <name>TransportPacketBuffered definition</name>
          <sourcecode type="cddl"><![CDATA[
TransportPacketBuffered = {
    ; primarily packet_type and possible packet_number should be
    ; filled here as other elements might not be available yet
    ? header: PacketHeader

    ? raw: RawInfo
    ? datagram_id: uint32

    ? trigger:
        ; indicates the parser cannot keep up, temporarily buffers
        ; packet for later processing
        "backpressure" /
        ; if packet cannot be decrypted because the proper keys were
        ; not yet available
        "keys_unavailable"
}
]]></sourcecode>
        </figure>
        <t>Note: for more details on "datagram_id", see <xref target="transport-datagramssent"/>. It is only needed
when keeping track of packet coalescing.</t>
      </section>
      <section anchor="transport-packetsacked">
        <name>packets_acked</name>
        <t>Importance: Extra</t>
        <t>This event is emitted when a (group of) sent packet(s) is acknowledged by the
remote peer <em>for the first time</em>. 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>
        <t>Definition:</t>
        <figure anchor="transport-packetsacked-def">
          <name>TransportPacketsAcked definition</name>
          <sourcecode type="cddl"><![CDATA[
TransportPacketsAcked = {
    ? packet_number_space: PacketNumberSpace

    ? packet_numbers: [+ uint64]
}
]]></sourcecode>
        </figure>
        <t>Note: if packet_number_space is omitted, it assumes the default value of
PacketNumberSpace.application_data, as this is by far the most prevalent packet
number space a typical QUIC connection will use.</t>
      </section>
      <section anchor="transport-datagramssent">
        <name>datagrams_sent</name>
        <t>Importance: Extra</t>
        <t>When we pass one or more UDP-level datagrams to the socket. This is useful for
determining how QUIC packet buffers are drained to the OS.</t>
        <t>Definition:</t>
        <figure anchor="transport-datagramssent-def">
          <name>TransportDatagramsSent definition</name>
          <sourcecode type="cddl"><![CDATA[
TransportDatagramsSent = {
    ; to support passing multiple at once
    ? count: uint16

    ; RawInfo:length field indicates total length of the datagrams
    ; including UDP header length
    ? raw: [+ RawInfo]

    ? datagram_ids: [+ uint32]
}
]]></sourcecode>
        </figure>
        <t>Note: QUIC itself does not have a concept of a "datagram_id". This field is a
purely qlog-specific construct to allow tracking how multiple QUIC packets are
coalesced inside of a single UDP datagram, which is an important optimization
during the QUIC handshake. For this, implementations assign a (per-endpoint)
unique ID to each datagram and keep track of which packets were coalesced into the
same datagram. As packet coalescing typically only happens during the handshake
(as it requires at least one long header packet), this can be done without much
overhead.</t>
      </section>
      <section anchor="transport-datagramsreceived">
        <name>datagrams_received</name>
        <t>Importance: Extra</t>
        <t>When we receive one or more UDP-level datagrams from the socket. This is useful
for determining how datagrams are passed to the user space stack from the OS.</t>
        <t>Definition:</t>
        <figure anchor="transport-datagramsreceived-def">
          <name>TransportDatagramsReceived definition</name>
          <sourcecode type="cddl"><![CDATA[
TransportDatagramsReceived = {
    ; to support passing multiple at once
    ? count: uint16

    ; RawInfo:length field indicates total length of the datagrams
    ; including UDP header length
    ? raw: [+ RawInfo]

    ? datagram_ids: [+ uint32]
}
]]></sourcecode>
        </figure>
        <t>Note: for more details on "datagram_ids", see <xref target="transport-datagramssent"/>.</t>
      </section>
      <section anchor="transport-datagramdropped">
        <name>datagram_dropped</name>
        <t>Importance: Extra</t>
        <t>When we drop a UDP-level datagram. This is typically if it does not contain a
valid QUIC packet (in that case, use packet_dropped instead).</t>
        <t>Definition:</t>
        <figure anchor="transport-datagramdropped-def">
          <name>TransportDatagramDropped definition</name>
          <sourcecode type="cddl"><![CDATA[
TransportDatagramDropped = {
    ? raw: RawInfo
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="transport-streamstateupdated">
        <name>stream_state_updated</name>
        <t>Importance: Base</t>
        <t>This event is emitted whenever the internal state of a QUIC stream is updated, as
described in QUIC transport draft-23 section 3. 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.</t>
        <t>Definition:</t>
        <figure anchor="transport-streamstateupdated-def">
          <name>TransportStreamStateUpdated definition</name>
          <sourcecode type="cddl"><![CDATA[
StreamType = "unidirectional" / "bidirectional"

TransportStreamStateUpdated = {
    stream_id: uint64

    ; mainly useful when opening the stream
    ? stream_type: StreamType

    ? old: StreamState
    new: StreamState

    ? stream_side: "sending" / "receiving"
}

StreamState =
    ; bidirectional stream states, draft-23 3.4.
    "idle" /
    "open" /
    "half_closed_local" /
    "half_closed_remote" /
    "closed" /

    ; sending-side stream states, draft-23 3.1.
    "ready" /
    "send" /
    "data_sent" /
    "reset_sent" /
    "reset_received" /

    ; receive-side stream states, draft-23 3.2.
    "receive" /
    "size_known" /
    "data_read" /
    "reset_read" /

    ; both-side states
    "data_received" /

    ; qlog-defined:
    ; memory actually freed
    "destroyed"
]]></sourcecode>
        </figure>
        <t>Note: QUIC implementations <bcp14>SHOULD</bcp14> mainly log the simplified bidirectional
(HTTP/2-alike) stream states (e.g., idle, open, closed) instead of the more
fine-grained stream states (e.g., data_sent, reset_received). 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="transport-framesprocessed">
        <name>frames_processed</name>
        <t>Importance: Extra</t>
        <t>This event's main goal is to prevent a large proliferation of specific purpose
events (e.g., packets_acknowledged, flow_control_updated, stream_data_received).
We want to give implementations the opportunity to (selectively) log this type of
signal without having to log packet-level details (e.g., in packet_received).
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, we aggregate
these events in this single "frames_processed" event.</t>
        <t>Note: This 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>Note: Implementations logging "packet_received" and which include all of the
packet's constituent frames therein, are not expected to emit this
"frames_processed" event. Rather, implementations not wishing to log full packets
or that wish to explicitly convey extra information about when frames are
processed (if not directly tied to their reception) can use this event.</t>
        <t>Note: for some events, this approach will lose some information (e.g., for which
encryption level are packets being acknowledged?). If this information is
important, please use the packet_received event instead.</t>
        <t>Note: in some implementations, it can be difficult to log frames directly, even
when using packet_sent and packet_received events. For these cases, this event
also contains the direct packet_number field, which can be used to more explicitly
link this event to the packet_sent/received events.</t>
        <t>Definition:</t>
        <figure anchor="transport-framesprocessed-def">
          <name>TransportFramesProcessed definition</name>
          <sourcecode type="cddl"><![CDATA[
TransportFramesProcessed = {
    frames: [* $QuicFrame]

    ? packet_number: uint64
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="transport-datamoved">
        <name>data_moved</name>
        <t>Importance: Base</t>
        <t>Used to indicate when data moves between the different layers (for example passing
from the application protocol (e.g., HTTP) to QUIC stream buffers and vice versa)
or between the application protocol (e.g., HTTP) and the actual user application
on top (for example a browser engine). This helps make clear the flow of data, how
long data remains in various buffers and the overheads introduced by individual
layers.</t>
        <t>For example, this helps make clear 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 in
turn can help identify bottlenecks or scheduling problems.</t>
        <t>Definition:</t>
        <figure anchor="transport-datamoved-def">
          <name>TransportDataMoved definition</name>
          <sourcecode type="cddl"><![CDATA[
TransportDataMoved = {
    ? stream_id: uint64
    ? offset: uint64

    ; byte length of the moved data
    ? length: uint64

    ? from: "user" / "application" / "transport" / "network" / text
    ? to: "user" / "application" / "transport" / "network" / text

    ; raw bytes that were transferred
    ? data: hexstring
}
]]></sourcecode>
        </figure>
        <t>Note: we do not for example use a "direction" field (with values "up" and "down")
to specify the data flow. This is because in some optimized implementations, data
might skip some individual layers. Additionally, using explicit "from" and "to"
fields is more flexible and allows the definition of other conceptual "layers"
(for example to indicate data from QUIC CRYPTO frames being passed to a TLS
library ("security") or from HTTP/3 to QPACK ("qpack")).</t>
        <t>Note: this event type is part of the "transport" category, but really spans all
the different layers. This means we have a few leaky abstractions here (for
example, the stream_id or stream offset might not be available at some logging
points, or the raw data might not be in a byte-array form). In these situations,
implementers can decide to define new, in-context fields to aid in manual
debugging.</t>
      </section>
    </section>
    <section anchor="sec-ev">
      <name>Security Events</name>
      <section anchor="security-keyupdated">
        <name>key_updated</name>
        <t>Importance: Base</t>
        <t>Note: secret_updated would be more correct, but in the draft it's called KEY_UPDATE, so stick with that for consistency</t>
        <t>Definition:</t>
        <figure anchor="security-keyupdated-def">
          <name>SecurityKeyUpdated definition</name>
          <sourcecode type="cddl"><![CDATA[
SecurityKeyUpdated = {
    key_type: KeyType

    ? old: hexstring
    new: hexstring

    ; needed for 1RTT key updates
    ? generation: uint32

    ? trigger:
        ; (e.g., initial, handshake and 0-RTT keys
        ; are generated by TLS)
        "tls" /
        "remote_update" /
        "local_update"
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="security-keydiscarded">
        <name>key_discarded</name>
        <t>Importance: Base</t>
        <t>Definition:</t>
        <figure anchor="security-keydiscarded-def">
          <name>SecurityKeyDiscarded definition</name>
          <sourcecode type="cddl"><![CDATA[
SecurityKeyDiscarded = {
    key_type: KeyType
    ? key: hexstring

    ; needed for 1RTT key updates
    ? generation: uint32

    ? trigger:
        ; (e.g., initial, handshake and 0-RTT keys
        ; are generated by TLS)
        "tls" /
        "remote_update" /
        "local_update"
}
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section anchor="rec-ev">
      <name>Recovery events</name>
      <t>Note: most of the events in this category are kept generic to support different
recovery approaches and various congestion control algorithms. Tool creators
<bcp14>SHOULD</bcp14> make an effort to support and visualize even unknown data in these events
(e.g., plot unknown congestion states by name on a timeline visualization).</t>
      <section anchor="recovery-parametersset">
        <name>parameters_set</name>
        <t>Importance: Base</t>
        <t>This event groups initial parameters from both loss detection and congestion
control into a single event. 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 parameters_set event twice.</t>
        <t>Definition:</t>
        <figure anchor="recovery-parametersset-def">
          <name>RecoveryParametersSet definition</name>
          <sourcecode type="cddl"><![CDATA[
RecoveryParametersSet = {
    ; Loss detection, see recovery draft-23, 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, Appendix B.1.
    ; in bytes. Note: this could be updated after pmtud
    ? max_datagram_size: uint32

    ; in bytes
    ? initial_congestion_window: uint64

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

    ; as PTO multiplier
    ? persistent_congestion_threshold: uint16
}
]]></sourcecode>
        </figure>
        <t>Additionally, this event can contain any number of unspecified fields to support
different recovery approaches.</t>
      </section>
      <section anchor="recovery-metricsupdated">
        <name>metrics_updated</name>
        <t>Importance: Core</t>
        <t>This event is emitted when one or more of the observable recovery metrics changes
value. 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 min_rtt and smoothed_rtt change
at the same time, they should be bundled in a single metrics_updated entry, rather
than split out into two). Consequently, a metrics_updated event is only guaranteed
to contain at least one of the listed metrics.</t>
        <t>Definition:</t>
        <figure anchor="recovery-metricsupdated-def">
          <name>RecoveryMetricsUpdated definition</name>
          <sourcecode type="cddl"><![CDATA[
RecoveryMetricsUpdated = {
    ; Loss detection, see recovery draft-23, 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, Appendix B.2.
    ; in bytes
    ? congestion_window: uint64
    ? bytes_in_flight: uint64

    ; in bytes
    ? ssthresh: uint64

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

    ; in bits per second
    ? pacing_rate: uint64
}
]]></sourcecode>
        </figure>
        <t>Note: to make logging easier, implementations <bcp14>MAY</bcp14> log values even if they are the
same as previously reported values (e.g., two subsequent RecoveryMetricsUpdated entries can
both report the exact same value for min_rtt). However, applications <bcp14>SHOULD</bcp14> try to
log only actual updates to values.</t>
        <t>Additionally, this event can contain any number of unspecified fields to support
different recovery approaches.</t>
      </section>
      <section anchor="recovery-congestionstateupdated">
        <name>congestion_state_updated</name>
        <t>Importance: Base</t>
        <t>This event signifies when the congestion controller enters a significant new state
and changes its behaviour. This event's definition is kept generic to support
different Congestion Control algorithms. For example, for the algorithm defined in
the Recovery draft ("enhanced" New Reno), the following states are defined:</t>
        <ul spacing="normal">
          <li>slow_start</li>
          <li>congestion_avoidance</li>
          <li>application_limited</li>
          <li>recovery</li>
        </ul>
        <t>Definition:</t>
        <figure anchor="recovery-congestionstateupdated-def">
          <name>RecoveryCongestionStateUpdated definition</name>
          <sourcecode type="cddl"><![CDATA[
RecoveryCongestionStateUpdated = {
    ? old: text
    new: text

    ? trigger:
        "persistent_congestion" /
        "ECN"
}
]]></sourcecode>
        </figure>
        <t>The "trigger" field <bcp14>SHOULD</bcp14> be logged if there are multiple ways in which a state change
can occur but <bcp14>MAY</bcp14> be omitted if a given state can only be due to a single event
occurring (e.g., slow start is exited only when ssthresh is exceeded).</t>
      </section>
      <section anchor="recovery-losstimerupdated">
        <name>loss_timer_updated</name>
        <t>Importance: Extra</t>
        <t>This event is emitted when a recovery loss timer changes state. 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>Note: to indicate an active timer's timeout update, a new "set" event is used.</t>
        <t>Definition:</t>
        <figure anchor="recovery-losstimerupdated-def">
          <name>RecoveryLossTimerUpdated definition</name>
          <sourcecode type="cddl"><![CDATA[
RecoveryLossTimerUpdated = {
    ; called "mode" in draft-23 A.9.
    ? timer_type: "ack" / "pto"
    ? packet_number_space: PacketNumberSpace

    event_type: "set" / "expired" / "cancelled"

    ; if event_type === "set": delta time is in ms from
    ; this event's timestamp until when the timer will trigger
    ? delta: float32
}
]]></sourcecode>
        </figure>
        <t>TODO: how about CC algo's that use multiple timers? How generic do these events
need to be? Just support QUIC-style recovery from the spec or broader?</t>
        <t>TODO: read up on the loss detection logic in draft-27 onward and see if this suffices</t>
      </section>
      <section anchor="recovery-packetlost">
        <name>packet_lost</name>
        <t>Importance: Core</t>
        <t>This event is emitted when a packet is deemed lost by loss detection.</t>
        <t>Definition:</t>
        <figure anchor="recovery-packetlost-def">
          <name>RecoveryPacketLost definition</name>
          <sourcecode type="cddl"><![CDATA[
RecoveryPacketLost = {
    ; should include at least the packet_type and packet_number
    ? header: PacketHeader

    ; not all implementations will keep track of full
    ; packets, so these are optional
    ? frames: [* $QuicFrame]

    ? is_mtu_probe_packet: bool .default false

    ? trigger:
        "reordering_threshold" /
        "time_threshold" /
        ; draft-23 section 5.3.1, MAY
        "pto_expired"
}
]]></sourcecode>
        </figure>
        <t>For this event, the "trigger" field <bcp14>SHOULD</bcp14> be set (for example to one of the
values below), as this helps tremendously in debugging.</t>
      </section>
      <section anchor="recovery-markedforretransmit">
        <name>marked_for_retransmit</name>
        <t>Importance: Extra</t>
        <t>This event indicates which data was marked for retransmit upon detecting a packet
loss (see packet_lost). Similar to our reasoning for the "frames_processed" event,
in order to keep the amount of different events low, we group this signal for all
types of retransmittable data in a single event based on existing QUIC frame
definitions.</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 packet_lost 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>Note: much of this data can be inferred if implementations log packet_sent events
(e.g., looking at overlapping stream data offsets and length, one can determine
when data was retransmitted).</t>
        <t>Definition:</t>
        <figure anchor="recovery-markedforretransmit-def">
          <name>RecoveryMarkedForRetransmit definition</name>
          <sourcecode type="cddl"><![CDATA[
RecoveryMarkedForRetransmit = {
    frames: [+ $QuicFrame]
}
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section anchor="quic-data-field-definitions">
      <name>QUIC data field definitions</name>
      <section anchor="quicversion">
        <name>QuicVersion</name>
        <figure anchor="quicversion-def">
          <name>QuicVersion definition</name>
          <sourcecode type="cddl"><![CDATA[
QuicVersion = hexstring
]]></sourcecode>
        </figure>
      </section>
      <section anchor="connectionid">
        <name>ConnectionID</name>
        <figure anchor="connectionid-def">
          <name>ConnectionID definition</name>
          <sourcecode type="cddl"><![CDATA[
ConnectionID = hexstring
]]></sourcecode>
        </figure>
      </section>
      <section anchor="owner">
        <name>Owner</name>
        <figure anchor="owner-def">
          <name>Owner definition</name>
          <sourcecode type="cddl"><![CDATA[
Owner = "local" / "remote"
]]></sourcecode>
        </figure>
      </section>
      <section anchor="ipaddress-and-ipversion">
        <name>IPAddress and IPVersion</name>
        <figure anchor="ipaddress-def">
          <name>IPAddress definition</name>
          <sourcecode type="cddl"><![CDATA[
; an IPAddress can either be a "human readable" form
; (e.g., "127.0.0.1" for v4 or
; "2001:0db8:85a3:0000:0000:8a2e:0370:7334" for v6) or
; use a raw byte-form (as the string forms can be ambiguous)
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="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 = {
    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"
    ? token: Token

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

    ; only if present in the header
    ; if correctly using transport:connection_id_updated events,
    ; dcid can be skipped for 1RTT packets
    ? version: QuicVersion
    ? scil: uint8
    ? dcil: uint8
    ? scid: ConnectionID
    ? dcid: ConnectionID
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="token">
        <name>Token</name>
        <figure anchor="token-def">
          <name>Token definition</name>
          <sourcecode type="cddl"><![CDATA[
Token = {
    ? type: "retry" / "resumption"

    ; byte length of the token
    ? length: uint32

    ; raw byte value of the token
    ? data: hexstring

    ; decoded fields included in the token
    ; (typically: peer's IP address, creation time)
    ? details: {
      * text => any
    }
}
]]></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, this field includes a general-purpose "details" 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="quic-frames">
        <name>QUIC Frames</name>
        <t>The generic <tt>$QuicFrame</tt> is defined here as a CDDL extension point (a "socket"
or "plug"). It can be extended to support additional QUIC frame types.</t>
        <figure anchor="quicframe-def">
          <name>QuicFrame plug definition</name>
          <sourcecode type="cddl"><![CDATA[
; The QuicFrame is any key-value map (e.g., JSON object)
$QuicFrame /= {
    * text => any
}
]]></sourcecode>
        </figure>
        <t>The QUIC frame types defined in this document are as follows:</t>
        <figure anchor="quicbaseframe-def">
          <name>QuicBaseFrames definition</name>
          <sourcecode type="cddl"><![CDATA[
QuicBaseFrames /=
  PaddingFrame / PingFrame / AckFrame / ResetStreamFrame /
  StopSendingFrame / CryptoFrame / NewTokenFrame / StreamFrame /
  MaxDataFrame / MaxStreamDataFrame / MaxStreamsFrame /
  DataBlockedFrame / StreamDataBlockedFrame / StreamsBlockedFrame /
  NewConnectionIDFrame / RetireConnectionIDFrame /
  PathChallengeFrame / PathResponseFrame / ConnectionCloseFrame /
  HandshakeDoneFrame / UnknownFrame

$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: 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: 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 / uint32

    ; 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 / uint32

    ; 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
}
]]></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: hexstring
}
]]></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>raw_error_code is the actual, numerical code. This is useful because some error
types are spread out over a range of codes (e.g., QUIC's crypto_error).</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 / $ApplicationError / uint32
    ? raw_error_code: uint32
    ? reason: text

    ; For known frame types, the appropriate "frame_type" string
    ; For unknown frame types, the hex encoded identifier value
    ? 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>
          <figure anchor="unknownframe-def">
            <name>UnknownFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
UnknownFrame = {
    frame_type: "unknown"
    raw_frame_type: uint64

    ? raw_length: uint32
    ? raw: hexstring
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="transporterror">
          <name>TransportError</name>
          <figure anchor="transporterror-def">
            <name>TransportError definition</name>
            <sourcecode type="cddl"><![CDATA[
TransportError = "no_error" / "internal_error" /
    "connection_refused" / "flow_control_error" /
    "stream_limit_error" / "stream_state_error" /
    "final_size_error" / "frame_encoding_error" /
    "transport_parameter_error" / "connection_id_limit_error" /
    "protocol_violation" / "invalid_token" / "application_error" /
    "crypto_buffer_exceeded"
]]></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, we cannot define it here directly. Though we provide an extension point through the use of the CDDL "socket" mechanism.</t>
          <t>Application-level qlog definitions that wish to define new ApplicationError strings <bcp14>MUST</bcp14> do so by extending the $ApplicationError socket as such:</t>
          <artwork><![CDATA[
$ApplicationError /= "new_error_name" / "another_new_error_name"
]]></artwork>
        </section>
        <section anchor="cryptoerror">
          <name>CryptoError</name>
          <t>These errors are defined in the TLS document as "A TLS alert is turned into a QUIC
connection error by converting the one-byte alert description into a QUIC error
code. The alert description is added to 0x100 to produce a QUIC error code from
the range reserved for CRYPTO_ERROR."</t>
          <t>This approach maps badly to a pre-defined enum. As such, we define the
crypto_error string 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>TBD</t>
    </section>
  </middle>
  <back>
    <references>
      <name>Normative References</name>
      <reference anchor="QLOG-MAIN">
        <front>
          <title>Main logging schema for qlog</title>
          <author fullname="Robin Marx" initials="R." surname="Marx">
            <organization>KU Leuven</organization>
          </author>
          <author fullname="Luca Niccolini" initials="L." surname="Niccolini">
            <organization>Facebook</organization>
          </author>
          <author fullname="Marten Seemann" initials="M." surname="Seemann">
            <organization>Protocol Labs</organization>
          </author>
          <date day="31" month="August" year="2022"/>
          <abstract>
            <t>   This document describes a high-level schema for a standardized
   logging format called qlog.  This format allows easy sharing of data
   and the creation of reusable visualization and debugging tools.  The
   high-level schema in this document is intended to be protocol-
   agnostic.  Separate documents specify how the format should be used
   for specific protocol data.  The schema is also format-agnostic, and
   can be represented in for example JSON, csv or protobuf.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-main-schema-03"/>
      </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">
            <organization/>
          </author>
          <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson">
            <organization/>
          </author>
          <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">
            <organization/>
          </author>
          <author fullname="I. Swett" initials="I." role="editor" surname="Swett">
            <organization/>
          </author>
          <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>Extended BGP Administrative Shutdown Communication</title>
          <author fullname="J. Snijders" initials="J." surname="Snijders">
            <organization/>
          </author>
          <author fullname="J. Heitz" initials="J." surname="Heitz">
            <organization/>
          </author>
          <author fullname="J. Scudder" initials="J." surname="Scudder">
            <organization/>
          </author>
          <author fullname="A. Azimov" initials="A." surname="Azimov">
            <organization/>
          </author>
          <date month="January" year="2021"/>
          <abstract>
            <t>This document enhances the BGP Cease NOTIFICATION message "Administrative Shutdown" and "Administrative Reset" subcodes for operators to transmit a short free-form message to describe why a BGP session was shut down or reset. This document updates RFC 4486 and obsoletes RFC 8203 by defining an Extended BGP Administrative Shutdown Communication of up to 255 octets to improve communication using multibyte character sets.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="9003"/>
        <seriesInfo name="DOI" value="10.17487/RFC9003"/>
      </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">
            <organization/>
          </author>
          <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">
            <organization/>
          </author>
          <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">
            <organization/>
          </author>
          <author fullname="C. Vigano" initials="C." surname="Vigano">
            <organization/>
          </author>
          <author fullname="C. Bormann" initials="C." surname="Bormann">
            <organization/>
          </author>
          <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>
    </references>
    <section anchor="change-log">
      <name>Change Log</name>
      <section 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 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 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 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 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 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>
    <section numbered="false" anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>Much of the initial work by Robin Marx was done at the Hasselt and KU Leuven
Universities.</t>
      <t>Thanks to Jana Iyengar, Brian Trammell, Dmitri Tikhonov, Stephen Petrides, Jari
Arkko, Marcus Ihlar, Victor Vasiliev, Mirja Kuehlewind, Jeremy Laine, Kazu
Yamamoto, and Christian Huitema for their feedback and suggestions.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
9H7D6P8B9cRUUvP9AAA=

-->

</rfc>
