async-rdma

A framework for writing RDMA applications with high-level abstraction and asynchronous APIs.

MIT licensed Build Status

It provides a few major components:

Example

A simple example: client request a remote memory region and put data into this remote memory region by rdma write. And finally client send_mr to make server aware of this memory region. Server receive_local_mr, and then get data from this mr.

```rust use asyncrdma::{Rdma, RdmaListener}; use std::{alloc::Layout, sync::Arc, io, time::Duration, net::{Ipv4Addr, SocketAddrV4}}; use portpicker::pickunused_port;

struct Data(String);

async fn client(addr: SocketAddrV4) -> io::Result<()> { let rdma = Rdma::connect(addr, 1, 1, 512).await?; let mut lmr = rdma.alloclocalmr(Layout::new::())?; let rmr = Arc::new(rdma.requestremotemr(Layout::new::()).await?); // then send this mr to server to make server aware of this mr. unsafe { *(lmr.asmutptr() as *mut Data) = Data("hello world".tostring()) }; rdma.write(&lmr, &rmr).await?; // send the content of lmr to server rdma.sendmr(rmr.clone()).await?; Ok(()) }

[tokio::main]

async fn server(addr: SocketAddrV4) -> io::Result<()> { let rdmalistener = RdmaListener::bind(addr).await?; let rdma = rdmalistener.accept(1, 1, 512).await?; let lmr = rdma.receivelocalmr().await?; // print the content of lmr, which was write by client unsafe { println!("{}", &((lmr.as_ptr() as *const Data)).0) }; Ok(()) }

[tokio::main]

async fn main() { let addr = SocketAddrV4::new(Ipv4Addr::new(127, 0, 0, 1), pickunusedport().unwrap()); std::thread::spawn(move || server(addr.clone())); tokio::time::sleep(Duration::new(1, 0)).await; client(addr).await.map_err(|err| println!("{}", err)).unwrap(); } ```

Getting Help

First, see if the answer to your question can be found in the found [API doc] or [Design doc]. If the answer is not here, please open an issue and describe your problem in detail.

Related Projects