Example #1
0
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;
}
Example #2
0
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;
}
Example #3
0
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;
}