<?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-h3-events-00" category="std">

  <front>
    <title>HTTP/3 and QPACK 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
HTTP/3 and QPACK-related 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 HTTP/3 and QPACK protocols. This
document is based on draft-34 of the HTTP/3 I-D <xref target="QUIC-HTTP"></xref> and draft-21 of the
QPACK I-D <xref target="QUIC-QPACK"></xref>. QUIC events are defined in a separate document
<xref target="QLOG-QUIC"></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 HTTP/3 and QPACK protocols.</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 http,
qpack) and each subsubsection is an event type (for example <spanx style="verb">frame_created</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="usage-with-quic" title="Usage with QUIC">

<t>The events described in this document can be used with or without logging the
related QUIC events defined in <xref target="QLOG-QUIC"></xref>. If used with QUIC events, the QUIC
document takes precedence in terms of recommended filenames and trace separation
setups.</t>

<t>If used without QUIC events, it is recommended that the implementation assign a
globally unique identifier to each HTTP/3 connection. This ID can then be used as
the value of the qlog “group_id” field, as well 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
GUID abcd1234).</t>

</section>
<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 “HTTP3” if events from
this document are included in a qlog trace.</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:'>
  As HTTP/3 does not use trailers in frames, each HTTP/3 frame header_length can
be calculated as header_length = RawInfo:length - RawInfo:payload_length</t>
  <t hangText='Note:'>
  In some cases, the length fields are also explicitly reflected inside of frame
headers. For example, all HTTP/3 frames include their explicit payload lengths in
the frame header. 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 HTTP/3 specifications to
qlog, making it easier for users to interpret. In this case, both fields MUST have
the same value.</t>
</list></t>

</section>
</section>
</section>
<section anchor="http3-and-qpack-event-definitions" title="HTTP/3 and QPACK event definitions">

<t>Each subheading in this section is a qlog event category, while each
sub-subheading is a qlog event type.</t>

<t>For example, for the following two items, we have the category “http” and event
type “parameters_set”, resulting in a concatenated qlog “name” field value of
“http:parameters_set”.</t>

<section anchor="http" title="http">

<t>Note: like all category values, the “http” category is written in lowercase.</t>

<section anchor="parametersset" title="parameters_set">
<t>Importance: Base</t>

<t>This event contains HTTP/3 and QPACK-level settings, mostly those received from
the HTTP/3 SETTINGS frame. All these parameters are typically set once and never
change. However, they are typically set at different times during the connection,
so there can 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>Data:</t>

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

    max_header_list_size?:uint64, // from SETTINGS_MAX_HEADER_LIST_SIZE
    max_table_capacity?:uint64, // from SETTINGS_QPACK_MAX_TABLE_CAPACITY
    blocked_streams_count?:uint64, // from SETTINGS_QPACK_BLOCKED_STREAMS

    // qlog-defined
    waits_for_settings?:boolean // indicates whether this implementation waits for a SETTINGS frame before processing requests
}
]]></artwork></figure>

<t>Note: enabling server push is not explicitly done in HTTP/3 by use of a setting or
parameter. Instead, it is communicated by use of the MAX_PUSH_ID frame, which
should be logged using the frame_created and frame_parsed events below.</t>

<t>Additionally, this event can contain any number of unspecified fields. This is to
reflect setting of for example unknown (greased) settings or parameters of
(proprietary) extensions.</t>

</section>
<section anchor="parametersrestored" title="parameters_restored">
<t>Importance: Base</t>

<t>When using QUIC 0-RTT, HTTP/3 clients are expected to remember and reuse the
server’s SETTINGs from the previous connection. This event is used to indicate
which HTTP/3 settings were restored and to which values when utilizing 0-RTT.</t>

<t>Data:</t>

<figure><artwork><![CDATA[
{
    max_header_list_size?:uint64,
    max_table_capacity?:uint64,
    blocked_streams_count?:uint64
}
]]></artwork></figure>

<t>Note that, like for parameters_set above, this event can contain any number of
unspecified fields to allow for additional and custom settings.</t>

</section>
<section anchor="streamtypeset" title="stream_type_set">
<t>Importance: Base</t>

<t>Emitted when a stream’s type becomes known. This is typically when a stream is
opened and the stream’s type indicator is sent or received.</t>

<t>Note: most of this information can also be inferred by looking at a stream’s id,
since id’s are strictly partitioned at the QUIC level. Even so, this event has a
“Base” importance because it helps a lot in debugging to have this information
clearly spelled out.</t>

<t>Data:</t>

<figure><artwork><![CDATA[
{
    stream_id:uint64,

    owner?:"local"|"remote"

    old?:StreamType,
    new:StreamType,

    associated_push_id?:uint64 // only when new == "push"
}

enum StreamType {
    data, // bidirectional request-response streams
    control,
    push,
    reserved,
    qpack_encode,
    qpack_decode
}
]]></artwork></figure>

</section>
<section anchor="framecreated" title="frame_created">
<t>Importance: Core</t>

<t>HTTP equivalent to the packet_sent event. This event is emitted when the HTTP/3
framing actually happens. Note: this is not necessarily the same as when the
HTTP/3 data is passed on to the QUIC layer. For that, see the “data_moved” event
in <xref target="QLOG-QUIC"></xref>.</t>

<t>Data:</t>

<figure><artwork><![CDATA[
{
    stream_id:uint64,
    length?:uint64, // payload byte length of the frame
    frame:HTTP3Frame, // see appendix for the definitions,

    raw?:RawInfo
}
]]></artwork></figure>

<t>Note: in HTTP/3, DATA frames can have arbitrarily large lengths to reduce frame
header overhead. As such, DATA frames can span many QUIC packets and can be
created in a streaming fashion. In this case, the frame_created event is emitted
once for the frame header, and further streamed data is indicated using the
data_moved event.</t>

</section>
<section anchor="frameparsed" title="frame_parsed">
<t>Importance: Core</t>

<t>HTTP equivalent to the packet_received event. This event is emitted when we
actually parse the HTTP/3 frame. Note: this is not necessarily the same as when
the HTTP/3 data is actually received on the QUIC layer. For that, see the
“data_moved” event in <xref target="QLOG-QUIC"></xref>.</t>

<t>Data:</t>

<figure><artwork><![CDATA[
{
    stream_id:uint64,
    length?:uint64, // payload byte length of the frame
    frame:HTTP3Frame, // see appendix for the definitions,

    raw?:RawInfo
}
]]></artwork></figure>

<t>Note: in HTTP/3, DATA frames can have arbitrarily large lengths to reduce frame
header overhead. As such, DATA frames can span many QUIC packets and can be
processed in a streaming fashion. In this case, the frame_parsed event is emitted
once for the frame header, and further streamed data is indicated using the
data_moved event.</t>

</section>
<section anchor="pushresolved" title="push_resolved">
<t>Importance: Extra</t>

<t>This event is emitted when a pushed resource is successfully claimed (used) or,
conversely, abandoned (rejected) by the application on top of HTTP/3 (e.g., the
web browser). This event is added to help debug problems with unexpected PUSH
behaviour, which is commonplace with HTTP/2.</t>

<figure><artwork><![CDATA[
{
    push_id?:uint64,
    stream_id?:uint64, // in case this is logged from a place that does not have access to the push_id

    decision:"claimed"|"abandoned"
}
]]></artwork></figure>

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

<t>Note: like all category values, the “qpack” category is written in lowercase.</t>

<t>The QPACK events mainly serve as an aid to debug low-level QPACK issues. The
higher-level, plaintext header values SHOULD (also) be logged in the
http.frame_created and http.frame_parsed event data (instead).</t>

<t>Note: qpack does not have its own parameters_set event. This was merged with
http.parameters_set for brevity, since qpack is a required extension for HTTP/3
anyway. Other HTTP/3 extensions MAY also log their SETTINGS fields in
http.parameters_set or MAY define their own events.</t>

<section anchor="stateupdated" title="state_updated">
<t>Importance: Base</t>

<t>This event is emitted when one or more of the internal QPACK variables changes
value. Note that some variables 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 variables included a single event instance. If
you need to log settings from two sides, you MUST emit two separate event
instances.</t>

<t>Data:</t>

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

    dynamic_table_capacity?:uint64,
    dynamic_table_size?:uint64, // effective current size, sum of all the entries

    known_received_count?:uint64,
    current_insert_count?:uint64
}
]]></artwork></figure>

</section>
<section anchor="streamstateupdated" title="stream_state_updated">
<t>Importance: Core</t>

<t>This event is emitted when a stream becomes blocked or unblocked by header
decoding requests or QPACK instructions.</t>

<t>Note: This event is of “Core” importance, as it might have a large impact on
HTTP/3’s observed performance.</t>

<t>Data:</t>

<figure><artwork><![CDATA[
{
    stream_id:uint64,

    state:"blocked"|"unblocked" // streams are assumed to start "unblocked" until they become "blocked"
}
]]></artwork></figure>

</section>
<section anchor="dynamictableupdated" title="dynamic_table_updated">
<t>Importance: Extra</t>

<t>This event is emitted when one or more entries are inserted or evicted from QPACK’s dynamic table.</t>

<t>Data:</t>

<figure><artwork><![CDATA[
{
    owner:"local" | "remote", // local = the encoder's dynamic table. remote = the decoder's dynamic table

    update_type:"inserted"|"evicted",

    entries:Array<DynamicTableEntry>
}

class DynamicTableEntry {
    index:uint64;
    name?:string | bytes;
    value?:string | bytes;
}
]]></artwork></figure>

</section>
<section anchor="headersencoded" title="headers_encoded">
<t>Importance: Base</t>

<t>This event is emitted when an uncompressed header block is encoded successfully.</t>

<t>Note: this event has overlap with http.frame_created for the HeadersFrame type.
When outputting both events, implementers MAY omit the “headers” field in this
event.</t>

<t>Data:</t>

<figure><artwork><![CDATA[
{
    stream_id?:uint64,

    headers?:Array<HTTPHeader>,

    block_prefix:QPackHeaderBlockPrefix,
    header_block:Array<QPackHeaderBlockRepresentation>,

    length?:uint32,
    raw?:bytes
}
]]></artwork></figure>

</section>
<section anchor="headersdecoded" title="headers_decoded">
<t>Importance: Base</t>

<t>This event is emitted when a compressed header block is decoded successfully.</t>

<t>Note: this event has overlap with http.frame_parsed for the HeadersFrame type.
When outputting both events, implementers MAY omit the “headers” field in this
event.</t>

<t>Data:</t>

<figure><artwork><![CDATA[
{
    stream_id?:uint64,

    headers?:Array<HTTPHeader>,

    block_prefix:QPackHeaderBlockPrefix,
    header_block:Array<QPackHeaderBlockRepresentation>,

    length?:uint32,
    raw?:bytes
}
]]></artwork></figure>

</section>
<section anchor="instructioncreated" title="instruction_created">
<t>Importance: Base</t>

<t>This event is emitted when a QPACK instruction (both decoder and encoder) is
created and added to the encoder/decoder stream.</t>

<t>Data:</t>

<figure><artwork><![CDATA[
{
    instruction:QPackInstruction // see appendix for the definitions,

    length?:uint32,
    raw?:bytes
}
]]></artwork></figure>

<t>Note: encoder/decoder semantics and stream_id’s are implicit in either the
instruction types or can be logged via other events (e.g., http.stream_type_set)</t>

</section>
<section anchor="instructionparsed" title="instruction_parsed">
<t>Importance: Base</t>

<t>This event is emitted when a QPACK instruction (both decoder and encoder) is read
from the encoder/decoder stream.</t>

<t>Data:</t>

<figure><artwork><![CDATA[
{
    instruction:QPackInstruction // see appendix for the definitions,

    length?:uint32,
    raw?:bytes
}
]]></artwork></figure>

<t>Note: encoder/decoder semantics and stream_id’s are implicit in either the
instruction types or can be logged via other events (e.g., http.stream_type_set)</t>

</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-HTTP" >
  <front>
    <title>Hypertext Transfer Protocol Version 3 (HTTP/3)</title>
    <author initials="M." surname="Bishop" fullname="Mike Bishop" role="editor">
      <organization>Akamai Technologies</organization>
    </author>
    <date />
  </front>
  <seriesInfo name="Internet-Draft" value="draft-ietf-quic-http-latest"/>
</reference>
<reference anchor="QUIC-QPACK" >
  <front>
    <title>QPACK: Header Compression for HTTP over QUIC</title>
    <author initials="C." surname="Krasic" fullname="Charles 'Buck' Krasic">
      <organization>Google, Inc</organization>
    </author>
    <author initials="M." surname="Bishop" fullname="Mike Bishop">
      <organization>Akamai Technologies</organization>
    </author>
    <author initials="A." surname="Frindell" fullname="Alan Frindell" role="editor">
      <organization>Facebook</organization>
    </author>
    <date />
  </front>
  <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qpack-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-04"/>
</reference>
<reference anchor="QLOG-QUIC" >
  <front>
    <title>QUIC 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-quic-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="http3-data-field-definitions" title="HTTP/3 data field definitions">

<section anchor="http3-frames" title="HTTP/3 Frames">

<figure><artwork><![CDATA[
type HTTP3Frame = DataFrame | HeadersFrame | PriorityFrame | CancelPushFrame | SettingsFrame | PushPromiseFrame | GoAwayFrame | MaxPushIDFrame | DuplicatePushFrame | ReservedFrame | UnknownFrame;
]]></artwork></figure>

<section anchor="dataframe" title="DataFrame">
<figure><artwork><![CDATA[
class DataFrame{
    frame_type:string = "data";

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

</section>
<section anchor="headersframe" title="HeadersFrame">

<t>This represents an <spanx style="emph">uncompressed</spanx>, plaintext HTTP Headers frame (e.g., no QPACK
compression is applied).</t>

<t>For example:</t>

<figure><artwork><![CDATA[
headers: [{"name":":path","value":"/"},{"name":":method","value":"GET"},{"name":":authority","value":"127.0.0.1:4433"},{"name":":scheme","value":"https"}]
]]></artwork></figure>

<figure><artwork><![CDATA[
class HeadersFrame{
    frame_type:string = "header";
    headers:Array<HTTPHeader>;
}

class HTTPHeader {
    name:string;
    value:string;
}
]]></artwork></figure>

</section>
<section anchor="cancelpushframe" title="CancelPushFrame">
<figure><artwork><![CDATA[
class CancelPushFrame{
    frame_type:string = "cancel_push";
    push_id:uint64;
}
]]></artwork></figure>

</section>
<section anchor="settingsframe" title="SettingsFrame">
<figure><artwork><![CDATA[
class SettingsFrame{
    frame_type:string = "settings";
    settings:Array<Setting>;
}

class Setting{
    name:string;
    value:string;
}
]]></artwork></figure>

</section>
<section anchor="pushpromiseframe" title="PushPromiseFrame">

<figure><artwork><![CDATA[
class PushPromiseFrame{
    frame_type:string = "push_promise";
    push_id:uint64;

    headers:Array<HTTPHeader>;
}
]]></artwork></figure>

</section>
<section anchor="goawayframe" title="GoAwayFrame">
<figure><artwork><![CDATA[
class GoAwayFrame{
    frame_type:string = "goaway";
    stream_id:uint64;
}
]]></artwork></figure>

</section>
<section anchor="maxpushidframe" title="MaxPushIDFrame">
<figure><artwork><![CDATA[
class MaxPushIDFrame{
    frame_type:string = "max_push_id";
    push_id:uint64;
}
]]></artwork></figure>

</section>
<section anchor="duplicatepushframe" title="DuplicatePushFrame">
<figure><artwork><![CDATA[
class DuplicatePushFrame{
    frame_type:string = "duplicate_push";
    push_id:uint64;
}
]]></artwork></figure>

</section>
<section anchor="reservedframe" title="ReservedFrame">
<figure><artwork><![CDATA[
class ReservedFrame{
    frame_type:string = "reserved";
}
]]></artwork></figure>

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

<t>HTTP/3 re-uses QUIC’s UnknownFrame definition, since their values and usage
overlaps. See <xref target="QLOG-QUIC"></xref>.</t>

</section>
</section>
<section anchor="applicationerror" title="ApplicationError">
<figure><artwork><![CDATA[
enum ApplicationError{
    http_no_error,
    http_general_protocol_error,
    http_internal_error,
    http_stream_creation_error,
    http_closed_critical_stream,
    http_frame_unexpected,
    http_frame_error,
    http_excessive_load,
    http_id_error,
    http_settings_error,
    http_missing_settings,
    http_request_rejected,
    http_request_cancelled,
    http_request_incomplete,
    http_early_response,
    http_connect_error,
    http_version_fallback
}
]]></artwork></figure>

</section>
</section>
<section anchor="qpack-data-type-definitions" title="QPACK DATA type definitions">

<section anchor="qpack-instructions" title="QPACK Instructions">

<t>Note: the instructions do not have explicit encoder/decoder types, since there is
no overlap between the insturctions of both types in neither name nor function.</t>

<figure><artwork><![CDATA[
type QPackInstruction = SetDynamicTableCapacityInstruction | InsertWithNameReferenceInstruction | InsertWithoutNameReferenceInstruction | DuplicateInstruction | HeaderAcknowledgementInstruction | StreamCancellationInstruction | InsertCountIncrementInstruction;
]]></artwork></figure>

<section anchor="setdynamictablecapacityinstruction" title="SetDynamicTableCapacityInstruction">

<figure><artwork><![CDATA[
class SetDynamicTableCapacityInstruction {
    instruction_type:string = "set_dynamic_table_capacity";

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

</section>
<section anchor="insertwithnamereferenceinstruction" title="InsertWithNameReferenceInstruction">

<figure><artwork><![CDATA[
class InsertWithNameReferenceInstruction {
    instruction_type:string = "insert_with_name_reference";

    table_type:"static"|"dynamic";

    name_index:uint32;

    huffman_encoded_value:boolean;

    value_length?:uint32;
    value?:string;
}
]]></artwork></figure>

</section>
<section anchor="insertwithoutnamereferenceinstruction" title="InsertWithoutNameReferenceInstruction">

<figure><artwork><![CDATA[
class InsertWithoutNameReferenceInstruction {
    instruction_type:string = "insert_without_name_reference";

    huffman_encoded_name:boolean;

    name_length?:uint32;
    name?:string;

    huffman_encoded_value:boolean;

    value_length?:uint32;
    value?:string;
}
]]></artwork></figure>

</section>
<section anchor="duplicateinstruction" title="DuplicateInstruction">

<figure><artwork><![CDATA[
class DuplicateInstruction {
    instruction_type:string = "duplicate";

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

</section>
<section anchor="headeracknowledgementinstruction" title="HeaderAcknowledgementInstruction">

<figure><artwork><![CDATA[
class HeaderAcknowledgementInstruction {
    instruction_type:string = "header_acknowledgement";

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

</section>
<section anchor="streamcancellationinstruction" title="StreamCancellationInstruction">

<figure><artwork><![CDATA[
class StreamCancellationInstruction {
    instruction_type:string = "stream_cancellation";

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

</section>
<section anchor="insertcountincrementinstruction" title="InsertCountIncrementInstruction">

<figure><artwork><![CDATA[
class InsertCountIncrementInstruction {
    instruction_type:string = "insert_count_increment";

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

</section>
</section>
<section anchor="qpack-header-compression" title="QPACK Header compression">

<figure><artwork><![CDATA[
type QPackHeaderBlockRepresentation = IndexedHeaderField | LiteralHeaderFieldWithName | LiteralHeaderFieldWithoutName;
]]></artwork></figure>

<section anchor="indexedheaderfield" title="IndexedHeaderField">

<t>Note: also used for “indexed header field with post-base index”</t>

<figure><artwork><![CDATA[
class IndexedHeaderField {
    header_field_type:string = "indexed_header";

    table_type:"static"|"dynamic"; // MUST be "dynamic" if is_post_base is true
    index:uint32;

    is_post_base:boolean = false; // to represent the "indexed header field with post-base index" header field type
}
]]></artwork></figure>

</section>
<section anchor="literalheaderfieldwithname" title="LiteralHeaderFieldWithName">

<t>Note: also used for “Literal header field with post-base name reference”</t>

<figure><artwork><![CDATA[
class LiteralHeaderFieldWithName {
    header_field_type:string = "literal_with_name";

    preserve_literal:boolean; // the 3rd "N" bit
    table_type:"static"|"dynamic"; // MUST be "dynamic" if is_post_base is true
    name_index:uint32;

    huffman_encoded_value:boolean;
    value_length?:uint32;
    value?:string;

    is_post_base:boolean = false; // to represent the "Literal header field with post-base name reference" header field type
}
]]></artwork></figure>

</section>
<section anchor="literalheaderfieldwithoutname" title="LiteralHeaderFieldWithoutName">

<figure><artwork><![CDATA[
class LiteralHeaderFieldWithoutName {
    header_field_type:string = "literal_without_name";

    preserve_literal:boolean; // the 3rd "N" bit

    huffman_encoded_name:boolean;
    name_length?:uint32;
    name?:string;

    huffman_encoded_value:boolean;
    value_length?:uint32;
    value?:string;
}
]]></artwork></figure>

</section>
<section anchor="qpackheaderblockprefix" title="QPackHeaderBlockPrefix">

<figure><artwork><![CDATA[
class QPackHeaderBlockPrefix {
    required_insert_count:uint32;
    sign_bit:boolean;
    delta_base:uint32;
}
]]></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>
</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>

