Пример #1
0
static ssize_t
_usdf_dgram_send_iov_prefix(struct usdf_ep *ep,
		struct usd_dest *dest, const struct iovec *iov,
		size_t count, void *context, uint8_t cq_entry)
{
	struct iovec send_iov[USDF_DGRAM_MAX_SGE];
	struct usd_udp_hdr *hdr;
	struct usd_qp_impl *qp;
	uint32_t last_post;
	struct usd_wq *wq;
	size_t padding;
	size_t len;

	qp = to_qpi(ep->e.dg.ep_qp);
	wq = &qp->uq_wq;

	len = _usdf_iov_len(iov, count);
	padding = USDF_HDR_BUF_ENTRY - sizeof(struct usd_udp_hdr);

	hdr = (struct usd_udp_hdr *) ((char *) iov[0].iov_base +
			padding);
	memcpy(hdr, &dest->ds_dest.ds_udp.u_hdr, sizeof(*hdr));

	_usdf_adjust_prefix_hdr(hdr, qp, len, padding);

	memcpy(send_iov, iov, sizeof(struct iovec) * count);
	send_iov[0].iov_base = hdr;
	send_iov[0].iov_len -= padding;

	last_post = _usd_post_send_iov(wq, send_iov, count, cq_entry);
	_usdf_adjust_post_info(wq, last_post, context, len - USDF_HDR_BUF_ENTRY);

	return FI_SUCCESS;
}
Пример #2
0
static ssize_t _usdf_dgram_send_iov(struct usdf_ep *ep, struct usd_dest *dest,
		const struct iovec *iov, size_t count, void *context, uint8_t
		cq_entry)
{
	struct iovec send_iov[USDF_DGRAM_MAX_SGE];
	struct usd_udp_hdr *hdr;
	struct usd_qp_impl *qp;
	struct usd_wq *wq;
	uint32_t last_post;
	size_t len;

	qp = to_qpi(ep->e.dg.ep_qp);
	wq = &qp->uq_wq;

	len = _usdf_iov_len(iov, count);
	hdr = _usdf_find_hdr(wq);
	memcpy(hdr, &dest->ds_dest.ds_udp.u_hdr, sizeof(*hdr));
	_usdf_adjust_hdr(hdr, qp, len);

	send_iov[0].iov_base = hdr;
	send_iov[0].iov_len = sizeof(*hdr);
	memcpy(&send_iov[1], iov, sizeof(struct iovec) * count);

	last_post = _usd_post_send_iov(wq, send_iov, count + 1,
					cq_entry);
	_usdf_adjust_post_info(wq, last_post, context, len);

	return FI_SUCCESS;
}
Пример #3
0
ssize_t
usdf_dgram_prefix_sendv(struct fid_ep *fep, const struct iovec *iov, void **desc,
		size_t count, fi_addr_t dest_addr, void *context)
{
	struct usdf_ep *ep;
	struct usd_dest *dest;
	struct usd_wq *wq;
 	struct usd_qp_impl *qp;
	struct usd_udp_hdr *hdr;
	uint32_t last_post;
	struct usd_wq_post_info *info;
	struct iovec send_iov[USDF_DGRAM_MAX_SGE];
	size_t len;
	unsigned i;
	size_t padding;

	ep = ep_ftou(fep);
	dest = (struct usd_dest *)(uintptr_t) dest_addr;
	padding = USDF_HDR_BUF_ENTRY - sizeof(struct usd_udp_hdr);

	len = 0;
	for (i = 0; i < count; i++) {
		len += iov[i].iov_len;
	}

	if (len + sizeof(struct usd_udp_hdr) > USD_SEND_MAX_COPY) {
		qp = to_qpi(ep->e.dg.ep_qp);
		wq = &qp->uq_wq;
		hdr = (struct usd_udp_hdr *) ((char *) iov[0].iov_base +
				padding);
		memcpy(hdr, &dest->ds_dest.ds_udp.u_hdr, sizeof(*hdr));

		/* adjust lengths and insert source port */
		hdr->uh_ip.tot_len = htons(len - padding -
				sizeof(struct ether_header));
		hdr->uh_udp.len = htons(len - padding -
				sizeof(struct ether_header) -
				sizeof(struct iphdr));
		hdr->uh_udp.source =
			qp->uq_attrs.uqa_local_addr.ul_addr.ul_udp.u_addr.sin_port;

		memcpy(send_iov, iov, sizeof(struct iovec) * count);
		send_iov[0].iov_base = hdr;
		send_iov[0].iov_len -= padding;

		last_post = _usd_post_send_iov(wq, send_iov, count, 1);
		info = &wq->uwq_post_info[last_post];
		info->wp_context = context;
		info->wp_len = len;
	} else {
		_usdf_dgram_send_iov_copy(ep, dest, iov, count, context);
	}
	return 0;
}