pub trait ReliabilityMode: Send + Sync {
// Required methods
fn on_send(&mut self, descriptor: Arc<RetransmitDescriptor>);
fn on_receive(&mut self, seq: u64) -> bool;
fn needs_ack(&self) -> bool;
fn build_nack(&self) -> Option<NackPayload>;
fn on_nack(&mut self, nack: &NackPayload) -> Vec<Arc<RetransmitDescriptor>>;
fn get_timed_out(&mut self) -> Vec<Arc<RetransmitDescriptor>>;
fn has_pending(&self) -> bool;
fn name(&self) -> &'static str;
// Provided methods
fn take_failed(&mut self) -> bool { ... }
fn rx_ack_seq(&self) -> u64 { ... }
fn on_ack(&mut self, _ack_seq: u64) { ... }
fn can_send(&self) -> bool { ... }
}Expand description
Trait for reliability mode implementations.
Per crypto-session perf #133, the descriptor is exchanged as
Arc<RetransmitDescriptor> across the trait boundary. The
RetransmitDescriptor itself carries an inner
Vec<Bytes> of pre-encryption event payloads — at max_pending = 32 and ~10 events per packet that’s ~320 Bytes refcounts
dangling off the retransmit window at any given time. Pre-fix
on_send moved the descriptor in by value (one Vec spine + one
refcount bump per inner Bytes), and on_nack /
get_timed_out deep-cloned the descriptor per retransmit (one
Vec alloc + N Bytes refcount bumps per emission). Wrapping in
Arc makes both paths one atomic refcount bump regardless of
the inner Vec’s length.
Required Methods§
Sourcefn on_send(&mut self, descriptor: Arc<RetransmitDescriptor>)
fn on_send(&mut self, descriptor: Arc<RetransmitDescriptor>)
Called when a packet is sent. The descriptor carries pre- encryption inputs so the retransmit path can rebuild a fresh-counter packet rather than replaying stale ciphertext.
Sourcefn on_receive(&mut self, seq: u64) -> bool
fn on_receive(&mut self, seq: u64) -> bool
Called when a packet is received. Returns true if accepted.
Sourcefn build_nack(&self) -> Option<NackPayload>
fn build_nack(&self) -> Option<NackPayload>
Build a NACK payload if there are missing sequences
Sourcefn on_nack(&mut self, nack: &NackPayload) -> Vec<Arc<RetransmitDescriptor>>
fn on_nack(&mut self, nack: &NackPayload) -> Vec<Arc<RetransmitDescriptor>>
Process a received NACK and return descriptors for the
caller to rebuild + dispatch. The returned Arc clones
share the inner RetransmitDescriptor allocation; the
caller bumps the refcount instead of deep-cloning the
Vec<Bytes> of events.
Sourcefn get_timed_out(&mut self) -> Vec<Arc<RetransmitDescriptor>>
fn get_timed_out(&mut self) -> Vec<Arc<RetransmitDescriptor>>
Get descriptors that need retransmission due to timeout. See
Self::on_nack for the Arc-sharing contract.
Sourcefn has_pending(&self) -> bool
fn has_pending(&self) -> bool
Check if there are unacknowledged packets
Provided Methods§
Sourcefn take_failed(&mut self) -> bool
fn take_failed(&mut self) -> bool
Take-and-clear the “stream has given up” flag (H-3): true once
after a packet exhausts max_retries while still unacked — the
reliable layer can no longer recover that gap, so the caller
should signal a stream reset to the peer rather than let it stall
to a higher-level timeout. Default false (fire-and-forget never
gives up — it tracks nothing).
Sourcefn rx_ack_seq(&self) -> u64
fn rx_ack_seq(&self) -> u64
The receiver’s cumulative ack — the lowest sequence not yet
contiguously received (next_expected). The peer piggybacks this
on its window grants so the sender can prune (H-9). Default 0
(fire-and-forget tracks no sequence).
Sourcefn on_ack(&mut self, _ack_seq: u64)
fn on_ack(&mut self, _ack_seq: u64)
Sender-side: a cumulative ack arrived — every sequence below
ack_seq has been received, so drop them from the retransmit
window (H-9). Without this, packets linger in pending on the
happy path until they spuriously time out and get resent (and,
post-H-3, spuriously give up). Default no-op.
Sourcefn can_send(&self) -> bool
fn can_send(&self) -> bool
Whether the sender may put another packet in flight under its
congestion window (H-6). Default true (fire-and-forget has no
congestion state). A reliable stream returns false once
in-flight reaches its cwnd, so the send path back-pressures and
paces to the cwnd under loss.
Dyn Compatibility§
This trait is dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety".