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; }
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; }
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; }