Lines Matching defs: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);
611 so->so_state |= SS_NBIO;
613 fp->f_socket = so;
616 *sop = so;
624 sofamily(const struct socket *so)
629 if ((pr = so->so_proto) == NULL)
637 sobind(struct socket *so, struct sockaddr *nam, struct lwp *l)
641 solock(so);
642 if (nam->sa_family != so->so_proto->pr_domain->dom_family) {
643 sounlock(so);
646 error = (*so->so_proto->pr_usrreqs->pr_bind)(so, nam, l);
647 sounlock(so);
652 solisten(struct socket *so, int backlog, struct lwp *l)
657 solock(so);
658 if ((so->so_state & (SS_ISCONNECTED | SS_ISCONNECTING |
660 sounlock(so);
663 oldopt = so->so_options;
664 oldqlimit = so->so_qlimit;
665 if (TAILQ_EMPTY(&so->so_q))
666 so->so_options |= SO_ACCEPTCONN;
669 so->so_qlimit = uimin(backlog, somaxconn);
671 error = (*so->so_proto->pr_usrreqs->pr_listen)(so, l);
673 so->so_options = oldopt;
674 so->so_qlimit = oldqlimit;
675 sounlock(so);
678 sounlock(so);
683 sofree(struct socket *so)
687 KASSERT(solocked(so));
689 if (so->so_pcb || (so->so_state & SS_NOFDREF) == 0) {
690 sounlock(so);
693 if (so->so_head) {
699 if (!soqremque(so, 0)) {
700 sounlock(so);
704 if (so->so_rcv.sb_hiwat)
705 (void)chgsbsize(so->so_uidinfo, &so->so_rcv.sb_hiwat, 0,
707 if (so->so_snd.sb_hiwat)
708 (void)chgsbsize(so->so_uidinfo, &so->so_snd.sb_hiwat, 0,
710 sbrelease(&so->so_snd, so);
711 KASSERT(!cv_has_waiters(&so->so_cv));
712 KASSERT(!cv_has_waiters(&so->so_rcv.sb_cv));
713 KASSERT(!cv_has_waiters(&so->so_snd.sb_cv));
714 sorflush(so);
715 refs = so->so_aborting; /* XXX */
717 if (so->so_accf != NULL)
718 (void)accept_filt_clear(so);
719 sounlock(so);
721 soput(so);
729 soclose(struct socket *so)
734 solock(so);
735 if (so->so_options & SO_ACCEPTCONN) {
737 if ((so2 = TAILQ_FIRST(&so->so_q0)) != 0) {
738 KASSERT(solocked2(so, so2));
742 solock(so);
745 if ((so2 = TAILQ_FIRST(&so->so_q)) != 0) {
746 KASSERT(solocked2(so, so2));
750 solock(so);
756 if (so->so_pcb == NULL)
758 if (so->so_state & SS_ISCONNECTED) {
759 if ((so->so_state & SS_ISDISCONNECTING) == 0) {
760 error = sodisconnect(so);
764 if (so->so_options & SO_LINGER) {
765 if ((so->so_state & (SS_ISDISCONNECTING|SS_NBIO)) ==
768 while (so->so_state & SS_ISCONNECTED) {
769 error = sowait(so, true, so->so_linger * hz);
776 if (so->so_pcb) {
777 KASSERT(solocked(so));
778 (*so->so_proto->pr_usrreqs->pr_detach)(so);
781 KASSERT((so->so_state & SS_NOFDREF) == 0);
782 kauth_cred_free(so->so_cred);
783 so->so_cred = NULL;
784 so->so_state |= SS_NOFDREF;
785 sofree(so);
793 soabort(struct socket *so)
798 KASSERT(solocked(so));
799 KASSERT(so->so_head == NULL);
801 so->so_aborting++; /* XXX */
802 error = (*so->so_proto->pr_usrreqs->pr_abort)(so);
803 refs = --so->so_aborting; /* XXX */
805 sofree(so);
807 sounlock(so);
813 soaccept(struct socket *so, struct sockaddr *nam)
817 KASSERT(solocked(so));
818 KASSERT((so->so_state & SS_NOFDREF) != 0);
820 so->so_state &= ~SS_NOFDREF;
821 if ((so->so_state & SS_ISDISCONNECTED) == 0 ||
822 (so->so_proto->pr_flags & PR_ABRTACPTDIS) == 0)
823 error = (*so->so_proto->pr_usrreqs->pr_accept)(so, nam);
831 soconnect(struct socket *so, struct sockaddr *nam, struct lwp *l)
835 KASSERT(solocked(so));
837 if (so->so_options & SO_ACCEPTCONN)
845 if (so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING) &&
846 ((so->so_proto->pr_flags & PR_CONNREQUIRED) ||
847 (error = sodisconnect(so)))) {
850 if (nam->sa_family != so->so_proto->pr_domain->dom_family) {
853 error = (*so->so_proto->pr_usrreqs->pr_connect)(so, nam, l);
868 sodisconnect(struct socket *so)
872 KASSERT(solocked(so));
874 if ((so->so_state & SS_ISCONNECTED) == 0) {
876 } else if (so->so_state & SS_ISDISCONNECTING) {
879 error = (*so->so_proto->pr_usrreqs->pr_disconnect)(so);
903 sosend(struct socket *so, struct sockaddr *addr, struct uio *uio,
919 solock(so);
920 atomic = sosendallatonce(so) || top;
937 (flags & MSG_DONTROUTE) && (so->so_options & SO_DONTROUTE) == 0 &&
938 (so->so_proto->pr_flags & PR_ATOMIC);
943 if ((error = sblock(&so->so_snd, SBLOCKWAIT(flags))) != 0)
946 if (so->so_state & SS_CANTSENDMORE) {
950 if (so->so_error) {
951 error = SET_ERROR(so->so_error);
953 so->so_error = 0;
956 if ((so->so_state & SS_ISCONNECTED) == 0) {
957 if (so->so_proto->pr_flags & PR_CONNREQUIRED) {
967 space = sbspace(&so->so_snd);
970 if ((atomic && resid > so->so_snd.sb_hiwat) ||
971 clen > so->so_snd.sb_hiwat) {
976 (atomic || space < so->so_snd.sb_lowat || space < clen)) {
977 if ((so->so_state & SS_NBIO) || (flags & MSG_NBIO)) {
981 sbunlock(&so->so_snd);
986 error = sbwait(&so->so_snd);
989 wakeup_state = so->so_state;
1004 sounlock(so);
1015 MCLAIM(m, so->so_snd.sb_mowner);
1019 (len = sosend_loan(so, uio, m,
1057 solock(so);
1068 if (so->so_state & SS_CANTSENDMORE) {
1073 so->so_options |= SO_DONTROUTE;
1075 so->so_state |= SS_MORETOCOME;
1077 error = (*so->so_proto->pr_usrreqs->pr_sendoob)(
1078 so, top, control);
1080 error = (*so->so_proto->pr_usrreqs->pr_send)(so,
1084 so->so_options &= ~SO_DONTROUTE;
1086 so->so_state &= ~SS_MORETOCOME;
1097 sbunlock(&so->so_snd);
1099 sounlock(so);
1109 * into the socket buffer so that other consumers see the values
1148 * address if the protocol so specifies, followed by an optional mbuf or mbufs
1161 soreceive(struct socket *so, struct mbuf **paddr, struct uio *uio,
1174 pr = so->so_proto;
1192 solock(so);
1193 error = (*pr->pr_usrreqs->pr_recvoob)(so, m, flags & MSG_PEEK);
1194 sounlock(so);
1215 solock(so);
1217 if ((error = sblock(&so->so_rcv, SBLOCKWAIT(flags))) != 0) {
1218 sounlock(so);
1222 m = so->so_rcv.sb_mb;
1237 so->so_rcv.sb_cc < uio->uio_resid &&
1238 (so->so_rcv.sb_cc < so->so_rcv.sb_lowat ||
1240 uio->uio_resid <= so->so_rcv.sb_hiwat)) &&
1243 if (m == NULL && so->so_rcv.sb_cc)
1246 if (so->so_error || so->so_rerror) {
1250 e = so->so_error ? &so->so_error : &so->so_rerror;
1256 if (so->so_state & SS_CANTRCVMORE) {
1264 m = so->so_rcv.sb_mb;
1267 if ((so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING)) == 0 &&
1268 (so->so_proto->pr_flags & PR_CONNREQUIRED)) {
1274 if ((so->so_state & SS_NBIO) ||
1279 SBLASTRECORDCHK(&so->so_rcv, "soreceive sbwait 1");
1280 SBLASTMBUFCHK(&so->so_rcv, "soreceive sbwait 1");
1281 sbunlock(&so->so_rcv);
1285 error = sbwait(&so->so_rcv);
1287 sounlock(so);
1291 wakeup_state = so->so_state;
1314 KASSERT(m == so->so_rcv.sb_mb);
1315 SBLASTRECORDCHK(&so->so_rcv, "soreceive 1");
1316 SBLASTMBUFCHK(&so->so_rcv, "soreceive 1");
1327 sbfree(&so->so_rcv, m);
1331 so->so_rcv.sb_mb = m->m_next;
1333 m = so->so_rcv.sb_mb;
1335 m = so->so_rcv.sb_mb = m_free(m);
1337 sbsync(&so->so_rcv, nextrecord);
1353 sbfree(&so->so_rcv, m);
1357 so->so_rcv.sb_mb = m->m_next;
1359 m = so->so_rcv.sb_mb;
1361 m = so->so_rcv.sb_mb = m_free(m);
1363 sbsync(&so->so_rcv, nextrecord);
1387 sbfree(&so->so_rcv, m);
1388 so->so_rcv.sb_mb = m->m_next;
1392 m = so->so_rcv.sb_mb;
1396 sbsync(&so->so_rcv, nextrecord);
1405 sounlock(so);
1411 solock(so);
1423 sounlock(so);
1425 solock(so);
1431 nextrecord = so->so_rcv.sb_mb->m_nextpkt;
1433 nextrecord = so->so_rcv.sb_mb;
1443 SBLASTRECORDCHK(&so->so_rcv, "soreceive 2");
1444 SBLASTMBUFCHK(&so->so_rcv, "soreceive 2");
1467 so->so_state &= ~SS_RCVATMARK;
1470 if (so->so_oobmark && len > so->so_oobmark - offset)
1471 len = so->so_oobmark - offset;
1484 SBLASTRECORDCHK(&so->so_rcv, "soreceive uiomove");
1485 SBLASTMBUFCHK(&so->so_rcv, "soreceive uiomove");
1486 sounlock(so);
1490 solock(so);
1504 (void) sbdroprecord(&so->so_rcv);
1524 sbfree(&so->so_rcv, m);
1528 so->so_rcv.sb_mb = m = m->m_next;
1531 m = so->so_rcv.sb_mb = m_free(m);
1535 * so->so_rcv.sb_mb != NULL.
1537 KASSERT(so->so_rcv.sb_mb == m);
1541 so->so_rcv.sb_lastrecord = m;
1543 so->so_rcv.sb_mb = nextrecord;
1544 SB_EMPTY_FIXUP(&so->so_rcv);
1546 SBLASTRECORDCHK(&so->so_rcv, "soreceive 3");
1547 SBLASTMBUFCHK(&so->so_rcv, "soreceive 3");
1555 sounlock(so);
1557 solock(so);
1563 so->so_rcv.sb_cc -= len;
1566 if (so->so_oobmark) {
1568 so->so_oobmark -= len;
1569 if (so->so_oobmark == 0) {
1570 so->so_state |= SS_RCVATMARK;
1575 if (offset == so->so_oobmark)
1579 so->so_state &= ~SS_POLLRDBAND;
1592 !sosendallatonce(so) && !nextrecord) {
1593 if (so->so_error || so->so_rerror ||
1594 so->so_state & SS_CANTRCVMORE)
1600 if ((flags & MSG_PEEK) && sbspace(&so->so_rcv) <= 0)
1607 if ((pr->pr_flags & PR_WANTRCVD) && so->so_pcb)
1608 (*pr->pr_usrreqs->pr_rcvd)(so, flags, l);
1609 SBLASTRECORDCHK(&so->so_rcv, "soreceive sbwait 2");
1610 SBLASTMBUFCHK(&so->so_rcv, "soreceive sbwait 2");
1614 error = sbwait(&so->so_rcv);
1616 sbunlock(&so->so_rcv);
1617 sounlock(so);
1621 if ((m = so->so_rcv.sb_mb) != NULL)
1623 wakeup_state = so->so_state;
1630 (void) sbdroprecord(&so->so_rcv);
1639 so->so_rcv.sb_mb = nextrecord;
1640 if (so->so_rcv.sb_mb == NULL) {
1641 so->so_rcv.sb_mbtail = NULL;
1642 so->so_rcv.sb_lastrecord = NULL;
1644 so->so_rcv.sb_lastrecord = nextrecord;
1646 SBLASTRECORDCHK(&so->so_rcv, "soreceive 4");
1647 SBLASTMBUFCHK(&so->so_rcv, "soreceive 4");
1648 if (pr->pr_flags & PR_WANTRCVD && so->so_pcb)
1649 (*pr->pr_usrreqs->pr_rcvd)(so, flags, l);
1652 (flags & MSG_EOR) == 0 && (so->so_state & SS_CANTRCVMORE) == 0) {
1653 sbunlock(&so->so_rcv);
1660 sbunlock(&so->so_rcv);
1661 sounlock(so);
1667 soshutdown(struct socket *so, int how)
1672 KASSERT(solocked(so));
1674 pr = so->so_proto;
1679 sorflush(so);
1683 error = (*pr->pr_usrreqs->pr_shutdown)(so);
1689 sorestart(struct socket *so)
1699 solock(so);
1700 so->so_state |= SS_RESTARTSYS;
1701 cv_broadcast(&so->so_cv);
1702 cv_broadcast(&so->so_snd.sb_cv);
1703 cv_broadcast(&so->so_rcv.sb_cv);
1704 sounlock(so);
1708 sorflush(struct socket *so)
1713 KASSERT(solocked(so));
1715 sb = &so->so_rcv;
1716 pr = so->so_proto;
1717 socantrcvmore(so);
1729 sounlock(so);
1731 solock(so);
1733 sbrelease(&asb, so);
1740 sosetopt1(struct socket *so, const struct sockopt *sopt)
1752 error = accept_filt_setopt(so, sopt);
1753 KASSERT(solocked(so));
1758 solock(so);
1766 so->so_linger = l.l_linger;
1768 so->so_options |= SO_LINGER;
1770 so->so_options &= ~SO_LINGER;
1785 solock(so);
1789 so->so_options |= opt;
1791 so->so_options &= ~opt;
1799 solock(so);
1805 * options, so disallow them.
1814 if (sbreserve(&so->so_snd, (u_long)optval, so) == 0) {
1819 so->so_snd.sb_flags &= ~SB_AUTOSIZE;
1823 if (sbreserve(&so->so_rcv, (u_long)optval, so) == 0) {
1828 so->so_rcv.sb_flags &= ~SB_AUTOSIZE;
1836 if (optval > so->so_snd.sb_hiwat)
1837 optval = so->so_snd.sb_hiwat;
1839 so->so_snd.sb_lowat = optval;
1843 if (optval > so->so_rcv.sb_hiwat)
1844 optval = so->so_rcv.sb_hiwat;
1846 so->so_rcv.sb_lowat = optval;
1853 solock(so);
1873 so->so_snd.sb_timeo = optval;
1876 so->so_rcv.sb_timeo = optval;
1883 (opt, so, sopt), enosys(), error);
1885 solock(so);
1890 KASSERT(solocked(so));
1895 sosetopt(struct socket *so, struct sockopt *sopt)
1900 error = sosetopt1(so, sopt);
1901 KASSERT(solocked(so));
1904 solock(so);
1908 so->so_proto != NULL && so->so_proto->pr_ctloutput != NULL) {
1910 prerr = (*so->so_proto->pr_ctloutput)(PRCO_SETOPT, so, sopt);
1916 sounlock(so);
1924 so_setsockopt(struct lwp *l, struct socket *so, int level, int name,
1935 error = sosetopt(so, &sopt);
1946 sogetopt1(struct socket *so, struct sockopt *sopt)
1955 error = accept_filt_getopt(so, sopt);
1959 l.l_onoff = (so->so_options & SO_LINGER) ? 1 : 0;
1960 l.l_linger = so->so_linger;
1977 error = sockopt_setint(sopt, (so->so_options & opt) ? 1 : 0);
1981 error = sockopt_setint(sopt, so->so_type);
1985 if (so->so_error == 0) {
1986 so->so_error = so->so_rerror;
1987 so->so_rerror = 0;
1989 error = sockopt_setint(sopt, so->so_error);
1990 so->so_error = 0;
1994 error = sockopt_setint(sopt, so->so_snd.sb_hiwat);
1998 error = sockopt_setint(sopt, so->so_rcv.sb_hiwat);
2002 error = sockopt_setint(sopt, so->so_snd.sb_lowat);
2006 error = sockopt_setint(sopt, so->so_rcv.sb_lowat);
2012 so->so_snd.sb_timeo : so->so_rcv.sb_timeo);
2022 error = sockopt_setint(sopt, so->so_rcv.sb_overflowed);
2027 (opt, so, sopt), enosys(), error);
2037 sogetopt(struct socket *so, struct sockopt *sopt)
2041 solock(so);
2043 if (so->so_proto && so->so_proto->pr_ctloutput) {
2044 error = ((*so->so_proto->pr_ctloutput)
2045 (PRCO_GETOPT, so, sopt));
2049 error = sogetopt1(so, sopt);
2051 sounlock(so);
2226 sohasoutofband(struct socket *so)
2229 so->so_state |= SS_POLLRDBAND;
2230 fownsignal(so->so_pgid, SIGURG, POLL_PRI, POLLPRI|POLLRDBAND, so);
2231 selnotify(&so->so_rcv.sb_sel, POLLPRI | POLLRDBAND, NOTE_SUBMIT);
2237 struct socket *so;
2239 so = ((file_t *)kn->kn_obj)->f_socket;
2240 solock(so);
2241 if (selremove_knote(&so->so_rcv.sb_sel, kn))
2242 so->so_rcv.sb_flags &= ~SB_KNOTE;
2243 sounlock(so);
2250 struct socket *so;
2253 so = ((file_t *)kn->kn_obj)->f_socket;
2255 solock(so);
2256 kn->kn_data = so->so_rcv.sb_cc;
2257 if (so->so_state & SS_CANTRCVMORE) {
2259 kn->kn_fflags = so->so_error;
2261 } else if (so->so_error || so->so_rerror)
2266 rv = (kn->kn_data >= so->so_rcv.sb_lowat);
2268 sounlock(so);
2275 struct socket *so;
2277 so = ((file_t *)kn->kn_obj)->f_socket;
2278 solock(so);
2279 if (selremove_knote(&so->so_snd.sb_sel, kn))
2280 so->so_snd.sb_flags &= ~SB_KNOTE;
2281 sounlock(so);
2288 struct socket *so;
2291 so = ((file_t *)kn->kn_obj)->f_socket;
2293 solock(so);
2294 kn->kn_data = sbspace(&so->so_snd);
2295 if (so->so_state & SS_CANTSENDMORE) {
2297 kn->kn_fflags = so->so_error;
2299 } else if (so->so_error)
2301 else if (((so->so_state & SS_ISCONNECTED) == 0) &&
2302 (so->so_proto->pr_flags & PR_CONNREQUIRED))
2307 rv = (kn->kn_data >= so->so_snd.sb_lowat);
2309 sounlock(so);
2316 struct socket *so;
2319 so = ((file_t *)kn->kn_obj)->f_socket;
2321 solock(so);
2322 rv = (kn->kn_data = sbused(&so->so_snd)) == 0 ||
2323 (so->so_options & SO_ACCEPTCONN) != 0;
2325 sounlock(so);
2333 struct socket *so;
2336 so = ((file_t *)kn->kn_obj)->f_socket;
2343 solock(so);
2344 kn->kn_data = so->so_qlen;
2347 sounlock(so);
2382 struct socket *so;
2385 so = ((file_t *)kn->kn_obj)->f_socket;
2386 solock(so);
2389 if (so->so_options & SO_ACCEPTCONN)
2393 sb = &so->so_rcv;
2397 sb = &so->so_snd;
2400 if (so->so_state & SS_ISAPIPE) {
2402 if (so->so_state & SS_ISDISCONNECTED) {
2403 sounlock(so);
2411 sb = &so->so_snd;
2414 sounlock(so);
2419 sounlock(so);
2424 sodopoll(struct socket *so, int events)
2431 if (soreadable(so))
2435 if (sowritable(so))
2439 if (so->so_state & SS_POLLRDBAND)
2446 sopoll(struct socket *so, int events)
2456 if ((revents = sodopoll(so, events)) != 0)
2460 solock(so);
2461 if ((revents = sodopoll(so, events)) == 0) {
2463 selrecord(curlwp, &so->so_rcv.sb_sel);
2464 so->so_rcv.sb_flags |= SB_NOTIFY;
2468 selrecord(curlwp, &so->so_snd.sb_sel);
2469 so->so_snd.sb_flags |= SB_NOTIFY;
2472 sounlock(so);