mod input;
mod output;
pub use input::{
CorruptData, DataInputStats, InputConfig, OutgoingContextual, ReliableDataInputChannel,
};
pub use output::{DataOutputStats, OutgoingReliable, OutputConfig, ReliableDataOutputChannel};
pub(crate) fn true_incoming_sequence(
packet_sequence: u16,
current_sequence: i64,
max_queued_reliable_data_packets: i64,
) -> i64 {
let mut sequence = packet_sequence as i64 | (current_sequence & (i64::MAX ^ 0xFFFF));
if sequence > current_sequence + max_queued_reliable_data_packets {
sequence -= 0x1_0000;
}
if sequence < current_sequence - max_queued_reliable_data_packets {
sequence += 0x1_0000;
}
sequence
}
#[cfg(test)]
mod sequence_tests {
use super::true_incoming_sequence;
#[test]
fn in_window_is_identity() {
assert_eq!(true_incoming_sequence(5, 5, 256), 5);
assert_eq!(true_incoming_sequence(300, 256, 256), 300);
}
#[test]
fn wraps_forward_past_u16_boundary() {
let current = 0x1_0000 - 1; assert_eq!(true_incoming_sequence(0, current, 256), 0x1_0000);
}
#[test]
fn wraps_backward() {
let current = 0x1_0000 + 10;
assert_eq!(true_incoming_sequence(0xFFFF, current, 256), 0xFFFF);
}
}