コード例 #1
0
ファイル: fabric.c プロジェクト: jpdoyle/libfabric
struct fi_info *DEFAULT_SYMVER_PRE(fi_dupinfo)(const struct fi_info *info)
{
	struct fi_info *dup;

	if (!info)
		return fi_allocinfo_internal();

	dup = mem_dup(info, sizeof(*dup));
	if (dup == NULL) {
		return NULL;
	}
	dup->src_addr = NULL;
	dup->dest_addr = NULL;
	dup->tx_attr = NULL;
	dup->rx_attr = NULL;
	dup->ep_attr = NULL;
	dup->domain_attr = NULL;
	dup->fabric_attr = NULL;
	dup->next = NULL;

	if (info->src_addr != NULL) {
		dup->src_addr = mem_dup(info->src_addr, info->src_addrlen);
		if (dup->src_addr == NULL)
			goto fail;
	}
	if (info->dest_addr != NULL) {
		dup->dest_addr = mem_dup(info->dest_addr, info->dest_addrlen);
		if (dup->dest_addr == NULL)
			goto fail;
	}
	if (info->tx_attr != NULL) {
		dup->tx_attr = mem_dup(info->tx_attr, sizeof(*info->tx_attr));
		if (dup->tx_attr == NULL)
			goto fail;
	}
	if (info->rx_attr != NULL) {
		dup->rx_attr = mem_dup(info->rx_attr, sizeof(*info->rx_attr));
		if (dup->rx_attr == NULL)
			goto fail;
	}
	if (info->ep_attr != NULL) {
		dup->ep_attr = mem_dup(info->ep_attr, sizeof(*info->ep_attr));
		if (dup->ep_attr == NULL)
			goto fail;
	}
	if (info->domain_attr) {
		dup->domain_attr = mem_dup(info->domain_attr, sizeof(*info->domain_attr));
		if (dup->domain_attr == NULL)
			goto fail;
		if (info->domain_attr->name != NULL) {
			dup->domain_attr->name = strdup(info->domain_attr->name);
			if (dup->domain_attr->name == NULL)
				goto fail;
		}
	}
	if (info->fabric_attr) {
		dup->fabric_attr = mem_dup(info->fabric_attr, sizeof(*info->fabric_attr));
		if (dup->fabric_attr == NULL)
			goto fail;
		dup->fabric_attr->name = NULL;
		dup->fabric_attr->prov_name = NULL;
		if (info->fabric_attr->name != NULL) {
			dup->fabric_attr->name = strdup(info->fabric_attr->name);
			if (dup->fabric_attr->name == NULL)
				goto fail;
		}
		if (info->fabric_attr->prov_name != NULL) {
			dup->fabric_attr->prov_name = strdup(info->fabric_attr->prov_name);
			if (dup->fabric_attr->prov_name == NULL)
				goto fail;
		}
	}
	return dup;

fail:
	fi_freeinfo(dup);
	return NULL;
}
コード例 #2
0
ファイル: usdf_fabric.c プロジェクト: luomiao/libfabric
static int
usdf_fill_info_rdm(
	struct fi_info *hints,
	struct sockaddr_in *src,
	struct sockaddr_in *dest,
	struct usd_device_attrs *dap,
	struct fi_info **fi_first,
	struct fi_info **fi_last)
{
	struct fi_info *fi;
	struct fi_fabric_attr *fattrp;
	struct fi_domain_attr *dattrp;
	struct fi_tx_attr *txattr;
	struct fi_rx_attr *rxattr;
	struct fi_ep_attr *eattrp;
	uint32_t addr_format;
	int ret;

	/* check that we are capable of what's requested */
	if ((hints->caps & ~USDF_RDM_CAPS) != 0) {
		return -FI_ENODATA;
	}

	/* app must support these modes */
	if ((hints->mode & USDF_RDM_REQ_MODE) != USDF_RDM_REQ_MODE) {
		return -FI_ENODATA;
	}

	fi = fi_allocinfo_internal();
	if (fi == NULL) {
		ret = -FI_ENOMEM;
		goto fail;
	}

	fi->caps = USDF_RDM_CAPS;

	if (hints != NULL) {
		fi->mode = hints->mode & USDF_RDM_SUPP_MODE;
		addr_format = hints->addr_format;
	} else {
		fi->mode = USDF_RDM_SUPP_MODE;
		addr_format = FI_FORMAT_UNSPEC;
	}
	fi->ep_type = FI_EP_RDM;

	ret = usdf_fill_addr_info(fi, addr_format, src, dest, dap);
	if (ret != 0) {
		goto fail;
	}

	/* fabric attrs */
	fattrp = fi->fabric_attr;
	fattrp->name = strdup(dap->uda_devname);
	if (fattrp->name == NULL) {
		ret = -FI_ENOMEM;
		goto fail;
	}

