ibverbs_rs/multi_channel/
work_request.rs1use crate::ibverbs::memory::{GatherElement, ScatterElement};
2use crate::ibverbs::work::*;
3use crate::multi_channel::remote_memory_region::PeerRemoteMemoryRegion;
4
5#[derive(Debug, Clone)]
7pub struct PeerSendWorkRequest<'wr, 'data> {
8 pub(crate) peer: usize,
9 pub(crate) wr: SendWorkRequest<'wr, 'data>,
10}
11
12#[derive(Debug)]
14pub struct PeerReceiveWorkRequest<'wr, 'data> {
15 pub(crate) peer: usize,
16 pub(crate) wr: ReceiveWorkRequest<'wr, 'data>,
17}
18
19#[derive(Debug, Clone)]
21pub struct PeerWriteWorkRequest<'wr, 'data> {
22 pub(crate) peer: usize,
23 pub(crate) wr: WriteWorkRequest<'wr, 'data>,
24}
25
26#[derive(Debug)]
28pub struct PeerReadWorkRequest<'wr, 'data> {
29 pub(crate) peer: usize,
30 pub(crate) wr: ReadWorkRequest<'wr, 'data>,
31}
32
33impl<'wr, 'data> PeerSendWorkRequest<'wr, 'data> {
34 pub fn new(peer: usize, gather_elements: &'wr [GatherElement<'data>]) -> Self {
36 Self {
37 peer,
38 wr: SendWorkRequest::new(gather_elements),
39 }
40 }
41
42 pub fn from_wr(peer: usize, wr: SendWorkRequest<'wr, 'data>) -> Self {
44 Self { peer, wr }
45 }
46
47 pub fn with_immediate(mut self, imm_data: u32) -> Self {
49 self.wr = self.wr.with_immediate(imm_data);
50 self
51 }
52
53 pub fn only_immediate(peer: usize, imm_data: u32) -> Self {
55 Self {
56 peer,
57 wr: SendWorkRequest::only_immediate(imm_data),
58 }
59 }
60
61 pub fn peer(&self) -> usize {
63 self.peer
64 }
65}
66
67impl<'wr, 'data> From<PeerSendWorkRequest<'wr, 'data>> for SendWorkRequest<'wr, 'data> {
68 fn from(value: PeerSendWorkRequest<'wr, 'data>) -> Self {
69 value.wr
70 }
71}
72
73impl<'wr, 'data> PeerReceiveWorkRequest<'wr, 'data> {
74 pub fn new(peer: usize, scatter_elements: &'wr mut [ScatterElement<'data>]) -> Self {
76 Self {
77 peer,
78 wr: ReceiveWorkRequest::new(scatter_elements),
79 }
80 }
81
82 pub fn only_immediate(peer: usize) -> Self {
84 Self {
85 peer,
86 wr: ReceiveWorkRequest::only_immediate(),
87 }
88 }
89
90 pub fn from_wr(peer: usize, wr: ReceiveWorkRequest<'wr, 'data>) -> Self {
92 Self { peer, wr }
93 }
94
95 pub fn peer(&self) -> usize {
97 self.peer
98 }
99}
100
101impl<'wr, 'data> From<PeerReceiveWorkRequest<'wr, 'data>> for ReceiveWorkRequest<'wr, 'data> {
102 fn from(value: PeerReceiveWorkRequest<'wr, 'data>) -> Self {
103 value.wr
104 }
105}
106
107impl<'wr, 'data> PeerWriteWorkRequest<'wr, 'data> {
108 pub fn new(
110 gather_elements: &'wr [GatherElement<'data>],
111 peer_remote_mr: PeerRemoteMemoryRegion,
112 ) -> Self {
113 Self {
114 peer: peer_remote_mr.peer(),
115 wr: WriteWorkRequest::new(gather_elements, peer_remote_mr.remote_mr),
116 }
117 }
118
119 pub fn with_immediate(mut self, imm_data: u32) -> Self {
121 self.wr = self.wr.with_immediate(imm_data);
122 self
123 }
124
125 pub fn peer(&self) -> usize {
127 self.peer
128 }
129}
130
131impl<'wr, 'data> From<PeerWriteWorkRequest<'wr, 'data>> for WriteWorkRequest<'wr, 'data> {
132 fn from(value: PeerWriteWorkRequest<'wr, 'data>) -> Self {
133 value.wr
134 }
135}
136
137impl<'wr, 'data> PeerReadWorkRequest<'wr, 'data> {
138 pub fn new(
140 scatter_elements: &'wr mut [ScatterElement<'data>],
141 peer_remote_mr: PeerRemoteMemoryRegion,
142 ) -> Self {
143 Self {
144 peer: peer_remote_mr.peer(),
145 wr: ReadWorkRequest::new(scatter_elements, peer_remote_mr.remote_mr),
146 }
147 }
148
149 pub fn peer(&self) -> usize {
151 self.peer
152 }
153}
154
155impl<'wr, 'data> From<PeerReadWorkRequest<'wr, 'data>> for ReadWorkRequest<'wr, 'data> {
156 fn from(value: PeerReadWorkRequest<'wr, 'data>) -> Self {
157 value.wr
158 }
159}