Skip to content

Conversation

@mxinden
Copy link
Member

@mxinden mxinden commented Nov 27, 2025

Add function datagram_send_queue_capacity to Connection and Http3Client. Before sending a WebTransport or MASQUE connect-udp datagram, users can check how many datagrams can still be queued for sending, thus avoiding datagrams being dropped due to a full send queue.

Enables #2852.

Add function `datagram_send_queue_capacity` to `Connection` and `Http3Client`.
Before sending a WebTransport or MASQUE connect-udp datagram, users can check
how many datagrams can still be queued for sending, thus avoiding datagrams
being dropped due to a full send queue.

Enables mozilla#2852.
@codecov
Copy link

codecov bot commented Nov 27, 2025

Codecov Report

❌ Patch coverage is 0% with 9 lines in your changes missing coverage. Please review.
✅ Project coverage is 93.44%. Comparing base (748266a) to head (951e565).
⚠️ Report is 1 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #3176      +/-   ##
==========================================
- Coverage   93.49%   93.44%   -0.06%     
==========================================
  Files         125      125              
  Lines       36640    36649       +9     
  Branches    36640    36649       +9     
==========================================
- Hits        34258    34246      -12     
- Misses       1537     1558      +21     
  Partials      845      845              
Components Coverage Δ
neqo-common 97.36% <ø> (ø)
neqo-crypto 83.25% <ø> (-0.48%) ⬇️
neqo-http3 93.28% <0.00%> (-0.03%) ⬇️
neqo-qpack 94.29% <ø> (ø)
neqo-transport 94.58% <0.00%> (-0.05%) ⬇️
neqo-udp 79.42% <ø> (ø)
mtu 85.44% <ø> (ø)

@codspeed-hq
Copy link

codspeed-hq bot commented Nov 27, 2025

CodSpeed Performance Report

Merging #3176 will degrade performances by 8.86%

Comparing mxinden:datagram-send-queue (951e565) with main (748266a)

Summary

⚡ 1 improvement
❌ 1 regression
✅ 21 untouched

⚠️ Please fix the performance issues or acknowledge them on CodSpeed.

Benchmarks breakdown

Mode Benchmark BASE HEAD Change
Simulation client 836.7 ms 773 ms +8.24%
Simulation client 781.6 ms 857.6 ms -8.86%

@github-actions
Copy link
Contributor

Failed Interop Tests

QUIC Interop Runner, client vs. server, differences relative to c2caaa2.

neqo-latest as clientneqo-latest as server
neqo-latest vs. aioquic: A ⚠️L1 C1
neqo-latest vs. go-x-net: A BP BA
neqo-latest vs. haproxy: A ⚠️L1 BP BA
neqo-latest vs. kwik: BP BA
neqo-latest vs. linuxquic: A 🚀L1 ⚠️C1
neqo-latest vs. lsquic: ⚠️L1 C1
neqo-latest vs. msquic: 🚀R Z A L1 C1
neqo-latest vs. mvfst: A L1 C1 ⚠️BA
neqo-latest vs. nginx: A 🚀C1 ⚠️L1 BP BA
neqo-latest vs. ngtcp2: A ⚠️L1 CM
neqo-latest vs. picoquic: 🚀Z A L1 C1
neqo-latest vs. quic-go: A 🚀L1
neqo-latest vs. quiche: A ⚠️C1 BP BA
neqo-latest vs. quinn: A 🚀C1
neqo-latest vs. s2n-quic: A 🚀L1 BP BA CM
neqo-latest vs. tquic: S A 🚀L1 BP BA
neqo-latest vs. xquic: A L1
aioquic vs. neqo-latest: CM
chrome vs. neqo-latest: 3
go-x-net vs. neqo-latest: CM
kwik vs. neqo-latest: BP BA CM
lsquic vs. neqo-latest: ⚠️L1
msquic vs. neqo-latest: 🚀BP ⚠️BA CM
mvfst vs. neqo-latest: M Z A L1 C1 CM
openssl vs. neqo-latest: LR M A CM
quic-go vs. neqo-latest: CM
quiche vs. neqo-latest: CM
quinn vs. neqo-latest: 🚀C1 V2 CM
s2n-quic vs. neqo-latest: CM
tquic vs. neqo-latest: CM
xquic vs. neqo-latest: M CM
All results

Succeeded Interop Tests

QUIC Interop Runner, client vs. server

neqo-latest as client

neqo-latest as server

Unsupported Interop Tests

QUIC Interop Runner, client vs. server

neqo-latest as client

neqo-latest as server

mxinden added a commit to mxinden/firefox that referenced this pull request Nov 27, 2025
@github-actions
Copy link
Contributor

Benchmark results

Performance differences relative to 5701207.

1-conn/1-100mb-resp/mtu-1504 (aka. Download)/client: No change in performance detected.
       time:   [203.72 ms 204.13 ms 204.55 ms]
       thrpt:  [488.88 MiB/s 489.88 MiB/s 490.86 MiB/s]
change:
       time:   [-0.1432% +0.1712% +0.4860%] (p = 0.29 > 0.05)
       thrpt:  [-0.4837% -0.1709% +0.1434%]
1-conn/10_000-parallel-1b-resp/mtu-1504 (aka. RPS)/client: Change within noise threshold.
       time:   [279.38 ms 281.20 ms 283.01 ms]
       thrpt:  [35.335 Kelem/s 35.561 Kelem/s 35.793 Kelem/s]
change:
       time:   [-1.9182% -1.0247% -0.1103%] (p = 0.03 < 0.05)
       thrpt:  [+0.1104% +1.0353% +1.9557%]
1-conn/1-1b-resp/mtu-1504 (aka. HPS)/client: No change in performance detected.
       time:   [38.759 ms 38.954 ms 39.168 ms]
       thrpt:  [25.531   B/s 25.672   B/s 25.800   B/s]
change:
       time:   [-0.4876% +0.1816% +0.8768%] (p = 0.59 > 0.05)
       thrpt:  [-0.8691% -0.1813% +0.4900%]

Found 12 outliers among 100 measurements (12.00%)
2 (2.00%) high mild
10 (10.00%) high severe

1-conn/1-100mb-req/mtu-1504 (aka. Upload)/client: Change within noise threshold.
       time:   [207.57 ms 207.84 ms 208.13 ms]
       thrpt:  [480.47 MiB/s 481.13 MiB/s 481.77 MiB/s]
change:
       time:   [-0.9175% -0.6785% -0.4641%] (p = 0.00 < 0.05)
       thrpt:  [+0.4662% +0.6831% +0.9260%]

Found 2 outliers among 100 measurements (2.00%)
2 (2.00%) high mild

decode 4096 bytes, mask ff: No change in performance detected.
       time:   [11.312 µs 11.343 µs 11.382 µs]
       change: [-0.7881% -0.0452% +0.6775%] (p = 0.91 > 0.05)

Found 17 outliers among 100 measurements (17.00%)
1 (1.00%) low severe
8 (8.00%) low mild
8 (8.00%) high severe

decode 1048576 bytes, mask ff: No change in performance detected.
       time:   [2.9935 ms 3.0071 ms 3.0246 ms]
       change: [-0.4697% +0.1439% +0.7876%] (p = 0.68 > 0.05)

Found 9 outliers among 100 measurements (9.00%)
9 (9.00%) high severe

decode 4096 bytes, mask 7f: No change in performance detected.
       time:   [19.575 µs 19.623 µs 19.680 µs]
       change: [-0.2214% +0.2868% +0.8801%] (p = 0.32 > 0.05)

Found 19 outliers among 100 measurements (19.00%)
1 (1.00%) low severe
1 (1.00%) high mild
17 (17.00%) high severe

decode 1048576 bytes, mask 7f: No change in performance detected.
       time:   [5.0315 ms 5.0565 ms 5.0954 ms]
       change: [-0.3650% +0.2315% +0.9861%] (p = 0.57 > 0.05)

Found 14 outliers among 100 measurements (14.00%)
14 (14.00%) high severe

decode 4096 bytes, mask 3f: No change in performance detected.
       time:   [6.2081 µs 6.2342 µs 6.2673 µs]
       change: [-0.3826% +0.3272% +1.1806%] (p = 0.45 > 0.05)

Found 9 outliers among 100 measurements (9.00%)
2 (2.00%) low mild
1 (1.00%) high mild
6 (6.00%) high severe

decode 1048576 bytes, mask 3f: No change in performance detected.
       time:   [1.7580 ms 1.7655 ms 1.7789 ms]
       change: [-0.8046% -0.1483% +0.6868%] (p = 0.75 > 0.05)

Found 6 outliers among 100 measurements (6.00%)
4 (4.00%) high mild
2 (2.00%) high severe

1-streams/each-1000-bytes/wallclock-time: Change within noise threshold.
       time:   [590.42 µs 594.07 µs 597.90 µs]
       change: [+0.7332% +1.4892% +2.2342%] (p = 0.00 < 0.05)
1-streams/each-1000-bytes/simulated-time: No change in performance detected.
       time:   [118.86 ms 119.08 ms 119.30 ms]
       thrpt:  [8.1861 KiB/s 8.2010 KiB/s 8.2161 KiB/s]
change:
       time:   [-0.3650% -0.0942% +0.1838%] (p = 0.51 > 0.05)
       thrpt:  [-0.1835% +0.0943% +0.3663%]

Found 2 outliers among 100 measurements (2.00%)
2 (2.00%) low mild

