use crate::varint::{self, decode_varint};
pub const LOCAL_MAX_DATAGRAM: usize = 1200;
pub fn flow_prefix(flow: u64) -> ([u8; varint::MAX_ENCODED_LEN], usize) {
let mut out = [0u8; varint::MAX_ENCODED_LEN];
let len = varint::write_varint(flow, &mut out).expect("flow ids stay below 2^62");
(out, len)
}
pub fn split_flow_datagram(input: &[u8]) -> Option<(u64, usize)> {
decode_varint(input).ok()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn a_prefix_splits_back_to_its_flow_and_offset() {
for flow in [0u64, 7, 63, 64, 16_383, 16_384, 1 << 40] {
let (prefix, len) = flow_prefix(flow);
let mut datagram = prefix[..len].to_vec();
datagram.extend_from_slice(b"payload");
assert_eq!(split_flow_datagram(&datagram), Some((flow, len)));
assert_eq!(&datagram[len..], b"payload");
}
}
#[test]
fn a_truncated_prefix_is_none() {
assert_eq!(split_flow_datagram(&[]), None);
assert_eq!(split_flow_datagram(&[0x40]), None);
assert_eq!(split_flow_datagram(&[0x80, 0, 0]), None);
}
}