<?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-rfc2629 version 1.5.11 -->
<?rfc toc="yes"?>
<?rfc docindent="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="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-01" category="std" obsoletes="" updates="" submissionType="IETF" xml:lang="en" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.10.0 -->
  <front>
    <title>QUIC event definitions for qlog</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-quic-events-01"/>
    <author initials="R." surname="Marx" fullname="Robin Marx">
      <organization>KU Leuven</organization>
      <address>
        <email>robin.marx@kuleuven.be</email>
      </address>
    </author>
    <author initials="L." surname="Niccolini" fullname="Luca Niccolini" role="editor">
      <organization>Facebook</organization>
      <address>
        <email>lniccolini@fb.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>
    <date year="2022" month="March" day="07"/>
    <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" format="default"/>.</t>
    </abstract>
  </front>
  <middle>
    <section anchor="introduction" numbered="true" toc="default">
      <name>Introduction</name>
      <t>This document describes the values of the qlog name ("category" + "event") and
"data" fields and their semantics for the QUIC protocol. This document is based on
draft-34 of the QUIC I-Ds <xref target="QUIC-TRANSPORT" format="default"/>, <xref target="QUIC-RECOVERY" format="default"/>, and <xref target="QUIC-TLS" format="default"/>. HTTP/3 and
QPACK events are defined in a separate document <xref target="QLOG-H3" format="default"/>.</t>
      <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" numbered="true" toc="default">
        <name>Notational Conventions</name>
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be
interpreted as described in <xref target="RFC2119" format="default"/>.</t>
        <t>The event and data structure definitions in ths document are expressed
in the Concise Data Definition Language <xref target="CDDL" format="default"/> and its
extensions described in <xref target="QLOG-MAIN" format="default"/>.</t>
      </section>
    </section>
    <section anchor="overview" numbered="true" toc="default">
      <name>Overview</name>
      <t>This document describes the values of the qlog "name" ("category" + "event") and
"data" fields and their semantics for the QUIC protocol.</t>
      <t>This document assumes the usage of the encompassing main qlog schema defined in
<xref target="QLOG-MAIN" format="default"/>. Each subsection below defines a separate category (for example
connectivity, transport, recovery) and each subsubsection is an event type (for
example <tt>packet_received</tt>).</t>
      <t>For each event type, its importance and data definition is laid out, often
accompanied by possible values for the optional "trigger" field. For the
definition and semantics of "importance" and "trigger", see the main schema
document.</t>
      <t>Most of the complex datastructures, enums and re-usable definitions are grouped
together on the bottom of this document for clarity.</t>
      <section anchor="links-to-the-main-schema" numbered="true" toc="default">
        <name>Links to the main schema</name>
        <t>This document re-uses all the fields defined in the main qlog schema (e.g., name,
category, type, data, group_id, protocol_type, the time-related fields,
importance, RawInfo, etc.).</t>
        <t>One entry in the "protocol_type" qlog array field MUST be "QUIC" if events from
this document are included in a qlog trace.</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" numbered="true" toc="default">
          <name>Raw packet and frame information</name>
          <t>This document re-uses the definition of the RawInfo data class from <xref target="QLOG-MAIN" format="default"/>.</t>
          <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 calulation 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" numbered="true" toc="default">
          <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 SHOULD 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 MAY 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>
    <section anchor="quic-event-definitions" numbered="true" toc="default">
      <name>QUIC event definitions</name>
      <t>Each subheading in this section is a qlog event category, while each
sub-subheading is a qlog event type. Concretely, for the following two items, we
have the category "connectivity" and event type "server_listening", resulting in a
concatenated qlog "name" field value of "connectivity:server_listening".</t>
      <section anchor="connectivity" numbered="true" toc="default">
        <name>connectivity</name>
        <section anchor="serverlistening" numbered="true" toc="default">
          <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="connectionstarted" numbered="true" toc="default">
          <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="connectionclosed" numbered="true" toc="default">
          <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="connectionidupdated" numbered="true" toc="default">
          <name>connection_id_updated</name>
          <t>Importance: Base</t>
          <t>This event is emitted when either party updates their current Connection ID. As
this typically happens only sparingly over the course of a connection, this event
allows loggers to be more efficient than logging the observed CID with each packet
in the .header field of the "packet_sent" or "packet_received" events.</t>
          <t>This is viewed from the perspective of the one applying the new id. As such, if we
