ssize_t usdf_dgram_send(struct fid_ep *fep, const void *buf, size_t len, void *desc, fi_addr_t dest_addr, void *context) { struct usdf_dest *dest; struct usdf_ep *ep; uint32_t flags; ep = ep_ftou(fep); dest = (struct usdf_dest *)(uintptr_t) dest_addr; flags = (ep->ep_tx_completion) ? USD_SF_SIGNAL : 0; if (len + sizeof(struct usd_udp_hdr) <= USD_SEND_MAX_COPY) { return usd_post_send_one_copy(ep->e.dg.ep_qp, &dest->ds_dest, buf, len, flags, context); } else if (ep->e.dg.tx_op_flags & FI_INJECT) { USDF_DBG_SYS(EP_DATA, "given inject length (%zu) exceeds max inject length (%d)\n", len + sizeof(struct usd_udp_hdr), USD_SEND_MAX_COPY); return -FI_ENOSPC; } return usd_post_send_one(ep->e.dg.ep_qp, &dest->ds_dest, buf, len, flags, context); }
static inline ssize_t _usdf_dgram_send(struct usdf_ep *ep, struct usdf_dest *dest, const void *buf, size_t len, void *context) { if (len <= USD_SEND_MAX_COPY - sizeof(struct usd_udp_hdr)) { return usd_post_send_one_copy(ep->e.dg.ep_qp, &dest->ds_dest, buf, len, USD_SF_SIGNAL, context); } else { return usd_post_send_one(ep->e.dg.ep_qp, &dest->ds_dest, buf, len, USD_SF_SIGNAL, context); } }
ssize_t usdf_dgram_prefix_send(struct fid_ep *fep, const void *buf, size_t len, void *desc, fi_addr_t dest_addr, void *context) { struct usd_udp_hdr *hdr; struct usd_qp_impl *qp; struct usdf_dest *dest; struct usdf_ep *ep; struct usd_wq *wq; uint32_t last_post; uint32_t flags; size_t padding; ep = ep_ftou(fep); dest = (struct usdf_dest *)(uintptr_t) dest_addr; padding = USDF_HDR_BUF_ENTRY - sizeof(struct usd_udp_hdr); flags = (ep->ep_tx_completion) ? USD_SF_SIGNAL : 0; if (ep->e.dg.tx_op_flags & FI_INJECT) { if ((len - padding) > USD_SEND_MAX_COPY) { USDF_DBG_SYS(EP_DATA, "given inject length (%zu) exceeds max inject length (%d)\n", len, USD_SEND_MAX_COPY); return -FI_ENOSPC; } return usd_post_send_one_copy(ep->e.dg.ep_qp, &dest->ds_dest, buf + USDF_HDR_BUF_ENTRY, len - USDF_HDR_BUF_ENTRY, flags, context); } qp = to_qpi(ep->e.dg.ep_qp); wq = &qp->uq_wq; hdr = (struct usd_udp_hdr *) ((char *) buf + padding); memcpy(hdr, &dest->ds_dest.ds_dest.ds_udp.u_hdr, sizeof(*hdr)); _usdf_adjust_prefix_hdr(hdr, qp, len, padding); last_post = _usd_post_send_one(wq, hdr, len - padding, ep->ep_tx_completion); _usdf_adjust_post_info(wq, last_post, context, len - USDF_HDR_BUF_ENTRY); return FI_SUCCESS; }
ssize_t usdf_dgram_inject(struct fid_ep *fep, const void *buf, size_t len, fi_addr_t dest_addr) { struct usdf_dest *dest; struct usdf_ep *ep; ep = ep_ftou(fep); dest = (struct usdf_dest *)(uintptr_t) dest_addr; if (len + sizeof(struct usd_udp_hdr) > USD_SEND_MAX_COPY) { USDF_DBG_SYS(EP_DATA, "given inject length (%zu) exceeds max inject length (%d)\n", len + sizeof(struct usd_udp_hdr), USD_SEND_MAX_COPY); return -FI_ENOSPC; } /* * fi_inject never generates a completion */ return usd_post_send_one_copy(ep->e.dg.ep_qp, &dest->ds_dest, buf, len, 0, NULL); }