Skip to content

WebTransport: count a session's expired outgoing datagrams - #3986

Merged
mxinden merged 1 commit into
mainfrom
users/jesup/expire_datagrams
Oct 16, 2026
Merged

mxinden merged 1 commit into
mainfrom
users/jesup/expire_datagrams

Conversation

@jesup

@jesup jesup commented Sep 14, 2026 •

Copy link
Copy Markdown
Member
Implement Protocol::record_expired_outgoing_datagrams on the WebTransport
session, so SessionStats::datagrams_expired_outgoing counts datagrams shed
for exceeding outgoingMaxAge; the field existed but stayed zero.

The HTTP/3 layer picks the counts up in its per-session sweep, and
close_session collects any still pending before returning the final stats.
Add Connection::next_datagram_expiry so the sweep can skip scanning the
receive streams when nothing is due.

A session the peer closes drops its queue as soon as it leaves the active
state; a close capsule without a FIN would otherwise leave the queue in
place until the FIN arrives.  Datagrams still queued when a session closes
are dropped, not counted as expired.

@jesup

jesup commented Sep 14, 2026 •

Copy link
Copy Markdown
Member Author

This PR is part of a stack of 6 bookmarks:

  1. trunk()
  2. users/jesup/rename_max_buffered_datagrams
  3. users/jesup/expire_datagrams ← this PR
  4. users/jesup/reject_datagrams
  5. users/jesup/expose_watermark_max_age
  6. users/jesup/datagram_counting
  7. users/jesup/report_datagrams

Created with jj-stack

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

One or more issues must be addressed before approval.

Get a fresh assessment by requesting another Copilot review.

Pull request overview

Wires outgoing WebTransport datagram expiry into HTTP/3 processing and records expiry statistics.

Changes:

  • Expire datagram queues during client and server processing.
  • Track expired outgoing datagrams in WebTransport stats.
  • Add regression coverage and update documentation.
File summaries
File Description
neqo-http3/src/features/extended_connect/webtransport_session.rs Updated as part of this pull request.
neqo-http3/src/features/extended_connect/tests/webtransport/datagrams.rs Updated as part of this pull request.
neqo-http3/src/features/extended_connect/stats.rs Updated as part of this pull request.
neqo-http3/src/connection_server.rs Updated as part of this pull request.
neqo-http3/src/connection_client.rs Updated as part of this pull request.
Review details

Suppressed comments (4)

neqo-http3/src/connection_client.rs:750

  • This sweep is inside the active-state arm, so it does not run once the client enters Http3State::Closing. A peer-initiated close sets the HTTP/3 state to Closing without clearing the extended-CONNECT sessions, while the transport's process_timer also skips datagram expiry during closing; queued stale datagrams can therefore remain until the connection is dropped and are never counted. Run the sweep for every non-closed HTTP/3 tick, as the server path does.
                self.base_handler
                    .expire_datagram_queues(&mut self.conn, now);

neqo-http3/src/connection_client.rs:750

  • This activates a shared sweep whose accounting is not actually per session: Session::expire_datagrams calls conn.expire_datagrams(now), which expires every queue, while this helper invokes it once for each active session. With the multiple-session case already supported by datagrams_multiple_session, the first session visited consumes both sessions' stale datagrams and records both counts in its own SessionStats; the other session records zero. Make the transport sweep session-scoped (or return per-session counts) before using this call.
                self.base_handler
                    .expire_datagram_queues(&mut self.conn, now);

neqo-http3/src/connection_server.rs:198

  • This sweep is not reached for every server connection at each Http3Server::process_http3 call: the outer server only selects active_connections() or handlers whose should_be_processed() is true, and that predicate does not include a pending QUIC datagram queue. If a send attempt leaves a datagram queued until its expiry timer, the transport's Connection::process_timer can remove it before this handler is selected, so the WebTransport expiry statistic stays at zero. Select/sweep connections with a due datagram expiry before transport timer processing.
        self.base_handler.expire_datagram_queues(conn, now);

