use std::time::Duration;
pub(super) const FALLBACK_INTERLEAVE_EVERY: usize = 32;
pub(super) const FALLBACK_INTERLEAVE_BUDGET: usize = 64;
pub(super) const SIDE_QUEUE_INTERLEAVE_EVERY: usize = 64;
pub(super) const SIDE_QUEUE_INTERLEAVE_BUDGET: usize = 64;
pub(super) const CONTROL_QUERY_INTERLEAVE_BUDGET: usize = 4;
pub(super) const ENDPOINT_COMMAND_COALESCE_MAX_PACKETS: usize = 256;
pub(super) const NON_PACKET_DRAIN_BUDGET: usize = 64;
pub(super) const PACKET_DRAIN_BUDGET: usize = 512;
pub(super) const RX_LOOP_SLOW_MAINTENANCE_IDLE_TIMEOUT: Duration = Duration::from_millis(100);
pub(super) const RX_LOOP_SLOW_MAINTENANCE_BUSY_TIMEOUT: Duration = Duration::from_millis(10);
pub(super) const RX_LOOP_RECENT_DATA_ACTIVITY_WINDOW: Duration = Duration::from_secs(2);
const RX_LOOP_FAULT_MAX_DELAY_MS: u64 = 5_000;
pub(super) fn non_packet_drain_budget(packet_budget: usize) -> usize {
packet_budget.min(NON_PACKET_DRAIN_BUDGET)
}
pub(super) fn split_side_queue_budget(budget: usize) -> (usize, usize) {
if budget == 0 {
return (0, 0);
}
let endpoint_budget = (budget / 2).max(1);
let tun_budget = budget.saturating_sub(endpoint_budget).max(1);
(endpoint_budget, tun_budget)
}
pub(super) fn remaining_side_queue_budget(budget: usize, drained: usize) -> usize {
budget.saturating_sub(drained)
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub(super) struct FallbackDrainPlan {
pub(super) interleave_every: usize,
pub(super) interleave_budget: usize,
pub(super) trailing_budget: usize,
}
impl FallbackDrainPlan {
const fn normal() -> Self {
Self {
interleave_every: FALLBACK_INTERLEAVE_EVERY,
interleave_budget: FALLBACK_INTERLEAVE_BUDGET,
trailing_budget: NON_PACKET_DRAIN_BUDGET,
}
}
}
pub(super) fn fallback_drain_plan() -> FallbackDrainPlan {
FallbackDrainPlan::normal()
}
pub(super) fn authenticated_bulk_preempts_packet_rx(transport_priority_packets: usize) -> bool {
transport_priority_packets == 0
}
pub(super) fn rx_loop_slow_maintenance_fault_delay() -> Option<Duration> {
let raw = std::env::var("FIPS_FAULT_INJECT_RX_LOOP_SLOW_MAINTENANCE_MS").ok()?;
let ms = raw
.trim()
.parse::<u64>()
.ok()?
.min(RX_LOOP_FAULT_MAX_DELAY_MS);
(ms > 0).then(|| Duration::from_millis(ms))
}