use bytes::{BufMut, BytesMut};
use tokio_util::codec::{Decoder, Encoder};
#[derive(Debug, Default)]
pub struct TunPacketCodec(usize);
impl TunPacketCodec {
pub fn new(mtu: usize) -> TunPacketCodec {
TunPacketCodec(mtu)
}
}
impl Decoder for TunPacketCodec {
type Item = Vec<u8>;
type Error = std::io::Error;
fn decode(&mut self, buf: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
if buf.is_empty() {
return Ok(None);
}
let pkt = buf.split_to(buf.len());
buf.reserve(self.0);
Ok(Some(pkt.freeze().to_vec()))
}
}
impl Encoder<Vec<u8>> for TunPacketCodec {
type Error = std::io::Error;
fn encode(&mut self, item: Vec<u8>, dst: &mut BytesMut) -> Result<(), Self::Error> {
let bytes = item.as_slice();
dst.reserve(bytes.len());
dst.put(bytes);
Ok(())
}
}