<?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-04" 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-04"/>
    <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="2023" month="February" day="13"/>
    <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 endpoint applying the new id. As such,
when the endpoint receives a new connection id from the peer, it will see the
dst_ fields are set. When the endpoint updates its own connection id
(e.g., NEW_CONNECTION_ID frame), it logs 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="cddl"><![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: The encryption_level and packet_number_space are not logged explicitly:
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: The encryption_level and packet_number_space are not logged explicitly:
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.</t>
        <t>The trigger field indicates a general reason category for dropping the packet,
while the details field can contain additional implementation-specific
information.</t>
        <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 decrypteable or parseable
    ? header: PacketHeader

    ? raw: RawInfo
    ? datagram_id: uint32

    ? details: {* text => any}
    ? trigger:
        "internal_error" /
        "rejected" /
        "unsupported" /
        "invalid" /
        "connection_unknown" /
        "decryption_failure" /
        "general"
}
]]></sourcecode>
        </figure>
        <t>Some example situations for each of the trigger categories include:</t>
        <ul spacing="normal">
          <li>internal_error: not initialized, out of memory</li>
          <li>rejected: limits reached, DDoS protection, unwilling to track more paths, duplicate packet</li>
          <li>unsupported: unknown or unsupported version. See also <xref target="handling-unknown-connections"/>.</li>
          <li>invalid: packet parsing or validation error</li>
          <li>connection_unknown: packet does not relate to a known connection or Connection ID</li>
          <li>decryption_failure: decryption key was unavailable, decryption failed</li>
          <li>general: situations not clearly covered in the other categories</li>
        </ul>
        <t>For more details on "datagram_id", see <xref target="transport-datagramssent"/>.</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 only
the full packet contents can be logged 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 one or more UDP-level datagrams are passed to the socket. This is useful
for determining how QUIC packet buffers are drained to the OS.</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

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

    ? datagram_ids: [+ uint32]
}
]]></sourcecode>
        </figure>
        <t>Since QUIC implementations rarely control UDP logic directly, the raw data
excludes UDP-level headers in all fields.</t>
        <t>The "datagram_id" is a qlog-specific concept to allow tracking of QUIC packet
coalescing inside UDP datagrams. Implementations can assign a per-endpoint
unique ID to each datagram, and reflect this in other events to track QUIC
packets through processing steps.</t>
      </section>
      <section anchor="transport-datagramsreceived">
        <name>datagrams_received</name>
        <t>Importance: Extra</t>
        <t>When one or more UDP-level datagrams are received from the socket. This is
useful for determining how datagrams are passed to the user space stack from
the OS.</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

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

    ? datagram_ids: [+ uint32]
}
]]></sourcecode>
        </figure>
        <t>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 a UDP-level datagram is dropped. This is typically done if it does not
contain a valid QUIC packet. If it does, but the QUIC packet is dropped for
other reasons, packet_dropped (<xref target="transport-packetdropped"/>) should be used instead.</t>
        <t>Definition:</t>
        <figure anchor="transport-datagramdropped-def">
          <name>TransportDatagramDropped definition</name>
          <sourcecode type="cddl"><![CDATA[
TransportDatagramDropped = {
    ; The RawInfo fields do not include the UDP headers,
    ; only the UDP payload
    ? 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).
Implementations have 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, these events
are aggregated into 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: RawInfo
}
]]></sourcecode>
        </figure>
      </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: uint64
    ? loss_reduction_factor: float32

    ; as PTO multiplier
    ? persistent_congestion_threshold: uint16
}
]]></sourcecode>
        </figure>
        <t>Additionally, this event can contain any number of unspecified fields to support
different recovery approaches.</t>
      </section>
      <section anchor="recovery-metricsupdated">
        <name>metrics_updated</name>
        <t>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, this signal is grouped into
in a single event based on existing QUIC frame definitions for all types of
retransmittable data.</t>
        <t>Implementations retransmitting full packets or frames directly can just log the
constituent frames of the lost packet here (or do away with this event and use the
contents of the 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"

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

    ? raw: RawInfo
}
]]></sourcecode>
        </figure>
        <t>The token carried in an Initial packet can either be a retry token from a Retry
