Skip to main content

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}