<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.2.11 -->

<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
]>

<?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 ipr="trust200902" docName="draft-marx-quic-qlog-quic-events-00" category="std">

  <front>
    <title>QUIC event definitions for qlog</title>

    <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="2021" month="May" day="17"/>

    <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"></xref>.</t>



    </abstract>


  </front>

  <middle>


<section anchor="introduction" title="Introduction">

<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-RECOVERY">QUIC-TRANSPORT</xref> <xref target="QUIC-TLS"></xref>. HTTP/3 and
QPACK events are defined in a separate document <xref target="QLOG-H3"></xref>.</t>

<t>Feedback and discussion are welcome at
<eref target="https://github.com/quiclog/internet-drafts">https://github.com/quiclog/internet-drafts</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" title="Notational Conventions">

<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 examples and data definitions in ths document are expressed in a custom data
definition language, inspired by JSON and TypeScript, and described in
<xref target="QLOG-MAIN"></xref>.</t>

</section>
</section>
<section anchor="overview" title="Overview">

<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"></xref>. Each subsection below defines a separate category (for example
connectivity, transport, recovery) and each subsubsection is an event type (for
example <spanx style="verb">packet_received</spanx>).</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" title="Links to the main schema">

<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" title="Raw packet and frame information">

<t>This document re-uses the definition of the RawInfo data class from <xref target="QLOG-MAIN"></xref>.</t>

<t><list style="hanging">
  <t hangText='Note:'>
  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>
  <t hangText='Note:'>
  As QUIC uses trailers in packets, packet header_lengths can be calculated as:</t>
  <t>header_length = length - payload_length - aead_tag_length</t>
  <t>For UDP datagrams, the calulation is simpler:</t>
  <t>header_length = length - payload_length</t>
  <t hangText='Note:'>
  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>
</list></t>

</section>
<section anchor="handling-unknown-connections" title="Events not belonging to a single connection">

<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" title="QUIC event definitions">

<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" title="connectivity">

<section anchor="serverlistening" title="server_listening">
<t>Importance: Extra</t>

<t>Emitted when the server starts accepting connections.</t>

<t>Data:</t>

<figure><artwork><![CDATA[
{
    ip_v4?: IPAddress,
    ip_v6?: IPAddress,
    port_v4?: uint32,
    port_v6?: uint32,

    retry_required?:boolean // the server will always answer client initials with a retry (no 1-RTT connection setups by choice)
}
]]></artwork></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" title="connection_started">
<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>Data:</t>

<figure><artwork><![CDATA[
{
    ip_version?: "v4" | "v6",
    src_ip?: IPAddress,
    dst_ip?: IPAddress,

    protocol?: string, // transport layer protocol (default "QUIC")
    src_port?: uint32,
    dst_port?: uint32,

    src_cid?: bytes,
    dst_cid?: bytes,

}
]]></artwork></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" title="connection_closed">
<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>

<figure><artwork><![CDATA[
{
    owner?:"local"|"remote", // which side closed the connection

    connection_code?:TransportError | CryptoError | uint32,
    application_code?:ApplicationError | uint32,
    internal_code?:uint32,

    reason?:string
}
]]></artwork></figure>

<t>Triggers:
* clean
* handshake_timeout
* idle_timeout
* error // this is called the “immediate close” in the QUIC specification
* stateless_reset
* version_mismatch
* application // for example HTTP/3’s GOAWAY frame</t>

</section>
<section anchor="connectionidupdated" title="connection_id_updated">
<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>Data:</t>

<figure><artwork><![CDATA[
{
    owner: "local" | "remote",

    old?:bytes,
    new?:bytes,
}
]]></artwork></figure>

</section>
<section anchor="spinbitupdated" title="spin_bit_updated">
<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>Data:</t>

<figure><artwork><![CDATA[
{
    state: boolean
}
]]></artwork></figure>

</section>
<section anchor="connectionretried" title="connection_retried">

<t>TODO</t>

</section>
<section anchor="connectionstateupdated" title="connection_state_updated">
<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>Data:
~~~
{
    old?: ConnectionState | SimpleConnectionState,
    new: ConnectionState | SimpleConnectionState
}</t>

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

<t>enum SimpleConnectionState {
    attempted,
    handshake_started,
    handshake_confirmed,
    closed
}
~~~</t>

<t>These states correspond to the following transitions for both client and server:</t>

