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()
1710 value = so->so_family; in socket_getopt_common()
1713 value = so->so_type; in socket_getopt_common()
1716 if (so->so_state & SS_ACCEPTCONN) in socket_getopt_common()
1742 value = drv_hztousec(so->so_rcvtimeo); in socket_getopt_common()
1744 value = drv_hztousec(so->so_sndtimeo); in socket_getopt_common()
1787 if ((flags & _SOGETSOCKOPT_XPG4_2) && so->so_xpg_rcvbuf != 0) { in socket_getopt_common()
1796 *(int32_t *)optval = so->so_xpg_rcvbuf; in socket_getopt_common()
1797 *optlenp = sizeof (so->so_xpg_rcvbuf); in socket_getopt_common()
1819 (so->so_proto_props).sopp_wroff; in socket_getopt_common()
1821 (so->so_proto_props).sopp_maxblk; in socket_getopt_common()
1823 (so->so_proto_props).sopp_maxpsz; in socket_getopt_common()
1825 (so->so_proto_props).sopp_tail; in socket_getopt_common()
1837 for (inst = so->so_filter_top; inst != NULL; in socket_getopt_common()
1854 socket_sonode_destroy(struct sonode *so) in socket_sonode_destroy() argument
1856 sonode_fini(so); in socket_sonode_destroy()
1857 kmem_cache_free(socket_cache, so); in socket_sonode_destroy()
1861 so_zcopy_wait(struct sonode *so) in so_zcopy_wait() argument
1865 mutex_enter(&so->so_lock); in so_zcopy_wait()
1866 while (!(so->so_copyflag & STZCNOTIFY)) { in so_zcopy_wait()
1867 if (so->so_state & SS_CLOSING) { in so_zcopy_wait()
1868 mutex_exit(&so->so_lock); in so_zcopy_wait()
1871 if (cv_wait_sig(&so->so_copy_cv, &so->so_lock) == 0) { in so_zcopy_wait()
1876 so->so_copyflag &= ~STZCNOTIFY; in so_zcopy_wait()
1877 mutex_exit(&so->so_lock); in so_zcopy_wait()
1884 struct sonode *so = (struct sonode *)arg; in so_timer_callback() local
1886 mutex_enter(&so->so_lock); in so_timer_callback()
1888 so->so_rcv_timer_tid = 0; in so_timer_callback()
1889 if (so->so_rcv_queued > 0) { in so_timer_callback()
1890 so_notify_data(so, so->so_rcv_queued); in so_timer_callback()
1892 mutex_exit(&so->so_lock); in so_timer_callback()
1902 so_check_length(sonode_t *so) in so_check_length() argument
1904 mblk_t *mp = so->so_rcv_q_head; in so_check_length()
1907 ASSERT(MUTEX_HELD(&so->so_lock)); in so_check_length()
1914 mp = so->so_rcv_head; in so_check_length()
1920 return ((len == so->so_rcv_queued) ? B_TRUE : B_FALSE); in so_check_length()
1941 so_start_fallback(struct sonode *so) in so_start_fallback() argument
1943 ASSERT(RW_READ_HELD(&so->so_fallback_rwlock)); in so_start_fallback()
1945 mutex_enter(&so->so_lock); in so_start_fallback()
1946 if (so->so_state & SS_FALLBACK_PENDING) { in so_start_fallback()
1947 mutex_exit(&so->so_lock); in so_start_fallback()
1950 so->so_state |= SS_FALLBACK_PENDING; in so_start_fallback()
1956 cv_broadcast(&so->so_state_cv); /* threads in connect() */ in so_start_fallback()
1957 cv_broadcast(&so->so_rcv_cv); /* threads in recvmsg() */ in so_start_fallback()
1958 cv_broadcast(&so->so_snd_cv); /* threads in sendmsg() */ in so_start_fallback()
1959 mutex_enter(&so->so_acceptq_lock); in so_start_fallback()
1960 cv_broadcast(&so->so_acceptq_cv); /* threads in accept() */ in so_start_fallback()
1961 mutex_exit(&so->so_acceptq_lock); in so_start_fallback()
1962 mutex_exit(&so->so_lock); in so_start_fallback()
1969 if (rw_tryupgrade(&so->so_fallback_rwlock) == 0) { in so_start_fallback()
1974 rw_exit(&so->so_fallback_rwlock); in so_start_fallback()
1975 DTRACE_PROBE1(pending__ops__wait, (struct sonode *), so); in so_start_fallback()
1976 rw_enter(&so->so_fallback_rwlock, RW_WRITER); in so_start_fallback()
1977 DTRACE_PROBE1(pending__ops__complete, (struct sonode *), so); in so_start_fallback()
1991 so_end_fallback(struct sonode *so) in so_end_fallback() argument
1993 ASSERT(RW_ISWRITER(&so->so_fallback_rwlock)); in so_end_fallback()
1995 mutex_enter(&so->so_lock); in so_end_fallback()
1996 so->so_state &= ~(SS_FALLBACK_PENDING|SS_FALLBACK_DRAIN); in so_end_fallback()
1997 mutex_exit(&so->so_lock); in so_end_fallback()
1999 rw_downgrade(&so->so_fallback_rwlock); in so_end_fallback()
2021 struct sonode *so = (struct sonode *)sock_handle; in so_quiesced_cb() local
2026 sotpi_update_state(so, tcap, laddr, laddrlen, faddr, faddrlen, in so_quiesced_cb()
2035 mutex_enter(&so->so_lock); in so_quiesced_cb()
2036 so->so_state |= SS_FALLBACK_DRAIN; in so_quiesced_cb()
2037 SOCKET_TIMER_CANCEL(so); in so_quiesced_cb()
2038 mutex_exit(&so->so_lock); in so_quiesced_cb()
2040 if (so->so_rcv_head != NULL) { in so_quiesced_cb()
2041 if (so->so_rcv_q_last_head == NULL) in so_quiesced_cb()
2042 so->so_rcv_q_head = so->so_rcv_head; in so_quiesced_cb()
2044 so->so_rcv_q_last_head->b_next = so->so_rcv_head; in so_quiesced_cb()
2045 so->so_rcv_q_last_head = so->so_rcv_last_head; in so_quiesced_cb()
2048 atmark = (so->so_state & SS_RCVATMARK) != 0; in so_quiesced_cb()
2055 so->so_state &= ~(SS_RCVATMARK|SS_OOBPEND|SS_HAVEOOBDATA); in so_quiesced_cb()
2057 ASSERT(so->so_oobmsg != NULL || so->so_oobmark <= so->so_rcv_queued); in so_quiesced_cb()
2062 while (so->so_rcv_q_head != NULL) { in so_quiesced_cb()
2063 mblk_t *mp = so->so_rcv_q_head; in so_quiesced_cb()
2066 so->so_rcv_q_head = mp->b_next; in so_quiesced_cb()
2085 if (IS_SO_OOB_INLINE(so)) { in so_quiesced_cb()
2088 ASSERT(so->so_oobmsg != NULL); in so_quiesced_cb()
2089 mp1->b_cont = so->so_oobmsg; in so_quiesced_cb()
2090 so->so_oobmsg = NULL; in so_quiesced_cb()
2093 mp->b_next = so->so_rcv_q_head; in so_quiesced_cb()
2094 so->so_rcv_q_head = mp; in so_quiesced_cb()
2101 } else if (so->so_oobmark > 0) { in so_quiesced_cb()
2106 if (so->so_oobmark < mlen) { in so_quiesced_cb()
2111 mlen = so->so_oobmark; in so_quiesced_cb()
2118 so->so_oobmark -= MBLKL(urg_mp); in so_quiesced_cb()
2121 } while (so->so_oobmark > 0); in so_quiesced_cb()
2124 urg_mp->b_next = so->so_rcv_q_head; in so_quiesced_cb()
2125 so->so_rcv_q_head = urg_mp; in so_quiesced_cb()
2128 so->so_oobmark -= mlen; in so_quiesced_cb()
2129 if (so->so_oobmark == 0) in so_quiesced_cb()
2137 so->so_rcv_queued -= mlen; in so_quiesced_cb()
2141 so->so_rcv_head = NULL; in so_quiesced_cb()
2142 so->so_rcv_last_head = NULL; in so_quiesced_cb()
2143 so->so_rcv_q_head = NULL; in so_quiesced_cb()
2144 so->so_rcv_q_last_head = NULL; in so_quiesced_cb()
2153 if (atmark || so->so_oobmark > 0) { in so_quiesced_cb()
2156 if (atmark && so->so_oobmsg != NULL) { in so_quiesced_cb()
2168 mp->b_cont = so->so_oobmsg; in so_quiesced_cb()
2169 so->so_oobmsg = NULL; in so_quiesced_cb()
2190 so->so_oobmark = 0; in so_quiesced_cb()
2193 ASSERT(so->so_oobmark == 0); in so_quiesced_cb()
2194 ASSERT(so->so_rcv_queued == 0); in so_quiesced_cb()
2269 so_tpi_fallback(struct sonode *so, struct cred *cr) in so_tpi_fallback() argument
2284 sp = so->so_sockparams; in so_tpi_fallback()
2290 if (so->so_filter_active > 0 || so->so_krecv_cb != NULL) in so_tpi_fallback()
2293 switch (so->so_family) { in so_tpi_fallback()
2315 if (!so_start_fallback(so)) in so_tpi_fallback()
2322 bcopy(so, &origso, sizeof (*so)); in so_tpi_fallback()
2327 newsp = sockparams_hold_ephemeral_bydev(so->so_family, so->so_type, in so_tpi_fallback()
2328 so->so_protocol, devpath, KM_SLEEP, &error); in so_tpi_fallback()
2332 if (so->so_direct != NULL) { in so_tpi_fallback()
2333 sodirect_t *sodp = so->so_direct; in so_tpi_fallback()
2334 mutex_enter(&so->so_lock); in so_tpi_fallback()
2336 so->so_direct->sod_enabled = B_FALSE; in so_tpi_fallback()
2337 so->so_state &= ~SS_SODIRECT; in so_tpi_fallback()
2339 mutex_exit(&so->so_lock); in so_tpi_fallback()
2343 error = sotpi_convert_sonode(so, newsp, &direct, &q, cr); in so_tpi_fallback()
2367 DTRACE_PROBE1(proto__fallback__begin, struct sonode *, so); in so_tpi_fallback()
2368 error = (*fbfunc)(so->so_proto_handle, q, direct, so_quiesced_cb, in so_tpi_fallback()
2370 DTRACE_PROBE1(proto__fallback__end, struct sonode *, so); in so_tpi_fallback()
2374 sotpi_revert_sonode(so, cr); in so_tpi_fallback()
2382 nso = list_head(&so->so_acceptq_list); in so_tpi_fallback()
2406 next = list_next(&so->so_acceptq_list, nso); in so_tpi_fallback()
2407 list_remove(&so->so_acceptq_list, nso); in so_tpi_fallback()
2408 so->so_acceptq_len--; in so_tpi_fallback()
2414 nso = list_next(&so->so_acceptq_list, nso); in so_tpi_fallback()
2422 so_acceptq_flush(so, B_FALSE); in so_tpi_fallback()
2424 mutex_enter(&so->so_lock); in so_tpi_fallback()
2425 so->so_state |= SS_FALLBACK_COMP; in so_tpi_fallback()
2426 mutex_exit(&so->so_lock); in so_tpi_fallback()
2432 so->so_ops = &sotpi_sonodeops; in so_tpi_fallback()
2439 pollwakeup(&so->so_poll_list, POLLERR); in so_tpi_fallback()
2446 ASSERT(SOTOV(so)->v_count >= 2); in so_tpi_fallback()
2447 VN_RELE(SOTOV(so)); in so_tpi_fallback()
2449 so_end_fallback(so); in so_tpi_fallback()
2453 so_integrity_check(so, &origso); in so_tpi_fallback()
2470 so_krecv_set(sonode_t *so, so_krecv_f cb, void *arg) in so_krecv_set() argument
2477 SO_BLOCK_FALLBACK(so, so_krecv_set(so, cb, arg)); in so_krecv_set()
2479 mutex_enter(&so->so_lock); in so_krecv_set()
2480 if (so->so_state & SS_FALLBACK_COMP) { in so_krecv_set()
2481 mutex_exit(&so->so_lock); in so_krecv_set()
2482 SO_UNBLOCK_FALLBACK(so); in so_krecv_set()
2486 ret = so_lock_read(so, 0); in so_krecv_set()
2493 so_rcv_flush(so); in so_krecv_set()
2495 so->so_krecv_cb = cb; in so_krecv_set()
2496 so->so_krecv_arg = arg; in so_krecv_set()
2498 so_unlock_read(so); in so_krecv_set()
2499 mutex_exit(&so->so_lock); in so_krecv_set()
2500 SO_UNBLOCK_FALLBACK(so); in so_krecv_set()
2506 so_krecv_unblock(sonode_t *so) in so_krecv_unblock() argument
2508 mutex_enter(&so->so_lock); in so_krecv_unblock()
2509 VERIFY(so->so_krecv_cb != NULL); in so_krecv_unblock()
2511 so->so_rcv_queued = 0; in so_krecv_unblock()
2512 (void) so_check_flow_control(so); in so_krecv_unblock()