receive a new connection id from our peer, we will see the dst_ fields are set. If
we update our own connection id (e.g., NEW_CONNECTION_ID frame), we log the src_
fields.</t>
          <t>Definition:</t>
          <figure anchor="connectivity-connectionidupdated-def">
            <name>ConnectivityConnectionIDUpdated definition</name>
            <sourcecode type="cddl"><![CDATA[
ConnectivityConnectionIDUpdated = {
    owner: Owner

    ? old: ConnectionID
    ? new: ConnectionID
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="spinbitupdated" numbered="true" toc="default">
          <name>spin_bit_updated</name>
          <t>Importance: Base</t>
          <t>To be emitted when the spin bit changes value. It SHOULD NOT 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="connectionretried" numbered="true" toc="default">
          <name>connection_retried</name>
          <t>TODO</t>
        </section>
        <section anchor="connectionstateupdated" numbered="true" toc="default">
          <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" numbered="true" toc="default">
          <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>
      <section anchor="security" numbered="true" toc="default">
        <name>security</name>
        <section anchor="keyupdated" numbered="true" toc="default">
          <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="keyretired" numbered="true" toc="default">
          <name>key_retired</name>
          <t>Importance: Base</t>
          <t>Definition:</t>
          <figure anchor="security-keyretired-def">
            <name>SecurityKeyRetired definition</name>
            <sourcecode type="cddl"><![CDATA[
SecurityKeyRetired = {
    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="transport" numbered="true" toc="default">
        <name>transport</name>
        <section anchor="versioninformation" numbered="true" toc="default">
          <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="alpninformation" numbered="true" toc="default">
          <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="parametersset" numbered="true" toc="default">
          <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 MUST be
correct for all settings included a single event instance. If you need to log
settings from two sides, you MUST 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: Token
    ? 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: Token
}
]]></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="parametersrestored" numbered="true" toc="default">
          <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="packetsent" numbered="true" toc="default">
          <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

    ; see appendix for the QuicFrame definitions
    ? 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: hexstring .size 16

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

    ? raw: RawInfo
    ? datagram_id: uint32

    ? trigger:
      ; draft-23 5.1.1
      "retransmit_reordered" /
      ; draft-23 5.1.2
      "retransmit_timeout" /
      ; draft-23 5.3.1
      "pto_probe" /
      ; draft-19 6.2
      "retransmit_crypto" /
      ; needed for some CCs to figure out bandwidth allocations
      ; when there are no normal sends
      "cc_bandwidth_probe"
}
]]></sourcecode>
          </figure>
          <t>Note: We do not explicitly log the encryption_level or packet_number_space: the
header.packet_type specifies this by inference (assuming correct implementation)</t>
          <t>Note: for more details on "datagram_id", see <xref target="datagram-id" format="default"/>. It is only needed
when keeping track of packet coalescing.</t>
        </section>
        <section anchor="packetreceived" numbered="true" toc="default">
          <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

    ; see appendix for the definitions
    ? 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: hexstring .size 16

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

    ? raw: RawInfo
    ? datagram_id: uint32

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

    ? raw: RawInfo
    ? datagram_id: uint32

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

    ? raw: RawInfo
    ? datagram_id: uint32

    ? trigger:
        ; indicates the parser cannot keep up, temporarily buffers
        ; packet for later processing
        "backpressure" /
        ; if packet cannot be decrypted because the proper keys were
        ; not yet available
        "keys_unavailable"
}
]]></sourcecode>
          </figure>
          <t>Note: for more details on "datagram_id", see <xref target="datagram-id" format="default"/>. It is only needed
when keeping track of packet coalescing.</t>
        </section>
        <section anchor="packetsacked" numbered="true" toc="default">
          <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="datagram-id" numbered="true" toc="default">
          <name>datagrams_sent</name>
          <t>Importance: Extra</t>
          <t>When we pass one or more UDP-level datagrams to the socket. This is useful for
determining how QUIC packet buffers are drained to the OS.</t>
          <t>Definition:</t>
          <figure anchor="transport-datagramssent-def">
            <name>TransportDatagramsSent definition</name>
            <sourcecode type="cddl"><![CDATA[
TransportDatagramsSent = {
    ; to support passing multiple at once
    ? count: uint16

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

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

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

    ? datagram_ids: [+ uint32]
}
]]></sourcecode>
          </figure>
          <t>Note: for more details on "datagram_ids", see <xref target="datagram-id" format="default"/>.</t>
        </section>
        <section anchor="datagramdropped" numbered="true" toc="default">
          <name>datagram_dropped</name>
          <t>Importance: Extra</t>
          <t>When we drop a UDP-level datagram. This is typically if it does not contain a
