use core::time::Duration;
use rand_core::Rng;
use crate::Instant;
pub(crate) mod rfc {
use super::Duration;
#[allow(dead_code)]
pub const INITIAL_PROBE_WAIT_MAX_MS: u32 = 250;
#[allow(dead_code)]
pub const PROBE_INTERVAL: Duration = Duration::from_millis(250);
#[allow(dead_code)]
pub const FIRST_ANNOUNCE_DELAY: Duration = Duration::from_secs(0);
#[allow(dead_code)]
pub const ANNOUNCE_INTERVAL: Duration = Duration::from_secs(1);
}
#[allow(clippy::arithmetic_side_effects, dead_code)]
pub(crate) fn probe_deadline<I: Instant, R: Rng>(
now: I,
probe_count: u8,
rng: &mut R,
) -> Option<I> {
let wait = if probe_count == 0 {
let ms = rng.next_u32() % (rfc::INITIAL_PROBE_WAIT_MAX_MS.saturating_add(1));
Duration::from_millis(ms as u64)
} else {
rfc::PROBE_INTERVAL
};
now.checked_add_duration(wait)
}
#[allow(dead_code)]
pub(crate) fn announce_deadline<I: Instant>(now: I, announce_count: u8) -> Option<I> {
let wait = if announce_count == 0 {
rfc::FIRST_ANNOUNCE_DELAY
} else {
rfc::ANNOUNCE_INTERVAL
};
now.checked_add_duration(wait)
}
#[allow(clippy::integer_division, dead_code)]
pub(crate) fn re_announce_deadline<I: Instant>(now: I, ttl_secs: u32) -> Option<I> {
let secs = (ttl_secs as u64).saturating_mul(80) / 100;
now.checked_add_duration(Duration::from_secs(secs))
}