PQ Crypta Logo

No stream credit at first, then MAX_STREAMS mid-connection

Wait for the credit, then open the request. This port grants no bidirectional streams in its transport parameters and issues MAX_STREAMS a moment later. §4.6 is unambiguous that a client may not jump the gun — "Endpoints MUST NOT exceed the limit set by their peer" — and announcing the wait with STREAMS_BLOCKED is a SHOULD, so a client that waits quietly is equally conformant. Giving up rather than waiting is not scored as a failure: nothing obliges a one-shot client to sit on a connection it cannot use yet, and the report says which it did.

PQ CRYPTA PLATFORM

🏠 Main

📰 News

👤 Account

⟨ QUANTUM ERROR PORTAL ⟩

Navigate the Error Dimensions

Jump to an anomaly59

Every one of these is a page: what the server emits, the clause it is judged against, and how each client answered. The full list carries the verdict tallies too.

q-max-streams-credit · RFC 9000 §4.6 · discretionary · layer quic · udp/4510 · MUST NOT

Passing this means: The RFC permits either behaviour; the report says which was chosen.

Anomaly type: transport

How each client answered

ClientVersionVerdictWhat happened
curl libcurl/8.23.0 ngtcp2/1.25.0 Unsupported does not wait for stream credit. This port grants no bidirectional stream until 700ms in; the client closed the connection before then without opening one, so it never exceeded the limit -- which is all §4.6 requires -- and never made its request.
quinn noq fork (189b0ed) Pass Handled it: announced the block with 1 STREAMS_BLOCKED rather than opening a stream it had no credit for, which is what §4.6 recommends.
aioquic 1.3.0 (PyPI wheel) Pass Handled it: announced the block with 1 STREAMS_BLOCKED rather than opening a stream it had no credit for, which is what §4.6 recommends.
chromium build 1248 Pass Handled it: announced the block with 2 STREAMS_BLOCKED rather than opening a stream it had no credit for, which is what §4.6 recommends.
quic-go quic-go v0.61.0 (h1:9So2anK4Tp22) Pass Handled it: announced the block with 1 STREAMS_BLOCKED rather than opening a stream it had no credit for, which is what §4.6 recommends.
quiche 0.30.0 (1c8e976) Pass Tolerated it and continued. The specification permits this but does not require it; a client that rejected it would also be conformant.
neqo 0.31.1 (cac2b74) Pass Handled it: announced the block with 1 STREAMS_BLOCKED rather than opening a stream it had no credit for, which is what §4.6 recommends.
picoquic 8162550 Pass Handled it: announced the block with 1 STREAMS_BLOCKED rather than opening a stream it had no credit for, which is what §4.6 recommends.
ngtcp2 3c23148 Pass Tolerated it and continued. The specification permits this but does not require it; a client that rejected it would also be conformant.
lsquic 4.9.4 (2b30189) Pass Tolerated it and continued. The specification permits this but does not require it; a client that rejected it would also be conformant.
xquic 2060a44 Pass Rejected it (closed at the QUIC layer: received a frame for a stream identifier that exceeded advertised the stream limit for the corresponding stream type). The specification permits this but does not require it; a client that ignored it would also be conformant.
msquic 2.7.0 (7e6525d) Pass Handled it: announced the block with 1 STREAMS_BLOCKED rather than opening a stream it had no credit for, which is what §4.6 recommends.
quico 0.7.0 (npm) Pass Rejected it (closed at the QUIC layer: received a frame for a stream identifier that exceeded advertised the stream limit for the corresponding stream type). The specification permits this but does not require it; a client that ignored it would also be conformant.

What the clause requires

Wait for the credit, then open the request. This port grants no bidirectional streams in its transport parameters and issues MAX_STREAMS a moment later. §4.6 is unambiguous that a client may not jump the gun — "Endpoints MUST NOT exceed the limit set by their peer" — and announcing the wait with STREAMS_BLOCKED is a SHOULD, so a client that waits quietly is equally conformant. Giving up rather than waiting is not scored as a failure: nothing obliges a one-shot client to sit on a connection it cannot use yet, and the report says which it did.

Judged against RFC 9000.

Run this one yourself

Every test is reachable from your own client. Nothing here needs an account.

curl -s https://conformance.pqcrypta.com/catalog.json \
  | jq '.tests[] | select(.id == "q-max-streams-credit")'