	/* TX attrs */
	txattr = fi->tx_attr;
	if (hints != NULL && hints->tx_attr != NULL) {
		*txattr = *hints->tx_attr;
	}
	usdf_rdm_fill_tx_attr(txattr);

	/* RX attrs */
	rxattr = fi->rx_attr;
	if (hints != NULL && hints->rx_attr != NULL) {
		*rxattr = *hints->rx_attr;
	}
	usdf_rdm_fill_rx_attr(rxattr);

	/* endpoint attrs */
	eattrp = fi->ep_attr;
	eattrp->max_msg_size = USDF_RDM_MAX_MSG;
	eattrp->protocol = FI_PROTO_RUDP;
	eattrp->tx_ctx_cnt = 1;
	eattrp->rx_ctx_cnt = 1;

	/* domain attrs */
	dattrp = fi->domain_attr;
	dattrp->threading = FI_THREAD_UNSPEC;
	dattrp->control_progress = FI_PROGRESS_AUTO;
	dattrp->data_progress = FI_PROGRESS_MANUAL;

	/* add to tail of list */
	if (*fi_first == NULL) {
		*fi_first = fi;
	} else {
		(*fi_last)->next = fi;
	}
	*fi_last = fi;

	return 0;

fail:
	if (fi != NULL) {
		fi_freeinfo(fi);
	}
	return ret;
}
コード例 #3
0
ファイル: usdf_pep.c プロジェクト: luomiao/libfabric
static struct fi_info *
usdf_pep_conn_info(struct usdf_connreq *crp)
{
	struct fi_info *ip;
	struct usdf_pep *pep;
	struct sockaddr_in *sin;
	struct usdf_fabric *fp;
	struct usdf_domain *udp;
	struct usd_device_attrs *dap;
	struct usdf_connreq_msg *reqp;

	pep = crp->cr_pep;
	fp = pep->pep_fabric;
	udp = LIST_FIRST(&fp->fab_domain_list);
	dap = fp->fab_dev_attrs;
	reqp = (struct usdf_connreq_msg *)crp->cr_data;

	/* If there is a domain, just copy info from there */
	if (udp != NULL) {
		ip = fi_dupinfo(udp->dom_info);
		if (ip == NULL) {
			return NULL;
		}

	/* no domains yet, make an info suitable for creating one */
	} else {
		ip = fi_allocinfo_internal();
		if (ip == NULL) {
			return NULL;
		}

		ip->caps = USDF_MSG_CAPS;
		ip->mode = USDF_MSG_SUPP_MODE;
		ip->ep_type = FI_EP_MSG;

		ip->addr_format = FI_SOCKADDR_IN;
		ip->src_addrlen = sizeof(struct sockaddr_in);
		sin = calloc(1, ip->src_addrlen);
		if (sin == NULL) {
			goto fail;
		}
		sin->sin_family = AF_INET;
		sin->sin_addr.s_addr = dap->uda_ipaddr_be;
		ip->src_addr = sin;
		
		ip->ep_attr->protocol = FI_PROTO_RUDP;

		ip->fabric_attr->fabric = fab_utof(fp);
		ip->fabric_attr->name = strdup(fp->fab_attr.name);
		ip->fabric_attr->prov_name = strdup(fp->fab_attr.prov_name);
		ip->fabric_attr->prov_version = fp->fab_attr.prov_version;
		if (ip->fabric_attr->name == NULL ||
				ip->fabric_attr->prov_name == NULL) {
			goto fail;
		}
	}

	/* fill in dest addr */
	ip->dest_addrlen = ip->src_addrlen;
	sin = calloc(1, ip->dest_addrlen);
	sin->sin_family = AF_INET;
	sin->sin_addr.s_addr = reqp->creq_ipaddr;
	sin->sin_port = reqp->creq_port;

	ip->connreq = crp;
	return ip;
fail:
	fi_freeinfo(ip);
	return NULL;
}
コード例 #4
0
ファイル: usdf_fabric.c プロジェクト: luomiao/libfabric
static int
usdf_fill_info_dgram(
	struct fi_info *hints,
	struct sockaddr_in *src,
	struct sockaddr_in *dest,
	struct usd_device_attrs *dap,
	struct fi_info **fi_first,
	struct fi_info **fi_last)
{
	struct fi_info *fi;
	struct fi_fabric_attr *fattrp;
	struct fi_domain_attr *dattrp;
	struct fi_tx_attr *txattr;
	struct fi_rx_attr *rxattr;
	struct fi_ep_attr *eattrp;
	uint32_t addr_format;
	size_t entries;
	int ret;

	/* check that we are capable of what's requested */
	if ((hints->caps & ~USDF_DGRAM_CAPS) != 0) {
		return -FI_ENODATA;
	}

	/* app must support these modes */
	if ((hints->mode & USDF_DGRAM_REQ_MODE) != USDF_DGRAM_REQ_MODE) {
		return -FI_ENODATA;
	}