<t><spanx style="strong">Client:</spanx></t>

<t><list style="symbols">
  <t>send initial
  <list style="symbols">
      <t>state = attempted</t>
    </list></t>
  <t>get initial
  <list style="symbols">
      <t>state = validated <spanx style="emph">(not really “needed” at the client, but somewhat useful to indicate progress nonetheless)</spanx></t>
    </list></t>
  <t>get first Handshake packet
  <list style="symbols">
      <t>state = handshake_started</t>
    </list></t>
  <t>get Handshake packet containing ServerFinished
  <list style="symbols">
      <t>state = handshake_complete</t>
    </list></t>
  <t>send ClientFinished
  <list style="symbols">
      <t>state = early_write
  (1RTT can now be sent)</t>
    </list></t>
  <t>get HANDSHAKE_DONE
  <list style="symbols">
      <t>state = handshake_confirmed</t>
    </list></t>
</list></t>

<t><spanx style="strong">Server:</spanx></t>

<t><list style="symbols">
  <t>get initial
  <list style="symbols">
      <t>state = attempted</t>
    </list></t>
  <t>send initial <spanx style="emph">(don’t think this needs a separate state, since some handshake will always be sent in the same flight as this?)</spanx></t>
  <t>send handshake EE, CERT, CV, …
  <list style="symbols">
      <t>state = handshake_started</t>
    </list></t>
  <t>send ServerFinished
  <list style="symbols">
      <t>state = early_write
  (1RTT can now be sent)</t>
    </list></t>
  <t>get first handshake packet / something using a server-issued CID of min length
  <list style="symbols">
      <t>state = validated</t>
    </list></t>
  <t>get handshake packet containing ClientFinished
  <list style="symbols">
      <t>state = handshake_complete</t>
    </list></t>
  <t>send HANDSHAKE_DONE
  <list style="symbols">
      <t>state = handshake_confirmed</t>
    </list></t>
</list></t>

<t><list style="hanging">
  <t hangText='Note:'>
  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>
</list></t>

</section>
<section anchor="migration-related-events" title="MIGRATION-related events">
<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" title="security">

<section anchor="keyupdated" title="key_updated">
<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>Data:</t>

<figure><artwork><![CDATA[
{
    key_type:KeyType,
    old?:bytes,
    new:bytes,
    generation?:uint32 // needed for 1RTT key updates
}
]]></artwork></figure>

<t>Triggers:</t>

<t><list style="symbols">
  <t>“tls” // (e.g., initial, handshake and 0-RTT keys are generated by TLS)</t>
  <t>“remote_update”</t>
  <t>“local_update”</t>
</list></t>

</section>
<section anchor="keyretired" title="key_retired">
<t>Importance: Base</t>

<t>Data:</t>

<figure><artwork><![CDATA[
{
    key_type:KeyType,
    key?:bytes,
    generation?:uint32 // needed for 1RTT key updates
}
]]></artwork></figure>

<t>Triggers:</t>

<t><list style="symbols">
  <t>“tls” // (e.g., initial, handshake and 0-RTT keys are dropped implicitly)</t>
  <t>“remote_update”</t>
  <t>“local_update”</t>
</list></t>

</section>
</section>
<section anchor="transport" title="transport">

<section anchor="versioninformation" title="version_information">
<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>Data:</t>

<figure><artwork><![CDATA[
{
    server_versions?:Array<bytes>,
    client_versions?:Array<bytes>,
    chosen_version?:bytes
}
]]></artwork></figure>

<t>Intended use:</t>

<t><list style="symbols">
  <t>When sending an initial, the client logs this event with client_versions and
chosen_version set</t>
  <t>Upon receiving a client initial with a supported version, the server logs this
event with server_versions and chosen_version set</t>
  <t>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.</t>
  <t>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</t>
</list></t>

</section>
<section anchor="alpninformation" title="alpn_information">
<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>Data:</t>

<figure><artwork><![CDATA[
{
    server_alpns?:Array<string>,
    client_alpns?:Array<string>,
    chosen_alpn?:string
}
]]></artwork></figure>

<t>Intended use:</t>

<t><list style="symbols">
  <t>When sending an initial, the client logs this event with client_alpns set</t>
  <t>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.</t>
  <t>When receiving an initial with an alpn, the client logs this event with
chosen_alpn to the received value.</t>
  <t>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.</t>
</list></t>

