Lines Matching refs:so

63 static boolean_t so_check_length(sonode_t *so);
67 so_acceptq_dequeue_locked(struct sonode *so, boolean_t dontblock, in so_acceptq_dequeue_locked() argument
73 ASSERT(MUTEX_HELD(&so->so_acceptq_lock)); in so_acceptq_dequeue_locked()
74 while ((nso = list_remove_head(&so->so_acceptq_list)) == NULL) { in so_acceptq_dequeue_locked()
84 if (so->so_state & (SS_CLOSING | SS_FALLBACK_PENDING)) in so_acceptq_dequeue_locked()
87 if (cv_wait_sig_swap(&so->so_acceptq_cv, in so_acceptq_dequeue_locked()
88 &so->so_acceptq_lock) == 0) in so_acceptq_dequeue_locked()
93 ASSERT(so->so_acceptq_len > 0); in so_acceptq_dequeue_locked()
94 so->so_acceptq_len--; in so_acceptq_dequeue_locked()
123 so_acceptq_dequeue(struct sonode *so, boolean_t dontblock, in so_acceptq_dequeue() argument
128 mutex_enter(&so->so_acceptq_lock); in so_acceptq_dequeue()
129 error = so_acceptq_dequeue_locked(so, dontblock, nsop); in so_acceptq_dequeue()
130 mutex_exit(&so->so_acceptq_lock); in so_acceptq_dequeue()
136 so_acceptq_flush_impl(struct sonode *so, list_t *list, boolean_t doclose) in so_acceptq_flush_impl() argument
149 ASSERT(so->so_filter_active == 0); in so_acceptq_flush_impl()
183 so_acceptq_flush(struct sonode *so, boolean_t doclose) in so_acceptq_flush() argument
185 so_acceptq_flush_impl(so, &so->so_acceptq_list, doclose); in so_acceptq_flush()
186 so_acceptq_flush_impl(so, &so->so_acceptq_defer, doclose); in so_acceptq_flush()
188 so->so_acceptq_len = 0; in so_acceptq_flush()
192 so_wait_connected_locked(struct sonode *so, boolean_t nonblock, in so_wait_connected_locked() argument
195 ASSERT(MUTEX_HELD(&so->so_lock)); in so_wait_connected_locked()
202 if (so->so_error != 0 && SOCK_CONNID_LT(so->so_proto_connid, id)) in so_wait_connected_locked()
203 so->so_error = 0; in so_wait_connected_locked()
205 while (SOCK_CONNID_LT(so->so_proto_connid, id)) { in so_wait_connected_locked()
209 if (so->so_state & (SS_CLOSING | SS_FALLBACK_PENDING)) in so_wait_connected_locked()
212 if (cv_wait_sig_swap(&so->so_state_cv, &so->so_lock) == 0) in so_wait_connected_locked()
216 if (so->so_error != 0) in so_wait_connected_locked()
217 return (sogeterr(so, B_TRUE)); in so_wait_connected_locked()
224 if ((so->so_state & SS_ISCONNECTED) == 0) in so_wait_connected_locked()
248 so_wait_connected(struct sonode *so, boolean_t nonblock, sock_connid_t id) in so_wait_connected() argument
252 mutex_enter(&so->so_lock); in so_wait_connected()
253 error = so_wait_connected_locked(so, nonblock, id); in so_wait_connected()
254 mutex_exit(&so->so_lock); in so_wait_connected()
260 so_snd_wait_qnotfull_locked(struct sonode *so, boolean_t dontblock) in so_snd_wait_qnotfull_locked() argument
264 ASSERT(MUTEX_HELD(&so->so_lock)); in so_snd_wait_qnotfull_locked()
265 while (SO_SND_FLOWCTRLD(so)) { in so_snd_wait_qnotfull_locked()
266 if (so->so_state & SS_CANTSENDMORE) in so_snd_wait_qnotfull_locked()
271 if (so->so_state & (SS_CLOSING | SS_FALLBACK_PENDING)) in so_snd_wait_qnotfull_locked()
274 if (so->so_sndtimeo == 0) { in so_snd_wait_qnotfull_locked()
278 error = cv_wait_sig(&so->so_snd_cv, &so->so_lock); in so_snd_wait_qnotfull_locked()
280 error = cv_reltimedwait_sig(&so->so_snd_cv, in so_snd_wait_qnotfull_locked()
281 &so->so_lock, so->so_sndtimeo, TR_CLOCK_TICK); in so_snd_wait_qnotfull_locked()
298 so_snd_wait_qnotfull(struct sonode *so, boolean_t dontblock) in so_snd_wait_qnotfull() argument
302 mutex_enter(&so->so_lock); in so_snd_wait_qnotfull()
303 so->so_snd_wakeup = B_TRUE; in so_snd_wait_qnotfull()
304 error = so_snd_wait_qnotfull_locked(so, dontblock); in so_snd_wait_qnotfull()
305 so->so_snd_wakeup = B_FALSE; in so_snd_wait_qnotfull()
306 mutex_exit(&so->so_lock); in so_snd_wait_qnotfull()
312 so_snd_qfull(struct sonode *so) in so_snd_qfull() argument
314 mutex_enter(&so->so_lock); in so_snd_qfull()
315 so->so_snd_qfull = B_TRUE; in so_snd_qfull()
316 mutex_exit(&so->so_lock); in so_snd_qfull()
320 so_snd_qnotfull(struct sonode *so) in so_snd_qnotfull() argument
322 mutex_enter(&so->so_lock); in so_snd_qnotfull()
323 so->so_snd_qfull = B_FALSE; in so_snd_qnotfull()
325 cv_broadcast(&so->so_snd_cv); in so_snd_qnotfull()
326 mutex_exit(&so->so_lock); in so_snd_qnotfull()
333 socket_chgpgrp(struct sonode *so, pid_t pid) in socket_chgpgrp() argument
337 ASSERT(MUTEX_HELD(&so->so_lock)); in socket_chgpgrp()
349 so->so_pgrp = pid; in socket_chgpgrp()
383 socket_sendsig(struct sonode *so, int event) in socket_sendsig() argument
387 ASSERT(MUTEX_HELD(&so->so_lock)); in socket_sendsig()
389 if (so->so_pgrp == 0 || (!(so->so_state & SS_ASYNC) && in socket_sendsig()
394 dprint(3, ("sending sig %d to %d\n", event, so->so_pgrp)); in socket_sendsig()
396 if (so->so_pgrp > 0) { in socket_sendsig()
408 proc = prfind_zone(so->so_pgrp, so->so_zoneid); in socket_sendsig()
422 pid_t pgrp = -so->so_pgrp; in socket_sendsig()
430 proc = pgfind_zone(pgrp, so->so_zoneid); in socket_sendsig()
545 so_prepend_msg(struct sonode *so, mblk_t *mp, mblk_t *last_tail) in so_prepend_msg() argument
548 mp->b_next = so->so_rcv_q_head; in so_prepend_msg()
552 if (so->so_rcv_q_head == NULL) { in so_prepend_msg()
553 ASSERT(so->so_rcv_q_last_head == NULL); in so_prepend_msg()
554 so->so_rcv_q_last_head = mp; in so_prepend_msg()
557 ASSERT(!(DB_FLAGS(so->so_rcv_q_head) & DBLK_UIOA)); in so_prepend_msg()
560 so->so_rcv_q_head = mp; in so_prepend_msg()
564 mutex_enter(&so->so_lock); in so_prepend_msg()
565 ASSERT(so_check_length(so)); in so_prepend_msg()
566 mutex_exit(&so->so_lock); in so_prepend_msg()
576 so_process_new_message(struct sonode *so, mblk_t *mp_head, mblk_t *mp_last_head) in so_process_new_message() argument
578 if (so->so_filter_active > 0 && in so_process_new_message()
579 (mp_head = sof_filter_data_in_proc(so, mp_head, in so_process_new_message()
584 if (so->so_rcv_q_head == NULL) { in so_process_new_message()
585 so->so_rcv_q_head = mp_head; in so_process_new_message()
586 so->so_rcv_q_last_head = mp_last_head; in so_process_new_message()
587 ASSERT(so->so_rcv_q_last_head->b_prev != NULL); in so_process_new_message()
590 (DB_FLAGS(so->so_rcv_q_last_head) & DBLK_UIOA)); in so_process_new_message()
594 DB_TYPE(so->so_rcv_q_last_head) == M_DATA && flag_equal) { in so_process_new_message()
595 so->so_rcv_q_last_head->b_prev->b_cont = mp_head; in so_process_new_message()
596 so->so_rcv_q_last_head->b_prev = mp_head->b_prev; in so_process_new_message()
604 so->so_rcv_q_last_head->b_prev->b_cont = mp_head; in so_process_new_message()
605 so->so_rcv_q_last_head->b_prev = mp_head->b_prev; in so_process_new_message()
608 so->so_rcv_q_last_head->b_next = mp_head->b_next; in so_process_new_message()
610 so->so_rcv_q_last_head = mp_last_head; in so_process_new_message()
622 so->so_rcv_q_last_head->b_next = mp_head; in so_process_new_message()
623 so->so_rcv_q_last_head = mp_last_head; in so_process_new_message()
634 so_check_flow_control(struct sonode *so) in so_check_flow_control() argument
636 ASSERT(MUTEX_HELD(&so->so_lock)); in so_check_flow_control()
638 if (so->so_flowctrld && (so->so_rcv_queued < so->so_rcvlowat && in so_check_flow_control()
639 !(so->so_state & SS_FIL_RCV_FLOWCTRL))) { in so_check_flow_control()
640 so->so_flowctrld = B_FALSE; in so_check_flow_control()
641 mutex_exit(&so->so_lock); in so_check_flow_control()
646 if (so->so_downcalls != NULL && in so_check_flow_control()
647 so->so_downcalls->sd_clr_flowctrl != NULL) { in so_check_flow_control()
648 (*so->so_downcalls->sd_clr_flowctrl) in so_check_flow_control()
649 (so->so_proto_handle); in so_check_flow_control()
652 sof_sonode_notify_filters(so, SOF_EV_INJECT_DATA_IN_OK, 0); in so_check_flow_control()
655 mutex_exit(&so->so_lock); in so_check_flow_control()
661 so_dequeue_msg(struct sonode *so, mblk_t **mctlp, struct uio *uiop, in so_dequeue_msg() argument
674 sodirect_t *sodp = so->so_direct; in so_dequeue_msg()
679 mutex_enter(&so->so_lock); in so_dequeue_msg()
683 ASSERT(so_check_length(so)); in so_dequeue_msg()
686 if (so->so_state & SS_RCVATMARK) { in so_dequeue_msg()
689 mutex_exit(&so->so_lock); in so_dequeue_msg()
709 sod_uioa_so_init(so, sodp, uiop); in so_dequeue_msg()
715 new_msg_head = so->so_rcv_head; in so_dequeue_msg()
716 new_msg_last_head = so->so_rcv_last_head; in so_dequeue_msg()
717 so->so_rcv_head = NULL; in so_dequeue_msg()
718 so->so_rcv_last_head = NULL; in so_dequeue_msg()
719 oobmark = so->so_oobmark; in so_dequeue_msg()
723 mutex_exit(&so->so_lock); in so_dequeue_msg()
726 so_process_new_message(so, new_msg_head, new_msg_last_head); in so_dequeue_msg()
731 mp = so->so_rcv_q_head; in so_dequeue_msg()
734 (so->so_rcv_timer_tid == 0 || in so_dequeue_msg()
735 so->so_rcv_queued >= so->so_rcv_thresh)) { in so_dequeue_msg()
754 so->so_rcv_q_head = mp->b_next; in so_dequeue_msg()
755 if (so->so_rcv_q_head == NULL) { in so_dequeue_msg()
756 so->so_rcv_q_last_head = NULL; in so_dequeue_msg()
791 mutex_enter(&so->so_lock); in so_dequeue_msg()
793 copied = sod_uioa_mblk(so, mp); in so_dequeue_msg()
796 mutex_exit(&so->so_lock); in so_dequeue_msg()
825 mutex_enter(&so->so_lock); in so_dequeue_msg()
826 so->so_rcv_queued -= copied; in so_dequeue_msg()
827 ASSERT(so->so_oobmark >= 0); in so_dequeue_msg()
828 if (so->so_oobmark > 0) { in so_dequeue_msg()
829 so->so_oobmark -= copied; in so_dequeue_msg()
830 ASSERT(so->so_oobmark >= 0); in so_dequeue_msg()
831 if (so->so_oobmark == 0) { in so_dequeue_msg()
832 ASSERT(so->so_state & in so_dequeue_msg()
834 so->so_oobmark = 0; in so_dequeue_msg()
835 so->so_state |= SS_RCVATMARK; in so_dequeue_msg()
842 rvalp->r_val2 = so_check_flow_control(so); in so_dequeue_msg()
854 mutex_enter(&so->so_lock); in so_dequeue_msg()
855 so->so_rcv_queued -= msize; in so_dequeue_msg()
861 so_check_flow_control(so); in so_dequeue_msg()
911 so_prepend_msg(so, mp, last_tail); in so_dequeue_msg()
916 if (partial_read && !(so->so_state & SS_RCVATMARK) && in so_dequeue_msg()
918 !(flags & MSG_PEEK) && so->so_rcv_head != NULL) { in so_dequeue_msg()
922 mutex_enter(&so->so_lock); in so_dequeue_msg()
923 if (so->so_error != 0) { in so_dequeue_msg()
924 error = sogeterr(so, !(flags & MSG_PEEK)); in so_dequeue_msg()
925 mutex_exit(&so->so_lock); in so_dequeue_msg()
930 if (so->so_rcv_head != NULL) in so_dequeue_msg()
937 if (!(so->so_state & SS_CANTRCVMORE) && uiop->uio_resid > 0) { in so_dequeue_msg()
942 if (so->so_state & (SS_CLOSING | in so_dequeue_msg()
944 mutex_exit(&so->so_lock); in so_dequeue_msg()
949 so->so_rcv_wakeup = B_TRUE; in so_dequeue_msg()
950 so->so_rcv_wanted = uiop->uio_resid; in so_dequeue_msg()
951 if (so->so_rcvtimeo == 0) { in so_dequeue_msg()
955 error = cv_wait_sig(&so->so_rcv_cv, in so_dequeue_msg()
956 &so->so_lock); in so_dequeue_msg()
959 &so->so_rcv_cv, &so->so_lock, in so_dequeue_msg()
960 so->so_rcvtimeo, TR_CLOCK_TICK); in so_dequeue_msg()
962 so->so_rcv_wakeup = B_FALSE; in so_dequeue_msg()
963 so->so_rcv_wanted = 0; in so_dequeue_msg()
974 mutex_exit(&so->so_lock); in so_dequeue_msg()
983 mutex_enter(&so->so_lock); in so_dequeue_msg()
984 ASSERT(so_verify_oobstate(so)); in so_dequeue_msg()
985 so->so_state &= ~(SS_OOBPEND|SS_HAVEOOBDATA|SS_RCVATMARK); in so_dequeue_msg()
986 freemsg(so->so_oobmsg); in so_dequeue_msg()
987 so->so_oobmsg = NULL; in so_dequeue_msg()
988 ASSERT(so_verify_oobstate(so)); in so_dequeue_msg()
989 mutex_exit(&so->so_lock); in so_dequeue_msg()
991 ASSERT(so->so_rcv_wakeup == B_FALSE); in so_dequeue_msg()
994 mutex_enter(&so->so_lock); in so_dequeue_msg()
999 ASSERT(so->so_rcv_q_head != NULL || in so_dequeue_msg()
1000 so->so_rcv_head != NULL); in so_dequeue_msg()
1001 so->so_rcv_queued -= sod_uioa_mblk(so, NULL); in so_dequeue_msg()
1006 mutex_exit(&so->so_lock); in so_dequeue_msg()
1010 mutex_enter(&so->so_lock); in so_dequeue_msg()
1011 ASSERT(so_check_length(so)); in so_dequeue_msg()
1012 mutex_exit(&so->so_lock); in so_dequeue_msg()
1016 ASSERT(MUTEX_NOT_HELD(&so->so_lock)); in so_dequeue_msg()
1030 so_enqueue_msg(struct sonode *so, mblk_t *mp, size_t msg_size) in so_enqueue_msg() argument
1032 ASSERT(MUTEX_HELD(&so->so_lock)); in so_enqueue_msg()
1036 ASSERT(so_check_length(so)); in so_enqueue_msg()
1039 so->so_rcv_queued += msg_size; in so_enqueue_msg()
1041 if (so->so_rcv_head == NULL) { in so_enqueue_msg()
1042 ASSERT(so->so_rcv_last_head == NULL); in so_enqueue_msg()
1043 so->so_rcv_head = mp; in so_enqueue_msg()
1044 so->so_rcv_last_head = mp; in so_enqueue_msg()
1046 DB_TYPE(so->so_rcv_last_head) == M_DATA) && in so_enqueue_msg()
1048 (DB_FLAGS(so->so_rcv_last_head) & DBLK_UIOA))) { in so_enqueue_msg()
1050 ASSERT(so->so_rcv_last_head != NULL); in so_enqueue_msg()
1051 ASSERT(so->so_rcv_last_head->b_prev != NULL); in so_enqueue_msg()
1052 so->so_rcv_last_head->b_prev->b_cont = mp; in so_enqueue_msg()
1055 so->so_rcv_last_head->b_next = mp; in so_enqueue_msg()
1056 so->so_rcv_last_head = mp; in so_enqueue_msg()
1061 so->so_rcv_last_head->b_prev = mp; in so_enqueue_msg()
1064 ASSERT(so_check_length(so)); in so_enqueue_msg()
1091 so_rcv_flush(struct sonode *so) in so_rcv_flush() argument
1095 ASSERT(MUTEX_HELD(&so->so_lock)); in so_rcv_flush()
1097 if (so->so_oobmsg != NULL) { in so_rcv_flush()
1098 freemsg(so->so_oobmsg); in so_rcv_flush()
1099 so->so_oobmsg = NULL; in so_rcv_flush()
1100 so->so_oobmark = 0; in so_rcv_flush()
1101 so->so_state &= in so_rcv_flush()
1108 while (so->so_rcv_q_head != NULL) { in so_rcv_flush()
1109 mp = so->so_rcv_q_head; in so_rcv_flush()
1110 so->so_rcv_q_head = mp->b_next; in so_rcv_flush()
1114 while (so->so_rcv_head != NULL) { in so_rcv_flush()
1115 mp = so->so_rcv_head; in so_rcv_flush()
1116 so->so_rcv_head = mp->b_next; in so_rcv_flush()
1120 so->so_rcv_queued = 0; in so_rcv_flush()
1121 so->so_rcv_q_head = NULL; in so_rcv_flush()
1122 so->so_rcv_q_last_head = NULL; in so_rcv_flush()
1123 so->so_rcv_head = NULL; in so_rcv_flush()
1124 so->so_rcv_last_head = NULL; in so_rcv_flush()
1131 sorecvoob(struct sonode *so, struct nmsghdr *msg, struct uio *uiop, int flags, in sorecvoob() argument
1137 dprintso(so, 1, ("sorecvoob(%p, %p, 0x%x)\n", (void *)so, (void *)msg, in sorecvoob()
1150 mutex_enter(&so->so_lock); in sorecvoob()
1151 ASSERT(so_verify_oobstate(so)); in sorecvoob()
1153 (so->so_state & (SS_OOBPEND|SS_HADOOBDATA)) != SS_OOBPEND) { in sorecvoob()
1154 dprintso(so, 1, ("sorecvoob: inline or data consumed\n")); in sorecvoob()
1155 mutex_exit(&so->so_lock); in sorecvoob()
1158 if (!(so->so_state & SS_HAVEOOBDATA)) { in sorecvoob()
1159 dprintso(so, 1, ("sorecvoob: no data yet\n")); in sorecvoob()
1160 mutex_exit(&so->so_lock); in sorecvoob()
1163 ASSERT(so->so_oobmsg != NULL); in sorecvoob()
1164 mp = so->so_oobmsg; in sorecvoob()
1191 so->so_oobmsg = NULL; in sorecvoob()
1192 so->so_state ^= SS_HAVEOOBDATA|SS_HADOOBDATA; in sorecvoob()
1194 ASSERT(so_verify_oobstate(so)); in sorecvoob()
1195 mutex_exit(&so->so_lock); in sorecvoob()
1223 sonode_t *so; in socket_sonode_create() local
1244 so = kmem_cache_alloc(socket_cache, kmflags); in socket_sonode_create()
1245 if (so == NULL) { in socket_sonode_create()
1250 sonode_init(so, sp, family, type, protocol, &so_sonodeops); in socket_sonode_create()
1255 so->so_version = (short)version; in socket_sonode_create()
1261 so->so_proto_props.sopp_rxhiwat = SOCKET_RECVHIWATER; in socket_sonode_create()
1262 so->so_proto_props.sopp_rxlowat = SOCKET_RECVLOWATER; in socket_sonode_create()
1263 so->so_proto_props.sopp_maxpsz = INFPSZ; in socket_sonode_create()
1264 so->so_proto_props.sopp_maxblk = INFPSZ; in socket_sonode_create()
1266 return (so); in socket_sonode_create()
1270 socket_init_common(struct sonode *so, struct sonode *pso, int flags, cred_t *cr) in socket_init_common() argument
1284 so->so_state |= SS_ISCONNECTED | (pso->so_state & SS_ASYNC); in socket_init_common()
1285 so->so_pgrp = pso->so_pgrp; in socket_init_common()
1286 so->so_rcvtimeo = pso->so_rcvtimeo; in socket_init_common()
1287 so->so_sndtimeo = pso->so_sndtimeo; in socket_init_common()
1288 so->so_xpg_rcvbuf = pso->so_xpg_rcvbuf; in socket_init_common()
1295 so->so_options = pso->so_options & (SO_DEBUG|SO_REUSEADDR| in socket_init_common()
1298 so->so_proto_props = pso->so_proto_props; in socket_init_common()
1299 so->so_mode = pso->so_mode; in socket_init_common()
1300 so->so_pollev = pso->so_pollev & SO_POLLEV_ALWAYS; in socket_init_common()
1308 (error = sof_sonode_inherit_filters(so, pso)) != 0) in socket_init_common()
1312 struct sockparams *sp = so->so_sockparams; in socket_init_common()
1319 (error = sof_sonode_autoattach_filters(so, cr)) != 0) in socket_init_common()
1323 so->so_state |= SS_FILOP_OK; in socket_init_common()
1333 so->so_proto_handle = in socket_init_common()
1334 sp->sp_smod_info->smod_proto_create_func(so->so_family, in socket_init_common()
1335 so->so_type, so->so_protocol, &so->so_downcalls, in socket_init_common()
1336 &so->so_mode, &error, flags, cr); in socket_init_common()
1338 if (so->so_proto_handle == NULL) { in socket_init_common()
1347 ASSERT(so->so_downcalls != NULL); in socket_init_common()
1348 ASSERT(so->so_downcalls->sd_send != NULL || in socket_init_common()
1349 so->so_downcalls->sd_send_uio != NULL); in socket_init_common()
1350 if (so->so_downcalls->sd_recv_uio != NULL) { in socket_init_common()
1351 ASSERT(so->so_downcalls->sd_poll != NULL); in socket_init_common()
1352 so->so_pollev |= SO_POLLEV_ALWAYS; in socket_init_common()
1355 (*so->so_downcalls->sd_activate)(so->so_proto_handle, in socket_init_common()
1356 (sock_upper_handle_t)so, upcalls_to_use, 0, cr); in socket_init_common()
1364 if (so->so_protocol != so->so_sockparams->sp_protocol) { in socket_init_common()
1365 int protocol = so->so_protocol; in socket_init_common()
1370 error = socket_setsockopt(so, SOL_SOCKET, SO_PROTOTYPE, in socket_init_common()
1373 (void) (*so->so_downcalls->sd_close) in socket_init_common()
1374 (so->so_proto_handle, 0, cr); in socket_init_common()
1376 mutex_enter(&so->so_lock); in socket_init_common()
1377 so_rcv_flush(so); in socket_init_common()
1378 mutex_exit(&so->so_lock); in socket_init_common()
1390 sod_sock_init(so); in socket_init_common()
1393 VN_HOLD(SOTOV(so)); in socket_init_common()
1415 socket_ioctl_common(struct sonode *so, int cmd, intptr_t arg, int mode, in socket_ioctl_common() argument
1433 mutex_enter(&so->so_lock); in socket_ioctl_common()
1435 so->so_state |= SS_NDELAY; in socket_ioctl_common()
1437 so->so_state &= ~SS_NDELAY; in socket_ioctl_common()
1439 mutex_exit(&so->so_lock); in socket_ioctl_common()
1449 mutex_enter(&so->so_lock); in socket_ioctl_common()
1453 so->so_state |= SS_ASYNC; in socket_ioctl_common()
1456 so->so_state &= ~SS_ASYNC; in socket_ioctl_common()
1458 mutex_exit(&so->so_lock); in socket_ioctl_common()
1472 mutex_enter(&so->so_lock); in socket_ioctl_common()
1473 error = (pid != so->so_pgrp) ? socket_chgpgrp(so, pid) : 0; in socket_ioctl_common()
1474 mutex_exit(&so->so_lock); in socket_ioctl_common()
1479 if (so_copyout(&so->so_pgrp, (void *)arg, in socket_ioctl_common()
1490 if ((so->so_mode & SM_EXDATA) == 0) in socket_ioctl_common()
1497 if (so->so_downcalls->sd_recv_uio != NULL) in socket_ioctl_common()
1500 retval = (so->so_state & SS_RCVATMARK) != 0; in socket_ioctl_common()
1516 if (so->so_downcalls->sd_recv_uio != NULL) in socket_ioctl_common()
1519 retval = MIN(so->so_rcv_queued, INT_MAX); in socket_ioctl_common()
1534 mutex_enter(&so->so_lock); in socket_ioctl_common()
1535 if ((so->so_mode & SM_CONNREQUIRED) == 0) { in socket_ioctl_common()
1537 } else if ((so->so_state & SS_ISCONNECTED) == 0) { in socket_ioctl_common()
1539 } else if (so->so_peercred != NULL) { in socket_ioctl_common()
1541 kp->pc_cr = so->so_peercred; in socket_ioctl_common()
1542 kp->pc_cpid = so->so_cpid; in socket_ioctl_common()
1543 crhold(so->so_peercred); in socket_ioctl_common()
1547 mutex_exit(&so->so_lock); in socket_ioctl_common()
1559 so_strioc_nread(struct sonode *so, intptr_t arg, int mode, int32_t *rvalp) in so_strioc_nread() argument
1567 if (so->so_downcalls == NULL || in so_strioc_nread()
1568 so->so_downcalls->sd_recv_uio != NULL) in so_strioc_nread()
1571 mutex_enter(&so->so_lock); in so_strioc_nread()
1573 while (so->so_flag & SOREADLOCKED) { in so_strioc_nread()
1578 if (so->so_rcv_wakeup) in so_strioc_nread()
1582 (void) cv_reltimedwait(&so->so_read_cv, &so->so_lock, wakeup, in so_strioc_nread()
1591 mp = so->so_rcv_q_head; in so_strioc_nread()
1593 size = msgdsize(so->so_rcv_q_head); in so_strioc_nread()
1601 size = msgdsize(so->so_rcv_head); in so_strioc_nread()
1604 for (mp = so->so_rcv_head; mp != NULL; mp = mp->b_next) in so_strioc_nread()
1607 mutex_exit(&so->so_lock); in so_strioc_nread()
1631 socket_strioc_common(struct sonode *so, int cmd, intptr_t arg, int mode, in socket_strioc_common() argument
1649 return (so_strioc_nread(so, arg, mode, rvalp)); in socket_strioc_common()
1664 if ((retval = so_tpi_fallback(so, cr)) == 0) { in socket_strioc_common()
1666 ASSERT(so->so_rcv_q_head == NULL); in socket_strioc_common()
1667 return (SOP_IOCTL(so, cmd, arg, mode, cr, rvalp)); in socket_strioc_common()
1679 socket_getopt_common(struct sonode *so, int level, int option_name, in socket_getopt_common() argument
1699 mutex_enter(&so->so_lock); in socket_getopt_common()
1700 value = sogeterr(so, B_TRUE); in socket_getopt_common()
1701 mutex_exit(&so->so_lock); in socket_getopt_common()
1704 value = so->so_family; in socket_getopt_common()
1707 value = so->so_type; in socket_getopt_common()
1710 if (so->so_state & SS_ACCEPTCONN) in socket_getopt_common()
1736 value = drv_hztousec(so->so_rcvtimeo); in socket_getopt_common()
1738 value = drv_hztousec(so->so_sndtimeo); in socket_getopt_common()
1781 if ((flags & _SOGETSOCKOPT_XPG4_2) && so->so_xpg_rcvbuf != 0) { in socket_getopt_common()
1790 *(int32_t *)optval = so->so_xpg_rcvbuf; in socket_getopt_common()
1791 *optlenp = sizeof (so->so_xpg_rcvbuf); in socket_getopt_common()
1813 (so->so_proto_props).sopp_wroff; in socket_getopt_common()
1815 (so->so_proto_props).sopp_maxblk; in socket_getopt_common()
1817 (so->so_proto_props).sopp_maxpsz; in socket_getopt_common()
1819 (so->so_proto_props).sopp_tail; in socket_getopt_common()
1831 for (inst = so->so_filter_top; inst != NULL; in socket_getopt_common()
1848 socket_sonode_destroy(struct sonode *so) in socket_sonode_destroy() argument
1850 sonode_fini(so); in socket_sonode_destroy()
1851 kmem_cache_free(socket_cache, so); in socket_sonode_destroy()
1855 so_zcopy_wait(struct sonode *so) in so_zcopy_wait() argument
1859 mutex_enter(&so->so_lock); in so_zcopy_wait()
1860 while (!(so->so_copyflag & STZCNOTIFY)) { in so_zcopy_wait()
1861 if (so->so_state & SS_CLOSING) { in so_zcopy_wait()
1862 mutex_exit(&so->so_lock); in so_zcopy_wait()
1865 if (cv_wait_sig(&so->so_copy_cv, &so->so_lock) == 0) { in so_zcopy_wait()
1870 so->so_copyflag &= ~STZCNOTIFY; in so_zcopy_wait()
1871 mutex_exit(&so->so_lock); in so_zcopy_wait()
1878 struct sonode *so = (struct sonode *)arg; in so_timer_callback() local
1880 mutex_enter(&so->so_lock); in so_timer_callback()
1882 so->so_rcv_timer_tid = 0; in so_timer_callback()
1883 if (so->so_rcv_queued > 0) { in so_timer_callback()
1884 so_notify_data(so, so->so_rcv_queued); in so_timer_callback()
1886 mutex_exit(&so->so_lock); in so_timer_callback()
1896 so_check_length(sonode_t *so) in so_check_length() argument
1898 mblk_t *mp = so->so_rcv_q_head; in so_check_length()
1901 ASSERT(MUTEX_HELD(&so->so_lock)); in so_check_length()
1908 mp = so->so_rcv_head; in so_check_length()
1914 return ((len == so->so_rcv_queued) ? B_TRUE : B_FALSE); in so_check_length()
1935 so_start_fallback(struct sonode *so) in so_start_fallback() argument
1937 ASSERT(RW_READ_HELD(&so->so_fallback_rwlock)); in so_start_fallback()
1939 mutex_enter(&so->so_lock); in so_start_fallback()
1940 if (so->so_state & SS_FALLBACK_PENDING) { in so_start_fallback()
1941 mutex_exit(&so->so_lock); in so_start_fallback()
1944 so->so_state |= SS_FALLBACK_PENDING; in so_start_fallback()
1950 cv_broadcast(&so->so_state_cv); /* threads in connect() */ in so_start_fallback()
1951 cv_broadcast(&so->so_rcv_cv); /* threads in recvmsg() */ in so_start_fallback()
1952 cv_broadcast(&so->so_snd_cv); /* threads in sendmsg() */ in so_start_fallback()
1953 mutex_enter(&so->so_acceptq_lock); in so_start_fallback()
1954 cv_broadcast(&so->so_acceptq_cv); /* threads in accept() */ in so_start_fallback()
1955 mutex_exit(&so->so_acceptq_lock); in so_start_fallback()
1956 mutex_exit(&so->so_lock); in so_start_fallback()
1963 if (rw_tryupgrade(&so->so_fallback_rwlock) == 0) { in so_start_fallback()
1968 rw_exit(&so->so_fallback_rwlock); in so_start_fallback()
1969 DTRACE_PROBE1(pending__ops__wait, (struct sonode *), so); in so_start_fallback()
1970 rw_enter(&so->so_fallback_rwlock, RW_WRITER); in so_start_fallback()
1971 DTRACE_PROBE1(pending__ops__complete, (struct sonode *), so); in so_start_fallback()
1985 so_end_fallback(struct sonode *so) in so_end_fallback() argument
1987 ASSERT(RW_ISWRITER(&so->so_fallback_rwlock)); in so_end_fallback()
1989 mutex_enter(&so->so_lock); in so_end_fallback()
1990 so->so_state &= ~(SS_FALLBACK_PENDING|SS_FALLBACK_DRAIN); in so_end_fallback()
1991 mutex_exit(&so->so_lock); in so_end_fallback()
1993 rw_downgrade(&so->so_fallback_rwlock); in so_end_fallback()
2015 struct sonode *so = (struct sonode *)sock_handle; in so_quiesced_cb() local
2020 sotpi_update_state(so, tcap, laddr, laddrlen, faddr, faddrlen, in so_quiesced_cb()
2029 mutex_enter(&so->so_lock); in so_quiesced_cb()
2030 so->so_state |= SS_FALLBACK_DRAIN; in so_quiesced_cb()
2031 SOCKET_TIMER_CANCEL(so); in so_quiesced_cb()
2032 mutex_exit(&so->so_lock); in so_quiesced_cb()
2034 if (so->so_rcv_head != NULL) { in so_quiesced_cb()
2035 if (so->so_rcv_q_last_head == NULL) in so_quiesced_cb()
2036 so->so_rcv_q_head = so->so_rcv_head; in so_quiesced_cb()
2038 so->so_rcv_q_last_head->b_next = so->so_rcv_head; in so_quiesced_cb()
2039 so->so_rcv_q_last_head = so->so_rcv_last_head; in so_quiesced_cb()
2042 atmark = (so->so_state & SS_RCVATMARK) != 0; in so_quiesced_cb()
2049 so->so_state &= ~(SS_RCVATMARK|SS_OOBPEND|SS_HAVEOOBDATA); in so_quiesced_cb()
2051 ASSERT(so->so_oobmsg != NULL || so->so_oobmark <= so->so_rcv_queued); in so_quiesced_cb()
2056 while (so->so_rcv_q_head != NULL) { in so_quiesced_cb()
2057 mblk_t *mp = so->so_rcv_q_head; in so_quiesced_cb()
2060 so->so_rcv_q_head = mp->b_next; in so_quiesced_cb()
2079 if (IS_SO_OOB_INLINE(so)) { in so_quiesced_cb()
2082 ASSERT(so->so_oobmsg != NULL); in so_quiesced_cb()
2083 mp1->b_cont = so->so_oobmsg; in so_quiesced_cb()
2084 so->so_oobmsg = NULL; in so_quiesced_cb()
2087 mp->b_next = so->so_rcv_q_head; in so_quiesced_cb()
2088 so->so_rcv_q_head = mp; in so_quiesced_cb()
2095 } else if (so->so_oobmark > 0) { in so_quiesced_cb()
2100 if (so->so_oobmark < mlen) { in so_quiesced_cb()
2105 mlen = so->so_oobmark; in so_quiesced_cb()
2112 so->so_oobmark -= MBLKL(urg_mp); in so_quiesced_cb()
2115 } while (so->so_oobmark > 0); in so_quiesced_cb()
2118 urg_mp->b_next = so->so_rcv_q_head; in so_quiesced_cb()
2119 so->so_rcv_q_head = urg_mp; in so_quiesced_cb()
2122 so->so_oobmark -= mlen; in so_quiesced_cb()
2123 if (so->so_oobmark == 0) in so_quiesced_cb()
2131 so->so_rcv_queued -= mlen; in so_quiesced_cb()
2135 so->so_rcv_head = NULL; in so_quiesced_cb()
2136 so->so_rcv_last_head = NULL; in so_quiesced_cb()
2137 so->so_rcv_q_head = NULL; in so_quiesced_cb()
2138 so->so_rcv_q_last_head = NULL; in so_quiesced_cb()
2147 if (atmark || so->so_oobmark > 0) { in so_quiesced_cb()
2150 if (atmark && so->so_oobmsg != NULL) { in so_quiesced_cb()
2162 mp->b_cont = so->so_oobmsg; in so_quiesced_cb()
2163 so->so_oobmsg = NULL; in so_quiesced_cb()
2184 so->so_oobmark = 0; in so_quiesced_cb()
2187 ASSERT(so->so_oobmark == 0); in so_quiesced_cb()
2188 ASSERT(so->so_rcv_queued == 0); in so_quiesced_cb()
2263 so_tpi_fallback(struct sonode *so, struct cred *cr) in so_tpi_fallback() argument
2278 sp = so->so_sockparams; in so_tpi_fallback()
2284 if (so->so_filter_active > 0 || so->so_krecv_cb != NULL) in so_tpi_fallback()
2287 switch (so->so_family) { in so_tpi_fallback()
2309 if (!so_start_fallback(so)) in so_tpi_fallback()
2316 bcopy(so, &origso, sizeof (*so)); in so_tpi_fallback()
2321 newsp = sockparams_hold_ephemeral_bydev(so->so_family, so->so_type, in so_tpi_fallback()
2322 so->so_protocol, devpath, KM_SLEEP, &error); in so_tpi_fallback()
2326 if (so->so_direct != NULL) { in so_tpi_fallback()
2327 sodirect_t *sodp = so->so_direct; in so_tpi_fallback()
2328 mutex_enter(&so->so_lock); in so_tpi_fallback()
2330 so->so_direct->sod_enabled = B_FALSE; in so_tpi_fallback()
2331 so->so_state &= ~SS_SODIRECT; in so_tpi_fallback()
2333 mutex_exit(&so->so_lock); in so_tpi_fallback()
2337 error = sotpi_convert_sonode(so, newsp, &direct, &q, cr); in so_tpi_fallback()
2361 DTRACE_PROBE1(proto__fallback__begin, struct sonode *, so); in so_tpi_fallback()
2362 error = (*fbfunc)(so->so_proto_handle, q, direct, so_quiesced_cb, in so_tpi_fallback()
2364 DTRACE_PROBE1(proto__fallback__end, struct sonode *, so); in so_tpi_fallback()
2368 sotpi_revert_sonode(so, cr); in so_tpi_fallback()
2376 nso = list_head(&so->so_acceptq_list); in so_tpi_fallback()
2400 next = list_next(&so->so_acceptq_list, nso); in so_tpi_fallback()
2401 list_remove(&so->so_acceptq_list, nso); in so_tpi_fallback()
2402 so->so_acceptq_len--; in so_tpi_fallback()
2408 nso = list_next(&so->so_acceptq_list, nso); in so_tpi_fallback()
2416 so_acceptq_flush(so, B_FALSE); in so_tpi_fallback()
2418 mutex_enter(&so->so_lock); in so_tpi_fallback()
2419 so->so_state |= SS_FALLBACK_COMP; in so_tpi_fallback()
2420 mutex_exit(&so->so_lock); in so_tpi_fallback()
2426 so->so_ops = &sotpi_sonodeops; in so_tpi_fallback()
2433 pollwakeup(&so->so_poll_list, POLLERR); in so_tpi_fallback()
2440 ASSERT(SOTOV(so)->v_count >= 2); in so_tpi_fallback()
2441 VN_RELE(SOTOV(so)); in so_tpi_fallback()
2443 so_end_fallback(so); in so_tpi_fallback()
2447 so_integrity_check(so, &origso); in so_tpi_fallback()
2464 so_krecv_set(sonode_t *so, so_krecv_f cb, void *arg) in so_krecv_set() argument
2471 SO_BLOCK_FALLBACK(so, so_krecv_set(so, cb, arg)); in so_krecv_set()
2473 mutex_enter(&so->so_lock); in so_krecv_set()
2474 if (so->so_state & SS_FALLBACK_COMP) { in so_krecv_set()
2475 mutex_exit(&so->so_lock); in so_krecv_set()
2476 SO_UNBLOCK_FALLBACK(so); in so_krecv_set()
2480 ret = so_lock_read(so, 0); in so_krecv_set()
2487 so_rcv_flush(so); in so_krecv_set()
2489 so->so_krecv_cb = cb; in so_krecv_set()
2490 so->so_krecv_arg = arg; in so_krecv_set()
2492 so_unlock_read(so); in so_krecv_set()
2493 mutex_exit(&so->so_lock); in so_krecv_set()
2494 SO_UNBLOCK_FALLBACK(so); in so_krecv_set()
2500 so_krecv_unblock(sonode_t *so) in so_krecv_unblock() argument
2502 mutex_enter(&so->so_lock); in so_krecv_unblock()
2503 VERIFY(so->so_krecv_cb != NULL); in so_krecv_unblock()
2505 so->so_rcv_queued = 0; in so_krecv_unblock()
2506 (void) so_check_flow_control(so); in so_krecv_unblock()