use crate::ring::XdpDesc;
use crate::socket::{_RX, _TX, RingError, Seek_, Socket};
impl Seek_<_TX> for Socket<_TX> {
fn seek_(&mut self, count: usize) -> Result<usize, RingError> {
if self.available as usize >= count {
return Ok(count);
}
let c_ring = &mut self.u_ring;
let c_producer = c_ring.producer();
if c_producer == self.consumer {
Err(RingError::RingFull)
} else {
loop {
let c_head = self.consumer & c_ring.mod_mask;
let addr = c_ring.desc_at(c_head);
let desc = XdpDesc::new(addr, 0, 0);
self.consumer = self.consumer.wrapping_add(1);
c_ring.update_consumer(self.consumer);
let x_head = self.producer & self.x_ring.mod_mask;
*self.x_ring.mut_desc_at(x_head) = desc;
self.available += 1;
if self.available as usize >= count || c_producer == self.consumer {
break;
}
}
Ok(self.available as usize)
}
}
}
impl Seek_<_RX> for Socket<_RX> {
fn seek_(&mut self, count: usize) -> Result<usize, RingError> {
if self.available as usize >= count {
return Ok(count);
}
let x_producer = self.x_ring.producer();
if x_producer == self.consumer {
Err(RingError::RingEmpty)
} else {
self.available = x_producer.wrapping_sub(self.consumer);
Ok(self.available.min(count as u32) as usize)
}
}
}