aboutsummaryrefslogtreecommitdiffstats
path: root/src/transport/wire.rs
diff options
context:
space:
mode:
authortv <tv@krebsco.de>2026-11-06 14:29:42 +0100
committertv <tv@krebsco.de>2026-11-06 14:29:42 +0100
commitd6f6c7aad904e650e6c7371dbd4776f6f0be2388 (patch)
treec4cf94b5099e3ea31faddc7356459337127eb3f3 /src/transport/wire.rs
parent43305f5a0e2a87c68405989600b33e33c1ab70df (diff)
indirect probes
Diffstat (limited to 'src/transport/wire.rs')
-rw-r--r--src/transport/wire.rs25
1 files changed, 23 insertions, 2 deletions
diff --git a/src/transport/wire.rs b/src/transport/wire.rs
index ef692b3..bf46fc9 100644
--- a/src/transport/wire.rs
+++ b/src/transport/wire.rs
@@ -14,7 +14,7 @@ use super::{EncodedMessage, MessageKind, ParsedMessage};
/// The wire format's version, the first byte of every payload. Bump it with every change
/// to a message type or a codec (`golden_bytes` fails then).
-pub(crate) const VERSION: u8 = 35;
+pub(crate) const VERSION: u8 = 36;
/// What the second byte of a payload says.
fn tag(kind: MessageKind) -> u8 {
@@ -31,6 +31,8 @@ fn tag(kind: MessageKind) -> u8 {
MessageKind::Pong => 9,
MessageKind::Links => 10,
MessageKind::LinksReply => 11,
+ MessageKind::Probe => 12,
+ MessageKind::ProbeReply => 13,
}
}
@@ -85,6 +87,8 @@ pub(crate) fn encode(message: &ParsedMessage) -> Result<Vec<u8>, WireError> {
ParsedMessage::Pong { nonce, at } => rmp_serde::encode::write(&mut payload, &(nonce, at))?,
ParsedMessage::Links(request) => rmp_serde::encode::write(&mut payload, request)?,
ParsedMessage::LinksReply(reply) => rmp_serde::encode::write(&mut payload, reply)?,
+ ParsedMessage::Probe(request) => rmp_serde::encode::write(&mut payload, request)?,
+ ParsedMessage::ProbeReply(reply) => rmp_serde::encode::write(&mut payload, reply)?,
}
Ok(payload)
}
@@ -154,6 +158,10 @@ pub(crate) fn decode(payload: &[u8]) -> Result<ParsedMessage, WireError> {
ParsedMessage::Links(rmp_serde::from_slice(body)?)
} else if is(MessageKind::LinksReply) {
ParsedMessage::LinksReply(rmp_serde::from_slice(body)?)
+ } else if is(MessageKind::Probe) {
+ ParsedMessage::Probe(rmp_serde::from_slice(body)?)
+ } else if is(MessageKind::ProbeReply) {
+ ParsedMessage::ProbeReply(rmp_serde::from_slice(body)?)
} else {
return Err(WireError::UnknownKind(kind));
})
@@ -511,6 +519,19 @@ pub(crate) fn samples() -> Vec<ParsedMessage> {
links: Vec::new(),
}],
}),
+ ParsedMessage::Probe(crate::transport::ProbeRequest {
+ epoch,
+ epoch_seq: 1,
+ nonce: 4,
+ member: "q".into(),
+ }),
+ ParsedMessage::ProbeReply(crate::transport::ProbeReply {
+ epoch,
+ epoch_seq: 1,
+ nonce: 4,
+ member: "q".into(),
+ reached: None,
+ }),
]
}
@@ -542,7 +563,7 @@ mod tests {
#[test]
fn every_kind_round_trips() {
let samples = samples();
- assert_eq!(samples.len(), 12, "a kind is missing from `samples`");
+ assert_eq!(samples.len(), 14, "a kind is missing from `samples`");
for message in samples {
let bytes = encode(&message).unwrap();
let decoded = decode(&bytes).unwrap();