ssize_t udpx_sendmsg(struct fid_ep *ep_fid, const struct fi_msg *msg, uint64_t flags) { struct udpx_ep *ep; struct msghdr hdr; ssize_t ret; ep = container_of(ep_fid, struct udpx_ep, util_ep.ep_fid.fid); hdr.msg_name = ip_av_get_addr(ep->util_ep.av, msg->addr); hdr.msg_namelen = ep->util_ep.av->addrlen; hdr.msg_iov = (struct iovec *) msg->msg_iov; hdr.msg_iovlen = msg->iov_count; hdr.msg_control = NULL; hdr.msg_controllen = 0; hdr.msg_flags = 0; fastlock_acquire(&ep->util_ep.tx_cq->cq_lock); if (ofi_cirque_isfull(ep->util_ep.tx_cq->cirq)) { ret = -FI_EAGAIN; goto out; } ret = sendmsg(ep->sock, &hdr, 0); if (ret >= 0) { ep->tx_comp(ep, msg->context); ret = 0; } else { ret = -errno; } out: fastlock_release(&ep->util_ep.tx_cq->cq_lock); return ret; }
ssize_t udpx_send(struct fid_ep *ep_fid, const void *buf, size_t len, void *desc, fi_addr_t dest_addr, void *context) { struct udpx_ep *ep; ssize_t ret; ep = container_of(ep_fid, struct udpx_ep, util_ep.ep_fid.fid); fastlock_acquire(&ep->util_ep.tx_cq->cq_lock); if (ofi_cirque_isfull(ep->util_ep.tx_cq->cirq)) { ret = -FI_EAGAIN; goto out; } ret = sendto(ep->sock, buf, len, 0, ip_av_get_addr(ep->util_ep.av, dest_addr), ep->util_ep.av->addrlen); if (ret == len) { ep->tx_comp(ep, context); ret = 0; } else { ret = -errno; } out: fastlock_release(&ep->util_ep.tx_cq->cq_lock); return ret; }
static int ip_av_remove(struct fid_av *av_fid, fi_addr_t *fi_addr, size_t count, uint64_t flags) { struct util_av *av; int i, slot, index, ret; av = container_of(av_fid, struct util_av, av_fid); if (flags) { FI_WARN(av->prov, FI_LOG_AV, "invalid flags\n"); return -FI_EINVAL; } /* * It's more efficient to remove addresses from high to low index. * We assume that addresses are removed in the same order that they were * added -- i.e. fi_addr passed in here was also passed into insert. * Thus, we walk through the array backwards. */ for (i = count - 1; i >= 0; i--) { index = (int) fi_addr[i]; slot = ip_av_slot(av, ip_av_get_addr(av, index)); ret = fi_av_remove_addr(av, slot, index); if (ret) { FI_WARN(av->prov, FI_LOG_AV, "removal of fi_addr %d failed\n", index); } } return 0; }
ssize_t udpx_inject(struct fid_ep *ep_fid, const void *buf, size_t len, fi_addr_t dest_addr) { struct udpx_ep *ep; ssize_t ret; ep = container_of(ep_fid, struct udpx_ep, util_ep.ep_fid.fid); ret = sendto(ep->sock, buf, len, 0, ip_av_get_addr(ep->util_ep.av, dest_addr), ep->util_ep.av->addrlen); return ret == len ? 0 : -errno; }
static int ip_av_lookup(struct fid_av *av_fid, fi_addr_t fi_addr, void *addr, size_t *addrlen) { struct util_av *av; int index; av = container_of(av_fid, struct util_av, av_fid); index = (int) fi_addr; if (index < 0 || index > av->count) { FI_WARN(av->prov, FI_LOG_AV, "unknown address\n"); return -FI_EINVAL; } memcpy(addr, ip_av_get_addr(av, index), MIN(*addrlen, av->addrlen)); *addrlen = av->addrlen; return 0; }