use crate::ffi::vmnet::vmpktdesc;
use std::ptr::null_mut;
pub struct Batch {
_iovecs: Vec<libc::iovec>,
pub(crate) pktdescs: Vec<vmpktdesc>,
}
impl Batch {
pub fn preallocate(count: usize) -> Batch {
let mut _iovecs = vec![
libc::iovec {
iov_base: null_mut(),
iov_len: 0,
};
count
];
let pktdescs = _iovecs
.iter_mut()
.map(|iovec| vmpktdesc {
vm_pkt_size: iovec.iov_len,
vm_pkt_iov: iovec,
vm_pkt_iovcnt: 1,
vm_flags: 0,
})
.collect();
Batch { _iovecs, pktdescs }
}
pub fn packet_sizes(&self) -> impl Iterator<Item = usize> + use<'_> {
self.pktdescs.iter().map(|pktdesc| pktdesc.vm_pkt_size)
}
pub fn packet_sized_bufs<'a, B>(
&self,
bufs: &'a [B],
) -> impl Iterator<Item = &'a [u8]> + use<'a, '_, B>
where
B: AsRef<[u8]>,
{
self.packet_sizes()
.zip(bufs)
.map(|(packet_size, buf)| &buf.as_ref()[..packet_size])
}
}