neqo-http3/src/features/extended_connect/webtransport_session.rs:251

  • This counter is intended to be per WebTransport session, but the sweep that calls this hook uses Connection::expire_datagrams, which removes stale entries from every session queue on the connection. With two active WebTransport sessions, whichever session is visited first records all expired datagrams and the other records zero (or the first records datagrams belonging only to the other session). Scope the expiry/counting to the current session, or return per-session counts before updating this field.
    fn record_expired_outgoing_datagrams(&mut self, count: u64) {
        self.stats.datagrams_expired_outgoing += count;
  • Files reviewed: 5/5 changed files
  • Comments generated: 1
  • Review effort level: Lite (auto)

Note

Copilot is running an experiment and ran this review at Lite.


💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread neqo-http3/src/connection_server.rs
@codspeed

codspeed Bot commented Sep 14, 2026 •

Copy link
Copy Markdown
Contributor

Merging this PR will regress 1 benchmark

⚡ 5 improved benchmarks
❌ 1 regressed benchmark
✅ 95 untouched benchmarks

Warning

Please fix the performance issues or acknowledge them on CodSpeed.

Performance Changes

Mode Benchmark BASE HEAD Efficiency
❌ Simulation decode 10 STREAM frames 3.8 µs 3.9 µs -2.74%
⚡ WallTime 1-conn/10_000-parallel-1b-resp (aka. RPS) 70 ms 67.1 ms +4.31%
⚡ WallTime walltime/1000-streams/each-1-bytes 3.8 ms 3.7 ms +2.43%
⚡ WallTime walltime/pacing-true/varying-seeds 2 ms 2 ms +2.36%
⚡ WallTime 1-conn/1-1b-resp (aka. HPS) 3 ms 2.9 ms +2.32%
⚡ WallTime quiche-neqo 42.3 ms 41.3 ms +2.27%

Tip

Investigate this regression by commenting @codspeedbot fix this regression on this PR, or directly use the CodSpeed MCP with your agent.


Comparing users/jesup/expire_datagrams (c859f4f) with main (59f731f)

Open in CodSpeed

@jesup
jesup force-pushed the users/jesup/hook_up_queue branch from 1f3c5c1 to 40b0996 Compare September 14, 2026 05:31
@jesup
jesup requested a review from omansfeld as a code owner September 14, 2026 05:31
@jesup
jesup force-pushed the users/jesup/expire_datagrams branch from d74cf65 to b3a3b72 Compare September 14, 2026 05:31
@codecov

codecov Bot commented Sep 14, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 97.00%. Comparing base (59f731f) to head (c859f4f).

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #3986      +/-   ##
==========================================
- Coverage   97.12%   97.00%   -0.13%     
==========================================
  Files         113      118       +5     
  Lines       41313    41747     +434     
  Branches    41313    41747     +434     
==========================================
+ Hits        40126    40497     +371     
- Misses       1173     1226      +53     
- Partials       14       24      +10     
Flag Coverage Δ
freebsd 94.57% <96.73%> (-0.13%) ⬇️
linux 97.22% <100.00%> (+0.03%) ⬆️
macos 95.34% <96.73%> (-0.01%) ⬇️
windows 95.44% <96.73%> (+<0.01%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

Components Coverage Δ
neqo-common 99.31% <ø> (ø)
neqo-http3 95.40% <100.00%> (+0.04%) ⬆️
neqo-qpack 97.10% <ø> (ø)
neqo-transport 97.99% <ø> (+0.04%) ⬆️
neqo-udp 95.37% <ø> (ø)
mtu 89.13% <ø> (ø)

@jesup
jesup force-pushed the users/jesup/hook_up_queue branch from 40b0996 to 95b5b8d Compare September 14, 2026 17:56
@jesup
jesup force-pushed the users/jesup/expire_datagrams branch from b3a3b72 to af3de7e Compare September 14, 2026 17:56
@mxinden

mxinden commented Sep 15, 2026

Copy link
Copy Markdown
Member

@jesup I don't think the PR title matches the code you are proposing here. This pull request only adds the reporting, no?

@jesup

jesup commented Sep 16, 2026

Copy link
Copy Markdown
Member Author

@jesup I don't think the PR title matches the code you are proposing here. This pull request only adds the reporting, no?

You're right, and I had already updated this locally - the commit is retitled here to "WebTransport: count a session's expired outgoing datagrams" since the process_http3 wiring moved to #3985 (so #3985 doesn't ship a sweep with no caller). Title will update once I push; sorry for the stale name

@jesup
jesup force-pushed the users/jesup/hook_up_queue branch from 95b5b8d to 6a29098 Compare September 16, 2026 03:45
@jesup
jesup force-pushed the users/jesup/expire_datagrams branch from af3de7e to 579205f Compare September 16, 2026 03:45
Comment thread neqo-http3/src/connection.rs Outdated
Comment thread neqo-http3/src/connection.rs Outdated
Comment thread neqo-http3/src/features/extended_connect/session.rs Outdated
Comment thread neqo-http3/src/connection.rs Outdated
Base automatically changed from users/jesup/rename_max_buffered_datagrams to main October 5, 2026 19:02
@jesup
jesup force-pushed the users/jesup/expire_datagrams branch from 1f13246 to da023cc Compare October 6, 2026 05:22

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I found no defects worth posting. The code-review pass turned up a few points, and none survived filtering. One (a local close drops the queue without collecting its pending expiry count) was already raised in an earlier review thread. The rest were cleanup suggestions, stats gaps you can't observe once the session is removed, or doc nits.

@larseggert

Copy link
Copy Markdown
Collaborator

@jesup merge conflicts prevent the stack from landing.

Comment thread neqo-http3/src/features/extended_connect/session.rs Outdated
@jesup

jesup commented Oct 12, 2026 •

Copy link
Copy Markdown
Member Author

From #3988:

I don't understand the need for this patch. Can you not react on OutgoingDatagramOutcome from neqo-transport?

Sorry for the slow answer - it didn't show as a "Resolve" question and I skipped over it. Reacting to OutgoingDatagramOutcome wouldn't work as things stand: the transport raises no event when process_timer drops an expired datagram. The outcome only covers Acked/Lost/DroppedTooBig, and only for datagrams enqueued with an id; adding an expiry outcome would bring back the per-datagram drop events you asked to remove in #3983.

@jesup
jesup force-pushed the users/jesup/expire_datagrams branch from da023cc to c21be6e Compare October 12, 2026 15:06

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No whole-change observations.

@mxinden mxinden left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One last suggestion. Otherwise ready to merge from my end.

Comment thread neqo-http3/src/features/extended_connect/session.rs Outdated
@jesup
jesup force-pushed the users/jesup/expire_datagrams branch from c21be6e to 68648a9 Compare October 14, 2026 17:16

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No findings.

Comment thread neqo-http3/src/features/extended_connect/session.rs Outdated

@mxinden mxinden left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Minor cleanup, otherwise ready to merge.

@larseggert

Copy link
Copy Markdown
Collaborator

@jesup clippy is unhappy

Implement Protocol::record_expired_outgoing_datagrams on the WebTransport
session, so SessionStats::datagrams_expired_outgoing counts datagrams shed
for exceeding outgoingMaxAge; the field existed but stayed zero.

The HTTP/3 layer picks the counts up in its per-session sweep, and
close_session collects any still pending before returning the final stats.

A session the peer closes drops its queue as soon as it leaves the active
state; a close capsule without a FIN would otherwise leave the queue in
place until the FIN arrives.  Datagrams still queued when a session closes
are dropped, not counted as expired.
@jesup
jesup force-pushed the users/jesup/expire_datagrams branch from 68648a9 to c859f4f Compare October 16, 2026 12:07

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No findings.

@github-actions

Copy link
Copy Markdown
Contributor

Failed Interop Tests

QUIC Interop Runner, client vs. server, differences relative to main at 59f731f.

neqo-pr as clientneqo-pr as server
neqo-pr vs. go-x-net: BP BA
neqo-pr vs. haproxy: ⚠️M BP BA
neqo-pr vs. kwik: ⚠️C20 Z L1 C1
neqo-pr vs. lsquic: run cancelled after 20 min
neqo-pr vs. msquic: Z A L1 C1
neqo-pr vs. mvfst: A BA
neqo-pr vs. neqo: Z A
neqo-pr vs. nginx: BP BA
neqo-pr vs. ngtcp2: Z L1 C1 CM
neqo-pr vs. picoquic: Z A 🚀BP BA
neqo-pr vs. quic-go: A
neqo-pr vs. quiche: BP BA
neqo-pr vs. s2n-quic: CM
neqo-pr vs. tquic: S BP BA
neqo-pr vs. xquic: S R Z A L1 C1
go-x-net vs. neqo-pr: CM
kwik vs. neqo-pr: BP BA CM
msquic vs. neqo-pr: CM
mvfst vs. neqo-pr: Z L1 C1 CM
neqo vs. neqo-pr: Z A
openssl vs. neqo-pr: LR M A CM
quic-go vs. neqo-pr: CM
quic-zig vs. neqo-pr: CM
quiche vs. neqo-pr: CM
quinn vs. neqo-pr: 🚀C1 V2 CM
s2n-quic vs. neqo-pr: ⚠️B BP CM
tquic vs. neqo-pr: CM
xquic vs. neqo-pr: M CM
All results

Succeeded Interop Tests

QUIC Interop Runner, client vs. server

neqo-pr as client

neqo-pr as server

Unsupported Interop Tests

QUIC Interop Runner, client vs. server

neqo-pr as client

neqo-pr as server

@github-actions

Copy link
Copy Markdown
Contributor

Client/server transfer results

Performance differences relative to 59f731f.

Transfer of 33554432 bytes over loopback, min. 100 runs. All unit-less numbers are in milliseconds.

Client vs. server Mean±σ Min–Max Median±MAD MiB/s±σ ΔMedian
google-neqo-cubic 70.9 ± 0.4 70.0 – 72.0 70.9 ± 0.4 451.2 ± 2.6 💔 +0.8 (+1.2%)
neqo-neqo-cubic 19.4 ± 0.1 19.1 – 19.8 19.4 ± 0.1 1651.9 ± 11.8 💚 -0.3 (-1.3%)
neqo-neqo-newreno 19.7 ± 0.1 19.5 – 20.2 19.7 ± 0.1 1621.7 ± 11.2 💚 -0.3 (-1.6%)
neqo-neqo-newreno-nopacing 19.2 ± 0.2 18.8 – 20.1 19.2 ± 0.2 1667.5 ± 19.7 💚 -0.4 (-1.9%)
quiche-neqo-cubic 31.2 ± 0.5 30.5 – 33.4 31.0 ± 0.3 1025.3 ± 16.2 💚 -0.4 (-1.4%)

Table above only shows statistically significant changes. See all results below.

All results

Transfer of 33554432 bytes over loopback, min. 100 runs. All unit-less numbers are in milliseconds.

Client vs. server Mean±σ Min–Max Median±MAD MiB/s±σ ΔMedian
google-google 132.9 ± 0.6 131.5 – 134.6 132.9 ± 0.5 240.9 ± 1.0
google-neqo-cubic 70.9 ± 0.4 70.0 – 72.0 70.9 ± 0.4 451.2 ± 2.6 💔 +0.8 (+1.2%)
neqo-google-cubic 240.8 ± 48.4 176.0 – 495.0 241.2 ± 40.5 132.9 ± 26.7 +17.8 (+7.9%)
neqo-neqo-cubic 19.4 ± 0.1 19.1 – 19.8 19.4 ± 0.1 1651.9 ± 11.8 💚 -0.3 (-1.3%)
neqo-neqo-cubic-nopacing 19.2 ± 0.2 18.8 – 19.8 19.2 ± 0.1 1663.5 ± 14.8 -0.2 (-0.8%)
neqo-neqo-newreno 19.7 ± 0.1 19.5 – 20.2 19.7 ± 0.1 1621.7 ± 11.2 💚 -0.3 (-1.6%)
neqo-neqo-newreno-nopacing 19.2 ± 0.2 18.8 – 20.1 19.2 ± 0.2 1667.5 ± 19.7 💚 -0.4 (-1.9%)
neqo-quiche-cubic 29.8 ± 0.3 29.1 – 30.8 29.8 ± 0.2 1073.8 ± 9.8 +0.1 (+0.4%)
neqo-s2n-cubic 38.3 ± 0.2 37.8 – 39.0 38.3 ± 0.2 835.0 ± 4.7 +0.0 (+0.1%)
quiche-neqo-cubic 31.2 ± 0.5 30.5 – 33.4 31.0 ± 0.3 1025.3 ± 16.2 💚 -0.4 (-1.4%)
quiche-quiche 36.2 ± 0.3 35.6 – 36.9 36.2 ± 0.2 884.8 ± 6.2
s2n-neqo-cubic 118.2 ± 0.5 116.9 – 119.5 118.2 ± 0.5 270.7 ± 1.1 +0.1 (+0.1%)
s2n-s2n ⚠️ 168.5 ± 28.4 137.4 – 258.6 161.3 ± 1.1 189.9 ± 32.0

Download data for profiler.firefox.com or download performance comparison data.

@github-actions

Copy link
Copy Markdown
Contributor

Benchmark results

No significant performance differences relative to 59f731f.

All results
transfer/1-conn/1-100mb-req (aka. Upload)/mtu-1500
       time:   [51.869 ms 51.914 ms 51.962 ms]
       thrpt:  [1.8794 GiB/s 1.8811 GiB/s 1.8827 GiB/s]
Found 5 outliers among 100 measurements (5.00%)
5 (5.00%) high mild
transfer/1-conn/1-100mb-resp (aka. Download)/mtu-1500
       time:   [50.920 ms 50.968 ms 51.018 ms]
       thrpt:  [1.9142 GiB/s 1.9160 GiB/s 1.9178 GiB/s]
Found 3 outliers among 100 measurements (3.00%)
3 (3.00%) high mild
transfer/1-conn/1-1b-resp (aka. HPS)/mtu-1500
       time:   [2.9298 ms 2.9313 ms 2.9327 ms]
       thrpt:  [340.98   B/s 341.14   B/s 341.32   B/s]
transfer/1-conn/10_000-parallel-1b-resp (aka. RPS)/mtu-1500
       time:   [66.135 ms 66.398 ms 66.664 ms]
       thrpt:  [150.01 Kelem/s 150.61 Kelem/s 151.21 Kelem/s]
Found 2 outliers among 100 measurements (2.00%)
2 (2.00%) high mild
streams-flow-controlled/walltime/1-streams/each-4194304-bytes
       time:   [10.416 ms 10.419 ms 10.421 ms]
       thrpt:  [383.83 MiB/s 383.93 MiB/s 384.02 MiB/s]
Found 4 outliers among 100 measurements (4.00%)
4 (4.00%) high mild
streams-flow-controlled/walltime/10-streams/each-1048576-bytes
       time:   [28.589 ms 28.599 ms 28.610 ms]
       thrpt:  [349.53 MiB/s 349.66 MiB/s 349.79 MiB/s]
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high mild
streams/walltime/1-streams/each-1000-bytes
       time:   [133.40 µs 133.95 µs 134.65 µs]
       thrpt:  [7.0826 MiB/s 7.1197 MiB/s 7.1491 MiB/s]
Found 2 outliers among 100 measurements (2.00%)
2 (2.00%) high mild
streams/walltime/1000-streams/each-1-bytes
       time:   [3.7772 ms 3.7887 ms 3.7997 ms]
       thrpt:  [257.01 KiB/s 257.76 KiB/s 258.54 KiB/s]
streams/walltime/1000-streams/each-1000-bytes
       time:   [12.214 ms 12.220 ms 12.226 ms]
       thrpt:  [78.004 MiB/s 78.041 MiB/s 78.079 MiB/s]
transfer/walltime/pacing-false/same-seed
       time:   [2.0293 ms 2.0305 ms 2.0318 ms]
       thrpt:  [1.9226 GiB/s 1.9238 GiB/s 1.9249 GiB/s]
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high mild
transfer/walltime/pacing-false/varying-seeds
       time:   [2.0336 ms 2.0347 ms 2.0360 ms]
       thrpt:  [1.9186 GiB/s 1.9198 GiB/s 1.9209 GiB/s]
transfer/walltime/pacing-true/same-seed
       time:   [2.0411 ms 2.0424 ms 2.0441 ms]
       thrpt:  [1.9110 GiB/s 1.9125 GiB/s 1.9138 GiB/s]
transfer/walltime/pacing-true/varying-seeds
       time:   [2.0062 ms 2.0074 ms 2.0088 ms]
       thrpt:  [1.9446 GiB/s 1.9459 GiB/s 1.9470 GiB/s]

Instructions per cycle

Criterion reported no significant timing changes.

All benchmarks
Benchmark IPC before IPC after ΔIPC
transfer/1-conn/1-100mb-req (aka. Upload)/mtu-1500 3.19 3.10 -2.7%
streams-flow-controlled/walltime/1-streams/each-4194304-bytes 2.97 3.04 +2.6%
transfer/1-conn/1-100mb-resp (aka. Download)/mtu-1500 3.21 3.17 -1.4%
streams-flow-controlled/walltime/10-streams/each-1048576-bytes 3.21 3.19 -0.6%
streams/walltime/1000-streams/each-1000-bytes 3.00 3.02 +0.5%
transfer/walltime/pacing-false/varying-seeds 2.88 2.87 -0.4%
transfer/walltime/pacing-true/varying-seeds 2.87 2.87 -0.3%
streams/walltime/1000-streams/each-1-bytes 3.30 3.30 +0.2%
streams/walltime/1-streams/each-1000-bytes 2.53 2.53 +0.2%
transfer/walltime/pacing-false/same-seed 2.87 2.87 +0.2%
transfer/1-conn/10_000-parallel-1b-resp (aka. RPS)/mtu-1500 3.20 3.19 -0.1%
transfer/1-conn/1-1b-resp (aka. HPS)/mtu-1500 2.24 2.24 +0.1%
transfer/walltime/pacing-true/same-seed 2.86 2.86 +0.1%
Profiles for profiler.firefox.com (64)

Download data for profiler.firefox.com or download performance comparison data.

@mxinden
mxinden added this pull request to the merge queue Oct 16, 2026
Merged via the queue into main with commit e680e05 Oct 16, 2026
304 of 312 checks passed
@mxinden
mxinden deleted the users/jesup/expire_datagrams branch October 16, 2026 14:23
mxinden-bot pushed a commit to mxinden-bot/neqo that referenced this pull request Oct 20, 2026
User-visible changes since v0.33.0:

- Expose the outgoingMaxBufferedDatagrams and outgoingMaxAge setters as production API:
  mozilla#3990
- Expose the outgoing WebTransport datagram queue capacity per session:
  mozilla#4037
- Expose the per-datagram overhead in the datagram queue capacity:
  mozilla#4067
- Report the fate of outgoing WebTransport datagrams via aggregate stats:
  mozilla#4091
- Count datagrams actually sent per session:
  mozilla#4030
- Count a session's expired outgoing WebTransport datagrams:
  mozilla#3986
- Return NotAvailable instead of TooMuchData when the peer has no datagram path:
  mozilla#3989
- Put ABE (RFC 8511) behind a pref:
  mozilla#4090
- Add a log-payload feature:
  mozilla#4046
- Remove the deprecated ConnectionError alias:
  mozilla#4089
- Answer every PATH_CHALLENGE received on a path:
  mozilla#4101
- Honor a peer's minimum ACK delay above 50ms:
  mozilla#4068
- Use version-specific key update labels:
  mozilla#4080
- Compute QPACK MaxEntries from the peer's capacity:
  mozilla#4033
- Stop connection ID generation when the generator is exhausted:
  mozilla#4082
- Pad to the PMTUD probe size only when sending a probe:
  mozilla#3964
- Ignore ACKs of stale PMTUD probes:
  mozilla#4088
mxinden-bot pushed a commit to mxinden-bot/neqo that referenced this pull request Oct 20, 2026
User-visible changes since v0.33.0:

- Expose the outgoingMaxBufferedDatagrams and outgoingMaxAge setters as production API: [mozilla#3990](mozilla#3990)
- Expose the outgoing WebTransport datagram queue capacity per session: [mozilla#4037](mozilla#4037)
- Expose the per-datagram overhead in the datagram queue capacity: [mozilla#4067](mozilla#4067)
- Report the fate of outgoing WebTransport datagrams via aggregate stats: [mozilla#4091](mozilla#4091)
- Count datagrams actually sent per session: [mozilla#4030](mozilla#4030)
- Count a session's expired outgoing WebTransport datagrams: [mozilla#3986](mozilla#3986)
- Return NotAvailable instead of TooMuchData when the peer has no datagram path: [mozilla#3989](mozilla#3989)
- Put ABE (RFC 8511) behind a pref: [mozilla#4090](mozilla#4090)
- Add a log-payload feature: [mozilla#4046](mozilla#4046)
- Remove the deprecated ConnectionError alias: [mozilla#4089](mozilla#4089)
- Answer every PATH_CHALLENGE received on a path: [mozilla#4101](mozilla#4101)
- Honor a peer's minimum ACK delay above 50ms: [mozilla#4068](mozilla#4068)
- Use version-specific key update labels: [mozilla#4080](mozilla#4080)
- Compute QPACK MaxEntries from the peer's capacity: [mozilla#4033](mozilla#4033)
- Stop connection ID generation when the generator is exhausted: [mozilla#4082](mozilla#4082)
- Pad to the PMTUD probe size only when sending a probe: [mozilla#3964](mozilla#3964)
- Ignore ACKs of stale PMTUD probes: [mozilla#4088](mozilla#4088)
@mxinden mxinden mentioned this pull request Oct 20, 2026
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.

4 participants