ibverbs_rs/multi_channel/remote_memory_region.rs
1use crate::ibverbs::memory::RemoteMemoryRegion;
2use serde::{Deserialize, Serialize};
3
4/// A wrapper around [`RemoteMemoryRegion`] associated with a specific remote `peer`.
5///
6/// This struct behaves exactly like `RemoteMemoryRegion` for One-Sided RDMA operations,
7/// but carries the destination peer index required to route the operation.
8///
9/// See [`RemoteMemoryRegion`] for details on RDMA write/read behavior and memory registration.
10#[derive(Debug, Copy, Clone, Serialize, Deserialize)]
11pub struct PeerRemoteMemoryRegion {
12 peer: usize,
13 pub(super) remote_mr: RemoteMemoryRegion,
14}
15
16impl PeerRemoteMemoryRegion {
17 /// Creates a new `PeerRemoteMemoryRegion` from a peer identifier and a `RemoteMemoryRegion`.
18 pub fn new(peer: usize, remote_mr: RemoteMemoryRegion) -> Self {
19 Self { peer, remote_mr }
20 }
21
22 /// Returns the peer identifier associated with this remote memory region.
23 pub fn peer(&self) -> usize {
24 self.peer
25 }
26
27 /// Delegates to [`RemoteMemoryRegion::sub_region`], returning a new `PeerRemoteMemoryRegion`
28 /// tied to the same peer.
29 ///
30 /// # Returns
31 ///
32 /// * `Some(PeerRemoteMemoryRegion)` if the offset is within bounds.
33 /// * `None` if the offset exceeds the current length.
34 pub fn sub_region(&self, offset: usize) -> Option<PeerRemoteMemoryRegion> {
35 Some(PeerRemoteMemoryRegion {
36 peer: self.peer,
37 remote_mr: self.remote_mr.sub_region(offset)?,
38 })
39 }
40
41 /// Like [`sub_region`](Self::sub_region), but without bounds checking.
42 pub fn sub_region_unchecked(&self, offset: usize) -> PeerRemoteMemoryRegion {
43 PeerRemoteMemoryRegion {
44 peer: self.peer,
45 remote_mr: self.remote_mr.sub_region_unchecked(offset),
46 }
47 }
48}