use crate::ibverbs::memory::{GatherElement, RemoteMemoryRegion, ScatterElement};
#[derive(Debug, Clone)]
pub struct SendWorkRequest<'wr, 'data> {
pub(crate) gather_elements: &'wr [GatherElement<'data>],
pub(crate) imm_data: Option<u32>,
}
#[derive(Debug)]
pub struct ReceiveWorkRequest<'wr, 'data> {
pub(crate) scatter_elements: &'wr mut [ScatterElement<'data>],
}
#[derive(Debug, Clone)]
pub struct WriteWorkRequest<'wr, 'data> {
pub(crate) gather_elements: &'wr [GatherElement<'data>],
pub(crate) remote_mr: RemoteMemoryRegion,
pub(crate) imm_data: Option<u32>,
}
#[derive(Debug)]
pub struct ReadWorkRequest<'wr, 'data> {
pub(crate) scatter_elements: &'wr mut [ScatterElement<'data>],
pub(crate) remote_mr: RemoteMemoryRegion,
}
impl<'wr, 'data> SendWorkRequest<'wr, 'data> {
pub fn new(gather_elements: &'wr [GatherElement<'data>]) -> Self {
assert!(
i32::try_from(gather_elements.len()).is_ok(),
"SGE list length {} exceeds i32::MAX",
gather_elements.len()
);
Self {
gather_elements,
imm_data: None,
}
}
pub fn with_immediate(mut self, imm_data: u32) -> Self {
self.imm_data = Some(imm_data);
self
}
pub fn only_immediate(imm_data: u32) -> Self {
Self {
gather_elements: &[],
imm_data: Some(imm_data),
}
}
}
impl<'wr, 'data> ReceiveWorkRequest<'wr, 'data> {
pub fn new(scatter_elements: &'wr mut [ScatterElement<'data>]) -> Self {
assert!(
i32::try_from(scatter_elements.len()).is_ok(),
"SGE list length {} exceeds i32::MAX",
scatter_elements.len()
);
Self { scatter_elements }
}
pub fn only_immediate() -> Self {
Self {
scatter_elements: &mut [],
}
}
}
impl<'wr, 'data> WriteWorkRequest<'wr, 'data> {
pub fn new(
gather_elements: &'wr [GatherElement<'data>],
remote_slice: RemoteMemoryRegion,
) -> Self {
assert!(
i32::try_from(gather_elements.len()).is_ok(),
"SGE list length {} exceeds i32::MAX",
gather_elements.len()
);
Self {
gather_elements,
remote_mr: remote_slice,
imm_data: None,
}
}
pub fn with_immediate(mut self, imm_data: u32) -> Self {
self.imm_data = Some(imm_data);
self
}
}
impl<'wr, 'data> ReadWorkRequest<'wr, 'data> {
pub fn new(
scatter_elements: &'wr mut [ScatterElement<'data>],
remote_mr: RemoteMemoryRegion,
) -> Self {
assert!(
i32::try_from(scatter_elements.len()).is_ok(),
"SGE list length {} exceeds i32::MAX",
scatter_elements.len()
);
Self {
scatter_elements,
remote_mr,
}
}
}