</section>
<section anchor="parametersset" title="parameters_set">
<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 <spanx style="verb">parameters_restored</spanx> event to indicate the initial values, and this
event to indicate the updated values, as normal.</t>

<t>Data:</t>

<figure><artwork><![CDATA[
{
    owner?:"local" | "remote",

    resumption_allowed?:boolean, // valid session ticket was received
    early_data_enabled?:boolean, // early data extension was enabled on the TLS layer
    tls_cipher?:string, // (e.g., "AES_128_GCM_SHA256")
    aead_tag_length?:uint8, // depends on the TLS cipher, but it's easier to be explicit. Default value is 16

    // transport parameters from the TLS layer:
    original_destination_connection_id?:bytes,
    initial_source_connection_id?:bytes,
    retry_source_connection_id?:bytes,
    stateless_reset_token?:Token,
    disable_active_migration?:boolean,

    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
}

interface PreferredAddress {
    ip_v4:IPAddress,
    ip_v6:IPAddress,

    port_v4:uint16,
    port_v6:uint16,

    connection_id:bytes,
    stateless_reset_token:Token
}
]]></artwork></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" title="parameters_restored">
<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>Data:</t>

<figure><artwork><![CDATA[
{
    disable_active_migration?:boolean,

    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,
}
]]></artwork></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" title="packet_sent">
<t>Importance: Core</t>

<t>Data:</t>

<figure><artwork><![CDATA[
{
    header:PacketHeader,

    frames?:Array<QuicFrame>, // see appendix for the definitions

    is_coalesced?:boolean, // default value is false

    retry_token?:Token, // only if header.packet_type === retry

    stateless_reset_token?:bytes, // only if header.packet_type === stateless_reset. Is always 128 bits in length.

    supported_versions:Array<bytes>, // only if header.packet_type === version_negotiation

    raw?:RawInfo,
    datagram_id?:uint32
}
]]></artwork></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>Triggers:</t>

<t><list style="symbols">
  <t>“retransmit_reordered” // draft-23 5.1.1</t>
  <t>“retransmit_timeout” // draft-23 5.1.2</t>
  <t>“pto_probe” // draft-23 5.3.1</t>
  <t>“retransmit_crypto” // draft-19 6.2</t>
  <t>“cc_bandwidth_probe” // needed for some CCs to figure out bandwidth allocations
when there are no normal sends</t>
</list></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" title="packet_received">
<t>Importance: Core</t>

<t>Data:</t>

<figure><artwork><![CDATA[
{
    header:PacketHeader,

    frames?:Array<QuicFrame>, // see appendix for the definitions

    is_coalesced?:boolean,

    retry_token?:Token, // only if header.packet_type === retry

    stateless_reset_token?:bytes, // only if header.packet_type === stateless_reset. Is always 128 bits in length.

    supported_versions:Array<bytes>, // only if header.packet_type === version_negotiation

    raw?:RawInfo,
    datagram_id?:uint32
}
]]></artwork></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>Triggers:</t>

<t><list style="symbols">
  <t>“keys_available” // if packet was buffered because it couldn’t be decrypted
before</t>
</list></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" title="packet_dropped">
<t>Importance: Base</t>

<t>This event indicates a QUIC-level packet was dropped after partial or no parsing.</t>

<t>Data:</t>

<figure><artwork><![CDATA[
{
    header?:PacketHeader, // primarily packet_type should be filled here, as other fields might not be parseable

    raw?:RawInfo,
    datagram_id?:uint32
}
]]></artwork></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>

<t>Triggers:</t>

<t><list style="symbols">
  <t>“key_unavailable”</t>
  <t>“unknown_connection_id”</t>
  <t>“header_parse_error”</t>
  <t>“payload_decrypt_error”</t>
  <t>“protocol_violation”</t>
  <t>“dos_prevention”</t>
  <t>“unsupported_version”</t>
  <t>“unexpected_packet”</t>
  <t>“unexpected_source_connection_id”</t>
  <t>“unexpected_version”</t>
  <t>“duplicate”</t>
  <t>“invalid_initial”</t>
</list></t>

<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" title="packet_buffered">
<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>Data:</t>

<figure><artwork><![CDATA[
{
    header?:PacketHeader, // primarily packet_type and possible packet_number should be filled here, as other elements might not be available yet

    raw?:RawInfo,
    datagram_id?:uint32
}
]]></artwork></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>

<t>Triggers:</t>

