1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
use core::ops::{Deref, DerefMut}; use aligned::{Aligned, A8}; use crate::MTU; pub trait RingDescriptor { fn setup(&mut self, buffer: *const u8, len: usize, next: Option<&Self>); } pub struct RingEntry<T: Clone + RingDescriptor> { desc: Aligned<A8, [T; 1]>, buffer: Aligned<A8, [u8; MTU]>, } impl<T: Clone + RingDescriptor> Clone for RingEntry<T> { fn clone(&self) -> Self { RingEntry { desc: Aligned((*self.desc).clone()), buffer: Aligned((*self.buffer).clone()), } } } impl<T: Clone + RingDescriptor + Default> Default for RingEntry<T> { fn default() -> Self { Self::new() } } impl<T: Clone + RingDescriptor + Default> RingEntry<T> { pub fn new() -> Self { RingEntry { desc: Aligned([T::default()]), buffer: Aligned([0; MTU]), } } pub(crate) fn setup(&mut self, next: Option<&Self>) { let buffer = self.buffer.as_ptr(); let len = self.buffer.len(); self.desc_mut().setup( buffer, len, next.map(|next| next.desc()) ); } #[inline] pub(crate) fn desc(&self) -> &T { &self.desc.deref()[0] } #[inline] pub(crate) fn desc_mut(&mut self) -> &mut T { &mut self.desc.deref_mut()[0] } #[inline] pub(crate) fn as_slice(&self) -> &[u8] { &(*self.buffer)[..] } #[inline] pub(crate) fn as_mut_slice(&mut self) -> &mut [u8] { &mut (*self.buffer)[..] } }