static bool svc_rdma_reply(SVCXPRT *xprt, struct svc_req *req, struct rpc_msg *msg) { struct rpc_rdma_cbc *cbc = req->rq_context; XDR *xdrs = cbc->holdq.xdrs; xdrproc_t proc; void *where; bool has_args; __warnx(TIRPC_DEBUG_FLAG_SVC_RDMA, "%s() xprt %p cbc %p outgoing xdr %p\n", __func__, xprt, cbc, xdrs); if (msg->rm_reply.rp_stat == MSG_ACCEPTED && msg->rm_reply.rp_acpt.ar_stat == SUCCESS) { has_args = TRUE; proc = msg->acpted_rply.ar_results.proc; where = msg->acpted_rply.ar_results.where; msg->acpted_rply.ar_results.proc = (xdrproc_t)xdr_void; msg->acpted_rply.ar_results.where = NULL; } else { has_args = FALSE; proc = NULL; where = NULL; } if (!xdr_rdma_svc_reply(cbc, 0)){ __warnx(TIRPC_DEBUG_FLAG_SVC_RDMA, "%s: xdr_rdma_svc_reply failed (will set dead)", __func__); return (FALSE); } xdrs->x_op = XDR_ENCODE; if (!xdr_reply_encode(xdrs, msg)) { __warnx(TIRPC_DEBUG_FLAG_SVC_RDMA, "%s: xdr_reply_encode failed (will set dead)", __func__); return (FALSE); } xdr_tail_update(xdrs); if (has_args && req->rq_auth && !SVCAUTH_WRAP(req->rq_auth, req, xdrs, proc, where)) { __warnx(TIRPC_DEBUG_FLAG_SVC_RDMA, "%s: SVCAUTH_WRAP failed (will set dead)", __func__); return (FALSE); } xdr_tail_update(xdrs); return xdr_rdma_svc_flushout(cbc); }
static enum xprt_stat svc_dg_reply(struct svc_req *req) { SVCXPRT *xprt = req->rq_xprt; struct rpc_dplx_rec *rec = REC_XPRT(xprt); XDR *xdrs = rec->ioq.xdrs; struct svc_dg_xprt *su = DG_DR(rec); struct msghdr *msg = &su->su_msghdr; struct iovec iov; size_t slen; if (!xprt->xp_remote.nb.len) { __warnx(TIRPC_DEBUG_FLAG_WARN, "%s: %p fd %d has no remote address", __func__, xprt, xprt->xp_fd); return (XPRT_IDLE); } xdrs->x_op = XDR_ENCODE; XDR_SETPOS(xdrs, 0); if (!xdr_reply_encode(xdrs, &req->rq_msg)) { __warnx(TIRPC_DEBUG_FLAG_ERROR, "%s: %p fd %d xdr_reply_encode failed (will set dead)", __func__, xprt, xprt->xp_fd); return (XPRT_DIED); } if (req->rq_msg.rm_reply.rp_stat == MSG_ACCEPTED && req->rq_msg.rm_reply.rp_acpt.ar_stat == SUCCESS && req->rq_auth && !SVCAUTH_WRAP(req, xdrs)) { __warnx(TIRPC_DEBUG_FLAG_ERROR, "%s: %p fd %d SVCAUTH_WRAP failed (will set dead)", __func__, xprt, xprt->xp_fd); return (XPRT_DIED); } iov.iov_base = &su[1]; iov.iov_len = slen = XDR_GETPOS(xdrs); msg->msg_iov = &iov; msg->msg_iovlen = 1; msg->msg_name = (struct sockaddr *)&xprt->xp_remote.ss; msg->msg_namelen = xprt->xp_remote.nb.len; /* cmsg already set in svc_dg_rendezvous */ if (sendmsg(xprt->xp_fd, msg, 0) != (ssize_t) slen) { __warnx(TIRPC_DEBUG_FLAG_ERROR, "%s: %p fd %d sendmsg failed (will set dead)", __func__, xprt, xprt->xp_fd); return (XPRT_DIED); } return (XPRT_IDLE); }