#include "mlx.h"
static int mlx_cm_getname(
fid_t fid,
void *addr,
size_t *addrlen)
{
ucs_status_t status = UCS_OK;
void* addr_local = NULL;
size_t addr_len_local;
struct mlx_ep* ep;
int ofi_status = FI_SUCCESS;
ep = container_of(fid, struct mlx_ep, ep.ep_fid.fid);
status = ucp_worker_get_address( ep->worker,
(ucp_address_t **)&addr_local,
(size_t*) &addr_len_local );
if (status != UCS_OK) {
return MLX_TRANSLATE_ERRCODE(status);
}
if ((*addrlen) < addr_len_local) {
FI_WARN( &mlx_prov, FI_LOG_CORE,
"Buffer storage for ep address is too small %d "
"instead of %d [%s]\n",
addrlen, addr_len_local, (char *)addr_local);
ofi_status = -FI_ETOOSMALL;
}
FI_INFO( &mlx_prov, FI_LOG_CORE,
"Loaded UCP adress: [%d]%s\n",
addr_len_local, (char *)addr_local);
memcpy( addr, addr_local,
(((*addrlen)<addr_len_local) ? (*addrlen):addr_len_local));
*addrlen = addr_len_local;
ucp_worker_release_address(
ep->worker,
(ucp_address_t *)addr_local);
return ofi_status;
}
struct fi_ops_cm mlx_cm_ops = {
.size = sizeof(struct fi_ops_cm),
.getname = mlx_cm_getname,
.getpeer = fi_no_getpeer,
.connect = fi_no_connect,
.listen = fi_no_listen,
.accept = fi_no_accept,
.reject = fi_no_reject,
.shutdown = fi_no_shutdown,
};