int fi_ibv_create_ep(const char *node, const char *service, uint64_t flags, const struct fi_info *hints, struct rdma_addrinfo **rai, struct rdma_cm_id **id) { struct rdma_addrinfo *_rai = NULL; int ret; ret = fi_ibv_get_rdma_rai(node, service, flags, hints, &_rai); if (ret) { return ret; } ret = rdma_create_ep(id, _rai, NULL, NULL); if (ret) { VERBS_INFO_ERRNO(FI_LOG_FABRIC, "rdma_create_ep", errno); ret = -errno; goto err1; } if (rai) { *rai = _rai; } else { rdma_freeaddrinfo(_rai); } return ret; err1: rdma_freeaddrinfo(_rai); return ret; }
int fi_ibv_create_ep(const char *node, const char *service, uint64_t flags, const struct fi_info *hints, struct rdma_addrinfo **rai, struct rdma_cm_id **id) { struct rdma_addrinfo *_rai; struct sockaddr *local_addr; int ret; ret = fi_ibv_get_rdma_rai(node, service, flags, hints, &_rai); if (ret) { return ret; } ret = rdma_create_ep(id, _rai, NULL, NULL); if (ret) { VERBS_INFO_ERRNO(FI_LOG_FABRIC, "rdma_create_ep", errno); ret = -errno; goto err1; } if (rai && !_rai->ai_src_addr) { local_addr = rdma_get_local_addr(*id); _rai->ai_src_len = fi_ibv_sockaddr_len(local_addr); if (!(_rai->ai_src_addr = malloc(_rai->ai_src_len))) { ret = -FI_ENOMEM; goto err2; } memcpy(_rai->ai_src_addr, local_addr, _rai->ai_src_len); } if (rai) { *rai = _rai; } else { rdma_freeaddrinfo(_rai); } return ret; err2: rdma_destroy_ep(*id); err1: rdma_freeaddrinfo(_rai); return ret; }
static int fi_ibv_copy_ifaddr(const char *name, const char *service, uint64_t flags, struct fi_info *info) { struct rdma_addrinfo *rai; struct fi_info *fi; struct rdma_cm_id *id; int ret; ret = fi_ibv_get_rdma_rai(name, service, flags, NULL, &rai); if (ret) { FI_WARN(&fi_ibv_prov, FI_LOG_FABRIC, "rdma_getaddrinfo failed for name:%s\n", name); return ret; } ret = rdma_create_ep(&id, rai, NULL, NULL); if (!ret) { for (fi = info; fi; fi = fi->next) if (!strncmp(id->verbs->device->name, fi->domain_attr->name, strlen(id->verbs->device->name))) break; if (!fi) { FI_WARN(&fi_ibv_prov, FI_LOG_FABRIC, "No matching fi_info for device: " "%s with address: %s\n", id->verbs->device->name, name); } else { if (fi->src_addr) { free(fi->src_addr); fi->src_addr = NULL; } fi_ibv_rai_to_fi(rai, fi); } rdma_destroy_ep(id); } rdma_freeaddrinfo(rai); return 0; }