use std::sync::Arc;
use dma_libfabric::asynchronous::FabricService;
use dma_libfabric::{Direction, Operands, Pool, TransferRequest};
use dma_libfabric_protocol::{DmaError, encode_hex};
mod common;
struct Operation {
payload: Vec<u8>,
}
impl Operands for Operation {
fn source(&self) -> Option<&[u8]> {
Some(&self.payload)
}
}
#[tokio::main]
async fn main() -> Result<(), DmaError> {
let common::Arguments {
configuration,
peer,
} = common::parse()?;
let pool = Arc::new(Pool::new(2).map_err(|error| DmaError::Fabric(format!("pool: {error}")))?);
let server: FabricService<Operation> = FabricService::start(&configuration, pool)?;
println!("local address: {}", encode_hex(server.local_address()));
let peer = match peer {
Some(peer) => peer,
None => {
println!("paste the target's <address-hex> <rkey> <remote-addr>:");
common::peer_from_stdin()?
}
};
let payload = vec![0xab_u8; 4096];
let request = TransferRequest {
client_id: 1,
peer_address: peer.address,
remote_key: peer.remote_key,
remote_address: peer.remote_address,
direction: Direction::ToPeer,
want_checksum: true,
caller_context: Operation { payload },
parent_id: None,
};
let Ok(transfer) = server.transfer(request) else {
return Err(DmaError::Fabric("fabric worker is gone".into()));
};
let (outcome, operation) = transfer.await;
match outcome {
Ok(transferred) => println!(
"wrote {} of {} bytes, crc {:?}",
transferred.bytes,
operation.payload.len(),
transferred.checksum
),
Err(error) => println!("transfer failed: {error}"),
}
Ok(())
}