<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.17 (Ruby 3.0.2) -->
<?rfc docindent="yes"?>
<?rfc strict="yes"?>
<?rfc compact="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-quic-qlog-quic-events-02" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.14.2 -->
  <front>
    <title>QUIC event definitions for qlog</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-quic-events-02"/>
    <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="August" day="31"/>
    <area>Transport</area>
    <workgroup>QUIC</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>This document describes concrete qlog event definitions and their metadata for
QUIC events. These events can then be embedded in the higher level schema defined
in <xref target="QLOG-MAIN"/>.</t>
    </abstract>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>This document describes the values of the qlog name ("category" + "event") and
"data" fields and their semantics for the QUIC protocol. This document is based on
draft-34 of the QUIC I-Ds <xref target="QUIC-TRANSPORT"/>, <xref target="QUIC-RECOVERY"/>, and <xref target="QUIC-TLS"/>. HTTP/3 and
QPACK events are defined in a separate document <xref target="QLOG-H3"/>.</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">
        <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"/>.</t>
        <t>The event and data structure definitions in ths document are expressed
in the Concise Data Definition Language <xref target="CDDL"/> and its
extensions described in <xref target="QLOG-MAIN"/>.</t>
      </section>
    </section>
    <section anchor="overview">
      <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"/>. 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">
        <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">
          <name>Raw packet and frame information</name>
          <t>This document re-uses the definition of the RawInfo data class from <xref target="QLOG-MAIN"/>.</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">
          <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">
      <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">
        <name>connectivity</name>
        <section anchor="serverlistening">
          <name>server_listening</name>
          <t>Importance: Extra</t>
          <t>Emitted when the server starts accepting connections.</t>
          <t>Definition:</t>
          <figure anchor="connectivity-serverlistening-def">
            <name>ConnectivityServerListening definition</name>
            <sourcecode type="cddl"><![CDATA[
ConnectivityServerListening = {
    ? ip_v4: IPAddress
    ? ip_v6: IPAddress
    ? port_v4: uint16
    ? port_v6: uint16

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

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

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

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

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

    ? old: ConnectionID
    ? new: ConnectionID
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="spinbitupdated">
          <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">
          <name>connection_retried</name>
          <t>TODO</t>
        </section>
        <section anchor="connectionstateupdated">
          <name>connection_state_updated</name>
          <t>Importance: Base</t>
          <t>This event is used to track progress through QUIC's complex handshake and
connection close procedures. It is intended to provide exhaustive options to log
each state individually, but also provides a more basic, simpler set for
implementations less interested in tracking each smaller state transition. As
such, users should not expect to see -all- these states reflected in all qlogs and
implementers should focus on support for the SimpleConnectionState set.</t>
          <t>Definition:</t>
          <figure anchor="connectivity-connectionstateupdated-def">
            <name>ConnectivityConnectionStateUpdated definition</name>
            <sourcecode type="cddl"><![CDATA[
ConnectivityConnectionStateUpdated = {
    ? old: ConnectionState / SimpleConnectionState
    new: ConnectionState / SimpleConnectionState
}

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

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

    ? old: hexstring
    new: hexstring

    ; needed for 1RTT key updates
    ? generation: uint32

    ? trigger:
        ; (e.g., initial, handshake and 0-RTT keys
        ; are generated by TLS)
        "tls" /
        "remote_update" /
        "local_update"
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="keyretired">
          <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">
        <name>transport</name>
        <section anchor="versioninformation">
          <name>version_information</name>
          <t>Importance: Core</t>
          <t>QUIC endpoints each have their own list of of QUIC versions they support. The
client uses the most likely version in their first initial. If the server does
support that version, it replies with a version_negotiation packet, containing
supported versions. From this, the client selects a version. This event aggregates
all this information in a single event type. It also allows logging of supported
versions at an endpoint without actual version negotiation needing to happen.</t>
          <t>Definition:</t>
          <figure anchor="transport-versioninformation-def">
            <name>TransportVersionInformation definition</name>
            <sourcecode type="cddl"><![CDATA[
TransportVersionInformation = {
    ? server_versions: [+ QuicVersion]
    ? client_versions: [+ QuicVersion]
    ? chosen_version: QuicVersion
}
]]></sourcecode>
          </figure>
          <t>Intended use:</t>
          <ul spacing="normal">
            <li>When sending an initial, the client logs this event with client_versions and
chosen_version set</li>
            <li>Upon receiving a client initial with a supported version, the server logs this
event with server_versions and chosen_version set</li>
            <li>Upon receiving a client initial with an unsupported version, the server logs
this event with server_versions set and client_versions to the
single-element array containing the client's attempted version. The absence of
chosen_version implies no overlap was found.</li>
            <li>Upon receiving a version negotiation packet from the server, the client logs
this event with client_versions set and server_versions to the versions in
the version negotiation packet and chosen_version to the version it will use for
the next initial packet</li>
          </ul>
        </section>
        <section anchor="alpninformation">
          <name>alpn_information</name>
          <t>Importance: Core</t>
          <t>QUIC implementations each have their own list of application level protocols and
versions thereof they support. The client includes a list of their supported
options in its first initial as part of the TLS Application Layer Protocol
Negotiation (alpn) extension. If there are common option(s), the server chooses
the most optimal one and communicates this back to the client. If not, the
connection is closed.</t>
          <t>Definition:</t>
          <figure anchor="transport-alpninformation-def">
            <name>TransportALPNInformation definition</name>
            <sourcecode type="cddl"><![CDATA[
TransportALPNInformation = {
    ? server_alpns: [* text]
    ? client_alpns: [* text]
    ? chosen_alpn: text
}
]]></sourcecode>
          </figure>
          <t>Intended use:</t>
          <ul spacing="normal">
            <li>When sending an initial, the client logs this event with client_alpns set</li>
            <li>When receiving an initial with a supported alpn, the server logs this event with
server_alpns set, client_alpns equalling the client-provided list, and
chosen_alpn to the value it will send back to the client.</li>
            <li>When receiving an initial with an alpn, the client logs this event with
chosen_alpn to the received value.</li>
            <li>Alternatively, a client can choose to not log the first event, but wait for the
receipt of the server initial to log this event with both client_alpns and
chosen_alpn set.</li>
          </ul>
        </section>
        <section anchor="parametersset">
          <name>parameters_set</name>
          <t>Importance: Core</t>
          <t>This event groups settings from several different sources (transport parameters,
TLS ciphers, etc.) into a single event. This is done to minimize the amount of
events and to decouple conceptual setting impacts from their underlying mechanism
for easier high-level reasoning.</t>
          <t>All these settings are typically set once and never change. However, they are
typically set at different times during the connection, so there will typically be
several instances of this event with different fields set.</t>
          <t>Note that some settings have two variations (one set locally, one requested by the
remote peer). This is reflected in the "owner" field. As such, this field 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: StatelessResetToken
    ? disable_active_migration: bool

    ? max_idle_timeout: uint64
    ? max_udp_payload_size: uint32
    ? ack_delay_exponent: uint16
    ? max_ack_delay: uint16
    ? active_connection_id_limit: uint32

    ? initial_max_data: uint64
    ? initial_max_stream_data_bidi_local: uint64
    ? initial_max_stream_data_bidi_remote: uint64
    ? initial_max_stream_data_uni: uint64
    ? initial_max_streams_bidi: uint64
    ? initial_max_streams_uni: uint64

    ? preferred_address: PreferredAddress
}

PreferredAddress = {
    ip_v4: IPAddress
    ip_v6: IPAddress

    port_v4: uint16
    port_v6: uint16

    connection_id: ConnectionID
    stateless_reset_token: StatelessResetToken
}
]]></sourcecode>
          </figure>
          <t>Additionally, this event can contain any number of unspecified fields. This is to
reflect setting of for example unknown (greased) transport parameters or employed
(proprietary) extensions.</t>
        </section>
        <section anchor="parametersrestored">
          <name>parameters_restored</name>
          <t>Importance: Base</t>
          <t>When using QUIC 0-RTT, clients are expected to remember and restore the server's
transport parameters from the previous connection. This event is used to indicate
which parameters were restored and to which values when utilizing 0-RTT. Note that
not all transport parameters should be restored (many are even prohibited from
being re-utilized). The ones listed here are the ones expected to be useful for
correct 0-RTT usage.</t>
          <t>Definition:</t>
          <figure anchor="transport-parametersrestored-def">
            <name>TransportParametersRestored definition</name>
            <sourcecode type="cddl"><![CDATA[
TransportParametersRestored = {
    ? disable_active_migration: bool

    ? max_idle_timeout: uint64
    ? max_udp_payload_size: uint32
    ? active_connection_id_limit: uint32

    ? initial_max_data: uint64
    ? initial_max_stream_data_bidi_local: uint64
    ? initial_max_stream_data_bidi_remote: uint64,
    ? initial_max_stream_data_uni: uint64
    ? initial_max_streams_bidi: uint64
    ? initial_max_streams_uni: uint64
}
]]></sourcecode>
          </figure>
          <t>Note that, like parameters_set above, this event can contain any number of
unspecified fields to allow for additional/custom parameters.</t>
        </section>
        <section anchor="packetsent">
          <name>packet_sent</name>
          <t>Importance: Core</t>
          <t>Definition:</t>
          <figure anchor="transport-packetsent-def">
            <name>TransportPacketSent definition</name>
            <sourcecode type="cddl"><![CDATA[
TransportPacketSent = {
    header: PacketHeader

    ; 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: StatelessResetToken

    ; 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"/>. It is only needed
when keeping track of packet coalescing.</t>
        </section>
        <section anchor="packetreceived">
          <name>packet_received</name>
          <t>Importance: Core</t>
          <t>Definition:</t>
          <figure anchor="transport-packetreceived-def">
            <name>TransportPacketReceived definition</name>
            <sourcecode type="cddl"><![CDATA[
TransportPacketReceived = {
    header: PacketHeader

    ; 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: StatelessResetToken

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

    ? raw: RawInfo
    ? datagram_id: uint32

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

    ? raw: RawInfo
    ? datagram_id: uint32

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

    ? raw: RawInfo
    ? datagram_id: uint32

    ? trigger:
        ; indicates the parser cannot keep up, temporarily buffers
        ; packet for later processing
        "backpressure" /
        ; if packet cannot be decrypted because the proper keys were
        ; not yet available
        "keys_unavailable"
}
]]></sourcecode>
          </figure>
          <t>Note: for more details on "datagram_id", see <xref target="datagram-id"/>. It is only needed
when keeping track of packet coalescing.</t>
        </section>
        <section anchor="packetsacked">
          <name>packets_acked</name>
          <t>Importance: Extra</t>
          <t>This event is emitted when a (group of) sent packet(s) is acknowledged by the
remote peer <em>for the first time</em>. This information could also be deduced from the
contents of received ACK frames. However, ACK frames require additional processing
logic to determine when a given packet is acknowledged for the first time, as QUIC
uses ACK ranges which can include repeated ACKs. Additionally, this event can be
used by implementations that do not log frame contents.</t>
          <t>Definition:</t>
          <figure anchor="transport-packetsacked-def">
            <name>TransportPacketsAcked definition</name>
            <sourcecode type="cddl"><![CDATA[
TransportPacketsAcked = {
    ? packet_number_space: PacketNumberSpace

    ? packet_numbers: [+ uint64]
}
]]></sourcecode>
          </figure>
          <t>Note: if packet_number_space is omitted, it assumes the default value of
PacketNumberSpace.application_data, as this is by far the most prevalent packet
number space a typical QUIC connection will use.</t>
        </section>
        <section anchor="datagram-id">
          <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">
          <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"/>.</t>
        </section>
        <section anchor="datagramdropped">
          <name>datagram_dropped</name>
          <t>Importance: Extra</t>
          <t>When we drop a UDP-level datagram. This is typically if it does not contain a
valid QUIC packet (in that case, use packet_dropped instead).</t>
          <t>Definition:</t>
          <figure anchor="transport-datagramdropped-def">
            <name>TransportDatagramDropped definition</name>
            <sourcecode type="cddl"><![CDATA[
TransportDatagramDropped = {
    ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="streamstateupdated">
          <name>stream_state_updated</name>
          <t>Importance: Base</t>
          <t>This event is emitted whenever the internal state of a QUIC stream is updated, as
described in QUIC transport draft-23 section 3. Most of this can be inferred from
several types of frames going over the wire, but it's much easier to have explicit
signals for these state changes.</t>
          <t>Definition:</t>
          <figure anchor="transport-streamstateupdated-def">
            <name>TransportStreamStateUpdated definition</name>
            <sourcecode type="cddl"><![CDATA[
StreamType = "unidirectional" / "bidirectional"

TransportStreamStateUpdated = {
    stream_id: uint64

    ; mainly useful when opening the stream
    ? stream_type: StreamType

    ? old: StreamState
    new: StreamState

    ? stream_side: "sending" / "receiving"
}

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

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

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

    ; both-side states
    "data_received" /

    ; qlog-defined:
    ; memory actually freed
    "destroyed"
]]></sourcecode>
          </figure>
          <t>Note: QUIC implementations 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">
          <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">
          <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">
        <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">
          <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">
          <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">
          <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">
          <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">
          <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">
          <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">
      <name>Security Considerations</name>
      <t>TBD</t>
    </section>
    <section anchor="iana-considerations">
      <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-02"/>
        </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">
      <name>QUIC data field definitions</name>
      <section anchor="protocoleventbody-extension">
        <name>ProtocolEventBody extension</name>
        <t>We extend the <tt>$ProtocolEventBody</tt> extension point defined in
<xref target="QLOG-MAIN"/> 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">
        <name>QuicVersion</name>
        <figure anchor="quicversion-def">
          <name>QuicVersion definition</name>
          <sourcecode type="cddl"><![CDATA[
QuicVersion = hexstring
]]></sourcecode>
        </figure>
      </section>
      <section anchor="connectionid">
        <name>ConnectionID</name>
        <figure anchor="connectionid-def">
          <name>ConnectionID definition</name>
          <sourcecode type="cddl"><![CDATA[
ConnectionID = hexstring
]]></sourcecode>
        </figure>
      </section>
      <section anchor="owner">
        <name>Owner</name>
        <figure anchor="owner-def">
          <name>Owner definition</name>
          <sourcecode type="cddl"><![CDATA[
Owner = "local" / "remote"
]]></sourcecode>
        </figure>
      </section>
      <section anchor="ipaddress-and-ipversion">
        <name>IPAddress and IPVersion</name>
        <figure anchor="ipaddress-def">
          <name>IPAddress definition</name>
          <sourcecode type="cddl"><![CDATA[
; an IPAddress can either be a "human readable" form
; (e.g., "127.0.0.1" for v4 or
; "2001:0db8:85a3:0000:0000:8a2e:0370:7334" for v6) or
; use a raw byte-form (as the string forms can be ambiguous)
IPAddress = text / hexstring
]]></sourcecode>
        </figure>
        <figure anchor="ipversion-def">
          <name>IPVersion definition</name>
          <sourcecode type="cddl"><![CDATA[
IPVersion = "v4" / "v6"
]]></sourcecode>
        </figure>
      </section>
      <section anchor="packettype">
        <name>PacketType</name>
        <figure anchor="packettype-def">
          <name>PacketType definition</name>
          <sourcecode type="cddl"><![CDATA[
PacketType = "initial" / "handshake" / "0RTT" / "1RTT" / "retry" /
    "version_negotiation" / "stateless_reset" / "unknown"
]]></sourcecode>
        </figure>
      </section>
      <section anchor="packetnumberspace">
        <name>PacketNumberSpace</name>
        <figure anchor="packetnumberspace-def">
          <name>PacketNumberSpace definition</name>
          <sourcecode type="cddl"><![CDATA[
PacketNumberSpace = "initial" / "handshake" / "application_data"
]]></sourcecode>
        </figure>
      </section>
      <section anchor="packetheader">
        <name>PacketHeader</name>
        <figure anchor="packetheader-def">
          <name>PacketHeader definition</name>
          <sourcecode type="cddl"><![CDATA[
PacketHeader = {
    packet_type: PacketType
    packet_number: uint64

    ; the bit flags of the packet headers (spin bit, key update bit,
    ; etc. up to and including the packet number length bits
    ; if present
    ? flags: uint8

    ; only if packet_type === "initial"
    ? token: Token

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

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

    ; byte length of the token
    ? length: uint32

    ; raw byte value of the token
    ? data: hexstring

    ; decoded fields included in the token
    ; (typically: peer's IP address, creation time)
    ? details: {
      * text => any
    }
}
]]></sourcecode>
        </figure>
        <t>The token carried in an Initial packet can either be a retry token from a Retry
packet, or one originally provided by the server in a NEW_TOKEN frame used when
resuming a connection (e.g., for address validation purposes). Retry and
resumption tokens typically contain encoded metadata to check the token's
validity when it is used, but this metadata and its format is implementation
specific. For that, this field includes a general-purpose "details" field.</t>
      </section>
      <section anchor="stateless-reset-token">
        <name>Stateless Reset Token</name>
        <figure anchor="stateless-reset-token-def">
          <name>Stateless Reset Token definition</name>
          <sourcecode type="cddl"><![CDATA[
StatelessResetToken = hexstring .size 16
]]></sourcecode>
        </figure>
        <t>The stateless reset token is carried in stateless reset packets, in transport
parameters and in NEW_CONNECTION_ID frames.</t>
      </section>
      <section anchor="keytype">
        <name>KeyType</name>
        <figure anchor="keytype-def">
          <name>KeyType definition</name>
          <sourcecode type="cddl"><![CDATA[
KeyType =
    "server_initial_secret" / "client_initial_secret" /
    "server_handshake_secret" / "client_handshake_secret" /
    "server_0rtt_secret" / "client_0rtt_secret" /
    "server_1rtt_secret" / "client_1rtt_secret"
]]></sourcecode>
        </figure>
      </section>
      <section anchor="quic-frames">
        <name>QUIC Frames</name>
        <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">
          <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">
          <name>PingFrame</name>
          <figure anchor="pingframe-def">
            <name>PingFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
PingFrame = {
    frame_type: "ping"

    ; total frame length, including frame header
    ? length: uint32
    ? payload_length: uint32
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="ackframe">
          <name>AckFrame</name>
          <figure anchor="ackframe-def">
            <name>AckFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
; either a single number (e.g., [1]) or two numbers (e.g., [1,2]).
; For two numbers:
; the first number is "from": lowest packet number in interval
; the second number is "to": up to and including the highest
; packet number in the interval
AckRange = [1*2 uint64]

AckFrame = {
    frame_type: "ack"

    ; in ms
    ? ack_delay: float32

    ; e.g., looks like [[1,2],[4,5], [7], [10,22]] serialized
    ? acked_ranges: [+ AckRange]

    ; ECN (explicit congestion notification) related fields
    ; (not always present)
    ? ect1: uint64
    ? ect0:uint64
    ? ce: uint64

    ; total frame length, including frame header
    ? length: uint32
    ? payload_length: uint32
}
]]></sourcecode>
          </figure>
          <t>Note: the packet ranges in AckFrame.acked_ranges do not necessarily have to be
ordered (e.g., [[5,9],[1,4]] is a valid value).</t>
          <t>Note: the two numbers in the packet range can be the same (e.g., [120,120] means
that packet with number 120 was ACKed). However, in that case, implementers SHOULD
log [120] instead and tools MUST be able to deal with both notations.</t>
        </section>
        <section anchor="resetstreamframe">
          <name>ResetStreamFrame</name>
          <figure anchor="resetstreamframe-def">
            <name>ResetStreamFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
ResetStreamFrame = {
    frame_type: "reset_stream"

    stream_id: uint64
    error_code: $ApplicationError / uint32

    ; in bytes
    final_size: uint64

    ; total frame length, including frame header
    ? length: uint32
    ? payload_length: uint32
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="stopsendingframe">
          <name>StopSendingFrame</name>
          <figure anchor="stopsendingframe-def">
            <name>StopSendingFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
StopSendingFrame = {
    frame_type: "stop_sending"

    stream_id: uint64
    error_code: $ApplicationError / uint32

    ; total frame length, including frame header
    ? length: uint32
    ? payload_length: uint32
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="cryptoframe">
          <name>CryptoFrame</name>
          <figure anchor="cryptoframe-def">
            <name>CryptoFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
CryptoFrame = {
    frame_type: "crypto"

    offset: uint64
    length: uint64

    ? payload_length: uint32
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="newtokenframe">
          <name>NewTokenFrame</name>
          <figure anchor="newtokenframe-def">
            <name>NewTokenFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
NewTokenFrame = {
  frame_type: "new_token"

  token: Token
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="streamframe">
          <name>StreamFrame</name>
          <figure anchor="streamframe-def">
            <name>StreamFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
StreamFrame = {
    frame_type: "stream"

    stream_id: uint64

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

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

    ? raw: hexstring
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="maxdataframe">
          <name>MaxDataFrame</name>
          <figure anchor="maxdataframe-def">
            <name>MaxDataFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
MaxDataFrame = {
  frame_type: "max_data"

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

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

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

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

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

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

  sequence_number: uint32
  retire_prior_to: uint32

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

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

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

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

  ; always 64-bit
  ? data: hexstring
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="connectioncloseframe">
          <name>ConnectionCloseFrame</name>
          <t>raw_error_code is the actual, numerical code. This is useful because some error
types are spread out over a range of codes (e.g., QUIC's crypto_error).</t>
          <figure anchor="connectioncloseframe-def">
            <name>ConnectionCloseFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
ErrorSpace = "transport" / "application"

ConnectionCloseFrame = {
    frame_type: "connection_close"

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

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

    ? raw_length: uint32
    ? raw: hexstring
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="transporterror">
          <name>TransportError</name>
          <figure anchor="transporterror-def">
            <name>TransportError definition</name>
            <sourcecode type="cddl"><![CDATA[
TransportError = "no_error" / "internal_error" /
    "connection_refused" / "flow_control_error" /
    "stream_limit_error" / "stream_state_error" /
    "final_size_error" / "frame_encoding_error" /
    "transport_parameter_error" / "connection_id_limit_error" /
    "protocol_violation" / "invalid_token" / "application_error" /
    "crypto_buffer_exceeded"
]]></sourcecode>
          </figure>
        </section>
        <section anchor="applicationerror">
          <name>ApplicationError</name>
          <t>By definition, an application error is defined by the application-level protocol running on top of QUIC (e.g., HTTP/3).</t>
          <t>As such, we cannot define it here directly. Though we provide an extension point through the use of the CDDL "socket" mechanism.</t>
          <t>Application-level qlog definitions that wish to define new ApplicationError strings MUST do so by extending the $ApplicationError socket as such:</t>
          <artwork><![CDATA[
$ApplicationError /= "new_error_name" / "another_new_error_name"
]]></artwork>
        </section>
        <section anchor="cryptoerror">
          <name>CryptoError</name>
          <t>These errors are defined in the TLS document as "A TLS alert is turned into a QUIC
connection error by converting the one-byte alert description into a QUIC error
code. The alert description is added to 0x100 to produce a QUIC error code from
the range reserved for CRYPTO_ERROR."</t>
          <t>This approach maps badly to a pre-defined enum. As such, we define the
crypto_error string as having a dynamic component here, which should include the
hex-encoded and zero-padded value of the TLS alert description.</t>
          <figure anchor="cryptoerror-def">
            <name>CryptoError definition</name>
            <sourcecode type="cddl"><![CDATA[
; all strings from "crypto_error_0x100" to "crypto_error_0x199"
CryptoError = text .regexp "crypto_error_0x1[0-9][0-9]"
]]></sourcecode>
          </figure>
        </section>
      </section>
    </section>
    <section anchor="change-log">
      <name>Change Log</name>
      <section anchor="since-draft-ietf-qlog-quic-events-01">
        <name>Since draft-ietf-qlog-quic-events-01:</name>
        <ul spacing="normal">
          <li>Added Stateless Reset Token type (#122)</li>
        </ul>
      </section>
      <section anchor="since-draft-ietf-qlog-quic-events-00">
        <name>Since draft-ietf-qlog-quic-events-00:</name>
        <ul spacing="normal">
          <li>Change the data definition language from TypeScript to CDDL (#143)</li>
        </ul>
      </section>
      <section anchor="since-draft-marx-qlog-event-definitions-quic-h3-02">
        <name>Since draft-marx-qlog-event-definitions-quic-h3-02:</name>
        <ul spacing="normal">
          <li>These changes were done in preparation of the adoption of the drafts by the QUIC
working group (#137)</li>
          <li>Split QUIC and HTTP/3 events into two separate documents</li>
          <li>Moved RawInfo, Importance, Generic events and Simulation events to the main
schema document.</li>
          <li>Changed to/from value options of the <tt>data_moved</tt> event</li>
        </ul>
      </section>
      <section anchor="since-draft-marx-qlog-event-definitions-quic-h3-01">
        <name>Since draft-marx-qlog-event-definitions-quic-h3-01:</name>
        <t>Major changes:</t>
        <ul spacing="normal">
          <li>Moved data_moved from http to transport. Also made the "from" and "to" fields
flexible strings instead of an enum (#111,#65)</li>
          <li>Moved packet_type fields to PacketHeader. Moved packet_size field out of
PacketHeader to RawInfo:length (#40)</li>
          <li>Made events that need to log packet_type and packet_number use a header field
instead of logging these fields individually</li>
          <li>Added support for logging retry, stateless reset and initial tokens (#94,#86,#117)</li>
          <li>Moved separate general event categories into a single category "generic" (#47)</li>
          <li>Added "transport:connection_closed" event (#43,#85,#78,#49)</li>
          <li>Added version_information and alpn_information events (#85,#75,#28)</li>
          <li>Added parameters_restored events to help clarify 0-RTT behaviour (#88)</li>
        </ul>
        <t>Smaller changes:</t>
        <ul spacing="normal">
          <li>Merged loss_timer events into one loss_timer_updated event</li>
          <li>Field data types are now strongly defined (#10,#39,#36,#115)</li>
          <li>Renamed qpack instruction_received and instruction_sent to instruction_created
and instruction_parsed (#114)</li>
          <li>Updated qpack:dynamic_table_updated.update_type. It now has the value "inserted"
instead of "added" (#113)</li>
          <li>Updated qpack:dynamic_table_updated. It now has an "owner" field to
differentiate encoder vs decoder state (#112)</li>
          <li>Removed push_allowed from http:parameters_set (#110)</li>
          <li>Removed explicit trigger field indications from events, since this was moved to
be a generic property of the "data" field (#80)</li>
          <li>Updated transport:connection_id_updated to be more in line with other similar
events. Also dropped importance from Core to Base (#45)</li>
          <li>Added length property to PaddingFrame (#34)</li>
          <li>Added packet_number field to transport:frames_processed (#74)</li>
          <li>Added a way to generically log packet header flags (first 8 bits) to
PacketHeader</li>
          <li>Added additional guidance on which events to log in which situations (#53)</li>
          <li>Added "simulation:scenario" event to help indicate simulation details</li>
          <li>Added "packets_acked" event (#107)</li>
          <li>Added "datagram_ids" to the datagram_X and packet_X events to allow tracking of
coalesced QUIC packets (#91)</li>
          <li>Extended connection_state_updated with more fine-grained states (#49)</li>
        </ul>
      </section>
      <section anchor="since-draft-marx-qlog-event-definitions-quic-h3-00">
        <name>Since draft-marx-qlog-event-definitions-quic-h3-00:</name>
        <ul spacing="normal">
          <li>Event and category names are now all lowercase</li>
          <li>Added many new events and their definitions</li>
          <li>"type" fields have been made more specific (especially important for PacketType
fields, which are now called packet_type instead of type)</li>
          <li>Events are given an importance indicator (issue #22)</li>
          <li>Event names are more consistent and use past tense (issue #21)</li>
          <li>Triggers have been redefined as properties of the "data" field and updated for most events (issue #23)</li>
        </ul>
      </section>
    </section>
    <section anchor="design-variations">
      <name>Design Variations</name>
      <t>TBD</t>
    </section>
    <section anchor="acknowledgements">
      <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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
VKtbzUA4jP4Pcl69Ux3xAAA=

-->

</rfc>