	fi = fi_allocinfo_internal();
	if (fi == NULL) {
		ret = -FI_ENOMEM;
		goto fail;
	}

	fi->caps = USDF_DGRAM_CAPS;

	if (hints != NULL) {
		fi->mode = hints->mode & USDF_DGRAM_SUPP_MODE;
		addr_format = hints->addr_format;
	} else {
		fi->mode = USDF_DGRAM_SUPP_MODE;
		addr_format = FI_FORMAT_UNSPEC;
	}
	fi->ep_type = FI_EP_DGRAM;

	ret = usdf_fill_addr_info(fi, addr_format, src, dest, dap);
	if (ret != 0) {
		goto fail;
	}

	/* fabric attrs */
	fattrp = fi->fabric_attr;
	fattrp->name = strdup(dap->uda_devname);
	if (fattrp->name == NULL) {
		ret = -FI_ENOMEM;
		goto fail;
	}

	/* TX attrs */
	txattr = fi->tx_attr;
	txattr->iov_limit = USDF_DGRAM_DFLT_SGE;
	txattr->size = dap->uda_max_send_credits / USDF_DGRAM_DFLT_SGE;
	if (hints != NULL && hints->tx_attr != NULL) {
		if (hints->tx_attr->iov_limit > USDF_MSG_MAX_SGE) {
			ret = -FI_ENODATA;
			goto fail;
		}
		if (hints->tx_attr->iov_limit != 0) {
			txattr->iov_limit = hints->tx_attr->iov_limit;
			entries = hints->tx_attr->size * txattr->iov_limit;
			if (entries > dap->uda_max_send_credits) {
				ret = -FI_ENODATA;
				goto fail;
			} else if (entries == 0) {
				txattr->size = dap->uda_max_send_credits /
					txattr->iov_limit;
			} else {
				txattr->size = hints->tx_attr->size;
			}
		} else if (hints->tx_attr->size != 0) {
			txattr->size = hints->tx_attr->size;
			if (txattr->size > dap->uda_max_send_credits) {
				ret = -FI_ENODATA;
				goto fail;
			}
			entries = txattr->size * txattr->iov_limit;
			if (entries > dap->uda_max_send_credits) {
				txattr->iov_limit = dap->uda_max_send_credits /
					txattr->size;
			}
		}
	}

	/* RX attrs */
	rxattr = fi->rx_attr;
	rxattr->iov_limit = USDF_DGRAM_DFLT_SGE;
	rxattr->size = dap->uda_max_recv_credits / USDF_DGRAM_DFLT_SGE;
	if (hints != NULL && hints->rx_attr != NULL) {
		if (hints->rx_attr->iov_limit > USDF_MSG_MAX_SGE) {
			ret = -FI_ENODATA;
			goto fail;
		}
		if (hints->rx_attr->iov_limit != 0) {
			rxattr->iov_limit = hints->rx_attr->iov_limit;
			entries = hints->rx_attr->size * rxattr->iov_limit;
			if (entries > dap->uda_max_recv_credits) {
				ret = -FI_ENODATA;
				goto fail;
			} else if (entries == 0) {
				rxattr->size = dap->uda_max_recv_credits /
					rxattr->iov_limit;
			} else {
				rxattr->size = hints->rx_attr->size;
			}
		} else if (hints->rx_attr->size != 0) {
			rxattr->size = hints->rx_attr->size;
			if (rxattr->size > dap->uda_max_recv_credits) {
				ret = -FI_ENODATA;
				goto fail;
			}
			entries = rxattr->size * rxattr->iov_limit;
			if (entries > dap->uda_max_recv_credits) {
				rxattr->iov_limit = dap->uda_max_recv_credits /
					rxattr->size;
			}
		}
	}

	/* endpoint attrs */
	eattrp = fi->ep_attr;
	if (fi->mode & FI_MSG_PREFIX) {
		eattrp->msg_prefix_size = USDF_HDR_BUF_ENTRY;
	}
	eattrp->max_msg_size = dap->uda_mtu -
		sizeof(struct usd_udp_hdr);
	eattrp->protocol = FI_PROTO_UDP;
	eattrp->tx_ctx_cnt = 1;
	eattrp->rx_ctx_cnt = 1;

	/* domain attrs */
	dattrp = fi->domain_attr;
	dattrp->threading = FI_THREAD_UNSPEC;
	dattrp->control_progress = FI_PROGRESS_AUTO;
	dattrp->data_progress = FI_PROGRESS_MANUAL;

	/* add to tail of list */
	if (*fi_first == NULL) {
		*fi_first = fi;
	} else {
		(*fi_last)->next = fi;
	}
	*fi_last = fi;

	return 0;

fail:
	if (fi != NULL) {
		fi_freeinfo(fi);
	}
	return ret;
}