<t><list style="symbols">
  <t>“backpressure” // indicates the parser cannot keep up, temporarily buffers
packet for later processing</t>
  <t>“keys_unavailable” // if packet cannot be decrypted because the proper keys were
not yet available</t>
</list></t>

</section>
<section anchor="packetsacked" title="packets_acked">
<t>Importance: Extra</t>

<t>This event is emitted when a (group of) sent packet(s) is acknowledged by the
remote peer <spanx style="emph">for the first time</spanx>. 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>Data:
~~~
{
    packet_number_space?:PacketNumberSpace,</t>

<figure><artwork><![CDATA[
packet_numbers?:Array<uint64> } ~~~
]]></artwork></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" title="datagrams_sent">
<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>Data:</t>

<figure><artwork><![CDATA[
{
    count?:uint16, // to support passing multiple at once
    raw?:Array<RawInfo>, // RawInfo:length field indicates total length of the datagrams, including UDP header length

    datagram_ids?:Array<uint32>
}
]]></artwork></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" title="datagrams_received">
<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>Data:</t>

<figure><artwork><![CDATA[
{
    count?:uint16, // to support passing multiple at once
    raw?:Array<RawInfo>, // RawInfo:length field indicates total length of the datagrams, including UDP header length

    datagram_ids?:Array<uint32>
}
]]></artwork></figure>

<t>Note: for more details on “datagram_ids”, see <xref target="datagram-id"/>.</t>

</section>
<section anchor="datagramdropped" title="datagram_dropped">
<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>Data:</t>

<figure><artwork><![CDATA[
{
    raw?:RawInfo
}
]]></artwork></figure>

</section>
<section anchor="streamstateupdated" title="stream_state_updated">
<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>Data:</t>

<figure><artwork><![CDATA[
{
    stream_id:uint64,
    stream_type?:"unidirectional"|"bidirectional", // mainly useful when opening the stream

    old?:StreamState,
    new:StreamState,

    stream_side?:"sending"|"receiving"
}

enum 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
    destroyed // memory actually freed
}
]]></artwork></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" title="frames_processed">
<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>Data:</t>

<figure><artwork><![CDATA[
{
    frames:Array<QuicFrame>, // see appendix for the definitions

    packet_number?:uint64
}
]]></artwork></figure>

</section>
<section anchor="datamoved" title="data_moved">
<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>Data:</t>

<figure><artwork><![CDATA[
{
    stream_id?:uint64,
    offset?:uint64,
    length?:uint64, // byte length of the moved data

    from?:string, // typically: use either of "user","application","transport","network"
    to?:string, // typically: use either of "user","application","transport","network"

    data?:bytes // raw bytes that were transferred
}
]]></artwork></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" title="recovery">

<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" title="parameters_set">
<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>Data:</t>

<figure><artwork><![CDATA[
{
    // Loss detection, see recovery draft-23, Appendix A.2
    reordering_threshold?:uint16, // in amount of packets
    time_threshold?:float, // as RTT multiplier
    timer_granularity?:uint16, // in ms
    initial_rtt?:float, // in ms

    // congestion control, Appendix B.1.
    max_datagram_size?:uint32, // in bytes // Note: this could be updated after pmtud
    initial_congestion_window?:uint64, // in bytes
    minimum_congestion_window?:uint32, // in bytes // Note: this could change when max_datagram_size changes
    loss_reduction_factor?:float,
    persistent_congestion_threshold?:uint16 // as PTO multiplier
}
]]></artwork></figure>

<t>Additionally, this event can contain any number of unspecified fields to support
different recovery approaches.</t>

</section>
<section anchor="metricsupdated" title="metrics_updated">
<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>Data:</t>

<figure><artwork><![CDATA[
{
    // Loss detection, see recovery draft-23, Appendix A.3
    min_rtt?:float, // in ms or us, depending on the overarching qlog's configuration
    smoothed_rtt?:float, // in ms or us, depending on the overarching qlog's configuration
    latest_rtt?:float, // in ms or us, depending on the overarching qlog's configuration
    rtt_variance?:float, // in ms or us, depending on the overarching qlog's configuration

    pto_count?:uint16,

    // Congestion control, Appendix B.2.
    congestion_window?:uint64, // in bytes
    bytes_in_flight?:uint64,

    ssthresh?:uint64, // in bytes

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

    pacing_rate?:uint64 // in bps
}
]]></artwork></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 METRIC_UPDATE 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" title="congestion_state_updated">
<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>

