1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 /* Copyright (c) 1990 Mentat Inc. */ 26 27 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 28 /* All Rights Reserved */ 29 30 /* 31 * Kernel RPC filtering module 32 */ 33 34 #include <sys/param.h> 35 #include <sys/types.h> 36 #include <sys/stream.h> 37 #include <sys/stropts.h> 38 #include <sys/strsubr.h> 39 #include <sys/tihdr.h> 40 #include <sys/timod.h> 41 #include <sys/tiuser.h> 42 #include <sys/debug.h> 43 #include <sys/signal.h> 44 #include <sys/pcb.h> 45 #include <sys/user.h> 46 #include <sys/errno.h> 47 #include <sys/cred.h> 48 #include <sys/policy.h> 49 #include <sys/inline.h> 50 #include <sys/cmn_err.h> 51 #include <sys/kmem.h> 52 #include <sys/file.h> 53 #include <sys/sysmacros.h> 54 #include <sys/systm.h> 55 #include <sys/t_lock.h> 56 #include <sys/ddi.h> 57 #include <sys/vtrace.h> 58 #include <sys/callb.h> 59 #include <sys/strsun.h> 60 61 #include <sys/strlog.h> 62 #include <rpc/rpc_com.h> 63 #include <inet/common.h> 64 #include <rpc/types.h> 65 #include <sys/time.h> 66 #include <rpc/xdr.h> 67 #include <rpc/auth.h> 68 #include <rpc/clnt.h> 69 #include <rpc/rpc_msg.h> 70 #include <rpc/clnt.h> 71 #include <rpc/svc.h> 72 #include <rpc/rpcsys.h> 73 #include <rpc/rpc_rdma.h> 74 75 /* 76 * This is the loadable module wrapper. 77 */ 78 #include <sys/conf.h> 79 #include <sys/modctl.h> 80 #include <sys/syscall.h> 81 82 extern struct streamtab rpcinfo; 83 84 static struct fmodsw fsw = { 85 "rpcmod", 86 &rpcinfo, 87 D_NEW|D_MP, 88 }; 89 90 /* 91 * Module linkage information for the kernel. 92 */ 93 94 static struct modlstrmod modlstrmod = { 95 &mod_strmodops, "rpc interface str mod", &fsw 96 }; 97 98 /* 99 * For the RPC system call. 100 */ 101 static struct sysent rpcsysent = { 102 2, 103 SE_32RVAL1 | SE_ARGC | SE_NOUNLOAD, 104 rpcsys 105 }; 106 107 static struct modlsys modlsys = { 108 &mod_syscallops, 109 "RPC syscall", 110 &rpcsysent 111 }; 112 113 #ifdef _SYSCALL32_IMPL 114 static struct modlsys modlsys32 = { 115 &mod_syscallops32, 116 "32-bit RPC syscall", 117 &rpcsysent 118 }; 119 #endif /* _SYSCALL32_IMPL */ 120 121 static struct modlinkage modlinkage = { 122 MODREV_1, 123 { 124 &modlsys, 125 #ifdef _SYSCALL32_IMPL 126 &modlsys32, 127 #endif 128 &modlstrmod, 129 NULL 130 } 131 }; 132 133 int 134 _init(void) 135 { 136 int error = 0; 137 callb_id_t cid; 138 int status; 139 140 svc_init(); 141 clnt_init(); 142 cid = callb_add(connmgr_cpr_reset, 0, CB_CL_CPR_RPC, "rpc"); 143 144 if (error = mod_install(&modlinkage)) { 145 /* 146 * Could not install module, cleanup previous 147 * initialization work. 148 */ 149 clnt_fini(); 150 if (cid != NULL) 151 (void) callb_delete(cid); 152 153 return (error); 154 } 155 156 /* 157 * Load up the RDMA plugins and initialize the stats. Even if the 158 * plugins loadup fails, but rpcmod was successfully installed the 159 * counters still get initialized. 160 */ 161 rw_init(&rdma_lock, NULL, RW_DEFAULT, NULL); 162 mutex_init(&rdma_modload_lock, NULL, MUTEX_DEFAULT, NULL); 163 164 cv_init(&rdma_wait.svc_cv, NULL, CV_DEFAULT, NULL); 165 mutex_init(&rdma_wait.svc_lock, NULL, MUTEX_DEFAULT, NULL); 166 167 mt_kstat_init(); 168 169 /* 170 * Get our identification into ldi. This is used for loading 171 * other modules, e.g. rpcib. 172 */ 173 status = ldi_ident_from_mod(&modlinkage, &rpcmod_li); 174 if (status != 0) { 175 cmn_err(CE_WARN, "ldi_ident_from_mod fails with %d", status); 176 rpcmod_li = NULL; 177 } 178 179 return (error); 180 } 181 182 /* 183 * The unload entry point fails, because we advertise entry points into 184 * rpcmod from the rest of kRPC: rpcmod_release(). 185 */ 186 int 187 _fini(void) 188 { 189 return (EBUSY); 190 } 191 192 int 193 _info(struct modinfo *modinfop) 194 { 195 return (mod_info(&modlinkage, modinfop)); 196 } 197 198 extern int nulldev(); 199 200 #define RPCMOD_ID 2049 201 202 int rmm_open(), rmm_close(); 203 204 /* 205 * To save instructions, since STREAMS ignores the return value 206 * from these functions, they are defined as void here. Kind of icky, but... 207 */ 208 void rmm_rput(queue_t *, mblk_t *); 209 void rmm_wput(queue_t *, mblk_t *); 210 void rmm_rsrv(queue_t *); 211 void rmm_wsrv(queue_t *); 212 213 int rpcmodopen(), rpcmodclose(); 214 void rpcmodrput(), rpcmodwput(); 215 void rpcmodrsrv(), rpcmodwsrv(); 216 217 static void rpcmodwput_other(queue_t *, mblk_t *); 218 static int mir_close(queue_t *q); 219 static int mir_open(queue_t *q, dev_t *devp, int flag, int sflag, 220 cred_t *credp); 221 static void mir_rput(queue_t *q, mblk_t *mp); 222 static void mir_rsrv(queue_t *q); 223 static void mir_wput(queue_t *q, mblk_t *mp); 224 static void mir_wsrv(queue_t *q); 225 226 static struct module_info rpcmod_info = 227 {RPCMOD_ID, "rpcmod", 0, INFPSZ, 256*1024, 1024}; 228 229 /* 230 * Read side has no service procedure. 231 */ 232 static struct qinit rpcmodrinit = { 233 (int (*)())rmm_rput, 234 (int (*)())rmm_rsrv, 235 rmm_open, 236 rmm_close, 237 nulldev, 238 &rpcmod_info, 239 NULL 240 }; 241 242 /* 243 * The write put procedure is simply putnext to conserve stack space. 244 * The write service procedure is not used to queue data, but instead to 245 * synchronize with flow control. 246 */ 247 static struct qinit rpcmodwinit = { 248 (int (*)())rmm_wput, 249 (int (*)())rmm_wsrv, 250 rmm_open, 251 rmm_close, 252 nulldev, 253 &rpcmod_info, 254 NULL 255 }; 256 struct streamtab rpcinfo = { &rpcmodrinit, &rpcmodwinit, NULL, NULL }; 257 258 struct xprt_style_ops { 259 int (*xo_open)(); 260 int (*xo_close)(); 261 void (*xo_wput)(); 262 void (*xo_wsrv)(); 263 void (*xo_rput)(); 264 void (*xo_rsrv)(); 265 }; 266 267 static struct xprt_style_ops xprt_clts_ops = { 268 rpcmodopen, 269 rpcmodclose, 270 rpcmodwput, 271 rpcmodwsrv, 272 rpcmodrput, 273 NULL 274 }; 275 276 static struct xprt_style_ops xprt_cots_ops = { 277 mir_open, 278 mir_close, 279 mir_wput, 280 mir_wsrv, 281 mir_rput, 282 mir_rsrv 283 }; 284 285 /* 286 * Per rpcmod "slot" data structure. q->q_ptr points to one of these. 287 */ 288 struct rpcm { 289 void *rm_krpc_cell; /* Reserved for use by KRPC */ 290 struct xprt_style_ops *rm_ops; 291 int rm_type; /* Client or server side stream */ 292 #define RM_CLOSING 0x1 /* somebody is trying to close slot */ 293 uint_t rm_state; /* state of the slot. see above */ 294 uint_t rm_ref; /* cnt of external references to slot */ 295 kmutex_t rm_lock; /* mutex protecting above fields */ 296 kcondvar_t rm_cwait; /* condition for closing */ 297 zoneid_t rm_zoneid; /* zone which pushed rpcmod */ 298 }; 299 300 struct temp_slot { 301 void *cell; 302 struct xprt_style_ops *ops; 303 int type; 304 mblk_t *info_ack; 305 kmutex_t lock; 306 kcondvar_t wait; 307 }; 308 309 typedef struct mir_s { 310 void *mir_krpc_cell; /* Reserved for KRPC use. This field */ 311 /* must be first in the structure. */ 312 struct xprt_style_ops *rm_ops; 313 int mir_type; /* Client or server side stream */ 314 315 mblk_t *mir_head_mp; /* RPC msg in progress */ 316 /* 317 * mir_head_mp points the first mblk being collected in 318 * the current RPC message. Record headers are removed 319 * before data is linked into mir_head_mp. 320 */ 321 mblk_t *mir_tail_mp; /* Last mblk in mir_head_mp */ 322 /* 323 * mir_tail_mp points to the last mblk in the message 324 * chain starting at mir_head_mp. It is only valid 325 * if mir_head_mp is non-NULL and is used to add new 326 * data blocks to the end of chain quickly. 327 */ 328 329 int32_t mir_frag_len; /* Bytes seen in the current frag */ 330 /* 331 * mir_frag_len starts at -4 for beginning of each fragment. 332 * When this length is negative, it indicates the number of 333 * bytes that rpcmod needs to complete the record marker 334 * header. When it is positive or zero, it holds the number 335 * of bytes that have arrived for the current fragment and 336 * are held in mir_header_mp. 337 */ 338 339 int32_t mir_frag_header; 340 /* 341 * Fragment header as collected for the current fragment. 342 * It holds the last-fragment indicator and the number 343 * of bytes in the fragment. 344 */ 345 346 unsigned int 347 mir_ordrel_pending : 1, /* Sent T_ORDREL_REQ */ 348 mir_hold_inbound : 1, /* Hold inbound messages on server */ 349 /* side until outbound flow control */ 350 /* is relieved. */ 351 mir_closing : 1, /* The stream is being closed */ 352 mir_inrservice : 1, /* data queued or rd srv proc running */ 353 mir_inwservice : 1, /* data queued or wr srv proc running */ 354 mir_inwflushdata : 1, /* flush M_DATAs when srv runs */ 355 /* 356 * On client streams, mir_clntreq is 0 or 1; it is set 357 * to 1 whenever a new request is sent out (mir_wput) 358 * and cleared when the timer fires (mir_timer). If 359 * the timer fires with this value equal to 0, then the 360 * stream is considered idle and KRPC is notified. 361 */ 362 mir_clntreq : 1, 363 /* 364 * On server streams, stop accepting messages 365 */ 366 mir_svc_no_more_msgs : 1, 367 mir_listen_stream : 1, /* listen end point */ 368 mir_unused : 1, /* no longer used */ 369 mir_timer_call : 1, 370 mir_junk_fill_thru_bit_31 : 21; 371 372 int mir_setup_complete; /* server has initialized everything */ 373 timeout_id_t mir_timer_id; /* Timer for idle checks */ 374 clock_t mir_idle_timeout; /* Allowed idle time before shutdown */ 375 /* 376 * This value is copied from clnt_idle_timeout or 377 * svc_idle_timeout during the appropriate ioctl. 378 * Kept in milliseconds 379 */ 380 clock_t mir_use_timestamp; /* updated on client with each use */ 381 /* 382 * This value is set to lbolt 383 * every time a client stream sends or receives data. 384 * Even if the timer message arrives, we don't shutdown 385 * client unless: 386 * lbolt >= MSEC_TO_TICK(mir_idle_timeout)+mir_use_timestamp. 387 * This value is kept in HZ. 388 */ 389 390 uint_t *mir_max_msg_sizep; /* Reference to sanity check size */ 391 /* 392 * This pointer is set to &clnt_max_msg_size or 393 * &svc_max_msg_size during the appropriate ioctl. 394 */ 395 zoneid_t mir_zoneid; /* zone which pushed rpcmod */ 396 /* Server-side fields. */ 397 int mir_ref_cnt; /* Reference count: server side only */ 398 /* counts the number of references */ 399 /* that a kernel RPC server thread */ 400 /* (see svc_run()) has on this rpcmod */ 401 /* slot. Effectively, it is the */ 402 /* number * of unprocessed messages */ 403 /* that have been passed up to the */ 404 /* KRPC layer */ 405 406 mblk_t *mir_svc_pend_mp; /* Pending T_ORDREL_IND or */ 407 /* T_DISCON_IND */ 408 409 /* 410 * these fields are for both client and server, but for debugging, 411 * it is easier to have these last in the structure. 412 */ 413 kmutex_t mir_mutex; /* Mutex and condvar for close */ 414 kcondvar_t mir_condvar; /* synchronization. */ 415 kcondvar_t mir_timer_cv; /* Timer routine sync. */ 416 } mir_t; 417 418 void tmp_rput(queue_t *q, mblk_t *mp); 419 420 struct xprt_style_ops tmpops = { 421 NULL, 422 NULL, 423 putnext, 424 NULL, 425 tmp_rput, 426 NULL 427 }; 428 429 void 430 tmp_rput(queue_t *q, mblk_t *mp) 431 { 432 struct temp_slot *t = (struct temp_slot *)(q->q_ptr); 433 struct T_info_ack *pptr; 434 435 switch (mp->b_datap->db_type) { 436 case M_PCPROTO: 437 pptr = (struct T_info_ack *)mp->b_rptr; 438 switch (pptr->PRIM_type) { 439 case T_INFO_ACK: 440 mutex_enter(&t->lock); 441 t->info_ack = mp; 442 cv_signal(&t->wait); 443 mutex_exit(&t->lock); 444 return; 445 default: 446 break; 447 } 448 default: 449 break; 450 } 451 452 /* 453 * Not an info-ack, so free it. This is ok because we should 454 * not be receiving data until the open finishes: rpcmod 455 * is pushed well before the end-point is bound to an address. 456 */ 457 freemsg(mp); 458 } 459 460 int 461 rmm_open(queue_t *q, dev_t *devp, int flag, int sflag, cred_t *crp) 462 { 463 mblk_t *bp; 464 struct temp_slot ts, *t; 465 struct T_info_ack *pptr; 466 int error = 0; 467 468 ASSERT(q != NULL); 469 /* 470 * Check for re-opens. 471 */ 472 if (q->q_ptr) { 473 TRACE_1(TR_FAC_KRPC, TR_RPCMODOPEN_END, 474 "rpcmodopen_end:(%s)", "q->qptr"); 475 return (0); 476 } 477 478 t = &ts; 479 bzero(t, sizeof (*t)); 480 q->q_ptr = (void *)t; 481 WR(q)->q_ptr = (void *)t; 482 483 /* 484 * Allocate the required messages upfront. 485 */ 486 if ((bp = allocb_cred(sizeof (struct T_info_req) + 487 sizeof (struct T_info_ack), crp, curproc->p_pid)) == NULL) { 488 return (ENOBUFS); 489 } 490 491 mutex_init(&t->lock, NULL, MUTEX_DEFAULT, NULL); 492 cv_init(&t->wait, NULL, CV_DEFAULT, NULL); 493 494 t->ops = &tmpops; 495 496 qprocson(q); 497 bp->b_datap->db_type = M_PCPROTO; 498 *(int32_t *)bp->b_wptr = (int32_t)T_INFO_REQ; 499 bp->b_wptr += sizeof (struct T_info_req); 500 putnext(WR(q), bp); 501 502 mutex_enter(&t->lock); 503 while (t->info_ack == NULL) { 504 if (cv_wait_sig(&t->wait, &t->lock) == 0) { 505 error = EINTR; 506 break; 507 } 508 } 509 mutex_exit(&t->lock); 510 511 if (error) 512 goto out; 513 514 pptr = (struct T_info_ack *)t->info_ack->b_rptr; 515 516 if (pptr->SERV_type == T_CLTS) { 517 if ((error = rpcmodopen(q, devp, flag, sflag, crp)) == 0) 518 ((struct rpcm *)q->q_ptr)->rm_ops = &xprt_clts_ops; 519 } else { 520 if ((error = mir_open(q, devp, flag, sflag, crp)) == 0) 521 ((mir_t *)q->q_ptr)->rm_ops = &xprt_cots_ops; 522 } 523 524 out: 525 if (error) 526 qprocsoff(q); 527 528 freemsg(t->info_ack); 529 mutex_destroy(&t->lock); 530 cv_destroy(&t->wait); 531 532 return (error); 533 } 534 535 void 536 rmm_rput(queue_t *q, mblk_t *mp) 537 { 538 (*((struct temp_slot *)q->q_ptr)->ops->xo_rput)(q, mp); 539 } 540 541 void 542 rmm_rsrv(queue_t *q) 543 { 544 (*((struct temp_slot *)q->q_ptr)->ops->xo_rsrv)(q); 545 } 546 547 void 548 rmm_wput(queue_t *q, mblk_t *mp) 549 { 550 (*((struct temp_slot *)q->q_ptr)->ops->xo_wput)(q, mp); 551 } 552 553 void 554 rmm_wsrv(queue_t *q) 555 { 556 (*((struct temp_slot *)q->q_ptr)->ops->xo_wsrv)(q); 557 } 558 559 int 560 rmm_close(queue_t *q, int flag, cred_t *crp) 561 { 562 return ((*((struct temp_slot *)q->q_ptr)->ops->xo_close)(q, flag, crp)); 563 } 564 565 /* 566 * rpcmodopen - open routine gets called when the module gets pushed 567 * onto the stream. 568 */ 569 /*ARGSUSED*/ 570 int 571 rpcmodopen(queue_t *q, dev_t *devp, int flag, int sflag, cred_t *crp) 572 { 573 struct rpcm *rmp; 574 575 extern void (*rpc_rele)(queue_t *, mblk_t *); 576 static void rpcmod_release(queue_t *, mblk_t *); 577 578 TRACE_0(TR_FAC_KRPC, TR_RPCMODOPEN_START, "rpcmodopen_start:"); 579 580 /* 581 * Initialize entry points to release a rpcmod slot (and an input 582 * message if supplied) and to send an output message to the module 583 * below rpcmod. 584 */ 585 if (rpc_rele == NULL) 586 rpc_rele = rpcmod_release; 587 588 /* 589 * Only sufficiently privileged users can use this module, and it 590 * is assumed that they will use this module properly, and NOT send 591 * bulk data from downstream. 592 */ 593 if (secpolicy_rpcmod_open(crp) != 0) 594 return (EPERM); 595 596 /* 597 * Allocate slot data structure. 598 */ 599 rmp = kmem_zalloc(sizeof (*rmp), KM_SLEEP); 600 601 mutex_init(&rmp->rm_lock, NULL, MUTEX_DEFAULT, NULL); 602 cv_init(&rmp->rm_cwait, NULL, CV_DEFAULT, NULL); 603 rmp->rm_zoneid = rpc_zoneid(); 604 /* 605 * slot type will be set by kRPC client and server ioctl's 606 */ 607 rmp->rm_type = 0; 608 609 q->q_ptr = (void *)rmp; 610 WR(q)->q_ptr = (void *)rmp; 611 612 TRACE_1(TR_FAC_KRPC, TR_RPCMODOPEN_END, "rpcmodopen_end:(%s)", "end"); 613 return (0); 614 } 615 616 /* 617 * rpcmodclose - This routine gets called when the module gets popped 618 * off of the stream. 619 */ 620 /*ARGSUSED*/ 621 int 622 rpcmodclose(queue_t *q, int flag, cred_t *crp) 623 { 624 struct rpcm *rmp; 625 626 ASSERT(q != NULL); 627 rmp = (struct rpcm *)q->q_ptr; 628 629 /* 630 * Mark our state as closing. 631 */ 632 mutex_enter(&rmp->rm_lock); 633 rmp->rm_state |= RM_CLOSING; 634 635 /* 636 * Check and see if there are any messages on the queue. If so, send 637 * the messages, regardless whether the downstream module is ready to 638 * accept data. 639 */ 640 if (rmp->rm_type == RPC_SERVER) { 641 flushq(q, FLUSHDATA); 642 643 qenable(WR(q)); 644 645 if (rmp->rm_ref) { 646 mutex_exit(&rmp->rm_lock); 647 /* 648 * call into SVC to clean the queue 649 */ 650 svc_queueclean(q); 651 mutex_enter(&rmp->rm_lock); 652 653 /* 654 * Block while there are kRPC threads with a reference 655 * to this message. 656 */ 657 while (rmp->rm_ref) 658 cv_wait(&rmp->rm_cwait, &rmp->rm_lock); 659 } 660 661 mutex_exit(&rmp->rm_lock); 662 663 /* 664 * It is now safe to remove this queue from the stream. No kRPC 665 * threads have a reference to the stream, and none ever will, 666 * because RM_CLOSING is set. 667 */ 668 qprocsoff(q); 669 670 /* Notify kRPC that this stream is going away. */ 671 svc_queueclose(q); 672 } else { 673 mutex_exit(&rmp->rm_lock); 674 qprocsoff(q); 675 } 676 677 q->q_ptr = NULL; 678 WR(q)->q_ptr = NULL; 679 mutex_destroy(&rmp->rm_lock); 680 cv_destroy(&rmp->rm_cwait); 681 kmem_free(rmp, sizeof (*rmp)); 682 return (0); 683 } 684 685 #ifdef DEBUG 686 int rpcmod_send_msg_up = 0; 687 int rpcmod_send_uderr = 0; 688 int rpcmod_send_dup = 0; 689 int rpcmod_send_dup_cnt = 0; 690 #endif 691 692 /* 693 * rpcmodrput - Module read put procedure. This is called from 694 * the module, driver, or stream head downstream. 695 */ 696 void 697 rpcmodrput(queue_t *q, mblk_t *mp) 698 { 699 struct rpcm *rmp; 700 union T_primitives *pptr; 701 int hdrsz; 702 703 TRACE_0(TR_FAC_KRPC, TR_RPCMODRPUT_START, "rpcmodrput_start:"); 704 705 ASSERT(q != NULL); 706 rmp = (struct rpcm *)q->q_ptr; 707 708 if (rmp->rm_type == 0) { 709 freemsg(mp); 710 return; 711 } 712 713 #ifdef DEBUG 714 if (rpcmod_send_msg_up > 0) { 715 mblk_t *nmp = copymsg(mp); 716 if (nmp) { 717 putnext(q, nmp); 718 rpcmod_send_msg_up--; 719 } 720 } 721 if ((rpcmod_send_uderr > 0) && mp->b_datap->db_type == M_PROTO) { 722 mblk_t *nmp; 723 struct T_unitdata_ind *data; 724 struct T_uderror_ind *ud; 725 int d; 726 data = (struct T_unitdata_ind *)mp->b_rptr; 727 if (data->PRIM_type == T_UNITDATA_IND) { 728 d = sizeof (*ud) - sizeof (*data); 729 nmp = allocb(mp->b_wptr - mp->b_rptr + d, BPRI_HI); 730 if (nmp) { 731 ud = (struct T_uderror_ind *)nmp->b_rptr; 732 ud->PRIM_type = T_UDERROR_IND; 733 ud->DEST_length = data->SRC_length; 734 ud->DEST_offset = data->SRC_offset + d; 735 ud->OPT_length = data->OPT_length; 736 ud->OPT_offset = data->OPT_offset + d; 737 ud->ERROR_type = ENETDOWN; 738 if (data->SRC_length) { 739 bcopy(mp->b_rptr + 740 data->SRC_offset, 741 nmp->b_rptr + 742 ud->DEST_offset, 743 data->SRC_length); 744 } 745 if (data->OPT_length) { 746 bcopy(mp->b_rptr + 747 data->OPT_offset, 748 nmp->b_rptr + 749 ud->OPT_offset, 750 data->OPT_length); 751 } 752 nmp->b_wptr += d; 753 nmp->b_wptr += (mp->b_wptr - mp->b_rptr); 754 nmp->b_datap->db_type = M_PROTO; 755 putnext(q, nmp); 756 rpcmod_send_uderr--; 757 } 758 } 759 } 760 #endif 761 switch (mp->b_datap->db_type) { 762 default: 763 putnext(q, mp); 764 break; 765 766 case M_PROTO: 767 case M_PCPROTO: 768 ASSERT((mp->b_wptr - mp->b_rptr) >= sizeof (int32_t)); 769 pptr = (union T_primitives *)mp->b_rptr; 770 771 /* 772 * Forward this message to krpc if it is data. 773 */ 774 if (pptr->type == T_UNITDATA_IND) { 775 mblk_t *nmp; 776 777 /* 778 * Check if the module is being popped. 779 */ 780 mutex_enter(&rmp->rm_lock); 781 if (rmp->rm_state & RM_CLOSING) { 782 mutex_exit(&rmp->rm_lock); 783 putnext(q, mp); 784 break; 785 } 786 787 switch (rmp->rm_type) { 788 case RPC_CLIENT: 789 mutex_exit(&rmp->rm_lock); 790 hdrsz = mp->b_wptr - mp->b_rptr; 791 792 /* 793 * Make sure the header is sane. 794 */ 795 if (hdrsz < TUNITDATAINDSZ || 796 hdrsz < (pptr->unitdata_ind.OPT_length + 797 pptr->unitdata_ind.OPT_offset) || 798 hdrsz < (pptr->unitdata_ind.SRC_length + 799 pptr->unitdata_ind.SRC_offset)) { 800 freemsg(mp); 801 return; 802 } 803 804 /* 805 * Call clnt_clts_dispatch_notify, so that it 806 * can pass the message to the proper caller. 807 * Don't discard the header just yet since the 808 * client may need the sender's address. 809 */ 810 clnt_clts_dispatch_notify(mp, hdrsz, 811 rmp->rm_zoneid); 812 return; 813 case RPC_SERVER: 814 /* 815 * rm_krpc_cell is exclusively used by the kRPC 816 * CLTS server 817 */ 818 if (rmp->rm_krpc_cell) { 819 #ifdef DEBUG 820 /* 821 * Test duplicate request cache and 822 * rm_ref count handling by sending a 823 * duplicate every so often, if 824 * desired. 825 */ 826 if (rpcmod_send_dup && 827 rpcmod_send_dup_cnt++ % 828 rpcmod_send_dup) 829 nmp = copymsg(mp); 830 else 831 nmp = NULL; 832 #endif 833 /* 834 * Raise the reference count on this 835 * module to prevent it from being 836 * popped before krpc generates the 837 * reply. 838 */ 839 rmp->rm_ref++; 840 mutex_exit(&rmp->rm_lock); 841 842 /* 843 * Submit the message to krpc. 844 */ 845 svc_queuereq(q, mp); 846 #ifdef DEBUG 847 /* 848 * Send duplicate if we created one. 849 */ 850 if (nmp) { 851 mutex_enter(&rmp->rm_lock); 852 rmp->rm_ref++; 853 mutex_exit(&rmp->rm_lock); 854 svc_queuereq(q, nmp); 855 } 856 #endif 857 } else { 858 mutex_exit(&rmp->rm_lock); 859 freemsg(mp); 860 } 861 return; 862 default: 863 mutex_exit(&rmp->rm_lock); 864 freemsg(mp); 865 return; 866 } /* end switch(rmp->rm_type) */ 867 } else if (pptr->type == T_UDERROR_IND) { 868 mutex_enter(&rmp->rm_lock); 869 hdrsz = mp->b_wptr - mp->b_rptr; 870 871 /* 872 * Make sure the header is sane 873 */ 874 if (hdrsz < TUDERRORINDSZ || 875 hdrsz < (pptr->uderror_ind.OPT_length + 876 pptr->uderror_ind.OPT_offset) || 877 hdrsz < (pptr->uderror_ind.DEST_length + 878 pptr->uderror_ind.DEST_offset)) { 879 mutex_exit(&rmp->rm_lock); 880 freemsg(mp); 881 return; 882 } 883 884 /* 885 * In the case where a unit data error has been 886 * received, all we need to do is clear the message from 887 * the queue. 888 */ 889 mutex_exit(&rmp->rm_lock); 890 freemsg(mp); 891 RPCLOG(32, "rpcmodrput: unitdata error received at " 892 "%ld\n", gethrestime_sec()); 893 return; 894 } /* end else if (pptr->type == T_UDERROR_IND) */ 895 896 putnext(q, mp); 897 break; 898 } /* end switch (mp->b_datap->db_type) */ 899 900 TRACE_0(TR_FAC_KRPC, TR_RPCMODRPUT_END, 901 "rpcmodrput_end:"); 902 /* 903 * Return codes are not looked at by the STREAMS framework. 904 */ 905 } 906 907 /* 908 * write put procedure 909 */ 910 void 911 rpcmodwput(queue_t *q, mblk_t *mp) 912 { 913 struct rpcm *rmp; 914 915 ASSERT(q != NULL); 916 917 switch (mp->b_datap->db_type) { 918 case M_PROTO: 919 case M_PCPROTO: 920 break; 921 default: 922 rpcmodwput_other(q, mp); 923 return; 924 } 925 926 /* 927 * Check to see if we can send the message downstream. 928 */ 929 if (canputnext(q)) { 930 putnext(q, mp); 931 return; 932 } 933 934 rmp = (struct rpcm *)q->q_ptr; 935 ASSERT(rmp != NULL); 936 937 /* 938 * The first canputnext failed. Try again except this time with the 939 * lock held, so that we can check the state of the stream to see if 940 * it is closing. If either of these conditions evaluate to true 941 * then send the meesage. 942 */ 943 mutex_enter(&rmp->rm_lock); 944 if (canputnext(q) || (rmp->rm_state & RM_CLOSING)) { 945 mutex_exit(&rmp->rm_lock); 946 putnext(q, mp); 947 } else { 948 /* 949 * canputnext failed again and the stream is not closing. 950 * Place the message on the queue and let the service 951 * procedure handle the message. 952 */ 953 mutex_exit(&rmp->rm_lock); 954 (void) putq(q, mp); 955 } 956 } 957 958 static void 959 rpcmodwput_other(queue_t *q, mblk_t *mp) 960 { 961 struct rpcm *rmp; 962 struct iocblk *iocp; 963 964 rmp = (struct rpcm *)q->q_ptr; 965 ASSERT(rmp != NULL); 966 967 switch (mp->b_datap->db_type) { 968 case M_IOCTL: 969 iocp = (struct iocblk *)mp->b_rptr; 970 ASSERT(iocp != NULL); 971 switch (iocp->ioc_cmd) { 972 case RPC_CLIENT: 973 case RPC_SERVER: 974 mutex_enter(&rmp->rm_lock); 975 rmp->rm_type = iocp->ioc_cmd; 976 mutex_exit(&rmp->rm_lock); 977 mp->b_datap->db_type = M_IOCACK; 978 qreply(q, mp); 979 return; 980 default: 981 /* 982 * pass the ioctl downstream and hope someone 983 * down there knows how to handle it. 984 */ 985 putnext(q, mp); 986 return; 987 } 988 default: 989 break; 990 } 991 /* 992 * This is something we definitely do not know how to handle, just 993 * pass the message downstream 994 */ 995 putnext(q, mp); 996 } 997 998 /* 999 * Module write service procedure. This is called by downstream modules 1000 * for back enabling during flow control. 1001 */ 1002 void 1003 rpcmodwsrv(queue_t *q) 1004 { 1005 struct rpcm *rmp; 1006 mblk_t *mp = NULL; 1007 1008 rmp = (struct rpcm *)q->q_ptr; 1009 ASSERT(rmp != NULL); 1010 1011 /* 1012 * Get messages that may be queued and send them down stream 1013 */ 1014 while ((mp = getq(q)) != NULL) { 1015 /* 1016 * Optimize the service procedure for the server-side, by 1017 * avoiding a call to canputnext(). 1018 */ 1019 if (rmp->rm_type == RPC_SERVER || canputnext(q)) { 1020 putnext(q, mp); 1021 continue; 1022 } 1023 (void) putbq(q, mp); 1024 return; 1025 } 1026 } 1027 1028 static void 1029 rpcmod_release(queue_t *q, mblk_t *bp) 1030 { 1031 struct rpcm *rmp; 1032 1033 /* 1034 * For now, just free the message. 1035 */ 1036 if (bp) 1037 freemsg(bp); 1038 rmp = (struct rpcm *)q->q_ptr; 1039 1040 mutex_enter(&rmp->rm_lock); 1041 rmp->rm_ref--; 1042 1043 if (rmp->rm_ref == 0 && (rmp->rm_state & RM_CLOSING)) { 1044 cv_broadcast(&rmp->rm_cwait); 1045 } 1046 1047 mutex_exit(&rmp->rm_lock); 1048 } 1049 1050 /* 1051 * This part of rpcmod is pushed on a connection-oriented transport for use 1052 * by RPC. It serves to bypass the Stream head, implements 1053 * the record marking protocol, and dispatches incoming RPC messages. 1054 */ 1055 1056 /* Default idle timer values */ 1057 #define MIR_CLNT_IDLE_TIMEOUT (5 * (60 * 1000L)) /* 5 minutes */ 1058 #define MIR_SVC_IDLE_TIMEOUT (6 * (60 * 1000L)) /* 6 minutes */ 1059 #define MIR_SVC_ORDREL_TIMEOUT (10 * (60 * 1000L)) /* 10 minutes */ 1060 #define MIR_LASTFRAG 0x80000000 /* Record marker */ 1061 1062 #define DLEN(mp) (mp->b_cont ? msgdsize(mp) : (mp->b_wptr - mp->b_rptr)) 1063 1064 #define MIR_SVC_QUIESCED(mir) \ 1065 (mir->mir_ref_cnt == 0 && mir->mir_inrservice == 0) 1066 1067 #define MIR_CLEAR_INRSRV(mir_ptr) { \ 1068 (mir_ptr)->mir_inrservice = 0; \ 1069 if ((mir_ptr)->mir_type == RPC_SERVER && \ 1070 (mir_ptr)->mir_closing) \ 1071 cv_signal(&(mir_ptr)->mir_condvar); \ 1072 } 1073 1074 /* 1075 * Don't block service procedure (and mir_close) if 1076 * we are in the process of closing. 1077 */ 1078 #define MIR_WCANPUTNEXT(mir_ptr, write_q) \ 1079 (canputnext(write_q) || ((mir_ptr)->mir_svc_no_more_msgs == 1)) 1080 1081 static int mir_clnt_dup_request(queue_t *q, mblk_t *mp); 1082 static void mir_rput_proto(queue_t *q, mblk_t *mp); 1083 static int mir_svc_policy_notify(queue_t *q, int event); 1084 static void mir_svc_release(queue_t *wq, mblk_t *mp); 1085 static void mir_svc_start(queue_t *wq); 1086 static void mir_svc_idle_start(queue_t *, mir_t *); 1087 static void mir_svc_idle_stop(queue_t *, mir_t *); 1088 static void mir_svc_start_close(queue_t *, mir_t *); 1089 static void mir_clnt_idle_do_stop(queue_t *); 1090 static void mir_clnt_idle_stop(queue_t *, mir_t *); 1091 static void mir_clnt_idle_start(queue_t *, mir_t *); 1092 static void mir_wput(queue_t *q, mblk_t *mp); 1093 static void mir_wput_other(queue_t *q, mblk_t *mp); 1094 static void mir_wsrv(queue_t *q); 1095 static void mir_disconnect(queue_t *, mir_t *ir); 1096 static int mir_check_len(queue_t *, int32_t, mblk_t *); 1097 static void mir_timer(void *); 1098 1099 extern void (*mir_rele)(queue_t *, mblk_t *); 1100 extern void (*mir_start)(queue_t *); 1101 extern void (*clnt_stop_idle)(queue_t *); 1102 1103 clock_t clnt_idle_timeout = MIR_CLNT_IDLE_TIMEOUT; 1104 clock_t svc_idle_timeout = MIR_SVC_IDLE_TIMEOUT; 1105 1106 /* 1107 * Timeout for subsequent notifications of idle connection. This is 1108 * typically used to clean up after a wedged orderly release. 1109 */ 1110 clock_t svc_ordrel_timeout = MIR_SVC_ORDREL_TIMEOUT; /* milliseconds */ 1111 1112 extern uint_t *clnt_max_msg_sizep; 1113 extern uint_t *svc_max_msg_sizep; 1114 uint_t clnt_max_msg_size = RPC_MAXDATASIZE; 1115 uint_t svc_max_msg_size = RPC_MAXDATASIZE; 1116 uint_t mir_krpc_cell_null; 1117 1118 static void 1119 mir_timer_stop(mir_t *mir) 1120 { 1121 timeout_id_t tid; 1122 1123 ASSERT(MUTEX_HELD(&mir->mir_mutex)); 1124 1125 /* 1126 * Since the mir_mutex lock needs to be released to call 1127 * untimeout(), we need to make sure that no other thread 1128 * can start/stop the timer (changing mir_timer_id) during 1129 * that time. The mir_timer_call bit and the mir_timer_cv 1130 * condition variable are used to synchronize this. Setting 1131 * mir_timer_call also tells mir_timer() (refer to the comments 1132 * in mir_timer()) that it does not need to do anything. 1133 */ 1134 while (mir->mir_timer_call) 1135 cv_wait(&mir->mir_timer_cv, &mir->mir_mutex); 1136 mir->mir_timer_call = B_TRUE; 1137 1138 if ((tid = mir->mir_timer_id) != 0) { 1139 mir->mir_timer_id = 0; 1140 mutex_exit(&mir->mir_mutex); 1141 (void) untimeout(tid); 1142 mutex_enter(&mir->mir_mutex); 1143 } 1144 mir->mir_timer_call = B_FALSE; 1145 cv_broadcast(&mir->mir_timer_cv); 1146 } 1147 1148 static void 1149 mir_timer_start(queue_t *q, mir_t *mir, clock_t intrvl) 1150 { 1151 timeout_id_t tid; 1152 1153 ASSERT(MUTEX_HELD(&mir->mir_mutex)); 1154 1155 while (mir->mir_timer_call) 1156 cv_wait(&mir->mir_timer_cv, &mir->mir_mutex); 1157 mir->mir_timer_call = B_TRUE; 1158 1159 if ((tid = mir->mir_timer_id) != 0) { 1160 mutex_exit(&mir->mir_mutex); 1161 (void) untimeout(tid); 1162 mutex_enter(&mir->mir_mutex); 1163 } 1164 /* Only start the timer when it is not closing. */ 1165 if (!mir->mir_closing) { 1166 mir->mir_timer_id = timeout(mir_timer, q, 1167 MSEC_TO_TICK(intrvl)); 1168 } 1169 mir->mir_timer_call = B_FALSE; 1170 cv_broadcast(&mir->mir_timer_cv); 1171 } 1172 1173 static int 1174 mir_clnt_dup_request(queue_t *q, mblk_t *mp) 1175 { 1176 mblk_t *mp1; 1177 uint32_t new_xid; 1178 uint32_t old_xid; 1179 1180 ASSERT(MUTEX_HELD(&((mir_t *)q->q_ptr)->mir_mutex)); 1181 new_xid = BE32_TO_U32(&mp->b_rptr[4]); 1182 /* 1183 * This loop is a bit tacky -- it walks the STREAMS list of 1184 * flow-controlled messages. 1185 */ 1186 if ((mp1 = q->q_first) != NULL) { 1187 do { 1188 old_xid = BE32_TO_U32(&mp1->b_rptr[4]); 1189 if (new_xid == old_xid) 1190 return (1); 1191 } while ((mp1 = mp1->b_next) != NULL); 1192 } 1193 return (0); 1194 } 1195 1196 static int 1197 mir_close(queue_t *q) 1198 { 1199 mir_t *mir = q->q_ptr; 1200 mblk_t *mp; 1201 bool_t queue_cleaned = FALSE; 1202 1203 RPCLOG(32, "rpcmod: mir_close of q 0x%p\n", (void *)q); 1204 ASSERT(MUTEX_NOT_HELD(&mir->mir_mutex)); 1205 mutex_enter(&mir->mir_mutex); 1206 if ((mp = mir->mir_head_mp) != NULL) { 1207 mir->mir_head_mp = NULL; 1208 mir->mir_tail_mp = NULL; 1209 freemsg(mp); 1210 } 1211 /* 1212 * Set mir_closing so we get notified when MIR_SVC_QUIESCED() 1213 * is TRUE. And mir_timer_start() won't start the timer again. 1214 */ 1215 mir->mir_closing = B_TRUE; 1216 mir_timer_stop(mir); 1217 1218 if (mir->mir_type == RPC_SERVER) { 1219 flushq(q, FLUSHDATA); /* Ditch anything waiting on read q */ 1220 1221 /* 1222 * This will prevent more requests from arriving and 1223 * will force rpcmod to ignore flow control. 1224 */ 1225 mir_svc_start_close(WR(q), mir); 1226 1227 while ((!MIR_SVC_QUIESCED(mir)) || mir->mir_inwservice == 1) { 1228 1229 if (mir->mir_ref_cnt && !mir->mir_inrservice && 1230 (queue_cleaned == FALSE)) { 1231 /* 1232 * call into SVC to clean the queue 1233 */ 1234 mutex_exit(&mir->mir_mutex); 1235 svc_queueclean(q); 1236 queue_cleaned = TRUE; 1237 mutex_enter(&mir->mir_mutex); 1238 continue; 1239 } 1240 1241 /* 1242 * Bugid 1253810 - Force the write service 1243 * procedure to send its messages, regardless 1244 * whether the downstream module is ready 1245 * to accept data. 1246 */ 1247 if (mir->mir_inwservice == 1) 1248 qenable(WR(q)); 1249 1250 cv_wait(&mir->mir_condvar, &mir->mir_mutex); 1251 } 1252 1253 mutex_exit(&mir->mir_mutex); 1254 qprocsoff(q); 1255 1256 /* Notify KRPC that this stream is going away. */ 1257 svc_queueclose(q); 1258 } else { 1259 mutex_exit(&mir->mir_mutex); 1260 qprocsoff(q); 1261 } 1262 1263 mutex_destroy(&mir->mir_mutex); 1264 cv_destroy(&mir->mir_condvar); 1265 cv_destroy(&mir->mir_timer_cv); 1266 kmem_free(mir, sizeof (mir_t)); 1267 return (0); 1268 } 1269 1270 /* 1271 * This is server side only (RPC_SERVER). 1272 * 1273 * Exit idle mode. 1274 */ 1275 static void 1276 mir_svc_idle_stop(queue_t *q, mir_t *mir) 1277 { 1278 ASSERT(MUTEX_HELD(&mir->mir_mutex)); 1279 ASSERT((q->q_flag & QREADR) == 0); 1280 ASSERT(mir->mir_type == RPC_SERVER); 1281 RPCLOG(16, "rpcmod: mir_svc_idle_stop of q 0x%p\n", (void *)q); 1282 1283 mir_timer_stop(mir); 1284 } 1285 1286 /* 1287 * This is server side only (RPC_SERVER). 1288 * 1289 * Start idle processing, which will include setting idle timer if the 1290 * stream is not being closed. 1291 */ 1292 static void 1293 mir_svc_idle_start(queue_t *q, mir_t *mir) 1294 { 1295 ASSERT(MUTEX_HELD(&mir->mir_mutex)); 1296 ASSERT((q->q_flag & QREADR) == 0); 1297 ASSERT(mir->mir_type == RPC_SERVER); 1298 RPCLOG(16, "rpcmod: mir_svc_idle_start q 0x%p\n", (void *)q); 1299 1300 /* 1301 * Don't re-start idle timer if we are closing queues. 1302 */ 1303 if (mir->mir_closing) { 1304 RPCLOG(16, "mir_svc_idle_start - closing: 0x%p\n", 1305 (void *)q); 1306 1307 /* 1308 * We will call mir_svc_idle_start() whenever MIR_SVC_QUIESCED() 1309 * is true. When it is true, and we are in the process of 1310 * closing the stream, signal any thread waiting in 1311 * mir_close(). 1312 */ 1313 if (mir->mir_inwservice == 0) 1314 cv_signal(&mir->mir_condvar); 1315 1316 } else { 1317 RPCLOG(16, "mir_svc_idle_start - reset %s timer\n", 1318 mir->mir_ordrel_pending ? "ordrel" : "normal"); 1319 /* 1320 * Normal condition, start the idle timer. If an orderly 1321 * release has been sent, set the timeout to wait for the 1322 * client to close its side of the connection. Otherwise, 1323 * use the normal idle timeout. 1324 */ 1325 mir_timer_start(q, mir, mir->mir_ordrel_pending ? 1326 svc_ordrel_timeout : mir->mir_idle_timeout); 1327 } 1328 } 1329 1330 /* ARGSUSED */ 1331 static int 1332 mir_open(queue_t *q, dev_t *devp, int flag, int sflag, cred_t *credp) 1333 { 1334 mir_t *mir; 1335 1336 RPCLOG(32, "rpcmod: mir_open of q 0x%p\n", (void *)q); 1337 /* Set variables used directly by KRPC. */ 1338 if (!mir_rele) 1339 mir_rele = mir_svc_release; 1340 if (!mir_start) 1341 mir_start = mir_svc_start; 1342 if (!clnt_stop_idle) 1343 clnt_stop_idle = mir_clnt_idle_do_stop; 1344 if (!clnt_max_msg_sizep) 1345 clnt_max_msg_sizep = &clnt_max_msg_size; 1346 if (!svc_max_msg_sizep) 1347 svc_max_msg_sizep = &svc_max_msg_size; 1348 1349 /* Allocate a zero'ed out mir structure for this stream. */ 1350 mir = kmem_zalloc(sizeof (mir_t), KM_SLEEP); 1351 1352 /* 1353 * We set hold inbound here so that incoming messages will 1354 * be held on the read-side queue until the stream is completely 1355 * initialized with a RPC_CLIENT or RPC_SERVER ioctl. During 1356 * the ioctl processing, the flag is cleared and any messages that 1357 * arrived between the open and the ioctl are delivered to KRPC. 1358 * 1359 * Early data should never arrive on a client stream since 1360 * servers only respond to our requests and we do not send any. 1361 * until after the stream is initialized. Early data is 1362 * very common on a server stream where the client will start 1363 * sending data as soon as the connection is made (and this 1364 * is especially true with TCP where the protocol accepts the 1365 * connection before nfsd or KRPC is notified about it). 1366 */ 1367 1368 mir->mir_hold_inbound = 1; 1369 1370 /* 1371 * Start the record marker looking for a 4-byte header. When 1372 * this length is negative, it indicates that rpcmod is looking 1373 * for bytes to consume for the record marker header. When it 1374 * is positive, it holds the number of bytes that have arrived 1375 * for the current fragment and are being held in mir_header_mp. 1376 */ 1377 1378 mir->mir_frag_len = -(int32_t)sizeof (uint32_t); 1379 1380 mir->mir_zoneid = rpc_zoneid(); 1381 mutex_init(&mir->mir_mutex, NULL, MUTEX_DEFAULT, NULL); 1382 cv_init(&mir->mir_condvar, NULL, CV_DRIVER, NULL); 1383 cv_init(&mir->mir_timer_cv, NULL, CV_DRIVER, NULL); 1384 1385 q->q_ptr = (char *)mir; 1386 WR(q)->q_ptr = (char *)mir; 1387 1388 /* 1389 * We noenable the read-side queue because we don't want it 1390 * automatically enabled by putq. We enable it explicitly 1391 * in mir_wsrv when appropriate. (See additional comments on 1392 * flow control at the beginning of mir_rsrv.) 1393 */ 1394 noenable(q); 1395 1396 qprocson(q); 1397 return (0); 1398 } 1399 1400 /* 1401 * Read-side put routine for both the client and server side. Does the 1402 * record marking for incoming RPC messages, and when complete, dispatches 1403 * the message to either the client or server. 1404 */ 1405 static void 1406 mir_rput(queue_t *q, mblk_t *mp) 1407 { 1408 int excess; 1409 int32_t frag_len, frag_header; 1410 mblk_t *cont_mp, *head_mp, *tail_mp, *mp1; 1411 mir_t *mir = q->q_ptr; 1412 boolean_t stop_timer = B_FALSE; 1413 1414 ASSERT(mir != NULL); 1415 1416 /* 1417 * If the stream has not been set up as a RPC_CLIENT or RPC_SERVER 1418 * with the corresponding ioctl, then don't accept 1419 * any inbound data. This should never happen for streams 1420 * created by nfsd or client-side KRPC because they are careful 1421 * to set the mode of the stream before doing anything else. 1422 */ 1423 if (mir->mir_type == 0) { 1424 freemsg(mp); 1425 return; 1426 } 1427 1428 ASSERT(MUTEX_NOT_HELD(&mir->mir_mutex)); 1429 1430 switch (mp->b_datap->db_type) { 1431 case M_DATA: 1432 break; 1433 case M_PROTO: 1434 case M_PCPROTO: 1435 if (MBLKL(mp) < sizeof (t_scalar_t)) { 1436 RPCLOG(1, "mir_rput: runt TPI message (%d bytes)\n", 1437 (int)MBLKL(mp)); 1438 freemsg(mp); 1439 return; 1440 } 1441 if (((union T_primitives *)mp->b_rptr)->type != T_DATA_IND) { 1442 mir_rput_proto(q, mp); 1443 return; 1444 } 1445 1446 /* Throw away the T_DATA_IND block and continue with data. */ 1447 mp1 = mp; 1448 mp = mp->b_cont; 1449 freeb(mp1); 1450 break; 1451 case M_SETOPTS: 1452 /* 1453 * If a module on the stream is trying set the Stream head's 1454 * high water mark, then set our hiwater to the requested 1455 * value. We are the "stream head" for all inbound 1456 * data messages since messages are passed directly to KRPC. 1457 */ 1458 if (MBLKL(mp) >= sizeof (struct stroptions)) { 1459 struct stroptions *stropts; 1460 1461 stropts = (struct stroptions *)mp->b_rptr; 1462 if ((stropts->so_flags & SO_HIWAT) && 1463 !(stropts->so_flags & SO_BAND)) { 1464 (void) strqset(q, QHIWAT, 0, stropts->so_hiwat); 1465 } 1466 } 1467 putnext(q, mp); 1468 return; 1469 case M_FLUSH: 1470 RPCLOG(32, "mir_rput: ignoring M_FLUSH %x ", *mp->b_rptr); 1471 RPCLOG(32, "on q 0x%p\n", (void *)q); 1472 putnext(q, mp); 1473 return; 1474 default: 1475 putnext(q, mp); 1476 return; 1477 } 1478 1479 mutex_enter(&mir->mir_mutex); 1480 1481 /* 1482 * If this connection is closing, don't accept any new messages. 1483 */ 1484 if (mir->mir_svc_no_more_msgs) { 1485 ASSERT(mir->mir_type == RPC_SERVER); 1486 mutex_exit(&mir->mir_mutex); 1487 freemsg(mp); 1488 return; 1489 } 1490 1491 /* Get local copies for quicker access. */ 1492 frag_len = mir->mir_frag_len; 1493 frag_header = mir->mir_frag_header; 1494 head_mp = mir->mir_head_mp; 1495 tail_mp = mir->mir_tail_mp; 1496 1497 /* Loop, processing each message block in the mp chain separately. */ 1498 do { 1499 cont_mp = mp->b_cont; 1500 mp->b_cont = NULL; 1501 1502 /* 1503 * Drop zero-length mblks to prevent unbounded kernel memory 1504 * consumption. 1505 */ 1506 if (MBLKL(mp) == 0) { 1507 freeb(mp); 1508 continue; 1509 } 1510 1511 /* 1512 * If frag_len is negative, we're still in the process of 1513 * building frag_header -- try to complete it with this mblk. 1514 */ 1515 while (frag_len < 0 && mp->b_rptr < mp->b_wptr) { 1516 frag_len++; 1517 frag_header <<= 8; 1518 frag_header += *mp->b_rptr++; 1519 } 1520 1521 if (MBLKL(mp) == 0 && frag_len < 0) { 1522 /* 1523 * We consumed this mblk while trying to complete the 1524 * fragment header. Free it and move on. 1525 */ 1526 freeb(mp); 1527 continue; 1528 } 1529 1530 ASSERT(frag_len >= 0); 1531 1532 /* 1533 * Now frag_header has the number of bytes in this fragment 1534 * and we're just waiting to collect them all. Chain our 1535 * latest mblk onto the list and see if we now have enough 1536 * bytes to complete the fragment. 1537 */ 1538 if (head_mp == NULL) { 1539 ASSERT(tail_mp == NULL); 1540 head_mp = tail_mp = mp; 1541 } else { 1542 tail_mp->b_cont = mp; 1543 tail_mp = mp; 1544 } 1545 1546 frag_len += MBLKL(mp); 1547 excess = frag_len - (frag_header & ~MIR_LASTFRAG); 1548 if (excess < 0) { 1549 /* 1550 * We still haven't received enough data to complete 1551 * the fragment, so continue on to the next mblk. 1552 */ 1553 continue; 1554 } 1555 1556 /* 1557 * We've got a complete fragment. If there are excess bytes, 1558 * then they're part of the next fragment's header (of either 1559 * this RPC message or the next RPC message). Split that part 1560 * into its own mblk so that we can safely freeb() it when 1561 * building frag_header above. 1562 */ 1563 if (excess > 0) { 1564 if ((mp1 = dupb(mp)) == NULL && 1565 (mp1 = copyb(mp)) == NULL) { 1566 freemsg(head_mp); 1567 freemsg(cont_mp); 1568 RPCLOG0(1, "mir_rput: dupb/copyb failed\n"); 1569 mir->mir_frag_header = 0; 1570 mir->mir_frag_len = -(int32_t)sizeof (uint32_t); 1571 mir->mir_head_mp = NULL; 1572 mir->mir_tail_mp = NULL; 1573 mir_disconnect(q, mir); /* drops mir_mutex */ 1574 return; 1575 } 1576 1577 /* 1578 * Relink the message chain so that the next mblk is 1579 * the next fragment header, followed by the rest of 1580 * the message chain. 1581 */ 1582 mp1->b_cont = cont_mp; 1583 cont_mp = mp1; 1584 1585 /* 1586 * Data in the new mblk begins at the next fragment, 1587 * and data in the old mblk ends at the next fragment. 1588 */ 1589 mp1->b_rptr = mp1->b_wptr - excess; 1590 mp->b_wptr -= excess; 1591 } 1592 1593 /* 1594 * Reset frag_len and frag_header for the next fragment. 1595 */ 1596 frag_len = -(int32_t)sizeof (uint32_t); 1597 if (!(frag_header & MIR_LASTFRAG)) { 1598 /* 1599 * The current fragment is complete, but more 1600 * fragments need to be processed before we can 1601 * pass along the RPC message headed at head_mp. 1602 */ 1603 frag_header = 0; 1604 continue; 1605 } 1606 frag_header = 0; 1607 1608 /* 1609 * We've got a complete RPC message; pass it to the 1610 * appropriate consumer. 1611 */ 1612 switch (mir->mir_type) { 1613 case RPC_CLIENT: 1614 if (clnt_dispatch_notify(head_mp, mir->mir_zoneid)) { 1615 /* 1616 * Mark this stream as active. This marker 1617 * is used in mir_timer(). 1618 */ 1619 mir->mir_clntreq = 1; 1620 mir->mir_use_timestamp = lbolt; 1621 } else { 1622 freemsg(head_mp); 1623 } 1624 break; 1625 1626 case RPC_SERVER: 1627 /* 1628 * Check for flow control before passing the 1629 * message to KRPC. 1630 */ 1631 if (!mir->mir_hold_inbound) { 1632 if (mir->mir_krpc_cell) { 1633 /* 1634 * If the reference count is 0 1635 * (not including this request), 1636 * then the stream is transitioning 1637 * from idle to non-idle. In this case, 1638 * we cancel the idle timer. 1639 */ 1640 if (mir->mir_ref_cnt++ == 0) 1641 stop_timer = B_TRUE; 1642 if (mir_check_len(q, 1643 (int32_t)msgdsize(mp), mp)) 1644 return; 1645 svc_queuereq(q, head_mp); /* to KRPC */ 1646 } else { 1647 /* 1648 * Count # of times this happens. Should 1649 * be never, but experience shows 1650 * otherwise. 1651 */ 1652 mir_krpc_cell_null++; 1653 freemsg(head_mp); 1654 } 1655 } else { 1656 /* 1657 * If the outbound side of the stream is 1658 * flow controlled, then hold this message 1659 * until client catches up. mir_hold_inbound 1660 * is set in mir_wput and cleared in mir_wsrv. 1661 */ 1662 (void) putq(q, head_mp); 1663 mir->mir_inrservice = B_TRUE; 1664 } 1665 break; 1666 default: 1667 RPCLOG(1, "mir_rput: unknown mir_type %d\n", 1668 mir->mir_type); 1669 freemsg(head_mp); 1670 break; 1671 } 1672 1673 /* 1674 * Reset the chain since we're starting on a new RPC message. 1675 */ 1676 head_mp = tail_mp = NULL; 1677 } while ((mp = cont_mp) != NULL); 1678 1679 /* 1680 * Sanity check the message length; if it's too large mir_check_len() 1681 * will shutdown the connection, drop mir_mutex, and return non-zero. 1682 */ 1683 if (head_mp != NULL && mir->mir_setup_complete && 1684 mir_check_len(q, frag_len, head_mp)) 1685 return; 1686 1687 /* Save our local copies back in the mir structure. */ 1688 mir->mir_frag_header = frag_header; 1689 mir->mir_frag_len = frag_len; 1690 mir->mir_head_mp = head_mp; 1691 mir->mir_tail_mp = tail_mp; 1692 1693 /* 1694 * The timer is stopped after the whole message chain is processed. 1695 * The reason is that stopping the timer releases the mir_mutex 1696 * lock temporarily. This means that the request can be serviced 1697 * while we are still processing the message chain. This is not 1698 * good. So we stop the timer here instead. 1699 * 1700 * Note that if the timer fires before we stop it, it will not 1701 * do any harm as MIR_SVC_QUIESCED() is false and mir_timer() 1702 * will just return. 1703 */ 1704 if (stop_timer) { 1705 RPCLOG(16, "mir_rput: stopping idle timer on 0x%p because " 1706 "ref cnt going to non zero\n", (void *)WR(q)); 1707 mir_svc_idle_stop(WR(q), mir); 1708 } 1709 mutex_exit(&mir->mir_mutex); 1710 } 1711 1712 static void 1713 mir_rput_proto(queue_t *q, mblk_t *mp) 1714 { 1715 mir_t *mir = (mir_t *)q->q_ptr; 1716 uint32_t type; 1717 uint32_t reason = 0; 1718 1719 ASSERT(MUTEX_NOT_HELD(&mir->mir_mutex)); 1720 1721 type = ((union T_primitives *)mp->b_rptr)->type; 1722 switch (mir->mir_type) { 1723 case RPC_CLIENT: 1724 switch (type) { 1725 case T_DISCON_IND: 1726 reason = ((struct T_discon_ind *) 1727 (mp->b_rptr))->DISCON_reason; 1728 /*FALLTHROUGH*/ 1729 case T_ORDREL_IND: 1730 mutex_enter(&mir->mir_mutex); 1731 if (mir->mir_head_mp) { 1732 freemsg(mir->mir_head_mp); 1733 mir->mir_head_mp = (mblk_t *)0; 1734 mir->mir_tail_mp = (mblk_t *)0; 1735 } 1736 /* 1737 * We are disconnecting, but not necessarily 1738 * closing. By not closing, we will fail to 1739 * pick up a possibly changed global timeout value, 1740 * unless we store it now. 1741 */ 1742 mir->mir_idle_timeout = clnt_idle_timeout; 1743 mir_clnt_idle_stop(WR(q), mir); 1744 1745 /* 1746 * Even though we are unconnected, we still 1747 * leave the idle timer going on the client. The 1748 * reason for is that if we've disconnected due 1749 * to a server-side disconnect, reset, or connection 1750 * timeout, there is a possibility the client may 1751 * retry the RPC request. This retry needs to done on 1752 * the same bound address for the server to interpret 1753 * it as such. However, we don't want 1754 * to wait forever for that possibility. If the 1755 * end-point stays unconnected for mir_idle_timeout 1756 * units of time, then that is a signal to the 1757 * connection manager to give up waiting for the 1758 * application (eg. NFS) to send a retry. 1759 */ 1760 mir_clnt_idle_start(WR(q), mir); 1761 mutex_exit(&mir->mir_mutex); 1762 clnt_dispatch_notifyall(WR(q), type, reason); 1763 freemsg(mp); 1764 return; 1765 case T_ERROR_ACK: 1766 { 1767 struct T_error_ack *terror; 1768 1769 terror = (struct T_error_ack *)mp->b_rptr; 1770 RPCLOG(1, "mir_rput_proto T_ERROR_ACK for queue 0x%p", 1771 (void *)q); 1772 RPCLOG(1, " ERROR_prim: %s,", 1773 rpc_tpiprim2name(terror->ERROR_prim)); 1774 RPCLOG(1, " TLI_error: %s,", 1775 rpc_tpierr2name(terror->TLI_error)); 1776 RPCLOG(1, " UNIX_error: %d\n", terror->UNIX_error); 1777 if (terror->ERROR_prim == T_DISCON_REQ) { 1778 clnt_dispatch_notifyall(WR(q), type, reason); 1779 freemsg(mp); 1780 return; 1781 } else { 1782 if (clnt_dispatch_notifyconn(WR(q), mp)) 1783 return; 1784 } 1785 break; 1786 } 1787 case T_OK_ACK: 1788 { 1789 struct T_ok_ack *tok = (struct T_ok_ack *)mp->b_rptr; 1790 1791 if (tok->CORRECT_prim == T_DISCON_REQ) { 1792 clnt_dispatch_notifyall(WR(q), type, reason); 1793 freemsg(mp); 1794 return; 1795 } else { 1796 if (clnt_dispatch_notifyconn(WR(q), mp)) 1797 return; 1798 } 1799 break; 1800 } 1801 case T_CONN_CON: 1802 case T_INFO_ACK: 1803 case T_OPTMGMT_ACK: 1804 if (clnt_dispatch_notifyconn(WR(q), mp)) 1805 return; 1806 break; 1807 case T_BIND_ACK: 1808 break; 1809 default: 1810 RPCLOG(1, "mir_rput: unexpected message %d " 1811 "for KRPC client\n", 1812 ((union T_primitives *)mp->b_rptr)->type); 1813 break; 1814 } 1815 break; 1816 1817 case RPC_SERVER: 1818 switch (type) { 1819 case T_BIND_ACK: 1820 { 1821 struct T_bind_ack *tbind; 1822 1823 /* 1824 * If this is a listening stream, then shut 1825 * off the idle timer. 1826 */ 1827 tbind = (struct T_bind_ack *)mp->b_rptr; 1828 if (tbind->CONIND_number > 0) { 1829 mutex_enter(&mir->mir_mutex); 1830 mir_svc_idle_stop(WR(q), mir); 1831 1832 /* 1833 * mark this as a listen endpoint 1834 * for special handling. 1835 */ 1836 1837 mir->mir_listen_stream = 1; 1838 mutex_exit(&mir->mir_mutex); 1839 } 1840 break; 1841 } 1842 case T_DISCON_IND: 1843 case T_ORDREL_IND: 1844 RPCLOG(16, "mir_rput_proto: got %s indication\n", 1845 type == T_DISCON_IND ? "disconnect" 1846 : "orderly release"); 1847 1848 /* 1849 * For listen endpoint just pass 1850 * on the message. 1851 */ 1852 1853 if (mir->mir_listen_stream) 1854 break; 1855 1856 mutex_enter(&mir->mir_mutex); 1857 1858 /* 1859 * If client wants to break off connection, record 1860 * that fact. 1861 */ 1862 mir_svc_start_close(WR(q), mir); 1863 1864 /* 1865 * If we are idle, then send the orderly release 1866 * or disconnect indication to nfsd. 1867 */ 1868 if (MIR_SVC_QUIESCED(mir)) { 1869 mutex_exit(&mir->mir_mutex); 1870 break; 1871 } 1872 1873 RPCLOG(16, "mir_rput_proto: not idle, so " 1874 "disconnect/ord rel indication not passed " 1875 "upstream on 0x%p\n", (void *)q); 1876 1877 /* 1878 * Hold the indication until we get idle 1879 * If there already is an indication stored, 1880 * replace it if the new one is a disconnect. The 1881 * reasoning is that disconnection takes less time 1882 * to process, and once a client decides to 1883 * disconnect, we should do that. 1884 */ 1885 if (mir->mir_svc_pend_mp) { 1886 if (type == T_DISCON_IND) { 1887 RPCLOG(16, "mir_rput_proto: replacing" 1888 " held disconnect/ord rel" 1889 " indication with disconnect on" 1890 " 0x%p\n", (void *)q); 1891 1892 freemsg(mir->mir_svc_pend_mp); 1893 mir->mir_svc_pend_mp = mp; 1894 } else { 1895 RPCLOG(16, "mir_rput_proto: already " 1896 "held a disconnect/ord rel " 1897 "indication. freeing ord rel " 1898 "ind on 0x%p\n", (void *)q); 1899 freemsg(mp); 1900 } 1901 } else 1902 mir->mir_svc_pend_mp = mp; 1903 1904 mutex_exit(&mir->mir_mutex); 1905 return; 1906 1907 default: 1908 /* nfsd handles server-side non-data messages. */ 1909 break; 1910 } 1911 break; 1912 1913 default: 1914 break; 1915 } 1916 1917 putnext(q, mp); 1918 } 1919 1920 /* 1921 * The server-side read queues are used to hold inbound messages while 1922 * outbound flow control is exerted. When outbound flow control is 1923 * relieved, mir_wsrv qenables the read-side queue. Read-side queues 1924 * are not enabled by STREAMS and are explicitly noenable'ed in mir_open. 1925 * 1926 * For the server side, we have two types of messages queued. The first type 1927 * are messages that are ready to be XDR decoded and and then sent to the 1928 * RPC program's dispatch routine. The second type are "raw" messages that 1929 * haven't been processed, i.e. assembled from rpc record fragements into 1930 * full requests. The only time we will see the second type of message 1931 * queued is if we have a memory allocation failure while processing a 1932 * a raw message. The field mir_first_non_processed_mblk will mark the 1933 * first such raw message. So the flow for server side is: 1934 * 1935 * - send processed queued messages to kRPC until we run out or find 1936 * one that needs additional processing because we were short on memory 1937 * earlier 1938 * - process a message that was deferred because of lack of 1939 * memory 1940 * - continue processing messages until the queue empties or we 1941 * have to stop because of lack of memory 1942 * - during each of the above phase, if the queue is empty and 1943 * there are no pending messages that were passed to the RPC 1944 * layer, send upstream the pending disconnect/ordrel indication if 1945 * there is one 1946 * 1947 * The read-side queue is also enabled by a bufcall callback if dupmsg 1948 * fails in mir_rput. 1949 */ 1950 static void 1951 mir_rsrv(queue_t *q) 1952 { 1953 mir_t *mir; 1954 mblk_t *mp; 1955 mblk_t *cmp = NULL; 1956 boolean_t stop_timer = B_FALSE; 1957 1958 mir = (mir_t *)q->q_ptr; 1959 mutex_enter(&mir->mir_mutex); 1960 1961 mp = NULL; 1962 switch (mir->mir_type) { 1963 case RPC_SERVER: 1964 if (mir->mir_ref_cnt == 0) 1965 mir->mir_hold_inbound = 0; 1966 if (mir->mir_hold_inbound) { 1967 1968 ASSERT(cmp == NULL); 1969 if (q->q_first == NULL) { 1970 1971 MIR_CLEAR_INRSRV(mir); 1972 1973 if (MIR_SVC_QUIESCED(mir)) { 1974 cmp = mir->mir_svc_pend_mp; 1975 mir->mir_svc_pend_mp = NULL; 1976 } 1977 } 1978 1979 mutex_exit(&mir->mir_mutex); 1980 1981 if (cmp != NULL) { 1982 RPCLOG(16, "mir_rsrv: line %d: sending a held " 1983 "disconnect/ord rel indication upstream\n", 1984 __LINE__); 1985 putnext(q, cmp); 1986 } 1987 1988 return; 1989 } 1990 while (mp = getq(q)) { 1991 if (mir->mir_krpc_cell && 1992 (mir->mir_svc_no_more_msgs == 0)) { 1993 /* 1994 * If we were idle, turn off idle timer since 1995 * we aren't idle any more. 1996 */ 1997 if (mir->mir_ref_cnt++ == 0) 1998 stop_timer = B_TRUE; 1999 if (mir_check_len(q, 2000 (int32_t)msgdsize(mp), mp)) 2001 return; 2002 svc_queuereq(q, mp); 2003 } else { 2004 /* 2005 * Count # of times this happens. Should be 2006 * never, but experience shows otherwise. 2007 */ 2008 if (mir->mir_krpc_cell == NULL) 2009 mir_krpc_cell_null++; 2010 freemsg(mp); 2011 } 2012 } 2013 break; 2014 case RPC_CLIENT: 2015 break; 2016 default: 2017 RPCLOG(1, "mir_rsrv: unexpected mir_type %d\n", mir->mir_type); 2018 2019 if (q->q_first == NULL) 2020 MIR_CLEAR_INRSRV(mir); 2021 2022 mutex_exit(&mir->mir_mutex); 2023 2024 return; 2025 } 2026 2027 /* 2028 * The timer is stopped after all the messages are processed. 2029 * The reason is that stopping the timer releases the mir_mutex 2030 * lock temporarily. This means that the request can be serviced 2031 * while we are still processing the message queue. This is not 2032 * good. So we stop the timer here instead. 2033 */ 2034 if (stop_timer) { 2035 RPCLOG(16, "mir_rsrv stopping idle timer on 0x%p because ref " 2036 "cnt going to non zero\n", (void *)WR(q)); 2037 mir_svc_idle_stop(WR(q), mir); 2038 } 2039 2040 if (q->q_first == NULL) { 2041 2042 MIR_CLEAR_INRSRV(mir); 2043 2044 ASSERT(cmp == NULL); 2045 if (mir->mir_type == RPC_SERVER && MIR_SVC_QUIESCED(mir)) { 2046 cmp = mir->mir_svc_pend_mp; 2047 mir->mir_svc_pend_mp = NULL; 2048 } 2049 2050 mutex_exit(&mir->mir_mutex); 2051 2052 if (cmp != NULL) { 2053 RPCLOG(16, "mir_rsrv: line %d: sending a held " 2054 "disconnect/ord rel indication upstream\n", 2055 __LINE__); 2056 putnext(q, cmp); 2057 } 2058 2059 return; 2060 } 2061 mutex_exit(&mir->mir_mutex); 2062 } 2063 2064 static int mir_svc_policy_fails; 2065 2066 /* 2067 * Called to send an event code to nfsd/lockd so that it initiates 2068 * connection close. 2069 */ 2070 static int 2071 mir_svc_policy_notify(queue_t *q, int event) 2072 { 2073 mblk_t *mp; 2074 #ifdef DEBUG 2075 mir_t *mir = (mir_t *)q->q_ptr; 2076 ASSERT(MUTEX_NOT_HELD(&mir->mir_mutex)); 2077 #endif 2078 ASSERT(q->q_flag & QREADR); 2079 2080 /* 2081 * Create an M_DATA message with the event code and pass it to the 2082 * Stream head (nfsd or whoever created the stream will consume it). 2083 */ 2084 mp = allocb(sizeof (int), BPRI_HI); 2085 2086 if (!mp) { 2087 2088 mir_svc_policy_fails++; 2089 RPCLOG(16, "mir_svc_policy_notify: could not allocate event " 2090 "%d\n", event); 2091 return (ENOMEM); 2092 } 2093 2094 U32_TO_BE32(event, mp->b_rptr); 2095 mp->b_wptr = mp->b_rptr + sizeof (int); 2096 putnext(q, mp); 2097 return (0); 2098 } 2099 2100 /* 2101 * Server side: start the close phase. We want to get this rpcmod slot in an 2102 * idle state before mir_close() is called. 2103 */ 2104 static void 2105 mir_svc_start_close(queue_t *wq, mir_t *mir) 2106 { 2107 ASSERT(MUTEX_HELD(&mir->mir_mutex)); 2108 ASSERT((wq->q_flag & QREADR) == 0); 2109 ASSERT(mir->mir_type == RPC_SERVER); 2110 2111 2112 /* 2113 * Do not accept any more messages. 2114 */ 2115 mir->mir_svc_no_more_msgs = 1; 2116 2117 /* 2118 * Next two statements will make the read service procedure invoke 2119 * svc_queuereq() on everything stuck in the streams read queue. 2120 * It's not necessary because enabling the write queue will 2121 * have the same effect, but why not speed the process along? 2122 */ 2123 mir->mir_hold_inbound = 0; 2124 qenable(RD(wq)); 2125 2126 /* 2127 * Meanwhile force the write service procedure to send the 2128 * responses downstream, regardless of flow control. 2129 */ 2130 qenable(wq); 2131 } 2132 2133 /* 2134 * This routine is called directly by KRPC after a request is completed, 2135 * whether a reply was sent or the request was dropped. 2136 */ 2137 static void 2138 mir_svc_release(queue_t *wq, mblk_t *mp) 2139 { 2140 mir_t *mir = (mir_t *)wq->q_ptr; 2141 mblk_t *cmp = NULL; 2142 2143 ASSERT((wq->q_flag & QREADR) == 0); 2144 if (mp) 2145 freemsg(mp); 2146 2147 mutex_enter(&mir->mir_mutex); 2148 2149 /* 2150 * Start idle processing if this is the last reference. 2151 */ 2152 if ((mir->mir_ref_cnt == 1) && (mir->mir_inrservice == 0)) { 2153 cmp = mir->mir_svc_pend_mp; 2154 mir->mir_svc_pend_mp = NULL; 2155 } 2156 2157 if (cmp) { 2158 RPCLOG(16, "mir_svc_release: sending a held " 2159 "disconnect/ord rel indication upstream on queue 0x%p\n", 2160 (void *)RD(wq)); 2161 2162 mutex_exit(&mir->mir_mutex); 2163 2164 putnext(RD(wq), cmp); 2165 2166 mutex_enter(&mir->mir_mutex); 2167 } 2168 2169 /* 2170 * Start idle processing if this is the last reference. 2171 */ 2172 if (mir->mir_ref_cnt == 1 && mir->mir_inrservice == 0) { 2173 2174 RPCLOG(16, "mir_svc_release starting idle timer on 0x%p " 2175 "because ref cnt is zero\n", (void *) wq); 2176 2177 mir_svc_idle_start(wq, mir); 2178 } 2179 2180 mir->mir_ref_cnt--; 2181 ASSERT(mir->mir_ref_cnt >= 0); 2182 2183 /* 2184 * Wake up the thread waiting to close. 2185 */ 2186 2187 if ((mir->mir_ref_cnt == 0) && mir->mir_closing) 2188 cv_signal(&mir->mir_condvar); 2189 2190 mutex_exit(&mir->mir_mutex); 2191 } 2192 2193 /* 2194 * This routine is called by server-side KRPC when it is ready to 2195 * handle inbound messages on the stream. 2196 */ 2197 static void 2198 mir_svc_start(queue_t *wq) 2199 { 2200 mir_t *mir = (mir_t *)wq->q_ptr; 2201 2202 /* 2203 * no longer need to take the mir_mutex because the 2204 * mir_setup_complete field has been moved out of 2205 * the binary field protected by the mir_mutex. 2206 */ 2207 2208 mir->mir_setup_complete = 1; 2209 qenable(RD(wq)); 2210 } 2211 2212 /* 2213 * client side wrapper for stopping timer with normal idle timeout. 2214 */ 2215 static void 2216 mir_clnt_idle_stop(queue_t *wq, mir_t *mir) 2217 { 2218 ASSERT(MUTEX_HELD(&mir->mir_mutex)); 2219 ASSERT((wq->q_flag & QREADR) == 0); 2220 ASSERT(mir->mir_type == RPC_CLIENT); 2221 2222 mir_timer_stop(mir); 2223 } 2224 2225 /* 2226 * client side wrapper for stopping timer with normal idle timeout. 2227 */ 2228 static void 2229 mir_clnt_idle_start(queue_t *wq, mir_t *mir) 2230 { 2231 ASSERT(MUTEX_HELD(&mir->mir_mutex)); 2232 ASSERT((wq->q_flag & QREADR) == 0); 2233 ASSERT(mir->mir_type == RPC_CLIENT); 2234 2235 mir_timer_start(wq, mir, mir->mir_idle_timeout); 2236 } 2237 2238 /* 2239 * client side only. Forces rpcmod to stop sending T_ORDREL_REQs on 2240 * end-points that aren't connected. 2241 */ 2242 static void 2243 mir_clnt_idle_do_stop(queue_t *wq) 2244 { 2245 mir_t *mir = (mir_t *)wq->q_ptr; 2246 2247 RPCLOG(1, "mir_clnt_idle_do_stop: wq 0x%p\n", (void *)wq); 2248 ASSERT(MUTEX_NOT_HELD(&mir->mir_mutex)); 2249 mutex_enter(&mir->mir_mutex); 2250 mir_clnt_idle_stop(wq, mir); 2251 mutex_exit(&mir->mir_mutex); 2252 } 2253 2254 /* 2255 * Timer handler. It handles idle timeout and memory shortage problem. 2256 */ 2257 static void 2258 mir_timer(void *arg) 2259 { 2260 queue_t *wq = (queue_t *)arg; 2261 mir_t *mir = (mir_t *)wq->q_ptr; 2262 boolean_t notify; 2263 2264 mutex_enter(&mir->mir_mutex); 2265 2266 /* 2267 * mir_timer_call is set only when either mir_timer_[start|stop] 2268 * is progressing. And mir_timer() can only be run while they 2269 * are progressing if the timer is being stopped. So just 2270 * return. 2271 */ 2272 if (mir->mir_timer_call) { 2273 mutex_exit(&mir->mir_mutex); 2274 return; 2275 } 2276 mir->mir_timer_id = 0; 2277 2278 switch (mir->mir_type) { 2279 case RPC_CLIENT: 2280 2281 /* 2282 * For clients, the timer fires at clnt_idle_timeout 2283 * intervals. If the activity marker (mir_clntreq) is 2284 * zero, then the stream has been idle since the last 2285 * timer event and we notify KRPC. If mir_clntreq is 2286 * non-zero, then the stream is active and we just 2287 * restart the timer for another interval. mir_clntreq 2288 * is set to 1 in mir_wput for every request passed 2289 * downstream. 2290 * 2291 * If this was a memory shortage timer reset the idle 2292 * timeout regardless; the mir_clntreq will not be a 2293 * valid indicator. 2294 * 2295 * The timer is initially started in mir_wput during 2296 * RPC_CLIENT ioctl processing. 2297 * 2298 * The timer interval can be changed for individual 2299 * streams with the ND variable "mir_idle_timeout". 2300 */ 2301 if (mir->mir_clntreq > 0 && mir->mir_use_timestamp + 2302 MSEC_TO_TICK(mir->mir_idle_timeout) - lbolt >= 0) { 2303 clock_t tout; 2304 2305 tout = mir->mir_idle_timeout - 2306 TICK_TO_MSEC(lbolt - mir->mir_use_timestamp); 2307 if (tout < 0) 2308 tout = 1000; 2309 #if 0 2310 printf("mir_timer[%d < %d + %d]: reset client timer " 2311 "to %d (ms)\n", TICK_TO_MSEC(lbolt), 2312 TICK_TO_MSEC(mir->mir_use_timestamp), 2313 mir->mir_idle_timeout, tout); 2314 #endif 2315 mir->mir_clntreq = 0; 2316 mir_timer_start(wq, mir, tout); 2317 mutex_exit(&mir->mir_mutex); 2318 return; 2319 } 2320 #if 0 2321 printf("mir_timer[%d]: doing client timeout\n", lbolt / hz); 2322 #endif 2323 /* 2324 * We are disconnecting, but not necessarily 2325 * closing. By not closing, we will fail to 2326 * pick up a possibly changed global timeout value, 2327 * unless we store it now. 2328 */ 2329 mir->mir_idle_timeout = clnt_idle_timeout; 2330 mir_clnt_idle_start(wq, mir); 2331 2332 mutex_exit(&mir->mir_mutex); 2333 /* 2334 * We pass T_ORDREL_REQ as an integer value 2335 * to KRPC as the indication that the stream 2336 * is idle. This is not a T_ORDREL_REQ message, 2337 * it is just a convenient value since we call 2338 * the same KRPC routine for T_ORDREL_INDs and 2339 * T_DISCON_INDs. 2340 */ 2341 clnt_dispatch_notifyall(wq, T_ORDREL_REQ, 0); 2342 return; 2343 2344 case RPC_SERVER: 2345 2346 /* 2347 * For servers, the timer is only running when the stream 2348 * is really idle or memory is short. The timer is started 2349 * by mir_wput when mir_type is set to RPC_SERVER and 2350 * by mir_svc_idle_start whenever the stream goes idle 2351 * (mir_ref_cnt == 0). The timer is cancelled in 2352 * mir_rput whenever a new inbound request is passed to KRPC 2353 * and the stream was previously idle. 2354 * 2355 * The timer interval can be changed for individual 2356 * streams with the ND variable "mir_idle_timeout". 2357 * 2358 * If the stream is not idle do nothing. 2359 */ 2360 if (!MIR_SVC_QUIESCED(mir)) { 2361 mutex_exit(&mir->mir_mutex); 2362 return; 2363 } 2364 2365 notify = !mir->mir_inrservice; 2366 mutex_exit(&mir->mir_mutex); 2367 2368 /* 2369 * If there is no packet queued up in read queue, the stream 2370 * is really idle so notify nfsd to close it. 2371 */ 2372 if (notify) { 2373 RPCLOG(16, "mir_timer: telling stream head listener " 2374 "to close stream (0x%p)\n", (void *) RD(wq)); 2375 (void) mir_svc_policy_notify(RD(wq), 1); 2376 } 2377 return; 2378 default: 2379 RPCLOG(1, "mir_timer: unexpected mir_type %d\n", 2380 mir->mir_type); 2381 mutex_exit(&mir->mir_mutex); 2382 return; 2383 } 2384 } 2385 2386 /* 2387 * Called by the RPC package to send either a call or a return, or a 2388 * transport connection request. Adds the record marking header. 2389 */ 2390 static void 2391 mir_wput(queue_t *q, mblk_t *mp) 2392 { 2393 uint_t frag_header; 2394 mir_t *mir = (mir_t *)q->q_ptr; 2395 uchar_t *rptr = mp->b_rptr; 2396 2397 if (!mir) { 2398 freemsg(mp); 2399 return; 2400 } 2401 2402 if (mp->b_datap->db_type != M_DATA) { 2403 mir_wput_other(q, mp); 2404 return; 2405 } 2406 2407 if (mir->mir_ordrel_pending == 1) { 2408 freemsg(mp); 2409 RPCLOG(16, "mir_wput wq 0x%p: got data after T_ORDREL_REQ\n", 2410 (void *)q); 2411 return; 2412 } 2413 2414 frag_header = (uint_t)DLEN(mp); 2415 frag_header |= MIR_LASTFRAG; 2416 2417 /* Stick in the 4 byte record marking header. */ 2418 if ((rptr - mp->b_datap->db_base) < sizeof (uint32_t) || 2419 !IS_P2ALIGNED(mp->b_rptr, sizeof (uint32_t))) { 2420 /* 2421 * Since we know that M_DATA messages are created exclusively 2422 * by KRPC, we expect that KRPC will leave room for our header 2423 * and 4 byte align which is normal for XDR. 2424 * If KRPC (or someone else) does not cooperate, then we 2425 * just throw away the message. 2426 */ 2427 RPCLOG(1, "mir_wput: KRPC did not leave space for record " 2428 "fragment header (%d bytes left)\n", 2429 (int)(rptr - mp->b_datap->db_base)); 2430 freemsg(mp); 2431 return; 2432 } 2433 rptr -= sizeof (uint32_t); 2434 *(uint32_t *)rptr = htonl(frag_header); 2435 mp->b_rptr = rptr; 2436 2437 mutex_enter(&mir->mir_mutex); 2438 if (mir->mir_type == RPC_CLIENT) { 2439 /* 2440 * For the client, set mir_clntreq to indicate that the 2441 * connection is active. 2442 */ 2443 mir->mir_clntreq = 1; 2444 mir->mir_use_timestamp = lbolt; 2445 } 2446 2447 /* 2448 * If we haven't already queued some data and the downstream module 2449 * can accept more data, send it on, otherwise we queue the message 2450 * and take other actions depending on mir_type. 2451 */ 2452 if (!mir->mir_inwservice && MIR_WCANPUTNEXT(mir, q)) { 2453 mutex_exit(&mir->mir_mutex); 2454 2455 /* 2456 * Now we pass the RPC message downstream. 2457 */ 2458 putnext(q, mp); 2459 return; 2460 } 2461 2462 switch (mir->mir_type) { 2463 case RPC_CLIENT: 2464 /* 2465 * Check for a previous duplicate request on the 2466 * queue. If there is one, then we throw away 2467 * the current message and let the previous one 2468 * go through. If we can't find a duplicate, then 2469 * send this one. This tap dance is an effort 2470 * to reduce traffic and processing requirements 2471 * under load conditions. 2472 */ 2473 if (mir_clnt_dup_request(q, mp)) { 2474 mutex_exit(&mir->mir_mutex); 2475 freemsg(mp); 2476 return; 2477 } 2478 break; 2479 case RPC_SERVER: 2480 /* 2481 * Set mir_hold_inbound so that new inbound RPC 2482 * messages will be held until the client catches 2483 * up on the earlier replies. This flag is cleared 2484 * in mir_wsrv after flow control is relieved; 2485 * the read-side queue is also enabled at that time. 2486 */ 2487 mir->mir_hold_inbound = 1; 2488 break; 2489 default: 2490 RPCLOG(1, "mir_wput: unexpected mir_type %d\n", mir->mir_type); 2491 break; 2492 } 2493 mir->mir_inwservice = 1; 2494 (void) putq(q, mp); 2495 mutex_exit(&mir->mir_mutex); 2496 } 2497 2498 static void 2499 mir_wput_other(queue_t *q, mblk_t *mp) 2500 { 2501 mir_t *mir = (mir_t *)q->q_ptr; 2502 struct iocblk *iocp; 2503 uchar_t *rptr = mp->b_rptr; 2504 bool_t flush_in_svc = FALSE; 2505 2506 ASSERT(MUTEX_NOT_HELD(&mir->mir_mutex)); 2507 switch (mp->b_datap->db_type) { 2508 case M_IOCTL: 2509 iocp = (struct iocblk *)rptr; 2510 switch (iocp->ioc_cmd) { 2511 case RPC_CLIENT: 2512 mutex_enter(&mir->mir_mutex); 2513 if (mir->mir_type != 0 && 2514 mir->mir_type != iocp->ioc_cmd) { 2515 ioc_eperm: 2516 mutex_exit(&mir->mir_mutex); 2517 iocp->ioc_error = EPERM; 2518 iocp->ioc_count = 0; 2519 mp->b_datap->db_type = M_IOCACK; 2520 qreply(q, mp); 2521 return; 2522 } 2523 2524 mir->mir_type = iocp->ioc_cmd; 2525 2526 /* 2527 * Clear mir_hold_inbound which was set to 1 by 2528 * mir_open. This flag is not used on client 2529 * streams. 2530 */ 2531 mir->mir_hold_inbound = 0; 2532 mir->mir_max_msg_sizep = &clnt_max_msg_size; 2533 2534 /* 2535 * Start the idle timer. See mir_timer() for more 2536 * information on how client timers work. 2537 */ 2538 mir->mir_idle_timeout = clnt_idle_timeout; 2539 mir_clnt_idle_start(q, mir); 2540 mutex_exit(&mir->mir_mutex); 2541 2542 mp->b_datap->db_type = M_IOCACK; 2543 qreply(q, mp); 2544 return; 2545 case RPC_SERVER: 2546 mutex_enter(&mir->mir_mutex); 2547 if (mir->mir_type != 0 && 2548 mir->mir_type != iocp->ioc_cmd) 2549 goto ioc_eperm; 2550 2551 /* 2552 * We don't clear mir_hold_inbound here because 2553 * mir_hold_inbound is used in the flow control 2554 * model. If we cleared it here, then we'd commit 2555 * a small violation to the model where the transport 2556 * might immediately block downstream flow. 2557 */ 2558 2559 mir->mir_type = iocp->ioc_cmd; 2560 mir->mir_max_msg_sizep = &svc_max_msg_size; 2561 2562 /* 2563 * Start the idle timer. See mir_timer() for more 2564 * information on how server timers work. 2565 * 2566 * Note that it is important to start the idle timer 2567 * here so that connections time out even if we 2568 * never receive any data on them. 2569 */ 2570 mir->mir_idle_timeout = svc_idle_timeout; 2571 RPCLOG(16, "mir_wput_other starting idle timer on 0x%p " 2572 "because we got RPC_SERVER ioctl\n", (void *)q); 2573 mir_svc_idle_start(q, mir); 2574 mutex_exit(&mir->mir_mutex); 2575 2576 mp->b_datap->db_type = M_IOCACK; 2577 qreply(q, mp); 2578 return; 2579 default: 2580 break; 2581 } 2582 break; 2583 2584 case M_PROTO: 2585 if (mir->mir_type == RPC_CLIENT) { 2586 /* 2587 * We are likely being called from the context of a 2588 * service procedure. So we need to enqueue. However 2589 * enqueing may put our message behind data messages. 2590 * So flush the data first. 2591 */ 2592 flush_in_svc = TRUE; 2593 } 2594 if ((mp->b_wptr - rptr) < sizeof (uint32_t) || 2595 !IS_P2ALIGNED(rptr, sizeof (uint32_t))) 2596 break; 2597 2598 switch (((union T_primitives *)rptr)->type) { 2599 case T_DATA_REQ: 2600 /* Don't pass T_DATA_REQ messages downstream. */ 2601 freemsg(mp); 2602 return; 2603 case T_ORDREL_REQ: 2604 RPCLOG(8, "mir_wput_other wq 0x%p: got T_ORDREL_REQ\n", 2605 (void *)q); 2606 mutex_enter(&mir->mir_mutex); 2607 if (mir->mir_type != RPC_SERVER) { 2608 /* 2609 * We are likely being called from 2610 * clnt_dispatch_notifyall(). Sending 2611 * a T_ORDREL_REQ will result in 2612 * a some kind of _IND message being sent, 2613 * will be another call to 2614 * clnt_dispatch_notifyall(). To keep the stack 2615 * lean, queue this message. 2616 */ 2617 mir->mir_inwservice = 1; 2618 (void) putq(q, mp); 2619 mutex_exit(&mir->mir_mutex); 2620 return; 2621 } 2622 2623 /* 2624 * Mark the structure such that we don't accept any 2625 * more requests from client. We could defer this 2626 * until we actually send the orderly release 2627 * request downstream, but all that does is delay 2628 * the closing of this stream. 2629 */ 2630 RPCLOG(16, "mir_wput_other wq 0x%p: got T_ORDREL_REQ " 2631 " so calling mir_svc_start_close\n", (void *)q); 2632 2633 mir_svc_start_close(q, mir); 2634 2635 /* 2636 * If we have sent down a T_ORDREL_REQ, don't send 2637 * any more. 2638 */ 2639 if (mir->mir_ordrel_pending) { 2640 freemsg(mp); 2641 mutex_exit(&mir->mir_mutex); 2642 return; 2643 } 2644 2645 /* 2646 * If the stream is not idle, then we hold the 2647 * orderly release until it becomes idle. This 2648 * ensures that KRPC will be able to reply to 2649 * all requests that we have passed to it. 2650 * 2651 * We also queue the request if there is data already 2652 * queued, because we cannot allow the T_ORDREL_REQ 2653 * to go before data. When we had a separate reply 2654 * count, this was not a problem, because the 2655 * reply count was reconciled when mir_wsrv() 2656 * completed. 2657 */ 2658 if (!MIR_SVC_QUIESCED(mir) || 2659 mir->mir_inwservice == 1) { 2660 mir->mir_inwservice = 1; 2661 (void) putq(q, mp); 2662 2663 RPCLOG(16, "mir_wput_other: queuing " 2664 "T_ORDREL_REQ on 0x%p\n", (void *)q); 2665 2666 mutex_exit(&mir->mir_mutex); 2667 return; 2668 } 2669 2670 /* 2671 * Mark the structure so that we know we sent 2672 * an orderly release request, and reset the idle timer. 2673 */ 2674 mir->mir_ordrel_pending = 1; 2675 2676 RPCLOG(16, "mir_wput_other: calling mir_svc_idle_start" 2677 " on 0x%p because we got T_ORDREL_REQ\n", 2678 (void *)q); 2679 2680 mir_svc_idle_start(q, mir); 2681 mutex_exit(&mir->mir_mutex); 2682 2683 /* 2684 * When we break, we will putnext the T_ORDREL_REQ. 2685 */ 2686 break; 2687 2688 case T_CONN_REQ: 2689 mutex_enter(&mir->mir_mutex); 2690 if (mir->mir_head_mp != NULL) { 2691 freemsg(mir->mir_head_mp); 2692 mir->mir_head_mp = NULL; 2693 mir->mir_tail_mp = NULL; 2694 } 2695 mir->mir_frag_len = -(int32_t)sizeof (uint32_t); 2696 /* 2697 * Restart timer in case mir_clnt_idle_do_stop() was 2698 * called. 2699 */ 2700 mir->mir_idle_timeout = clnt_idle_timeout; 2701 mir_clnt_idle_stop(q, mir); 2702 mir_clnt_idle_start(q, mir); 2703 mutex_exit(&mir->mir_mutex); 2704 break; 2705 2706 default: 2707 /* 2708 * T_DISCON_REQ is one of the interesting default 2709 * cases here. Ideally, an M_FLUSH is done before 2710 * T_DISCON_REQ is done. However, that is somewhat 2711 * cumbersome for clnt_cots.c to do. So we queue 2712 * T_DISCON_REQ, and let the service procedure 2713 * flush all M_DATA. 2714 */ 2715 break; 2716 } 2717 /* fallthru */; 2718 default: 2719 if (mp->b_datap->db_type >= QPCTL) { 2720 if (mp->b_datap->db_type == M_FLUSH) { 2721 if (mir->mir_type == RPC_CLIENT && 2722 *mp->b_rptr & FLUSHW) { 2723 RPCLOG(32, "mir_wput_other: flushing " 2724 "wq 0x%p\n", (void *)q); 2725 if (*mp->b_rptr & FLUSHBAND) { 2726 flushband(q, *(mp->b_rptr + 1), 2727 FLUSHDATA); 2728 } else { 2729 flushq(q, FLUSHDATA); 2730 } 2731 } else { 2732 RPCLOG(32, "mir_wput_other: ignoring " 2733 "M_FLUSH on wq 0x%p\n", (void *)q); 2734 } 2735 } 2736 break; 2737 } 2738 2739 mutex_enter(&mir->mir_mutex); 2740 if (mir->mir_inwservice == 0 && MIR_WCANPUTNEXT(mir, q)) { 2741 mutex_exit(&mir->mir_mutex); 2742 break; 2743 } 2744 mir->mir_inwservice = 1; 2745 mir->mir_inwflushdata = flush_in_svc; 2746 (void) putq(q, mp); 2747 mutex_exit(&mir->mir_mutex); 2748 qenable(q); 2749 2750 return; 2751 } 2752 putnext(q, mp); 2753 } 2754 2755 static void 2756 mir_wsrv(queue_t *q) 2757 { 2758 mblk_t *mp; 2759 mir_t *mir; 2760 bool_t flushdata; 2761 2762 mir = (mir_t *)q->q_ptr; 2763 mutex_enter(&mir->mir_mutex); 2764 2765 flushdata = mir->mir_inwflushdata; 2766 mir->mir_inwflushdata = 0; 2767 2768 while (mp = getq(q)) { 2769 if (mp->b_datap->db_type == M_DATA) { 2770 /* 2771 * Do not send any more data if we have sent 2772 * a T_ORDREL_REQ. 2773 */ 2774 if (flushdata || mir->mir_ordrel_pending == 1) { 2775 freemsg(mp); 2776 continue; 2777 } 2778 2779 /* 2780 * Make sure that the stream can really handle more 2781 * data. 2782 */ 2783 if (!MIR_WCANPUTNEXT(mir, q)) { 2784 (void) putbq(q, mp); 2785 mutex_exit(&mir->mir_mutex); 2786 return; 2787 } 2788 2789 /* 2790 * Now we pass the RPC message downstream. 2791 */ 2792 mutex_exit(&mir->mir_mutex); 2793 putnext(q, mp); 2794 mutex_enter(&mir->mir_mutex); 2795 continue; 2796 } 2797 2798 /* 2799 * This is not an RPC message, pass it downstream 2800 * (ignoring flow control) if the server side is not sending a 2801 * T_ORDREL_REQ downstream. 2802 */ 2803 if (mir->mir_type != RPC_SERVER || 2804 ((union T_primitives *)mp->b_rptr)->type != 2805 T_ORDREL_REQ) { 2806 mutex_exit(&mir->mir_mutex); 2807 putnext(q, mp); 2808 mutex_enter(&mir->mir_mutex); 2809 continue; 2810 } 2811 2812 if (mir->mir_ordrel_pending == 1) { 2813 /* 2814 * Don't send two T_ORDRELs 2815 */ 2816 freemsg(mp); 2817 continue; 2818 } 2819 2820 /* 2821 * Mark the structure so that we know we sent an orderly 2822 * release request. We will check to see slot is idle at the 2823 * end of this routine, and if so, reset the idle timer to 2824 * handle orderly release timeouts. 2825 */ 2826 mir->mir_ordrel_pending = 1; 2827 RPCLOG(16, "mir_wsrv: sending ordrel req on q 0x%p\n", 2828 (void *)q); 2829 /* 2830 * Send the orderly release downstream. If there are other 2831 * pending replies we won't be able to send them. However, 2832 * the only reason we should send the orderly release is if 2833 * we were idle, or if an unusual event occurred. 2834 */ 2835 mutex_exit(&mir->mir_mutex); 2836 putnext(q, mp); 2837 mutex_enter(&mir->mir_mutex); 2838 } 2839 2840 if (q->q_first == NULL) 2841 /* 2842 * If we call mir_svc_idle_start() below, then 2843 * clearing mir_inwservice here will also result in 2844 * any thread waiting in mir_close() to be signaled. 2845 */ 2846 mir->mir_inwservice = 0; 2847 2848 if (mir->mir_type != RPC_SERVER) { 2849 mutex_exit(&mir->mir_mutex); 2850 return; 2851 } 2852 2853 /* 2854 * If idle we call mir_svc_idle_start to start the timer (or wakeup 2855 * a close). Also make sure not to start the idle timer on the 2856 * listener stream. This can cause nfsd to send an orderly release 2857 * command on the listener stream. 2858 */ 2859 if (MIR_SVC_QUIESCED(mir) && !(mir->mir_listen_stream)) { 2860 RPCLOG(16, "mir_wsrv: calling mir_svc_idle_start on 0x%p " 2861 "because mir slot is idle\n", (void *)q); 2862 mir_svc_idle_start(q, mir); 2863 } 2864 2865 /* 2866 * If outbound flow control has been relieved, then allow new 2867 * inbound requests to be processed. 2868 */ 2869 if (mir->mir_hold_inbound) { 2870 mir->mir_hold_inbound = 0; 2871 qenable(RD(q)); 2872 } 2873 mutex_exit(&mir->mir_mutex); 2874 } 2875 2876 static void 2877 mir_disconnect(queue_t *q, mir_t *mir) 2878 { 2879 ASSERT(MUTEX_HELD(&mir->mir_mutex)); 2880 2881 switch (mir->mir_type) { 2882 case RPC_CLIENT: 2883 /* 2884 * We are disconnecting, but not necessarily 2885 * closing. By not closing, we will fail to 2886 * pick up a possibly changed global timeout value, 2887 * unless we store it now. 2888 */ 2889 mir->mir_idle_timeout = clnt_idle_timeout; 2890 mir_clnt_idle_start(WR(q), mir); 2891 mutex_exit(&mir->mir_mutex); 2892 2893 /* 2894 * T_DISCON_REQ is passed to KRPC as an integer value 2895 * (this is not a TPI message). It is used as a 2896 * convenient value to indicate a sanity check 2897 * failure -- the same KRPC routine is also called 2898 * for T_DISCON_INDs and T_ORDREL_INDs. 2899 */ 2900 clnt_dispatch_notifyall(WR(q), T_DISCON_REQ, 0); 2901 break; 2902 2903 case RPC_SERVER: 2904 mir->mir_svc_no_more_msgs = 1; 2905 mir_svc_idle_stop(WR(q), mir); 2906 mutex_exit(&mir->mir_mutex); 2907 RPCLOG(16, "mir_disconnect: telling " 2908 "stream head listener to disconnect stream " 2909 "(0x%p)\n", (void *) q); 2910 (void) mir_svc_policy_notify(q, 2); 2911 break; 2912 2913 default: 2914 mutex_exit(&mir->mir_mutex); 2915 break; 2916 } 2917 } 2918 2919 /* 2920 * Sanity check the message length, and if it's too large, shutdown the 2921 * connection. Returns 1 if the connection is shutdown; 0 otherwise. 2922 */ 2923 static int 2924 mir_check_len(queue_t *q, int32_t frag_len, mblk_t *head_mp) 2925 { 2926 mir_t *mir = q->q_ptr; 2927 uint_t maxsize = 0; 2928 2929 if (mir->mir_max_msg_sizep != NULL) 2930 maxsize = *mir->mir_max_msg_sizep; 2931 2932 if (maxsize == 0 || frag_len <= (int)maxsize) 2933 return (0); 2934 2935 freemsg(head_mp); 2936 mir->mir_head_mp = NULL; 2937 mir->mir_tail_mp = NULL; 2938 mir->mir_frag_header = 0; 2939 mir->mir_frag_len = -(int32_t)sizeof (uint32_t); 2940 if (mir->mir_type != RPC_SERVER || mir->mir_setup_complete) { 2941 cmn_err(CE_NOTE, 2942 "KRPC: record fragment from %s of size(%d) exceeds " 2943 "maximum (%u). Disconnecting", 2944 (mir->mir_type == RPC_CLIENT) ? "server" : 2945 (mir->mir_type == RPC_SERVER) ? "client" : 2946 "test tool", frag_len, maxsize); 2947 } 2948 2949 mir_disconnect(q, mir); 2950 return (1); 2951 } 2952