Lines Matching defs:so

281 	struct sonode	*so;
289 * The request is for an NCA socket so for NL7C use the
308 so = kmem_cache_alloc(cp, KM_SLEEP);
309 if (so == NULL) {
314 sonode_init(so, sp, family, type, protocol, &sotpi_sonodeops);
315 sotpi_info_init(so);
318 SOTOTPI(so)->sti_nl7c_flags = NL7C_AF_NCA;
324 so->so_version = (short)version;
327 return (so);
331 sotpi_destroy(struct sonode *so)
341 ASSERT(so->so_ops == &sotpi_sonodeops);
343 origsp = SOTOTPI(so)->sti_orig_sp;
345 sotpi_info_fini(so);
347 if (so->so_state & SS_FALLBACK_COMP) {
354 sotpi_info_destroy(so);
357 origsp->sp_smod_info->smod_sock_destroy_func(so);
360 sonode_fini(so);
361 cp = (so->so_family == AF_UNIX) ? socktpi_unix_cache :
363 kmem_cache_free(cp, so);
369 sotpi_init(struct sonode *so, struct sonode *tso, struct cred *cr, int flags)
377 sotpi_info_t *sti = SOTOTPI(so);
391 so->so_flag |= SOCLONE;
393 if ((so->so_type == SOCK_STREAM || so->so_type == SOCK_DGRAM) &&
394 (so->so_family == AF_INET || so->so_family == AF_INET6) &&
395 (so->so_protocol == IPPROTO_TCP || so->so_protocol == IPPROTO_UDP ||
396 so->so_protocol == IPPROTO_IP)) {
407 ASSERT(so->so_type != SOCK_DGRAM || tso == NULL);
408 if (so->so_type == SOCK_STREAM && tso != NULL) {
432 if (so->so_family == AF_UNIX) {
436 vp = SOTOV(so);
445 if (so->so_flag & SOCLONE)
447 mutex_enter(&so->so_lock);
450 mutex_exit(&so->so_lock);
457 (void) sotpi_close(so, flags, cr);
483 ASSERT(so->so_family == AF_INET ||
484 so->so_family == AF_INET6);
485 ASSERT(so->so_protocol == IPPROTO_UDP ||
486 so->so_protocol == IPPROTO_TCP ||
487 so->so_protocol == IPPROTO_IP);
488 ASSERT(so->so_type == SOCK_DGRAM ||
489 so->so_type == SOCK_STREAM);
517 (void) sotpi_close(so, flags,
532 if (error = so_strinit(so, tso)) {
533 (void) sotpi_close(so, flags, cr);
538 if (so->so_family == AF_UNIX && so->so_type == SOCK_STREAM) {
539 mutex_enter(&so->so_lock);
540 so->so_mode |= SM_SENDFILESUPP;
541 mutex_exit(&so->so_lock);
545 if (so->so_protocol != so->so_sockparams->sp_protocol) {
546 int protocol = so->so_protocol;
550 error = sotpi_setsockopt(so, SOL_SOCKET, SO_PROTOTYPE,
553 (void) sotpi_close(so, flags, cr);
576 (void) sotpi_close(so, flags, cr);
583 "sockfs open:maj %d vp %p so %p error %d",
584 maj, vp, so, error);
594 so_automatic_bind(struct sonode *so)
596 sotpi_info_t *sti = SOTOTPI(so);
597 ASSERT(so->so_family == AF_INET || so->so_family == AF_INET6);
599 ASSERT(MUTEX_HELD(&so->so_lock));
600 ASSERT(!(so->so_state & SS_ISBOUND));
605 sti->sti_laddr_sa->sa_family = so->so_family;
606 so->so_state |= SS_ISBOUND;
634 sotpi_bindlisten(struct sonode *so, struct sockaddr *name,
650 sotpi_info_t *sti = SOTOTPI(so);
652 dprintso(so, 1, ("sotpi_bindlisten(%p, %p, %d, %d, 0x%x) %s\n",
653 (void *)so, (void *)name, namelen, backlog, flags,
654 pr_state(so->so_state, so->so_mode)));
656 tcp_udp_xport = so->so_type == SOCK_STREAM || so->so_type == SOCK_DGRAM;
659 mutex_enter(&so->so_lock);
660 so_lock_single(so); /* Set SOLOCKED */
662 ASSERT(MUTEX_HELD(&so->so_lock));
663 ASSERT(so->so_flag & SOLOCKED);
672 dprintso(so, 1, ("sobind: allocating unbind_req\n"));
686 if (so->so_family == AF_UNIX) {
690 dprintso(so, 1, ("sobind rebind UNIX: addrlen %d, "
706 if (so->so_state & SS_ISBOUND) {
712 switch (so->so_family) {
722 sti->sti_laddr_sa->sa_family = so->so_family;
741 sti->sti_laddr_len = (so->so_family == AF_INET) ?
746 sti->sti_laddr_sa->sa_family = so->so_family;
768 if (so->so_state & SS_ISBOUND) {
785 eprintsoline(so, error);
788 if ((so->so_mode & SM_CONNREQUIRED) &&
789 (so->so_state & SS_CANTREBIND)) {
792 eprintsoline(so, error);
795 error = sotpi_unbind(so, 0);
797 eprintsoline(so, error);
800 ASSERT(!(so->so_state & SS_ISBOUND));
802 so->so_state &=
809 if ((so->so_state & SS_CANTSENDMORE) && !xnet_skip_checks) {
818 switch (so->so_family) {
822 * when copied (copyin_name) in so the minimum
828 eprintsoline(so, error);
836 if (name->sa_family != so->so_family) {
844 eprintsoline(so, error);
848 error = name->sa_family != so->so_family ?
850 eprintsoline(so, error);
854 (name->sa_family != so->so_family)) {
862 eprintsoline(so, error);
875 name->sa_family = so->so_family;
885 eprintsoline(so, error);
889 error = name->sa_family != so->so_family ?
891 eprintsoline(so, error);
894 if (name->sa_family != so->so_family) {
900 eprintsoline(so, error);
933 eprintsoline(so, error);
941 eprintsoline(so, error);
953 switch (so->so_family) {
977 eprintsoline(so, error);
989 eprintsoline(so, error);
1006 ASSERT(SOTOV(so)->v_stream);
1008 vp->v_stream = SOTOV(so)->v_stream;
1022 dprintso(so, 1, ("sobind UNIX: addrlen %d, addr %p\n",
1027 } /* end switch (so->so_family) */
1037 if ((so->so_state & SS_ACCEPTCONN) == 0)
1039 save_so_backlog = so->so_backlog;
1041 so->so_state |= SS_ACCEPTCONN;
1042 so->so_backlog = backlog;
1049 * NL7C supports the TCP transport only so check AF_INET and AF_INET6
1053 (so->so_family == AF_INET || so->so_family == AF_INET6) &&
1060 if (so->so_zoneid == GLOBAL_ZONEID) {
1065 * Was an AF_NCA bind() so add it to the
1079 (so->so_family == AF_INET || so->so_family == AF_INET6))
1092 mutex_exit(&so->so_lock);
1094 error = kstrputmsg(SOTOV(so), mp, NULL, 0, 0,
1097 eprintsoline(so, error);
1098 mutex_enter(&so->so_lock);
1102 mutex_enter(&so->so_lock);
1103 error = sowaitprim(so, PRIM_type, T_BIND_ACK,
1106 eprintsoline(so, error);
1118 ASSERT(so->so_family == AF_UNIX);
1121 ASSERT(!(so->so_state & SS_ISBOUND) || (flags & _SOBIND_REBIND));
1122 so->so_state |= SS_ISBOUND;
1132 addrlen = (t_uscalar_t)(so->so_family == AF_UNIX ?
1147 eprintsoline(so, error);
1209 eprintsoline(so, error);
1213 switch (so->so_family) {
1251 eprintsoline(so, error);
1262 if (so->so_family == AF_INET) {
1267 eprintsoline(so, error);
1278 eprintsoline(so, error);
1288 eprintsoline(so, error);
1289 eprintso(so,
1305 eprintsoline(so, error);
1328 switch (so->so_family) {
1356 nl7c_listener_addr(nl7c, so);
1365 so->so_state &= ~SS_ACCEPTCONN;
1367 so->so_backlog = save_so_backlog;
1369 if (unbind_on_err && so->so_state & SS_ISBOUND) {
1372 err = sotpi_unbind(so, 0);
1375 eprintsoline(so, error);
1377 ASSERT(!(so->so_state & SS_ISBOUND));
1382 so_unlock_single(so, SOLOCKED);
1383 mutex_exit(&so->so_lock);
1385 ASSERT(MUTEX_HELD(&so->so_lock));
1386 ASSERT(so->so_flag & SOLOCKED);
1393 sotpi_bind(struct sonode *so, struct sockaddr *name, socklen_t namelen,
1397 return (sotpi_bindlisten(so, name, namelen, 0, flags, cr));
1400 return (sotpi_bindlisten(so, name, namelen, 1, flags, cr));
1407 * so that a sobind can pick them up.
1410 sotpi_unbind(struct sonode *so, int flags)
1415 sotpi_info_t *sti = SOTOTPI(so);
1417 dprintso(so, 1, ("sotpi_unbind(%p, 0x%x) %s\n",
1418 (void *)so, flags, pr_state(so->so_state, so->so_mode)));
1420 ASSERT(MUTEX_HELD(&so->so_lock));
1421 ASSERT(so->so_flag & SOLOCKED);
1423 if (!(so->so_state & SS_ISBOUND)) {
1425 eprintsoline(so, error);
1429 mutex_exit(&so->so_lock);
1435 (void) putnextctl1(strvp2wq(SOTOV(so)), M_FLUSH, FLUSHRW);
1440 error = kstrputmsg(SOTOV(so), mp, NULL, 0, 0,
1442 mutex_enter(&so->so_lock);
1444 eprintsoline(so, error);
1448 error = sowaitokack(so, T_UNBIND_REQ);
1450 eprintsoline(so, error);
1472 so->so_state &= ~(SS_ISBOUND|SS_ACCEPTCONN);
1478 ASSERT(MUTEX_HELD(&so->so_lock));
1479 ASSERT(so->so_flag & SOLOCKED);
1491 sotpi_listen(struct sonode *so, int backlog, struct cred *cr)
1494 sotpi_info_t *sti = SOTOTPI(so);
1496 dprintso(so, 1, ("sotpi_listen(%p, %d) %s\n",
1497 (void *)so, backlog, pr_state(so->so_state, so->so_mode)));
1509 if (so->so_state & SS_ACCEPTCONN &&
1510 !((so->so_family == AF_INET || so->so_family == AF_INET6) &&
1515 if (so->so_state & SS_ISCONNECTED)
1518 mutex_enter(&so->so_lock);
1519 so_lock_single(so); /* Set SOLOCKED */
1525 if ((so->so_state & SS_ACCEPTCONN) &&
1526 so->so_backlog == backlog)
1529 if (!(so->so_state & SS_ISBOUND)) {
1533 if (so->so_family == AF_UNIX) {
1537 error = sotpi_bindlisten(so, NULL, 0, backlog,
1546 if (!((so->so_family == AF_INET || so->so_family == AF_INET6) &&
1549 error = sotpi_unbind(so, _SOUNBIND_REBIND);
1553 error = sotpi_bindlisten(so, NULL, 0, backlog,
1556 so->so_state |= SS_ACCEPTCONN;
1557 so->so_backlog = backlog;
1561 ASSERT(so->so_state & SS_ACCEPTCONN);
1563 so_unlock_single(so, SOLOCKED);
1564 mutex_exit(&so->so_lock);
1574 * so there is no point (and potentially incorrect) to unbind.
1577 sodisconnect(struct sonode *so, t_scalar_t seqno, int flags)
1583 dprintso(so, 1, ("sodisconnect(%p, %d, 0x%x) %s\n",
1584 (void *)so, seqno, flags, pr_state(so->so_state, so->so_mode)));
1587 mutex_enter(&so->so_lock);
1588 so_lock_single(so); /* Set SOLOCKED */
1590 ASSERT(MUTEX_HELD(&so->so_lock));
1591 ASSERT(so->so_flag & SOLOCKED);
1594 if (!(so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING|SS_ACCEPTCONN))) {
1596 eprintsoline(so, error);
1600 mutex_exit(&so->so_lock);
1607 if (!(so->so_state & SS_ACCEPTCONN))
1608 (void) putnextctl1(strvp2wq(SOTOV(so)), M_FLUSH, FLUSHW);
1614 error = kstrputmsg(SOTOV(so), mp, NULL, 0, 0,
1616 mutex_enter(&so->so_lock);
1618 eprintsoline(so, error);
1622 error = sowaitokack(so, T_DISCON_REQ);
1624 eprintsoline(so, error);
1633 so->so_state &= ~(SS_ISCONNECTED|SS_ISCONNECTING);
1634 SOTOTPI(so)->sti_laddr_valid = 0;
1635 SOTOTPI(so)->sti_faddr_valid = 0;
1638 so_unlock_single(so, SOLOCKED);
1639 mutex_exit(&so->so_lock);
1642 ASSERT(MUTEX_HELD(&so->so_lock));
1643 ASSERT(so->so_flag & SOLOCKED);
1650 sotpi_accept(struct sonode *so, int fflag, struct cred *cr,
1666 sotpi_info_t *sti = SOTOTPI(so);
1669 dprintso(so, 1, ("sotpi_accept(%p, 0x%x, %p) %s\n",
1670 (void *)so, fflag, (void *)nsop,
1671 pr_state(so->so_state, so->so_mode)));
1680 if ((so->so_state & SS_ACCEPTCONN) == 0)
1683 if ((error = sowaitconnind(so, fflag, &mp)) != 0)
1699 eprintsoline(so, error);
1703 switch (so->so_family) {
1729 (void) strioctl(SOTOV(so), _SIOCSOCKFALLBACK,
1744 eprintsoline(so, error);
1748 if (so->so_family == AF_UNIX) {
1763 nso = socket_newconn(so, NULL, NULL, SOCKET_SLEEP, &error);
1769 * so return EINTR.
1784 nso->so_options |= so->so_options & SO_DEBUG;
1798 eprintsoline(so, error);
1827 * A signal was caught so return EINTR.
1830 eprintsoline(so, error);
1879 * so that any data arriving on the new socket will cause the
1885 nso->so_pgrp = so->so_pgrp;
1886 nso->so_state |= so->so_state & SS_ASYNC;
1903 nso->so_options = so->so_options & (SO_DEBUG|SO_REUSEADDR|SO_KEEPALIVE|
1906 nso->so_sndbuf = so->so_sndbuf;
1907 nso->so_rcvbuf = so->so_rcvbuf;
1909 nso->so_linger = so->so_linger;
1932 mutex_enter(&so->so_lock);
1933 so_lock_single(so);
1934 eprintsoline(so, error);
1942 mutex_enter(&so->so_lock);
1943 so_lock_single(so);
1944 eprintsoline(so, error);
1970 * A NL7C marked listen()er so the new socket
1979 if (so->so_state & (SS_NONBLOCK|SS_NDELAY)) {
2015 mutex_enter(&so->so_lock);
2016 so_lock_single(so);
2017 eprintsoline(so, error);
2073 mutex_enter(&so->so_lock);
2074 so_lock_single(so); /* Set SOLOCKED */
2075 mutex_exit(&so->so_lock);
2077 error = kstrputmsg(SOTOV(so), mp, NULL,
2079 mutex_enter(&so->so_lock);
2081 eprintsoline(so, error);
2084 error = sowaitprim(so, PRIM_type, T_OK_ACK,
2087 eprintsoline(so, error);
2090 mutex_exit(&so->so_lock);
2112 ASSERT(so->so_family == AF_UNIX);
2129 mutex_enter(&so->so_lock);
2130 so_unlock_single(so, SOLOCKED);
2131 mutex_exit(&so->so_lock);
2145 eprintsoline(so, error);
2149 eprintsoline(so, error);
2154 (void) sodisconnect(so, SEQ_number, 0);
2158 eprintsoline(so, error);
2160 (void) sodisconnect(so, SEQ_number, _SODISCONNECT_LOCK_HELD);
2161 so_unlock_single(so, SOLOCKED);
2162 mutex_exit(&so->so_lock);
2168 error = (so->so_type == SOCK_DGRAM || so->so_type == SOCK_RAW)
2171 eprintsoline(so, error);
2182 sotpi_connect(struct sonode *so,
2197 sotpi_info_t *sti = SOTOTPI(so);
2199 dprintso(so, 1, ("sotpi_connect(%p, %p, %d, 0x%x, 0x%x) %s\n",
2200 (void *)so, (void *)name, namelen, fflag, flags,
2201 pr_state(so->so_state, so->so_mode)));
2217 * caught so return EINTR.
2220 eprintsoline(so, error);
2224 mutex_enter(&so->so_lock);
2234 so_lock_single(so); /* Set SOLOCKED */
2238 dprintso(so, 1, ("sotpi_connect: allocating unbind_req\n"));
2251 if (so->so_state & SS_ACCEPTCONN) {
2259 if (!(so->so_state & SS_ISBOUND)) {
2260 if ((so->so_family == AF_INET || so->so_family == AF_INET6) &&
2262 so->so_type == SOCK_STREAM && !soconnect_tpi_tcp) {
2267 so_automatic_bind(so);
2269 error = sotpi_bind(so, NULL, 0,
2274 ASSERT(so->so_state & SS_ISBOUND);
2296 if (so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING)) {
2298 if (so->so_mode & SM_CONNREQUIRED) {
2300 error = so->so_state & SS_ISCONNECTED ?
2313 if ((so->so_family == AF_INET ||
2314 so->so_family == AF_INET6) &&
2315 (so->so_type == SOCK_DGRAM ||
2316 so->so_type == SOCK_RAW) &&
2320 error = sodisconnect(so, -1,
2323 so->so_state &=
2330 so_unlock_single(so, SOLOCKED);
2331 mutex_exit(&so->so_lock);
2334 (void) sotpi_setsockopt(so, SOL_SOCKET,
2338 mutex_enter(&so->so_lock);
2339 so_lock_single(so); /* Set SOLOCKED */
2343 ASSERT(so->so_state & SS_ISBOUND);
2356 ASSERT(so->so_family == AF_UNIX);
2370 error = so_addr_verify(so, name, namelen);
2388 if (so->so_family == AF_UNIX) {
2406 dprintso(so, 1,
2409 error = so_ux_addr_xlate(so,
2436 if (!(so->so_mode & SM_CONNREQUIRED)) {
2442 so_unlock_single(so, SOLOCKED);
2443 mutex_exit(&so->so_lock);
2446 (void) sotpi_setsockopt(so, SOL_SOCKET, SO_DGRAM_ERRIND,
2449 mutex_enter(&so->so_lock);
2450 so_lock_single(so); /* Set SOLOCKED */
2451 if ((so->so_family != AF_INET && so->so_family != AF_INET6) ||
2452 (so->so_type != SOCK_DGRAM && so->so_type != SOCK_RAW) ||
2454 soisconnected(so);
2462 ASSERT(so->so_family != AF_UNIX);
2470 switch (so->so_family) {
2498 if (so->so_error != 0)
2540 soisconnecting(so);
2541 mutex_exit(&so->so_lock);
2544 audit_sock(T_CONN_REQ, strvp2wq(SOTOV(so)), mp, 0);
2546 error = kstrputmsg(SOTOV(so), mp, NULL, 0, 0,
2549 mutex_enter(&so->so_lock);
2553 if ((error = sowaitokack(so, T_CONN_REQ)) != 0)
2557 so_unlock_single(so, SOLOCKED);
2563 if ((error = sowaitconnected(so, fflag, 0)) != 0) {
2564 so_lock_single(so); /* Set SOLOCKED */
2586 so->so_state &= ~SS_ISCONNECTING;
2590 (so->so_state & SS_ISBOUND)) {
2593 err = sotpi_unbind(so, 0);
2596 eprintsoline(so, err);
2602 so_unlock_single(so, SOLOCKED);
2603 mutex_exit(&so->so_lock);
2606 so_bad: error = sogeterr(so, B_TRUE);
2607 bad: eprintsoline(so, error);
2613 sotpi_shutdown(struct sonode *so, int how, struct cred *cr)
2619 sotpi_info_t *sti = SOTOTPI(so);
2621 dprintso(so, 1, ("sotpi_shutdown(%p, %d) %s\n",
2622 (void *)so, how, pr_state(so->so_state, so->so_mode)));
2624 mutex_enter(&so->so_lock);
2625 so_lock_single(so); /* Set SOLOCKED */
2632 if (!(so->so_state & SS_ISCONNECTED)) {
2649 old_state = so->so_state;
2653 socantrcvmore(so);
2656 socantsendmore(so);
2659 socantsendmore(so);
2660 socantrcvmore(so);
2670 state_change = (so->so_state & (SS_CANTRCVMORE|SS_CANTSENDMORE)) -
2676 dprintso(so, 1,
2678 so->so_state));
2682 mutex_exit(&so->so_lock);
2683 strseteof(SOTOV(so), 1);
2692 mutex_enter(&so->so_lock);
2693 (void) so_lock_read(so, 0); /* Set SOREADLOCKED */
2694 mutex_exit(&so->so_lock);
2697 strflushrq(SOTOV(so), FLUSHALL);
2699 mutex_enter(&so->so_lock);
2700 so_unlock_read(so); /* Clear SOREADLOCKED */
2704 mutex_exit(&so->so_lock);
2705 strsetwerror(SOTOV(so), 0, 0, sogetwrerr);
2706 mutex_enter(&so->so_lock);
2710 mutex_exit(&so->so_lock);
2711 strsetwerror(SOTOV(so), 0, 0, sogetwrerr);
2712 strseteof(SOTOV(so), 1);
2721 mutex_enter(&so->so_lock);
2722 (void) so_lock_read(so, 0); /* Set SOREADLOCKED */
2723 mutex_exit(&so->so_lock);
2726 strflushrq(SOTOV(so), FLUSHALL);
2728 mutex_enter(&so->so_lock);
2729 so_unlock_read(so); /* Clear SOREADLOCKED */
2733 ASSERT(MUTEX_HELD(&so->so_lock));
2746 if ((so->so_state & (SS_CANTRCVMORE|SS_CANTSENDMORE)) ==
2752 if (so->so_family == AF_UNIX && sti->sti_serv_type != T_CLTS)
2753 so_unix_close(so);
2756 error = sodisconnect(so, -1, _SODISCONNECT_LOCK_HELD);
2763 mutex_exit(&so->so_lock);
2771 error = kstrputmsg(SOTOV(so), mp, NULL, 0, 0,
2773 mutex_enter(&so->so_lock);
2775 eprintsoline(so, error);
2781 so_unlock_single(so, SOLOCKED);
2782 mutex_exit(&so->so_lock);
2806 so_unix_close(struct sonode *so)
2811 sotpi_info_t *sti = SOTOTPI(so);
2813 ASSERT(MUTEX_HELD(&so->so_lock));
2815 ASSERT(so->so_family == AF_UNIX);
2817 if ((so->so_state & (SS_ISCONNECTED|SS_ISBOUND)) !=
2821 dprintso(so, 1, ("so_unix_close(%p) %s\n",
2822 (void *)so, pr_state(so->so_state, so->so_mode)));
2831 if (so->so_type == SOCK_STREAM || so->so_type == SOCK_SEQPACKET) {
2862 error = so_addr_verify(so, sti->sti_faddr_sa,
2865 eprintsoline(so, error);
2885 dprintso(so, 1,
2888 error = so_ux_addr_xlate(so,
2893 eprintsoline(so, error);
2940 mutex_exit(&so->so_lock);
2941 error = kstrputmsg(SOTOV(so), mp, NULL, 0, 0,
2943 mutex_enter(&so->so_lock);
2950 * if (so->so_state & (SS_OOBPEND|SS_HAVEOOBDATA|SS_RCVATMARK))
2964 sorecv_update_oobstate(struct sonode *so)
2966 sotpi_info_t *sti = SOTOTPI(so);
2968 mutex_enter(&so->so_lock);
2969 ASSERT(so_verify_oobstate(so));
2970 dprintso(so, 1,
2973 sti->sti_oobcnt, pr_state(so->so_state, so->so_mode)));
2976 so->so_state &= ~(SS_OOBPEND|SS_HAVEOOBDATA|SS_RCVATMARK);
2977 freemsg(so->so_oobmsg);
2978 so->so_oobmsg = NULL;
2980 ASSERT(so_verify_oobstate(so));
2981 mutex_exit(&so->so_lock);
2985 * Handle recv* calls for an so which has NL7C saved recv mblk_t(s).
2988 nl7c_sorecv(struct sonode *so, mblk_t **rmp, uio_t *uiop, rval_t *rp)
2990 sotpi_info_t *sti = SOTOTPI(so);
3038 /* Last mblk_t so return the saved kstrgetmsg() rval/error */
3048 /* More mblk_t(s) to process so no rval to return */
3064 sotpi_recvmsg(struct sonode *so, struct nmsghdr *msg, struct uio *uiop,
3074 int so_state = so->so_state; /* Snapshot */
3080 sotpi_info_t *sti = SOTOTPI(so);
3085 dprintso(so, 1, ("sotpi_recvmsg(%p, %p, 0x%x) state %s err %d\n",
3086 (void *)so, (void *)msg, flags,
3087 pr_state(so->so_state, so->so_mode), so->so_error));
3089 if (so->so_version == SOV_STREAM) {
3090 so_update_attrs(so, SOACC);
3092 return (strread(SOTOV(so), uiop, cr));
3106 (so->so_mode & SM_CONNREQUIRED)) {
3119 if (!(so->so_mode & SM_EXDATA))
3121 so_update_attrs(so, SOACC);
3122 return (sorecvoob(so, msg, uiop, flags,
3123 (so->so_options & SO_OOBINLINE)));
3126 so_update_attrs(so, SOACC);
3137 dprintso(so, 1, ("sotpi_recvmsg: namelen %d controllen %d\n",
3140 mutex_enter(&so->so_lock);
3148 nl7c_close(so);
3153 mutex_exit(&so->so_lock);
3159 ret = nl7c_process(so,
3160 (so->so_state & (SS_NONBLOCK|SS_NDELAY)));
3165 mutex_exit(&so->so_lock);
3174 mutex_exit(&so->so_lock);
3185 * Not persistent so no further NL7C processing.
3208 error = so_lock_read_intr(so,
3210 mutex_exit(&so->so_lock);
3229 if (so->so_mode & SM_ATOMIC)
3234 else if (so->so_rcvtimeo != 0)
3235 timout = TICK_TO_MSEC(so->so_rcvtimeo);
3245 error = nl7c_sorecv(so, &mp, uiop, &rval);
3247 error = kstrgetmsg(SOTOV(so), &mp, uiop, &pri, &pflag,
3261 if ((rval.r_val1 & MOREDATA) && (so->so_mode & SM_ATOMIC))
3265 dprintso(so, 1, ("sotpi_recvmsg: got M_DATA\n"));
3271 if ((so->so_state &
3275 sorecv_update_oobstate(so);
3278 mutex_enter(&so->so_lock);
3281 if (so->so_state & SS_SAVEDEOR) {
3283 so->so_state &= ~SS_SAVEDEOR;
3292 mutex_exit(&so->so_lock);
3301 dprintso(so, 1, ("sotpi_recvmsg: type %d\n", tpr->type));
3305 if ((so->so_state &
3309 sorecv_update_oobstate(so);
3316 mutex_enter(&so->so_lock);
3317 so->so_state &= ~SS_SAVEDEOR;
3322 so->so_state |= SS_SAVEDEOR;
3331 mutex_exit(&so->so_lock);
3344 if ((so->so_state &
3348 sorecv_update_oobstate(so);
3360 eprintsoline(so, error);
3363 if (so->so_family == AF_UNIX) {
3389 eprintsoline(so, error);
3392 if (so->so_family == AF_UNIX)
3436 eprintsoline(so, error);
3451 if ((so->so_state &
3455 sorecv_update_oobstate(so);
3472 eprintsoline(so, error);
3500 eprintsoline(so, error);
3511 mutex_enter(&so->so_lock);
3512 so->so_state &= ~SS_SAVEDEOR;
3517 so->so_state |= SS_SAVEDEOR;
3528 mutex_exit(&so->so_lock);
3535 dprintso(so, 1,
3540 pr_state(so->so_state, so->so_mode)));
3542 * kstrgetmsg handles MSGMARK so there is nothing to
3565 dprintso(so, 1,
3570 pr_state(so->so_state, so->so_mode)));
3573 if (so->so_mode & SM_ATOMIC)
3579 error = kstrgetmsg(SOTOV(so), &mp, uiop,
3586 eprintsoline(so, error);
3606 mutex_enter(&so->so_lock);
3607 ASSERT(so_verify_oobstate(so));
3621 so->so_state |= SS_RCVATMARK;
3622 mutex_exit(&so->so_lock);
3623 dprintso(so, 1,
3626 pr_state(so->so_state, so->so_mode)));
3631 cmn_err(CE_CONT, "sotpi_recvmsg: so %p prim %d mp %p\n",
3632 (void *)so, tpr->type, (void *)mp);
3636 eprintsoline(so, error);
3641 mutex_enter(&so->so_lock);
3643 so_unlock_read(so); /* Clear SOREADLOCKED */
3644 mutex_exit(&so->so_lock);
3653 sosend_dgramcmsg(struct sonode *so, struct sockaddr *name, socklen_t namelen,
3670 sotpi_info_t *sti = SOTOTPI(so);
3690 error = so_addr_verify(so, name, namelen);
3692 eprintsoline(so, error);
3695 if (so->so_family == AF_UNIX) {
3718 dprintso(so, 1,
3721 error = so_ux_addr_xlate(so, name, namelen,
3725 eprintsoline(so, error);
3758 if (!(so->so_mode & SM_FDPASSING))
3821 audit_sock(T_UNITDATA_REQ, strvp2wq(SOTOV(so)), mp, 0);
3823 error = kstrputmsg(SOTOV(so), mp, uiop, len, 0, MSG_BAND, 0);
3826 eprintsoline(so, error);
3837 sosend_svccmsg(struct sonode *so, struct uio *uiop, int more, void *control,
3850 sotpi_info_t *sti = SOTOTPI(so);
3852 dprintso(so, 1,
3862 if (!(so->so_mode & SM_OPTDATA))
3884 dprintso(so, 1, ("sosend_svccmsg: sending %d, %ld bytes\n",
3900 if (!(so->so_mode & SM_FDPASSING))
3947 error = kstrputmsg(SOTOV(so), mp, uiop, iosize,
3950 eprintsoline(so, error);
3960 if (so->so_state & SS_CANTSENDMORE) {
3961 eprintsoline(so, error);
3964 if (so->so_error != 0) {
3965 mutex_enter(&so->so_lock);
3966 error = sogeterr(so, B_TRUE);
3967 mutex_exit(&so->so_lock);
3969 eprintsoline(so, error);
3986 sosend_dgram(struct sonode *so, struct sockaddr *name, socklen_t namelen,
3997 sotpi_info_t *sti = SOTOTPI(so);
4008 error = so_addr_verify(so, name, namelen);
4013 return (sodgram_direct(so, name, namelen, uiop, flags));
4015 if (so->so_family == AF_UNIX) {
4038 dprintso(so, 1,
4041 error = so_ux_addr_xlate(so, name, namelen,
4045 eprintsoline(so, error);
4109 audit_sock(T_UNITDATA_REQ, strvp2wq(SOTOV(so)), mp, 0);
4111 error = kstrputmsg(SOTOV(so), mp, uiop, len, 0, MSG_BAND, 0);
4115 eprintsoline(so, error);
4126 sosend_svc(struct sonode *so, struct uio *uiop, t_scalar_t prim, int more,
4133 sotpi_info_t *sti = SOTOTPI(so);
4135 dprintso(so, 1,
4137 (void *)so, uiop->uio_resid, prim, sflag));
4164 dprintso(so, 1, ("sosend_svc: sending 0x%x %d, %ld bytes\n",
4175 error = kstrputmsg(SOTOV(so), mp, uiop, iosize,
4178 eprintsoline(so, error);
4187 if (so->so_state & SS_CANTSENDMORE) {
4188 eprintsoline(so, error);
4191 if (so->so_error != 0) {
4192 mutex_enter(&so->so_lock);
4193 error = sogeterr(so, B_TRUE);
4194 mutex_exit(&so->so_lock);
4196 eprintsoline(so, error);
4213 sotpi_sendmsg(struct sonode *so, struct nmsghdr *msg, struct uio *uiop,
4223 sotpi_info_t *sti = SOTOTPI(so);
4225 dprintso(so, 1, ("sotpi_sendmsg(%p, %p, 0x%x) state %s, error %d\n",
4226 (void *)so, (void *)msg, msg->msg_flags,
4227 pr_state(so->so_state, so->so_mode), so->so_error));
4229 if (so->so_version == SOV_STREAM) {
4231 so_update_attrs(so, SOMOD);
4232 return (strwrite(SOTOV(so), uiop, cr));
4235 mutex_enter(&so->so_lock);
4236 so_state = so->so_state;
4239 mutex_exit(&so->so_lock);
4243 if (so->so_error != 0) {
4244 error = sogeterr(so, B_TRUE);
4246 mutex_exit(&so->so_lock);
4254 so_mode = so->so_mode;
4258 mutex_exit(&so->so_lock);
4283 mutex_exit(&so->so_lock);
4296 mutex_exit(&so->so_lock);
4300 so_lock_single(so); /* Set SOLOCKED */
4301 error = sotpi_bind(so, NULL, 0,
4303 so_unlock_single(so, SOLOCKED);
4305 mutex_exit(&so->so_lock);
4306 eprintsoline(so, error);
4333 switch (so->so_family) {
4369 mutex_exit(&so->so_lock);
4371 dprintso(so, 0,
4374 pr_addr(so->so_family, name, namelen)));
4382 mutex_exit(&so->so_lock);
4386 if ((flags & MSG_DONTROUTE) && !(so->so_options & SO_DONTROUTE)) {
4390 error = sotpi_setsockopt(so, SOL_SOCKET, SO_DONTROUTE,
4403 so_update_attrs(so, SOMOD);
4404 error = sosend_dgramcmsg(so, name, namelen, uiop,
4412 so_update_attrs(so, SOMOD);
4413 error = sosend_svccmsg(so, uiop,
4421 so_update_attrs(so, SOMOD);
4428 return (sosend_dgram(so, name, namelen, uiop, flags));
4430 error = sosend_dgram(so, name, namelen, uiop, flags);
4446 dprintso(so, 1, ("sotpi_sendmsg: write\n"));
4450 (error = nl7c_data(so, uiop)) >= 0) {
4460 canputnext(SOTOV(so)->v_stream->sd_wrq)) {
4461 return (sostream_direct(so, uiop,
4464 error = strwrite(SOTOV(so), uiop, cr);
4475 return (sosend_svc(so, uiop, prim,
4477 error = sosend_svc(so, uiop, prim,
4486 (void) sotpi_setsockopt(so, SOL_SOCKET, SO_DONTROUTE,
4513 struct sonode *so;
4519 so = VTOSO(vp);
4520 direct = _SOTOTPI(so)->sti_direct;
4524 * not be accurate so we don't grab the sd_lock here. If
4531 return (sostream_direct(so, NULL, mp, CRED()));
4586 sotpi_sendmblk(struct sonode *so, struct nmsghdr *msg, int fflag,
4591 switch (so->so_family) {
4601 if (so->so_state & SS_CANTSENDMORE)
4604 if (so->so_type != SOCK_STREAM)
4607 if ((so->so_state & SS_ISCONNECTED) == 0)
4610 error = kstrwritemp(so->so_vnode, *mpp, fflag);
4622 sodgram_direct(struct sonode *so, struct sockaddr *name,
4631 struct stdata *stp = SOTOV(so)->v_stream;
4636 sotpi_info_t *sti = SOTOTPI(so);
4640 ASSERT(!(so->so_mode & SM_CONNREQUIRED));
4641 ASSERT(!(so->so_mode & SM_EXDATA));
4642 ASSERT(so->so_family == AF_INET || so->so_family == AF_INET6);
4643 ASSERT(SOTOV(so)->v_type == VSOCK);
4650 ASSERT(name->sa_family == so->so_family);
4651 ASSERT(so->so_family == AF_INET ||
4653 ASSERT(so->so_family == AF_INET6 ||
4663 so_state = so->so_state;
4703 audit_sock(T_UNITDATA_REQ, strvp2wq(SOTOV(so)), mp, 0);
4720 return (strwrite(SOTOV(so), uiop, CRED()));
4723 audit_sock(T_UNITDATA_REQ, strvp2wq(SOTOV(so)), mp, 0);
4725 error = kstrputmsg(SOTOV(so), mp, uiop, len, 0, MSG_BAND, 0);
4729 eprintsoline(so, error);
4736 sostream_direct(struct sonode *so, struct uio *uiop, mblk_t *mp, cred_t *cr)
4738 struct stdata *stp = SOTOV(so)->v_stream;
4744 ASSERT(so->so_mode & SM_BYTESTREAM);
4745 ASSERT(SOTOV(so)->v_type == VSOCK);
4760 newmp = (stp->sd_wputdatafunc)(SOTOV(so), mp, NULL,
4774 return (strwrite(SOTOV(so), uiop, cr));
4811 newmp = (stp->sd_wputdatafunc)(SOTOV(so), mp, NULL,
4836 * written so far back to the app. This is the
4842 return (strwrite_common(SOTOV(so), uiop, cr, wflag));
4853 sotpi_getpeername(struct sonode *so, struct sockaddr *name, socklen_t *namelen,
4861 sotpi_info_t *sti = SOTOTPI(so);
4863 dprintso(so, 1, ("sotpi_getpeername(%p) %s\n",
4864 (void *)so, pr_state(so->so_state, so->so_mode)));
4867 mutex_enter(&so->so_lock);
4868 so_lock_single(so); /* Set SOLOCKED */
4877 if (!(so->so_state & SS_ISCONNECTED)) {
4882 if ((so->so_state & SS_CANTSENDMORE) && !xnet_skip_checks) {
4898 dprintso(so, 1, ("sotpi_getpeername (local): %s\n",
4899 pr_addr(so->so_family, sti->sti_faddr_sa,
4903 if (so->so_family == AF_UNIX) {
4911 ASSERT(so->so_family != AF_UNIX && sti->sti_faddr_noxlate == 0);
4916 mutex_exit(&so->so_lock);
4921 * Put the result in sti_faddr_sa so that getpeername works after
4933 error = strioctl(SOTOV(so), TI_GETPEERNAME, (intptr_t)&strbuf,
4937 mutex_enter(&so->so_lock);
4964 (so->so_state & SS_ISCONNECTED)) {
4975 dprintso(so, 1, ("sotpi_getpeername (tp): %s\n",
4976 pr_addr(so->so_family, sti->sti_faddr_sa,
4980 so_unlock_single(so, SOLOCKED);
4981 mutex_exit(&so->so_lock);
4989 sotpi_getsockname(struct sonode *so, struct sockaddr *name, socklen_t *namelen,
4997 sotpi_info_t *sti = SOTOTPI(so);
4999 dprintso(so, 1, ("sotpi_getsockname(%p) %s\n",
5000 (void *)so, pr_state(so->so_state, so->so_mode)));
5003 mutex_enter(&so->so_lock);
5004 so_lock_single(so); /* Set SOLOCKED */
5008 dprintso(so, 1, ("sotpi_getsockname (local): %s\n",
5009 pr_addr(so->so_family, sti->sti_laddr_sa,
5019 if (so->so_family == AF_UNIX) {
5033 if (!(so->so_state & SS_ISBOUND)) {
5041 mutex_exit(&so->so_lock);
5046 * Put the result in sti_laddr_sa so that getsockname works after
5058 error = strioctl(SOTOV(so), TI_GETMYNAME, (intptr_t)&strbuf,
5062 mutex_enter(&so->so_lock);
5086 (so->so_state & SS_ISBOUND)) {
5097 dprintso(so, 1, ("sotpi_getsockname (tp): %s\n",
5098 pr_addr(so->so_family, sti->sti_laddr_sa,
5102 so_unlock_single(so, SOLOCKED);
5103 mutex_exit(&so->so_lock);
5116 sotpi_getsockopt(struct sonode *so, int level, int option_name,
5133 dprintso(so, 1, ("sotpi_getsockopt(%p, 0x%x, 0x%x, %p, %p) %s\n",
5134 (void *)so, level, option_name, optval, (void *)optlenp,
5135 pr_state(so->so_state, so->so_mode)));
5137 mutex_enter(&so->so_lock);
5138 so_lock_single(so); /* Set SOLOCKED */
5169 eprintsoline(so, error);
5179 eprintsoline(so, error);
5185 eprintsoline(so, error);
5194 eprintsoline(so, error);
5202 eprintsoline(so, error);
5212 value = so->so_type;
5217 value = sogeterr(so, B_TRUE);
5222 if (so->so_state & SS_ACCEPTCONN)
5228 dprintso(so, 1,
5232 dprintso(so, 1,
5248 value = (so->so_options & option_name);
5251 dprintso(so, 1,
5255 dprintso(so, 1,
5268 option = &so->so_linger;
5280 lvalue = so->so_sndbuf;
5282 mutex_exit(&so->so_lock);
5283 (void) strqget(strvp2wq(SOTOV(so))->q_next,
5285 mutex_enter(&so->so_lock);
5286 dprintso(so, 1,
5291 len = (t_uscalar_t)sizeof (so->so_sndbuf);
5310 lvalue = so->so_rcvbuf;
5312 mutex_exit(&so->so_lock);
5313 (void) strqget(RD(strvp2wq(SOTOV(so))),
5315 mutex_enter(&so->so_lock);
5316 dprintso(so, 1,
5325 len = (t_uscalar_t)sizeof (so->so_rcvbuf);
5329 value = so->so_family;
5339 value = so->so_sndlowat;
5343 value = so->so_rcvlowat;
5352 val = drv_hztousec(so->so_rcvtimeo);
5354 val = drv_hztousec(so->so_sndtimeo);
5370 (so->so_proto_props).sopp_wroff;
5372 (so->so_proto_props).sopp_maxblk;
5374 (so->so_proto_props).sopp_maxpsz;
5376 (so->so_proto_props).sopp_tail;
5384 mutex_exit(&so->so_lock);
5399 error = kstrputmsg(SOTOV(so), mp, NULL, 0, 0,
5402 mutex_enter(&so->so_lock);
5404 eprintsoline(so, error);
5407 error = sowaitprim(so, T_SVR4_OPTMGMT_REQ, T_OPTMGMT_ACK,
5415 eprintsoline(so, error);
5429 eprintsoline(so, error);
5443 eprintsoline(so, error);
5457 so_unlock_single(so, SOLOCKED);
5458 mutex_exit(&so->so_lock);
5471 sotpi_setsockopt(struct sonode *so, int level, int option_name,
5480 dprintso(so, 1, ("sotpi_setsockopt(%p, 0x%x, 0x%x, %p, %d) %s\n",
5481 (void *)so, level, option_name, optval, optlen,
5482 pr_state(so->so_state, so->so_mode)));
5485 if ((so->so_state & SS_CANTSENDMORE) && !xnet_skip_checks) {
5491 mutex_enter(&so->so_lock);
5492 so_lock_single(so); /* Set SOLOCKED */
5493 mutex_exit(&so->so_lock);
5507 error = kstrputmsg(SOTOV(so), mp, NULL, 0, 0,
5510 mutex_enter(&so->so_lock);
5512 eprintsoline(so, error);
5515 error = sowaitprim(so, T_SVR4_OPTMGMT_REQ, T_OPTMGMT_ACK,
5518 eprintsoline(so, error);
5550 eprintsoline(so, error);
5562 eprintsoline(so, error);
5568 eprintsoline(so, error);
5578 eprintsoline(so, error);
5598 so->so_linger.l_linger = l->l_linger;
5600 so->so_linger.l_onoff = SO_LINGER;
5601 so->so_options |= SO_LINGER;
5603 so->so_linger.l_onoff = 0;
5604 so->so_options &= ~SO_LINGER;
5630 dprintso(so, 1,
5633 so->so_options |= option_name;
5635 dprintso(so, 1,
5638 so->so_options &= ~option_name;
5649 so->so_sndbuf = intvalue;
5652 so->so_rcvbuf = intvalue;
5655 so->so_rcv_timer_interval = intvalue;
5663 so->so_sndlowat = intvalue;
5666 so->so_rcvlowat = intvalue;
5683 so->so_rcvtimeo = drv_usectohz(val);
5685 so->so_sndtimeo = drv_usectohz(val);
5694 dprintso(so, 1,
5702 so_unlock_single(so, SOLOCKED);
5703 mutex_exit(&so->so_lock);
5712 sotpi_close(struct sonode *so, int flag, struct cred *cr)
5714 struct vnode *vp = SOTOV(so);
5717 sotpi_info_t *sti = SOTOTPI(so);
5719 dprintso(so, 1, ("sotpi_close(%p, %x) %s\n",
5720 (void *)vp, flag, pr_state(so->so_state, so->so_mode)));
5726 mutex_enter(&so->so_lock);
5727 so_lock_single(so); /* Set SOLOCKED */
5729 ASSERT(so_verify_oobstate(so));
5733 nl7c_close(so);
5739 if (so->so_family == AF_UNIX) {
5741 so_unix_close(so);
5744 mutex_exit(&so->so_lock);
5758 mutex_enter(&so->so_lock);
5764 so_flush_discon_ind(so);
5766 so_unlock_single(so, SOLOCKED);
5767 mutex_exit(&so->so_lock);
5775 if (so->so_flag & SOCLONE)
5782 sotpi_ioctl(struct sonode *so, int cmd, intptr_t arg, int mode,
5785 struct vnode *vp = SOTOV(so);
5786 sotpi_info_t *sti = SOTOTPI(so);
5789 dprintso(so, 0, ("sotpi_ioctl: cmd 0x%x, arg 0x%lx, state %s\n",
5790 cmd, arg, pr_state(so->so_state, so->so_mode)));
5802 * on sockets, and doing so would increase the complexity
5824 if (so->so_version != SOV_STREAM)
5833 ASSERT(so->so_version != SOV_STREAM);
5846 mutex_enter(&so->so_lock);
5848 so->so_state |= SS_NDELAY;
5850 so->so_state &= ~SS_NDELAY;
5852 mutex_exit(&so->so_lock);
5863 mutex_enter(&so->so_lock);
5866 * (!value != !(so->so_state & SS_ASYNC))
5869 if (value == 0 && (so->so_state & SS_ASYNC) != 0 ||
5870 value != 0 && (so->so_state & SS_ASYNC) == 0)
5871 error = so_flip_async(so, vp, mode, cr);
5872 mutex_exit(&so->so_lock);
5884 mutex_enter(&so->so_lock);
5885 dprintso(so, 1, ("setown: new %d old %d\n", pgrp, so->so_pgrp));
5887 if (pgrp != so->so_pgrp)
5888 error = so_set_siggrp(so, vp, pgrp, mode, cr);
5889 mutex_exit(&so->so_lock);
5894 if (so_copyout(&so->so_pgrp, (void *)arg,
5913 mutex_enter(&so->so_lock);
5914 so_state = so->so_state;
5915 mutex_exit(&so->so_lock);
5930 * STRNOTATMARK flag is used so that the
5977 mutex_enter(&so->so_lock);
5978 if ((so->so_mode & SM_CONNREQUIRED) == 0) {
5980 } else if ((so->so_state & SS_ISCONNECTED) == 0) {
5982 } else if (so->so_peercred != NULL) {
5984 kp->pc_cr = so->so_peercred;
5985 kp->pc_cpid = so->so_cpid;
5986 crhold(so->so_peercred);
5990 mutex_exit(&so->so_lock);
5999 so->so_version == SOV_SOCKBSD) {
6019 struct sonode *so = VTOSO(vp);
6022 sotpi_info_t *sti = SOTOTPI(so);
6026 if (so->so_version == SOV_SOCKBSD)
6029 if (so->so_version == SOV_STREAM) {
6039 dprintso(so, 0, ("socktpi_ioctl: going to "
6041 so_stream2sock(so);
6051 mutex_enter(&so->so_lock);
6052 so_lock_single(so);
6053 mutex_exit(&so->so_lock);
6058 mutex_enter(&so->so_lock);
6061 so_unlock_single(so, SOLOCKED);
6062 mutex_exit(&so->so_lock);
6076 dprintso(so, 0,
6078 return (so_sock2stream(so));
6214 struct sonode *so,
6221 struct vnode *vp = SOTOV(so);
6223 int so_state = so->so_state; /* snapshot */
6224 sotpi_info_t *sti = SOTOTPI(so);
6226 dprintso(so, 0, ("socktpi_poll(%p): state %s err %d\n",
6227 (void *)vp, pr_state(so_state, so->so_mode), so->so_error));
6232 if (so->so_version == SOV_STREAM) {
6239 (so->so_mode & SM_CONNREQUIRED)) {
6248 if (so->so_error != 0 &&
6293 * may have already returned EWOULDBLOCK, so not be waiting to
6310 if (so->so_state & SS_CANTRCVMORE) {
6313 if (so->so_state & SS_CANTSENDMORE)
6317 if (so->so_state & SS_OOBPEND)
6370 struct sonode *so = (struct sonode *)buf;
6371 sotpi_info_t *sti = SOTOTPI(so);
6378 SOTOTPI(sti->sti_next_so)->sti_prev_so = so;
6379 socklist.sl_list = so;
6390 struct sonode *so = (struct sonode *)buf;
6391 sotpi_info_t *sti = SOTOTPI(so);
6411 * Create sonode caches. We create a special one for AF_UNIX so
6431 sotpi_convert_sonode(struct sonode *so, struct sockparams *newsp,
6435 struct sockparams *origsp = so->so_sockparams;
6436 sock_lower_handle_t handle = so->so_proto_handle;
6442 ASSERT((so->so_state & (SS_FALLBACK_PENDING|SS_FALLBACK_COMP)) ==
6444 ASSERT(SOCK_IS_NONSTR(so));
6448 so->so_sockparams = newsp;
6452 (void) sotpi_info_create(so, KM_SLEEP);
6453 sotpi_info_init(so);
6455 if ((error = sotpi_init(so, NULL, cr, SO_FALLBACK)) != 0) {
6456 sotpi_info_fini(so);
6457 sotpi_info_destroy(so);
6460 ASSERT(handle == so->so_proto_handle);
6461 sti = SOTOTPI(so);
6466 * Keep the original sp around so we can properly dispose of the
6471 so_basic_strinit(so); /* skips the T_CAPABILITY_REQ */
6472 so_alloc_addr(so, so->so_max_addr_len);
6484 if (so->so_pgrp != 0) {
6485 if (so_set_events(so, so->so_vnode, cr) != 0)
6486 so->so_pgrp = 0;
6492 vp = SOTOV(so);
6506 so->so_not_str = B_FALSE;
6516 sotpi_revert_sonode(struct sonode *so, struct cred *cr)
6518 vnode_t *vp = SOTOV(so);
6520 ASSERT((so->so_state & (SS_FALLBACK_PENDING|SS_FALLBACK_COMP)) ==
6522 ASSERT(!SOCK_IS_NONSTR(so));
6532 so->so_sockparams = SOTOTPI(so)->sti_orig_sp;
6534 sotpi_info_fini(so);
6535 sotpi_info_destroy(so);
6538 so->so_not_str = B_TRUE;
6542 sotpi_update_state(struct sonode *so, struct T_capability_ack *tcap,
6546 sotpi_info_t *sti = SOTOTPI(so);
6548 so_proc_tcapability_ack(so, tcap);
6550 so->so_options |= opts;
6559 sti->sti_laddr_valid = (so->so_state & SS_ISBOUND);
6566 sti->sti_faddr_valid = (so->so_state & SS_ISCONNECTED);
6575 so_alloc_addr(struct sonode *so, t_uscalar_t maxlen)
6577 sotpi_info_t *sti = SOTOTPI(so);
6583 so->so_max_addr_len = sti->sti_laddr_maxlen;
6588 if (so->so_family == AF_UNIX) {
6599 sotpi_sototpi(struct sonode *so)
6603 ASSERT(so != NULL);
6605 sti = (sotpi_info_t *)so->so_priv;
6665 sotpi_info_create(struct sonode *so, int kmflags)
6669 ASSERT(so->so_priv == NULL);
6679 so->so_priv = (void *)sti;
6687 sotpi_info_init(struct sonode *so)
6689 struct vnode *vp = SOTOV(so);
6690 sotpi_info_t *sti = SOTOTPI(so);
6693 sti->sti_dev = so->so_sockparams->sp_sdev_info.sd_vnode->v_rdev;
6738 sotpi_info_fini(struct sonode *so)
6740 sotpi_info_t *sti = SOTOTPI(so);
6758 * Protect so->so_[lf]addr_sa so that sockfs_snapshot() can safely
6761 mutex_enter(&so->so_lock);
6776 mutex_exit(&so->so_lock);
6795 nl7c_urifree(so);
6813 sotpi_info_destroy(struct sonode *so)
6815 sotpi_info_t *sti = SOTOTPI(so);
6820 so->so_priv = NULL;
6835 * Initialize the smod_refcnt to 1 so it will never be freed.