1000-streams/each-1-bytes/wallclock-time: No change in performance detected.
       time:   [12.448 ms 12.491 ms 12.534 ms]
       change: [-0.4661% +0.1375% +0.6946%] (p = 0.64 > 0.05)
1000-streams/each-1-bytes/simulated-time: No change in performance detected.
       time:   [2.3321 s 2.3352 s 2.3384 s]
       thrpt:  [427.65   B/s 428.22   B/s 428.80   B/s]
change:
       time:   [-0.0251% +0.1793% +0.3799%] (p = 0.09 > 0.05)
       thrpt:  [-0.3785% -0.1790% +0.0252%]

Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high mild

1000-streams/each-1000-bytes/wallclock-time: No change in performance detected.
       time:   [50.407 ms 50.530 ms 50.655 ms]
       change: [-0.7163% -0.3371% +0.0362%] (p = 0.09 > 0.05)

Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high mild
1000-streams/each-1000-bytes/simulated-time
time: [16.037 s 16.315 s 16.582 s]
thrpt: [58.892 KiB/s 59.856 KiB/s 60.894 KiB/s]
change:
time: [-2.2925% +0.0064% +2.3019%] (p = 0.99 > 0.05)
thrpt: [-2.2501% -0.0064% +2.3463%]
No change in performance detected.
Found 3 outliers among 100 measurements (3.00%)
3 (3.00%) low mild

coalesce_acked_from_zero 1+1 entries: No change in performance detected.
       time:   [89.041 ns 89.356 ns 89.667 ns]
       change: [-0.1196% +0.2946% +0.7654%] (p = 0.21 > 0.05)

Found 12 outliers among 100 measurements (12.00%)
9 (9.00%) high mild
3 (3.00%) high severe

coalesce_acked_from_zero 3+1 entries: No change in performance detected.
       time:   [105.71 ns 106.02 ns 106.34 ns]
       change: [-0.5660% -0.1483% +0.2886%] (p = 0.52 > 0.05)

Found 13 outliers among 100 measurements (13.00%)
3 (3.00%) high mild
10 (10.00%) high severe

coalesce_acked_from_zero 10+1 entries: No change in performance detected.
       time:   [105.19 ns 105.47 ns 105.83 ns]
       change: [-0.4739% -0.0641% +0.3373%] (p = 0.76 > 0.05)

Found 10 outliers among 100 measurements (10.00%)
4 (4.00%) low mild
1 (1.00%) high mild
5 (5.00%) high severe

coalesce_acked_from_zero 1000+1 entries: Change within noise threshold.
       time:   [91.732 ns 91.875 ns 92.029 ns]
       change: [+0.0010% +0.6122% +1.1261%] (p = 0.02 < 0.05)

Found 6 outliers among 100 measurements (6.00%)
4 (4.00%) high mild
2 (2.00%) high severe

RxStreamOrderer::inbound_frame(): Change within noise threshold.
       time:   [109.77 ms 109.96 ms 110.25 ms]
       change: [+0.5167% +0.7112% +0.9678%] (p = 0.00 < 0.05)

Found 4 outliers among 100 measurements (4.00%)
2 (2.00%) low mild
1 (1.00%) high mild
1 (1.00%) high severe

sent::Packets::take_ranges: No change in performance detected.
       time:   [4.4204 µs 4.5228 µs 4.6354 µs]
       change: [-5.9637% -2.0773% +1.4775%] (p = 0.31 > 0.05)

Found 2 outliers among 100 measurements (2.00%)
2 (2.00%) high mild

transfer/pacing-false/varying-seeds/wallclock-time/run: Change within noise threshold.
       time:   [25.608 ms 25.643 ms 25.681 ms]
       change: [+0.6654% +0.8679% +1.0776%] (p = 0.00 < 0.05)

Found 4 outliers among 100 measurements (4.00%)
4 (4.00%) high mild

transfer/pacing-false/varying-seeds/simulated-time/run: No change in performance detected.
       time:   [25.149 s 25.182 s 25.215 s]
       thrpt:  [162.45 KiB/s 162.66 KiB/s 162.87 KiB/s]
change:
       time:   [-0.1172% +0.0690% +0.2620%] (p = 0.48 > 0.05)
       thrpt:  [-0.2613% -0.0690% +0.1174%]

Found 3 outliers among 100 measurements (3.00%)
3 (3.00%) high mild

transfer/pacing-true/varying-seeds/wallclock-time/run: Change within noise threshold.
       time:   [26.344 ms 26.405 ms 26.469 ms]
       change: [+1.4931% +1.8165% +2.1392%] (p = 0.00 < 0.05)

Found 2 outliers among 100 measurements (2.00%)
2 (2.00%) high mild

transfer/pacing-true/varying-seeds/simulated-time/run: No change in performance detected.
       time:   [24.947 s 24.994 s 25.041 s]
       thrpt:  [163.57 KiB/s 163.88 KiB/s 164.19 KiB/s]
change:
       time:   [-0.1464% +0.0979% +0.3230%] (p = 0.43 > 0.05)
       thrpt:  [-0.3220% -0.0978% +0.1466%]

Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) low mild

transfer/pacing-false/same-seed/wallclock-time/run: Change within noise threshold.
       time:   [24.909 ms 24.941 ms 24.991 ms]
       change: [-0.5246% -0.3612% -0.1493%] (p = 0.00 < 0.05)

Found 3 outliers among 100 measurements (3.00%)
2 (2.00%) high mild
1 (1.00%) high severe

transfer/pacing-false/same-seed/simulated-time/run: No change in performance detected.
       time:   [25.234 s 25.234 s 25.234 s]
       thrpt:  [162.32 KiB/s 162.32 KiB/s 162.32 KiB/s]
change:
       time:   [+0.0000% +0.0000% +0.0000%] (p = NaN > 0.05)
       thrpt:  [+0.0000% +0.0000% +0.0000%]
transfer/pacing-true/same-seed/wallclock-time/run: Change within noise threshold.
       time:   [26.337 ms 26.370 ms 26.420 ms]
       change: [+0.8241% +0.9702% +1.1656%] (p = 0.00 < 0.05)

Found 5 outliers among 100 measurements (5.00%)
1 (1.00%) low mild
3 (3.00%) high mild
1 (1.00%) high severe

transfer/pacing-true/same-seed/simulated-time/run: No change in performance detected.
       time:   [25.069 s 25.069 s 25.069 s]
       thrpt:  [163.39 KiB/s 163.39 KiB/s 163.39 KiB/s]
change:
       time:   [+0.0000% +0.0000% +0.0000%] (p = NaN > 0.05)
       thrpt:  [+0.0000% +0.0000% +0.0000%]

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

@github-actions
Copy link
Contributor

Client/server transfer results

Performance differences relative to 126b1df.

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

Client vs. server (params) Mean ± σ Min Max MiB/s ± σ Δ main Δ main
google vs. google 479.6 ± 5.1 471.3 496.6 66.7 ± 6.3
google vs. neqo (cubic, paced) 277.0 ± 3.8 269.9 285.6 115.5 ± 8.4 💚 -1.6 -0.6%
msquic vs. msquic 198.4 ± 79.2 139.3 620.5 161.3 ± 0.4
msquic vs. neqo (cubic, paced) 221.6 ± 80.2 148.3 610.2 144.4 ± 0.4 -4.7 -2.1%
neqo vs. google (cubic, paced) 780.5 ± 5.5 772.0 794.4 41.0 ± 5.8 1.2 0.2%
neqo vs. msquic (cubic, paced) 157.2 ± 4.4 150.0 166.0 203.5 ± 7.3 -0.1 -0.1%
neqo vs. neqo (cubic) 97.9 ± 4.5 89.0 110.5 326.8 ± 7.1 0.6 0.6%
neqo vs. neqo (cubic, paced) 98.9 ± 4.6 88.8 107.2 323.7 ± 7.0 1.0 1.0%
neqo vs. neqo (reno) 97.1 ± 4.6 89.4 106.4 329.6 ± 7.0 💚 -1.5 -1.6%
neqo vs. neqo (reno, paced) 98.5 ± 4.5 91.4 107.4 325.0 ± 7.1 💚 -1.4 -1.4%
neqo vs. quiche (cubic, paced) 194.0 ± 4.6 186.7 204.2 165.0 ± 7.0 -0.2 -0.1%
neqo vs. s2n (cubic, paced) 221.0 ± 5.0 213.5 231.5 144.8 ± 6.4 💚 -1.4 -0.6%
quiche vs. neqo (cubic, paced) 153.0 ± 4.9 141.5 174.5 209.2 ± 6.5 1.2 0.8%
quiche vs. quiche 145.2 ± 4.7 136.6 157.7 220.4 ± 6.8
s2n vs. neqo (cubic, paced) 172.1 ± 4.7 162.0 184.9 186.0 ± 6.8 💚 -2.3 -1.3%
s2n vs. s2n 247.1 ± 22.0 230.8 344.9 129.5 ± 1.5

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

mxinden added a commit to mxinden/firefox that referenced this pull request Dec 5, 2025
mxinden added a commit to mxinden/firefox that referenced this pull request Dec 8, 2025
mxinden added a commit to mxinden/firefox that referenced this pull request Dec 8, 2025
mxinden added a commit to mxinden/firefox that referenced this pull request Dec 8, 2025
mxinden added a commit to mxinden/firefox that referenced this pull request Dec 10, 2025
mxinden added a commit to mxinden/firefox that referenced this pull request Dec 10, 2025
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