summaryrefslogtreecommitdiffstats
path: root/src/transport/mod.rs
diff options
context:
space:
mode:
authortv <tv@krebsco.de>2026-10-24 03:19:28 +0200
committertv <tv@krebsco.de>2026-10-24 03:19:28 +0200
commita1460b0a2861d5bb34ba25d409b234468f269e4e (patch)
treefb447e712aa587b4136c12f4b918cd9c6cf160f0 /src/transport/mod.rs
parent84a307a09eb3ba95920b028a49d0ec57bf316cdc (diff)
use nonce in handshake
To prevent stale hello replies to cause joins and thus stale sessions, each run gets a random ID, which used as nonce in the handshake.
Diffstat (limited to 'src/transport/mod.rs')
-rw-r--r--src/transport/mod.rs8
1 files changed, 8 insertions, 0 deletions
diff --git a/src/transport/mod.rs b/src/transport/mod.rs
index 83c4e8d..e8d654d 100644
--- a/src/transport/mod.rs
+++ b/src/transport/mod.rs
@@ -12,6 +12,9 @@ pub use crate::document::replica::Epoch;
pub mod firewall;
pub mod mycelium;
+/// Random identifier of one run of a node (from start to exit).
+pub type RunId = [u8; 16];
+
/// Most heads listed in a keepalive; more are sent as a digest. A head takes 34 bytes on
/// the wire, so 32 of them keep a keepalive within one Mycelium chunk (1300 bytes; see
/// the size test in `mycelium`). There are rarely more heads than nodes that wrote
@@ -120,6 +123,8 @@ pub struct HelloRequest {
pub auth: Vec<u8>,
/// The sender is ready (same meaning as `SyncEnvelope::ready`).
pub ready: bool,
+ /// Random per run of the sender; the reply echoes it.
+ pub run_id: RunId,
}
#[derive(Debug, Clone)]
@@ -131,6 +136,9 @@ pub struct HelloReply {
pub auth: Vec<u8>,
/// The sender is ready.
pub ready: bool,
+ /// The `run_id` of the HELLO answered. A reply to a HELLO from an earlier run of the
+ /// recipient (delivered late, or queued while it was down) is ignored.
+ pub run_id: RunId,
}
#[derive(Debug, Clone)]