#![allow(private_interfaces)]
#![allow(private_bounds)]
use crate::socket::{_RX, _TX, RingError, Seek_, Socket};
impl Socket<_TX>
where
Socket<_TX>: Seek_<_TX>,
{
fn peek_(&mut self, index: usize, len: usize) -> Result<&mut [u8], RingError> {
#[cfg(not(feature = "no_safety_checks"))]
if index >= self.available as usize {
return Err(RingError::InvalidIndex);
}
#[cfg(not(feature = "no_safety_checks"))]
if len > self.x_ring.frame_size() as usize {
return Err(RingError::InvalidLength);
}
let x_head = self.producer.wrapping_add(index as u32) & self.x_ring.mod_mask;
self.x_ring.mut_desc_at(x_head).len = len as u32;
Ok(self.x_ring.mut_bytes_at(self.frames, x_head, len))
}
#[inline]
pub fn peek(&mut self, len: usize) -> Result<&mut [u8], RingError> {
self.peek_(0, len)
}
#[inline]
pub fn peek_at(&mut self, index: usize, len: usize) -> Result<&mut [u8], RingError> {
self.peek_(index, len)
}
pub fn seek_and_peek(&mut self, len: usize) -> Result<&mut [u8], RingError> {
self.seek_(1)?;
self.peek_(0, len)
}
}
impl Socket<_RX>
where
Socket<_RX>: Seek_<_RX>,
{
fn peek_(&mut self, index: usize) -> Result<&[u8], RingError> {
#[cfg(not(feature = "no_safety_checks"))]
if index >= self.available as usize {
return Err(RingError::InvalidIndex);
}
let x_head = self.consumer.wrapping_add(index as u32) & self.x_ring.mod_mask;
let len = self.x_ring.desc_at(x_head).len as usize;
Ok(self.x_ring.mut_bytes_at(self.frames, x_head, len))
}
#[inline]
pub fn peek(&mut self) -> Result<&[u8], RingError> {
self.peek_(0)
}
#[inline]
pub fn peek_at(&mut self, index: usize) -> Result<&[u8], RingError> {
self.peek_(index)
}
pub fn seek_and_peek(&mut self) -> Result<&[u8], RingError> {
self.seek_(1)?;
self.peek_(0)
}
}