Lines Matching refs:so
190 sokvareserve(struct socket *so, vsize_t len)
222 sokvaalloc(vaddr_t sva, vsize_t len, struct socket *so)
226 if (sokvareserve(so, len) == 0)
332 sosend_loan(struct socket *so, struct uio *uio, struct mbuf *m, long space)
357 lva = sokvaalloc(sva, len, so);
375 MEXTADD(m, (void *) lva, space, M_MBUF, soloanfree, so);
411 struct socket *so = (struct socket *)arg1;
413 if (so->so_cred && proc_uidmatch(cred, so->so_cred) == 0)
496 struct socket *so;
525 so = soget(true);
526 so->so_type = type;
527 so->so_proto = prp;
528 so->so_send = sosend;
529 so->so_receive = soreceive;
530 so->so_options = sooptions;
532 so->so_rcv.sb_mowner = &prp->pr_domain->dom_mowner;
533 so->so_snd.sb_mowner = &prp->pr_domain->dom_mowner;
534 so->so_mowner = &prp->pr_domain->dom_mowner;
537 so->so_uidinfo = uid_find(uid);
538 so->so_egid = kauth_cred_getegid(l->l_cred);
539 so->so_cpid = l->l_proc->p_pid;
547 * lockso->so_lock should be stable at this point, so
551 so->so_lock = lock;
557 error = (*prp->pr_usrreqs->pr_attach)(so, proto);
558 KASSERT(solocked(so));
561 KASSERT(so->so_pcb == NULL);
562 so->so_state |= SS_NOFDREF;
563 sofree(so);
566 so->so_cred = kauth_cred_hold(l->l_cred);
567 sounlock(so);
569 *aso = so;
591 struct socket *so;
596 error = socreate(domain, &so, type, proto, l, lockso);
602 soclose(so);
612 so->so_state |= SS_NBIO;
614 fp->f_socket = so;
617 *sop = so;
625 sofamily(const struct socket *so)
630 if ((pr = so->so_proto) == NULL)
638 sobind(struct socket *so
642 solock(so);
643 if (nam->sa_family != so->so_proto->pr_domain->dom_family) {
644 sounlock(so);
647 error = (*so->so_proto->pr_usrreqs->pr_bind)(so, nam, l);
648 sounlock(so);
653 solisten(struct socket *so, int backlog, struct lwp *l)
658 solock(so);
659 if ((so->so_state & (SS_ISCONNECTED | SS_ISCONNECTING |
661 sounlock(so);
664 oldopt = so->so_options;
665 oldqlimit = so->so_qlimit;
666 if (TAILQ_EMPTY(&so->so_q))
667 so->so_options |= SO_ACCEPTCONN;
670 so->so_qlimit = uimin(backlog, somaxconn);
672 error = (*so->so_proto->pr_usrreqs->pr_listen)(so, l);
674 so->so_options = oldopt;
675 so->so_qlimit = oldqlimit;
676 sounlock(so);
679 sounlock(so);
684 sofree(struct socket *so)
688 KASSERT(solocked(so));
690 if (so->so_pcb || (so->so_state & SS_NOFDREF) == 0) {
691 sounlock(so);
694 if (so->so_head) {
700 if (!soqremque(so, 0)) {
701 sounlock(so);
705 if (so->so_rcv.sb_hiwat)
706 (void)chgsbsize(so->so_uidinfo, &so->so_rcv.sb_hiwat, 0,
708 if (so->so_snd.sb_hiwat)
709 (void)chgsbsize(so->so_uidinfo, &so->so_snd.sb_hiwat, 0,
711 sbrelease(&so->so_snd, so);
712 KASSERT(!cv_has_waiters(&so->so_cv));
713 KASSERT(!cv_has_waiters(&so->so_rcv.sb_cv));
714 KASSERT(!cv_has_waiters(&so->so_snd.sb_cv));
715 sorflush(so);
716 refs = so->so_aborting; /* XXX */
718 if (so->so_accf != NULL)
719 (void)accept_filt_clear(so);
720 sounlock(so);
722 soput(so);
730 soclose(struct socket *so)
735 solock(so);
736 if (so->so_options & SO_ACCEPTCONN) {
738 if ((so2 = TAILQ_FIRST(&so->so_q0)) != 0) {
739 KASSERT(solocked2(so, so2));
743 solock(so);
746 if ((so2 = TAILQ_FIRST(&so->so_q)) != 0) {
747 KASSERT(solocked2(so, so2));
751 solock(so);
757 if (so->so_pcb == NULL)
759 if (so->so_state & SS_ISCONNECTED) {
760 if ((so->so_state & SS_ISDISCONNECTING) == 0) {
761 error = sodisconnect(so);
765 if (so->so_options & SO_LINGER) {
766 if ((so->so_state & (SS_ISDISCONNECTING|SS_NBIO)) ==
769 while (so->so_state & SS_ISCONNECTED) {
770 error = sowait(so, true, so->so_linger * hz);
777 if (so->so_pcb) {
778 KASSERT(solocked(so));
779 (*so->so_proto->pr_usrreqs->pr_detach)(so);
782 KASSERT((so->so_state & SS_NOFDREF) == 0);
783 kauth_cred_free(so->so_cred);
784 so->so_cred = NULL;
785 so->so_state |= SS_NOFDREF;
786 sofree(so);
794 soabort(struct socket *so)
799 KASSERT(solocked(so));
800 KASSERT(so->so_head == NULL);
802 so->so_aborting++; /* XXX */
803 error = (*so->so_proto->pr_usrreqs->pr_abort)(so);
804 refs = --so->so_aborting; /* XXX */
806 sofree(so);
808 sounlock(so);
814 soaccept(struct socket *so, struct sockaddr *nam)
818 KASSERT(solocked(so));
819 KASSERT((so->so_state & SS_NOFDREF) != 0);
821 so->so_state &= ~SS_NOFDREF;
822 if ((so->so_state & SS_ISDISCONNECTED) == 0 ||
823 (so->so_proto->pr_flags & PR_ABRTACPTDIS) == 0)
824 error = (*so->so_proto->pr_usrreqs->pr_accept)(so, nam);
832 soconnect(struct socket *so, struct sockaddr *nam, struct lwp *l)
836 KASSERT(solocked(so));
838 if (so->so_options & SO_ACCEPTCONN)
846 if (so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING) &&
847 ((so->so_proto->pr_flags & PR_CONNREQUIRED) ||
848 (error = sodisconnect(so)))) {
851 if (nam->sa_family != so->so_proto->pr_domain->dom_family) {
854 error = (*so->so_proto->pr_usrreqs->pr_connect)(so, nam, l);
869 sodisconnect(struct socket *so)
873 KASSERT(solocked(so));
875 if ((so->so_state & SS_ISCONNECTED) == 0) {
877 } else if (so->so_state & SS_ISDISCONNECTING) {
880 error = (*so->so_proto->pr_usrreqs->pr_disconnect)(so);
904 sosend(struct socket *so, struct sockaddr *addr, struct uio *uio,
920 solock(so);
921 atomic = sosendallatonce(so) || top;
938 (flags & MSG_DONTROUTE) && (so->so_options & SO_DONTROUTE) == 0 &&
939 (so->so_proto->pr_flags & PR_ATOMIC);
944 if ((error = sblock(&so->so_snd, SBLOCKWAIT(flags))) != 0)
947 if (so->so_state & SS_CANTSENDMORE) {
951 if (so->so_error) {
952 error = SET_ERROR(so->so_error);
954 so->so_error = 0;
957 if ((so->so_state & SS_ISCONNECTED) == 0) {
958 if (so->so_proto->pr_flags & PR_CONNREQUIRED) {
968 space = sbspace(&so->so_snd);
971 if ((atomic && resid > so->so_snd.sb_hiwat) ||
972 clen > so->so_snd.sb_hiwat) {
977 (atomic || space < so->so_snd.sb_lowat || space < clen)) {
978 if ((so->so_state & SS_NBIO) || (flags & MSG_NBIO)) {
982 sbunlock(&so->so_snd);
987 error = sbwait(&so->so_snd);
990 wakeup_state = so->so_state;
1005 sounlock(so);
1016 MCLAIM(m, so->so_snd.sb_mowner);
1020 (len = sosend_loan(so, uio, m,
1058 solock(so);
1069 if (so->so_state & SS_CANTSENDMORE) {
1074 so->so_options |= SO_DONTROUTE;
1076 so->so_state |= SS_MORETOCOME;
1078 error = (*so->so_proto->pr_usrreqs->pr_sendoob)(
1079 so, top, control);
1081 error = (*so->so_proto->pr_usrreqs->pr_send)(so,
1085 so->so_options &= ~SO_DONTROUTE;
1087 so->so_state &= ~SS_MORETOCOME;
1098 sbunlock(&so->so_snd);
1100 sounlock(so);
1110 * into the socket buffer so that other consumers see the values
1149 * address if the protocol so specifies, followed by an optional mbuf or mbufs
1162 soreceive(struct socket *so, struct mbuf **paddr, struct uio *uio,
1175 pr = so->so_proto;
1193 solock(so);
1194 error = (*pr->pr_usrreqs->pr_recvoob)(so, m, flags & MSG_PEEK);
1195 sounlock(so);
1216 solock(so);
1218 if ((error = sblock(&so->so_rcv, SBLOCKWAIT(flags))) != 0) {
1219 sounlock(so);
1223 m = so->so_rcv.sb_mb;
1238 so->so_rcv.sb_cc < uio->uio_resid &&
1239 (so->so_rcv.sb_cc < so->so_rcv.sb_lowat ||
1241 uio->uio_resid <= so->so_rcv.sb_hiwat)) &&
1244 if (m == NULL && so->so_rcv.sb_cc)
1247 if (so->so_error || so->so_rerror) {
1251 e = so->so_error ? &so->so_error : &so->so_rerror;
1257 if (so->so_state & SS_CANTRCVMORE) {
1265 m = so->so_rcv.sb_mb;
1268 if ((so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING)) == 0 &&
1269 (so->so_proto->pr_flags & PR_CONNREQUIRED)) {
1275 if ((so->so_state & SS_NBIO) ||
1280 SBLASTRECORDCHK(&so->so_rcv, "soreceive sbwait 1");
1281 SBLASTMBUFCHK(&so
1282 sbunlock(&so->so_rcv);
1286 error = sbwait(&so->so_rcv);
1288 sounlock(so);
1292 wakeup_state = so->so_state;
1315 KASSERT(m == so->so_rcv.sb_mb);
1316 SBLASTRECORDCHK(&so->so_rcv, "soreceive 1");
1317 SBLASTMBUFCHK(&so->so_rcv, "soreceive 1");
1328 sbfree(&so->so_rcv, m);
1332 so->so_rcv.sb_mb = m->m_next;
1334 m = so->so_rcv.sb_mb;
1336 m = so->so_rcv.sb_mb = m_free(m);
1338 sbsync(&so->so_rcv, nextrecord);
1354 sbfree(&so->so_rcv, m);
1358 so->so_rcv.sb_mb = m->m_next;
1360 m = so->so_rcv.sb_mb;
1362 m = so->so_rcv.sb_mb = m_free(m);
1364 sbsync(&so->so_rcv, nextrecord);
1388 sbfree(&so->so_rcv, m);
1389 so->so_rcv.sb_mb = m->m_next;
1393 m = so->so_rcv.sb_mb;
1397 sbsync(&so->so_rcv, nextrecord);
1406 sounlock(so);
1414 solock(so);
1426 sounlock(so);
1428 solock(so);
1434 nextrecord = so->so_rcv.sb_mb->m_nextpkt;
1436 nextrecord = so->so_rcv.sb_mb;
1446 SBLASTRECORDCHK(&so->so_rcv, "soreceive 2");
1447 SBLASTMBUFCHK(&so->so_rcv, "soreceive 2");
1470 so->so_state &= ~SS_RCVATMARK;
1473 if (so->so_oobmark && len > so->so_oobmark - offset)
1474 len = so->so_oobmark - offset;
1487 SBLASTRECORDCHK(&so->so_rcv, "soreceive uiomove");
1488 SBLASTMBUFCHK(&so->so_rcv, "soreceive uiomove");
1489 sounlock(so);
1493 solock(so);
1507 (void) sbdroprecord(&so->so_rcv);
1527 sbfree(&so->so_rcv, m);
1531 so->so_rcv.sb_mb = m = m->m_next;
1534 m = so->so_rcv.sb_mb = m_free(m);
1538 * so->so_rcv.sb_mb != NULL.
1540 KASSERT(so->so_rcv.sb_mb == m);
1544 so->so_rcv.sb_lastrecord = m;
1546 so->so_rcv.sb_mb = nextrecord;
1547 SB_EMPTY_FIXUP(&so->so_rcv);
1549 SBLASTRECORDCHK(&so->so_rcv, "soreceive 3");
1550 SBLASTMBUFCHK(&so->so_rcv, "soreceive 3");
1558 sounlock(so);
1560 solock(so);
1566 so->so_rcv.sb_cc -= len;
1569 if (so->so_oobmark) {
1571 so->so_oobmark -= len;
1572 if (so->so_oobmark == 0) {
1573 so->so_state |= SS_RCVATMARK;
1578 if (offset == so->so_oobmark)
1582 so->so_state &= ~SS_POLLRDBAND;
1595 !sosendallatonce(so) && !nextrecord) {
1596 if (so->so_error || so->so_rerror ||
1597 so->so_state & SS_CANTRCVMORE)
1603 if ((flags & MSG_PEEK) && sbspace(&so->so_rcv) <= 0)
1610 if ((pr->pr_flags & PR_WANTRCVD) && so->so_pcb)
1611 (*pr->pr_usrreqs->pr_rcvd)(so, flags, l);
1612 SBLASTRECORDCHK(&so->so_rcv, "soreceive sbwait 2");
1613 SBLASTMBUFCHK(&so->so_rcv, "soreceive sbwait 2");
1617 error = sbwait(&so->so_rcv);
1619 sbunlock(&so->so_rcv);
1620 sounlock(so);
1624 if ((m = so->so_rcv.sb_mb) != NULL)
1626 wakeup_state = so->so_state;
1633 (void) sbdroprecord(&so->so_rcv);
1642 so->so_rcv.sb_mb = nextrecord;
1643 if (so->so_rcv.sb_mb == NULL) {
1644 so->so_rcv.sb_mbtail = NULL;
1645 so->so_rcv.sb_lastrecord = NULL;
1647 so->so_rcv.sb_lastrecord = nextrecord;
1649 SBLASTRECORDCHK(&so->so_rcv, "soreceive 4");
1650 SBLASTMBUFCHK(&so->so_rcv, "soreceive 4");
1651 if (pr->pr_flags & PR_WANTRCVD && so->so_pcb)
1652 (*pr->pr_usrreqs->pr_rcvd)(so, flags, l);
1655 (flags & MSG_EOR) == 0 && (so->so_state & SS_CANTRCVMORE) == 0) {
1656 sbunlock(&so->so_rcv);
1663 sbunlock(&so->so_rcv);
1664 sounlock(so);
1670 soshutdown(struct socket *so, int how)
1675 KASSERT(solocked(so));
1677 pr = so->so_proto;
1682 sorflush(so);
1686 error = (*pr->pr_usrreqs->pr_shutdown)(so);
1692 sorestart(struct socket *so)
1702 solock(so);
1703 so->so_state |= SS_RESTARTSYS;
1704 cv_broadcast(&so->so_cv);
1705 cv_broadcast(&so->so_snd.sb_cv);
1706 cv_broadcast(&so->so_rcv.sb_cv);
1707 sounlock(so);
1711 sorflush(struct socket *so)
1716 KASSERT(solocked(so));
1718 sb = &so->so_rcv;
1719 pr = so->so_proto;
1720 socantrcvmore(so);
1732 sounlock(so);
1734 solock(so);
1736 sbrelease(&asb, so);
1743 sosetopt1(struct socket *so, const struct sockopt *sopt)
1755 error = accept_filt_setopt(so, sopt);
1756 KASSERT(solocked(so));
1761 solock(so);
1769 so->so_linger = l.l_linger;
1771 so->so_options |= SO_LINGER;
1773 so->so_options &= ~SO_LINGER;
1788 solock(so);
1792 so->so_options |= opt;
1794 so->so_options &= ~opt;
1802 solock(so);
1808 * options, so disallow them.
1817 if (sbreserve(&so->so_snd, (u_long)optval, so) == 0) {
1822 so->so_snd.sb_flags &= ~SB_AUTOSIZE;
1826 if (sbreserve(&so->so_rcv, (u_long)optval, so) == 0) {
1831 so->so_rcv.sb_flags &= ~SB_AUTOSIZE;
1839 if (optval > so->so_snd.sb_hiwat)
1840 optval = so->so_snd.sb_hiwat;
1842 so->so_snd.sb_lowat = optval;
1846 if (optval > so->so_rcv.sb_hiwat)
1847 optval = so->so_rcv.sb_hiwat;
1849 so->so_rcv.sb_lowat = optval;
1856 solock(so);
1876 so->so_snd.sb_timeo = optval;
1879 so->so_rcv.sb_timeo = optval;
1886 (opt, so, sopt), enosys(), error);
1888 solock(so);
1893 KASSERT(solocked(so));
1898 sosetopt(struct socket *so, struct sockopt *sopt)
1903 error = sosetopt1(so, sopt);
1904 KASSERT(solocked(so));
1907 solock(so);
1911 so->so_proto != NULL && so->so_proto->pr_ctloutput != NULL) {
1913 prerr = (*so->so_proto->pr_ctloutput)(PRCO_SETOPT, so, sopt);
1919 sounlock(so);
1927 so_setsockopt(struct lwp *l, struct socket *so, int level, int name,
1938 error = sosetopt(so, &sopt);
1949 sogetopt1(struct socket *so, struct sockopt *sopt)
1958 error = accept_filt_getopt(so, sopt);
1962 l.l_onoff = (so->so_options & SO_LINGER) ? 1 : 0;
1963 l.l_linger = so->so_linger;
1980 error = sockopt_setint(sopt, (so
1984 error = sockopt_setint(sopt, so->so_type);
1988 if (so->so_error == 0) {
1989 so->so_error = so->so_rerror;
1990 so->so_rerror = 0;
1992 error = sockopt_setint(sopt, so->so_error);
1993 so->so_error = 0;
1997 error = sockopt_setint(sopt, so->so_snd.sb_hiwat);
2001 error = sockopt_setint(sopt, so->so_rcv.sb_hiwat);
2005 error = sockopt_setint(sopt, so->so_snd.sb_lowat);
2009 error = sockopt_setint(sopt, so->so_rcv.sb_lowat);
2015 so->so_snd.sb_timeo : so->so_rcv.sb_timeo);
2025 error = sockopt_setint(sopt, so->so_rcv.sb_overflowed);
2030 (opt, so, sopt), enosys(), error);
2040 sogetopt(struct socket *so, struct sockopt *sopt)
2044 solock(so);
2046 if (so->so_proto && so->so_proto->pr_ctloutput) {
2047 error = ((*so->so_proto->pr_ctloutput)
2048 (PRCO_GETOPT, so, sopt));
2052 error = sogetopt1(so, sopt);
2054 sounlock(so);
2229 sohasoutofband(struct socket *so)
2232 so->so_state |= SS_POLLRDBAND;
2233 fownsignal(so->so_pgid, SIGURG, POLL_PRI, POLLPRI|POLLRDBAND, so);
2234 selnotify(&so->so_rcv.sb_sel, POLLPRI | POLLRDBAND, NOTE_SUBMIT);
2240 struct socket *so;
2242 so = ((file_t *)kn->kn_obj)->f_socket;
2243 solock(so);
2244 if (selremove_knote(&so->so_rcv.sb_sel, kn))
2245 so->so_rcv.sb_flags &= ~SB_KNOTE;
2246 sounlock(so);
2253 struct socket *so;
2256 so = ((file_t *)kn->kn_obj)->f_socket;
2258 solock(so);
2259 kn->kn_data = so->so_rcv.sb_cc;
2260 if (so->so_state & SS_CANTRCVMORE) {
2262 kn->kn_fflags = so->so_error;
2264 } else if (so->so_error || so->so_rerror)
2269 rv = (kn->kn_data >= so->so_rcv.sb_lowat);
2271 sounlock(so);
2278 struct socket *so;
2280 so = ((file_t *)kn->kn_obj)->f_socket;
2281 solock(so);
2282 if (selremove_knote(&so->so_snd.sb_sel, kn))
2283 so->so_snd.sb_flags &= ~SB_KNOTE;
2284 sounlock(so);
2291 struct socket *so;
2294 so = ((file_t *)kn->kn_obj)->f_socket;
2296 solock(so);
2297 kn->kn_data = sbspace(&so->so_snd);
2298 if (so->so_state & SS_CANTSENDMORE) {
2300 kn->kn_fflags = so->so_error;
2302 } else if (so->so_error)
2304 else if (((so->so_state & SS_ISCONNECTED) == 0) &&
2305 (so->so_proto->pr_flags & PR_CONNREQUIRED))
2310 rv = (kn->kn_data >= so->so_snd.sb_lowat);
2312 sounlock(so);
2319 struct socket *so;
2322 so = ((file_t *)kn->kn_obj)->f_socket;
2324 solock(so);
2325 rv = (kn->kn_data = sbused(&so->so_snd)) == 0 ||
2326 (so->so_options & SO_ACCEPTCONN) != 0;
2328 sounlock(so);
2336 struct socket *so;
2339 so = ((file_t *)kn->kn_obj)->f_socket;
2346 solock(so);
2347 kn->kn_data = so->so_qlen;
2350 sounlock(so);
2385 struct socket *so;
2388 so = ((file_t *)kn->kn_obj)->f_socket;
2389 solock(so);
2392 if (so->so_options & SO_ACCEPTCONN)
2396 sb = &so->so_rcv;
2400 sb = &so->so_snd;
2403 if (so->so_state & SS_ISAPIPE) {
2405 if (so->so_state & SS_ISDISCONNECTED) {
2406 sounlock(so);
2414 sb = &so->so_snd;
2417 sounlock(so);
2422 sounlock(so);
2427 sodopoll(struct socket *so, int events)
2434 if (soreadable(so))
2438 if (sowritable(so))
2442 if (so->so_state & SS_POLLRDBAND)
2449 sopoll(struct socket *so, int events)
2459 if ((revents = sodopoll(so, events)) != 0)
2463 solock(so);
2464 if ((revents = sodopoll(so, events)) == 0) {
2466 selrecord(curlwp, &so->so_rcv.sb_sel);
2467 so->so_rcv.sb_flags |= SB_NOTIFY;
2471 selrecord(curlwp, &so->so_snd.sb_sel);
2472 so->so_snd.sb_flags |= SB_NOTIFY;
2475 sounlock(so);