packet, or one originally provided by the server in a NEW_TOKEN frame used when
resuming a connection (e.g., for address validation purposes). Retry and
resumption tokens typically contain encoded metadata to check the token's
validity when it is used, but this metadata and its format is implementation
specific. For that, this event 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: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="maxdataframe">
          <name>MaxDataFrame</name>
          <figure anchor="maxdataframe-def">
            <name>MaxDataFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
MaxDataFrame = {
  frame_type: "max_data"

  maximum: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="maxstreamdataframe">
          <name>MaxStreamDataFrame</name>
          <figure anchor="maxstreamdataframe-def">
            <name>MaxStreamDataFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
MaxStreamDataFrame = {
  frame_type: "max_stream_data"

  stream_id: uint64
  maximum: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="maxstreamsframe">
          <name>MaxStreamsFrame</name>
          <figure anchor="maxstreamsframe-def">
            <name>MaxStreamsFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
MaxStreamsFrame = {
  frame_type: "max_streams"

  stream_type: StreamType
  maximum: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="datablockedframe">
          <name>DataBlockedFrame</name>
          <figure anchor="datablockedframe-def">
            <name>DataBlockedFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
DataBlockedFrame = {
  frame_type: "data_blocked"

  limit: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="streamdatablockedframe">
          <name>StreamDataBlockedFrame</name>
          <figure anchor="streamdatablockedframe-def">
            <name>StreamDataBlockedFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
StreamDataBlockedFrame = {
  frame_type: "stream_data_blocked"

  stream_id: uint64
  limit: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="streamsblockedframe">
          <name>StreamsBlockedFrame</name>
          <figure anchor="streamsblockedframe-def">
            <name>StreamsBlockedFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
StreamsBlockedFrame = {
  frame_type: "streams_blocked"

  stream_type: StreamType
  limit: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="newconnectionidframe">
          <name>NewConnectionIDFrame</name>
          <figure anchor="newconnectionidframe-def">
            <name>NewConnectionIDFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
NewConnectionIDFrame = {
  frame_type: "new_connection_id"

  sequence_number: uint32
  retire_prior_to: uint32

  ; mainly used if e.g., for privacy reasons the full
  ; connection_id cannot be logged
  ? connection_id_length: uint8
  connection_id: ConnectionID

  ? stateless_reset_token: StatelessResetToken
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="retireconnectionidframe">
          <name>RetireConnectionIDFrame</name>
          <figure anchor="retireconnectionid-def">
            <name>RetireConnectionIDFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
RetireConnectionIDFrame = {
  frame_type: "retire_connection_id"

  sequence_number: uint32
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="pathchallengeframe">
          <name>PathChallengeFrame</name>
          <figure anchor="pathchallengeframe-def">
            <name>PathChallengeFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
PathChallengeFrame = {
  frame_type: "path_challenge"

  ; always 64-bit
  ? data: hexstring
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="pathresponseframe">
          <name>PathResponseFrame</name>
          <figure anchor="pathresponseframe-def">
            <name>PathResponseFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
PathResponseFrame = {
  frame_type: "path_response"

  ; always 64-bit
  ? data: hexstring
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="connectioncloseframe">
          <name>ConnectionCloseFrame</name>
          <t>The error_code_value field is the numerical value without VLIE encoding. 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
    ? error_code_value: uint64
    ? reason: text

    ; For known frame types, the appropriate "frame_type" string
    ; For unknown frame types, the hex encoded frame 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>
          <t>The frame_type_value field is the numerical value without VLIE encoding.</t>
          <figure anchor="unknownframe-def">
            <name>UnknownFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
UnknownFrame = {
    frame_type: "unknown"
    frame_type_value: uint64

    ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="transporterror">
          <name>TransportError</name>
          <figure anchor="transporterror-def">
            <name>TransportError definition</name>
            <sourcecode type="cddl"><![CDATA[
TransportError = "no_error" / "internal_error" /
    "connection_refused" / "flow_control_error" /
    "stream_limit_error" / "stream_state_error" /
    "final_size_error" / "frame_encoding_error" /
    "transport_parameter_error" / "connection_id_limit_error" /
    "protocol_violation" / "invalid_token" / "application_error" /
    "crypto_buffer_exceeded" / "key_update_error" /
    "aead_limit_reached" / "no_viable_path"
    ; there is no value to reflect CRYPTO_ERROR
    ; use the CryptoError type instead
]]></sourcecode>
          </figure>
        </section>
        <section anchor="applicationerror">
          <name>ApplicationError</name>
          <t>By definition, an application error is defined by the application-level
protocol running on top of QUIC (e.g., HTTP/3).</t>
          <t>As such, it cannot be defined here directly. Applications <bcp14>MAY</bcp14> use the provided
extension point through the use of the CDDL "socket" mechanism.</t>
          <t>Application-level qlog definitions that wish to define new ApplicationError strings <bcp14>MUST</bcp14> do so by extending the $ApplicationError socket as such:</t>
          <artwork><![CDATA[
$ApplicationError /= "new_error_name" / "another_new_error_name"
]]></artwork>
        </section>
        <section anchor="cryptoerror">
          <name>CryptoError</name>
          <t>These errors are defined in the TLS document as "A TLS alert is turned into a QUIC
connection error by converting the one-byte alert description into a QUIC error
code. The alert description is added to 0x100 to produce a QUIC error code from
the range reserved for CRYPTO_ERROR."</t>
          <t>This approach maps badly to a pre-defined enum. As such, the crypto_error
string is defined as having a dynamic component here, which should include the
hex-encoded and zero-padded value of the TLS alert description.</t>
          <figure anchor="cryptoerror-def">
            <name>CryptoError definition</name>
            <sourcecode type="cddl"><![CDATA[
; all strings from "crypto_error_0x100" to "crypto_error_0x1ff"
CryptoError = text .regexp "crypto_error_0x1[0-9a-f][0-9a-f]"
]]></sourcecode>
          </figure>
        </section>
      </section>
    </section>
    <section anchor="security-and-privacy-considerations">
      <name>Security and Privacy Considerations</name>
      <t>The security and privacy considerations discussed in <xref target="QLOG-MAIN"/> apply to this
document as well.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>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>Akamai</organization>
          </author>
          <author fullname="Luca Niccolini" initials="L." surname="Niccolini">
            <organization>Meta</organization>
          </author>
          <author fullname="Marten Seemann" initials="M." surname="Seemann">
            <organization>Protocol Labs</organization>
          </author>
          <author fullname="Lucas Pardue" initials="L." surname="Pardue">
            <organization>Cloudflare</organization>
          </author>
          <date day="24" month="October" 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-04"/>
      </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-03">
        <name>Since draft-ietf-qlog-quic-events-03:</name>
        <ul spacing="normal">
          <li>Ensured consistent use of RawInfo to indicate raw wire bytes (#243)</li>
          <li>Renamed UnknownFrame:raw_frame_type to :frame_type_value (#54)</li>
          <li>Renamed ConnectionCloseFrame:raw_error_code to :error_code_value (#54)</li>
          <li>Changed triggers for packet_dropped (#278)</li>
          <li>Added entries to TransportError enum (#285)</li>
          <li>Changed minimum_congestion_window to uint64 (#288)</li>
        </ul>
      </section>
      <section 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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
NGexZR3VxkVUD1hB5c++VV3xQWuoNi+g2jT7pv3Cm37LtNExf6o6M+GPaAHe
panBJPFD+a41y9ZAm4jTlslusMZ0TDm4ZdWbeRfibFqNw5lNa9own00rq7Yu
q3rYmqqu9XSg0vZVVduXVN2zni4rV8jk2qauDbwucOvxmij9aGoC/y3JHiVZ
0cbLMgWRB4uaOOHGr29KQUXO5QKf3ybTtZYJZt2X40a/DC8C924NYatRJAlt
/oXBHr9BZ+C2m8SjD7zJL2DwfjhMF59vQ7i9TxvMjkE8U7dhsmO3BPoP3zBf
msammwJ8Ns2hy8zYNJUGRq6WHbVjFXhn1Xiqn/UYd0RU+fTpYJLWkZb79ot1
+Earem7bd5iuWpPoXkZg3G2sIjT8blpEKV/9xjVo884lhDPokNA7TNHsUHD6
yFgyAPk6Pj53gCHopQEdhF9qWcw/n52esD+Ty5KGBev14h4u2keKjU2aiasl
hePT9Wa3ZCljfb3AYIKZTW6M0CKNlX1IbOdb0nZ9GykpTDbSJiyK5JdMiqJO
O3y3RuLOClV/7angx1CSlBA3cvCWdTpbQUkVui1KXrM170DDWsRk0E9UYwsh
1xG5sqK4VBT140R7bnG92KtMxB1oKZJWF4CB1lfNL631v2Q80EAGjjcf+zDk
uWs1Kk8rs6AlyLbVs65NaiNy23XioUSHX6XjMDqnKZa7733pTdK+wjetKXZ0
355g6Ma51CKlNPhvP2HeIv0BurHYRrqFbxrYtV2lkT5aMAhGb68+xP6uuo18
BODE5oW9NnLTTZL+eSyBslSSWxXUBQ5biIBF0pTXf1AwP2zhTFfe9ww1BX+j
haU1Yxsr4DVtiB/BRLi9VvYb36ZF5oIW5aZEsSY0gwQbgGGqyIHqY02cpEau
AlujTWISnY9cHckF5AqYB5oix8hlNKKM80hTrBoriAnasl64cnT+w6vLl+OT
8/OX5/K9Fj9lK8uJpfnWvdYqQEeT66w9x607/C0NQhpFX6+9z/qUfOjVKGTO
48UUSGiQ9w2Xco5srcVylVMiiJSj1LttvFKWj58gFzrEbDB0c6bh1XVe7ILm
Twz9ebORw7vUjmKWomZ0g15TU/NtLhrOR5EQGvYQLwxmq6bVAufTXJJXcCH1
UiO0ti/PlDIxW+yJGYWYqWcF5mdN1hJOod6hNlPjWaE3FgHD4QZRB+97xmoE
Mz0seMWYntPVIOPGK+rEMzHKtrPhir4L0szVPnV5duHFQVRx75AeJZnhLGSs
PanVrrkgZ+RFfzHaTKTqcVnrmoHoD8iRzf3wVRcc8uX1JFeZIvfk/OGOrysM
RGED1N7b/b09rqBORUeDXkggcrf3sJyEWkl5K4GS/kkc9iSHylZGXiTLKp4k
s2zNmdogeWl5f2AtqwW66wWPqYqBJ2pFErHlnZ6k0mroSTxbw/7QtVALkDsR
zHSfsaRrNZINMcEHZIqByhToCfnFlMVgyWDQy9ns3rVAFgbnYM6TIilFB/b8
mY8JpD1ccev51VUv8imURM8PS3Nt3i7b3/+4N/giGVy90f+62Cf+skXD/M43
Fs7E9b8SJReL6AAJ4HKBEhpV+R+qNjwNPoyxLN9Kq9C8e/ens5ffDp4fnr54
/54LycdSyD3yz8GdyTJ0KsWnhy8O20N/DRrwYDCI8b5OdIvER1wI66y45ug/
KmbPWY+pqa8GdF8EBqEMOKx3sPeEcuJPcrzqc+ZqbdZKxfS6HT9lHDMgMAmJ
3UnxzqODp092oZdzgzRgFkhUI/jYEzexn1FLvtp59MlTv4Mu0ZI6cpI3ddRS
hbQjhsNM5V3OvGteXvTo4LPP8eNDwmktugL9NvgaHjz8+vNP/K43Fg7DHkSm
xkYwxAO34oC2QmGAUgFr9TNOXfTLa+482ufZ8Ny12FGu4dq03uNXZ6+eX74+
xq+f0NfPk1kzxFzTdxErgyBp3FXZFC6kG4h2NYVockzqMgPFCpNtudUnAZhc
VBQRNGKIFClH2ICff0Yzs7V6AxYoV2qLDMCFkYh0VwYludpoJm9lYYEq6m0K
bPKS71+/opoqlN/2wH3Yp33g3rqjWWXu+wcHD97cPer0yJY/bK41zuDNKrlm
7oH3M5sLIqYIN4IajIfHrDneIinf8ng01MADH89g/kRRi7mwVsy4I5mH7g/D
2tUM0JQv/yCAzxg39DcNV6lIRjw4jrGSMTIYLqaGiEbbeUHlx4gvIlKyGOZK
hnJFMreJSvIqiwlCdvqxSzvux99KBKr0gz1fwBnMRHh01wjOpfxHTOWoF4kd
YOjThuIxgVqY2VIwjhf7kysE/5MUSvlNgEdcep78rbCFSmgjHLZLrXmayLyu
l3ILIpMfrMlZYZ0qudiM44do3RgK5CJaQMh/SwXslMl6N+BgoD4TsP39/f6j
Tz9xx83PXnEVm3wqMAy/pGBwVob5ZFJwpUc0oLns3Egi7XYePd2zpEe3CAVb
LRjh5aJ21zOQtDt2mvPoMKy3Qg0c5JoENv9C4xCztT3NGlVMt19LK8pc6LdC
zTm+inMeJD9g59EXT/uPPv+0D5D0iJbFYgnIt4Wy9B75RrlVWym3JxHVPQTS
Z46a9zpTcvSqLKkw+OjpE5jLJ/1Hn33ef/T0C9daM+yCSz+wNHy2DB/qfT7c
C/zvwOOGXsFVgEddlDYTiAM2s2U8xeKjV2upeOwSoKFD5HkXi4RqagV4b8pr
LpMhdYICkoCkqKOEEJ++j+NvOOuW0jCsbTKnWkUl8OBsbeVeQPW9/qMnX8D/
aLM+8WWLnxG5CH3KlXIzqcjPe+5eVHL1hf+MknPIb9H8Wm61x3NGfFPrrtCA
I5G/x5Tnr2sbitqP66FIeFzOXDJKmS71YAiDleR6IdL3SBLv0XBPHjqcPwTQ
hR7l6WrxiRrvpLflEMgcyfJ/Gd9Wkt5USlkpHPXAFw6Wq2o+pntmfWo2atTt
xWZ7fjMbvaeFlcTSxpImEWTqTO+RqYj+UuwBFZegTmjilIWkKQo2vFeoOTlY
dZ2An3s+wO5LgOOgA7ngK6YazxT6xVdjVlyZIortVS1Es1XITC374oVgVRns
EWO98RB7QlxHaHIQprvz6MlT/4C27nYJeAcL2f71YTuPPvPaY04+jSEwo8hu
R4stuaUczh2OZP2ccix3GeBB1qrt1aVrXK+4RhxaZljJdPQDx7H1zaq0Xsle
g/j+xKODlWXuo2oKx7dMC6V/SoSsTuK+1VQ51493V5lPQff3fKIbXPuqUoR9
+M8+X/pnbymtu5XJY0k3KptZeGkH8I99HPBE81w8fAsLHhJ+EcY1rq3j++qI
3v82eYTF0BNbzsMyIySOjqQmdEETSIgYMWlhtKCCjyBaewKYjSSytRA+BgZG
/gvhxPaaLxZkaFn2crkdQ39yXoFe0ET8OUhu5q7UWqGzlBpivvTgX/0Hv3d1
sbw0rozHt7HpsRQMghF30qoCivvXRwcHtp0HF6lPYhVkrYaypKpMICAYrwfa
6EvVPh0IgI8644wc9dSVYwkIFQ0gGMF3DFa2So0biVQCDOjVym8sSL8bMWkw
s2c9iohCk8ZzWyzEWOEGJXgU6s+LCRzJ54BERFpJMZDqxN/hZdUZr/j71/GZ
WWHpktd5SrIGzp8uJU/yGzoSf0zyJD5dAzlLyn78NVbFRZV6sTBZ1o+PFykQ
+/gyvZkXeXHbBxXLLDFx8hUqlTN0af0RTnp0WN7cgPwPE5quqvh0nmFnf06x
7Hb856RKs9RA4+dp+bck/v5f/888M6h+Q2NY82Idn8GR+df/3Y+/T35ZRT8k
i2RR1AXfQn40L7FMD8zqu1Vao3ogVYQAka9AKkVrCiePrK61IuQw+n9a0W1d
uP0AAA==

-->

</rfc>