<t><list style="symbols">
  <t>slow_start</t>
  <t>congestion_avoidance</t>
  <t>application_limited</t>
  <t>recovery</t>
</list></t>

<t>Data:</t>

<figure><artwork><![CDATA[
{
    old?:string,
    new:string
}
]]></artwork></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>

<t>Some triggers for (“enhanced” New Reno):</t>

<t><list style="symbols">
  <t>persistent_congestion</t>
  <t>ECN</t>
</list></t>

</section>
<section anchor="losstimerupdated" title="loss_timer_updated">
<t>Importance: Extra</t>

<t>This event is emitted when a recovery loss timer changes state. The three main
event types are:</t>

<t><list style="symbols">
  <t>set: the timer is set with a delta timeout for when it will trigger next</t>
  <t>expired: when the timer effectively expires after the delta timeout</t>
  <t>cancelled: when a timer is cancelled (e.g., all outstanding packets are
acknowledged, start idle period)</t>
</list></t>

<t>Note: to indicate an active timer’s timeout update, a new “set” event is used.</t>

<t>Data:</t>

<figure><artwork><![CDATA[
{
    timer_type?:"ack"|"pto", // called "mode" in draft-23 A.9.
    packet_number_space?: PacketNumberSpace,

    event_type:"set"|"expired"|"cancelled",

    delta?:float // if event_type === "set": delta time in ms or us (see configuration) from this event's timestamp until when the timer will trigger
}
]]></artwork></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" title="packet_lost">
<t>Importance: Core</t>

<t>This event is emitted when a packet is deemed lost by loss detection.</t>

<t>Data:</t>

<figure><artwork><![CDATA[
{
    header?:PacketHeader, // should include at least the packet_type and packet_number

    // not all implementations will keep track of full packets, so these are optional
    frames?:Array<QuicFrame> // see appendix for the definitions
}
]]></artwork></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>

<t>Triggers:</t>

<t><list style="symbols">
  <t>“reordering_threshold”,</t>
  <t>“time_threshold”</t>
  <t>“pto_expired” // draft-23 section 5.3.1, MAY</t>
</list></t>

</section>
<section anchor="markedforretransmit" title="marked_for_retransmit">
<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>Data:</t>

<figure><artwork><![CDATA[
{
    frames:Array<QuicFrame>, // see appendix for the definitions
}
]]></artwork></figure>

</section>
</section>
</section>
<section anchor="security-considerations" title="Security Considerations">

<t>TBD</t>

</section>
<section anchor="iana-considerations" title="IANA Considerations">

<t>TBD</t>

</section>


  </middle>

  <back>

    <references title='Normative References'>

<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 />
  </front>
  <seriesInfo name="Internet-Draft" value="draft-ietf-quic-transport-latest"/>
</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 />
  </front>
  <seriesInfo name="Internet-Draft" value="draft-ietf-quic-recovery-latest"/>
</reference>
<reference anchor="QUIC-TLS" >
  <front>
    <title>Using Transport Layer Security (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 />
  </front>
  <seriesInfo name="Internet-Draft" value="draft-ietf-quic-tls-latest"/>
</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-marx-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-marx-quic-qlog-h3-events-00"/>
</reference>


    </references>

    <references title='Informative References'>





<reference  anchor="RFC2119" target='https://www.rfc-editor.org/info/rfc2119'>
<front>
<title>Key words for use in RFCs to Indicate Requirement Levels</title>
<author initials='S.' surname='Bradner' fullname='S. Bradner'><organization /></author>
<date year='1997' month='March' />
<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>


<section anchor="quic-data-field-definitions" title="QUIC data field definitions">

<section anchor="ipaddress" title="IPAddress">

<figure><artwork><![CDATA[
class IPAddress : string | bytes;

// 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)

]]></artwork></figure>

</section>
<section anchor="packettype" title="PacketType">

<figure><artwork><![CDATA[
enum PacketType {
    initial,
    handshake,
    zerortt = "0RTT",
    onertt = "1RTT",
    retry,
    version_negotiation,
    stateless_reset,
    unknown
}
]]></artwork></figure>

</section>
<section anchor="packetnumberspace" title="PacketNumberSpace">

<figure><artwork><![CDATA[
enum PacketNumberSpace {
    initial,
    handshake,
    application_data
}
]]></artwork></figure>

</section>
<section anchor="packetheader" title="PacketHeader">

<figure><artwork><![CDATA[
class PacketHeader {
    // Note: short vs long header is implicit through PacketType

    packet_type: PacketType;
    packet_number: uint64;

    flags?: uint8; // the bit flags of the packet headers (spin bit, key update bit, etc. up to and including the packet number length bits if present) interpreted as a single 8-bit integer

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

    length?: uint16, // only if packet_type == initial || handshake || 0RTT. Signifies length of the packet_number plus the payload.

    // only if present in the header
    // if correctly using transport:connection_id_updated events,
    // dcid can be skipped for 1RTT packets
    version?: bytes; // e.g., "ff00001d" for draft-29
    scil?: uint8;
    dcil?: uint8;
    scid?: bytes;
    dcid?: bytes;
}
]]></artwork></figure>

</section>
<section anchor="token" title="Token">

<figure><artwork><![CDATA[
class Token {
    type?:"retry"|"resumption"|"stateless_reset";

    length?:uint32; // byte length of the token
    data?:bytes; // raw byte value of the token

    details?:any; // decoded fields included in the token (typically: peer's IP address, creation time)
}
]]></artwork></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" title="KeyType">
<figure><artwork><![CDATA[
enum 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
}
]]></artwork></figure>

