/* TODO: This should copy the listening fi_info as the base */ static struct fi_info * fi_ibv_eq_cm_getinfo(struct fi_ibv_fabric *fab, struct rdma_cm_event *event) { struct fi_info *info, *fi; struct fi_ibv_connreq *connreq; fi = fi_ibv_get_verbs_info(ibv_get_device_name(event->id->verbs->device)); if (!fi) return NULL; info = fi_dupinfo(fi); if (!info) return NULL; info->fabric_attr->fabric = &fab->fabric_fid; if (!(info->fabric_attr->prov_name = strdup(VERBS_PROV_NAME))) goto err; fi_ibv_update_info(NULL, info); info->src_addrlen = fi_ibv_sockaddr_len(rdma_get_local_addr(event->id)); if (!(info->src_addr = malloc(info->src_addrlen))) goto err; memcpy(info->src_addr, rdma_get_local_addr(event->id), info->src_addrlen); info->dest_addrlen = fi_ibv_sockaddr_len(rdma_get_peer_addr(event->id)); if (!(info->dest_addr = malloc(info->dest_addrlen))) goto err; memcpy(info->dest_addr, rdma_get_peer_addr(event->id), info->dest_addrlen); FI_INFO(&fi_ibv_prov, FI_LOG_CORE, "src_addr: %s:%d\n", inet_ntoa(((struct sockaddr_in *)info->src_addr)->sin_addr), ntohs(((struct sockaddr_in *)info->src_addr)->sin_port)); FI_INFO(&fi_ibv_prov, FI_LOG_CORE, "dst_addr: %s:%d\n", inet_ntoa(((struct sockaddr_in *)info->dest_addr)->sin_addr), ntohs(((struct sockaddr_in *)info->dest_addr)->sin_port)); connreq = calloc(1, sizeof *connreq); if (!connreq) goto err; connreq->handle.fclass = FI_CLASS_CONNREQ; connreq->id = event->id; info->handle = &connreq->handle; return info; err: fi_freeinfo(info); return NULL; }
static int fi_ibv_get_matching_info(const char *domain_name, struct fi_info *hints, struct rdma_addrinfo *rai, struct fi_info **info) { struct fi_info *check_info; struct fi_info *fi, *tail; int ret; *info = tail = NULL; for (check_info = verbs_info; check_info; check_info = check_info->next) { if (domain_name && strncmp(check_info->domain_attr->name, domain_name, strlen(domain_name))) continue; if (hints) { ret = fi_ibv_check_hints(hints, check_info); if (ret) continue; } if (!(fi = fi_dupinfo(check_info))) { ret = -FI_ENOMEM; goto err1; } ret = fi_ibv_rai_to_fi(rai, fi); if (ret) goto err2; fi_ibv_update_info(hints, fi); if (!*info) *info = fi; else tail->next = fi; tail = fi; } if (!*info) return -FI_ENODATA; return 0; err2: fi_freeinfo(fi); err1: fi_freeinfo(*info); return ret; }