use crate::entropy_bank::EntropyBank;
use zeroize::ZeroizeOnDrop;
#[derive(Debug, Default, Clone, ZeroizeOnDrop)]
pub struct PacketVector {
pub group_id: u64,
pub wave_id: u32,
pub local_port: u16,
pub remote_port: u16,
pub true_sequence: usize,
}
use num_integer::Integer;
pub fn generate_packet_vector(
true_sequence: usize,
group_id: u64,
drill: &EntropyBank,
) -> PacketVector {
let port_range = &drill.get_multiport_width();
let (true_wave_id, relative_sequence) = true_sequence.div_mod_floor(port_range);
let (local_port, remote_port) = *drill.scramble_mappings.get(relative_sequence).unwrap();
PacketVector {
group_id,
wave_id: true_wave_id as u32,
local_port,
remote_port,
true_sequence,
}
}
#[inline]
pub fn generate_packet_coordinates_inv(
wave_id: u32,
src_port: u16,
local_port: u16,
scramble_drill: &EntropyBank,
) -> Option<usize> {
for (idx, (in_port, out_port)) in scramble_drill.scramble_mappings.iter().enumerate() {
if *in_port == src_port && *out_port == local_port {
let port_range = scramble_drill.scramble_mappings.len();
let true_position = (wave_id as usize * port_range) + idx;
return Some(true_position);
}
}
None
}