static enum xprt_stat svc_dg_decode(struct svc_req *req) { XDR *xdrs = req->rq_xdrs; SVCXPRT *xprt = req->rq_xprt; xdrs->x_op = XDR_DECODE; XDR_SETPOS(xdrs, 0); rpc_msg_init(&req->rq_msg); if (!xdr_dplx_decode(xdrs, &req->rq_msg)) { __warnx(TIRPC_DEBUG_FLAG_ERROR, "%s: %p fd %d failed (will set dead)", __func__, xprt, xprt->xp_fd); return (XPRT_DIED); } /* in order of likelihood */ if (req->rq_msg.rm_direction == CALL) { /* an ordinary call header */ return xprt->xp_dispatch.process_cb(req); } if (req->rq_msg.rm_direction == REPLY) { /* reply header (xprt OK) */ return clnt_req_process_reply(xprt->xp_parent, req); } __warnx(TIRPC_DEBUG_FLAG_WARN, "%s: %p fd %d failed direction %" PRIu32 " (will set dead)", __func__, __func__, xprt, xprt->xp_fd, req->rq_msg.rm_direction); return (XPRT_DIED); }
static bool svc_rdma_recv(SVCXPRT *xprt, struct svc_req *req) { struct rpc_rdma_cbc *cbc = req->rq_context; XDR *xdrs = cbc->holdq.xdrs; __warnx(TIRPC_DEBUG_FLAG_SVC_RDMA, "%s() xprt %p cbc %p incoming xdr %p\n", __func__, xprt, cbc, xdrs); req->rq_msg = alloc_rpc_msg(); if (!xdr_rdma_svc_recv(cbc, 0)){ __warnx(TIRPC_DEBUG_FLAG_SVC_RDMA, "%s: xdr_rdma_svc_recv failed", __func__); return (FALSE); } xdrs->x_op = XDR_DECODE; /* No need, already positioned to beginning ... XDR_SETPOS(xdrs, 0); */ if (!xdr_dplx_decode(xdrs, req->rq_msg)) { __warnx(TIRPC_DEBUG_FLAG_SVC_RDMA, "%s: xdr_dplx_decode failed", __func__); return (FALSE); } req->rq_xprt = xprt; req->rq_prog = req->rq_msg->rm_call.cb_prog; req->rq_vers = req->rq_msg->rm_call.cb_vers; req->rq_proc = req->rq_msg->rm_call.cb_proc; req->rq_xid = req->rq_msg->rm_xid; req->rq_clntcred = req->rq_msg->rq_cred_body; /* the checksum */ req->rq_cksum = 0; return (TRUE); }