fix(quic-interop): bump HANDSHAKE_TIMEOUT_SEC 10s → 30s for amplificationlimit

The amplificationlimit testcase scenario drops client→server packets
2–7. Recovering past 6 consecutive drops via RFC 9000 PTO doublings
(0.3+0.6+1.2+2.4+4.8+9.6 ≈ 19s) is more than the previous 10s
budget allowed — we declared handshake_failed mid-recovery. Bumping
to 30s matches the multiconnect handshake budget and gives clean
PTO headroom.

Fixes: amplificationlimit ✕→✓ vs picoquic. No regression vs quinn
(was already passing at ~14s). Normal handshakes complete in <1s
so the bump is invisible outside lossy paths.

Still fails: amplificationlimit vs quic-go and msquic. Their
server-side handshake-progress watchdog gives up at ~10s of silence
regardless of our budget. The proper fix is RFC 9002 §6.2.4 — send
2 ack-eliciting packets per PTO probe instead of 1, halving the
recovery time for consecutive drops. That's a writer-side change,
deferred.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Vitor Pamplona
2026-05-08 14:30:32 -04:00
parent 17a040d7ce
commit 7ac70498ac
@@ -62,7 +62,16 @@ private const val UNSET_LABEL = "(unset)"
// IANA ALPN identifier for HTTP/0.9-over-QUIC used by quic-interop-runner.
private const val ALPN_HQ_INTEROP = "hq-interop"
private const val HANDSHAKE_TIMEOUT_SEC = 10L
// Bumped 10 → 30 to survive the `amplificationlimit` testcase. The
// runner drops client→server packets 27 (six in a row), so we have
// to PTO our way past six exponentially-spaced retransmits before
// the eighth packet finally gets through (≈19s of doublings:
// 0.3+0.6+1.2+2.4+4.8+9.6). At the old 10s budget we declared
// handshake_failed mid-recovery and the test failed against
// quic-go/picoquic/msquic. 30s matches the multiconnect budget for
// the same RFC 9002 PTO reasoning. Normal-case handshakes still
// complete in well under a second; this only affects the floor.
private const val HANDSHAKE_TIMEOUT_SEC = 30L
// Multiconnect's per-iteration handshake timeout. The runner's
// handshakeloss / handshakecorruption tests run 50 sequential