Repository navigation
fix: reset client transport state after 0-RTT rejection - #2770
namtran1812 wants to merge 3 commits into
Conversation
|
I compared this against a later downstream rollback pass and found three pieces of 0-RTT-derived send state that still survive this PR's rejection reset:
The first three fields can suppress/regenerate Our downstream rejection path clears those alongside stream/recovery/byte state: self.blocked_limit = None;
self.streams_blocked_bidi_state = None;
self.streams_blocked_uni_state = None;
self.dgram_send_queue.clear();I added a focused regression, This looks like a small addition to the existing reset block rather than a separate PR; the rest of #2770's transport/application rollback matches the same direction. |
Signed-off-by: namtran1812 <158846154+namtran1812@users.noreply.github.com>
|
Addressed in the latest commit. The rejection reset now clears blocked_limit, both StreamsBlockedState values, and queued DATAGRAMs using purge(|_| true), which also resets queue byte accounting while preserving capacity. |
Summary
When TLS rejects client 0-RTT, early stream state remains allocated and can prevent the application from replaying requests correctly.
Expose the TLS rejection signal, reset early stream and connection byte accounting, and discard Application recovery state while preserving packet numbers. Update the example client to recreate its HTTP session after rejection.
Related to #2676, #2687, and #2677.
Regression coverage
Both rejection regressions run under cubic and bbr2_gcongestion. The server rejects early data without receiving the early application packets.
Validation
At cd2fd69, on macOS ARM:
Review focus
Please review the transport rollback and recovery semantics and the application-facing rejection signal. The HTTP/3 regression covers session recreation over the transport; it does not directly exercise the example client's socket event loop.