Skip to content

qlog: update to quic-events-14, h3-events-14 and main-schema-15 - #2886

Open
LPardue wants to merge 25 commits into
cloudflare:masterfrom
LPardue:qlog-update
Open

LPardue wants to merge 25 commits into
cloudflare:masterfrom
LPardue:qlog-update

Conversation

@LPardue

@LPardue LPardue commented Nov 11, 2026

Copy link
Copy Markdown
Contributor

This PR updates the qlog crate and its dependents to match the latest drafts:

It supersedes #2537, rebased onto master with further commits for the -14/-15 changes. Commits are split to aid review. Suggest squashing on merge.

Notable output changes:

  • IP/port pairs are now address_v4/address_v6 (IPAddressPort).
  • datagram_id(s) is now datagram_payload_checksum(s).
  • frames_processed and PacketHeader.length are removed.
  • ecn on UDP datagram events is a list.
  • HTTP/3 SETTINGS use the settings_* names, with reserved/unknown plus name_bytes.
  • Event names are udp_datagrams_sent, udp_datagrams_received, udp_datagram_dropped and key_discarded.
  • quic:datagram_dropped, reset_stream_at frame and stream_side are added.

Commits:

  • qlog: add Event tuple/system_info fields and SystemInformation
  • qlog: drop CommonFields.protocol_types, make reference_time optional
  • qlog: loglevel info/debug/verbose carry only a required message
  • qlog: split frames_processed into frames_created/frames_parsed
  • qlog: align ConnectionClosedTrigger with quic-events-13
  • qlog: rename connection_id_updated owner to required initiator
  • qlog: fix packet_received trigger to keys_available
  • qlog: add duplicate and key_unavailable packet_dropped triggers
  • qlog: represent CryptoError as a crypto_error_0x1XX string
  • qlog: correct HTTP/3 ApplicationError string values
  • qlog: add HTTP/3 ORIGIN frame
  • qlog: move HTTP/3 frame length into frame raw info
  • qlog: format mark_closed connection close mapping
  • qlog: drop datagram field from HTTP/3 datagram events
  • qlog: add HTTP Capsule Protocol event schema
  • qlog: bump event schema URIs to latest drafts
  • qlog: use distinct VantagePointFlow type
  • CLIPPY SHUTUP ITS MY LAST DAY
  • qlog: align with quic-events-14, h3-events-14 and main-schema-15
  • qlog: log ecn as a list on UDP datagram events
  • qlog: add reset_stream_at to quic parameters_set
  • qlog: fix stream_side, reset_stream_at frame, settings names and enum values

LPardue and others added 22 commits November 11, 2026 17:06
Aligns the abstract Event class with draft-ietf-quic-qlog-main-schema-14
Section 7, which adds the optional top-level tuple (TupleID) and
system_info (SystemInformation) fields.
protocol_types was removed from CommonFields in
draft-ietf-quic-qlog-main-schema-10 (event_schemas on Trace/TraceSeq
replaces it), and reference_time is an optional field per Section 7.5.
Per draft-ietf-quic-qlog-main-schema-14 Section 9.1, the info, debug and
verbose loglevel events have a single required message field and no code
field (code remains only on error and warning).
draft-ietf-quic-qlog-quic-events-13 splits the old frames_processed
event into three (frames_created, frames_parsed, frames_processed), all
with a frames array and an optional packet_numbers array. Also fixes
packet_numbers to be an array of packet numbers rather than a scalar.
The trigger enum is now idle_timeout, application, error,
version_mismatch, stateless_reset, aborted, unspecified. The clean and
handshake_timeout values were removed; quiche maps a graceful (NoError)
close to no trigger and a failed handshake to idle_timeout.
quic-events-13 (via cloudflare#498) renamed the owner field to initiator and makes
it a required field.
quic-events-13 defines the packet_received trigger value as
keys_available (a packet buffered because it could not previously be
decrypted), replacing the incorrect keys_unavailable.
quic-events-13 defines the additional packet_dropped trigger values
duplicate and key_unavailable.
Replaces the placeholder CryptoError enum with the string form defined by
quic-events-13 (text matching crypto_error_0x1XX).
Renames three ApplicationError variants so their serialized values match
h3-events-13: http_frame_unexpected, http_request_incomplete, and
http_request_rejected.
h3-events-13 adds the ORIGIN frame (RFC 9412). Adds the Origin variant
to Http3Frame with an origin_entries array of Http3OriginEntry.
The h3-events-13 schema removes the top-level length and raw fields from
frame_created and frame_parsed. Preserve the byte length quiche logs by
relocating it into the frame's own RawInfo.
Reflow the mark_closed match introduced when aligning
ConnectionClosedTrigger, which was committed unformatted.
The h3-events-13 schema removes the datagram field from
datagram_created and datagram_parsed, leaving quarter_stream_id and
the optional raw info.
Add the http namespace from h3-events-13: capsule_created and
capsule_parsed events carrying an HttpCapsule (datagram or unknown),
wired into EventType, EventData and importance mappings.
Advance the schema URIs to quic-13, http3-13 and loglevel-14, and add
the http-13 URI for the newly added Capsule Protocol namespace.
The main schema defines VantagePointFlow as client/server/unknown,
excluding network. Use a dedicated enum for the flow field instead of
reusing VantagePointType, which allowed the invalid network value.
Update event schema URIs, replace IP/port pairs with IPAddressPort,
rename datagram_id to datagram_payload_checksum, drop frames_processed
and PacketHeader.length, add quic:datagram_dropped, fix event names
(udp_datagram*, key_discarded), make parameters_set initiator required,
and sync HTTP/3 settings, ORIGIN raw and error codes.
… values

Add required stream_side to stream_state_updated, add the
reset_stream_at frame, rename handshake_completed to handshake_complete
and scheduled to scheduling, and log HTTP/3 settings with the
settings_* names plus reserved/unknown and name_bytes.
@LPardue
LPardue requested a review from a team as a code owner November 11, 2026 18:34
The main schema defines serialization_format as a media type. Write
application/qlog+json-seq instead of JSON-SEQ for sequential files.
Reorder Event, CommonFields, Http3Frame, QuicFrame, QuicFrameTypeName,
QuicEventType, StreamType and StreamState to match the CDDL order. Event
and CommonFields now serialize time_format before group_id.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant