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