From 1bf0bf382c5bb6e266e211c8338edebdc0295942 Mon Sep 17 00:00:00 2001 From: JackDoan Date: Wed, 14 Oct 2026 13:21:14 -0500 Subject: [PATCH] Send hybrid msg3 without a repair delay, so the packets cached behind it do not reach the responder before it completes --- handshake_manager_hybrid.go | 7 ++++++- handshake_manager_pq.go | 6 +++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/handshake_manager_hybrid.go b/handshake_manager_hybrid.go index 8ffed3f9..b75139d7 100644 --- a/handshake_manager_hybrid.go +++ b/handshake_manager_hybrid.go @@ -342,7 +342,12 @@ func (hm *HandshakeManager) sendHybridMsg3(c *hybridConfirm) { return } hm.messageMetrics.Tx(header.Handshake, hybridSubtype, int64(len(pkts)+len(later))) - if err := hm.sendFragmented(pkts, later, c.send); err != nil { + // No repair delay: the packets cached during the handshake go out right + // behind msg3, and the responder drops whatever arrives before msg3 + // completes. With the repair trailing, losing either data fragment would + // cost them. msg3 is four packets, too short for the tail drop the delay + // guards against. + if err := hm.sendFragmentedAfter(pkts, later, c.send, 0); err != nil { c.hostinfo.logger(hm.l).Debug("Failed to send handshake message", "error", err) } } diff --git a/handshake_manager_pq.go b/handshake_manager_pq.go index ede6b93c..559c9e6c 100644 --- a/handshake_manager_pq.go +++ b/handshake_manager_pq.go @@ -434,6 +434,11 @@ func (hm *HandshakeManager) continuePQ(via ViaSender, hh *HandshakeHostInfo, h * // repair delay. It returns the first error from the immediate sends; errors from // delayed sends are only logged. func (hm *HandshakeManager) sendFragmented(now, later [][]byte, send func([]byte) error) error { + return hm.sendFragmentedAfter(now, later, send, hm.pqConfig().repairDelay) +} + +// sendFragmentedAfter is sendFragmented with the given repair delay. +func (hm *HandshakeManager) sendFragmentedAfter(now, later [][]byte, send func([]byte) error, delay time.Duration) error { var first error for _, p := range now { if err := send(p); err != nil && first == nil { @@ -447,7 +452,6 @@ func (hm *HandshakeManager) sendFragmented(now, later [][]byte, send func([]byte } } } - delay := hm.pqConfig().repairDelay switch { case len(later) == 0: case delay <= 0: