sosistab/fec/
mod.rs

1mod decoder;
2mod encoder;
3mod wrapped;
4pub use decoder::*;
5pub use encoder::*;
6
7use crate::buffer::{Buff, BuffMut};
8
9pub fn pre_encode(pkt: &[u8], len: usize) -> BuffMut {
10    assert!(pkt.len() <= 65535);
11    assert!(pkt.len() + 2 <= len);
12    // tracing::trace!("pre-encoding pkt with len {} => {}", pkt.len(), len);
13    let hdr = (pkt.len() as u16).to_le_bytes();
14    let mut bts = BuffMut::new();
15    bts.extend_from_slice(&hdr);
16    bts.extend_from_slice(pkt);
17    bts.extend_from_slice(&vec![0u8; len - pkt.len() - 2]);
18    bts
19}
20
21fn post_decode(raw: Buff) -> Option<Buff> {
22    if raw.len() < 2 {
23        return None;
24    }
25    let body_len = u16::from_le_bytes([raw[0], raw[1]]) as usize;
26    if raw.len() < 2 + body_len {
27        return None;
28    }
29    Some(raw.slice(2..2 + body_len))
30}