Skip to content

Add Network::probe_address for non-disruptive reachability + identity probing#13

Closed
aschran wants to merge 8 commits into
bmwill:mainfrom
MystenLabs:aschran/probe-address
Closed

Add Network::probe_address for non-disruptive reachability + identity probing#13
aschran wants to merge 8 commits into
bmwill:mainfrom
MystenLabs:aschran/probe-address

Conversation

@aschran

@aschran aschran commented Jun 23, 2026

Copy link
Copy Markdown
Contributor

Why

A discovery-shared address prober (built in the sui repo) needs to check whether a peer's advertised address is actually reachable and presents the expected cryptographic identity — without joining the peer set or disturbing any existing production connection to that peer. anemo had the low-level dial primitive but no safe, non-disruptive way to use it as a probe.

What

Adds Network::probe_address(addr, expected_peer_id) -> ProbeOutcome: a short-lived QUIC+TLS connection that verifies reachability + identity, then closes. It bypasses the connection manager (and its peer-id dedup) entirely.

Probes are marked with a dedicated probe server-name (SNI), anemo-probe:

  • Every node now registers a probe certificate/server-name in its TLS cert resolver, so any node can be probed. The probe name is intentionally not added to the client-cert verifier — probing clients still authenticate with their real (primary) identity, so access-restricted peers accept them.
  • The server recognizes the probe SNI on the inbound connection and declines to admit it: it skips the application handshake and add_peer, so a probe never reaches simultaneous-dial tie-breaking and can never displace the peer's production connection. Prompt close is a secondary safety net.

Supporting changes: Connection::server_name() exposes the negotiated SNI (read from quinn's handshake data); client_config_for_probe is factored alongside the existing expected-identity client config.

Identity is enforced at the TLS layer, so a ProbeOutcome::Reachable result means both reachability and identity were confirmed; other outcomes distinguish unreachable / wrong-identity / bad-address / timeout.

Tests

New unit tests cover identity match, identity mismatch, unreachable address, and — most importantly — that probing a peer with an existing connection does not disrupt it (no LostPeer event, peer stays connected, RPC still works).

semenov-vladyslav and others added 8 commits March 18, 2025 14:19
Move route, add_rpc_service, and merge onto Router<ServicesOpen>;
route_layer transitions to Router<ServicesSealed>, on which only
further route_layer calls are available.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* anemo: allow separate max_frame_size for requests and responses

Adds `max_request_frame_size` and `max_response_frame_size` Config
options. Each falls back to `max_frame_size` when unset, preserving
existing behavior.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix rustdoc intra-doc link to public Config fields

Rename the private accessors (`max_request_frame_size`,
`max_response_frame_size`) to `request_frame_size` /
`response_frame_size` so the public field names referenced in the
`max_frame_size` doc comment resolve to the public fields rather than
the private methods.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* Add inbound connection admission control to the QUIC endpoint

* doc fix
@aschran aschran closed this Jun 23, 2026
@aschran aschran deleted the aschran/probe-address branch June 24, 2026 14:06
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.

2 participants