use io_uring_owner::Owner;
use crate::slab::buffer::TakenImmutableBuffer;
#[derive(Clone, Debug)]
pub enum SendZcRec {
Fixed(SendZcFixedRec),
UnsafeRef(SendZcUnsafeRefRec),
}
#[derive(Clone, Debug)]
pub struct SendZcFixedRec {
fixed_fd: u32,
owner: Owner,
buf_taken: TakenImmutableBuffer,
to_addr: Option<DestTo>,
}
#[derive(Clone, Debug)]
pub struct SendZcUnsafeRefRec {
fixed_fd: u32,
owner: Owner,
buf_const_u8: *const u8,
buf_size: u32,
to_addr: Option<DestTo>,
}
impl SendZcRec {
#[inline]
pub(crate) fn with_fixed_buf(fixed_fd: u32, buf_taken: TakenImmutableBuffer) -> Self {
SendZcRec::Fixed(SendZcFixedRec {
fixed_fd,
owner: Owner::Created,
buf_taken,
to_addr: None, })
}
#[inline]
pub(crate) fn entry(&self) -> io_uring::squeue::Entry {
let (fixed_fd, buf_const_u8, buf_size, buf_index) = match self {
Self::Fixed(f_rec) => (
f_rec.fixed_fd,
f_rec.buf_taken.buf_const_u8,
2,
None,
),
Self::UnsafeRef(u_rec) => (u_rec.fixed_fd, u_rec.buf_const_u8, u_rec.buf_size, None),
};
io_uring::opcode::SendZc::new(io_uring::types::Fixed(fixed_fd), buf_const_u8, buf_size)
.buf_index(buf_index)
.build() }
#[inline]
pub(crate) fn owner(&self) -> Owner {
match self {
Self::Fixed(f) => f.owner.clone(),
Self::UnsafeRef(r) => r.owner.clone(),
}
}
#[inline]
pub(crate) fn force_owner_kernel(&mut self) -> bool {
match self {
Self::Fixed(f) => f.owner = Owner::Kernel,
Self::UnsafeRef(r) => r.owner = Owner::Kernel,
}
true
}
}
#[derive(Clone, Debug)]
pub enum DestTo {
V4(DestToV4),
V6(DestToV6),
}
#[derive(Clone, Debug)]
pub struct DestToV4 {
pub(crate) sockaddr: libc::sockaddr_in,
pub(crate) socklen_t: libc::socklen_t,
}
#[derive(Clone, Debug)]
pub struct DestToV6 {
pub(crate) sockaddr: libc::sockaddr_in6,
pub(crate) socklen_t: libc::socklen_t,
}