Skip to content

Releases: zigstack/zquic

v1.7.86

Choose a tag to compare

@github-actions github-actions released this 10 Jul 20:39

See CHANGELOG.md for details.

v1.7.85

Choose a tag to compare

@github-actions github-actions released this 10 Jul 19:38

See CHANGELOG.md for details.

v1.7.84

Choose a tag to compare

@github-actions github-actions released this 10 Jul 19:00

See CHANGELOG.md for details.

v1.7.83

Choose a tag to compare

@github-actions github-actions released this 10 Jul 18:17

See CHANGELOG.md for details.

v1.7.82

Choose a tag to compare

@github-actions github-actions released this 10 Jul 17:34

See CHANGELOG.md for details.

v1.7.81

Choose a tag to compare

@github-actions github-actions released this 10 Jul 16:17

See CHANGELOG.md for details.

v1.7.80

Choose a tag to compare

@github-actions github-actions released this 10 Jul 15:29

Lost-grant wedge fix + interop-gate robustness — #231, #229 (PR #244)

Flow-control wedge self-heal (#231)

BLOCKED frames are emitted once by the fresh-send path and never retransmitted on loss. A dropped window-GRANT datagram (MAX_STREAM_DATA / MAX_DATA) after the payload was already queued — with an idle app — left the pending-send drain silently skipping closed-window entries forever: a permanent transfer wedge (production-relevant: fully-queued reqresp response + app stops writing).

  • The drain (server + client) now re-signals STREAM_DATA_BLOCKED / DATA_BLOCKED from its flow-control skip branches, rate-limited to one per 250 ms per conn. The peer's grant arms already re-drain — a lost grant self-heals.
  • The previously-skipped raw-app recv delivery budget socket-loopback test is re-enabled (its Linux-CI stall was exactly this wedge) and a deterministic wedge-recovery test proves the re-signal path.
  • Closes out #231 (recv-side round-robin + credit-invariant test had landed in v1.7.65).

Flaky transfer auto-retry in the CI interop gate (#229)

  • Failed transfer cases are automatically re-run once per suite; base-failed + retry-passed is reported as FLAKY-PASSED (non-fatal). A real regression fails both attempts and still reds the gate. cross-zquic-quinn transfer stays KNOWN_FAILING (#184), no retry.

CI: both interop runs green; 301/301 unit tests (0 skips — first zero-skip suite), 5× repeat-stable.

Note: v1.7.79 (handshake deadline + reorder eviction, separate workstream) does NOT include this PR; v1.7.80 is the first tag with it.

v1.7.79

Choose a tag to compare

@github-actions github-actions released this 10 Jul 14:33

See CHANGELOG.md for details.

v1.7.78

Choose a tag to compare

@github-actions github-actions released this 10 Jul 13:52

Per-stream send priority (quinn SendStream::set_priority parity) — #191, PR #243

  • Server.setStreamPriority(conn, stream_id, priority: i32) / Client.setStreamPriority(stream_id, priority: i32) — default 0, higher drains first, 0 clears the entry.
  • Priority-aware pending-send drain (both sides): strictly descending priority tiers; within a tier, arrival order with one chunk per entry per pass (equal-priority streams round-robin exactly as before). With no priorities set the drain order is byte-identical to the previous FIFO.
  • #236 compatibility: markStreamPriority / unmarkStreamPriority remain as shims (set 1 / clear). The pending-send byte-budget headroom now keys on priority > 0; negative priorities order below default without claiming the gossip headroom.
  • Shared caps unchanged: per-drive send budget + per-call cap span all tiers; CC/pacer block aborts the drain as before; FC-blocked higher-tier entries are never double-sent on lower passes.

For libp2p embedders: give the persistent /meshsub gossip stream (or any control stream) a positive priority and bulk blocks_by_range responses can no longer delay it in the egress queue — previously only the byte budget was protected (#236), not the drain order.

CI: both PR interop gates green. 299/300 unit tests (+3 new; 1 pre-existing skip), including a loopback ordering proof.

v1.7.77

Choose a tag to compare

@github-actions github-actions released this 10 Jul 12:49

ACK Frequency extension (draft-ietf-quic-ack-frequency) — #187, PR #242

Peers (quinn / quiche / msquic all ship this) can now tune zquic's ACK cadence:

  • min_ack_delay transport parameter (0xff04de1b, microseconds) — advertised by default at 1000 µs (1 ms, the drive-tick ACK granularity). Disable with TransportParamsOpts.min_ack_delay_us = 0. Peer's value parsed + stored; a peer advertising min_ack_delay > max_ack_delay is defensively treated as not-advertised.
  • ACK_FREQUENCY frame (0xaf) — sequence-gated apply of ack-eliciting threshold, requested max ack delay, and reordering threshold. Stale/duplicate frames ignored per draft §4; malformed body → FRAME_ENCODING_ERROR; requested delay below our advertised min_ack_delay → PROTOCOL_VIOLATION.
  • IMMEDIATE_ACK frame (0x1f) — flushes the pending app-ACK immediately.
  • ACK cadence honor: zero default-path change — until a peer sends ACK_FREQUENCY, ACKs flush every drive tick exactly as before. Once armed, ACKs are held until the eliciting threshold trips, the requested delay expires, a reorder beyond the reordering threshold occurs, or IMMEDIATE_ACK arrives.
  • PTO probes (client + server) ride an IMMEDIATE_ACK alongside the PING when the peer advertised support, so probes are answered without waiting out the peer's delayed-ack timer.

New module: src/frames/ack_frequency.zig (codec + tests). Frame registry (frame.zig) gains immediate_ack / ack_frequency variants.

Not included (deliberate): the embedder-facing API for sending ACK_FREQUENCY to tune the peer's cadence — receive-side honor is the interop-relevant half.

CI: full green including the Interop Runner gate (same-impl + cross-impl vs quinn, with the new transport parameter active in every handshake). 296/297 unit tests (+9 new; 1 pre-existing skip).