/* * Note: this function (according to WG), is not intended to * typically be used in the critical path for messaging/rma/amo * requests */ DIRECT_FN STATIC int gnix_av_lookup(struct fid_av *av, fi_addr_t fi_addr, void *addr, size_t *addrlen) { struct gnix_fid_av *gnix_av; struct gnix_ep_name ep_name = { {0} }; struct gnix_av_addr_entry *entry = NULL; int rc; GNIX_TRACE(FI_LOG_AV, "\n"); if (!av || !addrlen) return -FI_EINVAL; if (*addrlen < sizeof(ep_name)) { *addrlen = sizeof(ep_name); return -FI_ETOOSMALL; } /* * user better have provided a buffer since the * value stored in addrlen is big enough to return ep_name */ if (!addr) return -FI_EINVAL; gnix_av = container_of(av, struct gnix_fid_av, av_fid); rc = _gnix_av_lookup(gnix_av, fi_addr, &entry); if (rc != FI_SUCCESS) { GNIX_WARN(FI_LOG_AV, "_gnix_av_lookup failed: %d\n", rc); return rc; } memcpy(&ep_name.gnix_addr, &entry->gnix_addr, sizeof(struct gnix_address)); ep_name.name_type = entry->name_type; ep_name.cm_nic_cdm_id = entry->cm_nic_cdm_id; ep_name.cookie = entry->cookie; memcpy(addr, (void *)&ep_name, MIN(*addrlen, sizeof(ep_name))); *addrlen = sizeof(ep_name); return FI_SUCCESS; }
static void vc_setup_common(void) { int ret = 0; struct fi_av_attr attr; size_t addrlen = 0; struct gnix_fid_av *gnix_av; hints->fabric_attr->name = strdup("gni"); ret = fi_getinfo(FI_VERSION(1, 0), NULL, 0, 0, hints, &fi); cr_assert(!ret, "fi_getinfo"); ret = fi_fabric(fi->fabric_attr, &fab, NULL); cr_assert(!ret, "fi_fabric"); ret = fi_domain(fab, fi, &dom, NULL); cr_assert(!ret, "fi_domain"); attr.type = FI_AV_MAP; attr.count = 16; ret = fi_av_open(dom, &attr, &av, NULL); cr_assert(!ret, "fi_av_open"); gnix_av = container_of(av, struct gnix_fid_av, av_fid); ret = fi_endpoint(dom, fi, &ep[0], NULL); cr_assert(!ret, "fi_endpoint"); ret = fi_getname(&ep[0]->fid, NULL, &addrlen); cr_assert(addrlen > 0); ep_name[0] = malloc(addrlen); cr_assert(ep_name[0] != NULL); ep_name[1] = malloc(addrlen); cr_assert(ep_name[1] != NULL); ret = fi_getname(&ep[0]->fid, ep_name[0], &addrlen); cr_assert(ret == FI_SUCCESS); ret = fi_endpoint(dom, fi, &ep[1], NULL); cr_assert(!ret, "fi_endpoint"); ret = fi_getname(&ep[1]->fid, ep_name[1], &addrlen); cr_assert(ret == FI_SUCCESS); ret = fi_av_insert(av, ep_name[0], 1, &gni_addr[0], 0, NULL); cr_assert(ret == 1); ret = _gnix_av_lookup(gnix_av, gni_addr[0], &gnix_addr[0]); cr_assert(ret == FI_SUCCESS); ret = fi_av_insert(av, ep_name[1], 1, &gni_addr[1], 0, NULL); cr_assert(ret == 1); ret = _gnix_av_lookup(gnix_av, gni_addr[1], &gnix_addr[1]); cr_assert(ret == FI_SUCCESS); ret = fi_ep_bind(ep[0], &av->fid, 0); cr_assert(!ret, "fi_ep_bind"); cq_attr.format = FI_CQ_FORMAT_TAGGED; cq_attr.size = 1024; cq_attr.wait_obj = 0; ret = fi_cq_open(dom, &cq_attr, &cq, 0); cr_assert(!ret, "fi_cq_open"); ret = fi_ep_bind(ep[0], &cq->fid, FI_SEND | FI_RECV); cr_assert(!ret, "fi_ep_bind"); ret = fi_enable(ep[0]); cr_assert(!ret, "fi_enable"); ret = fi_ep_bind(ep[1], &cq->fid, FI_SEND | FI_RECV); cr_assert(!ret, "fi_ep_bind"); ret = fi_ep_bind(ep[1], &av->fid, 0); cr_assert(!ret, "fi_ep_bind"); ret = fi_enable(ep[1]); cr_assert(!ret, "fi_ep_enable"); }