use crate::{core::view::View, header::view::ScionHeaderView};
const MIN_SHAPEABLE_LEN: usize = 36;
const MAX_SYNTH_HEADER_LEN: usize = 1000;
const NEXT_HEADER_UDP: u8 = 17;
const NEXT_HEADER_SCMP: u8 = 202;
pub fn bias_to_packet_shape(data: &mut [u8]) {
if data.len() < MIN_SHAPEABLE_LEN {
return;
}
let len = data.len();
let rand_byte = len % data[5].max(1) as usize;
let view = unsafe { ScionHeaderView::from_mut_slice_unchecked(data) };
view.set_version(0);
if rand_byte.is_multiple_of(3) {
let header_len = ((len.min(MAX_SYNTH_HEADER_LEN) / 4) * 4) as u16;
unsafe {
view.set_header_len(header_len);
}
}
if rand_byte.is_multiple_of(5) {
let header_len = view.header_len() as usize;
let remaining = len.saturating_sub(header_len);
unsafe {
view.set_payload_len(remaining.min(u16::MAX as usize) as u16);
}
}
if rand_byte.is_multiple_of(7) {
let proto = if rand_byte.is_multiple_of(2) {
NEXT_HEADER_UDP
} else {
NEXT_HEADER_SCMP
};
view.set_next_header(proto.into());
}
}