Lines Matching refs:so

133 sosdp_init(struct sonode *so, struct sonode *pso, struct cred *cr, int flags)  in sosdp_init()  argument
142 mutex_enter(&so->so_lock); in sosdp_init()
144 so->so_state |= (SS_ISBOUND | SS_ISCONNECTED | in sosdp_init()
146 sosdp_so_inherit(pso, so); in sosdp_init()
147 so->so_proto_props = pso->so_proto_props; in sosdp_init()
149 mutex_exit(&so->so_lock); in sosdp_init()
159 so->so_proto_handle = (sock_lower_handle_t)sdp_create(so, NULL, in sosdp_init()
160 so->so_family, SDP_CAN_BLOCK, upcalls, &sbl, cr, &error); in sosdp_init()
161 if (so->so_proto_handle == NULL) in sosdp_init()
164 so->so_rcvbuf = sbl.sbl_rxbuf; in sosdp_init()
165 so->so_rcvlowat = sbl.sbl_rxlowat; in sosdp_init()
166 so->so_sndbuf = sbl.sbl_txbuf; in sosdp_init()
167 so->so_sndlowat = sbl.sbl_txlowat; in sosdp_init()
215 sosdp_bind(struct sonode *so, struct sockaddr *name, socklen_t namelen, in sosdp_bind() argument
221 mutex_enter(&so->so_lock); in sosdp_bind()
222 so_lock_single(so); /* Set SOLOCKED */ in sosdp_bind()
224 ASSERT(MUTEX_HELD(&so->so_lock)); in sosdp_bind()
225 ASSERT(so->so_flag & SOLOCKED); in sosdp_bind()
228 if ((so->so_state & SS_ISBOUND) || name == NULL || namelen == 0) { in sosdp_bind()
234 eprintsoline(so, error); in sosdp_bind()
241 if (so->so_state & SS_CANTSENDMORE) { in sosdp_bind()
249 mutex_exit(&so->so_lock); in sosdp_bind()
251 error = sdp_bind((struct sdp_conn_struct_t *)so->so_proto_handle, in sosdp_bind()
254 mutex_enter(&so->so_lock); in sosdp_bind()
257 so->so_state |= SS_ISBOUND; in sosdp_bind()
259 eprintsoline(so, error); in sosdp_bind()
263 so_unlock_single(so, SOLOCKED); in sosdp_bind()
264 mutex_exit(&so->so_lock); in sosdp_bind()
267 ASSERT(MUTEX_HELD(&so->so_lock)); in sosdp_bind()
268 ASSERT(so->so_flag & SOLOCKED); in sosdp_bind()
278 sosdp_listen(struct sonode *so, int backlog, struct cred *cr) in sosdp_listen() argument
282 mutex_enter(&so->so_lock); in sosdp_listen()
283 so_lock_single(so); in sosdp_listen()
289 if (so->so_state & (SS_ISCONNECTING | SS_ISCONNECTED | in sosdp_listen()
292 eprintsoline(so, EINVAL); in sosdp_listen()
299 if (so->so_state & SS_ACCEPTCONN) { in sosdp_listen()
300 so->so_backlog = backlog; in sosdp_listen()
304 mutex_exit(&so->so_lock); in sosdp_listen()
306 error = sdp_listen((struct sdp_conn_struct_t *)so->so_proto_handle, in sosdp_listen()
309 mutex_enter(&so->so_lock); in sosdp_listen()
311 so->so_state |= (SS_ACCEPTCONN | SS_ISBOUND); in sosdp_listen()
312 so->so_backlog = backlog; in sosdp_listen()
314 eprintsoline(so, error); in sosdp_listen()
317 so_unlock_single(so, SOLOCKED); in sosdp_listen()
318 mutex_exit(&so->so_lock); in sosdp_listen()
328 sosdp_connect(struct sonode *so, struct sockaddr *name, in sosdp_connect() argument
333 mutex_enter(&so->so_lock); in sosdp_connect()
334 so_lock_single(so); in sosdp_connect()
340 if (so->so_state & (SS_ACCEPTCONN|SS_ISCONNECTED|SS_ISCONNECTING)) { in sosdp_connect()
341 if (so->so_state & SS_ISCONNECTED) { in sosdp_connect()
343 } else if (so->so_state & SS_ISCONNECTING) { in sosdp_connect()
348 eprintsoline(so, error); in sosdp_connect()
355 if (so->so_error != 0) { in sosdp_connect()
356 error = sogeterr(so, B_TRUE); in sosdp_connect()
357 eprintsoline(so, error); in sosdp_connect()
366 if (so->so_state & (SS_ISDISCONNECTING|SS_CANTRCVMORE| in sosdp_connect()
369 eprintsoline(so, error); in sosdp_connect()
373 eprintsoline(so, EINVAL); in sosdp_connect()
376 soisconnecting(so); in sosdp_connect()
377 mutex_exit(&so->so_lock); in sosdp_connect()
379 error = sdp_connect((struct sdp_conn_struct_t *)so->so_proto_handle, in sosdp_connect()
382 mutex_enter(&so->so_lock); in sosdp_connect()
387 error = sowaitconnected(so, fflag, 0); in sosdp_connect()
391 (void *)so, (void *)so->so_proto_handle, error)); in sosdp_connect()
400 so->so_state |= SS_ISBOUND; in sosdp_connect()
404 so->so_state &= ~SS_ISCONNECTING; in sosdp_connect()
408 so_unlock_single(so, SOLOCKED); in sosdp_connect()
409 mutex_exit(&so->so_lock); in sosdp_connect()
418 sosdp_recvmsg(struct sonode *so, struct nmsghdr *msg, struct uio *uiop, in sosdp_recvmsg() argument
428 if (!(so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING| in sosdp_recvmsg()
447 mutex_enter(&so->so_lock); in sosdp_recvmsg()
452 error = so_lock_read_intr(so, in sosdp_recvmsg()
455 mutex_exit(&so->so_lock); in sosdp_recvmsg()
459 mutex_exit(&so->so_lock); in sosdp_recvmsg()
461 if (!(so->so_state & SS_CANTRCVMORE)) { in sosdp_recvmsg()
466 (struct sdp_conn_struct_t *)so->so_proto_handle, msg, in sosdp_recvmsg()
473 mutex_enter(&so->so_lock); in sosdp_recvmsg()
474 so_unlock_read(so); in sosdp_recvmsg()
475 mutex_exit(&so->so_lock); in sosdp_recvmsg()
484 sosdp_sendmsg(struct sonode *so, struct nmsghdr *msg, struct uio *uiop, in sosdp_sendmsg() argument
491 ASSERT(so->so_type == SOCK_STREAM); in sosdp_sendmsg()
494 (void *)so, (void *)so->so_proto_handle)); in sosdp_sendmsg()
502 mutex_enter(&so->so_lock); in sosdp_sendmsg()
503 if (so->so_state & SS_CANTSENDMORE) { in sosdp_sendmsg()
504 mutex_exit(&so->so_lock); in sosdp_sendmsg()
508 if (so->so_error != 0) { in sosdp_sendmsg()
509 error = sogeterr(so, B_TRUE); in sosdp_sendmsg()
510 mutex_exit(&so->so_lock); in sosdp_sendmsg()
519 if (!(so->so_state & (SS_ISCONNECTING | SS_ISCONNECTED))) { in sosdp_sendmsg()
521 so->so_state)); in sosdp_sendmsg()
522 mutex_exit(&so->so_lock); in sosdp_sendmsg()
526 mutex_exit(&so->so_lock); in sosdp_sendmsg()
527 error = sdp_send((struct sdp_conn_struct_t *)so->so_proto_handle, in sosdp_sendmsg()
538 sosdp_getpeername(struct sonode *so, struct sockaddr *addr, socklen_t *addrlen, in sosdp_getpeername() argument
542 if (!accept && !(so->so_state & SS_ISCONNECTED)) { in sosdp_getpeername()
546 (struct sdp_conn_struct_t *)so->so_proto_handle, in sosdp_getpeername()
556 sosdp_getsockname(struct sonode *so, struct sockaddr *addr, socklen_t *addrlen, in sosdp_getsockname() argument
559 mutex_enter(&so->so_lock); in sosdp_getsockname()
561 if (!(so->so_state & SS_ISBOUND)) { in sosdp_getsockname()
565 if (so->so_family == AF_INET || so->so_family == AF_INET6) { in sosdp_getsockname()
567 *addrlen = (so->so_family == AF_INET6) ? in sosdp_getsockname()
570 addr->sa_family = so->so_family; in sosdp_getsockname()
572 mutex_exit(&so->so_lock); in sosdp_getsockname()
575 mutex_exit(&so->so_lock); in sosdp_getsockname()
577 (struct sdp_conn_struct_t *)so->so_proto_handle, in sosdp_getsockname()
587 sosdp_shutdown(struct sonode *so, int how, struct cred *cr) in sosdp_shutdown() argument
592 mutex_enter(&so->so_lock); in sosdp_shutdown()
593 so_lock_single(so); in sosdp_shutdown()
599 state_change = so->so_state; in sosdp_shutdown()
607 socantrcvmore(so); in sosdp_shutdown()
610 socantsendmore(so); in sosdp_shutdown()
613 socantsendmore(so); in sosdp_shutdown()
614 socantrcvmore(so); in sosdp_shutdown()
621 state_change = so->so_state & ~state_change; in sosdp_shutdown()
624 so->so_state |= SS_ISDISCONNECTING; in sosdp_shutdown()
626 so_notify_shutdown(so); in sosdp_shutdown()
630 (struct sdp_conn_struct_t *)so->so_proto_handle, how); in sosdp_shutdown()
633 mutex_enter(&so->so_lock); in sosdp_shutdown()
635 so_unlock_single(so, SOLOCKED); in sosdp_shutdown()
636 mutex_exit(&so->so_lock); in sosdp_shutdown()
652 sosdp_getsockopt(struct sonode *so, int level, int option_name, in sosdp_getsockopt() argument
663 mutex_enter(&so->so_lock); in sosdp_getsockopt()
684 eprintsoline(so, error); in sosdp_getsockopt()
691 eprintsoline(so, error); in sosdp_getsockopt()
701 value = so->so_type; in sosdp_getsockopt()
705 value = sogeterr(so, B_TRUE); in sosdp_getsockopt()
709 value = (so->so_state & SS_ACCEPTCONN) ? in sosdp_getsockopt()
721 value = (so->so_options & option_name); in sosdp_getsockopt()
730 option = &so->so_linger; in sosdp_getsockopt()
734 value = so->so_sndbuf; in sosdp_getsockopt()
739 value = so->so_rcvbuf; in sosdp_getsockopt()
744 value = so->so_sndlowat; in sosdp_getsockopt()
749 value = so->so_rcvlowat; in sosdp_getsockopt()
762 mutex_exit(&so->so_lock); in sosdp_getsockopt()
763 error = sdp_get_opt((struct sdp_conn_struct_t *)so->so_proto_handle, in sosdp_getsockopt()
765 mutex_enter(&so->so_lock); in sosdp_getsockopt()
770 eprintsoline(so, error); in sosdp_getsockopt()
790 mutex_exit(&so->so_lock); in sosdp_getsockopt()
799 sosdp_setsockopt(struct sonode *so, int level, int option_name, in sosdp_setsockopt() argument
805 if (so->so_state & SS_CANTSENDMORE) { in sosdp_setsockopt()
809 mutex_enter(&so->so_lock); in sosdp_setsockopt()
810 so_lock_single(so); in sosdp_setsockopt()
812 if (so->so_type == SOCK_STREAM) { in sosdp_setsockopt()
813 conn = (void *)so->so_proto_handle; in sosdp_setsockopt()
817 so->so_type, conn, level, option_name)); in sosdp_setsockopt()
820 mutex_exit(&so->so_lock); in sosdp_setsockopt()
823 mutex_enter(&so->so_lock); in sosdp_setsockopt()
851 eprintsoline(so, error); in sosdp_setsockopt()
860 eprintsoline(so, error); in sosdp_setsockopt()
880 so->so_linger.l_linger = l->l_linger; in sosdp_setsockopt()
882 so->so_linger.l_onoff = SO_LINGER; in sosdp_setsockopt()
883 so->so_options |= SO_LINGER; in sosdp_setsockopt()
885 so->so_linger.l_onoff = 0; in sosdp_setsockopt()
886 so->so_options &= ~SO_LINGER; in sosdp_setsockopt()
900 dprintso(so, 1, in sosdp_setsockopt()
903 so->so_options |= option_name; in sosdp_setsockopt()
905 dprintso(so, 1, in sosdp_setsockopt()
908 so->so_options &= ~option_name; in sosdp_setsockopt()
913 so->so_sndbuf = intvalue; in sosdp_setsockopt()
914 if (so->so_sndlowat > so->so_sndbuf) { in sosdp_setsockopt()
915 so->so_sndlowat = so->so_sndbuf; in sosdp_setsockopt()
919 so->so_rcvbuf = intvalue; in sosdp_setsockopt()
920 if (so->so_rcvlowat > so->so_rcvbuf) { in sosdp_setsockopt()
921 so->so_rcvlowat = so->so_rcvbuf; in sosdp_setsockopt()
925 if (so->so_sndlowat > so->so_sndbuf) { in sosdp_setsockopt()
926 so->so_sndlowat = so->so_sndbuf; in sosdp_setsockopt()
930 if (so->so_rcvlowat > so->so_rcvbuf) { in sosdp_setsockopt()
931 so->so_rcvlowat = so->so_rcvbuf; in sosdp_setsockopt()
940 dprintso(so, 1, in sosdp_setsockopt()
949 so_unlock_single(so, SOLOCKED); in sosdp_setsockopt()
950 mutex_exit(&so->so_lock); in sosdp_setsockopt()
957 sosdp_ioctl(struct sonode *so, int cmd, intptr_t arg, int mode, in sosdp_ioctl() argument
971 mutex_enter(&so->so_lock); in sosdp_ioctl()
973 so->so_state |= SS_NDELAY; in sosdp_ioctl()
975 so->so_state &= ~SS_NDELAY; in sosdp_ioctl()
977 mutex_exit(&so->so_lock); in sosdp_ioctl()
985 mutex_enter(&so->so_lock); in sosdp_ioctl()
989 so->so_state |= SS_ASYNC; in sosdp_ioctl()
992 so->so_state &= ~SS_ASYNC; in sosdp_ioctl()
994 mutex_exit(&so->so_lock); in sosdp_ioctl()
1003 mutex_enter(&so->so_lock); in sosdp_ioctl()
1005 error = (pid != so->so_pgrp) ? socket_chgpgrp(so, pid) : 0; in sosdp_ioctl()
1006 mutex_exit(&so->so_lock); in sosdp_ioctl()
1011 if (so_copyout(&so->so_pgrp, (void *)arg, in sosdp_ioctl()
1019 (struct sdp_conn_struct_t *)so->so_proto_handle, cmd, in sosdp_ioctl()
1039 (struct sdp_conn_struct_t *)so->so_proto_handle, cmd, in sosdp_ioctl()
1053 if (so->so_state & SS_ACCEPTCONN) { in sosdp_ioctl()
1056 mutex_enter(&so->so_lock); in sosdp_ioctl()
1058 (struct sdp_conn_struct_t *)so->so_proto_handle, in sosdp_ioctl()
1060 mutex_exit(&so->so_lock); in sosdp_ioctl()
1075 sosdp_poll(struct sonode *so, short events, int anyyet, short *reventsp, in sosdp_poll() argument
1081 so_state = so->so_state; in sosdp_poll()
1083 ASSERT(so->so_version != SOV_STREAM); in sosdp_poll()
1085 if (!(so_state & SS_ISCONNECTED) && (so->so_type == SOCK_STREAM)) { in sosdp_poll()
1095 if (so->so_error != 0 && in sosdp_poll()
1102 if (so->so_type != SOCK_STREAM) { in sosdp_poll()
1109 if (sdp_polldata((struct sdp_conn_struct_t *)so->so_proto_handle, in sosdp_poll()
1114 if (sdp_polldata((struct sdp_conn_struct_t *)so->so_proto_handle, in sosdp_poll()
1119 if ((so_state & SS_CANTRCVMORE) || (so->so_acceptq_len > 0)) { in sosdp_poll()
1125 *phpp = &so->so_poll_list; in sosdp_poll()
1133 sosdp_close(struct sonode *so, int flag, struct cred *cr) in sosdp_close() argument
1137 mutex_enter(&so->so_lock); in sosdp_close()
1138 so_lock_single(so); in sosdp_close()
1146 soisdisconnected(so, 0); in sosdp_close()
1147 mutex_exit(&so->so_lock); in sosdp_close()
1152 error = sdp_disconnect((struct sdp_conn_struct_t *)so->so_proto_handle, in sosdp_close()
1155 mutex_enter(&so->so_lock); in sosdp_close()
1156 so_unlock_single(so, SOLOCKED); in sosdp_close()
1157 so_notify_disconnected(so, B_FALSE, error); in sosdp_close()
1164 sosdp_fini(struct sonode *so, struct cred *cr) in sosdp_fini() argument
1166 dprint(3, ("sosdp_fini: so:%p so_proto_handle:%p", (void *)so, in sosdp_fini()
1167 (void *)so->so_proto_handle)); in sosdp_fini()
1169 ASSERT(so->so_ops == &sosdp_sonodeops); in sosdp_fini()
1171 if (so->so_proto_handle != NULL) in sosdp_fini()
1172 sdp_close((struct sdp_conn_struct_t *)so->so_proto_handle); in sosdp_fini()
1173 so->so_proto_handle = NULL; in sosdp_fini()
1175 mutex_enter(&so->so_lock); in sosdp_fini()
1177 so_acceptq_flush(so, B_TRUE); in sosdp_fini()
1179 mutex_exit(&so->so_lock); in sosdp_fini()
1181 sonode_fini(so); in sosdp_fini()
1233 struct sonode *so = handle; in sdp_sock_connected() local
1235 ASSERT(so->so_type == SOCK_STREAM); in sdp_sock_connected()
1236 dprint(3, ("sosdp_connected C: so:%p so_proto_handle:%p", (void *)so, in sdp_sock_connected()
1237 (void *)so->so_proto_handle)); in sdp_sock_connected()
1239 mutex_enter(&so->so_lock); in sdp_sock_connected()
1240 ASSERT(so->so_proto_handle); /* closed conn */ in sdp_sock_connected()
1242 ASSERT(!(so->so_state & SS_ACCEPTCONN)); in sdp_sock_connected()
1243 soisconnected(so); in sdp_sock_connected()
1245 so_notify_connected(so); in sdp_sock_connected()
1255 struct sonode *so = handle; in sdp_sock_disconnected() local
1257 ASSERT(so->so_type == SOCK_STREAM); in sdp_sock_disconnected()
1259 (void *)so, (void *)so->so_proto_handle, error)); in sdp_sock_disconnected()
1261 mutex_enter(&so->so_lock); in sdp_sock_disconnected()
1262 ASSERT(so->so_proto_handle != NULL); /* closed conn */ in sdp_sock_disconnected()
1264 soisdisconnected(so, error); in sdp_sock_disconnected()
1265 so_notify_disconnected(so, B_FALSE, error); in sdp_sock_disconnected()
1275 struct sonode *so = handle; in sdp_sock_recv() local
1277 ASSERT(so->so_type == SOCK_STREAM); in sdp_sock_recv()
1279 mutex_enter(&so->so_lock); in sdp_sock_recv()
1280 so_notify_data(so, 0); in sdp_sock_recv()
1282 return (so->so_rcvbuf); in sdp_sock_recv()
1291 struct sonode *so = handle; in sdp_sock_xmitted() local
1294 (void *)so, (void *)so->so_proto_handle, writeable)); in sdp_sock_xmitted()
1295 mutex_enter(&so->so_lock); in sdp_sock_xmitted()
1296 ASSERT(so->so_proto_handle != NULL); /* closed conn */ in sdp_sock_xmitted()
1304 so_notify_writable(so); in sdp_sock_xmitted()
1306 mutex_exit(&so->so_lock); in sdp_sock_xmitted()
1317 struct sonode *so = handle; in sdp_sock_urgdata() local
1319 ASSERT(so->so_type == SOCK_STREAM); in sdp_sock_urgdata()
1321 mutex_enter(&so->so_lock); in sdp_sock_urgdata()
1323 ASSERT(so->so_proto_handle != NULL); /* closed conn */ in sdp_sock_urgdata()
1324 so_notify_oobsig(so); in sdp_sock_urgdata()
1333 struct sonode *so = handle; in sdp_sock_ordrel() local
1335 ASSERT(so->so_type == SOCK_STREAM); in sdp_sock_ordrel()
1338 (void *)so, (void *)so->so_proto_handle)); in sdp_sock_ordrel()
1339 mutex_enter(&so->so_lock); in sdp_sock_ordrel()
1340 socantrcvmore(so); in sdp_sock_ordrel()
1341 so_notify_eof(so); in sdp_sock_ordrel()
1347 struct sonode *so = handle; in sdp_sock_connfail() local
1349 dprint(3, ("sosdp_conn Failed: so:%p so_proto_handle:%p", (void *)so, in sdp_sock_connfail()
1350 (void *)so->so_proto_handle)); in sdp_sock_connfail()
1351 mutex_enter(&so->so_lock); in sdp_sock_connfail()
1352 ASSERT(so->so_proto_handle != NULL); /* closed conn */ in sdp_sock_connfail()
1353 so->so_state &= ~(SS_ISCONNECTING|SS_ISCONNECTED|SS_ISDISCONNECTING); in sdp_sock_connfail()
1354 so->so_error = (ushort_t)error; in sdp_sock_connfail()
1355 mutex_exit(&so->so_lock); in sdp_sock_connfail()
1356 cv_broadcast(&so->so_state_cv); in sdp_sock_connfail()