</section>
<section anchor="quic-frames" title="QUIC Frames">

<figure><artwork><![CDATA[
type QuicFrame = PaddingFrame | PingFrame | AckFrame | ResetStreamFrame | StopSendingFrame | CryptoFrame | NewTokenFrame | StreamFrame | MaxDataFrame | MaxStreamDataFrame | MaxStreamsFrame | DataBlockedFrame | StreamDataBlockedFrame | StreamsBlockedFrame | NewConnectionIDFrame | RetireConnectionIDFrame | PathChallengeFrame | PathResponseFrame | ConnectionCloseFrame | HandshakeDoneFrame | UnknownFrame;
]]></artwork></figure>

<section anchor="paddingframe" title="PaddingFrame">

<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><artwork><![CDATA[
class PaddingFrame{
    frame_type:string = "padding";

    length?:uint32; // total frame length, including frame header
    payload_length?:uint32;
}
]]></artwork></figure>

</section>
<section anchor="pingframe" title="PingFrame">

<figure><artwork><![CDATA[
class PingFrame{
    frame_type:string = "ping";

    length?:uint32; // total frame length, including frame header
    payload_length?:uint32;
}
]]></artwork></figure>

</section>
<section anchor="ackframe" title="AckFrame">

<figure><artwork><![CDATA[
class AckFrame{
    frame_type:string = "ack";

    ack_delay?:float; // in ms

    // first number is "from": lowest packet number in interval
    // second number is "to": up to and including // highest packet number in interval
    // e.g., looks like [[1,2],[4,5]]
    acked_ranges?:Array<[uint64, uint64]|[uint64]>;

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

    length?:uint32; // total frame length, including frame header
    payload_length?:uint32;
}
]]></artwork></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" title="ResetStreamFrame">
<figure><artwork><![CDATA[
class ResetStreamFrame{
    frame_type:string = "reset_stream";

    stream_id:uint64;
    error_code:ApplicationError | uint32;
    final_size:uint64; // in bytes

    length?:uint32; // total frame length, including frame header
    payload_length?:uint32;
}
]]></artwork></figure>

</section>
<section anchor="stopsendingframe" title="StopSendingFrame">
<figure><artwork><![CDATA[
class StopSendingFrame{
    frame_type:string = "stop_sending";

    stream_id:uint64;
    error_code:ApplicationError | uint32;

    length?:uint32; // total frame length, including frame header
    payload_length?:uint32;
}
]]></artwork></figure>

</section>
<section anchor="cryptoframe" title="CryptoFrame">

<figure><artwork><![CDATA[
class CryptoFrame{
    frame_type:string = "crypto";

    offset:uint64;
    length:uint64;

    payload_length?:uint32;
}
]]></artwork></figure>

</section>
<section anchor="newtokenframe" title="NewTokenFrame">

<figure><artwork><![CDATA[
class NewTokenFrame{
  frame_type:string = "new_token";

  token:Token
}
]]></artwork></figure>

</section>
<section anchor="streamframe" title="StreamFrame">

