Lines Matching full:so

225  * pointer is an invariant, so no lock is required to dereference the so_pcb
298 static void unp_dispose(struct socket *so);
427 uipc_lock_peer(struct socket *so, struct unpcb **unp2) in uipc_lock_peer() argument
432 unp = sotounpcb(so); in uipc_lock_peer()
435 if (__predict_false(so->so_error != 0)) { in uipc_lock_peer()
436 error = so->so_error; in uipc_lock_peer()
437 so->so_error = 0; in uipc_lock_peer()
449 error = so->so_state & SS_ISDISCONNECTED ? EPIPE : ENOTCONN; in uipc_lock_peer()
459 uipc_abort(struct socket *so) in uipc_abort() argument
463 unp = sotounpcb(so); in uipc_abort()
478 uipc_attach(struct socket *so, int proto, struct thread *td) in uipc_attach() argument
485 KASSERT(so->so_pcb == NULL, ("uipc_attach: so_pcb != NULL")); in uipc_attach()
486 switch (so->so_type) { in uipc_attach()
488 STAILQ_INIT(&so->so_rcv.uxdg_mb); in uipc_attach()
489 STAILQ_INIT(&so->so_snd.uxdg_mb); in uipc_attach()
490 TAILQ_INIT(&so->so_rcv.uxdg_conns); in uipc_attach()
514 mtx_destroy(&so->so_rcv_mtx); in uipc_attach()
515 mtx_init(&so->so_rcv_mtx, "so_rcv", NULL, MTX_DEF | MTX_DUPOK); in uipc_attach()
516 knlist_init(&so->so_wrsel.si_note, so, uipc_wrknl_lock, in uipc_attach()
518 STAILQ_INIT(&so->so_rcv.uxst_mbq); in uipc_attach()
523 error = soreserve(so, sendspace, recvspace); in uipc_attach()
531 unp->unp_socket = so; in uipc_attach()
532 so->so_pcb = unp; in uipc_attach()
542 switch (so->so_type) { in uipc_attach()
566 uipc_bindat(int fd, struct socket *so, struct sockaddr *nam, struct thread *td) in uipc_bindat() argument
582 unp = sotounpcb(so); in uipc_bindat()
593 * socket, so flag in-progress operations, and return an error if an in uipc_bindat()
596 * Historically, we have not allowed a socket to be rebound, so this in uipc_bindat()
694 uipc_bind(struct socket *so, struct sockaddr *nam, struct thread *td) in uipc_bind() argument
697 return (uipc_bindat(AT_FDCWD, so, nam, td)); in uipc_bind()
701 uipc_connect(struct socket *so, struct sockaddr *nam, struct thread *td) in uipc_connect() argument
706 error = unp_connect(so, nam, td); in uipc_connect()
711 uipc_connectat(int fd, struct socket *so, struct sockaddr *nam, in uipc_connectat() argument
717 error = unp_connectat(fd, so, nam, td, false); in uipc_connectat()
722 uipc_close(struct socket *so) in uipc_close() argument
728 unp = sotounpcb(so); in uipc_close()
756 uipc_chmod(struct socket *so, mode_t mode, struct ucred *cred __unused, in uipc_chmod() argument
766 unp = sotounpcb(so); in uipc_chmod()
796 uipc_detach(struct socket *so) in uipc_detach() argument
803 unp = sotounpcb(so); in uipc_detach()
809 if (!SOLISTENING(so)) in uipc_detach()
810 unp_dispose(so); in uipc_detach()
871 switch (so->so_type) { in uipc_detach()
874 MPASS(SOLISTENING(so) || (STAILQ_EMPTY(&so->so_rcv.uxst_mbq) && in uipc_detach()
875 so->so_rcv.uxst_peer == NULL)); in uipc_detach()
882 MPASS(so->so_rcv.uxdg_peeked == NULL); in uipc_detach()
883 MPASS(STAILQ_EMPTY(&so->so_rcv.uxdg_mb)); in uipc_detach()
884 MPASS(TAILQ_EMPTY(&so->so_rcv.uxdg_conns)); in uipc_detach()
885 MPASS(STAILQ_EMPTY(&so->so_snd.uxdg_mb)); in uipc_detach()
890 uipc_disconnect(struct socket *so) in uipc_disconnect() argument
894 unp = sotounpcb(so); in uipc_disconnect()
906 uipc_listen(struct socket *so, int backlog, struct thread *td) in uipc_listen() argument
911 MPASS(so->so_type != SOCK_DGRAM); in uipc_listen()
917 unp = sotounpcb(so); in uipc_listen()
928 SOCK_LOCK(so); in uipc_listen()
929 error = solisten_proto_check(so); in uipc_listen()
932 if (!SOLISTENING(so)) { in uipc_listen()
933 (void)chgsbsize(so->so_cred->cr_uidinfo, in uipc_listen()
934 &so->so_snd.sb_hiwat, 0, RLIM_INFINITY); in uipc_listen()
935 (void)chgsbsize(so->so_cred->cr_uidinfo, in uipc_listen()
936 &so->so_rcv.sb_hiwat, 0, RLIM_INFINITY); in uipc_listen()
938 solisten_proto(so, backlog); in uipc_listen()
940 SOCK_UNLOCK(so); in uipc_listen()
946 uipc_peeraddr(struct socket *so, struct sockaddr *ret) in uipc_peeraddr() argument
951 unp = sotounpcb(so); in uipc_peeraddr()
974 * function will condition the mbuf so that it can be safely put onto socket
1073 uipc_sosend_stream_or_seqpacket(struct socket *so, struct sockaddr *addr, in uipc_sosend_stream_or_seqpacket() argument
1092 nonblock = (so->so_state & SS_NBIO) || in uipc_sosend_stream_or_seqpacket()
1121 if (__predict_false(so->so_snd.sb_flags & SB_AIO_RUNNING)) { in uipc_sosend_stream_or_seqpacket()
1134 error = mc_uiotomc(&mc, uio, so->so_snd.sb_hiwat, 0, M_WAITOK, in uipc_sosend_stream_or_seqpacket()
1141 error = SOCK_IO_SEND_LOCK(so, SBLOCKWAIT(flags)); in uipc_sosend_stream_or_seqpacket()
1145 if (__predict_false((error = uipc_lock_peer(so, &unp2)) != 0)) in uipc_sosend_stream_or_seqpacket()
1160 * receive buffer. Put a reference on the peer socket, so that it in uipc_sosend_stream_or_seqpacket()
1198 SOCK_SENDBUF_LOCK(so); in uipc_sosend_stream_or_seqpacket()
1199 so->so_snd.sb_ccc = in uipc_sosend_stream_or_seqpacket()
1200 so->so_snd.sb_hiwat - space; in uipc_sosend_stream_or_seqpacket()
1201 SOCK_SENDBUF_UNLOCK(so); in uipc_sosend_stream_or_seqpacket()
1273 atomic_load_int(&so->so_snd.sb_hiwat), 0, M_WAITOK, in uipc_sosend_stream_or_seqpacket()
1287 SOCK_IO_SEND_UNLOCK(so); in uipc_sosend_stream_or_seqpacket()
1306 * @param so Points to a connected stream socket with receive buffer locked
1314 uipc_wakeup_writer(struct socket *so) in uipc_wakeup_writer() argument
1316 struct sockbuf *sb = &so->so_rcv; in uipc_wakeup_writer()
1319 SOCK_RECVBUF_LOCK_ASSERT(so); in uipc_wakeup_writer()
1337 SOCK_RECVBUF_UNLOCK(so); in uipc_wakeup_writer()
1341 uipc_cantrcvmore(struct socket *so) in uipc_cantrcvmore() argument
1344 SOCK_RECVBUF_LOCK(so); in uipc_cantrcvmore()
1345 so->so_rcv.sb_state |= SBS_CANTRCVMORE; in uipc_cantrcvmore()
1346 selwakeuppri(&so->so_rdsel, PSOCK); in uipc_cantrcvmore()
1347 KNOTE_LOCKED(&so->so_rdsel.si_note, 0); in uipc_cantrcvmore()
1348 if (so->so_rcv.uxst_peer != NULL) in uipc_cantrcvmore()
1349 uipc_wakeup_writer(so); in uipc_cantrcvmore()
1351 SOCK_RECVBUF_UNLOCK(so); in uipc_cantrcvmore()
1355 uipc_soreceive_stream_or_seqpacket(struct socket *so, struct sockaddr **psa, in uipc_soreceive_stream_or_seqpacket() argument
1358 struct sockbuf *sb = &so->so_rcv; in uipc_soreceive_stream_or_seqpacket()
1372 nonblock = (so->so_state & SS_NBIO) || in uipc_soreceive_stream_or_seqpacket()
1385 if (__predict_false((atomic_load_short(&so->so_state) & in uipc_soreceive_stream_or_seqpacket()
1389 error = SOCK_IO_RECV_LOCK(so, SBLOCKWAIT(flags)); in uipc_soreceive_stream_or_seqpacket()
1394 SOCK_RECVBUF_LOCK(so); in uipc_soreceive_stream_or_seqpacket()
1398 if (so->so_error) { in uipc_soreceive_stream_or_seqpacket()
1399 error = so->so_error; in uipc_soreceive_stream_or_seqpacket()
1401 so->so_error = 0; in uipc_soreceive_stream_or_seqpacket()
1402 SOCK_RECVBUF_UNLOCK(so); in uipc_soreceive_stream_or_seqpacket()
1403 SOCK_IO_RECV_UNLOCK(so); in uipc_soreceive_stream_or_seqpacket()
1407 SOCK_RECVBUF_UNLOCK(so); in uipc_soreceive_stream_or_seqpacket()
1408 SOCK_IO_RECV_UNLOCK(so); in uipc_soreceive_stream_or_seqpacket()
1412 SOCK_RECVBUF_UNLOCK(so); in uipc_soreceive_stream_or_seqpacket()
1413 SOCK_IO_RECV_UNLOCK(so); in uipc_soreceive_stream_or_seqpacket()
1416 error = sbwait(so, SO_RCV); in uipc_soreceive_stream_or_seqpacket()
1418 SOCK_RECVBUF_UNLOCK(so); in uipc_soreceive_stream_or_seqpacket()
1419 SOCK_IO_RECV_UNLOCK(so); in uipc_soreceive_stream_or_seqpacket()
1505 uipc_wakeup_writer(so); in uipc_soreceive_stream_or_seqpacket()
1512 if (aio && uipc_lock_peer(so, &unp2) == 0) { in uipc_soreceive_stream_or_seqpacket()
1522 SOCK_RECVBUF_UNLOCK(so); in uipc_soreceive_stream_or_seqpacket()
1524 SOCK_RECVBUF_UNLOCK(so); in uipc_soreceive_stream_or_seqpacket()
1532 * of the buffer, so that socket is not left in a state in uipc_soreceive_stream_or_seqpacket()
1534 * Probability of such a failure is really low, so it in uipc_soreceive_stream_or_seqpacket()
1545 SOCK_RECVBUF_LOCK(so); in uipc_soreceive_stream_or_seqpacket()
1556 SOCK_RECVBUF_UNLOCK(so); in uipc_soreceive_stream_or_seqpacket()
1557 SOCK_IO_RECV_UNLOCK(so); in uipc_soreceive_stream_or_seqpacket()
1584 SOCK_RECVBUF_UNLOCK(so); in uipc_soreceive_stream_or_seqpacket()
1585 SOCK_IO_RECV_UNLOCK(so); in uipc_soreceive_stream_or_seqpacket()
1616 SOCK_IO_RECV_UNLOCK(so); in uipc_soreceive_stream_or_seqpacket()
1636 SOCK_IO_RECV_UNLOCK(so); in uipc_soreceive_stream_or_seqpacket()
1642 SOCK_IO_RECV_UNLOCK(so); in uipc_soreceive_stream_or_seqpacket()
1653 uipc_sopoll_stream_or_seqpacket(struct socket *so, int events, in uipc_sopoll_stream_or_seqpacket() argument
1656 struct unpcb *unp = sotounpcb(so); in uipc_sopoll_stream_or_seqpacket()
1660 if (SOLISTENING(so)) { in uipc_sopoll_stream_or_seqpacket()
1664 SOCK_LOCK(so); in uipc_sopoll_stream_or_seqpacket()
1667 else if (!TAILQ_EMPTY(&so->sol_comp)) in uipc_sopoll_stream_or_seqpacket()
1669 else if (so->so_error) in uipc_sopoll_stream_or_seqpacket()
1672 selrecord(td, &so->so_rdsel); in uipc_sopoll_stream_or_seqpacket()
1675 SOCK_UNLOCK(so); in uipc_sopoll_stream_or_seqpacket()
1677 if (so->so_state & SS_ISDISCONNECTED) in uipc_sopoll_stream_or_seqpacket()
1682 SOCK_RECVBUF_LOCK(so); in uipc_sopoll_stream_or_seqpacket()
1683 if (sbavail(&so->so_rcv) >= so->so_rcv.sb_lowat || in uipc_sopoll_stream_or_seqpacket()
1684 so->so_error || so->so_rerror) in uipc_sopoll_stream_or_seqpacket()
1686 if (so->so_rcv.sb_state & SBS_CANTRCVMORE) in uipc_sopoll_stream_or_seqpacket()
1690 selrecord(td, &so->so_rdsel); in uipc_sopoll_stream_or_seqpacket()
1691 so->so_rcv.sb_flags |= SB_SEL; in uipc_sopoll_stream_or_seqpacket()
1693 SOCK_RECVBUF_UNLOCK(so); in uipc_sopoll_stream_or_seqpacket()
1696 struct socket *so2 = so->so_rcv.uxst_peer; in uipc_sopoll_stream_or_seqpacket()
1709 selrecord(td, &so->so_wrsel); in uipc_sopoll_stream_or_seqpacket()
1713 selrecord(td, &so->so_wrsel); in uipc_sopoll_stream_or_seqpacket()
1723 struct socket *so = arg; in uipc_wrknl_lock() local
1724 struct unpcb *unp = sotounpcb(so); in uipc_wrknl_lock()
1727 if (SOLISTENING(so)) { in uipc_wrknl_lock()
1728 SOLISTEN_LOCK(so); in uipc_wrknl_lock()
1731 if (__predict_false(SOLISTENING(so))) { in uipc_wrknl_lock()
1735 if (so->so_rcv.uxst_peer != NULL) in uipc_wrknl_lock()
1736 SOCK_RECVBUF_LOCK(so->so_rcv.uxst_peer); in uipc_wrknl_lock()
1743 struct socket *so = arg; in uipc_wrknl_unlock() local
1744 struct unpcb *unp = sotounpcb(so); in uipc_wrknl_unlock()
1746 if (SOLISTENING(so)) in uipc_wrknl_unlock()
1747 SOLISTEN_UNLOCK(so); in uipc_wrknl_unlock()
1749 if (so->so_rcv.uxst_peer != NULL) in uipc_wrknl_unlock()
1750 SOCK_RECVBUF_UNLOCK(so->so_rcv.uxst_peer); in uipc_wrknl_unlock()
1758 struct socket *so = arg; in uipc_wrknl_assert_lock() local
1760 if (SOLISTENING(so)) { in uipc_wrknl_assert_lock()
1762 SOLISTEN_LOCK_ASSERT(so); in uipc_wrknl_assert_lock()
1764 SOLISTEN_UNLOCK_ASSERT(so); in uipc_wrknl_assert_lock()
1768 * unp lock, so we can't assert it here. But we can safely in uipc_wrknl_assert_lock()
1772 if (what == LA_LOCKED && so->so_rcv.uxst_peer != NULL) in uipc_wrknl_assert_lock()
1773 SOCK_RECVBUF_LOCK_ASSERT(so->so_rcv.uxst_peer); in uipc_wrknl_assert_lock()
1780 struct socket *so = kn->kn_fp->f_data; in uipc_filt_sowdetach() local
1782 uipc_wrknl_lock(so); in uipc_filt_sowdetach()
1783 knlist_remove(&so->so_wrsel.si_note, kn, 1); in uipc_filt_sowdetach()
1784 uipc_wrknl_unlock(so); in uipc_filt_sowdetach()
1790 struct socket *so = kn->kn_fp->f_data, *so2; in uipc_filt_sowrite() local
1791 struct unpcb *unp = sotounpcb(so), *unp2 = unp->unp_conn; in uipc_filt_sowrite()
1793 if (SOLISTENING(so)) in uipc_filt_sowrite()
1797 if (so->so_state & SS_ISDISCONNECTED) { in uipc_filt_sowrite()
1799 kn->kn_fflags = so->so_error; in uipc_filt_sowrite()
1821 struct socket *so = kn->kn_fp->f_data, *so2; in uipc_filt_soempty() local
1822 struct unpcb *unp = sotounpcb(so), *unp2 = unp->unp_conn; in uipc_filt_soempty()
1824 if (SOLISTENING(so) || unp2 == NULL) in uipc_filt_soempty()
1846 uipc_kqfilter_stream_or_seqpacket(struct socket *so, struct knote *kn) in uipc_kqfilter_stream_or_seqpacket() argument
1848 struct unpcb *unp = sotounpcb(so); in uipc_kqfilter_stream_or_seqpacket()
1853 return (sokqfilter_generic(so, kn)); in uipc_kqfilter_stream_or_seqpacket()
1864 knl = &so->so_wrsel.si_note; in uipc_kqfilter_stream_or_seqpacket()
1866 if (SOLISTENING(so)) { in uipc_kqfilter_stream_or_seqpacket()
1867 SOLISTEN_LOCK(so); in uipc_kqfilter_stream_or_seqpacket()
1869 SOLISTEN_UNLOCK(so); in uipc_kqfilter_stream_or_seqpacket()
1871 struct socket *so2 = so->so_rcv.uxst_peer; in uipc_kqfilter_stream_or_seqpacket()
1919 uipc_sosend_dgram(struct socket *so, struct sockaddr *addr, struct uio *uio, in uipc_sosend_dgram() argument
1972 unp = sotounpcb(so); in uipc_sosend_dgram()
1982 error = SOCK_IO_SEND_LOCK(so, SBLOCKWAIT(flags)); in uipc_sosend_dgram()
1985 SOCK_SENDBUF_LOCK(so); in uipc_sosend_dgram()
1986 if (so->so_snd.sb_state & SBS_CANTSENDMORE) { in uipc_sosend_dgram()
1987 SOCK_SENDBUF_UNLOCK(so); in uipc_sosend_dgram()
1991 if (so->so_error != 0) { in uipc_sosend_dgram()
1992 error = so->so_error; in uipc_sosend_dgram()
1993 so->so_error = 0; in uipc_sosend_dgram()
1994 SOCK_SENDBUF_UNLOCK(so); in uipc_sosend_dgram()
1997 if (((so->so_state & SS_ISCONNECTED) == 0) && addr == NULL) { in uipc_sosend_dgram()
1998 SOCK_SENDBUF_UNLOCK(so); in uipc_sosend_dgram()
2002 SOCK_SENDBUF_UNLOCK(so); in uipc_sosend_dgram()
2005 if ((error = unp_connectat(AT_FDCWD, so, addr, td, true))) in uipc_sosend_dgram()
2066 * Unconnected sends, when !(so->so_state & SS_ISCONNECTED) and the in uipc_sosend_dgram()
2076 * socket "so". Then, if we just added the very first datagram in uipc_sosend_dgram()
2084 * meaningful values on the receive buffer. So, the receive buffer in uipc_sosend_dgram()
2089 sb = (addr == NULL) ? &so->so_snd : &so2->so_rcv; in uipc_sosend_dgram()
2093 TAILQ_INSERT_HEAD(&so2->so_rcv.uxdg_conns, &so->so_snd, in uipc_sosend_dgram()
2122 SOCK_IO_SEND_UNLOCK(so); in uipc_sosend_dgram()
2142 uipc_peek_dgram(struct socket *so, struct mbuf *m, struct sockaddr **psa, in uipc_peek_dgram() argument
2148 so->so_rcv.uxdg_peeked = m; in uipc_peek_dgram()
2149 so->so_rcv.uxdg_cc += m->m_pkthdr.len; in uipc_peek_dgram()
2150 so->so_rcv.uxdg_ctl += m->m_pkthdr.ctllen; in uipc_peek_dgram()
2151 so->so_rcv.uxdg_mbcnt += m->m_pkthdr.memlen; in uipc_peek_dgram()
2152 SOCK_RECVBUF_UNLOCK(so); in uipc_peek_dgram()
2179 SOCK_IO_RECV_UNLOCK(so); in uipc_peek_dgram()
2185 SOCK_IO_RECV_UNLOCK(so); in uipc_peek_dgram()
2205 uipc_soreceive_dgram(struct socket *so, struct sockaddr **psa, struct uio *uio, in uipc_soreceive_dgram() argument
2222 nonblock = (so->so_state & SS_NBIO) || in uipc_soreceive_dgram()
2225 error = SOCK_IO_RECV_LOCK(so, SBLOCKWAIT(flags)); in uipc_soreceive_dgram()
2235 SOCK_RECVBUF_LOCK(so); in uipc_soreceive_dgram()
2236 while ((m = so->so_rcv.uxdg_peeked) == NULL && in uipc_soreceive_dgram()
2237 (sb = TAILQ_FIRST(&so->so_rcv.uxdg_conns)) == NULL && in uipc_soreceive_dgram()
2238 (m = STAILQ_FIRST(&so->so_rcv.uxdg_mb)) == NULL) { in uipc_soreceive_dgram()
2239 if (so->so_error) { in uipc_soreceive_dgram()
2240 error = so->so_error; in uipc_soreceive_dgram()
2242 so->so_error = 0; in uipc_soreceive_dgram()
2243 SOCK_RECVBUF_UNLOCK(so); in uipc_soreceive_dgram()
2244 SOCK_IO_RECV_UNLOCK(so); in uipc_soreceive_dgram()
2247 if (so->so_rcv.sb_state & SBS_CANTRCVMORE || in uipc_soreceive_dgram()
2249 SOCK_RECVBUF_UNLOCK(so); in uipc_soreceive_dgram()
2250 SOCK_IO_RECV_UNLOCK(so); in uipc_soreceive_dgram()
2254 SOCK_RECVBUF_UNLOCK(so); in uipc_soreceive_dgram()
2255 SOCK_IO_RECV_UNLOCK(so); in uipc_soreceive_dgram()
2258 error = sbwait(so, SO_RCV); in uipc_soreceive_dgram()
2260 SOCK_RECVBUF_UNLOCK(so); in uipc_soreceive_dgram()
2261 SOCK_IO_RECV_UNLOCK(so); in uipc_soreceive_dgram()
2267 sb = &so->so_rcv; in uipc_soreceive_dgram()
2271 MPASS(m == so->so_rcv.uxdg_peeked); in uipc_soreceive_dgram()
2280 if (__predict_true(m != so->so_rcv.uxdg_peeked)) { in uipc_soreceive_dgram()
2282 if (STAILQ_EMPTY(&sb->uxdg_mb) && sb != &so->so_rcv) in uipc_soreceive_dgram()
2283 TAILQ_REMOVE(&so->so_rcv.uxdg_conns, sb, uxdg_clist); in uipc_soreceive_dgram()
2285 so->so_rcv.uxdg_peeked = NULL; in uipc_soreceive_dgram()
2292 return (uipc_peek_dgram(so, m, psa, uio, controlp, flagsp)); in uipc_soreceive_dgram()
2294 so->so_rcv.sb_acc -= m->m_pkthdr.len; in uipc_soreceive_dgram()
2295 so->so_rcv.sb_ccc -= m->m_pkthdr.len; in uipc_soreceive_dgram()
2296 so->so_rcv.sb_ctl -= m->m_pkthdr.ctllen; in uipc_soreceive_dgram()
2297 so->so_rcv.sb_mbcnt -= m->m_pkthdr.memlen; in uipc_soreceive_dgram()
2298 SOCK_RECVBUF_UNLOCK(so); in uipc_soreceive_dgram()
2319 SOCK_IO_RECV_UNLOCK(so); in uipc_soreceive_dgram()
2337 SOCK_IO_RECV_UNLOCK(so); in uipc_soreceive_dgram()
2348 SOCK_IO_RECV_UNLOCK(so); in uipc_soreceive_dgram()
2366 uipc_sendfile_wait(struct socket *so, off_t need, int *space) in uipc_sendfile_wait() argument
2374 MPASS(so->so_type == SOCK_STREAM); in uipc_sendfile_wait()
2378 nonblock = so->so_state & SS_NBIO; in uipc_sendfile_wait()
2381 if (__predict_false((so->so_state & SS_ISCONNECTED) == 0)) in uipc_sendfile_wait()
2384 if (__predict_false((error = uipc_lock_peer(so, &unp2)) != 0)) in uipc_sendfile_wait()
2392 (*space < so->so_snd.sb_hiwat / 2)) { in uipc_sendfile_wait()
2424 uipc_sendfile(struct socket *so, int flags, struct mbuf *m, in uipc_sendfile() argument
2434 MPASS(so->so_type == SOCK_STREAM); in uipc_sendfile()
2441 if (__predict_false((so->so_state & SS_ISCONNECTED) == 0)) { in uipc_sendfile()
2446 if (__predict_false((error = uipc_lock_peer(so, &unp2)) != 0)) in uipc_sendfile()
2524 uipc_ready_scan(struct socket *so, struct mbuf *m, int count, int *errorp) in uipc_ready_scan() argument
2529 SOCK_LOCK(so); in uipc_ready_scan()
2530 if (SOLISTENING(so)) { in uipc_ready_scan()
2531 SOCK_UNLOCK(so); in uipc_ready_scan()
2535 sb = &so->so_rcv; in uipc_ready_scan()
2536 SOCK_RECVBUF_LOCK(so); in uipc_ready_scan()
2545 SOCK_RECVBUF_UNLOCK(so); in uipc_ready_scan()
2546 SOCK_UNLOCK(so); in uipc_ready_scan()
2551 uipc_ready(struct socket *so, struct mbuf *m, int count) in uipc_ready() argument
2556 MPASS(so->so_type == SOCK_STREAM); in uipc_ready()
2558 if (__predict_true(uipc_lock_peer(so, &unp2) == 0)) { in uipc_ready()
2577 * present in its socket buffer, so perform an exhaustive in uipc_ready()
2597 uipc_sense(struct socket *so, struct stat *sb) in uipc_sense() argument
2601 unp = sotounpcb(so); in uipc_sense()
2604 sb->st_blksize = so->so_snd.sb_hiwat; in uipc_sense()
2611 uipc_shutdown(struct socket *so, enum shutdown_how how) in uipc_shutdown() argument
2613 struct unpcb *unp = sotounpcb(so); in uipc_shutdown()
2616 SOCK_LOCK(so); in uipc_shutdown()
2617 if (SOLISTENING(so)) { in uipc_shutdown()
2619 so->so_error = ECONNABORTED; in uipc_shutdown()
2620 solisten_wakeup(so); /* unlocks so */ in uipc_shutdown()
2622 SOCK_UNLOCK(so); in uipc_shutdown()
2624 } else if ((so->so_state & in uipc_shutdown()
2640 if (so->so_type != SOCK_DGRAM) { in uipc_shutdown()
2641 SOCK_UNLOCK(so); in uipc_shutdown()
2646 SOCK_UNLOCK(so); in uipc_shutdown()
2650 if (so->so_type == SOCK_DGRAM) in uipc_shutdown()
2651 socantrcvmore(so); in uipc_shutdown()
2653 uipc_cantrcvmore(so); in uipc_shutdown()
2654 unp_dispose(so); in uipc_shutdown()
2657 if (so->so_type == SOCK_DGRAM) in uipc_shutdown()
2658 socantrcvmore(so); in uipc_shutdown()
2660 uipc_cantrcvmore(so); in uipc_shutdown()
2661 unp_dispose(so); in uipc_shutdown()
2664 if (so->so_type == SOCK_DGRAM) { in uipc_shutdown()
2665 socantsendmore(so); in uipc_shutdown()
2673 wakeup(&so->so_timeo); in uipc_shutdown()
2679 uipc_sockaddr(struct socket *so, struct sockaddr *ret) in uipc_sockaddr() argument
2684 unp = sotounpcb(so); in uipc_sockaddr()
2698 uipc_ctloutput(struct socket *so, struct sockopt *sopt) in uipc_ctloutput() argument
2707 unp = sotounpcb(so); in uipc_ctloutput()
2718 if (so->so_proto->pr_flags & PR_CONNREQUIRED) in uipc_ctloutput()
2797 unp_connect(struct socket *so, struct sockaddr *nam, struct thread *td) in unp_connect() argument
2800 return (unp_connectat(AT_FDCWD, so, nam, td, false)); in unp_connect()
2804 unp_connectat(int fd, struct socket *so, struct sockaddr *nam, in unp_connectat() argument
2833 unp = sotounpcb(so); in unp_connectat()
2848 if (SOLISTENING(so)) in unp_connectat()
2869 connreq = (so->so_proto->pr_flags & PR_CONNREQUIRED) != 0; in unp_connectat()
2899 unp = sotounpcb(so); in unp_connectat()
2910 if (so->so_type != so2->so_type) { in unp_connectat()
2946 mac_socketpeer_set_from_socket(so, so2); in unp_connectat()
2947 mac_socketpeer_set_from_socket(so2, so); in unp_connectat()
2955 unp_connect2(so, so2, connreq); in unp_connectat()
3032 unp_soisconnected(struct socket *so, bool wakeup) in unp_soisconnected() argument
3034 struct socket *so2 = sotounpcb(so)->unp_conn->unp_socket; in unp_soisconnected()
3037 SOCK_LOCK_ASSERT(so); in unp_soisconnected()
3038 UNP_PCB_LOCK_ASSERT(sotounpcb(so)); in unp_soisconnected()
3040 SOCK_RECVBUF_LOCK_ASSERT(so); in unp_soisconnected()
3043 MPASS(so->so_type == SOCK_STREAM || so->so_type == SOCK_SEQPACKET); in unp_soisconnected()
3044 MPASS((so->so_state & (SS_ISCONNECTED | SS_ISCONNECTING | in unp_soisconnected()
3046 MPASS(so->so_qstate == SQ_NONE); in unp_soisconnected()
3048 so->so_state &= ~SS_ISDISCONNECTED; in unp_soisconnected()
3049 so->so_state |= SS_ISCONNECTED; in unp_soisconnected()
3052 sb->uxst_peer = so; in unp_soisconnected()
3056 sb = &so->so_rcv; in unp_soisconnected()
3058 SOCK_SENDBUF_LOCK_ASSERT(so); in unp_soisconnected()
3059 sb = &so->so_snd; in unp_soisconnected()
3061 SOCK_SENDBUF_UNLOCK(so); in unp_soisconnected()
3066 unp_connect2(struct socket *so, struct socket *so2, bool wakeup) in unp_connect2() argument
3071 MPASS(so2->so_type == so->so_type); in unp_connect2()
3072 unp = sotounpcb(so); in unp_connect2()
3085 switch (so->so_type) { in unp_connect2()
3090 soisconnected(so); in unp_connect2()
3098 SOCK_LOCK(so); in unp_connect2()
3101 SOCK_SENDBUF_LOCK(so); in unp_connect2()
3102 SOCK_RECVBUF_LOCK(so); in unp_connect2()
3104 unp_soisconnected(so, wakeup); /* Will unlock send buffer. */ in unp_connect2()
3106 SOCK_RECVBUF_UNLOCK(so); in unp_connect2()
3108 SOCK_UNLOCK(so); in unp_connect2()
3118 unp_soisdisconnected(struct socket *so) in unp_soisdisconnected() argument
3120 SOCK_LOCK_ASSERT(so); in unp_soisdisconnected()
3121 SOCK_RECVBUF_LOCK_ASSERT(so); in unp_soisdisconnected()
3122 MPASS(so->so_type == SOCK_STREAM || so->so_type == SOCK_SEQPACKET); in unp_soisdisconnected()
3123 MPASS(!SOLISTENING(so)); in unp_soisdisconnected()
3124 MPASS((so->so_state & (SS_ISCONNECTING | SS_ISDISCONNECTING | in unp_soisdisconnected()
3126 MPASS(so->so_state & SS_ISCONNECTED); in unp_soisdisconnected()
3128 so->so_state |= SS_ISDISCONNECTED; in unp_soisdisconnected()
3129 so->so_state &= ~SS_ISCONNECTED; in unp_soisdisconnected()
3130 so->so_rcv.uxst_peer = NULL; in unp_soisdisconnected()
3131 socantrcvmore_locked(so); in unp_soisdisconnected()
3137 struct socket *so, *so2; in unp_disconnect() local
3149 so = unp->unp_socket; in unp_disconnect()
3161 if (!STAILQ_EMPTY(&so->so_snd.uxdg_mb)) { in unp_disconnect()
3162 TAILQ_REMOVE(&so2->so_rcv.uxdg_conns, &so->so_snd, in unp_disconnect()
3168 &so->so_snd.uxdg_mb); in unp_disconnect()
3169 so2->so_rcv.uxdg_cc += so->so_snd.uxdg_cc; in unp_disconnect()
3170 so2->so_rcv.uxdg_ctl += so->so_snd.uxdg_ctl; in unp_disconnect()
3171 so2->so_rcv.uxdg_mbcnt += so->so_snd.uxdg_mbcnt; in unp_disconnect()
3173 m = STAILQ_FIRST(&so->so_snd.uxdg_mb); in unp_disconnect()
3174 STAILQ_INIT(&so->so_snd.uxdg_mb); in unp_disconnect()
3175 so2->so_rcv.sb_acc -= so->so_snd.uxdg_cc; in unp_disconnect()
3176 so2->so_rcv.sb_ccc -= so->so_snd.uxdg_cc; in unp_disconnect()
3177 so2->so_rcv.sb_ctl -= so->so_snd.uxdg_ctl; in unp_disconnect()
3178 so2->so_rcv.sb_mbcnt -= so->so_snd.uxdg_mbcnt; in unp_disconnect()
3180 /* Note: so may reconnect. */ in unp_disconnect()
3181 so->so_snd.uxdg_cc = 0; in unp_disconnect()
3182 so->so_snd.uxdg_ctl = 0; in unp_disconnect()
3183 so->so_snd.uxdg_mbcnt = 0; in unp_disconnect()
3197 if (so) { in unp_disconnect()
3198 SOCK_LOCK(so); in unp_disconnect()
3199 so->so_state &= ~SS_ISCONNECTED; in unp_disconnect()
3200 SOCK_UNLOCK(so); in unp_disconnect()
3206 SOCK_LOCK(so); in unp_disconnect()
3208 SOCK_RECVBUF_LOCK(so); in unp_disconnect()
3210 unp_soisdisconnected(so); in unp_disconnect()
3214 SOCK_UNLOCK(so); in unp_disconnect()
3397 struct socket *so; in unp_drop() local
3407 if ((so = unp->unp_socket) != NULL) in unp_drop()
3408 so->so_error = in unp_drop()
3409 so->so_proto->pr_type == SOCK_DGRAM ? ECONNRESET : EPIPE; in unp_drop()
3685 * sizeof int, so we need to check if data fits into in unp_internalize()
3818 /* XXXGL: uipc_sosend_*() need to be improved so that we can M_WAITOK */ in unp_addsockcred()
3872 struct socket *so; in fptounp() local
3876 if ((so = fp->f_data) == NULL) in fptounp()
3878 if (so->so_proto->pr_domain != &localdomain) in fptounp()
3880 return sotounpcb(so); in fptounp()
4015 unp_scan_socket(struct socket *so, void (*op)(struct filedescent **, int)) in unp_scan_socket() argument
4019 SOCK_LOCK_ASSERT(so); in unp_scan_socket()
4021 if (sotounpcb(so)->unp_gcflag & UNPGC_IGNORE_RIGHTS) in unp_scan_socket()
4024 SOCK_RECVBUF_LOCK(so); in unp_scan_socket()
4025 switch (so->so_type) { in unp_scan_socket()
4027 unp_scan(STAILQ_FIRST(&so->so_rcv.uxdg_mb), op); in unp_scan_socket()
4028 unp_scan(so->so_rcv.uxdg_peeked, op); in unp_scan_socket()
4029 TAILQ_FOREACH(sb, &so->so_rcv.uxdg_conns, uxdg_clist) in unp_scan_socket()
4034 unp_scan(STAILQ_FIRST(&so->so_rcv.uxst_mbq), op); in unp_scan_socket()
4037 SOCK_RECVBUF_UNLOCK(so); in unp_scan_socket()
4043 struct socket *so, *soa; in unp_gc_scan() local
4045 so = unp->unp_socket; in unp_gc_scan()
4046 SOCK_LOCK(so); in unp_gc_scan()
4047 if (SOLISTENING(so)) { in unp_gc_scan()
4051 TAILQ_FOREACH(soa, &so->sol_comp, so_list) in unp_gc_scan()
4057 unp_scan_socket(so, op); in unp_gc_scan()
4059 SOCK_UNLOCK(so); in unp_gc_scan()
4186 struct socket *so; in unp_gc() local
4188 so = unref[i]->f_data; in unp_gc()
4189 CURVNET_SET(so->so_vnet); in unp_gc()
4190 socantrcvmore(so); in unp_gc()
4191 unp_dispose(so); in unp_gc()
4196 * And finally release the sockets so they can be reclaimed. in unp_gc()
4208 unp_dispose(struct socket *so) in unp_dispose() argument
4215 MPASS(!SOLISTENING(so)); in unp_dispose()
4217 unp = sotounpcb(so); in unp_dispose()
4225 error = SOCK_IO_RECV_LOCK(so, SBL_WAIT | SBL_NOINTR); in unp_dispose()
4227 SOCK_RECVBUF_LOCK(so); in unp_dispose()
4228 switch (so->so_type) { in unp_dispose()
4230 while ((sb = TAILQ_FIRST(&so->so_rcv.uxdg_conns)) != NULL) { in unp_dispose()
4231 STAILQ_CONCAT(&so->so_rcv.uxdg_mb, &sb->uxdg_mb); in unp_dispose()
4232 TAILQ_REMOVE(&so->so_rcv.uxdg_conns, sb, uxdg_clist); in unp_dispose()
4236 sb = &so->so_rcv; in unp_dispose()
4247 sb = &so->so_rcv; in unp_dispose()
4287 (void)chgsbsize(so->so_cred->cr_uidinfo, &sb->sb_hiwat, 0, in unp_dispose()
4289 SOCK_RECVBUF_UNLOCK(so); in unp_dispose()
4290 SOCK_IO_RECV_UNLOCK(so); in unp_dispose()