Lines Matching refs:so

279 	struct sonode	*so;  in sotpi_create()  local
305 so = kmem_cache_alloc(cp, KM_SLEEP); in sotpi_create()
306 if (so == NULL) { in sotpi_create()
311 sonode_init(so, sp, family, type, protocol, &sotpi_sonodeops); in sotpi_create()
312 sotpi_info_init(so); in sotpi_create()
317 so->so_version = (short)version; in sotpi_create()
320 return (so); in sotpi_create()
324 sotpi_destroy(struct sonode *so) in sotpi_destroy() argument
334 ASSERT(so->so_ops == &sotpi_sonodeops); in sotpi_destroy()
336 origsp = SOTOTPI(so)->sti_orig_sp; in sotpi_destroy()
338 sotpi_info_fini(so); in sotpi_destroy()
340 if (so->so_state & SS_FALLBACK_COMP) { in sotpi_destroy()
347 sotpi_info_destroy(so); in sotpi_destroy()
350 origsp->sp_smod_info->smod_sock_destroy_func(so); in sotpi_destroy()
353 sonode_fini(so); in sotpi_destroy()
354 cp = (so->so_family == AF_UNIX) ? socktpi_unix_cache : in sotpi_destroy()
356 kmem_cache_free(cp, so); in sotpi_destroy()
362 sotpi_init(struct sonode *so, struct sonode *tso, struct cred *cr, int flags) in sotpi_init() argument
370 sotpi_info_t *sti = SOTOTPI(so); in sotpi_init()
384 so->so_flag |= SOCLONE; in sotpi_init()
386 if ((so->so_type == SOCK_STREAM || so->so_type == SOCK_DGRAM) && in sotpi_init()
387 (so->so_family == AF_INET || so->so_family == AF_INET6) && in sotpi_init()
388 (so->so_protocol == IPPROTO_TCP || so->so_protocol == IPPROTO_UDP || in sotpi_init()
389 so->so_protocol == IPPROTO_IP)) { in sotpi_init()
400 ASSERT(so->so_type != SOCK_DGRAM || tso == NULL); in sotpi_init()
401 if (so->so_type == SOCK_STREAM && tso != NULL) { in sotpi_init()
425 if (so->so_family == AF_UNIX) { in sotpi_init()
429 vp = SOTOV(so); in sotpi_init()
438 if (so->so_flag & SOCLONE) in sotpi_init()
440 mutex_enter(&so->so_lock); in sotpi_init()
443 mutex_exit(&so->so_lock); in sotpi_init()
450 (void) sotpi_close(so, flags, cr); in sotpi_init()
476 ASSERT(so->so_family == AF_INET || in sotpi_init()
477 so->so_family == AF_INET6); in sotpi_init()
478 ASSERT(so->so_protocol == IPPROTO_UDP || in sotpi_init()
479 so->so_protocol == IPPROTO_TCP || in sotpi_init()
480 so->so_protocol == IPPROTO_IP); in sotpi_init()
481 ASSERT(so->so_type == SOCK_DGRAM || in sotpi_init()
482 so->so_type == SOCK_STREAM); in sotpi_init()
510 (void) sotpi_close(so, flags, in sotpi_init()
525 error = so_strinit(so, tso); in sotpi_init()
527 (void) sotpi_close(so, flags, cr); in sotpi_init()
532 if (so->so_family == AF_UNIX && so->so_type == SOCK_STREAM) { in sotpi_init()
533 mutex_enter(&so->so_lock); in sotpi_init()
534 so->so_mode |= SM_SENDFILESUPP; in sotpi_init()
535 mutex_exit(&so->so_lock); in sotpi_init()
539 if (so->so_protocol != so->so_sockparams->sp_protocol) { in sotpi_init()
540 int protocol = so->so_protocol; in sotpi_init()
544 error = sotpi_setsockopt(so, SOL_SOCKET, SO_PROTOTYPE, in sotpi_init()
547 (void) sotpi_close(so, flags, cr); in sotpi_init()
570 (void) sotpi_close(so, flags, cr); in sotpi_init()
578 maj, vp, so, error); in sotpi_init()
588 so_automatic_bind(struct sonode *so) in so_automatic_bind() argument
590 sotpi_info_t *sti = SOTOTPI(so); in so_automatic_bind()
591 ASSERT(so->so_family == AF_INET || so->so_family == AF_INET6); in so_automatic_bind()
593 ASSERT(MUTEX_HELD(&so->so_lock)); in so_automatic_bind()
594 ASSERT(!(so->so_state & SS_ISBOUND)); in so_automatic_bind()
599 sti->sti_laddr_sa->sa_family = so->so_family; in so_automatic_bind()
600 so->so_state |= SS_ISBOUND; in so_automatic_bind()
628 sotpi_bindlisten(struct sonode *so, struct sockaddr *name, in sotpi_bindlisten() argument
643 sotpi_info_t *sti = SOTOTPI(so); in sotpi_bindlisten()
645 dprintso(so, 1, ("sotpi_bindlisten(%p, %p, %d, %d, 0x%x) %s\n", in sotpi_bindlisten()
646 (void *)so, (void *)name, namelen, backlog, flags, in sotpi_bindlisten()
647 pr_state(so->so_state, so->so_mode))); in sotpi_bindlisten()
649 tcp_udp_xport = so->so_type == SOCK_STREAM || so->so_type == SOCK_DGRAM; in sotpi_bindlisten()
652 mutex_enter(&so->so_lock); in sotpi_bindlisten()
653 so_lock_single(so); /* Set SOLOCKED */ in sotpi_bindlisten()
655 ASSERT(MUTEX_HELD(&so->so_lock)); in sotpi_bindlisten()
656 ASSERT(so->so_flag & SOLOCKED); in sotpi_bindlisten()
665 dprintso(so, 1, ("sobind: allocating unbind_req\n")); in sotpi_bindlisten()
679 if (so->so_family == AF_UNIX) { in sotpi_bindlisten()
683 dprintso(so, 1, ("sobind rebind UNIX: addrlen %d, " in sotpi_bindlisten()
699 if (so->so_state & SS_ISBOUND) { in sotpi_bindlisten()
705 switch (so->so_family) { in sotpi_bindlisten()
715 sti->sti_laddr_sa->sa_family = so->so_family; in sotpi_bindlisten()
734 sti->sti_laddr_len = (so->so_family == AF_INET) ? in sotpi_bindlisten()
739 sti->sti_laddr_sa->sa_family = so->so_family; in sotpi_bindlisten()
761 if (so->so_state & SS_ISBOUND) { in sotpi_bindlisten()
778 eprintsoline(so, error); in sotpi_bindlisten()
781 if ((so->so_mode & SM_CONNREQUIRED) && in sotpi_bindlisten()
782 (so->so_state & SS_CANTREBIND)) { in sotpi_bindlisten()
785 eprintsoline(so, error); in sotpi_bindlisten()
788 error = sotpi_unbind(so, 0); in sotpi_bindlisten()
790 eprintsoline(so, error); in sotpi_bindlisten()
793 ASSERT(!(so->so_state & SS_ISBOUND)); in sotpi_bindlisten()
795 so->so_state &= in sotpi_bindlisten()
802 if ((so->so_state & SS_CANTSENDMORE) && !xnet_skip_checks) { in sotpi_bindlisten()
811 switch (so->so_family) { in sotpi_bindlisten()
821 eprintsoline(so, error); in sotpi_bindlisten()
829 if (name->sa_family != so->so_family) { in sotpi_bindlisten()
837 eprintsoline(so, error); in sotpi_bindlisten()
841 error = name->sa_family != so->so_family ? in sotpi_bindlisten()
843 eprintsoline(so, error); in sotpi_bindlisten()
847 (name->sa_family != so->so_family)) { in sotpi_bindlisten()
855 eprintsoline(so, error); in sotpi_bindlisten()
868 name->sa_family = so->so_family; in sotpi_bindlisten()
878 eprintsoline(so, error); in sotpi_bindlisten()
882 error = name->sa_family != so->so_family ? in sotpi_bindlisten()
884 eprintsoline(so, error); in sotpi_bindlisten()
887 if (name->sa_family != so->so_family) { in sotpi_bindlisten()
893 eprintsoline(so, error); in sotpi_bindlisten()
926 eprintsoline(so, error); in sotpi_bindlisten()
934 eprintsoline(so, error); in sotpi_bindlisten()
946 switch (so->so_family) { in sotpi_bindlisten()
970 eprintsoline(so, error); in sotpi_bindlisten()
982 eprintsoline(so, error); in sotpi_bindlisten()
999 ASSERT(SOTOV(so)->v_stream); in sotpi_bindlisten()
1001 vp->v_stream = SOTOV(so)->v_stream; in sotpi_bindlisten()
1015 dprintso(so, 1, ("sobind UNIX: addrlen %d, addr %p\n", in sotpi_bindlisten()
1030 if ((so->so_state & SS_ACCEPTCONN) == 0) in sotpi_bindlisten()
1032 save_so_backlog = so->so_backlog; in sotpi_bindlisten()
1034 so->so_state |= SS_ACCEPTCONN; in sotpi_bindlisten()
1035 so->so_backlog = backlog; in sotpi_bindlisten()
1043 (so->so_family == AF_INET || so->so_family == AF_INET6)) in sotpi_bindlisten()
1056 mutex_exit(&so->so_lock); in sotpi_bindlisten()
1058 error = kstrputmsg(SOTOV(so), mp, NULL, 0, 0, in sotpi_bindlisten()
1061 eprintsoline(so, error); in sotpi_bindlisten()
1062 mutex_enter(&so->so_lock); in sotpi_bindlisten()
1066 mutex_enter(&so->so_lock); in sotpi_bindlisten()
1067 error = sowaitprim(so, PRIM_type, T_BIND_ACK, in sotpi_bindlisten()
1070 eprintsoline(so, error); in sotpi_bindlisten()
1082 ASSERT(so->so_family == AF_UNIX); in sotpi_bindlisten()
1085 ASSERT(!(so->so_state & SS_ISBOUND) || (flags & _SOBIND_REBIND)); in sotpi_bindlisten()
1086 so->so_state |= SS_ISBOUND; in sotpi_bindlisten()
1096 addrlen = (t_uscalar_t)(so->so_family == AF_UNIX ? in sotpi_bindlisten()
1111 eprintsoline(so, error); in sotpi_bindlisten()
1173 eprintsoline(so, error); in sotpi_bindlisten()
1177 switch (so->so_family) { in sotpi_bindlisten()
1215 eprintsoline(so, error); in sotpi_bindlisten()
1226 if (so->so_family == AF_INET) { in sotpi_bindlisten()
1231 eprintsoline(so, error); in sotpi_bindlisten()
1242 eprintsoline(so, error); in sotpi_bindlisten()
1252 eprintsoline(so, error); in sotpi_bindlisten()
1253 eprintso(so, in sotpi_bindlisten()
1269 eprintsoline(so, error); in sotpi_bindlisten()
1292 switch (so->so_family) { in sotpi_bindlisten()
1324 so->so_state &= ~SS_ACCEPTCONN; in sotpi_bindlisten()
1326 so->so_backlog = save_so_backlog; in sotpi_bindlisten()
1328 if (unbind_on_err && so->so_state & SS_ISBOUND) { in sotpi_bindlisten()
1331 err = sotpi_unbind(so, 0); in sotpi_bindlisten()
1334 eprintsoline(so, error); in sotpi_bindlisten()
1336 ASSERT(!(so->so_state & SS_ISBOUND)); in sotpi_bindlisten()
1341 so_unlock_single(so, SOLOCKED); in sotpi_bindlisten()
1342 mutex_exit(&so->so_lock); in sotpi_bindlisten()
1344 ASSERT(MUTEX_HELD(&so->so_lock)); in sotpi_bindlisten()
1345 ASSERT(so->so_flag & SOLOCKED); in sotpi_bindlisten()
1352 sotpi_bind(struct sonode *so, struct sockaddr *name, socklen_t namelen, in sotpi_bind() argument
1356 return (sotpi_bindlisten(so, name, namelen, 0, flags, cr)); in sotpi_bind()
1359 return (sotpi_bindlisten(so, name, namelen, 1, flags, cr)); in sotpi_bind()
1369 sotpi_unbind(struct sonode *so, int flags) in sotpi_unbind() argument
1374 sotpi_info_t *sti = SOTOTPI(so); in sotpi_unbind()
1376 dprintso(so, 1, ("sotpi_unbind(%p, 0x%x) %s\n", in sotpi_unbind()
1377 (void *)so, flags, pr_state(so->so_state, so->so_mode))); in sotpi_unbind()
1379 ASSERT(MUTEX_HELD(&so->so_lock)); in sotpi_unbind()
1380 ASSERT(so->so_flag & SOLOCKED); in sotpi_unbind()
1382 if (!(so->so_state & SS_ISBOUND)) { in sotpi_unbind()
1384 eprintsoline(so, error); in sotpi_unbind()
1388 mutex_exit(&so->so_lock); in sotpi_unbind()
1394 (void) putnextctl1(strvp2wq(SOTOV(so)), M_FLUSH, FLUSHRW); in sotpi_unbind()
1399 error = kstrputmsg(SOTOV(so), mp, NULL, 0, 0, in sotpi_unbind()
1401 mutex_enter(&so->so_lock); in sotpi_unbind()
1403 eprintsoline(so, error); in sotpi_unbind()
1407 error = sowaitokack(so, T_UNBIND_REQ); in sotpi_unbind()
1409 eprintsoline(so, error); in sotpi_unbind()
1431 so->so_state &= ~(SS_ISBOUND|SS_ACCEPTCONN); in sotpi_unbind()
1437 ASSERT(MUTEX_HELD(&so->so_lock)); in sotpi_unbind()
1438 ASSERT(so->so_flag & SOLOCKED); in sotpi_unbind()
1450 sotpi_listen(struct sonode *so, int backlog, struct cred *cr) in sotpi_listen() argument
1453 sotpi_info_t *sti = SOTOTPI(so); in sotpi_listen()
1455 dprintso(so, 1, ("sotpi_listen(%p, %d) %s\n", in sotpi_listen()
1456 (void *)so, backlog, pr_state(so->so_state, so->so_mode))); in sotpi_listen()
1468 if (so->so_state & SS_ACCEPTCONN && in sotpi_listen()
1469 !((so->so_family == AF_INET || so->so_family == AF_INET6) && in sotpi_listen()
1474 if (so->so_state & SS_ISCONNECTED) in sotpi_listen()
1477 mutex_enter(&so->so_lock); in sotpi_listen()
1478 so_lock_single(so); /* Set SOLOCKED */ in sotpi_listen()
1484 if ((so->so_state & SS_ACCEPTCONN) && in sotpi_listen()
1485 so->so_backlog == backlog) in sotpi_listen()
1488 if (!(so->so_state & SS_ISBOUND)) { in sotpi_listen()
1492 if (so->so_family == AF_UNIX) { in sotpi_listen()
1496 error = sotpi_bindlisten(so, NULL, 0, backlog, in sotpi_listen()
1505 if (!((so->so_family == AF_INET || so->so_family == AF_INET6) && in sotpi_listen()
1508 error = sotpi_unbind(so, _SOUNBIND_REBIND); in sotpi_listen()
1512 error = sotpi_bindlisten(so, NULL, 0, backlog, in sotpi_listen()
1515 so->so_state |= SS_ACCEPTCONN; in sotpi_listen()
1516 so->so_backlog = backlog; in sotpi_listen()
1520 ASSERT(so->so_state & SS_ACCEPTCONN); in sotpi_listen()
1522 so_unlock_single(so, SOLOCKED); in sotpi_listen()
1523 mutex_exit(&so->so_lock); in sotpi_listen()
1536 sodisconnect(struct sonode *so, t_scalar_t seqno, int flags) in sodisconnect() argument
1542 dprintso(so, 1, ("sodisconnect(%p, %d, 0x%x) %s\n", in sodisconnect()
1543 (void *)so, seqno, flags, pr_state(so->so_state, so->so_mode))); in sodisconnect()
1546 mutex_enter(&so->so_lock); in sodisconnect()
1547 so_lock_single(so); /* Set SOLOCKED */ in sodisconnect()
1549 ASSERT(MUTEX_HELD(&so->so_lock)); in sodisconnect()
1550 ASSERT(so->so_flag & SOLOCKED); in sodisconnect()
1553 if (!(so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING|SS_ACCEPTCONN))) { in sodisconnect()
1555 eprintsoline(so, error); in sodisconnect()
1559 mutex_exit(&so->so_lock); in sodisconnect()
1566 if (!(so->so_state & SS_ACCEPTCONN)) in sodisconnect()
1567 (void) putnextctl1(strvp2wq(SOTOV(so)), M_FLUSH, FLUSHW); in sodisconnect()
1573 error = kstrputmsg(SOTOV(so), mp, NULL, 0, 0, in sodisconnect()
1575 mutex_enter(&so->so_lock); in sodisconnect()
1577 eprintsoline(so, error); in sodisconnect()
1581 error = sowaitokack(so, T_DISCON_REQ); in sodisconnect()
1583 eprintsoline(so, error); in sodisconnect()
1592 so->so_state &= ~(SS_ISCONNECTED|SS_ISCONNECTING); in sodisconnect()
1593 SOTOTPI(so)->sti_laddr_valid = 0; in sodisconnect()
1594 SOTOTPI(so)->sti_faddr_valid = 0; in sodisconnect()
1597 so_unlock_single(so, SOLOCKED); in sodisconnect()
1598 mutex_exit(&so->so_lock); in sodisconnect()
1601 ASSERT(MUTEX_HELD(&so->so_lock)); in sodisconnect()
1602 ASSERT(so->so_flag & SOLOCKED); in sodisconnect()
1609 sotpi_accept(struct sonode *so, int fflag, struct cred *cr, in sotpi_accept() argument
1625 sotpi_info_t *sti = SOTOTPI(so); in sotpi_accept()
1628 dprintso(so, 1, ("sotpi_accept(%p, 0x%x, %p) %s\n", in sotpi_accept()
1629 (void *)so, fflag, (void *)nsop, in sotpi_accept()
1630 pr_state(so->so_state, so->so_mode))); in sotpi_accept()
1639 if ((so->so_state & SS_ACCEPTCONN) == 0) in sotpi_accept()
1642 if ((error = sowaitconnind(so, fflag, &mp)) != 0) in sotpi_accept()
1658 eprintsoline(so, error); in sotpi_accept()
1662 switch (so->so_family) { in sotpi_accept()
1688 (void) strioctl(SOTOV(so), _SIOCSOCKFALLBACK, in sotpi_accept()
1703 eprintsoline(so, error); in sotpi_accept()
1707 if (so->so_family == AF_UNIX) { in sotpi_accept()
1722 nso = socket_newconn(so, NULL, NULL, SOCKET_SLEEP, &error); in sotpi_accept()
1743 nso->so_options |= so->so_options & SO_DEBUG; in sotpi_accept()
1757 eprintsoline(so, error); in sotpi_accept()
1789 eprintsoline(so, error); in sotpi_accept()
1844 nso->so_pgrp = so->so_pgrp; in sotpi_accept()
1845 nso->so_state |= so->so_state & SS_ASYNC; in sotpi_accept()
1862 nso->so_options = so->so_options & (SO_DEBUG|SO_REUSEADDR|SO_KEEPALIVE| in sotpi_accept()
1865 nso->so_sndbuf = so->so_sndbuf; in sotpi_accept()
1866 nso->so_rcvbuf = so->so_rcvbuf; in sotpi_accept()
1868 nso->so_linger = so->so_linger; in sotpi_accept()
1891 mutex_enter(&so->so_lock); in sotpi_accept()
1892 so_lock_single(so); in sotpi_accept()
1893 eprintsoline(so, error); in sotpi_accept()
1901 mutex_enter(&so->so_lock); in sotpi_accept()
1902 so_lock_single(so); in sotpi_accept()
1903 eprintsoline(so, error); in sotpi_accept()
1941 mutex_enter(&so->so_lock); in sotpi_accept()
1942 so_lock_single(so); in sotpi_accept()
1943 eprintsoline(so, error); in sotpi_accept()
1999 mutex_enter(&so->so_lock); in sotpi_accept()
2000 so_lock_single(so); /* Set SOLOCKED */ in sotpi_accept()
2001 mutex_exit(&so->so_lock); in sotpi_accept()
2003 error = kstrputmsg(SOTOV(so), mp, NULL, in sotpi_accept()
2005 mutex_enter(&so->so_lock); in sotpi_accept()
2007 eprintsoline(so, error); in sotpi_accept()
2010 error = sowaitprim(so, PRIM_type, T_OK_ACK, in sotpi_accept()
2013 eprintsoline(so, error); in sotpi_accept()
2016 mutex_exit(&so->so_lock); in sotpi_accept()
2038 ASSERT(so->so_family == AF_UNIX); in sotpi_accept()
2055 mutex_enter(&so->so_lock); in sotpi_accept()
2056 so_unlock_single(so, SOLOCKED); in sotpi_accept()
2057 mutex_exit(&so->so_lock); in sotpi_accept()
2068 eprintsoline(so, error); in sotpi_accept()
2075 (void) sodisconnect(so, SEQ_number, 0); in sotpi_accept()
2079 (void) sodisconnect(so, SEQ_number, _SODISCONNECT_LOCK_HELD); in sotpi_accept()
2080 so_unlock_single(so, SOLOCKED); in sotpi_accept()
2081 mutex_exit(&so->so_lock); in sotpi_accept()
2087 error = (so->so_type == SOCK_DGRAM || so->so_type == SOCK_RAW) in sotpi_accept()
2090 eprintsoline(so, error); in sotpi_accept()
2101 sotpi_connect(struct sonode *so, in sotpi_connect() argument
2116 sotpi_info_t *sti = SOTOTPI(so); in sotpi_connect()
2118 dprintso(so, 1, ("sotpi_connect(%p, %p, %d, 0x%x, 0x%x) %s\n", in sotpi_connect()
2119 (void *)so, (void *)name, namelen, fflag, flags, in sotpi_connect()
2120 pr_state(so->so_state, so->so_mode))); in sotpi_connect()
2139 eprintsoline(so, error); in sotpi_connect()
2143 mutex_enter(&so->so_lock); in sotpi_connect()
2153 so_lock_single(so); /* Set SOLOCKED */ in sotpi_connect()
2157 dprintso(so, 1, ("sotpi_connect: allocating unbind_req\n")); in sotpi_connect()
2170 if (so->so_state & SS_ACCEPTCONN) { in sotpi_connect()
2178 if (!(so->so_state & SS_ISBOUND)) { in sotpi_connect()
2179 if ((so->so_family == AF_INET || so->so_family == AF_INET6) && in sotpi_connect()
2181 so->so_type == SOCK_STREAM && !soconnect_tpi_tcp) { in sotpi_connect()
2186 so_automatic_bind(so); in sotpi_connect()
2188 error = sotpi_bind(so, NULL, 0, in sotpi_connect()
2193 ASSERT(so->so_state & SS_ISBOUND); in sotpi_connect()
2215 if (so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING)) { in sotpi_connect()
2217 if (so->so_mode & SM_CONNREQUIRED) { in sotpi_connect()
2219 error = so->so_state & SS_ISCONNECTED ? in sotpi_connect()
2232 if ((so->so_family == AF_INET || in sotpi_connect()
2233 so->so_family == AF_INET6) && in sotpi_connect()
2234 (so->so_type == SOCK_DGRAM || in sotpi_connect()
2235 so->so_type == SOCK_RAW) && in sotpi_connect()
2239 error = sodisconnect(so, -1, in sotpi_connect()
2242 so->so_state &= in sotpi_connect()
2249 so_unlock_single(so, SOLOCKED); in sotpi_connect()
2250 mutex_exit(&so->so_lock); in sotpi_connect()
2253 (void) sotpi_setsockopt(so, SOL_SOCKET, in sotpi_connect()
2257 mutex_enter(&so->so_lock); in sotpi_connect()
2258 so_lock_single(so); /* Set SOLOCKED */ in sotpi_connect()
2262 ASSERT(so->so_state & SS_ISBOUND); in sotpi_connect()
2275 ASSERT(so->so_family == AF_UNIX); in sotpi_connect()
2289 error = so_addr_verify(so, name, namelen); in sotpi_connect()
2307 if (so->so_family == AF_UNIX) { in sotpi_connect()
2328 dprintso(so, 1, in sotpi_connect()
2338 error = so_ux_addr_xlate(so, in sotpi_connect()
2367 if (!(so->so_mode & SM_CONNREQUIRED)) { in sotpi_connect()
2373 so_unlock_single(so, SOLOCKED); in sotpi_connect()
2374 mutex_exit(&so->so_lock); in sotpi_connect()
2377 (void) sotpi_setsockopt(so, SOL_SOCKET, SO_DGRAM_ERRIND, in sotpi_connect()
2380 mutex_enter(&so->so_lock); in sotpi_connect()
2381 so_lock_single(so); /* Set SOLOCKED */ in sotpi_connect()
2382 if ((so->so_family != AF_INET && so->so_family != AF_INET6) || in sotpi_connect()
2383 (so->so_type != SOCK_DGRAM && so->so_type != SOCK_RAW) || in sotpi_connect()
2385 soisconnected(so); in sotpi_connect()
2393 ASSERT(so->so_family != AF_UNIX); in sotpi_connect()
2401 switch (so->so_family) { in sotpi_connect()
2429 if (so->so_error != 0) in sotpi_connect()
2471 soisconnecting(so); in sotpi_connect()
2472 mutex_exit(&so->so_lock); in sotpi_connect()
2475 audit_sock(T_CONN_REQ, strvp2wq(SOTOV(so)), mp, 0); in sotpi_connect()
2477 error = kstrputmsg(SOTOV(so), mp, NULL, 0, 0, in sotpi_connect()
2480 mutex_enter(&so->so_lock); in sotpi_connect()
2484 if ((error = sowaitokack(so, T_CONN_REQ)) != 0) in sotpi_connect()
2488 so_unlock_single(so, SOLOCKED); in sotpi_connect()
2494 if ((error = sowaitconnected(so, fflag, 0)) != 0) { in sotpi_connect()
2495 so_lock_single(so); /* Set SOLOCKED */ in sotpi_connect()
2517 so->so_state &= ~SS_ISCONNECTING; in sotpi_connect()
2521 (so->so_state & SS_ISBOUND)) { in sotpi_connect()
2524 err = sotpi_unbind(so, 0); in sotpi_connect()
2527 eprintsoline(so, err); in sotpi_connect()
2533 so_unlock_single(so, SOLOCKED); in sotpi_connect()
2534 mutex_exit(&so->so_lock); in sotpi_connect()
2537 so_bad: error = sogeterr(so, B_TRUE); in sotpi_connect()
2538 bad: eprintsoline(so, error); in sotpi_connect()
2544 sotpi_shutdown(struct sonode *so, int how, struct cred *cr) in sotpi_shutdown() argument
2550 sotpi_info_t *sti = SOTOTPI(so); in sotpi_shutdown()
2552 dprintso(so, 1, ("sotpi_shutdown(%p, %d) %s\n", in sotpi_shutdown()
2553 (void *)so, how, pr_state(so->so_state, so->so_mode))); in sotpi_shutdown()
2555 mutex_enter(&so->so_lock); in sotpi_shutdown()
2556 so_lock_single(so); /* Set SOLOCKED */ in sotpi_shutdown()
2563 if (!(so->so_state & SS_ISCONNECTED)) { in sotpi_shutdown()
2580 old_state = so->so_state; in sotpi_shutdown()
2584 socantrcvmore(so); in sotpi_shutdown()
2587 socantsendmore(so); in sotpi_shutdown()
2590 socantsendmore(so); in sotpi_shutdown()
2591 socantrcvmore(so); in sotpi_shutdown()
2601 state_change = (so->so_state & (SS_CANTRCVMORE|SS_CANTSENDMORE)) - in sotpi_shutdown()
2607 dprintso(so, 1, in sotpi_shutdown()
2609 so->so_state)); in sotpi_shutdown()
2613 mutex_exit(&so->so_lock); in sotpi_shutdown()
2614 strseteof(SOTOV(so), 1); in sotpi_shutdown()
2623 mutex_enter(&so->so_lock); in sotpi_shutdown()
2624 (void) so_lock_read(so, 0); /* Set SOREADLOCKED */ in sotpi_shutdown()
2625 mutex_exit(&so->so_lock); in sotpi_shutdown()
2628 strflushrq(SOTOV(so), FLUSHALL); in sotpi_shutdown()
2630 mutex_enter(&so->so_lock); in sotpi_shutdown()
2631 so_unlock_read(so); /* Clear SOREADLOCKED */ in sotpi_shutdown()
2635 mutex_exit(&so->so_lock); in sotpi_shutdown()
2636 strsetwerror(SOTOV(so), 0, 0, sogetwrerr); in sotpi_shutdown()
2637 mutex_enter(&so->so_lock); in sotpi_shutdown()
2641 mutex_exit(&so->so_lock); in sotpi_shutdown()
2642 strsetwerror(SOTOV(so), 0, 0, sogetwrerr); in sotpi_shutdown()
2643 strseteof(SOTOV(so), 1); in sotpi_shutdown()
2652 mutex_enter(&so->so_lock); in sotpi_shutdown()
2653 (void) so_lock_read(so, 0); /* Set SOREADLOCKED */ in sotpi_shutdown()
2654 mutex_exit(&so->so_lock); in sotpi_shutdown()
2657 strflushrq(SOTOV(so), FLUSHALL); in sotpi_shutdown()
2659 mutex_enter(&so->so_lock); in sotpi_shutdown()
2660 so_unlock_read(so); /* Clear SOREADLOCKED */ in sotpi_shutdown()
2664 ASSERT(MUTEX_HELD(&so->so_lock)); in sotpi_shutdown()
2677 if ((so->so_state & (SS_CANTRCVMORE|SS_CANTSENDMORE)) == in sotpi_shutdown()
2683 if (so->so_family == AF_UNIX && sti->sti_serv_type != T_CLTS) in sotpi_shutdown()
2684 so_unix_close(so); in sotpi_shutdown()
2687 error = sodisconnect(so, -1, _SODISCONNECT_LOCK_HELD); in sotpi_shutdown()
2694 mutex_exit(&so->so_lock); in sotpi_shutdown()
2702 error = kstrputmsg(SOTOV(so), mp, NULL, 0, 0, in sotpi_shutdown()
2704 mutex_enter(&so->so_lock); in sotpi_shutdown()
2706 eprintsoline(so, error); in sotpi_shutdown()
2712 so_unlock_single(so, SOLOCKED); in sotpi_shutdown()
2713 mutex_exit(&so->so_lock); in sotpi_shutdown()
2737 so_unix_close(struct sonode *so) in so_unix_close() argument
2741 sotpi_info_t *sti = SOTOTPI(so); in so_unix_close()
2743 ASSERT(MUTEX_HELD(&so->so_lock)); in so_unix_close()
2745 ASSERT(so->so_family == AF_UNIX); in so_unix_close()
2747 if ((so->so_state & (SS_ISCONNECTED|SS_ISBOUND)) != in so_unix_close()
2751 dprintso(so, 1, ("so_unix_close(%p) %s\n", in so_unix_close()
2752 (void *)so, pr_state(so->so_state, so->so_mode))); in so_unix_close()
2761 if (so->so_type == SOCK_STREAM || so->so_type == SOCK_SEQPACKET) { in so_unix_close()
2806 dprintso(so, 1, in so_unix_close()
2858 mutex_exit(&so->so_lock); in so_unix_close()
2859 (void) kstrputmsg(SOTOV(so), mp, NULL, 0, 0, in so_unix_close()
2861 mutex_enter(&so->so_lock); in so_unix_close()
2882 sorecv_update_oobstate(struct sonode *so) in sorecv_update_oobstate() argument
2884 sotpi_info_t *sti = SOTOTPI(so); in sorecv_update_oobstate()
2886 mutex_enter(&so->so_lock); in sorecv_update_oobstate()
2887 ASSERT(so_verify_oobstate(so)); in sorecv_update_oobstate()
2888 dprintso(so, 1, in sorecv_update_oobstate()
2891 sti->sti_oobcnt, pr_state(so->so_state, so->so_mode))); in sorecv_update_oobstate()
2894 so->so_state &= ~(SS_OOBPEND|SS_HAVEOOBDATA|SS_RCVATMARK); in sorecv_update_oobstate()
2895 freemsg(so->so_oobmsg); in sorecv_update_oobstate()
2896 so->so_oobmsg = NULL; in sorecv_update_oobstate()
2898 ASSERT(so_verify_oobstate(so)); in sorecv_update_oobstate()
2899 mutex_exit(&so->so_lock); in sorecv_update_oobstate()
2913 sotpi_recvmsg(struct sonode *so, struct nmsghdr *msg, struct uio *uiop, in sotpi_recvmsg() argument
2923 int so_state = so->so_state; /* Snapshot */ in sotpi_recvmsg()
2929 sotpi_info_t *sti = SOTOTPI(so); in sotpi_recvmsg()
2934 dprintso(so, 1, ("sotpi_recvmsg(%p, %p, 0x%x) state %s err %d\n", in sotpi_recvmsg()
2935 (void *)so, (void *)msg, flags, in sotpi_recvmsg()
2936 pr_state(so->so_state, so->so_mode), so->so_error)); in sotpi_recvmsg()
2938 if (so->so_version == SOV_STREAM) { in sotpi_recvmsg()
2939 so_update_attrs(so, SOACC); in sotpi_recvmsg()
2941 return (strread(SOTOV(so), uiop, cr)); in sotpi_recvmsg()
2955 (so->so_mode & SM_CONNREQUIRED)) { in sotpi_recvmsg()
2968 if (!(so->so_mode & SM_EXDATA)) in sotpi_recvmsg()
2970 so_update_attrs(so, SOACC); in sotpi_recvmsg()
2971 return (sorecvoob(so, msg, uiop, flags, in sotpi_recvmsg()
2972 (so->so_options & SO_OOBINLINE))); in sotpi_recvmsg()
2975 so_update_attrs(so, SOACC); in sotpi_recvmsg()
2986 dprintso(so, 1, ("sotpi_recvmsg: namelen %d controllen %d\n", in sotpi_recvmsg()
2989 mutex_enter(&so->so_lock); in sotpi_recvmsg()
3008 error = so_lock_read_intr(so, in sotpi_recvmsg()
3010 mutex_exit(&so->so_lock); in sotpi_recvmsg()
3029 if (so->so_mode & SM_ATOMIC) in sotpi_recvmsg()
3034 else if (so->so_rcvtimeo != 0) in sotpi_recvmsg()
3035 timout = TICK_TO_MSEC(so->so_rcvtimeo); in sotpi_recvmsg()
3043 error = kstrgetmsg(SOTOV(so), &mp, uiop, &pri, &pflag, in sotpi_recvmsg()
3056 if ((rval.r_val1 & MOREDATA) && (so->so_mode & SM_ATOMIC)) in sotpi_recvmsg()
3060 dprintso(so, 1, ("sotpi_recvmsg: got M_DATA\n")); in sotpi_recvmsg()
3066 if ((so->so_state & in sotpi_recvmsg()
3070 sorecv_update_oobstate(so); in sotpi_recvmsg()
3073 mutex_enter(&so->so_lock); in sotpi_recvmsg()
3076 if (so->so_state & SS_SAVEDEOR) { in sotpi_recvmsg()
3078 so->so_state &= ~SS_SAVEDEOR; in sotpi_recvmsg()
3087 mutex_exit(&so->so_lock); in sotpi_recvmsg()
3096 dprintso(so, 1, ("sotpi_recvmsg: type %d\n", tpr->type)); in sotpi_recvmsg()
3100 if ((so->so_state & in sotpi_recvmsg()
3104 sorecv_update_oobstate(so); in sotpi_recvmsg()
3111 mutex_enter(&so->so_lock); in sotpi_recvmsg()
3112 so->so_state &= ~SS_SAVEDEOR; in sotpi_recvmsg()
3117 so->so_state |= SS_SAVEDEOR; in sotpi_recvmsg()
3126 mutex_exit(&so->so_lock); in sotpi_recvmsg()
3139 if ((so->so_state & in sotpi_recvmsg()
3143 sorecv_update_oobstate(so); in sotpi_recvmsg()
3155 eprintsoline(so, error); in sotpi_recvmsg()
3158 if (so->so_family == AF_UNIX) { in sotpi_recvmsg()
3184 eprintsoline(so, error); in sotpi_recvmsg()
3187 if (so->so_family == AF_UNIX) in sotpi_recvmsg()
3231 eprintsoline(so, error); in sotpi_recvmsg()
3246 if ((so->so_state & in sotpi_recvmsg()
3250 sorecv_update_oobstate(so); in sotpi_recvmsg()
3267 eprintsoline(so, error); in sotpi_recvmsg()
3295 eprintsoline(so, error); in sotpi_recvmsg()
3306 mutex_enter(&so->so_lock); in sotpi_recvmsg()
3307 so->so_state &= ~SS_SAVEDEOR; in sotpi_recvmsg()
3312 so->so_state |= SS_SAVEDEOR; in sotpi_recvmsg()
3323 mutex_exit(&so->so_lock); in sotpi_recvmsg()
3330 dprintso(so, 1, in sotpi_recvmsg()
3335 pr_state(so->so_state, so->so_mode))); in sotpi_recvmsg()
3360 dprintso(so, 1, in sotpi_recvmsg()
3365 pr_state(so->so_state, so->so_mode))); in sotpi_recvmsg()
3368 if (so->so_mode & SM_ATOMIC) in sotpi_recvmsg()
3374 error = kstrgetmsg(SOTOV(so), &mp, uiop, in sotpi_recvmsg()
3381 eprintsoline(so, error); in sotpi_recvmsg()
3401 mutex_enter(&so->so_lock); in sotpi_recvmsg()
3402 ASSERT(so_verify_oobstate(so)); in sotpi_recvmsg()
3416 so->so_state |= SS_RCVATMARK; in sotpi_recvmsg()
3417 mutex_exit(&so->so_lock); in sotpi_recvmsg()
3418 dprintso(so, 1, in sotpi_recvmsg()
3421 pr_state(so->so_state, so->so_mode))); in sotpi_recvmsg()
3427 (void *)so, tpr->type, (void *)mp); in sotpi_recvmsg()
3431 eprintsoline(so, error); in sotpi_recvmsg()
3436 mutex_enter(&so->so_lock); in sotpi_recvmsg()
3438 so_unlock_read(so); /* Clear SOREADLOCKED */ in sotpi_recvmsg()
3439 mutex_exit(&so->so_lock); in sotpi_recvmsg()
3457 sosend_dgramcmsg(struct sonode *so, struct sockaddr *name, socklen_t namelen, in sosend_dgramcmsg() argument
3474 sotpi_info_t *sti = SOTOTPI(so); in sosend_dgramcmsg()
3490 error = so_addr_verify(so, name, namelen); in sosend_dgramcmsg()
3492 eprintsoline(so, error); in sosend_dgramcmsg()
3497 if (so->so_family == AF_UNIX) { in sosend_dgramcmsg()
3529 dprintso(so, 1, in sosend_dgramcmsg()
3537 error = so_ux_addr_xlate(so, name, namelen, in sosend_dgramcmsg()
3541 eprintsoline(so, error); in sosend_dgramcmsg()
3574 if (!(so->so_mode & SM_FDPASSING)) in sosend_dgramcmsg()
3637 audit_sock(T_UNITDATA_REQ, strvp2wq(SOTOV(so)), mp, 0); in sosend_dgramcmsg()
3639 error = kstrputmsg(SOTOV(so), mp, uiop, len, 0, MSG_BAND, 0); in sosend_dgramcmsg()
3642 eprintsoline(so, error); in sosend_dgramcmsg()
3653 sosend_svccmsg(struct sonode *so, struct uio *uiop, int more, void *control, in sosend_svccmsg() argument
3666 sotpi_info_t *sti = SOTOTPI(so); in sosend_svccmsg()
3668 dprintso(so, 1, in sosend_svccmsg()
3678 if (!(so->so_mode & SM_OPTDATA)) in sosend_svccmsg()
3700 dprintso(so, 1, ("sosend_svccmsg: sending %d, %ld bytes\n", in sosend_svccmsg()
3716 if (!(so->so_mode & SM_FDPASSING)) in sosend_svccmsg()
3763 error = kstrputmsg(SOTOV(so), mp, uiop, iosize, in sosend_svccmsg()
3766 eprintsoline(so, error); in sosend_svccmsg()
3776 if (so->so_state & SS_CANTSENDMORE) { in sosend_svccmsg()
3777 eprintsoline(so, error); in sosend_svccmsg()
3780 if (so->so_error != 0) { in sosend_svccmsg()
3781 mutex_enter(&so->so_lock); in sosend_svccmsg()
3782 error = sogeterr(so, B_TRUE); in sosend_svccmsg()
3783 mutex_exit(&so->so_lock); in sosend_svccmsg()
3785 eprintsoline(so, error); in sosend_svccmsg()
3806 sosend_dgram(struct sonode *so, struct sockaddr *name, socklen_t namelen, in sosend_dgram() argument
3817 sotpi_info_t *sti = SOTOTPI(so); in sosend_dgram()
3833 error = so_addr_verify(so, name, namelen); in sosend_dgram()
3839 return (sodgram_direct(so, name, namelen, uiop, flags)); in sosend_dgram()
3841 if (so->so_family == AF_UNIX) { in sosend_dgram()
3873 dprintso(so, 1, in sosend_dgram()
3881 error = so_ux_addr_xlate(so, name, namelen, in sosend_dgram()
3885 eprintsoline(so, error); in sosend_dgram()
3949 audit_sock(T_UNITDATA_REQ, strvp2wq(SOTOV(so)), mp, 0); in sosend_dgram()
3951 error = kstrputmsg(SOTOV(so), mp, uiop, len, 0, MSG_BAND, 0); in sosend_dgram()
3955 eprintsoline(so, error); in sosend_dgram()
3966 sosend_svc(struct sonode *so, struct uio *uiop, t_scalar_t prim, int more, in sosend_svc() argument
3973 sotpi_info_t *sti = SOTOTPI(so); in sosend_svc()
3975 dprintso(so, 1, in sosend_svc()
3977 (void *)so, uiop->uio_resid, prim, sflag)); in sosend_svc()
4004 dprintso(so, 1, ("sosend_svc: sending 0x%x %d, %ld bytes\n", in sosend_svc()
4015 error = kstrputmsg(SOTOV(so), mp, uiop, iosize, in sosend_svc()
4018 eprintsoline(so, error); in sosend_svc()
4027 if (so->so_state & SS_CANTSENDMORE) { in sosend_svc()
4028 eprintsoline(so, error); in sosend_svc()
4031 if (so->so_error != 0) { in sosend_svc()
4032 mutex_enter(&so->so_lock); in sosend_svc()
4033 error = sogeterr(so, B_TRUE); in sosend_svc()
4034 mutex_exit(&so->so_lock); in sosend_svc()
4036 eprintsoline(so, error); in sosend_svc()
4091 sotpi_sendmsg(struct sonode *so, struct nmsghdr *msg, struct uio *uiop, in sotpi_sendmsg() argument
4101 sotpi_info_t *sti = SOTOTPI(so); in sotpi_sendmsg()
4103 dprintso(so, 1, ("sotpi_sendmsg(%p, %p, 0x%x) state %s, error %d\n", in sotpi_sendmsg()
4104 (void *)so, (void *)msg, msg->msg_flags, in sotpi_sendmsg()
4105 pr_state(so->so_state, so->so_mode), so->so_error)); in sotpi_sendmsg()
4107 if (so->so_version == SOV_STREAM) { in sotpi_sendmsg()
4109 so_update_attrs(so, SOMOD); in sotpi_sendmsg()
4110 return (strwrite(SOTOV(so), uiop, cr)); in sotpi_sendmsg()
4113 mutex_enter(&so->so_lock); in sotpi_sendmsg()
4114 so_state = so->so_state; in sotpi_sendmsg()
4117 mutex_exit(&so->so_lock); in sotpi_sendmsg()
4121 if (so->so_error != 0) { in sotpi_sendmsg()
4122 error = sogeterr(so, B_TRUE); in sotpi_sendmsg()
4124 mutex_exit(&so->so_lock); in sotpi_sendmsg()
4142 so_mode = so->so_mode; in sotpi_sendmsg()
4146 mutex_exit(&so->so_lock); in sotpi_sendmsg()
4168 if (so->so_family == AF_UNIX) { in sotpi_sendmsg()
4189 mutex_exit(&so->so_lock); in sotpi_sendmsg()
4202 mutex_exit(&so->so_lock); in sotpi_sendmsg()
4206 so_lock_single(so); /* Set SOLOCKED */ in sotpi_sendmsg()
4207 error = sotpi_bind(so, NULL, 0, in sotpi_sendmsg()
4209 so_unlock_single(so, SOLOCKED); in sotpi_sendmsg()
4211 mutex_exit(&so->so_lock); in sotpi_sendmsg()
4212 eprintsoline(so, error); in sotpi_sendmsg()
4239 switch (so->so_family) { in sotpi_sendmsg()
4275 mutex_exit(&so->so_lock); in sotpi_sendmsg()
4277 dprintso(so, 0, in sotpi_sendmsg()
4280 pr_addr(so->so_family, name, namelen))); in sotpi_sendmsg()
4288 mutex_exit(&so->so_lock); in sotpi_sendmsg()
4291 if ((flags & MSG_DONTROUTE) && !(so->so_options & SO_DONTROUTE)) { in sotpi_sendmsg()
4295 error = sotpi_setsockopt(so, SOL_SOCKET, SO_DONTROUTE, in sotpi_sendmsg()
4308 so_update_attrs(so, SOMOD); in sotpi_sendmsg()
4309 error = sosend_dgramcmsg(so, name, namelen, uiop, in sotpi_sendmsg()
4317 so_update_attrs(so, SOMOD); in sotpi_sendmsg()
4318 error = sosend_svccmsg(so, uiop, in sotpi_sendmsg()
4326 so_update_attrs(so, SOMOD); in sotpi_sendmsg()
4333 return (sosend_dgram(so, name, namelen, uiop, flags)); in sotpi_sendmsg()
4335 error = sosend_dgram(so, name, namelen, uiop, flags); in sotpi_sendmsg()
4351 dprintso(so, 1, ("sotpi_sendmsg: write\n")); in sotpi_sendmsg()
4360 canputnext(SOTOV(so)->v_stream->sd_wrq)) { in sotpi_sendmsg()
4361 return (sostream_direct(so, uiop, in sotpi_sendmsg()
4364 error = strwrite(SOTOV(so), uiop, cr); in sotpi_sendmsg()
4375 return (sosend_svc(so, uiop, prim, in sotpi_sendmsg()
4377 error = sosend_svc(so, uiop, prim, in sotpi_sendmsg()
4386 (void) sotpi_setsockopt(so, SOL_SOCKET, SO_DONTROUTE, in sotpi_sendmsg()
4413 struct sonode *so; in kstrwritemp() local
4419 so = VTOSO(vp); in kstrwritemp()
4420 direct = _SOTOTPI(so)->sti_direct; in kstrwritemp()
4431 return (sostream_direct(so, NULL, mp, CRED())); in kstrwritemp()
4486 sotpi_sendmblk(struct sonode *so, struct nmsghdr *msg, int fflag, in sotpi_sendmblk() argument
4491 switch (so->so_family) { in sotpi_sendmblk()
4501 if (so->so_state & SS_CANTSENDMORE) in sotpi_sendmblk()
4504 if (so->so_type != SOCK_STREAM) in sotpi_sendmblk()
4507 if ((so->so_state & SS_ISCONNECTED) == 0) in sotpi_sendmblk()
4510 error = kstrwritemp(so->so_vnode, *mpp, fflag); in sotpi_sendmblk()
4522 sodgram_direct(struct sonode *so, struct sockaddr *name, in sodgram_direct() argument
4531 struct stdata *stp = SOTOV(so)->v_stream; in sodgram_direct()
4536 sotpi_info_t *sti = SOTOTPI(so); in sodgram_direct()
4540 ASSERT(!(so->so_mode & SM_CONNREQUIRED)); in sodgram_direct()
4541 ASSERT(!(so->so_mode & SM_EXDATA)); in sodgram_direct()
4542 ASSERT(so->so_family == AF_INET || so->so_family == AF_INET6); in sodgram_direct()
4543 ASSERT(SOTOV(so)->v_type == VSOCK); in sodgram_direct()
4550 ASSERT(name->sa_family == so->so_family); in sodgram_direct()
4551 ASSERT(so->so_family == AF_INET || in sodgram_direct()
4553 ASSERT(so->so_family == AF_INET6 || in sodgram_direct()
4563 so_state = so->so_state; in sodgram_direct()
4603 audit_sock(T_UNITDATA_REQ, strvp2wq(SOTOV(so)), mp, 0); in sodgram_direct()
4620 return (strwrite(SOTOV(so), uiop, CRED())); in sodgram_direct()
4623 audit_sock(T_UNITDATA_REQ, strvp2wq(SOTOV(so)), mp, 0); in sodgram_direct()
4625 error = kstrputmsg(SOTOV(so), mp, uiop, len, 0, MSG_BAND, 0); in sodgram_direct()
4629 eprintsoline(so, error); in sodgram_direct()
4636 sostream_direct(struct sonode *so, struct uio *uiop, mblk_t *mp, cred_t *cr) in sostream_direct() argument
4638 struct stdata *stp = SOTOV(so)->v_stream; in sostream_direct()
4644 ASSERT(so->so_mode & SM_BYTESTREAM); in sostream_direct()
4645 ASSERT(SOTOV(so)->v_type == VSOCK); in sostream_direct()
4660 newmp = (stp->sd_wputdatafunc)(SOTOV(so), mp, NULL, in sostream_direct()
4674 return (strwrite(SOTOV(so), uiop, cr)); in sostream_direct()
4711 newmp = (stp->sd_wputdatafunc)(SOTOV(so), mp, NULL, in sostream_direct()
4742 return (strwrite_common(SOTOV(so), uiop, cr, wflag)); in sostream_direct()
4753 sotpi_getpeername(struct sonode *so, struct sockaddr *name, socklen_t *namelen, in sotpi_getpeername() argument
4761 sotpi_info_t *sti = SOTOTPI(so); in sotpi_getpeername()
4763 dprintso(so, 1, ("sotpi_getpeername(%p) %s\n", in sotpi_getpeername()
4764 (void *)so, pr_state(so->so_state, so->so_mode))); in sotpi_getpeername()
4767 mutex_enter(&so->so_lock); in sotpi_getpeername()
4768 so_lock_single(so); /* Set SOLOCKED */ in sotpi_getpeername()
4777 if (!(so->so_state & SS_ISCONNECTED)) { in sotpi_getpeername()
4782 if ((so->so_state & SS_CANTSENDMORE) && !xnet_skip_checks) { in sotpi_getpeername()
4798 dprintso(so, 1, ("sotpi_getpeername (local): %s\n", in sotpi_getpeername()
4799 pr_addr(so->so_family, sti->sti_faddr_sa, in sotpi_getpeername()
4803 if (so->so_family == AF_UNIX) { in sotpi_getpeername()
4811 ASSERT(so->so_family != AF_UNIX && sti->sti_faddr_noxlate == 0); in sotpi_getpeername()
4816 mutex_exit(&so->so_lock); in sotpi_getpeername()
4833 error = strioctl(SOTOV(so), TI_GETPEERNAME, (intptr_t)&strbuf, in sotpi_getpeername()
4837 mutex_enter(&so->so_lock); in sotpi_getpeername()
4864 (so->so_state & SS_ISCONNECTED)) { in sotpi_getpeername()
4875 dprintso(so, 1, ("sotpi_getpeername (tp): %s\n", in sotpi_getpeername()
4876 pr_addr(so->so_family, sti->sti_faddr_sa, in sotpi_getpeername()
4880 so_unlock_single(so, SOLOCKED); in sotpi_getpeername()
4881 mutex_exit(&so->so_lock); in sotpi_getpeername()
4889 sotpi_getsockname(struct sonode *so, struct sockaddr *name, socklen_t *namelen, in sotpi_getsockname() argument
4897 sotpi_info_t *sti = SOTOTPI(so); in sotpi_getsockname()
4899 dprintso(so, 1, ("sotpi_getsockname(%p) %s\n", in sotpi_getsockname()
4900 (void *)so, pr_state(so->so_state, so->so_mode))); in sotpi_getsockname()
4903 mutex_enter(&so->so_lock); in sotpi_getsockname()
4904 so_lock_single(so); /* Set SOLOCKED */ in sotpi_getsockname()
4908 dprintso(so, 1, ("sotpi_getsockname (local): %s\n", in sotpi_getsockname()
4909 pr_addr(so->so_family, sti->sti_laddr_sa, in sotpi_getsockname()
4919 if (so->so_family == AF_UNIX) { in sotpi_getsockname()
4933 if (!(so->so_state & SS_ISBOUND)) { in sotpi_getsockname()
4941 mutex_exit(&so->so_lock); in sotpi_getsockname()
4958 error = strioctl(SOTOV(so), TI_GETMYNAME, (intptr_t)&strbuf, in sotpi_getsockname()
4962 mutex_enter(&so->so_lock); in sotpi_getsockname()
4986 (so->so_state & SS_ISBOUND)) { in sotpi_getsockname()
4997 dprintso(so, 1, ("sotpi_getsockname (tp): %s\n", in sotpi_getsockname()
4998 pr_addr(so->so_family, sti->sti_laddr_sa, in sotpi_getsockname()
5002 so_unlock_single(so, SOLOCKED); in sotpi_getsockname()
5003 mutex_exit(&so->so_lock); in sotpi_getsockname()
5016 sotpi_getsockopt(struct sonode *so, int level, int option_name, in sotpi_getsockopt() argument
5033 dprintso(so, 1, ("sotpi_getsockopt(%p, 0x%x, 0x%x, %p, %p) %s\n", in sotpi_getsockopt()
5034 (void *)so, level, option_name, optval, (void *)optlenp, in sotpi_getsockopt()
5035 pr_state(so->so_state, so->so_mode))); in sotpi_getsockopt()
5037 mutex_enter(&so->so_lock); in sotpi_getsockopt()
5038 so_lock_single(so); /* Set SOLOCKED */ in sotpi_getsockopt()
5071 eprintsoline(so, error); in sotpi_getsockopt()
5081 eprintsoline(so, error); in sotpi_getsockopt()
5087 eprintsoline(so, error); in sotpi_getsockopt()
5096 eprintsoline(so, error); in sotpi_getsockopt()
5104 eprintsoline(so, error); in sotpi_getsockopt()
5112 value = so->so_type; in sotpi_getsockopt()
5117 value = sogeterr(so, B_TRUE); in sotpi_getsockopt()
5122 if (so->so_state & SS_ACCEPTCONN) in sotpi_getsockopt()
5128 dprintso(so, 1, in sotpi_getsockopt()
5132 dprintso(so, 1, in sotpi_getsockopt()
5148 value = (so->so_options & option_name); in sotpi_getsockopt()
5151 dprintso(so, 1, in sotpi_getsockopt()
5155 dprintso(so, 1, in sotpi_getsockopt()
5168 option = &so->so_linger; in sotpi_getsockopt()
5180 lvalue = so->so_sndbuf; in sotpi_getsockopt()
5182 mutex_exit(&so->so_lock); in sotpi_getsockopt()
5183 (void) strqget(strvp2wq(SOTOV(so))->q_next, in sotpi_getsockopt()
5185 mutex_enter(&so->so_lock); in sotpi_getsockopt()
5186 dprintso(so, 1, in sotpi_getsockopt()
5191 len = (t_uscalar_t)sizeof (so->so_sndbuf); in sotpi_getsockopt()
5210 lvalue = so->so_rcvbuf; in sotpi_getsockopt()
5212 mutex_exit(&so->so_lock); in sotpi_getsockopt()
5213 (void) strqget(RD(strvp2wq(SOTOV(so))), in sotpi_getsockopt()
5215 mutex_enter(&so->so_lock); in sotpi_getsockopt()
5216 dprintso(so, 1, in sotpi_getsockopt()
5225 len = (t_uscalar_t)sizeof (so->so_rcvbuf); in sotpi_getsockopt()
5229 value = so->so_family; in sotpi_getsockopt()
5239 value = so->so_sndlowat; in sotpi_getsockopt()
5243 value = so->so_rcvlowat; in sotpi_getsockopt()
5252 val = drv_hztousec(so->so_rcvtimeo); in sotpi_getsockopt()
5254 val = drv_hztousec(so->so_sndtimeo); in sotpi_getsockopt()
5270 (so->so_proto_props).sopp_wroff; in sotpi_getsockopt()
5272 (so->so_proto_props).sopp_maxblk; in sotpi_getsockopt()
5274 (so->so_proto_props).sopp_maxpsz; in sotpi_getsockopt()
5276 (so->so_proto_props).sopp_tail; in sotpi_getsockopt()
5284 mutex_exit(&so->so_lock); in sotpi_getsockopt()
5299 error = kstrputmsg(SOTOV(so), mp, NULL, 0, 0, in sotpi_getsockopt()
5302 mutex_enter(&so->so_lock); in sotpi_getsockopt()
5304 eprintsoline(so, error); in sotpi_getsockopt()
5307 error = sowaitprim(so, T_SVR4_OPTMGMT_REQ, T_OPTMGMT_ACK, in sotpi_getsockopt()
5315 eprintsoline(so, error); in sotpi_getsockopt()
5329 eprintsoline(so, error); in sotpi_getsockopt()
5343 eprintsoline(so, error); in sotpi_getsockopt()
5357 so_unlock_single(so, SOLOCKED); in sotpi_getsockopt()
5358 mutex_exit(&so->so_lock); in sotpi_getsockopt()
5371 sotpi_setsockopt(struct sonode *so, int level, int option_name, in sotpi_setsockopt() argument
5380 dprintso(so, 1, ("sotpi_setsockopt(%p, 0x%x, 0x%x, %p, %d) %s\n", in sotpi_setsockopt()
5381 (void *)so, level, option_name, optval, optlen, in sotpi_setsockopt()
5382 pr_state(so->so_state, so->so_mode))); in sotpi_setsockopt()
5385 if ((so->so_state & SS_CANTSENDMORE) && !xnet_skip_checks) { in sotpi_setsockopt()
5391 mutex_enter(&so->so_lock); in sotpi_setsockopt()
5392 so_lock_single(so); /* Set SOLOCKED */ in sotpi_setsockopt()
5393 mutex_exit(&so->so_lock); in sotpi_setsockopt()
5407 error = kstrputmsg(SOTOV(so), mp, NULL, 0, 0, in sotpi_setsockopt()
5410 mutex_enter(&so->so_lock); in sotpi_setsockopt()
5412 eprintsoline(so, error); in sotpi_setsockopt()
5415 error = sowaitprim(so, T_SVR4_OPTMGMT_REQ, T_OPTMGMT_ACK, in sotpi_setsockopt()
5418 eprintsoline(so, error); in sotpi_setsockopt()
5450 eprintsoline(so, error); in sotpi_setsockopt()
5462 eprintsoline(so, error); in sotpi_setsockopt()
5468 eprintsoline(so, error); in sotpi_setsockopt()
5478 eprintsoline(so, error); in sotpi_setsockopt()
5498 so->so_linger.l_linger = l->l_linger; in sotpi_setsockopt()
5500 so->so_linger.l_onoff = SO_LINGER; in sotpi_setsockopt()
5501 so->so_options |= SO_LINGER; in sotpi_setsockopt()
5503 so->so_linger.l_onoff = 0; in sotpi_setsockopt()
5504 so->so_options &= ~SO_LINGER; in sotpi_setsockopt()
5530 dprintso(so, 1, in sotpi_setsockopt()
5533 so->so_options |= option_name; in sotpi_setsockopt()
5535 dprintso(so, 1, in sotpi_setsockopt()
5538 so->so_options &= ~option_name; in sotpi_setsockopt()
5549 so->so_sndbuf = intvalue; in sotpi_setsockopt()
5552 so->so_rcvbuf = intvalue; in sotpi_setsockopt()
5555 so->so_rcv_timer_interval = intvalue; in sotpi_setsockopt()
5563 so->so_sndlowat = intvalue; in sotpi_setsockopt()
5566 so->so_rcvlowat = intvalue; in sotpi_setsockopt()
5583 so->so_rcvtimeo = drv_usectohz(val); in sotpi_setsockopt()
5585 so->so_sndtimeo = drv_usectohz(val); in sotpi_setsockopt()
5594 dprintso(so, 1, in sotpi_setsockopt()
5602 so_unlock_single(so, SOLOCKED); in sotpi_setsockopt()
5603 mutex_exit(&so->so_lock); in sotpi_setsockopt()
5612 sotpi_close(struct sonode *so, int flag, struct cred *cr) in sotpi_close() argument
5614 struct vnode *vp = SOTOV(so); in sotpi_close()
5617 sotpi_info_t *sti = SOTOTPI(so); in sotpi_close()
5619 dprintso(so, 1, ("sotpi_close(%p, %x) %s\n", in sotpi_close()
5620 (void *)vp, flag, pr_state(so->so_state, so->so_mode))); in sotpi_close()
5626 mutex_enter(&so->so_lock); in sotpi_close()
5627 so_lock_single(so); /* Set SOLOCKED */ in sotpi_close()
5629 ASSERT(so_verify_oobstate(so)); in sotpi_close()
5634 if (so->so_family == AF_UNIX) { in sotpi_close()
5636 so_unix_close(so); in sotpi_close()
5639 mutex_exit(&so->so_lock); in sotpi_close()
5653 mutex_enter(&so->so_lock); in sotpi_close()
5659 so_flush_discon_ind(so); in sotpi_close()
5661 so_unlock_single(so, SOLOCKED); in sotpi_close()
5662 mutex_exit(&so->so_lock); in sotpi_close()
5670 if (so->so_flag & SOCLONE) in sotpi_close()
5677 sotpi_ioctl(struct sonode *so, int cmd, intptr_t arg, int mode, in sotpi_ioctl() argument
5680 struct vnode *vp = SOTOV(so); in sotpi_ioctl()
5681 sotpi_info_t *sti = SOTOTPI(so); in sotpi_ioctl()
5684 dprintso(so, 0, ("sotpi_ioctl: cmd 0x%x, arg 0x%lx, state %s\n", in sotpi_ioctl()
5685 cmd, arg, pr_state(so->so_state, so->so_mode))); in sotpi_ioctl()
5719 if (so->so_version != SOV_STREAM) in sotpi_ioctl()
5728 ASSERT(so->so_version != SOV_STREAM); in sotpi_ioctl()
5741 mutex_enter(&so->so_lock); in sotpi_ioctl()
5743 so->so_state |= SS_NDELAY; in sotpi_ioctl()
5745 so->so_state &= ~SS_NDELAY; in sotpi_ioctl()
5747 mutex_exit(&so->so_lock); in sotpi_ioctl()
5758 mutex_enter(&so->so_lock); in sotpi_ioctl()
5764 if ((value == 0 && (so->so_state & SS_ASYNC) != 0) || in sotpi_ioctl()
5765 (value != 0 && (so->so_state & SS_ASYNC) == 0)) in sotpi_ioctl()
5766 error = so_flip_async(so, vp, mode, cr); in sotpi_ioctl()
5767 mutex_exit(&so->so_lock); in sotpi_ioctl()
5779 mutex_enter(&so->so_lock); in sotpi_ioctl()
5780 dprintso(so, 1, ("setown: new %d old %d\n", pgrp, so->so_pgrp)); in sotpi_ioctl()
5782 if (pgrp != so->so_pgrp) in sotpi_ioctl()
5783 error = so_set_siggrp(so, vp, pgrp, mode, cr); in sotpi_ioctl()
5784 mutex_exit(&so->so_lock); in sotpi_ioctl()
5789 if (so_copyout(&so->so_pgrp, (void *)arg, in sotpi_ioctl()
5808 mutex_enter(&so->so_lock); in sotpi_ioctl()
5809 so_state = so->so_state; in sotpi_ioctl()
5810 mutex_exit(&so->so_lock); in sotpi_ioctl()
5872 mutex_enter(&so->so_lock); in sotpi_ioctl()
5873 if ((so->so_mode & SM_CONNREQUIRED) == 0) { in sotpi_ioctl()
5875 } else if ((so->so_state & SS_ISCONNECTED) == 0) { in sotpi_ioctl()
5877 } else if (so->so_peercred != NULL) { in sotpi_ioctl()
5879 kp->pc_cr = so->so_peercred; in sotpi_ioctl()
5880 kp->pc_cpid = so->so_cpid; in sotpi_ioctl()
5881 crhold(so->so_peercred); in sotpi_ioctl()
5885 mutex_exit(&so->so_lock); in sotpi_ioctl()
5894 so->so_version == SOV_SOCKBSD) { in sotpi_ioctl()
5914 struct sonode *so = VTOSO(vp); in socktpi_plumbioctl() local
5917 sotpi_info_t *sti = SOTOTPI(so); in socktpi_plumbioctl()
5921 if (so->so_version == SOV_SOCKBSD) in socktpi_plumbioctl()
5924 if (so->so_version == SOV_STREAM) { in socktpi_plumbioctl()
5934 dprintso(so, 0, ("socktpi_ioctl: going to " in socktpi_plumbioctl()
5936 so_stream2sock(so); in socktpi_plumbioctl()
5946 mutex_enter(&so->so_lock); in socktpi_plumbioctl()
5947 so_lock_single(so); in socktpi_plumbioctl()
5948 mutex_exit(&so->so_lock); in socktpi_plumbioctl()
5953 mutex_enter(&so->so_lock); in socktpi_plumbioctl()
5956 so_unlock_single(so, SOLOCKED); in socktpi_plumbioctl()
5957 mutex_exit(&so->so_lock); in socktpi_plumbioctl()
5971 dprintso(so, 0, in socktpi_plumbioctl()
5973 return (so_sock2stream(so)); in socktpi_plumbioctl()
6109 struct sonode *so, in sotpi_poll() argument
6116 struct vnode *vp = SOTOV(so); in sotpi_poll()
6118 int so_state = so->so_state; /* snapshot */ in sotpi_poll()
6119 sotpi_info_t *sti = SOTOTPI(so); in sotpi_poll()
6121 dprintso(so, 0, ("socktpi_poll(%p): state %s err %d\n", in sotpi_poll()
6122 (void *)vp, pr_state(so_state, so->so_mode), so->so_error)); in sotpi_poll()
6127 if (so->so_version == SOV_STREAM) { in sotpi_poll()
6134 (so->so_mode & SM_CONNREQUIRED)) { in sotpi_poll()
6143 if (so->so_error != 0 && in sotpi_poll()
6205 if (so->so_state & SS_CANTRCVMORE) { in sotpi_poll()
6208 if (so->so_state & SS_CANTSENDMORE) in sotpi_poll()
6212 if (so->so_state & SS_OOBPEND) in sotpi_poll()
6257 struct sonode *so = (struct sonode *)buf; in socktpi_unix_constructor() local
6258 sotpi_info_t *sti = SOTOTPI(so); in socktpi_unix_constructor()
6265 SOTOTPI(sti->sti_next_so)->sti_prev_so = so; in socktpi_unix_constructor()
6266 socklist.sl_list = so; in socktpi_unix_constructor()
6277 struct sonode *so = (struct sonode *)buf; in socktpi_unix_destructor() local
6278 sotpi_info_t *sti = SOTOTPI(so); in socktpi_unix_destructor()
6318 sotpi_convert_sonode(struct sonode *so, struct sockparams *newsp, in sotpi_convert_sonode() argument
6322 struct sockparams *origsp = so->so_sockparams; in sotpi_convert_sonode()
6323 sock_lower_handle_t handle = so->so_proto_handle; in sotpi_convert_sonode()
6329 ASSERT((so->so_state & (SS_FALLBACK_PENDING|SS_FALLBACK_COMP)) == in sotpi_convert_sonode()
6331 ASSERT(SOCK_IS_NONSTR(so)); in sotpi_convert_sonode()
6335 so->so_sockparams = newsp; in sotpi_convert_sonode()
6339 (void) sotpi_info_create(so, KM_SLEEP); in sotpi_convert_sonode()
6340 sotpi_info_init(so); in sotpi_convert_sonode()
6342 if ((error = sotpi_init(so, NULL, cr, SO_FALLBACK)) != 0) { in sotpi_convert_sonode()
6343 sotpi_info_fini(so); in sotpi_convert_sonode()
6344 sotpi_info_destroy(so); in sotpi_convert_sonode()
6347 ASSERT(handle == so->so_proto_handle); in sotpi_convert_sonode()
6348 sti = SOTOTPI(so); in sotpi_convert_sonode()
6358 so_basic_strinit(so); /* skips the T_CAPABILITY_REQ */ in sotpi_convert_sonode()
6359 so_alloc_addr(so, so->so_max_addr_len); in sotpi_convert_sonode()
6371 if (so->so_pgrp != 0) { in sotpi_convert_sonode()
6372 if (so_set_events(so, so->so_vnode, cr) != 0) in sotpi_convert_sonode()
6373 so->so_pgrp = 0; in sotpi_convert_sonode()
6379 vp = SOTOV(so); in sotpi_convert_sonode()
6393 so->so_not_str = B_FALSE; in sotpi_convert_sonode()
6403 sotpi_revert_sonode(struct sonode *so, struct cred *cr) in sotpi_revert_sonode() argument
6405 vnode_t *vp = SOTOV(so); in sotpi_revert_sonode()
6407 ASSERT((so->so_state & (SS_FALLBACK_PENDING|SS_FALLBACK_COMP)) == in sotpi_revert_sonode()
6409 ASSERT(!SOCK_IS_NONSTR(so)); in sotpi_revert_sonode()
6419 so->so_sockparams = SOTOTPI(so)->sti_orig_sp; in sotpi_revert_sonode()
6421 sotpi_info_fini(so); in sotpi_revert_sonode()
6422 sotpi_info_destroy(so); in sotpi_revert_sonode()
6425 so->so_not_str = B_TRUE; in sotpi_revert_sonode()
6429 sotpi_update_state(struct sonode *so, struct T_capability_ack *tcap, in sotpi_update_state() argument
6433 sotpi_info_t *sti = SOTOTPI(so); in sotpi_update_state()
6435 so_proc_tcapability_ack(so, tcap); in sotpi_update_state()
6437 so->so_options |= opts; in sotpi_update_state()
6446 sti->sti_laddr_valid = (so->so_state & SS_ISBOUND); in sotpi_update_state()
6453 sti->sti_faddr_valid = (so->so_state & SS_ISCONNECTED); in sotpi_update_state()
6462 so_alloc_addr(struct sonode *so, t_uscalar_t maxlen) in so_alloc_addr() argument
6464 sotpi_info_t *sti = SOTOTPI(so); in so_alloc_addr()
6470 so->so_max_addr_len = sti->sti_laddr_maxlen; in so_alloc_addr()
6475 if (so->so_family == AF_UNIX) { in so_alloc_addr()
6486 sotpi_sototpi(struct sonode *so) in sotpi_sototpi() argument
6490 ASSERT(so != NULL); in sotpi_sototpi()
6492 sti = (sotpi_info_t *)so->so_priv; in sotpi_sototpi()
6544 sotpi_info_create(struct sonode *so, int kmflags) in sotpi_info_create() argument
6548 ASSERT(so->so_priv == NULL); in sotpi_info_create()
6558 so->so_priv = (void *)sti; in sotpi_info_create()
6566 sotpi_info_init(struct sonode *so) in sotpi_info_init() argument
6568 struct vnode *vp = SOTOV(so); in sotpi_info_init()
6569 sotpi_info_t *sti = SOTOTPI(so); in sotpi_info_init()
6572 sti->sti_dev = so->so_sockparams->sp_sdev_info.sd_vnode->v_rdev; in sotpi_info_init()
6617 sotpi_info_fini(struct sonode *so) in sotpi_info_fini() argument
6619 sotpi_info_t *sti = SOTOTPI(so); in sotpi_info_fini()
6640 mutex_enter(&so->so_lock); in sotpi_info_fini()
6655 mutex_exit(&so->so_lock); in sotpi_info_fini()
6679 sotpi_info_destroy(struct sonode *so) in sotpi_info_destroy() argument
6681 sotpi_info_t *sti = SOTOTPI(so); in sotpi_info_destroy()
6686 so->so_priv = NULL; in sotpi_info_destroy()