<figure><artwork><![CDATA[
class StreamFrame{
    frame_type:string = "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?:boolean;

    raw?:bytes;
}
]]></artwork></figure>

</section>
<section anchor="maxdataframe" title="MaxDataFrame">

<figure><artwork><![CDATA[
class MaxDataFrame{
  frame_type:string = "max_data";

  maximum:uint64;
}
]]></artwork></figure>

</section>
<section anchor="maxstreamdataframe" title="MaxStreamDataFrame">

<figure><artwork><![CDATA[
class MaxStreamDataFrame{
  frame_type:string = "max_stream_data";

  stream_id:uint64;
  maximum:uint64;
}
]]></artwork></figure>

</section>
<section anchor="maxstreamsframe" title="MaxStreamsFrame">

<figure><artwork><![CDATA[
class MaxStreamsFrame{
  frame_type:string = "max_streams";

  stream_type:string = "bidirectional" | "unidirectional";
  maximum:uint64;
}
]]></artwork></figure>

</section>
<section anchor="datablockedframe" title="DataBlockedFrame">

<figure><artwork><![CDATA[
class DataBlockedFrame{
  frame_type:string = "data_blocked";

  limit:uint64;
}
]]></artwork></figure>

</section>
<section anchor="streamdatablockedframe" title="StreamDataBlockedFrame">

<figure><artwork><![CDATA[
class StreamDataBlockedFrame{
  frame_type:string = "stream_data_blocked";

  stream_id:uint64;
  limit:uint64;
}
]]></artwork></figure>

</section>
<section anchor="streamsblockedframe" title="StreamsBlockedFrame">

<figure><artwork><![CDATA[
class StreamsBlockedFrame{
  frame_type:string = "streams_blocked";

  stream_type:string = "bidirectional" | "unidirectional";
  limit:uint64;
}
]]></artwork></figure>

</section>
<section anchor="newconnectionidframe" title="NewConnectionIDFrame">

<figure><artwork><![CDATA[
class NewConnectionIDFrame{
  frame_type:string = "new_connection_id";

  sequence_number:uint32;
  retire_prior_to:uint32;

  connection_id_length?:uint8;
  connection_id:bytes;

  stateless_reset_token?:Token;
}
]]></artwork></figure>

</section>
<section anchor="retireconnectionidframe" title="RetireConnectionIDFrame">

<figure><artwork><![CDATA[
class RetireConnectionIDFrame{
  frame_type:string = "retire_connection_id";

  sequence_number:uint32;
}
]]></artwork></figure>

</section>
<section anchor="pathchallengeframe" title="PathChallengeFrame">

<figure><artwork><![CDATA[
class PathChallengeFrame{
  frame_type:string = "path_challenge";

  data?:bytes; // always 64-bit
}
]]></artwork></figure>

</section>
<section anchor="pathresponseframe" title="PathResponseFrame">

<figure><artwork><![CDATA[
class PathResponseFrame{
  frame_type:string = "path_response";

  data?:bytes; // always 64-bit
}
]]></artwork></figure>

</section>
<section anchor="connectioncloseframe" title="ConnectionCloseFrame">

<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><artwork><![CDATA[
type ErrorSpace = "transport" | "application";

class ConnectionCloseFrame{
    frame_type:string = "connection_close";

    error_space?:ErrorSpace;
    error_code?:TransportError | ApplicationError | uint32;
    raw_error_code?:uint32;
    reason?:string;

    trigger_frame_type?:uint64 | string; // For known frame types, the appropriate "frame_type" string. For unknown frame types, the hex encoded identifier value
}
]]></artwork></figure>

</section>
<section anchor="handshakedoneframe" title="HandshakeDoneFrame">

<figure><artwork><![CDATA[
class HandshakeDoneFrame{
  frame_type:string = "handshake_done";
}
]]></artwork></figure>

</section>
<section anchor="unknownframe" title="UnknownFrame">

<figure><artwork><![CDATA[
class UnknownFrame{
    frame_type:string = "unknown";
    raw_frame_type:uint64;

    raw_length?:uint32;
    raw?:bytes;
}
]]></artwork></figure>

</section>
<section anchor="transporterror" title="TransportError">

<figure><artwork><![CDATA[
enum 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
}
]]></artwork></figure>

</section>
<section anchor="cryptoerror" title="CryptoError">

<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 value of the TLS alert description.</t>

