Lines Matching +full:3 +full:- +full:wire

40  * Server side for connection-oriented RPC in the kernel.
105 svc_cots_kfreeres, /* Destroy pre-serialized response header */
107 svc_cots_kstart, /* Tell `ready-to-receive' to rpcmod */
116 * Kept in xprt->xp_p2.
127 * Kept in clone_xprt->xp_p2buf.
130 mblk_t *cd_mp; /* pre-allocated reply message */
157 ((struct cots_master_data *)(clone_xprt)->xp_master->xp_p2)->cmd_stats
159 atomic_inc_64(&(s)->x.value.ui64)
170 * unknown (tinfo->ADDR_size == -1). For this case, it is
175 * 3. if it works then everything is ok
179 #define T_UNKNOWNADDRSIZE (-1)
205 rpcstat = zone_getspecific(rpcstat_zone_key, curproc->p_zone); in svc_cots_kcreate()
215 if ((tinfo->TIDU_size > COTS_MAX_ALLOCSIZE) || in svc_cots_kcreate()
216 (tinfo->TIDU_size <= 0)) in svc_cots_kcreate()
217 xprt->xp_msg_size = COTS_MAX_ALLOCSIZE; in svc_cots_kcreate()
219 xprt->xp_msg_size = tinfo->TIDU_size - in svc_cots_kcreate()
220 (tinfo->TIDU_size % BYTES_PER_XDR_UNIT); in svc_cots_kcreate()
223 xprt->xp_ops = &svc_cots_op; in svc_cots_kcreate()
224 xprt->xp_p2 = (caddr_t)cmd; in svc_cots_kcreate()
225 cmd->cmd_xprt_started = 0; in svc_cots_kcreate()
226 cmd->cmd_stats = rpcstat->rpc_cots_server; in svc_cots_kcreate()
229 getaddr.ic_timout = -1; in svc_cots_kcreate()
232 ack_p->PRIM_type = T_ADDR_REQ; in svc_cots_kcreate()
234 err = strioctl(fp->f_vnode, I_STR, (intptr_t)&getaddr, in svc_cots_kcreate()
243 xprt->xp_rtaddr.maxlen = ack_p->REMADDR_length; in svc_cots_kcreate()
244 xprt->xp_rtaddr.len = ack_p->REMADDR_length; in svc_cots_kcreate()
245 cmd->cmd_src_addr = xprt->xp_rtaddr.buf = in svc_cots_kcreate()
246 (char *)ack_p + ack_p->REMADDR_offset; in svc_cots_kcreate()
248 xprt->xp_lcladdr.maxlen = ack_p->LOCADDR_length; in svc_cots_kcreate()
249 xprt->xp_lcladdr.len = ack_p->LOCADDR_length; in svc_cots_kcreate()
250 xprt->xp_lcladdr.buf = (char *)ack_p + ack_p->LOCADDR_offset; in svc_cots_kcreate()
279 struct cots_master_data *cmd = (struct cots_master_data *)xprt->xp_p2; in svc_cots_kdestroy()
283 if (xprt->xp_netid) in svc_cots_kdestroy()
284 kmem_free(xprt->xp_netid, strlen(xprt->xp_netid) + 1); in svc_cots_kdestroy()
285 if (xprt->xp_addrmask.maxlen) in svc_cots_kdestroy()
286 kmem_free(xprt->xp_addrmask.buf, xprt->xp_addrmask.maxlen); in svc_cots_kdestroy()
288 mutex_destroy(&xprt->xp_req_lock); in svc_cots_kdestroy()
289 mutex_destroy(&xprt->xp_thread_lock); in svc_cots_kdestroy()
304 struct cots_master_data *cmd = (struct cots_master_data *)xprt->xp_p2; in svc_cots_kstart()
306 if (cmd->cmd_xprt_started == 0) { in svc_cots_kstart()
312 mutex_enter(&xprt->xp_req_lock); in svc_cots_kstart()
313 if (cmd->cmd_xprt_started == 0 && in svc_cots_kstart()
314 xprt->xp_wq != NULL) { in svc_cots_kstart()
315 (*mir_start)(xprt->xp_wq); in svc_cots_kstart()
316 cmd->cmd_xprt_started = 1; in svc_cots_kstart()
318 mutex_exit(&xprt->xp_req_lock); in svc_cots_kstart()
323 * Transport-type specific part of svc_xprt_cleanup().
328 cots_data_t *cd = (cots_data_t *)clone_xprt->xp_p2buf; in svc_cots_kclone_destroy()
330 if (cd->cd_req_mp) { in svc_cots_kclone_destroy()
331 freemsg(cd->cd_req_mp); in svc_cots_kclone_destroy()
332 cd->cd_req_mp = (mblk_t *)0; in svc_cots_kclone_destroy()
334 ASSERT(cd->cd_mp == NULL); in svc_cots_kclone_destroy()
347 *tattr = (void *)&clone_xprt->xp_master->xp_addrmask; in svc_cots_ktattrs()
358 cots_data_t *cd = (cots_data_t *)clone_xprt->xp_p2buf; in svc_cots_krecv()
359 XDR *xdrs = &clone_xprt->xp_xdrin; in svc_cots_krecv()
369 if (mp->b_datap->db_type != M_DATA) { in svc_cots_krecv()
371 mp->b_datap->db_type); in svc_cots_krecv()
391 clone_xprt->xp_xid = msg->rm_xid; in svc_cots_krecv()
392 cd->cd_req_mp = mp; in svc_cots_krecv()
416 cots_data_t *cd = (cots_data_t *)clone_xprt->xp_p2buf; in svc_cots_ksend()
417 XDR *xdrs = &(clone_xprt->xp_xdrout); in svc_cots_ksend()
434 if (msg->rm_reply.rp_stat == MSG_ACCEPTED && in svc_cots_ksend()
435 msg->rm_reply.rp_acpt.ar_stat == SUCCESS) { in svc_cots_ksend()
436 if ((xdr_results = msg->acpted_rply.ar_results.proc) != NULL) { in svc_cots_ksend()
438 xdr_location = msg->acpted_rply.ar_results.where; in svc_cots_ksend()
439 msg->acpted_rply.ar_results.proc = xdr_void; in svc_cots_ksend()
440 msg->acpted_rply.ar_results.where = NULL; in svc_cots_ksend()
444 mp = cd->cd_mp; in svc_cots_ksend()
447 * The program above pre-allocated an mblk and put in svc_cots_ksend()
450 cd->cd_mp = (mblk_t *)NULL; in svc_cots_ksend()
452 (!has_args || SVCAUTH_WRAP(&clone_xprt->xp_auth, xdrs, in svc_cots_ksend()
467 len = MSG_OFFSET + clone_xprt->xp_msg_size; in svc_cots_ksend()
488 xdrmblk_init(xdrs, mp, XDR_ENCODE, clone_xprt->xp_msg_size); in svc_cots_ksend()
491 ASSERT(mp->b_rptr == mp->b_datap->db_base); in svc_cots_ksend()
499 * ~1400 byte segments over the wire. If allocb() gives us a 2k in svc_cots_ksend()
501 * protocol module may generate 3 segments over the wire: in svc_cots_ksend()
502 * 1460 bytes for the first, 448 (2048 - 1600) for the 2nd, and in svc_cots_ksend()
503 * 892 for the 3rd. If we "waste" 448 bytes in the first mblk, in svc_cots_ksend()
509 mp->b_rptr += (mpsize - len); in svc_cots_ksend()
513 * Adjust b_rptr to reserve space for the non-data protocol in svc_cots_ksend()
517 mp->b_rptr += (MSG_OFFSET + RM_HDR_SIZE); in svc_cots_ksend()
519 XDR_SETPOS(xdrs, (uint_t)(mp->b_rptr - mp->b_datap->db_base)); in svc_cots_ksend()
520 ASSERT(mp->b_wptr == mp->b_rptr); in svc_cots_ksend()
522 msg->rm_xid = clone_xprt->xp_xid; in svc_cots_ksend()
527 (!has_args || SVCAUTH_WRAP(&clone_xprt->xp_auth, xdrs, in svc_cots_ksend()
543 put(clone_xprt->xp_wq, mp); in svc_cots_ksend()
553 if (xdrs->x_public) { in svc_cots_ksend()
555 (**((int (**)())xdrs->x_public))(xdrs->x_public); in svc_cots_ksend()
570 return (SVCAUTH_UNWRAP(&clone_xprt->xp_auth, &clone_xprt->xp_xdrin, in svc_cots_kgetargs()
578 cots_data_t *cd = (cots_data_t *)clone_xprt->xp_p2buf; in svc_cots_kfreeargs()
580 XDR *xdrs = &clone_xprt->xp_xdrin; in svc_cots_kfreeargs()
591 xdrs->x_op = XDR_FREE; in svc_cots_kfreeargs()
598 if ((mp = cd->cd_req_mp) != NULL) { in svc_cots_kfreeargs()
599 cd->cd_req_mp = (mblk_t *)0; in svc_cots_kfreeargs()
610 cots_data_t *cd = (cots_data_t *)clone_xprt->xp_p2buf; in svc_cots_kgetres()
611 XDR *xdrs = &clone_xprt->xp_xdrout; in svc_cots_kgetres()
621 len = MSG_OFFSET + clone_xprt->xp_msg_size; in svc_cots_kgetres()
636 xdrmblk_init(xdrs, mp, XDR_ENCODE, clone_xprt->xp_msg_size); in svc_cots_kgetres()
639 ASSERT(mp->b_rptr == mp->b_datap->db_base); in svc_cots_kgetres()
647 * ~1400 byte segments over the wire. If allocb() gives us a 2k in svc_cots_kgetres()
649 * protocol module may generate 3 segments over the wire: in svc_cots_kgetres()
650 * 1460 bytes for the first, 448 (2048 - 1600) for the 2nd, and in svc_cots_kgetres()
651 * 892 for the 3rd. If we "waste" 448 bytes in the first mblk, in svc_cots_kgetres()
657 mp->b_rptr += (mpsize - len); in svc_cots_kgetres()
661 * Adjust b_rptr to reserve space for the non-data protocol in svc_cots_kgetres()
665 mp->b_rptr += (MSG_OFFSET + RM_HDR_SIZE); in svc_cots_kgetres()
667 XDR_SETPOS(xdrs, (uint_t)(mp->b_rptr - mp->b_datap->db_base)); in svc_cots_kgetres()
668 ASSERT(mp->b_wptr == mp->b_rptr); in svc_cots_kgetres()
673 rply.rm_xid = clone_xprt->xp_xid; in svc_cots_kgetres()
676 rply.acpted_rply.ar_verf = clone_xprt->xp_verf; in svc_cots_kgetres()
688 ASSERT(cd->cd_mp == NULL); in svc_cots_kgetres()
691 cd->cd_mp = mp; in svc_cots_kgetres()
702 cd = (cots_data_t *)clone_xprt->xp_p2buf; in svc_cots_kfreeres()
703 if ((mp = cd->cd_mp) != NULL) { in svc_cots_kfreeres()
704 XDR_DESTROY(&clone_xprt->xp_xdrout); in svc_cots_kfreeres()
705 cd->cd_mp = (mblk_t *)NULL; in svc_cots_kfreeres()
711 * the dup cacheing routines below provide a cache of non-failure
713 * retransmissions and re-send a non-failure response.
730 #define DRHASH(dr) XIDHASH((dr)->dr_xid)
731 #define REQTOXID(req) ((req)->rq_xprt->xp_xid)
743 * cotsdrmru->dr_next == drlru
751 * Changes must be communicated to contract-2003-523@sun.com
760 * whether the response free routine is cached in the dupreq - in which case
768 struct rpc_cots_server *stats = CLONE2STATS(req->rq_xprt); in svc_cots_kdup()
782 if (dr->dr_xid == xid && in svc_cots_kdup()
783 dr->dr_proc == req->rq_proc && in svc_cots_kdup()
784 dr->dr_prog == req->rq_prog && in svc_cots_kdup()
785 dr->dr_vers == req->rq_vers && in svc_cots_kdup()
786 dr->dr_addr.len == req->rq_xprt->xp_rtaddr.len && in svc_cots_kdup()
787 bcmp((caddr_t)dr->dr_addr.buf, in svc_cots_kdup()
788 (caddr_t)req->rq_xprt->xp_rtaddr.buf, in svc_cots_kdup()
789 dr->dr_addr.len) == 0) { in svc_cots_kdup()
790 status = dr->dr_status; in svc_cots_kdup()
792 bcopy(dr->dr_resp.buf, res, size); in svc_cots_kdup()
794 *dupcachedp = (dr->dr_resfree != NULL); in svc_cots_kdup()
798 dr->dr_status = DUP_INPROGRESS; in svc_cots_kdup()
808 dr = dr->dr_chain; in svc_cots_kdup()
821 dr->dr_resp.buf = NULL; in svc_cots_kdup()
822 dr->dr_resp.maxlen = 0; in svc_cots_kdup()
823 dr->dr_addr.buf = NULL; in svc_cots_kdup()
824 dr->dr_addr.maxlen = 0; in svc_cots_kdup()
826 dr->dr_next = cotsdrmru->dr_next; in svc_cots_kdup()
827 cotsdrmru->dr_next = dr; in svc_cots_kdup()
829 dr->dr_next = dr; in svc_cots_kdup()
833 dr = cotsdrmru->dr_next; in svc_cots_kdup()
834 while (dr->dr_status == DUP_INPROGRESS) { in svc_cots_kdup()
835 dr = dr->dr_next; in svc_cots_kdup()
836 if (dr == cotsdrmru->dr_next) { in svc_cots_kdup()
843 if (dr->dr_resfree) { in svc_cots_kdup()
844 (*dr->dr_resfree)(dr->dr_resp.buf); in svc_cots_kdup()
847 dr->dr_resfree = NULL; in svc_cots_kdup()
850 dr->dr_xid = REQTOXID(req); in svc_cots_kdup()
851 dr->dr_prog = req->rq_prog; in svc_cots_kdup()
852 dr->dr_vers = req->rq_vers; in svc_cots_kdup()
853 dr->dr_proc = req->rq_proc; in svc_cots_kdup()
854 if (dr->dr_addr.maxlen < req->rq_xprt->xp_rtaddr.len) { in svc_cots_kdup()
855 if (dr->dr_addr.buf != NULL) in svc_cots_kdup()
856 kmem_free(dr->dr_addr.buf, dr->dr_addr.maxlen); in svc_cots_kdup()
857 dr->dr_addr.maxlen = req->rq_xprt->xp_rtaddr.len; in svc_cots_kdup()
858 dr->dr_addr.buf = kmem_alloc(dr->dr_addr.maxlen, KM_NOSLEEP); in svc_cots_kdup()
859 if (dr->dr_addr.buf == NULL) { in svc_cots_kdup()
860 dr->dr_addr.maxlen = 0; in svc_cots_kdup()
861 dr->dr_status = DUP_DROP; in svc_cots_kdup()
866 dr->dr_addr.len = req->rq_xprt->xp_rtaddr.len; in svc_cots_kdup()
867 bcopy(req->rq_xprt->xp_rtaddr.buf, dr->dr_addr.buf, dr->dr_addr.len); in svc_cots_kdup()
868 if (dr->dr_resp.maxlen < size) { in svc_cots_kdup()
869 if (dr->dr_resp.buf != NULL) in svc_cots_kdup()
870 kmem_free(dr->dr_resp.buf, dr->dr_resp.maxlen); in svc_cots_kdup()
871 dr->dr_resp.maxlen = (unsigned int)size; in svc_cots_kdup()
872 dr->dr_resp.buf = kmem_alloc(size, KM_NOSLEEP); in svc_cots_kdup()
873 if (dr->dr_resp.buf == NULL) { in svc_cots_kdup()
874 dr->dr_resp.maxlen = 0; in svc_cots_kdup()
875 dr->dr_status = DUP_DROP; in svc_cots_kdup()
880 dr->dr_status = DUP_INPROGRESS; in svc_cots_kdup()
883 dr->dr_chain = cotsdrhashtbl[drhash]; in svc_cots_kdup()
895 * Changes must be communicated to contract-2003-523@sun.com
904 ASSERT(dr->dr_resfree == NULL); in svc_cots_kdupdone()
906 bcopy(res, dr->dr_resp.buf, size); in svc_cots_kdupdone()
907 dr->dr_resfree = dis_resfree; in svc_cots_kdupdone()
909 dr->dr_status = status; in svc_cots_kdupdone()
928 cotsdrhashstat[drhash]--; in unhash()
930 cotsdrhashtbl[drhash] = drt->dr_chain; in unhash()
932 drtprev->dr_chain = drt->dr_chain; in unhash()
937 drt = drt->dr_chain; in unhash()