Lines Matching refs:ct

134 	struct ct_data *ct = NULL;	/* client handle */  in clnt_vc_create()  local
150 ct = (struct ct_data *)mem_alloc(sizeof (*ct)); in clnt_vc_create()
152 mtx_init(&ct->ct_lock, "ct->ct_lock", NULL, MTX_DEF); in clnt_vc_create()
153 ct->ct_threads = 0; in clnt_vc_create()
154 ct->ct_closing = FALSE; in clnt_vc_create()
155 ct->ct_closed = FALSE; in clnt_vc_create()
156 ct->ct_upcallrefs = 0; in clnt_vc_create()
157 ct->ct_rcvstate = RPCRCVSTATE_NORMAL; in clnt_vc_create()
214 ct->ct_closeit = FALSE; in clnt_vc_create()
219 ct->ct_socket = so; in clnt_vc_create()
220 ct->ct_wait.tv_sec = -1; in clnt_vc_create()
221 ct->ct_wait.tv_usec = -1; in clnt_vc_create()
222 memcpy(&ct->ct_addr, raddr, raddr->sa_len); in clnt_vc_create()
228 ct->ct_xid = ((uint32_t)++disrupt) ^ __RPC_GETXID(&now); in clnt_vc_create()
229 call_msg.rm_xid = ct->ct_xid; in clnt_vc_create()
238 xdrmem_create(&xdrs, ct->ct_mcallc, MCALL_MSG_SIZE, in clnt_vc_create()
242 ct->ct_mpos = XDR_GETPOS(&xdrs); in clnt_vc_create()
244 ct->ct_waitchan = "rpcrecv"; in clnt_vc_create()
245 ct->ct_waitflag = 0; in clnt_vc_create()
253 error = soreserve(ct->ct_socket, sendsz, recvsz); in clnt_vc_create()
258 cl->cl_private = ct; in clnt_vc_create()
261 SOCK_RECVBUF_LOCK(ct->ct_socket); in clnt_vc_create()
262 soupcall_set(ct->ct_socket, SO_RCV, clnt_vc_soupcall, ct); in clnt_vc_create()
263 SOCK_RECVBUF_UNLOCK(ct->ct_socket); in clnt_vc_create()
265 ct->ct_raw = NULL; in clnt_vc_create()
266 ct->ct_record = NULL; in clnt_vc_create()
267 ct->ct_record_resid = 0; in clnt_vc_create()
268 ct->ct_tlsstate = RPCTLS_NONE; in clnt_vc_create()
269 TAILQ_INIT(&ct->ct_pending); in clnt_vc_create()
273 mtx_destroy(&ct->ct_lock); in clnt_vc_create()
274 mem_free(ct, sizeof (struct ct_data)); in clnt_vc_create()
289 struct ct_data *ct = (struct ct_data *) cl->cl_private; in clnt_vc_call() local
308 mtx_lock(&ct->ct_lock); in clnt_vc_call()
310 if (ct->ct_closing || ct->ct_closed) { in clnt_vc_call()
311 mtx_unlock(&ct->ct_lock); in clnt_vc_call()
315 ct->ct_threads++; in clnt_vc_call()
322 errp = &ct->ct_error; in clnt_vc_call()
328 if (ct->ct_wait.tv_usec == -1) { in clnt_vc_call()
331 timeout = ct->ct_wait; /* use default timeout */ in clnt_vc_call()
340 mtx_assert(&ct->ct_lock, MA_OWNED); in clnt_vc_call()
341 if (ct->ct_closing || ct->ct_closed) { in clnt_vc_call()
342 ct->ct_threads--; in clnt_vc_call()
343 wakeup(ct); in clnt_vc_call()
344 mtx_unlock(&ct->ct_lock); in clnt_vc_call()
349 ct->ct_xid++; in clnt_vc_call()
350 xid = ct->ct_xid; in clnt_vc_call()
352 mtx_unlock(&ct->ct_lock); in clnt_vc_call()
359 KASSERT(ct->ct_mpos + sizeof(uint32_t) <= MHLEN, in clnt_vc_call()
361 bcopy(ct->ct_mcallc, mreq->m_data, ct->ct_mpos); in clnt_vc_call()
362 mreq->m_len = ct->ct_mpos; in clnt_vc_call()
377 mtx_lock(&ct->ct_lock); in clnt_vc_call()
390 mtx_lock(&ct->ct_lock); in clnt_vc_call()
399 if (ct->ct_error.re_status == RPC_CANTRECV) { in clnt_vc_call()
400 if (errp != &ct->ct_error) { in clnt_vc_call()
401 errp->re_errno = ct->ct_error.re_errno; in clnt_vc_call()
409 while ((ct->ct_rcvstate & (RPCRCVSTATE_NORMAL | in clnt_vc_call()
411 msleep(&ct->ct_rcvstate, &ct->ct_lock, 0, "rpcrcvst", hz); in clnt_vc_call()
413 TAILQ_INSERT_TAIL(&ct->ct_pending, cr, cr_link); in clnt_vc_call()
414 mtx_unlock(&ct->ct_lock); in clnt_vc_call()
416 if (ct->ct_tlsstate > RPCTLS_NONE) { in clnt_vc_call()
431 error = sosend(ct->ct_socket, NULL, NULL, mreq, NULL, 0, curthread); in clnt_vc_call()
434 (ct->ct_waitflag & PCATCH) == 0 && trycnt-- > 0)) { in clnt_vc_call()
435 SOCK_SENDBUF_LOCK(ct->ct_socket); in clnt_vc_call()
436 sbwait(ct->ct_socket, SO_SND); in clnt_vc_call()
437 SOCK_SENDBUF_UNLOCK(ct->ct_socket); in clnt_vc_call()
439 mtx_lock(&ct->ct_lock); in clnt_vc_call()
440 TAILQ_REMOVE(&ct->ct_pending, cr, cr_link); in clnt_vc_call()
442 mtx_unlock(&ct->ct_lock); in clnt_vc_call()
444 mtx_lock(&ct->ct_lock); in clnt_vc_call()
454 mtx_lock(&ct->ct_lock); in clnt_vc_call()
456 TAILQ_REMOVE(&ct->ct_pending, cr, cr_link); in clnt_vc_call()
468 TAILQ_REMOVE(&ct->ct_pending, cr, cr_link); in clnt_vc_call()
474 TAILQ_REMOVE(&ct->ct_pending, cr, cr_link); in clnt_vc_call()
482 TAILQ_REMOVE(&ct->ct_pending, cr, cr_link); in clnt_vc_call()
487 error = msleep(cr, &ct->ct_lock, ct->ct_waitflag, ct->ct_waitchan, in clnt_vc_call()
490 TAILQ_REMOVE(&ct->ct_pending, cr, cr_link); in clnt_vc_call()
529 mtx_unlock(&ct->ct_lock); in clnt_vc_call()
568 mtx_lock(&ct->ct_lock); in clnt_vc_call()
577 mtx_lock(&ct->ct_lock); in clnt_vc_call()
579 mtx_assert(&ct->ct_lock, MA_OWNED); in clnt_vc_call()
589 ct->ct_threads--; in clnt_vc_call()
590 if (ct->ct_closing) in clnt_vc_call()
591 wakeup(ct); in clnt_vc_call()
593 mtx_unlock(&ct->ct_lock); in clnt_vc_call()
606 struct ct_data *ct = (struct ct_data *) cl->cl_private; in clnt_vc_geterr() local
608 *errp = ct->ct_error; in clnt_vc_geterr()
632 struct ct_data *ct = (struct ct_data *)cl->cl_private; in clnt_vc_control() local
638 mtx_lock(&ct->ct_lock); in clnt_vc_control()
642 ct->ct_closeit = TRUE; in clnt_vc_control()
643 mtx_unlock(&ct->ct_lock); in clnt_vc_control()
646 ct->ct_closeit = FALSE; in clnt_vc_control()
647 mtx_unlock(&ct->ct_lock); in clnt_vc_control()
655 mtx_unlock(&ct->ct_lock); in clnt_vc_control()
661 mtx_unlock(&ct->ct_lock); in clnt_vc_control()
664 ct->ct_wait = *(struct timeval *)infop; in clnt_vc_control()
667 *(struct timeval *)infop = ct->ct_wait; in clnt_vc_control()
670 (void) memcpy(info, &ct->ct_addr, (size_t)ct->ct_addr.ss_len); in clnt_vc_control()
677 memcpy(info, &ct->ct_addr, ct->ct_addr.ss_len); in clnt_vc_control()
680 mtx_unlock(&ct->ct_lock); in clnt_vc_control()
683 *(uint32_t *)info = ct->ct_xid; in clnt_vc_control()
688 ct->ct_xid = *(uint32_t *)info - 1; in clnt_vc_control()
698 ntohl(*(uint32_t *)(void *)(ct->ct_mcallc + in clnt_vc_control()
703 *(uint32_t *)(void *)(ct->ct_mcallc + in clnt_vc_control()
716 ntohl(*(uint32_t *)(void *)(ct->ct_mcallc + in clnt_vc_control()
721 *(uint32_t *)(void *)(ct->ct_mcallc + in clnt_vc_control()
727 ct->ct_waitchan = (const char *)info; in clnt_vc_control()
731 *(const char **) info = ct->ct_waitchan; in clnt_vc_control()
736 ct->ct_waitflag = PCATCH; in clnt_vc_control()
738 ct->ct_waitflag = 0; in clnt_vc_control()
742 if (ct->ct_waitflag) in clnt_vc_control()
750 if (ct->ct_backchannelxprt == NULL) { in clnt_vc_control()
752 xprt->xp_p2 = ct; in clnt_vc_control()
753 if (ct->ct_tlsstate > RPCTLS_NONE) in clnt_vc_control()
755 ct->ct_backchannelxprt = xprt; in clnt_vc_control()
760 ct->ct_tlsstate = *(int *)info; in clnt_vc_control()
761 if (ct->ct_tlsstate == RPCTLS_COMPLETE) { in clnt_vc_control()
764 mtx_unlock(&ct->ct_lock); in clnt_vc_control()
771 mtx_unlock(&ct->ct_lock); in clnt_vc_control()
776 ct->ct_rcvstate &= ~RPCRCVSTATE_NORMAL; in clnt_vc_control()
777 ct->ct_rcvstate |= RPCRCVSTATE_TLSHANDSHAKE; in clnt_vc_control()
779 ct->ct_rcvstate &= ~RPCRCVSTATE_TLSHANDSHAKE; in clnt_vc_control()
780 ct->ct_rcvstate |= RPCRCVSTATE_NORMAL; in clnt_vc_control()
785 mtx_unlock(&ct->ct_lock); in clnt_vc_control()
789 mtx_unlock(&ct->ct_lock); in clnt_vc_control()
796 struct ct_data *ct = (struct ct_data *) cl->cl_private; in clnt_vc_close() local
799 mtx_lock(&ct->ct_lock); in clnt_vc_close()
801 if (ct->ct_closed) { in clnt_vc_close()
802 mtx_unlock(&ct->ct_lock); in clnt_vc_close()
806 if (ct->ct_closing) { in clnt_vc_close()
807 while (ct->ct_closing) in clnt_vc_close()
808 msleep(ct, &ct->ct_lock, 0, "rpcclose", 0); in clnt_vc_close()
809 KASSERT(ct->ct_closed, ("client should be closed")); in clnt_vc_close()
810 mtx_unlock(&ct->ct_lock); in clnt_vc_close()
814 if (ct->ct_socket) { in clnt_vc_close()
815 ct->ct_closing = TRUE; in clnt_vc_close()
816 mtx_unlock(&ct->ct_lock); in clnt_vc_close()
818 SOCK_RECVBUF_LOCK(ct->ct_socket); in clnt_vc_close()
819 if (ct->ct_socket->so_rcv.sb_upcall != NULL) { in clnt_vc_close()
820 soupcall_clear(ct->ct_socket, SO_RCV); in clnt_vc_close()
821 clnt_vc_upcallsdone(ct); in clnt_vc_close()
823 SOCK_RECVBUF_UNLOCK(ct->ct_socket); in clnt_vc_close()
829 mtx_lock(&ct->ct_lock); in clnt_vc_close()
830 TAILQ_FOREACH(cr, &ct->ct_pending, cr_link) { in clnt_vc_close()
836 while (ct->ct_threads) in clnt_vc_close()
837 msleep(ct, &ct->ct_lock, 0, "rpcclose", 0); in clnt_vc_close()
840 ct->ct_closing = FALSE; in clnt_vc_close()
841 ct->ct_closed = TRUE; in clnt_vc_close()
842 wakeup(&ct->ct_tlsstate); in clnt_vc_close()
843 mtx_unlock(&ct->ct_lock); in clnt_vc_close()
844 wakeup(ct); in clnt_vc_close()
850 struct ct_data *ct = (struct ct_data *) cl->cl_private; in clnt_vc_destroy() local
857 mtx_lock(&ct->ct_lock); in clnt_vc_destroy()
858 xprt = ct->ct_backchannelxprt; in clnt_vc_destroy()
859 ct->ct_backchannelxprt = NULL; in clnt_vc_destroy()
861 mtx_unlock(&ct->ct_lock); /* To avoid a LOR. */ in clnt_vc_destroy()
863 mtx_lock(&ct->ct_lock); in clnt_vc_destroy()
870 while ((ct->ct_rcvstate & RPCRCVSTATE_UPCALLTHREAD) != 0) in clnt_vc_destroy()
871 msleep(&ct->ct_tlsstate, &ct->ct_lock, 0, in clnt_vc_destroy()
873 mtx_unlock(&ct->ct_lock); in clnt_vc_destroy()
874 mtx_destroy(&ct->ct_lock); in clnt_vc_destroy()
876 so = ct->ct_closeit ? ct->ct_socket : NULL; in clnt_vc_destroy()
886 switch (ct->ct_tlsstate) { in clnt_vc_destroy()
902 m_freem(ct->ct_record); in clnt_vc_destroy()
903 m_freem(ct->ct_raw); in clnt_vc_destroy()
904 mem_free(ct, sizeof(struct ct_data)); in clnt_vc_destroy()
926 struct ct_data *ct = (struct ct_data *) arg; in clnt_vc_soupcall() local
943 mtx_lock(&ct->ct_lock); in clnt_vc_soupcall()
944 if ((ct->ct_rcvstate & (RPCRCVSTATE_NORMAL | in clnt_vc_soupcall()
947 if ((ct->ct_rcvstate & (RPCRCVSTATE_UPCALLNEEDED | in clnt_vc_soupcall()
949 ct->ct_rcvstate |= RPCRCVSTATE_SOUPCALLNEEDED; in clnt_vc_soupcall()
950 mtx_unlock(&ct->ct_lock); in clnt_vc_soupcall()
953 mtx_unlock(&ct->ct_lock); in clnt_vc_soupcall()
962 if (ct->ct_upcallrefs > 0) in clnt_vc_soupcall()
964 ct->ct_upcallrefs++; in clnt_vc_soupcall()
975 if (ct->ct_tlsstate > RPCTLS_NONE && (ct->ct_rcvstate & in clnt_vc_soupcall()
1010 if (ct->ct_tlsstate > RPCTLS_NONE && error == ENXIO) { in clnt_vc_soupcall()
1012 mtx_lock(&ct->ct_lock); in clnt_vc_soupcall()
1013 ct->ct_rcvstate |= RPCRCVSTATE_UPCALLNEEDED; in clnt_vc_soupcall()
1018 wakeup(&ct->ct_tlsstate); in clnt_vc_soupcall()
1019 mtx_unlock(&ct->ct_lock); in clnt_vc_soupcall()
1040 mtx_lock(&ct->ct_lock); in clnt_vc_soupcall()
1041 ct->ct_rcvstate &= in clnt_vc_soupcall()
1043 ct->ct_rcvstate |= RPCRCVSTATE_NORMAL; in clnt_vc_soupcall()
1044 mtx_unlock(&ct->ct_lock); in clnt_vc_soupcall()
1051 if (ct->ct_raw != NULL) in clnt_vc_soupcall()
1052 m_last(ct->ct_raw)->m_next = m; in clnt_vc_soupcall()
1054 ct->ct_raw = m; in clnt_vc_soupcall()
1056 rawlen = m_length(ct->ct_raw, NULL); in clnt_vc_soupcall()
1064 if (ct->ct_record_resid == 0) { in clnt_vc_soupcall()
1067 m_copydata(ct->ct_raw, 0, sizeof(uint32_t), in clnt_vc_soupcall()
1070 ct->ct_record_resid = header & 0x7fffffff; in clnt_vc_soupcall()
1071 ct->ct_record_eor = ((header & 0x80000000) != 0); in clnt_vc_soupcall()
1072 m_adj(ct->ct_raw, sizeof(uint32_t)); in clnt_vc_soupcall()
1081 if (rawlen <= ct->ct_record_resid) { in clnt_vc_soupcall()
1082 if (ct->ct_record != NULL) in clnt_vc_soupcall()
1083 m_last(ct->ct_record)->m_next = in clnt_vc_soupcall()
1084 ct->ct_raw; in clnt_vc_soupcall()
1086 ct->ct_record = ct->ct_raw; in clnt_vc_soupcall()
1087 ct->ct_raw = NULL; in clnt_vc_soupcall()
1088 ct->ct_record_resid -= rawlen; in clnt_vc_soupcall()
1091 m = m_split(ct->ct_raw, ct->ct_record_resid, in clnt_vc_soupcall()
1095 if (ct->ct_record != NULL) in clnt_vc_soupcall()
1096 m_last(ct->ct_record)->m_next = in clnt_vc_soupcall()
1097 ct->ct_raw; in clnt_vc_soupcall()
1099 ct->ct_record = ct->ct_raw; in clnt_vc_soupcall()
1100 rawlen -= ct->ct_record_resid; in clnt_vc_soupcall()
1101 ct->ct_record_resid = 0; in clnt_vc_soupcall()
1102 ct->ct_raw = m; in clnt_vc_soupcall()
1104 if (ct->ct_record_resid > 0) in clnt_vc_soupcall()
1111 if (ct->ct_record_eor) { in clnt_vc_soupcall()
1117 if (ct->ct_record->m_len < in clnt_vc_soupcall()
1119 m_length(ct->ct_record, NULL) < in clnt_vc_soupcall()
1136 m_copydata(ct->ct_record, 0, in clnt_vc_soupcall()
1146 mtx_lock(&ct->ct_lock); in clnt_vc_soupcall()
1147 xprt = ct->ct_backchannelxprt; in clnt_vc_soupcall()
1149 mtx_unlock(&ct->ct_lock); in clnt_vc_soupcall()
1151 m_freem(ct->ct_record); in clnt_vc_soupcall()
1152 ct->ct_record = NULL; in clnt_vc_soupcall()
1167 ct->ct_record; in clnt_vc_soupcall()
1170 ct->ct_record; in clnt_vc_soupcall()
1171 ct->ct_record->m_nextpkt = in clnt_vc_soupcall()
1173 ct->ct_record = NULL; in clnt_vc_soupcall()
1175 mtx_unlock(&ct->ct_lock); in clnt_vc_soupcall()
1178 mtx_lock(&ct->ct_lock); in clnt_vc_soupcall()
1180 TAILQ_FOREACH(cr, &ct->ct_pending, in clnt_vc_soupcall()
1196 ct->ct_record; in clnt_vc_soupcall()
1203 mtx_unlock(&ct->ct_lock); in clnt_vc_soupcall()
1206 m_freem(ct->ct_record); in clnt_vc_soupcall()
1207 ct->ct_record = NULL; in clnt_vc_soupcall()
1221 mtx_lock(&ct->ct_lock); in clnt_vc_soupcall()
1222 ct->ct_error.re_status = RPC_CANTRECV; in clnt_vc_soupcall()
1223 ct->ct_error.re_errno = error; in clnt_vc_soupcall()
1224 TAILQ_FOREACH(cr, &ct->ct_pending, cr_link) { in clnt_vc_soupcall()
1228 mtx_unlock(&ct->ct_lock); in clnt_vc_soupcall()
1231 ct->ct_upcallrefs--; in clnt_vc_soupcall()
1232 if (ct->ct_upcallrefs < 0) in clnt_vc_soupcall()
1234 if (ct->ct_upcallrefs == 0) in clnt_vc_soupcall()
1235 wakeup(&ct->ct_upcallrefs); in clnt_vc_soupcall()
1243 clnt_vc_upcallsdone(struct ct_data *ct) in clnt_vc_upcallsdone() argument
1246 SOCK_RECVBUF_LOCK_ASSERT(ct->ct_socket); in clnt_vc_upcallsdone()
1248 while (ct->ct_upcallrefs > 0) in clnt_vc_upcallsdone()
1249 (void) msleep(&ct->ct_upcallrefs, in clnt_vc_upcallsdone()
1250 SOCKBUF_MTX(&ct->ct_socket->so_rcv), 0, "rpcvcup", 0); in clnt_vc_upcallsdone()
1261 struct ct_data *ct = (struct ct_data *)cl->cl_private; in clnt_vc_dotlsupcall() local
1265 CURVNET_SET(ct->ct_socket->so_vnet); in clnt_vc_dotlsupcall()
1266 mtx_lock(&ct->ct_lock); in clnt_vc_dotlsupcall()
1267 ct->ct_rcvstate |= RPCRCVSTATE_UPCALLTHREAD; in clnt_vc_dotlsupcall()
1268 while (!ct->ct_closed) { in clnt_vc_dotlsupcall()
1269 if ((ct->ct_rcvstate & RPCRCVSTATE_UPCALLNEEDED) != 0) { in clnt_vc_dotlsupcall()
1270 ct->ct_rcvstate &= ~RPCRCVSTATE_UPCALLNEEDED; in clnt_vc_dotlsupcall()
1271 ct->ct_rcvstate |= RPCRCVSTATE_UPCALLINPROG; in clnt_vc_dotlsupcall()
1272 if (ct->ct_tlsstate == RPCTLS_COMPLETE) { in clnt_vc_dotlsupcall()
1273 mtx_unlock(&ct->ct_lock); in clnt_vc_dotlsupcall()
1274 ret = rpctls_cl_handlerecord(ct->ct_socket, in clnt_vc_dotlsupcall()
1276 mtx_lock(&ct->ct_lock); in clnt_vc_dotlsupcall()
1278 ct->ct_rcvstate &= ~RPCRCVSTATE_UPCALLINPROG; in clnt_vc_dotlsupcall()
1280 ct->ct_rcvstate |= RPCRCVSTATE_NORMAL; in clnt_vc_dotlsupcall()
1282 ct->ct_rcvstate |= RPCRCVSTATE_NONAPPDATA; in clnt_vc_dotlsupcall()
1283 wakeup(&ct->ct_rcvstate); in clnt_vc_dotlsupcall()
1285 if ((ct->ct_rcvstate & RPCRCVSTATE_SOUPCALLNEEDED) != 0) { in clnt_vc_dotlsupcall()
1286 ct->ct_rcvstate &= ~RPCRCVSTATE_SOUPCALLNEEDED; in clnt_vc_dotlsupcall()
1287 mtx_unlock(&ct->ct_lock); in clnt_vc_dotlsupcall()
1288 SOCK_RECVBUF_LOCK(ct->ct_socket); in clnt_vc_dotlsupcall()
1289 clnt_vc_soupcall(ct->ct_socket, ct, M_NOWAIT); in clnt_vc_dotlsupcall()
1290 SOCK_RECVBUF_UNLOCK(ct->ct_socket); in clnt_vc_dotlsupcall()
1291 mtx_lock(&ct->ct_lock); in clnt_vc_dotlsupcall()
1293 msleep(&ct->ct_tlsstate, &ct->ct_lock, 0, "clntvcdu", hz); in clnt_vc_dotlsupcall()
1295 ct->ct_rcvstate &= ~RPCRCVSTATE_UPCALLTHREAD; in clnt_vc_dotlsupcall()
1296 wakeup(&ct->ct_tlsstate); in clnt_vc_dotlsupcall()
1297 mtx_unlock(&ct->ct_lock); in clnt_vc_dotlsupcall()