<figure><artwork><![CDATA[
enum CryptoError {
    crypto_error_{TLS_ALERT}
}
]]></artwork></figure>

</section>
</section>
</section>
<section anchor="change-log" title="Change Log">

<section anchor="since-draft-marx-qlog-event-definitions-quic-h3-02" title="Since draft-marx-qlog-event-definitions-quic-h3-02:">

<t><list style="symbols">
  <t>These changes were done in preparation of the adoption of the drafts by the QUIC
working group (#137)</t>
  <t>Split QUIC and HTTP/3 events into two separate documents</t>
  <t>Moved RawInfo, Importance, Generic events and Simulation events to the main
schema document.</t>
  <t>Changed to/from value options of the <spanx style="verb">data_moved</spanx> event</t>
</list></t>

</section>
<section anchor="since-draft-marx-qlog-event-definitions-quic-h3-01" title="Since draft-marx-qlog-event-definitions-quic-h3-01:">

<t>Major changes:</t>

<t><list style="symbols">
  <t>Moved data_moved from http to transport. Also made the “from” and “to” fields
flexible strings instead of an enum (#111,#65)</t>
  <t>Moved packet_type fields to PacketHeader. Moved packet_size field out of
PacketHeader to RawInfo:length (#40)</t>
  <t>Made events that need to log packet_type and packet_number use a header field
instead of logging these fields individually</t>
  <t>Added support for logging retry, stateless reset and initial tokens (#94,#86,#117)</t>
  <t>Moved separate general event categories into a single category “generic” (#47)</t>
  <t>Added “transport:connection_closed” event (#43,#85,#78,#49)</t>
  <t>Added version_information and alpn_information events (#85,#75,#28)</t>
  <t>Added parameters_restored events to help clarify 0-RTT behaviour (#88)</t>
</list></t>

<t>Smaller changes:</t>

<t><list style="symbols">
  <t>Merged loss_timer events into one loss_timer_updated event</t>
  <t>Field data types are now strongly defined (#10,#39,#36,#115)</t>
  <t>Renamed qpack instruction_received and instruction_sent to instruction_created
and instruction_parsed (#114)</t>
  <t>Updated qpack:dynamic_table_updated.update_type. It now has the value “inserted”
instead of “added” (#113)</t>
  <t>Updated qpack:dynamic_table_updated. It now has an “owner” field to
differentiate encoder vs decoder state (#112)</t>
  <t>Removed push_allowed from http:parameters_set (#110)</t>
  <t>Removed explicit trigger field indications from events, since this was moved to
be a generic property of the “data” field (#80)</t>
  <t>Updated transport:connection_id_updated to be more in line with other similar
events. Also dropped importance from Core to Base (#45)</t>
  <t>Added length property to PaddingFrame (#34)</t>
  <t>Added packet_number field to transport:frames_processed (#74)</t>
  <t>Added a way to generically log packet header flags (first 8 bits) to
PacketHeader</t>
  <t>Added additional guidance on which events to log in which situations (#53)</t>
  <t>Added “simulation:scenario” event to help indicate simulation details</t>
  <t>Added “packets_acked” event (#107)</t>
  <t>Added “datagram_ids” to the datagram_X and packet_X events to allow tracking of
coalesced QUIC packets (#91)</t>
  <t>Extended connection_state_updated with more fine-grained states (#49)</t>
</list></t>

</section>
<section anchor="since-draft-marx-qlog-event-definitions-quic-h3-00" title="Since draft-marx-qlog-event-definitions-quic-h3-00:">

<t><list style="symbols">
  <t>Event and category names are now all lowercase</t>
  <t>Added many new events and their definitions</t>
  <t>“type” fields have been made more specific (especially important for PacketType
fields, which are now called packet_type instead of type)</t>
  <t>Events are given an importance indicator (issue #22)</t>
  <t>Event names are more consistent and use past tense (issue #21)</t>
  <t>Triggers have been redefined as properties of the “data” field and updated for most events (issue #23)</t>
</list></t>

</section>
</section>
<section anchor="design-variations" title="Design Variations">

<t>TBD</t>

</section>
<section anchor="acknowledgements" title="Acknowledgements">

<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 Kühlewind, Jeremy
Lainé, Kazu Yamamoto, Christian Huitema, and Lucas Pardue for their feedback and
suggestions.</t>

</section>


  </back>

<!-- ##markdown-source:
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

-->

</rfc>

