Skip to content

Commit a0684b8

Browse files
RUST: RegDescList and XferDescList missed APIs
- equality operators - serialization - set/get - get index Signed-off-by: Evgeny Leksikov <[email protected]>
1 parent a7851fd commit a0684b8

File tree

5 files changed

+744
-170
lines changed

5 files changed

+744
-170
lines changed

src/bindings/rust/src/descriptors.rs

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,50 @@ mod reg;
2020
mod xfer;
2121
mod xfer_dlist_handle;
2222

23+
mod codec {
24+
use super::*;
25+
26+
pub fn reserve_capacity(buf: &mut Vec<u8>, additional: usize) {
27+
let needed = buf.len().saturating_add(additional);
28+
if buf.capacity() < needed { buf.reserve(needed - buf.capacity()); }
29+
}
30+
31+
pub fn write_u8(buf: &mut Vec<u8>, v: u8) { buf.push(v); }
32+
33+
pub fn write_u64(buf: &mut Vec<u8>, v: u64) { buf.extend_from_slice(&v.to_le_bytes()); }
34+
35+
pub fn read_bytes<'a>(data: &'a [u8], off: &mut usize, len: usize) -> Result<&'a [u8], NixlError> {
36+
let end = off.checked_add(len).ok_or(NixlError::InvalidParam)?;
37+
let slice = data.get(*off..end).ok_or(NixlError::InvalidParam)?;
38+
*off = end;
39+
Ok(slice)
40+
}
41+
42+
pub fn read_u8(data: &[u8], off: &mut usize) -> Result<u8, NixlError> {
43+
Ok(read_bytes(data, off, 1)?[0])
44+
}
45+
46+
pub fn read_u64(data: &[u8], off: &mut usize) -> Result<u64, NixlError> {
47+
let bytes = read_bytes(data, off, 8)?;
48+
let arr: [u8; 8] = bytes.try_into().map_err(|_| NixlError::InvalidParam)?;
49+
Ok(u64::from_le_bytes(arr))
50+
}
51+
52+
pub fn write_header(buf: &mut Vec<u8>, mem_type: MemType, count: usize) {
53+
write_u8(buf, mem_type as u8);
54+
write_u64(buf, count as u64);
55+
}
56+
57+
pub fn read_header(data: &[u8], off: &mut usize) -> Result<(MemType, usize), NixlError> {
58+
let mem = MemType::from(read_u8(data, off)? as nixl_capi_mem_type_t);
59+
let count = read_u64(data, off)? as usize;
60+
Ok((mem, count))
61+
}
62+
}
63+
2364
pub use query::{QueryResponse, QueryResponseIterator, QueryResponseList};
24-
pub use reg::RegDescList;
25-
pub use xfer::XferDescList;
65+
pub use reg::{RegDescList, RegDescriptor};
66+
pub use xfer::{XferDescList, XferDescriptor};
2667
pub use xfer_dlist_handle::XferDlistHandle;
2768

2869
/// Memory types supported by NIXL

0 commit comments

Comments
 (0)