valid QUIC packet (in that case, use packet_dropped instead).</t>
          <t>Definition:</t>
          <figure anchor="transport-datagramdropped-def">
            <name>TransportDatagramDropped definition</name>
            <sourcecode type="cddl"><![CDATA[
TransportDatagramDropped = {
    ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="streamstateupdated" numbered="true" toc="default">
          <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 SHOULD mainly log the simplified bidirectional
(HTTP/2-alike) stream states (e.g., idle, open, closed) instead of the more
finegrained stream states (e.g., data_sent, reset_received). These latter ones are
mainly for more in-depth debugging. Tools SHOULD be able to deal with both types
equally.</t>
        </section>
        <section anchor="framesprocessed" numbered="true" toc="default">
          <name>frames_processed</name>
          <t>Importance: Extra</t>
          <t>This event's main goal is to prevent a large proliferation of specific purpose
events (e.g., packets_acknowledged, flow_control_updated, stream_data_received).
We want to give implementations the opportunity to (selectively) log this type of
signal without having to log packet-level details (e.g., in packet_received).
Since for almost all cases, the effects of applying a frame to the internal state
of an implementation can be inferred from that frame's contents, we aggregate
these events in this single "frames_processed" event.</t>
          <t>Note: This event can be used to signal internal state change not resulting
directly from the actual "parsing" of a frame (e.g., the frame could have been
parsed, data put into a buffer, then later processed, then logged with this
event).</t>
          <t>Note: Implementations logging "packet_received" and which include all of the
packet's constituent frames therein, are not expected to emit this
"frames_processed" event. Rather, implementations not wishing to log full packets
or that wish to explicitly convey extra information about when frames are
processed (if not directly tied to their reception) can use this event.</t>
          <t>Note: for some events, this approach will lose some information (e.g., for which
encryption level are packets being acknowledged?). If this information is
important, please use the packet_received event instead.</t>
          <t>Note: in some implementations, it can be difficult to log frames directly, even
when using packet_sent and packet_received events. For these cases, this event
also contains the direct packet_number field, which can be used to more explicitly
link this event to the packet_sent/received events.</t>
          <t>Definition:</t>
          <figure anchor="transport-framesprocessed-def">
            <name>TransportFramesProcessed definition</name>
            <sourcecode type="cddl"><![CDATA[
TransportFramesProcessed = {
    ; see appendix for the QuicFrame definitions
    frames: [* QuicFrame]

    ? packet_number: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="datamoved" numbered="true" toc="default">
          <name>data_moved</name>
          <t>Importance: Base</t>
          <t>Used to indicate when data moves between the different layers (for example passing
from the application protocol (e.g., HTTP) to QUIC stream buffers and vice versa)
or between the application protocol (e.g., HTTP) and the actual user application
on top (for example a browser engine). This helps make clear the flow of data, how
long data remains in various buffers and the overheads introduced by individual
layers.</t>
          <t>For example, this helps make clear whether received data on a QUIC stream is moved
to the application protocol immediately (for example per received packet) or in
larger batches (for example, all QUIC packets are processed first and afterwards
the application layer reads from the streams with newly available data). This in
turn can help identify bottlenecks or scheduling problems.</t>
          <t>Definition:</t>
          <figure anchor="transport-datamoved-def">
            <name>TransportDataMoved definition</name>
            <sourcecode type="cddl"><![CDATA[
TransportDataMoved = {
    ? stream_id: uint64
    ? offset: uint64

    ; byte length of the moved data
    ? length: uint64

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

    ; raw bytes that were transferred
    ? data: hexstring
}
]]></sourcecode>
          </figure>
          <t>Note: we do not for example use a "direction" field (with values "up" and "down")
to specify the data flow. This is because in some optimized implementations, data
might skip some individual layers. Additionally, using explicit "from" and "to"
fields is more flexible and allows the definition of other conceptual "layers"
(for example to indicate data from QUIC CRYPTO frames being passed to a TLS
library ("security") or from HTTP/3 to QPACK ("qpack")).</t>
          <t>Note: this event type is part of the "transport" category, but really spans all
the different layers. This means we have a few leaky abstractions here (for
example, the stream_id or stream offset might not be available at some logging
points, or the raw data might not be in a byte-array form). In these situations,
implementers can decide to define new, in-context fields to aid in manual
debugging.</t>
        </section>
      </section>
      <section anchor="recovery" numbered="true" toc="default">
        <name>recovery</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
SHOULD 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="parametersset-1" numbered="true" toc="default">
          <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, MAY emit the parameters_set event twice.</t>
          <t>Definition:</t>
          <figure anchor="recovery-parametersset-def">
            <name>RecoveryParametersSet definition</name>
            <sourcecode type="cddl"><![CDATA[
RecoveryParametersSet = {
    ; Loss detection, see recovery draft-23, Appendix A.2
    ; in amount of packets
    ? reordering_threshold: uint16

    ; as RTT multiplier
    ? time_threshold: float32

    ; in ms
    timer_granularity: uint16

    ; in ms
    ? initial_rtt:float32

    ; congestion control, Appendix B.1.
    ; in bytes. Note: this could be updated after pmtud
    ? max_datagram_size: uint32

    ; in bytes
    ? initial_congestion_window: uint64

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

    ; as PTO multiplier
    ? persistent_congestion_threshold: uint16
}
]]></sourcecode>
          </figure>
          <t>Additionally, this event can contain any number of unspecified fields to support
different recovery approaches.</t>
        </section>
        <section anchor="metricsupdated" numbered="true" toc="default">
          <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 SHOULD 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 MAY 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 SHOULD 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="congestionstateupdated" numbered="true" toc="default">
          <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 SHOULD be logged if there are multiple ways in which a state change
can occur but MAY be omitted if a given state can only be due to a single event
occuring (e.g., slow start is exited only when ssthresh is exceeded).</t>
        </section>
        <section anchor="losstimerupdated" numbered="true" toc="default">
          <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="packetlost" numbered="true" toc="default">
          <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
    ; see appendix for the QuicFrame definitions
    ? frames: [* QuicFrame]

    ? trigger:
        "reordering_threshold" /
        "time_threshold" /
        ; draft-23 section 5.3.1, MAY
        "pto_expired"
}
]]></sourcecode>
          </figure>
          <t>For this event, the "trigger" field SHOULD be set (for example to one of the
values below), as this helps tremendously in debugging.</t>
        </section>
        <section anchor="markedforretransmit" numbered="true" toc="default">
          <name>marked_for_retransmit</name>
          <t>Importance: Extra</t>
          <t>This event indicates which data was marked for retransmit upon detecing a packet
loss (see packet_lost). Similar to our reasoning for the "frames_processed" event,
in order to keep the amount of different events low, we group this signal for all
types of retransmittable data in a single event based on existing QUIC frame
definitions.</t>
          <t>Implementations retransmitting full packets or frames directly can just log the
consituent 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="ccdl"><![CDATA[
RecoveryMarkedForRetransmit = {
    ; see appendix for the QuicFrame definitions
    frames: [+ QuicFrame]
}
]]></sourcecode>
          </figure>
        </section>
      </section>
    </section>
    <section anchor="security-considerations" numbered="true" toc="default">
      <name>Security Considerations</name>
      <t>TBD</t>
    </section>
    <section anchor="iana-considerations" numbered="true" toc="default">
      <name>IANA Considerations</name>
      <t>TBD</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="QUIC-TRANSPORT">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author initials="J." surname="Iyengar" fullname="Jana Iyengar" role="editor">
              <organization>Fastly</organization>
            </author>
            <author initials="M." surname="Thomson" fullname="Martin Thomson" role="editor">
              <organization>Mozilla</organization>
            </author>
            <date year="2021" month="May"/>
          </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 initials="J." surname="Iyengar" fullname="Jana Iyengar" role="editor">
              <organization>Fastly</organization>
            </author>
            <author initials="I." surname="Swett" fullname="Ian Swett" role="editor">
              <organization>Google</organization>
            </author>
            <date year="2021" month="May"/>
          </front>
          <seriesInfo name="RFC" value="9002"/>
          <seriesInfo name="DOI" value="10.17487/RFC9002"/>
        </reference>
        <reference anchor="QUIC-TLS">
          <front>
            <title>Using TLS to Secure QUIC</title>
            <author initials="M." surname="Thomson" fullname="Martin Thomson" role="editor">
              <organization>Mozilla</organization>
            </author>
            <author initials="S." surname="Turner" fullname="Sean Turner" role="editor">
              <organization>sn3rd</organization>
            </author>
            <date year="2021" month="May"/>
          </front>
          <seriesInfo name="RFC" value="9001"/>
          <seriesInfo name="DOI" value="10.17487/RFC9001"/>
        </reference>
        <reference anchor="QLOG-MAIN">
          <front>
            <title>Main logging schema for qlog</title>
            <author initials="R." surname="Marx" fullname="Robin Marx" role="editor">
              <organization>KU Leuven</organization>
            </author>
            <author initials="L." surname="Niccolini" fullname="Luca Niccolini" role="editor">
              <organization>Facebook</organization>
            </author>
            <author initials="M." surname="Seemann" fullname="Marten Seemann" role="editor">
              <organization>Protocol Labs</organization>
            </author>
            <date/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-main-schema-03"/>
        </reference>
        <reference anchor="QLOG-H3">
          <front>
            <title>HTTP/3 and QPACK event definitions for qlog</title>
            <author initials="R." surname="Marx" fullname="Robin Marx" role="editor">
              <organization>KU Leuven</organization>
            </author>
            <author initials="L." surname="Niccolini" fullname="Luca Niccolini" role="editor">
              <organization>Facebook</organization>
            </author>
            <author initials="M." surname="Seemann" fullname="Marten Seemann" role="editor">
              <organization>Protocol Labs</organization>
            </author>
            <date/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-h3-events-01"/>
        </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>
      <references>
        <name>Informative References</name>
        <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>
      </references>
    </references>
    <section anchor="quic-data-field-definitions" numbered="true" toc="default">
      <name>QUIC data field definitions</name>
      <section anchor="protocoleventbody-extension" numbered="true" toc="default">
        <name>ProtocolEventBody extension</name>
        <t>We extend the <tt>$ProtocolEventBody</tt> extension point defined in
<xref target="QLOG-MAIN" format="default"/> with the QUIC protocol events defined in this document.</t>
        <sourcecode type="cddl"><![CDATA[
QuicEvents = ConnectivityServerListening /
             ConnectivityConnectionStarted /
             ConnectivityConnectionClosed /
             ConnectivityConnectionIDUpdated /
             ConnectivitySpinBitUpdated /
             ConnectivityConnectionStateUpdated /
             SecurityKeyUpdated / SecurityKeyRetired /
             TransportVersionInformation / TransportALPNInformation /
             TransportParametersSet / TransportParametersRestored /
             TransportPacketSent / TransportPacketReceived /
             TransportPacketDropped / TransportPacketBuffered /
             TransportPacketsAcked / TransportDatagramsSent /
             TransportDatagramsReceived / TransportDatagramDropped /
             TransportStreamStateUpdated / TransportFramesProcessed /
             TransportDataMoved /
             RecoveryParametersSet / RecoveryMetricsUpdated /
             RecoveryCongestionStateUpdated /
             RecoveryLossTimerUpdated /
             RecoveryPacketLost

$ProtocolEventBody /= QuicEvents
]]></sourcecode>
      </section>
      <section anchor="quicversion" numbered="true" toc="default">
        <name>QuicVersion</name>
        <figure anchor="quicversion-def">
          <name>QuicVersion definition</name>
          <sourcecode type="cddl"><![CDATA[
QuicVersion = hexstring
]]></sourcecode>
        </figure>
      </section>
      <section anchor="connectionid" numbered="true" toc="default">
        <name>ConnectionID</name>
        <figure anchor="connectionid-def">
          <name>ConnectionID definition</name>
          <sourcecode type="cddl"><![CDATA[
ConnectionID = hexstring
]]></sourcecode>
        </figure>
      </section>
      <section anchor="owner" numbered="true" toc="default">
        <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" numbered="true" toc="default">
        <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" numbered="true" toc="default">
        <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" numbered="true" toc="default">
        <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" numbered="true" toc="default">
        <name>PacketHeader</name>
        <figure anchor="packetheader-def">
          <name>PacketHeader definition</name>
          <sourcecode type="cddl"><![CDATA[
PacketHeader = {
    packet_type: PacketType
    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" numbered="true" toc="default">
        <name>Token</name>
        <figure anchor="token-def">
          <name>Token definition</name>
          <sourcecode type="cddl"><![CDATA[
Token = {
    ? type: "retry" / "resumption" / "stateless_reset"

    ; byte length of the token
    ? length: uint32

    ; raw byte value of the token
    ? data: hexstring

    ; decoded fields included in the token
    ; (typically: peer's IP address, creation time)
    ? details: {
      * text => any
    }
}
]]></sourcecode>
        </figure>
        <t>The token carried in an Initial packet can either be a retry token from a Retry
packet, a stateless reset token from a Stateless Reset packet or one originally
provided by the server in a NEW_TOKEN frame used when resuming a connection (e.g.,
for address validation purposes). Retry and resumption tokens typically contain
encoded metadata to check the token's validity when it is used, but this metadata
and its format is implementation specific. For that, this field includes a
general-purpose "details" field.</t>
      </section>
      <section anchor="keytype" numbered="true" toc="default">
        <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" numbered="true" toc="default">
        <name>QUIC Frames</name>
        <figure anchor="quicframe-def">
          <name>QuicFrame definition</name>
          <sourcecode type="cddl"><![CDATA[
QuicFrame =
  PaddingFrame / PingFrame / AckFrame / ResetStreamFrame /
  StopSendingFrame / CryptoFrame / NewTokenFrame / StreamFrame /
  MaxDataFrame / MaxStreamDataFrame / MaxStreamsFrame /
  DataBlockedFrame / StreamDataBlockedFrame / StreamsBlockedFrame /
  NewConnectionIDFrame / RetireConnectionIDFrame /
  PathChallengeFrame / PathResponseFrame / ConnectionCloseFrame /
  HandshakeDoneFrame / UnknownFrame
]]></sourcecode>
        </figure>
        <section anchor="paddingframe" numbered="true" toc="default">
          <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 SHOULD 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" numbered="true" toc="default">
          <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" numbered="true" toc="default">
          <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 SHOULD
log [120] instead and tools MUST be able to deal with both notations.</t>
        </section>
        <section anchor="resetstreamframe" numbered="true" toc="default">
          <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" numbered="true" toc="default">
          <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" numbered="true" toc="default">
          <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" numbered="true" toc="default">
          <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" numbered="true" toc="default">
          <name>StreamFrame</name>
          <figure anchor="streamframe-def">
            <name>StreamFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
StreamFrame = {
    frame_type: "stream"

    stream_id: uint64

    ; These two MUST always be set
    ; If not present in the Frame type, log their default values
    offset: uint64
    length: uint64

    ; this MAY be set any time,
    ; but MUST only be set if the value is true
    ; if absent, the value MUST be assumed to be false
    ? fin: bool .default false

    ? raw: hexstring
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="maxdataframe" numbered="true" toc="default">
          <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" numbered="true" toc="default">
          <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" numbered="true" toc="default">
          <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" numbered="true" toc="default">
          <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" numbered="true" toc="default">
          <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" numbered="true" toc="default">
          <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" numbered="true" toc="default">
          <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: Token
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="retireconnectionidframe" numbered="true" toc="default">
          <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" numbered="true" toc="default">
          <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" numbered="true" toc="default">
          <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" numbered="true" toc="default">
          <name>ConnectionCloseFrame</name>
          <t>raw_error_code is the actual, numerical code. This is useful because some error
types are spread out over a range of codes (e.g., QUIC's crypto_error).</t>
          <figure anchor="connectioncloseframe-def">
            <name>ConnectionCloseFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
ErrorSpace = "transport" / "application"

ConnectionCloseFrame = {
    frame_type: "connection_close"

    ? error_space: ErrorSpace
    ? error_code: TransportError / $ApplicationError / uint32
    ? raw_error_code: uint32
    ? reason: text

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

    ? raw_length: uint32
    ? raw: hexstring
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="transporterror" numbered="true" toc="default">
          <name>TransportError</name>
          <figure anchor="transporterror-def">
            <name>TransportError definition</name>
            <sourcecode type="cddl"><![CDATA[
TransportError = "no_error" / "internal_error" /
    "connection_refused" / "flow_control_error" /
    "stream_limit_error" / "stream_state_error" /
    "final_size_error" / "frame_encoding_error" /
    "transport_parameter_error" / "connection_id_limit_error" /
    "protocol_violation" / "invalid_token" / "application_error" /
    "crypto_buffer_exceeded"
]]></sourcecode>
          </figure>
        </section>
        <section anchor="applicationerror" numbered="true" toc="default">
          <name>ApplicationError</name>
          <t>By definition, an application error is defined by the application-level protocol running on top of QUIC (e.g., HTTP/3).</t>
          <t>As such, we cannot define it here directly. Though we provide an extension point through the use of the CDDL "socket" mechanism.</t>
          <t>Application-level qlog definitions that wish to define new ApplicationError strings MUST do so by extending the $ApplicationError socket as such:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
$ApplicationError /= "new_error_name" / "another_new_error_name"
]]></artwork>
        </section>
        <section anchor="cryptoerror" numbered="true" toc="default">
          <name>CryptoError</name>
          <t>These errors are defined in the TLS document as "A TLS alert is turned into a QUIC
connection error by converting the one-byte alert description into a QUIC error
code. The alert description is added to 0x100 to produce a QUIC error code from
the range reserved for CRYPTO_ERROR."</t>
          <t>This approach maps badly to a pre-defined enum. As such, we define the
crypto_error string as having a dynamic component here, which should include the
hex-encoded and zero-padded value of the TLS alert description.</t>
          <figure anchor="cryptoerror-def">
            <name>CryptoError definition</name>
            <sourcecode type="cddl"><![CDATA[
; all strings from "crypto_error_0x100" to "crypto_error_0x199"
CryptoError = text .regexp "crypto_error_0x1[0-9][0-9]"
]]></sourcecode>
          </figure>
        </section>
      </section>
    </section>
    <section anchor="change-log" numbered="true" toc="default">
      <name>Change Log</name>
      <section anchor="since-draft-ietf-qlog-quic-events-00" numbered="true" toc="default">
        <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" numbered="true" toc="default">
        <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" numbered="true" toc="default">
        <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" numbered="true" toc="default">
        <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 anchor="design-variations" numbered="true" toc="default">
      <name>Design Variations</name>
      <t>TBD</t>
    </section>
    <section anchor="acknowledgements" numbered="true" toc="default">
      <name>Acknowledgements</name>
      <t>Much of the initial work by Robin Marx was done at Hasselt University.</t>
      <t>Thanks to Marten Seemann, Jana Iyengar, Brian Trammell, Dmitri Tikhonov, Stephen
Petrides, Jari Arkko, Marcus Ihlar, Victor Vasiliev, Mirja Kuehlewind, Jeremy
Laine, Kazu Yamamoto, Christian Huitema, and Lucas Pardue for their feedback and
suggestions.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
jX/+p87HP3tpprk2kqfy//iH56++G704Onv51iX8Zg8ZdcIRWukaCR6Ws9WC
vRitEINwP+XPn9k8tFRxnFKcPifNGvHMMWL638ZqsWThetDHx1z68EHfuuLx
Wz5vFUl/6IydPt9q0VM3bi/uqVPWaratcNOee9suErKpl/DGZq/vhU2SubkP
m9Jur/3Uhsttb6wxXJ32Nv3D9vYS5e41D6OCN7XuhvX1dGEnt6GTnuANr5e2
D+S2qbD3UOuL/su1vU223A2tNxiZNnzdUQU3zkkl2ijqUpp471nsSAARXiRf
fuWykFbIUyzfah2xlFxjuU9JGeRTZ79Z2700TH3drVCPj3vHcqkGst4q1tSw
M5pUC7DD0G+MkdPILS1s6AKFqM6APwK36XRtU4ET9z173QXfUzTLuM+QKZuM
/KmuyMNsvlokBWnJnKULSUNkazkODg6/GO/D/x3Qm/jdE7x8fBoPDvf3Dyb7
6dWXky8/Sx5P9uF//K8vk0Mz2X/8xf7ki8ePn0irz3e5GXu1qePdCMfCfHHq
myTC+8LGOiaLq+xmBUrJbuSW8IxMswC17v5kS8m27oPOtQzBZ0FkwYZ78u4J
bci7zwderz345Rp1NoWRnyMM7SDuIY6iybtwKBu6Tr/2zy8v6Y8D/YPzO2oc
W19qRPyqnb4Rn4n7j1sJy3moq/hL8aa2YS2BCay1JO/d9pW1M4C0pyUJTrCj
7uz8UTZMUs0VrfnxYysuemaQib9T3ruWk7s1xRm8LYyv8+SmpemI3QS11CXf
KQ69Wqr0WzrBakVojUL7eKGGGo1ZDa8yxbUWLyidERHvj9Gajg++5qlI2Yx2
as1OTk2bL47bbksRurFt/K//Guwq/iSElQ4u7A1Y6BgcRkws85WmuaIsfj3O
wt1UobJyrfTDEHeAkVyTFBEsqZqYfU7CPOmBh0Gt25LOslRpDvq6Lo1XFTd0
n+qts8mv6lmW627wk7TzBL7pLw6Sdl98aB0QXnP3bAiGd46F7K1z/sbf3qWX
WLCVvlCMrFSm6SUpWzy/G6+Gib+Pzu1Iib7NEdRp1/a01r0BkSJ1N7m2PJMg
gusBmJZ1BJxQUqxPauB8sbCEIftcku8fSDC71kROgYsTgUocc3m++Nn/xFtl
evbBj3PB4QIvbwJq906OPgScqqpMnGaADQcFIzu8mDZCGpJdO4lRpVxLlJyt
+45bwmGz4ccX9uU5vZRhyko8lrgoTr6ObJ08ziPmysJBJy9P/zS9fPXD6Usx
Q1Ao0x3XwZO8rkk3mWMkOeuJzVL2CInQ4FjXenfMS9GaFlrMiubvp6SQG32M
T6NdB8E2IY0XPX/mBov0KXA/kZFQrdarNblOYr/qhh2muQO6VaeKlqT70G1L
6BGqAboaFZY0QeEwVzsz4orV+UhWh6HehERaeIxOn62cbs+fPJF0AAOpcGir
DlFdeL4/4tp7nTdBO0uGe1r2vAva7qObULdZ+DhocdDfwn9szwiwvraIoUvv
0CgyIbAq1JL52XiDsHqNieWKG36wF7/2/gb1Tv8knGeVSx5B04umXF5wlgP9
7pjyxOuvl+aOTrD+bnfwInmPCpi+hp/8Re/D2rXD99/kmMwnDbve+KIOn0If
MDefH7iFogGg5w2Bqpkfz/FCFLQ6CzB4CNBZotOdhUJoEHE9fK+ocwJEQ79+
w4Ik/QwUL6IRbbWrbXbTmD5/H6nYHW7+MH59dHJy9vI7L26WkxSsNeQJCWhS
Ows6sZHyWjjJPuaMirjOH2WkWvIw/Jn1AQayUWIBeMl8g7ZaECnIKxjtluwn
gaMUkRfj4k8ZjrVzapLLk5yiuzCFiknerV3lcQmV65q45bZG7OEReY+Tdd6u
LsB2voZsfGlJqqVJFk4O43fXFxgSrwAl57o9a94O+SYzh3EgLnsDq5RArfWu
WyBrBQHO1sR8Qi2/TqTl556g1hENWOb2V2Vf+bIPDdrBtGC6PcjmMM2t8J7l
/a3X9vUDVte7tC3rUooXqPgiRVgcEkFblPgfD95SIBP6/ImS5V4ND9/ujqGL
b8MPJhFrPBzpKP0BwnM81wRvxIy7LdL3BR8sOJjSnL0q/fZNCa03aUBYLRW6
jZ52O7bZH7BzAMI5udM/gxV8emjzYUaWH/RuMPp99AUgJK7QXctZ3l2C1Fzy
50eC2PDHJ8PP3gL4vsB/HewPDw/fvkUxKqMondT1i/67dFNF9w0677fa/+nx
S9gKDZbzvAWLsiHHQM4JUJmctBaWgVXa5Rt58uIS7UiFWqDsBy1fXHi0Pwme
zExHxf3H4DyApYPyduN6XWSdcuyu/bTF2IeyXu8BbwNJlDMlc9lZ9CeJpGiN
Yv9PP/7042fDr356O/wJtvXJT29/eku5FKWUJ/EXP77PBEcoIKQ8MdUhrSe9
HejgcH8I/8AAFMEX0UWflhGgWGDGdPiGLsiOjn+gZDiW44T514KoOeYp5E1L
A+EqJCkPF27DrDhS93ZTThwAWqIXzkhm2tKU74DSkrN6j5qkf6LP5Mz1hxdT
5v4pCvuT+J+8YvKn+BxEjy3hONdU49NF7fzDEZkWycvqIHQHTCFiE5Db0qmf
S60lt/YCuYavppqC7G8H5H8Q9HD2MvkO9Drr7zJCT473TfiedN8LMykTxWtt
Rbbjo/6Q9XsXw9121uFPp7uEQPnwFhEqJbyMYBGFueMiO7SODXU64SN605lU
2H13Wv6xb6f324qNWw+7IBdn90I6ShRJ+Bd7L8knZ5wqp2Xx45FxrKG6smRV
mHm6/phNFedK8Wym+n3FmkOf1M6Fjs84SfVsxo/YlVp0D0yVVa20vgB6RV/V
1lGLP7F0l9JlayFKLvDEuAXg31L/SZJithIQyAHqpTybiQ5urq/Qersb6Lk9
GKchi7S98AMDEntCY+ANftWZU9B976RaanU4tbbOvWGCXl40mmcfMdw6d26w
aQXtWWxZR71xEfUDVlD7s+9krXzQGurNC6g3zb5tmvCm37Fa9MyfUvZc8Ue0
AK8maTBJ/FC+68yyM9Am8rRlshsMLT1TDoqYejPvQ5xNq3E4s2lNG+azaWX1
1mXVD1tT3beeHlTavqp6+5Lqe9bTZ8AK2VzXirWB24VFlGhNFLo2M8F1HUkf
FRnIpssqA6EHE8U48cbPG0vecC4vGnz+LpmtxY+UL6jEkflpWDrbK5DCdqNI
giH9erx+Sftoe+3t6N7i8AFT950Q+nh7F6bdndlgQwz8zPutjD37I/B++Bb5
EjQ23eRWsWkOfabFtt0zMGx1jKI9q1jCV9OZfjZgbBHx5PMno6usiTbmAxJD
VTO37XvMVZ1J9C8jsNS2VhFacTctopKvfuMatHnvEsIZ9EjlPXblKAIRZup0
EBKbbKKzIaq+GAgCOge+7VTS0JRFnPkQe4lsGFZcLynAA+NOKNl1Iop4eU2d
WUMXmpoxzSTJ4zyXXd/4SZqQdWII80f52aWiqNdy3q9quANByXIHKtExKCTI
yI0cvGVlzXqBqaa2RXuz0uLU7yF8SbRtEqTBQsMfZ4m5thK2JGT1vZYHbmkD
8dXxOtBEM50uAMlivcuz5vyKZWO9huZ4hqkPO+ZHmrDLU7MsSAmiXX2rb3O6
WNq95PBQoecGpOekuSs2LBkxeOpN0r7CN50p9nTfnWBw4eKm5j/uxznr8oNv
EBe6UPX0irY+e4/CIZ13lhRMq7uYEIn7clgyJsPBK0pbyhG9TtihPqzu6B+r
CghELUF3QarksIWIPyTreP0HZQDCFs605H3PoCRsxlCisIUlGVObDcVr2hIO
golw+956la7aI2v7bTeqFmCYuHH8w1SjZnuyj1Oz3lR1vBE9tw4tqhNF36y9
z4YU++nlPqQROMiNvcHF08D7Rkupqvt4tSrI5VvSXAIBp7thL0Xm3mMk2UcY
jIeXfXdGBTFJFJZJ2IqGviAnKVc3c6roxC4PlGKr5eUOHI++arhuirqmHJ+c
PAccoXosg3hhMDw4qxc4g84iXIqKzItk0fzBLo9ZB45CScU8m5YYJnclbvv2
VqRL83lWeAuJoOCIiaiHNTxj4Zn5Aeb7YgwqKKHetPVK/XDVtCYbzQYb+i4I
3Ve7zOXzC+vjjzMaHNGjJDcc2o1ZLLXeD6f2jDz3EUaUK8msXDW6ZqCNI7rA
5X64cAb7jHg9iTigYkPv1zX6pbDhZf/9wf4+J2un9KVBLyQvcOwtZ7ZDMQJl
8eqdeINxEsHp6fn5q/PxQCLdbPblRbKs46skzdcc/Q6CiRYLAA644tJGFnMF
Jyh6ypNJ1AsW4CjJ1pM4XcP2UEGpBYheCGWq9ysxda2Qz4YKNr8fKc/FC4Bf
TFWOlgyFwPvK7ZMHsXHoPJznFkfJzWjgT3dKEB3ggjvPv/pqEHmIpG6748rc
mPfL7vc/7o++ekv/chSLv+mQK7/bdqTNMefZel7ekH8J55znGM7MNNcjKuKA
rgsjdgEc7e9TLP+xzfrGETZeco0c3qySG0YOLKxqLghYuGyiEjuPDp483u2M
t0iq9zweDTXyCATPYP54tH9Io/Mh0wwElIqUKlFhHv3KIEehmci+JSkH0NoK
SThcrTSWjlgcY8pTRCCOWYQpPv5iF0a6oHxMhPaIG5LX0iZE5BRNoLnRmMae
7BqachSClOcZxi72cxh/J7Hc0g/2fJEtVrlwA34qjgqUTiGmvLWLxAsP0j3A
o7pHoBZkXTJNlcX+7FJD/yy5JX4T4A8A8C+Sv5Q28QNtxAubwpaH4D2fNw3d
WFsOiqkIa0zcw0eunebUXdTaBKd6iLxyGciLgDDg3hwcDB99/tmunYDvgetS
2PjunuPwS8oix45qpAtdkzOQ5x0KzVu1t3YePdmnEXERukXItzQA34sM7I8a
F39+KcFFo8Ow3grVH4Yjv60Hp7rX5GsY/ojoksb4U/VaaUX+kMOOzyO7DbAn
pfgP7jz66snw0ZefDwGSXzgoWiwWhz2bOYjSfWambmWZtHlAB5KbYIBAog55
loNet2KtqyMp1x49eQxz+Wz46Isvh4+efOVaq+t+UDeA8t4uw4daGYR7gX8O
v3S9eHkmK43AcgeMUkXPMOfi9TreH6H/sgtHhQ6ho+hikVAaogDvTXXDyQgk
tUpAErh0Xjvripy+T+NvORqR3DStZl5QfpeqBMiurcwAqL4/fPT4K/iHNotQ
/tyg/JHGlFGX0KdaqXwv0Ve85+5FLdnz/Wfk3kvGuPbXUpUaz9kTHFCDl2jA
ifDXKcVr69rG/F9CfKoLjMuZS6gK0yWQzUE4aFDCDpB+QJx2QMM9fuhw/hBA
FwYUAKQh/g3WlLZB6aSOM38HRboWB+lKMvHgqIcMVSZgy1U9n1JqZZ+aTVrp
SrHZvt/MOqVoopqgVB8RZOpMS1HURH/pSo0i/KkTmjj5NmuyD+u1plmR6bJG
k1s/+nLfB9h9Tvx8l6aF4CmDLXk0cL7omvMDRLGt9kA029ars+yLF3JM5exL
SuuFh/gzd+R6PO4C77OdR4+f+Ae0Ux4i4B0T9sibesVBHn3htccIaRpDYEYO
i44WW3JLcSg77KD1JcWJ7DLAg3AY26srznyz4rRaqGqxEOnoB45jU0K5PM0w
xc8ee3Swtsx9Us/g+FZZqfRPiZBNC+S+VWd7109QMNtR0IN9n+gGhRJVirAP
/8XnS//iLaVVc5VYoqs/GmT3B/5xgAOekt5lUt9cHySAY/zi1OWAbiNX5Iqr
WxG9/23yCIuhpza5gmVGSBwdSU2oxgtIiOgIZGG0oAx4oGB6Api9ILcx4p8C
AyP7nXBiWymIBRlali1TtWPoT3aXtaVlkT8HUVPclWojOkvJyeRLD36dMPi9
q4vlpXEyMa+K7cwoBsGIO1ldA8X96dHhoW3nwUWyRRSSkc3mplhS7hsQEIzX
A230JRM1HwTAR4VJUQJFOuqZS44RECoaQDCCK5LVNleIG4lUgvjEUCndP2JS
Tj+wn1w5NccWi9jRC5vAwVgRB+V4FO3Pyys4mC8AlYjAknoAwtr3mMU+b+I3
RUbyRYMVzS6Bs9/SIXiBofFFfGFA1i6KYfz7pEjiszUQtKQaxt9golC0zy0W
Js+H8ckiA3IfX2a387Io3w3ji8Ys56aIXmMscYpG3d/DOuKj6vYWNADofLaq
47N5jp39McN8w7DQOsszA41fZNVfkviHf//f89xgflBoDAxssY6ew6H59/81
jH9IflnFf04WyaJsoLvjeYW5UGBG36+yBiY8JEA/X80wZ3FSpZJkkhH7GqRU
TIyA30T16kaT6o2j/wPbB2L+0u8AAA==

-->

</rfc>
