Lines Matching refs:so
164 static int soreceive_rcvoob(struct socket *so, struct uio *uio,
178 static int inline hhook_run_socket(struct socket *so, void *hctx, int32_t h_id);
202 #define VNET_SO_ASSERT(so) \ argument
204 ("%s:%d curvnet is NULL, so=%p", __func__, __LINE__, (so)));
398 struct socket *so; in soalloc() local
400 so = uma_zalloc(socket_zone, M_NOWAIT | M_ZERO); in soalloc()
401 if (so == NULL) in soalloc()
404 if (mac_socket_init(so, M_NOWAIT) != 0) { in soalloc()
405 uma_zfree(socket_zone, so); in soalloc()
409 if (khelp_init_osd(HELPER_CLASS_SOCKET, &so->osd)) { in soalloc()
410 uma_zfree(socket_zone, so); in soalloc()
419 mtx_init(&so->so_lock, "socket", NULL, MTX_DEF | MTX_DUPOK); in soalloc()
420 SOCKBUF_LOCK_INIT(&so->so_snd, "so_snd"); in soalloc()
421 SOCKBUF_LOCK_INIT(&so->so_rcv, "so_rcv"); in soalloc()
422 so->so_rcv.sb_sel = &so->so_rdsel; in soalloc()
423 so->so_snd.sb_sel = &so->so_wrsel; in soalloc()
424 sx_init(&so->so_snd.sb_sx, "so_snd_sx"); in soalloc()
425 sx_init(&so->so_rcv.sb_sx, "so_rcv_sx"); in soalloc()
426 TAILQ_INIT(&so->so_snd.sb_aiojobq); in soalloc()
427 TAILQ_INIT(&so->so_rcv.sb_aiojobq); in soalloc()
428 TASK_INIT(&so->so_snd.sb_aiotask, 0, soaio_snd, so); in soalloc()
429 TASK_INIT(&so->so_rcv.sb_aiotask, 0, soaio_rcv, so); in soalloc()
432 __func__, __LINE__, so)); in soalloc()
433 so->so_vnet = vnet; in soalloc()
436 if (hhook_run_socket(so, NULL, HHOOK_SOCKET_CREATE)) { in soalloc()
438 uma_zfree(socket_zone, so); in soalloc()
442 so->so_gencnt = ++so_gencnt; in soalloc()
449 return (so); in soalloc()
458 sodealloc(struct socket *so) in sodealloc() argument
461 KASSERT(so->so_count == 0, ("sodealloc(): so_count %d", so->so_count)); in sodealloc()
462 KASSERT(so->so_pcb == NULL, ("sodealloc(): so_pcb != NULL")); in sodealloc()
465 so->so_gencnt = ++so_gencnt; in sodealloc()
468 VNET_ASSERT(so->so_vnet != NULL, ("%s:%d so_vnet is NULL, so=%p", in sodealloc()
469 __func__, __LINE__, so)); in sodealloc()
470 so->so_vnet->vnet_sockcnt--; in sodealloc()
474 mac_socket_destroy(so); in sodealloc()
476 hhook_run_socket(so, NULL, HHOOK_SOCKET_CLOSE); in sodealloc()
478 khelp_destroy_osd(&so->osd); in sodealloc()
479 if (SOLISTENING(so)) { in sodealloc()
480 if (so->sol_accept_filter != NULL) in sodealloc()
481 accept_filt_setopt(so, NULL); in sodealloc()
483 if (so->so_rcv.sb_hiwat) in sodealloc()
484 (void)chgsbsize(so->so_cred->cr_uidinfo, in sodealloc()
485 &so->so_rcv.sb_hiwat, 0, RLIM_INFINITY); in sodealloc()
486 if (so->so_snd.sb_hiwat) in sodealloc()
487 (void)chgsbsize(so->so_cred->cr_uidinfo, in sodealloc()
488 &so->so_snd.sb_hiwat, 0, RLIM_INFINITY); in sodealloc()
489 sx_destroy(&so->so_snd.sb_sx); in sodealloc()
490 sx_destroy(&so->so_rcv.sb_sx); in sodealloc()
491 SOCKBUF_LOCK_DESTROY(&so->so_snd); in sodealloc()
492 SOCKBUF_LOCK_DESTROY(&so->so_rcv); in sodealloc()
494 crfree(so->so_cred); in sodealloc()
495 mtx_destroy(&so->so_lock); in sodealloc()
496 uma_zfree(socket_zone, so); in sodealloc()
508 struct socket *so; in socreate() local
534 so = soalloc(CRED_TO_VNET(cred)); in socreate()
535 if (so == NULL) in socreate()
538 so->so_type = type; in socreate()
539 so->so_cred = crhold(cred); in socreate()
543 so->so_fibnum = td->td_proc->p_fibnum; in socreate()
545 so->so_fibnum = 0; in socreate()
546 so->so_proto = prp; in socreate()
548 mac_socket_create(cred, so); in socreate()
550 knlist_init(&so->so_rdsel.si_note, so, so_rdknl_lock, so_rdknl_unlock, in socreate()
552 knlist_init(&so->so_wrsel.si_note, so, so_wrknl_lock, so_wrknl_unlock, in socreate()
558 CURVNET_SET(so->so_vnet); in socreate()
559 error = (*prp->pr_usrreqs->pru_attach)(so, proto, td); in socreate()
562 sodealloc(so); in socreate()
565 soref(so); in socreate()
566 *aso = so; in socreate()
594 struct socket *so; local
712 so = soalloc(head->so_vnet);
713 if (so == NULL) {
719 so->so_listen = head;
720 so->so_type = head->so_type;
721 so->so_options = head->so_options & ~SO_ACCEPTCONN;
722 so->so_linger = head->so_linger;
723 so->so_state = head->so_state | SS_NOFDREF;
724 so->so_fibnum = head->so_fibnum;
725 so->so_proto = head->so_proto;
726 so->so_cred = crhold(head->so_cred);
728 mac_socket_newconn(head, so);
730 knlist_init(&so->so_rdsel.si_note, so, so_rdknl_lock, so_rdknl_unlock,
732 knlist_init(&so->so_wrsel.si_note, so, so_wrknl_lock, so_wrknl_unlock,
735 if (soreserve(so, head->sol_sbsnd_hiwat, head->sol_sbrcv_hiwat)) {
736 sodealloc(so);
741 if ((*so->so_proto->pr_usrreqs->pru_attach)(so, 0, NULL)) {
742 sodealloc(so);
747 so->so_rcv.sb_lowat = head->sol_sbrcv_lowat;
748 so->so_snd.sb_lowat = head->sol_sbsnd_lowat;
749 so->so_rcv.sb_timeo = head->sol_sbrcv_timeo;
750 so->so_snd.sb_timeo = head->sol_sbsnd_timeo;
751 so->so_rcv.sb_flags |= head->sol_sbrcv_flags & SB_AUTOSIZE;
752 so->so_snd.sb_flags |= head->sol_sbsnd_flags & SB_AUTOSIZE;
757 so->so_state |= connstatus;
760 TAILQ_INSERT_TAIL(&head->sol_comp, so, so_list);
761 so->so_qstate = SQ_COMP;
786 TAILQ_INSERT_TAIL(&head->sol_incomp, so, so_list);
787 so->so_qstate = SQ_INCOMP;
791 return (so);
802 struct socket *so; local
806 so = soalloc(head->so_vnet);
807 if (so == NULL) {
813 so->so_type = head->so_type;
814 so->so_options = head->so_options;
815 so->so_linger = head->so_linger;
816 so->so_state = (head->so_state & SS_NBIO) | SS_ISCONNECTED;
817 so->so_fibnum = head->so_fibnum;
818 so->so_proto = head->so_proto;
819 so->so_cred = crhold(head->so_cred);
821 mac_socket_newconn(head, so);
823 knlist_init(&so->so_rdsel.si_note, so, so_rdknl_lock, so_rdknl_unlock,
825 knlist_init(&so->so_wrsel.si_note, so, so_wrknl_lock, so_wrknl_unlock,
828 if (soreserve(so, head->so_snd.sb_hiwat, head->so_rcv.sb_hiwat)) {
829 sodealloc(so);
834 if ((*so->so_proto->pr_usrreqs->pru_attach)(so, 0, NULL)) {
835 sodealloc(so);
840 so->so_rcv.sb_lowat = head->so_rcv.sb_lowat;
841 so->so_snd.sb_lowat = head->so_snd.sb_lowat;
842 so->so_rcv.sb_timeo = head->so_rcv.sb_timeo;
843 so->so_snd.sb_timeo = head->so_snd.sb_timeo;
844 so->so_rcv.sb_flags |= head->so_rcv.sb_flags & SB_AUTOSIZE;
845 so->so_snd.sb_flags |= head->so_snd.sb_flags & SB_AUTOSIZE;
847 soref(so);
849 return (so);
854 sobind(struct socket *so, struct sockaddr *nam, struct thread *td) argument
858 CURVNET_SET(so->so_vnet);
859 error = (*so->so_proto->pr_usrreqs->pru_bind)(so, nam, td);
865 sobindat(int fd, struct socket *so, struct sockaddr *nam, struct thread *td) argument
869 CURVNET_SET(so->so_vnet);
870 error = (*so->so_proto->pr_usrreqs->pru_bindat)(fd, so, nam, td);
888 solisten(struct socket *so, int backlog, struct thread *td) argument
892 CURVNET_SET(so->so_vnet);
893 error = (*so->so_proto->pr_usrreqs->pru_listen)(so, backlog, td);
899 solisten_proto_check(struct socket *so) argument
902 SOCK_LOCK_ASSERT(so);
904 if (so->so_state & (SS_ISCONNECTED | SS_ISCONNECTING |
911 solisten_proto(struct socket *so, int backlog) argument
918 SOCK_LOCK_ASSERT(so);
920 if (SOLISTENING(so))
926 sbrcv_lowat = so->so_rcv.sb_lowat;
927 sbsnd_lowat = so->so_snd.sb_lowat;
928 sbrcv_hiwat = so->so_rcv.sb_hiwat;
929 sbsnd_hiwat = so->so_snd.sb_hiwat;
930 sbrcv_flags = so->so_rcv.sb_flags;
931 sbsnd_flags = so->so_snd.sb_flags;
932 sbrcv_timeo = so->so_rcv.sb_timeo;
933 sbsnd_timeo = so->so_snd.sb_timeo;
935 sbdestroy(&so->so_snd, so);
936 sbdestroy(&so->so_rcv, so);
937 sx_destroy(&so->so_snd.sb_sx);
938 sx_destroy(&so->so_rcv.sb_sx);
939 SOCKBUF_LOCK_DESTROY(&so->so_snd);
940 SOCKBUF_LOCK_DESTROY(&so->so_rcv);
943 bzero(&so->so_rcv,
947 so->sol_sbrcv_lowat = sbrcv_lowat;
948 so->sol_sbsnd_lowat = sbsnd_lowat;
949 so->sol_sbrcv_hiwat = sbrcv_hiwat;
950 so->sol_sbsnd_hiwat = sbsnd_hiwat;
951 so->sol_sbrcv_flags = sbrcv_flags;
952 so->sol_sbsnd_flags = sbsnd_flags;
953 so->sol_sbrcv_timeo = sbrcv_timeo;
954 so->sol_sbsnd_timeo = sbsnd_timeo;
956 so->sol_qlen = so->sol_incqlen = 0;
957 TAILQ_INIT(&so->sol_incomp);
958 TAILQ_INIT(&so->sol_comp);
960 so->sol_accept_filter = NULL;
961 so->sol_accept_filter_arg = NULL;
962 so->sol_accept_filter_str = NULL;
964 so->sol_upcall = NULL;
965 so->sol_upcallarg = NULL;
967 so->so_options |= SO_ACCEPTCONN;
972 so->sol_qlimit = backlog;
1007 struct socket *so; local
1032 so = TAILQ_FIRST(&head->sol_comp);
1033 SOCK_LOCK(so);
1034 KASSERT(so->so_qstate == SQ_COMP,
1035 ("%s: so %p not SQ_COMP", __func__, so));
1036 soref(so);
1038 so->so_qstate = SQ_NONE;
1039 so->so_listen = NULL;
1040 TAILQ_REMOVE(&head->sol_comp, so, so_list);
1042 so->so_state |= (head->so_state & SS_NBIO);
1044 so->so_state |= (flags & SOCK_NONBLOCK) ? SS_NBIO : 0;
1045 SOCK_UNLOCK(so);
1048 *ret = so;
1073 sofree(struct socket *so) argument
1075 struct protosw *pr = so->so_proto;
1078 SOCK_LOCK_ASSERT(so);
1080 if ((so->so_state & (SS_NOFDREF | SS_PROTOREF)) != SS_NOFDREF ||
1081 refcount_load(&so->so_count) != 0 || so->so_qstate == SQ_COMP) {
1082 SOCK_UNLOCK(so);
1086 if (!SOLISTENING(so) && so->so_qstate == SQ_INCOMP) {
1089 sol = so->so_listen;
1090 KASSERT(sol, ("%s: so %p on incomp of NULL", __func__, so));
1107 soref(so);
1108 SOCK_UNLOCK(so);
1110 SOCK_LOCK(so);
1111 if (so->so_qstate == SQ_INCOMP) {
1112 KASSERT(so->so_listen == sol,
1114 __func__, so, sol));
1115 TAILQ_REMOVE(&sol->sol_incomp, so, so_list);
1120 so->so_qstate = SQ_NONE;
1121 so->so_listen = NULL;
1123 KASSERT(so->so_listen == NULL,
1125 __func__, so));
1127 KASSERT(refcount_load(&so->so_count) == 1,
1128 ("%s: so %p count %u", __func__, so, so->so_count));
1129 so->so_count = 0;
1131 if (SOLISTENING(so))
1132 so->so_error = ECONNABORTED;
1133 SOCK_UNLOCK(so);
1135 if (so->so_dtor != NULL)
1136 so->so_dtor(so);
1138 VNET_SO_ASSERT(so);
1140 (*pr->pr_domain->dom_dispose)(so);
1142 (*pr->pr_usrreqs->pru_detach)(so);
1158 if (!SOLISTENING(so)) {
1159 sbdestroy(&so->so_snd, so);
1160 sbdestroy(&so->so_rcv, so);
1162 seldrain(&so->so_rdsel);
1163 seldrain(&so->so_wrsel);
1164 knlist_destroy(&so->so_rdsel.si_note);
1165 knlist_destroy(&so->so_wrsel.si_note);
1166 sodealloc(so);
1178 soclose(struct socket *so) argument
1185 KASSERT(!(so->so_state & SS_NOFDREF), ("soclose: SS_NOFDREF on enter"));
1187 CURVNET_SET(so->so_vnet);
1188 funsetown(&so->so_sigio);
1189 if (so->so_state & SS_ISCONNECTED) {
1190 if ((so->so_state & SS_ISDISCONNECTING) == 0) {
1191 error = sodisconnect(so);
1199 if ((so->so_options & SO_LINGER) != 0 && so->so_linger != 0) {
1200 if ((so->so_state & SS_ISDISCONNECTING) &&
1201 (so->so_state & SS_NBIO))
1203 while (so->so_state & SS_ISCONNECTED) {
1204 error = tsleep(&so->so_timeo,
1206 so->so_linger * hz);
1214 if (so->so_proto->pr_usrreqs->pru_close != NULL)
1215 (*so->so_proto->pr_usrreqs->pru_close)(so);
1218 SOCK_LOCK(so);
1219 if (SOLISTENING(so)) {
1220 TAILQ_SWAP(&lqueue, &so->sol_incomp, socket, so_list);
1221 TAILQ_CONCAT(&lqueue, &so->sol_comp, so_list);
1223 so->sol_qlen = so->sol_incqlen = 0;
1230 last = refcount_release(&so->so_count);
1232 __func__, so));
1235 KASSERT((so->so_state & SS_NOFDREF) == 0, ("soclose: NOFDREF"));
1236 so->so_state |= SS_NOFDREF;
1237 sorele(so);
1267 soabort(struct socket *so) argument
1276 KASSERT(so->so_count == 0, ("soabort: so_count"));
1277 KASSERT((so->so_state & SS_PROTOREF) == 0, ("soabort: SS_PROTOREF"));
1278 KASSERT(so->so_state & SS_NOFDREF, ("soabort: !SS_NOFDREF"));
1279 VNET_SO_ASSERT(so);
1281 if (so->so_proto->pr_usrreqs->pru_abort != NULL)
1282 (*so->so_proto->pr_usrreqs->pru_abort)(so);
1283 SOCK_LOCK(so);
1284 sofree(so);
1288 soaccept(struct socket *so, struct sockaddr **nam) argument
1292 SOCK_LOCK(so);
1293 KASSERT((so->so_state & SS_NOFDREF) != 0, ("soaccept: !NOFDREF"));
1294 so->so_state &= ~SS_NOFDREF;
1295 SOCK_UNLOCK(so);
1297 CURVNET_SET(so->so_vnet);
1298 error = (*so->so_proto->pr_usrreqs->pru_accept)(so, nam);
1304 soconnect(struct socket *so, struct sockaddr *nam, struct thread *td) argument
1307 return (soconnectat(AT_FDCWD, so, nam, td));
1311 soconnectat(int fd, struct socket *so, struct sockaddr *nam, struct thread *td) argument
1316 if (SOLISTENING(so))
1319 CURVNET_SET(so->so_vnet);
1325 if (so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING) &&
1326 ((so->so_proto->pr_flags & PR_CONNREQUIRED) ||
1327 (error = sodisconnect(so)))) {
1334 so->so_error = 0;
1336 error = (*so->so_proto->pr_usrreqs->pru_connect)(so,
1339 error = (*so->so_proto->pr_usrreqs->pru_connectat)(fd,
1340 so, nam, td);
1360 sodisconnect(struct socket *so) argument
1364 if ((so->so_state & SS_ISCONNECTED) == 0)
1366 if (so->so_state & SS_ISDISCONNECTING)
1368 VNET_SO_ASSERT(so);
1369 error = (*so->so_proto->pr_usrreqs->pru_disconnect)(so);
1374 sosend_dgram(struct socket *so, struct sockaddr *addr, struct uio *uio, argument
1381 KASSERT(so->so_type == SOCK_DGRAM, ("sosend_dgram: !SOCK_DGRAM"));
1382 KASSERT(so->so_proto->pr_flags & PR_ATOMIC,
1402 (flags & MSG_DONTROUTE) && (so->so_options & SO_DONTROUTE) == 0;
1408 SOCKBUF_LOCK(&so->so_snd);
1409 if (so->so_snd.sb_state & SBS_CANTSENDMORE) {
1410 SOCKBUF_UNLOCK(&so->so_snd);
1414 if (so->so_error) {
1415 error = so->so_error;
1416 so->so_error = 0;
1417 SOCKBUF_UNLOCK(&so->so_snd);
1420 if ((so->so_state & SS_ISCONNECTED) == 0) {
1426 if ((so->so_proto->pr_flags & PR_CONNREQUIRED) &&
1427 (so->so_proto->pr_flags & PR_IMPLOPCL) == 0) {
1428 if ((so->so_state & SS_ISCONFIRMING) == 0 &&
1430 SOCKBUF_UNLOCK(&so->so_snd);
1435 if (so->so_proto->pr_flags & PR_CONNREQUIRED)
1439 SOCKBUF_UNLOCK(&so->so_snd);
1448 space = sbspace(&so->so_snd);
1452 SOCKBUF_UNLOCK(&so->so_snd);
1482 SOCK_LOCK(so);
1483 so->so_options |= SO_DONTROUTE;
1484 SOCK_UNLOCK(so);
1494 VNET_SO_ASSERT(so);
1495 error = (*so->so_proto->pr_usrreqs->pru_send)(so,
1502 (so->so_proto->pr_flags & PR_IMPLOPCL) &&
1510 SOCK_LOCK(so);
1511 so->so_options &= ~SO_DONTROUTE;
1512 SOCK_UNLOCK(so);
1539 sosend_generic(struct socket *so, struct sockaddr *addr, struct uio *uio, argument
1545 int atomic = sosendallatonce(so) || top;
1571 if (resid < 0 || (so->so_type == SOCK_STREAM && (flags & MSG_EOR))) {
1577 (flags & MSG_DONTROUTE) && (so->so_options & SO_DONTROUTE) == 0 &&
1578 (so->so_proto->pr_flags & PR_ATOMIC);
1584 error = SOCK_IO_SEND_LOCK(so, SBLOCKWAIT(flags));
1590 tls = ktls_hold(so->so_snd.sb_tls_info);
1617 SOCKBUF_LOCK(&so->so_snd);
1618 if (so->so_snd.sb_state & SBS_CANTSENDMORE) {
1619 SOCKBUF_UNLOCK(&so->so_snd);
1623 if (so->so_error) {
1624 error = so->so_error;
1625 so->so_error = 0;
1626 SOCKBUF_UNLOCK(&so->so_snd);
1629 if ((so->so_state & SS_ISCONNECTED) == 0) {
1636 if ((so->so_proto->pr_flags & PR_CONNREQUIRED) &&
1637 (so->so_proto->pr_flags & PR_IMPLOPCL) == 0) {
1638 if ((so->so_state & SS_ISCONFIRMING) == 0 &&
1640 SOCKBUF_UNLOCK(&so->so_snd);
1645 SOCKBUF_UNLOCK(&so->so_snd);
1646 if (so->so_proto->pr_flags & PR_CONNREQUIRED)
1653 space = sbspace(&so->so_snd);
1656 if ((atomic && resid > so->so_snd.sb_hiwat) ||
1657 clen > so->so_snd.sb_hiwat) {
1658 SOCKBUF_UNLOCK(&so->so_snd);
1663 (atomic || space < so->so_snd.sb_lowat || space < clen)) {
1664 if ((so->so_state & SS_NBIO) ||
1666 SOCKBUF_UNLOCK(&so->so_snd);
1670 error = sbwait(&so->so_snd);
1671 SOCKBUF_UNLOCK(&so->so_snd);
1676 SOCKBUF_UNLOCK(&so->so_snd);
1724 SOCK_LOCK(so);
1725 so->so_options |= SO_DONTROUTE;
1726 SOCK_UNLOCK(so);
1738 VNET_SO_ASSERT(so);
1747 (so->so_proto->pr_flags & PR_IMPLOPCL) &&
1758 error = (*so->so_proto->pr_usrreqs->pru_send)(so,
1762 SOCK_LOCK(so);
1763 so->so_options &= ~SO_DONTROUTE;
1764 SOCK_UNLOCK(so);
1773 soref(so);
1774 ktls_enqueue(top, so, tls_enq_cnt);
1787 SOCK_IO_SEND_UNLOCK(so);
1801 sosend(struct socket *so, struct sockaddr *addr, struct uio *uio, argument
1806 CURVNET_SET(so->so_vnet);
1807 if (!SOLISTENING(so))
1808 error = so->so_proto->pr_usrreqs->pru_sosend(so, addr, uio,
1828 soreceive_rcvoob(struct socket *so, struct uio *uio, int flags) argument
1830 struct protosw *pr = so->so_proto;
1835 VNET_SO_ASSERT(so);
1838 error = (*pr->pr_usrreqs->pru_rcvoob)(so, m, flags & MSG_PEEK);
1904 soreceive_generic(struct socket *so, struct sockaddr **psa, struct uio *uio, argument
1910 struct protosw *pr = so->so_proto;
1925 return (soreceive_rcvoob(so, uio, flags));
1928 if ((pr->pr_flags & PR_WANTRCVD) && (so->so_state & SS_ISCONFIRMING)
1930 VNET_SO_ASSERT(so);
1931 (*pr->pr_usrreqs->pru_rcvd)(so, 0);
1934 error = SOCK_IO_RECV_LOCK(so, SBLOCKWAIT(flags));
1939 SOCKBUF_LOCK(&so->so_rcv);
1940 m = so->so_rcv.sb_mb;
1948 sbavail(&so->so_rcv) < uio->uio_resid) &&
1949 sbavail(&so->so_rcv) < so->so_rcv.sb_lowat &&
1951 KASSERT(m != NULL || !sbavail(&so->so_rcv),
1953 m, sbavail(&so->so_rcv)));
1954 if (so->so_error || so->so_rerror) {
1957 if (so->so_error)
1958 error = so->so_error;
1960 error = so->so_rerror;
1962 if (so->so_error)
1963 so->so_error = 0;
1965 so->so_rerror = 0;
1967 SOCKBUF_UNLOCK(&so->so_rcv);
1970 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
1971 if (so->so_rcv.sb_state & SBS_CANTRCVMORE) {
1975 else if (so->so_rcv.sb_tlsdcc == 0 &&
1976 so->so_rcv.sb_tlscc == 0) {
1980 SOCKBUF_UNLOCK(&so->so_rcv);
1986 m = so->so_rcv.sb_mb;
1989 if ((so->so_state & (SS_ISCONNECTING | SS_ISCONNECTED |
1991 (so->so_proto->pr_flags & PR_CONNREQUIRED) != 0) {
1992 SOCKBUF_UNLOCK(&so->so_rcv);
1997 SOCKBUF_UNLOCK(&so->so_rcv);
2000 if ((so->so_state & SS_NBIO) ||
2002 SOCKBUF_UNLOCK(&so->so_rcv);
2006 SBLASTRECORDCHK(&so->so_rcv);
2007 SBLASTMBUFCHK(&so->so_rcv);
2008 error = sbwait(&so->so_rcv);
2009 SOCKBUF_UNLOCK(&so->so_rcv);
2030 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
2033 KASSERT(m == so->so_rcv.sb_mb, ("soreceive: m != so->so_rcv.sb_mb"));
2034 SBLASTRECORDCHK(&so->so_rcv);
2035 SBLASTMBUFCHK(&so->so_rcv);
2047 sbfree(&so->so_rcv, m);
2048 so->so_rcv.sb_mb = m_free(m);
2049 m = so->so_rcv.sb_mb;
2050 sockbuf_pushsync(&so->so_rcv, nextrecord);
2082 SOCKBUF_UNLOCK(&so->so_rcv);
2099 sbfree(&so->so_rcv, m);
2100 so->so_rcv.sb_mb = m->m_next;
2104 m = so->so_rcv.sb_mb;
2108 sockbuf_pushsync(&so->so_rcv, nextrecord);
2113 SOCKBUF_UNLOCK(&so->so_rcv);
2114 VNET_SO_ASSERT(so);
2117 SOCKBUF_LOCK(&so->so_rcv);
2129 nextrecord = so->so_rcv.sb_mb->m_nextpkt;
2131 nextrecord = so->so_rcv.sb_mb;
2139 KASSERT(so->so_rcv.sb_mb == m,
2141 KASSERT(so->so_rcv.sb_lastrecord == m,
2150 KASSERT(so->so_rcv.sb_mb == nextrecord,
2152 if (so->so_rcv.sb_mb == NULL) {
2153 KASSERT(so->so_rcv.sb_lastrecord == NULL,
2158 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
2159 SBLASTRECORDCHK(&so->so_rcv);
2160 SBLASTMBUFCHK(&so->so_rcv);
2178 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
2187 so->so_rcv.sb_state &= ~SBS_RCVATMARK;
2189 if (so->so_oobmark && len > so->so_oobmark - offset)
2190 len = so->so_oobmark - offset;
2201 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
2202 SBLASTRECORDCHK(&so->so_rcv);
2203 SBLASTMBUFCHK(&so->so_rcv);
2204 SOCKBUF_UNLOCK(&so->so_rcv);
2211 SOCKBUF_LOCK(&so->so_rcv);
2223 (void)sbdroprecord_locked(&so->so_rcv);
2224 SOCKBUF_UNLOCK(&so->so_rcv);
2229 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
2238 sbfree(&so->so_rcv, m);
2243 so->so_rcv.sb_mb = m = m->m_next;
2246 so->so_rcv.sb_mb = m_free(m);
2247 m = so->so_rcv.sb_mb;
2249 sockbuf_pushsync(&so->so_rcv, nextrecord);
2250 SBLASTRECORDCHK(&so->so_rcv);
2251 SBLASTMBUFCHK(&so->so_rcv);
2275 SOCKBUF_UNLOCK(&so->so_rcv);
2278 SOCKBUF_LOCK(&so->so_rcv);
2281 sbcut_locked(&so->so_rcv, len);
2284 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
2285 if (so->so_oobmark) {
2287 so->so_oobmark -= len;
2288 if (so->so_oobmark == 0) {
2289 so->so_rcv.sb_state |= SBS_RCVATMARK;
2294 if (offset == so->so_oobmark)
2308 !sosendallatonce(so) && nextrecord == NULL) {
2309 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
2310 if (so->so_error || so->so_rerror ||
2311 so->so_rcv.sb_state & SBS_CANTRCVMORE)
2318 SOCKBUF_UNLOCK(&so->so_rcv);
2319 VNET_SO_ASSERT(so);
2320 (*pr->pr_usrreqs->pru_rcvd)(so, flags);
2321 SOCKBUF_LOCK(&so->so_rcv);
2323 SBLASTRECORDCHK(&so->so_rcv);
2324 SBLASTMBUFCHK(&so->so_rcv);
2329 if (so->so_rcv.sb_mb == NULL) {
2330 error = sbwait(&so->so_rcv);
2332 SOCKBUF_UNLOCK(&so->so_rcv);
2336 m = so->so_rcv.sb_mb;
2342 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
2346 (void) sbdroprecord_locked(&so->so_rcv);
2355 so->so_rcv.sb_mb = nextrecord;
2356 if (so->so_rcv.sb_mb == NULL) {
2357 so->so_rcv.sb_mbtail = NULL;
2358 so->so_rcv.sb_lastrecord = NULL;
2360 so->so_rcv.sb_lastrecord = nextrecord;
2362 SBLASTRECORDCHK(&so->so_rcv);
2363 SBLASTMBUFCHK(&so->so_rcv);
2371 SOCKBUF_UNLOCK(&so->so_rcv);
2372 VNET_SO_ASSERT(so);
2373 (*pr->pr_usrreqs->pru_rcvd)(so, flags);
2374 SOCKBUF_LOCK(&so->so_rcv);
2377 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
2379 (flags & MSG_EOR) == 0 && (so->so_rcv.sb_state & SBS_CANTRCVMORE) == 0) {
2380 SOCKBUF_UNLOCK(&so->so_rcv);
2383 SOCKBUF_UNLOCK(&so->so_rcv);
2388 SOCK_IO_RECV_UNLOCK(so);
2396 soreceive_stream(struct socket *so, struct sockaddr **psa, struct uio *uio, argument
2404 if (so->so_type != SOCK_STREAM)
2415 return (soreceive_rcvoob(so, uio, flags));
2419 sb = &so->so_rcv;
2430 return (soreceive_generic(so, psa, uio, mp0, controlp,
2435 error = SOCK_IO_RECV_LOCK(so, SBLOCKWAIT(flags));
2443 SOCK_IO_RECV_UNLOCK(so);
2444 return (soreceive_generic(so, psa, uio, mp0, controlp,
2457 if (!(so->so_state & (SS_ISCONNECTED|SS_ISDISCONNECTED))) {
2463 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
2466 if (so->so_error) {
2471 error = so->so_error;
2473 so->so_error = 0;
2487 ((so->so_state & SS_NBIO) || (flags & (MSG_DONTWAIT|MSG_NBIO)))) {
2494 ((so->so_state & SS_NBIO) ||
2517 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
2589 if ((so->so_proto->pr_flags & PR_WANTRCVD) &&
2593 VNET_SO_ASSERT(so);
2594 (*so->so_proto->pr_usrreqs->pru_rcvd)(so, flags);
2609 SOCK_IO_RECV_UNLOCK(so);
2620 soreceive_dgram(struct socket *so, struct sockaddr **psa, struct uio *uio, argument
2626 struct protosw *pr = so->so_proto;
2643 return (soreceive_generic(so, psa, uio, mp0, controlp,
2652 KASSERT((so->so_rcv.sb_state & SBS_RCVATMARK) == 0,
2654 KASSERT((so->so_proto->pr_flags & PR_CONNREQUIRED) == 0,
2660 SOCKBUF_LOCK(&so->so_rcv);
2661 while ((m = so->so_rcv.sb_mb) == NULL) {
2662 KASSERT(sbavail(&so->so_rcv) == 0,
2664 sbavail(&so->so_rcv)));
2665 if (so->so_error) {
2666 error = so->so_error;
2667 so->so_error = 0;
2668 SOCKBUF_UNLOCK(&so->so_rcv);
2671 if (so->so_rcv.sb_state & SBS_CANTRCVMORE ||
2673 SOCKBUF_UNLOCK(&so->so_rcv);
2676 if ((so->so_state & SS_NBIO) ||
2678 SOCKBUF_UNLOCK(&so->so_rcv);
2681 SBLASTRECORDCHK(&so->so_rcv);
2682 SBLASTMBUFCHK(&so->so_rcv);
2683 error = sbwait(&so->so_rcv);
2685 SOCKBUF_UNLOCK(&so->so_rcv);
2689 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
2693 SBLASTRECORDCHK(&so->so_rcv);
2694 SBLASTMBUFCHK(&so->so_rcv);
2697 KASSERT(so->so_rcv.sb_lastrecord == m,
2701 KASSERT(so->so_rcv.sb_mb->m_nextpkt == nextrecord,
2707 so->so_rcv.sb_mb = NULL;
2708 sockbuf_pushsync(&so->so_rcv, nextrecord);
2714 sbfree(&so->so_rcv, m2);
2719 SBLASTRECORDCHK(&so->so_rcv);
2720 SBLASTMBUFCHK(&so->so_rcv);
2721 SOCKBUF_UNLOCK(&so->so_rcv);
2802 soreceive(struct socket *so, struct sockaddr **psa, struct uio *uio, argument
2807 CURVNET_SET(so->so_vnet);
2808 if (!SOLISTENING(so))
2809 error = (so->so_proto->pr_usrreqs->pru_soreceive(so, psa, uio,
2818 soshutdown(struct socket *so, int how) argument
2820 struct protosw *pr = so->so_proto;
2827 if ((so->so_state &
2838 if (so->so_type != SOCK_DGRAM && !SOLISTENING(so))
2843 if (SOLISTENING(so)) {
2845 SOLISTEN_LOCK(so);
2846 so->so_error = ECONNABORTED;
2847 solisten_wakeup(so); /* unlocks so */
2852 CURVNET_SET(so->so_vnet);
2854 (*pr->pr_usrreqs->pru_flush)(so, how);
2856 sorflush(so);
2858 error = (*pr->pr_usrreqs->pru_shutdown)(so);
2859 wakeup(&so->so_timeo);
2863 wakeup(&so->so_timeo);
2871 sorflush(struct socket *so) argument
2873 struct sockbuf *sb = &so->so_rcv;
2874 struct protosw *pr = so->so_proto;
2878 VNET_SO_ASSERT(so);
2893 socantrcvmore(so);
2894 error = SOCK_IO_RECV_LOCK(so, SBL_WAIT | SBL_NOINTR);
2896 __func__, so));
2904 aso.so_pcb = so->so_pcb;
2910 SOCK_IO_RECV_UNLOCK(so);
2918 sbrelease_internal(&aso.so_rcv, so);
2926 hhook_run_socket(struct socket *so, void *hctx, int32_t h_id) argument
2929 .so = so,
2935 CURVNET_SET(so->so_vnet);
2936 HHOOKS_RUN_IF(V_socket_hhh[h_id], &hhook_data, &so->osd);
2979 so_setsockopt(struct socket *so, int level, int optname, void *optval, argument
2990 return (sosetopt(so, &sopt));
2994 sosetopt(struct socket *so, struct sockopt *sopt) argument
3005 CURVNET_SET(so->so_vnet);
3008 if (so->so_proto->pr_ctloutput != NULL)
3009 error = (*so->so_proto->pr_ctloutput)(so, sopt);
3015 error = accept_filt_setopt(so, sopt);
3030 SOCK_LOCK(so);
3031 so->so_linger = l.l_linger;
3033 so->so_options |= SO_LINGER;
3035 so->so_options &= ~SO_LINGER;
3036 SOCK_UNLOCK(so);
3058 SOCK_LOCK(so);
3060 so->so_options |= sopt->sopt_name;
3062 so->so_options &= ~sopt->sopt_name;
3063 SOCK_UNLOCK(so);
3076 if (((so->so_proto->pr_domain->dom_family == PF_INET) ||
3077 (so->so_proto->pr_domain->dom_family == PF_INET6) ||
3078 (so->so_proto->pr_domain->dom_family == PF_ROUTE)))
3079 so->so_fibnum = optval;
3081 so->so_fibnum = 0;
3089 so->so_user_cookie = val32;
3110 error = sbsetopt(so, sopt->sopt_name, optval);
3140 so->so_snd.sb_timeo = val;
3143 so->so_rcv.sb_timeo = val;
3155 so, &extmac);
3170 so->so_ts_clock = optval;
3178 so->so_max_pacing_rate = val32;
3183 error = hhook_run_socket(so, sopt,
3189 if (error == 0 && so->so_proto->pr_ctloutput != NULL)
3190 (void)(*so->so_proto->pr_ctloutput)(so, sopt);
3228 sogetopt(struct socket *so, struct sockopt *sopt) argument
3237 CURVNET_SET(so->so_vnet);
3240 if (so->so_proto->pr_ctloutput != NULL)
3241 error = (*so->so_proto->pr_ctloutput)(so, sopt);
3249 error = accept_filt_getopt(so, sopt);
3253 SOCK_LOCK(so);
3254 l.l_onoff = so->so_options & SO_LINGER;
3255 l.l_linger = so->so_linger;
3256 SOCK_UNLOCK(so);
3276 optval = so->so_options & sopt->sopt_name;
3282 optval = so->so_proto->pr_domain->dom_family;
3286 optval = so->so_type;
3290 optval = so->so_proto->pr_protocol;
3294 SOCK_LOCK(so);
3295 if (so->so_error) {
3296 optval = so->so_error;
3297 so->so_error = 0;
3299 optval = so->so_rerror;
3300 so->so_rerror = 0;
3302 SOCK_UNLOCK(so);
3306 optval = SOLISTENING(so) ? so->sol_sbsnd_hiwat :
3307 so->so_snd.sb_hiwat;
3311 optval = SOLISTENING(so) ? so->sol_sbrcv_hiwat :
3312 so->so_rcv.sb_hiwat;
3316 optval = SOLISTENING(so) ? so->sol_sbsnd_lowat :
3317 so->so_snd.sb_lowat;
3321 optval = SOLISTENING(so) ? so->sol_sbrcv_lowat :
3322 so->so_rcv.sb_lowat;
3328 so->so_snd.sb_timeo : so->so_rcv.sb_timeo);
3348 so, &extmac);
3364 sopt->sopt_td->td_ucred, so, &extmac);
3374 optval = SOLISTENING(so) ? so->sol_qlimit : 0;
3378 optval = SOLISTENING(so) ? so->sol_qlen : 0;
3382 optval = SOLISTENING(so) ? so->sol_incqlen : 0;
3386 optval = so->so_ts_clock;
3390 optval = so->so_max_pacing_rate;
3395 error = hhook_run_socket(so, sopt,
3524 sohasoutofband(struct socket *so) argument
3527 if (so->so_sigio != NULL)
3528 pgsigio(&so->so_sigio, SIGURG, 0);
3529 selwakeuppri(&so->so_rdsel, PSOCK);
3533 sopoll(struct socket *so, int events, struct ucred *active_cred, argument
3541 return (so->so_proto->pr_usrreqs->pru_sopoll(so, events, active_cred,
3546 sopoll_generic(struct socket *so, int events, struct ucred *active_cred, argument
3551 SOCK_LOCK(so);
3552 if (SOLISTENING(so)) {
3555 else if (!TAILQ_EMPTY(&so->sol_comp))
3557 else if ((events & POLLINIGNEOF) == 0 && so->so_error)
3560 selrecord(td, &so->so_rdsel);
3565 SOCKBUF_LOCK(&so->so_snd);
3566 SOCKBUF_LOCK(&so->so_rcv);
3568 if (soreadabledata(so))
3571 if (sowriteable(so))
3574 if (so->so_oobmark ||
3575 (so->so_rcv.sb_state & SBS_RCVATMARK))
3578 if (so->so_rcv.sb_state & SBS_CANTRCVMORE) {
3580 if (so->so_snd.sb_state & SBS_CANTSENDMORE)
3587 selrecord(td, &so->so_rdsel);
3588 so->so_rcv.sb_flags |= SB_SEL;
3591 selrecord(td, &so->so_wrsel);
3592 so->so_snd.sb_flags |= SB_SEL;
3595 SOCKBUF_UNLOCK(&so->so_rcv);
3596 SOCKBUF_UNLOCK(&so->so_snd);
3598 SOCK_UNLOCK(so);
3605 struct socket *so = kn->kn_fp->f_data; local
3612 knl = &so->so_rdsel.si_note;
3613 sb = &so->so_rcv;
3617 knl = &so->so_wrsel.si_note;
3618 sb = &so->so_snd;
3622 knl = &so->so_wrsel.si_note;
3623 sb = &so->so_snd;
3629 SOCK_LOCK(so);
3630 if (SOLISTENING(so)) {
3638 SOCK_UNLOCK(so);
3647 pru_accept_notsupp(struct socket *so, struct sockaddr **nam) argument
3654 pru_aio_queue_notsupp(struct socket *so, struct kaiocb *job) argument
3661 pru_attach_notsupp(struct socket *so, int proto, struct thread *td) argument
3668 pru_bind_notsupp(struct socket *so, struct sockaddr *nam, struct thread *td) argument
3675 pru_bindat_notsupp(int fd, struct socket *so, struct sockaddr *nam, argument
3683 pru_connect_notsupp(struct socket *so, struct sockaddr *nam, struct thread *td) argument
3690 pru_connectat_notsupp(int fd, struct socket *so, struct sockaddr *nam, argument
3705 pru_control_notsupp(struct socket *so, u_long cmd, caddr_t data, argument
3713 pru_disconnect_notsupp(struct socket *so) argument
3720 pru_listen_notsupp(struct socket *so, int backlog, struct thread *td) argument
3727 pru_peeraddr_notsupp(struct socket *so, struct sockaddr **nam) argument
3734 pru_rcvd_notsupp(struct socket *so, int flags) argument
3741 pru_rcvoob_notsupp(struct socket *so, struct mbuf *m, int flags) argument
3748 pru_send_notsupp(struct socket *so, int flags, struct mbuf *m, argument
3760 pru_ready_notsupp(struct socket *so, struct mbuf *m, int count) argument
3771 pru_sense_null(struct socket *so, struct stat *sb) argument
3774 sb->st_blksize = so->so_snd.sb_hiwat;
3779 pru_shutdown_notsupp(struct socket *so) argument
3786 pru_sockaddr_notsupp(struct socket *so, struct sockaddr **nam) argument
3793 pru_sosend_notsupp(struct socket *so, struct sockaddr *addr, struct uio *uio, argument
3801 pru_soreceive_notsupp(struct socket *so, struct sockaddr **paddr, argument
3809 pru_sopoll_notsupp(struct socket *so, int events, struct ucred *cred, argument
3819 struct socket *so = kn->kn_fp->f_data; local
3821 so_rdknl_lock(so);
3822 knlist_remove(&so->so_rdsel.si_note, kn, 1);
3823 if (!SOLISTENING(so) && knlist_empty(&so->so_rdsel.si_note))
3824 so->so_rcv.sb_flags &= ~SB_KNOTE;
3825 so_rdknl_unlock(so);
3832 struct socket *so; local
3834 so = kn->kn_fp->f_data;
3836 if (SOLISTENING(so)) {
3837 SOCK_LOCK_ASSERT(so);
3838 kn->kn_data = so->sol_qlen;
3839 if (so->so_error) {
3841 kn->kn_fflags = so->so_error;
3844 return (!TAILQ_EMPTY(&so->sol_comp));
3847 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
3849 kn->kn_data = sbavail(&so->so_rcv) - so->so_rcv.sb_ctl;
3850 if (so->so_rcv.sb_state & SBS_CANTRCVMORE) {
3852 kn->kn_fflags = so->so_error;
3854 } else if (so->so_error || so->so_rerror)
3860 } else if (sbavail(&so->so_rcv) >= so->so_rcv.sb_lowat)
3864 return (hhook_run_socket(so, NULL, HHOOK_FILT_SOREAD));
3870 struct socket *so = kn->kn_fp->f_data; local
3872 so_wrknl_lock(so);
3873 knlist_remove(&so->so_wrsel.si_note, kn, 1);
3874 if (!SOLISTENING(so) && knlist_empty(&so->so_wrsel.si_note))
3875 so->so_snd.sb_flags &= ~SB_KNOTE;
3876 so_wrknl_unlock(so);
3883 struct socket *so; local
3885 so = kn->kn_fp->f_data;
3887 if (SOLISTENING(so))
3890 SOCKBUF_LOCK_ASSERT(&so->so_snd);
3891 kn->kn_data = sbspace(&so->so_snd);
3893 hhook_run_socket(so, kn, HHOOK_FILT_SOWRITE);
3895 if (so->so_snd.sb_state & SBS_CANTSENDMORE) {
3897 kn->kn_fflags = so->so_error;
3899 } else if (so->so_error) /* temporary udp error */
3901 else if (((so->so_state & SS_ISCONNECTED) == 0) &&
3902 (so->so_proto->pr_flags & PR_CONNREQUIRED))
3907 return (kn->kn_data >= so->so_snd.sb_lowat);
3913 struct socket *so; local
3915 so = kn->kn_fp->f_data;
3917 if (SOLISTENING(so))
3920 SOCKBUF_LOCK_ASSERT(&so->so_snd);
3921 kn->kn_data = sbused(&so->so_snd);
3930 socheckuid(struct socket *so, uid_t uid) argument
3933 if (so == NULL)
3935 if (so->so_cred->cr_uid != uid)
3973 soisconnecting(struct socket *so) argument
3976 SOCK_LOCK(so);
3977 so->so_state &= ~(SS_ISCONNECTED|SS_ISDISCONNECTING);
3978 so->so_state |= SS_ISCONNECTING;
3979 SOCK_UNLOCK(so);
3983 soisconnected(struct socket *so) argument
3987 SOCK_LOCK(so);
3988 so->so_state &= ~(SS_ISCONNECTING|SS_ISDISCONNECTING|SS_ISCONFIRMING);
3989 so->so_state |= SS_ISCONNECTED;
3991 if (so->so_qstate == SQ_INCOMP) {
3992 struct socket *head = so->so_listen;
3995 KASSERT(head, ("%s: so %p on incomp of NULL", __func__, so));
4005 SOCK_UNLOCK(so);
4007 SOCK_LOCK(so);
4008 if (__predict_false(head != so->so_listen)) {
4014 SOCK_UNLOCK(so);
4023 if ((so->so_options & SO_ACCEPTFILTER) == 0) {
4024 TAILQ_REMOVE(&head->sol_incomp, so, so_list);
4026 TAILQ_INSERT_TAIL(&head->sol_comp, so, so_list);
4028 so->so_qstate = SQ_COMP;
4029 SOCK_UNLOCK(so);
4032 SOCKBUF_LOCK(&so->so_rcv);
4033 soupcall_set(so, SO_RCV,
4036 so->so_options &= ~SO_ACCEPTFILTER;
4037 ret = head->sol_accept_filter->accf_callback(so,
4040 soupcall_clear(so, SO_RCV);
4041 SOCKBUF_UNLOCK(&so->so_rcv);
4044 SOCKBUF_UNLOCK(&so->so_rcv);
4045 SOCK_UNLOCK(so);
4050 SOCK_UNLOCK(so);
4051 wakeup(&so->so_timeo);
4052 sorwakeup(so);
4053 sowwakeup(so);
4057 soisdisconnecting(struct socket *so) argument
4060 SOCK_LOCK(so);
4061 so->so_state &= ~SS_ISCONNECTING;
4062 so->so_state |= SS_ISDISCONNECTING;
4064 if (!SOLISTENING(so)) {
4065 SOCKBUF_LOCK(&so->so_rcv);
4066 socantrcvmore_locked(so);
4067 SOCKBUF_LOCK(&so->so_snd);
4068 socantsendmore_locked(so);
4070 SOCK_UNLOCK(so);
4071 wakeup(&so->so_timeo);
4075 soisdisconnected(struct socket *so) argument
4078 SOCK_LOCK(so);
4087 so->so_state |= SS_ISDISCONNECTED;
4089 so->so_state &= ~(SS_ISCONNECTING|SS_ISCONNECTED|SS_ISDISCONNECTING);
4091 if (!SOLISTENING(so)) {
4092 SOCK_UNLOCK(so);
4093 SOCKBUF_LOCK(&so->so_rcv);
4094 socantrcvmore_locked(so);
4095 SOCKBUF_LOCK(&so->so_snd);
4096 sbdrop_locked(&so->so_snd, sbused(&so->so_snd));
4097 socantsendmore_locked(so);
4099 SOCK_UNLOCK(so);
4100 wakeup(&so->so_timeo);
4104 soiolock(struct socket *so, struct sx *sx, int flags) argument
4123 if (__predict_false(SOLISTENING(so))) {
4154 sodtor_set(struct socket *so, so_dtor_t *func) argument
4157 SOCK_LOCK_ASSERT(so);
4158 so->so_dtor = func;
4165 soupcall_set(struct socket *so, int which, so_upcall_t func, void *arg) argument
4169 KASSERT(!SOLISTENING(so), ("%s: so %p listening", __func__, so));
4173 sb = &so->so_rcv;
4176 sb = &so->so_snd;
4188 soupcall_clear(struct socket *so, int which) argument
4192 KASSERT(!SOLISTENING(so), ("%s: so %p listening", __func__, so));
4196 sb = &so->so_rcv;
4199 sb = &so->so_snd;
4206 ("%s: so %p no upcall to clear", __func__, so));
4213 solisten_upcall_set(struct socket *so, so_upcall_t func, void *arg) argument
4216 SOLISTEN_LOCK_ASSERT(so);
4217 so->sol_upcall = func;
4218 so->sol_upcallarg = arg;
4224 struct socket *so = arg; local
4226 if (SOLISTENING(so))
4227 SOCK_LOCK(so);
4229 SOCKBUF_LOCK(&so->so_rcv);
4235 struct socket *so = arg; local
4237 if (SOLISTENING(so))
4238 SOCK_UNLOCK(so);
4240 SOCKBUF_UNLOCK(&so->so_rcv);
4246 struct socket *so = arg; local
4249 if (SOLISTENING(so))
4250 SOCK_LOCK_ASSERT(so);
4252 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
4254 if (SOLISTENING(so))
4255 SOCK_UNLOCK_ASSERT(so);
4257 SOCKBUF_UNLOCK_ASSERT(&so->so_rcv);
4264 struct socket *so = arg; local
4266 if (SOLISTENING(so))
4267 SOCK_LOCK(so);
4269 SOCKBUF_LOCK(&so->so_snd);
4275 struct socket *so = arg; local
4277 if (SOLISTENING(so))
4278 SOCK_UNLOCK(so);
4280 SOCKBUF_UNLOCK(&so->so_snd);
4286 struct socket *so = arg; local
4289 if (SOLISTENING(so))
4290 SOCK_LOCK_ASSERT(so);
4292 SOCKBUF_LOCK_ASSERT(&so->so_snd);
4294 if (SOLISTENING(so))
4295 SOCK_UNLOCK_ASSERT(so);
4297 SOCKBUF_UNLOCK_ASSERT(&so->so_snd);
4310 sotoxsocket(struct socket *so, struct xsocket *xso) argument
4315 xso->xso_so = (uintptr_t)so;
4316 xso->so_type = so->so_type;
4317 xso->so_options = so->so_options;
4318 xso->so_linger = so->so_linger;
4319 xso->so_state = so->so_state;
4320 xso->so_pcb = (uintptr_t)so->so_pcb;
4321 xso->xso_protocol = so->so_proto->pr_protocol;
4322 xso->xso_family = so->so_proto->pr_domain->dom_family;
4323 xso->so_timeo = so->so_timeo;
4324 xso->so_error = so->so_error;
4325 xso->so_uid = so->so_cred->cr_uid;
4326 xso->so_pgid = so->so_sigio ? so->so_sigio->sio_pgid : 0;
4327 if (SOLISTENING(so)) {
4328 xso->so_qlen = so->sol_qlen;
4329 xso->so_incqlen = so->sol_incqlen;
4330 xso->so_qlimit = so->sol_qlimit;
4333 xso->so_state |= so->so_qstate;
4335 xso->so_oobmark = so->so_oobmark;
4336 sbtoxsockbuf(&so->so_snd, &xso->so_snd);
4337 sbtoxsockbuf(&so->so_rcv, &xso->so_rcv);
4342 so_sockbuf_rcv(struct socket *so) argument
4345 return (&so->so_rcv);
4349 so_sockbuf_snd(struct socket *so) argument
4352 return (&so->so_snd);
4356 so_state_get(const struct socket *so) argument
4359 return (so->so_state);
4363 so_state_set(struct socket *so, int val) argument
4366 so->so_state = val;
4370 so_options_get(const struct socket *so) argument
4373 return (so->so_options);
4377 so_options_set(struct socket *so, int val) argument
4380 so->so_options = val;
4384 so_error_get(const struct socket *so) argument
4387 return (so->so_error);
4391 so_error_set(struct socket *so, int val) argument
4394 so->so_error = val;
4398 so_linger_get(const struct socket *so) argument
4401 return (so->so_linger);
4405 so_linger_set(struct socket *so, int val) argument
4411 so->so_linger = val;
4415 so_protosw_get(const struct socket *so) argument
4418 return (so->so_proto);
4422 so_protosw_set(struct socket *so, struct protosw *val) argument
4425 so->so_proto = val;
4429 so_sorwakeup(struct socket *so) argument
4432 sorwakeup(so);
4436 so_sowwakeup(struct socket *so) argument
4439 sowwakeup(so);
4443 so_sorwakeup_locked(struct socket *so) argument
4446 sorwakeup_locked(so);
4450 so_sowwakeup_locked(struct socket *so) argument
4453 sowwakeup_locked(so);
4457 so_lock(struct socket *so) argument
4460 SOCK_LOCK(so);
4464 so_unlock(struct socket *so) argument
4467 SOCK_UNLOCK(so);