Lines Matching refs:so
157 static int soreceive_rcvoob(struct socket *so, struct uio *uio,
173 static int inline hhook_run_socket(struct socket *so, void *hctx, int32_t h_id);
197 #define VNET_SO_ASSERT(so) \ argument
199 ("%s:%d curvnet is NULL, so=%p", __func__, __LINE__, (so)));
390 struct socket *so; in soalloc() local
392 so = uma_zalloc(socket_zone, M_NOWAIT | M_ZERO); in soalloc()
393 if (so == NULL) in soalloc()
396 if (mac_socket_init(so, M_NOWAIT) != 0) { in soalloc()
397 uma_zfree(socket_zone, so); in soalloc()
401 if (khelp_init_osd(HELPER_CLASS_SOCKET, &so->osd)) { in soalloc()
402 uma_zfree(socket_zone, so); in soalloc()
411 mtx_init(&so->so_lock, "socket", NULL, MTX_DEF | MTX_DUPOK); in soalloc()
412 SOCKBUF_LOCK_INIT(&so->so_snd, "so_snd"); in soalloc()
413 SOCKBUF_LOCK_INIT(&so->so_rcv, "so_rcv"); in soalloc()
414 so->so_rcv.sb_sel = &so->so_rdsel; in soalloc()
415 so->so_snd.sb_sel = &so->so_wrsel; in soalloc()
416 sx_init(&so->so_snd.sb_sx, "so_snd_sx"); in soalloc()
417 sx_init(&so->so_rcv.sb_sx, "so_rcv_sx"); in soalloc()
418 TAILQ_INIT(&so->so_snd.sb_aiojobq); in soalloc()
419 TAILQ_INIT(&so->so_rcv.sb_aiojobq); in soalloc()
420 TASK_INIT(&so->so_snd.sb_aiotask, 0, soaio_snd, so); in soalloc()
421 TASK_INIT(&so->so_rcv.sb_aiotask, 0, soaio_rcv, so); in soalloc()
424 __func__, __LINE__, so)); in soalloc()
425 so->so_vnet = vnet; in soalloc()
428 if (hhook_run_socket(so, NULL, HHOOK_SOCKET_CREATE)) { in soalloc()
430 uma_zfree(socket_zone, so); in soalloc()
434 so->so_gencnt = ++so_gencnt; in soalloc()
441 return (so); in soalloc()
450 sodealloc(struct socket *so) in sodealloc() argument
453 KASSERT(so->so_count == 0, ("sodealloc(): so_count %d", so->so_count)); in sodealloc()
454 KASSERT(so->so_pcb == NULL, ("sodealloc(): so_pcb != NULL")); in sodealloc()
457 so->so_gencnt = ++so_gencnt; in sodealloc()
460 VNET_ASSERT(so->so_vnet != NULL, ("%s:%d so_vnet is NULL, so=%p", in sodealloc()
461 __func__, __LINE__, so)); in sodealloc()
462 so->so_vnet->vnet_sockcnt--; in sodealloc()
466 mac_socket_destroy(so); in sodealloc()
468 hhook_run_socket(so, NULL, HHOOK_SOCKET_CLOSE); in sodealloc()
470 crfree(so->so_cred); in sodealloc()
471 khelp_destroy_osd(&so->osd); in sodealloc()
472 if (SOLISTENING(so)) { in sodealloc()
473 if (so->sol_accept_filter != NULL) in sodealloc()
474 accept_filt_setopt(so, NULL); in sodealloc()
476 if (so->so_rcv.sb_hiwat) in sodealloc()
477 (void)chgsbsize(so->so_cred->cr_uidinfo, in sodealloc()
478 &so->so_rcv.sb_hiwat, 0, RLIM_INFINITY); in sodealloc()
479 if (so->so_snd.sb_hiwat) in sodealloc()
480 (void)chgsbsize(so->so_cred->cr_uidinfo, in sodealloc()
481 &so->so_snd.sb_hiwat, 0, RLIM_INFINITY); in sodealloc()
482 sx_destroy(&so->so_snd.sb_sx); in sodealloc()
483 sx_destroy(&so->so_rcv.sb_sx); in sodealloc()
484 SOCKBUF_LOCK_DESTROY(&so->so_snd); in sodealloc()
485 SOCKBUF_LOCK_DESTROY(&so->so_rcv); in sodealloc()
487 mtx_destroy(&so->so_lock); in sodealloc()
488 uma_zfree(socket_zone, so); in sodealloc()
500 struct socket *so; in socreate() local
526 so = soalloc(CRED_TO_VNET(cred)); in socreate()
527 if (so == NULL) in socreate()
530 so->so_type = type; in socreate()
531 so->so_cred = crhold(cred); in socreate()
535 so->so_fibnum = td->td_proc->p_fibnum; in socreate()
537 so->so_fibnum = 0; in socreate()
538 so->so_proto = prp; in socreate()
540 mac_socket_create(cred, so); in socreate()
542 knlist_init(&so->so_rdsel.si_note, so, so_rdknl_lock, so_rdknl_unlock, in socreate()
544 knlist_init(&so->so_wrsel.si_note, so, so_wrknl_lock, so_wrknl_unlock, in socreate()
550 CURVNET_SET(so->so_vnet); in socreate()
551 error = (*prp->pr_usrreqs->pru_attach)(so, proto, td); in socreate()
554 sodealloc(so); in socreate()
557 soref(so); in socreate()
558 *aso = so; in socreate()
584 struct socket *so; local
610 so = soalloc(head->so_vnet);
611 if (so == NULL) {
617 so->so_listen = head;
618 so->so_type = head->so_type;
619 so->so_linger = head->so_linger;
620 so->so_state = head->so_state | SS_NOFDREF;
621 so->so_fibnum = head->so_fibnum;
622 so->so_proto = head->so_proto;
623 so->so_cred = crhold(head->so_cred);
625 mac_socket_newconn(head, so);
627 knlist_init(&so->so_rdsel.si_note, so, so_rdknl_lock, so_rdknl_unlock,
629 knlist_init(&so->so_wrsel.si_note, so, so_wrknl_lock, so_wrknl_unlock,
632 if (soreserve(so, head->sol_sbsnd_hiwat, head->sol_sbrcv_hiwat)) {
633 sodealloc(so);
638 if ((*so->so_proto->pr_usrreqs->pru_attach)(so, 0, NULL)) {
639 sodealloc(so);
644 so->so_rcv.sb_lowat = head->sol_sbrcv_lowat;
645 so->so_snd.sb_lowat = head->sol_sbsnd_lowat;
646 so->so_rcv.sb_timeo = head->sol_sbrcv_timeo;
647 so->so_snd.sb_timeo = head->sol_sbsnd_timeo;
648 so->so_rcv.sb_flags |= head->sol_sbrcv_flags & SB_AUTOSIZE;
649 so->so_snd.sb_flags |= head->sol_sbsnd_flags & SB_AUTOSIZE;
654 so->so_state |= connstatus;
655 so->so_options = head->so_options & ~SO_ACCEPTCONN;
658 TAILQ_INSERT_TAIL(&head->sol_comp, so, so_list);
659 so->so_qstate = SQ_COMP;
684 TAILQ_INSERT_TAIL(&head->sol_incomp, so, so_list);
685 so->so_qstate = SQ_INCOMP;
689 return (so);
700 struct socket *so; local
704 so = soalloc(head->so_vnet);
705 if (so == NULL) {
711 so->so_type = head->so_type;
712 so->so_options = head->so_options;
713 so->so_linger = head->so_linger;
714 so->so_state = (head->so_state & SS_NBIO) | SS_ISCONNECTED;
715 so->so_fibnum = head->so_fibnum;
716 so->so_proto = head->so_proto;
717 so->so_cred = crhold(head->so_cred);
719 mac_socket_newconn(head, so);
721 knlist_init(&so->so_rdsel.si_note, so, so_rdknl_lock, so_rdknl_unlock,
723 knlist_init(&so->so_wrsel.si_note, so, so_wrknl_lock, so_wrknl_unlock,
726 if (soreserve(so, head->so_snd.sb_hiwat, head->so_rcv.sb_hiwat)) {
727 sodealloc(so);
732 if ((*so->so_proto->pr_usrreqs->pru_attach)(so, 0, NULL)) {
733 sodealloc(so);
738 so->so_rcv.sb_lowat = head->so_rcv.sb_lowat;
739 so->so_snd.sb_lowat = head->so_snd.sb_lowat;
740 so->so_rcv.sb_timeo = head->so_rcv.sb_timeo;
741 so->so_snd.sb_timeo = head->so_snd.sb_timeo;
742 so->so_rcv.sb_flags |= head->so_rcv.sb_flags & SB_AUTOSIZE;
743 so->so_snd.sb_flags |= head->so_snd.sb_flags & SB_AUTOSIZE;
745 soref(so);
747 return (so);
752 sobind(struct socket *so, struct sockaddr *nam, struct thread *td) argument
756 CURVNET_SET(so->so_vnet);
757 error = (*so->so_proto->pr_usrreqs->pru_bind)(so, nam, td);
763 sobindat(int fd, struct socket *so, struct sockaddr *nam, struct thread *td) argument
767 CURVNET_SET(so->so_vnet);
768 error = (*so->so_proto->pr_usrreqs->pru_bindat)(fd, so, nam, td);
786 solisten(struct socket *so, int backlog, struct thread *td) argument
790 CURVNET_SET(so->so_vnet);
791 error = (*so->so_proto->pr_usrreqs->pru_listen)(so, backlog, td);
797 solisten_proto_check(struct socket *so) argument
800 SOCK_LOCK_ASSERT(so);
802 if (so->so_state & (SS_ISCONNECTED | SS_ISCONNECTING |
809 solisten_proto(struct socket *so, int backlog) argument
816 SOCK_LOCK_ASSERT(so);
818 if (SOLISTENING(so))
824 sbrcv_lowat = so->so_rcv.sb_lowat;
825 sbsnd_lowat = so->so_snd.sb_lowat;
826 sbrcv_hiwat = so->so_rcv.sb_hiwat;
827 sbsnd_hiwat = so->so_snd.sb_hiwat;
828 sbrcv_flags = so->so_rcv.sb_flags;
829 sbsnd_flags = so->so_snd.sb_flags;
830 sbrcv_timeo = so->so_rcv.sb_timeo;
831 sbsnd_timeo = so->so_snd.sb_timeo;
833 sbdestroy(&so->so_snd, so);
834 sbdestroy(&so->so_rcv, so);
835 sx_destroy(&so->so_snd.sb_sx);
836 sx_destroy(&so->so_rcv.sb_sx);
837 SOCKBUF_LOCK_DESTROY(&so->so_snd);
838 SOCKBUF_LOCK_DESTROY(&so->so_rcv);
841 bzero(&so->so_rcv,
845 so->sol_sbrcv_lowat = sbrcv_lowat;
846 so->sol_sbsnd_lowat = sbsnd_lowat;
847 so->sol_sbrcv_hiwat = sbrcv_hiwat;
848 so->sol_sbsnd_hiwat = sbsnd_hiwat;
849 so->sol_sbrcv_flags = sbrcv_flags;
850 so->sol_sbsnd_flags = sbsnd_flags;
851 so->sol_sbrcv_timeo = sbrcv_timeo;
852 so->sol_sbsnd_timeo = sbsnd_timeo;
854 so->sol_qlen = so->sol_incqlen = 0;
855 TAILQ_INIT(&so->sol_incomp);
856 TAILQ_INIT(&so->sol_comp);
858 so->sol_accept_filter = NULL;
859 so->sol_accept_filter_arg = NULL;
860 so->sol_accept_filter_str = NULL;
862 so->sol_upcall = NULL;
863 so->sol_upcallarg = NULL;
865 so->so_options |= SO_ACCEPTCONN;
870 so->sol_qlimit = backlog;
905 struct socket *so; local
930 so = TAILQ_FIRST(&head->sol_comp);
931 SOCK_LOCK(so);
932 KASSERT(so->so_qstate == SQ_COMP,
933 ("%s: so %p not SQ_COMP", __func__, so));
934 soref(so);
936 so->so_qstate = SQ_NONE;
937 so->so_listen = NULL;
938 TAILQ_REMOVE(&head->sol_comp, so, so_list);
940 so->so_state |= (head->so_state & SS_NBIO);
942 so->so_state |= (flags & SOCK_NONBLOCK) ? SS_NBIO : 0;
943 SOCK_UNLOCK(so);
946 *ret = so;
971 sofree(struct socket *so) argument
973 struct protosw *pr = so->so_proto;
975 SOCK_LOCK_ASSERT(so);
977 if ((so->so_state & SS_NOFDREF) == 0 || so->so_count != 0 ||
978 (so->so_state & SS_PROTOREF) || (so->so_qstate == SQ_COMP)) {
979 SOCK_UNLOCK(so);
983 if (!SOLISTENING(so) && so->so_qstate == SQ_INCOMP) {
986 sol = so->so_listen;
987 KASSERT(sol, ("%s: so %p on incomp of NULL", __func__, so));
1004 soref(so);
1005 SOCK_UNLOCK(so);
1007 SOCK_LOCK(so);
1008 if (so->so_qstate == SQ_INCOMP) {
1009 KASSERT(so->so_listen == sol,
1011 __func__, so, sol));
1012 TAILQ_REMOVE(&sol->sol_incomp, so, so_list);
1016 so->so_qstate = SQ_NONE;
1017 so->so_listen = NULL;
1019 KASSERT(so->so_listen == NULL,
1021 __func__, so));
1023 KASSERT(so->so_count == 1,
1024 ("%s: so %p count %u", __func__, so, so->so_count));
1025 so->so_count = 0;
1027 if (SOLISTENING(so))
1028 so->so_error = ECONNABORTED;
1029 SOCK_UNLOCK(so);
1031 if (so->so_dtor != NULL)
1032 so->so_dtor(so);
1034 VNET_SO_ASSERT(so);
1036 (*pr->pr_domain->dom_dispose)(so);
1038 (*pr->pr_usrreqs->pru_detach)(so);
1054 if (!SOLISTENING(so)) {
1055 sbdestroy(&so->so_snd, so);
1056 sbdestroy(&so->so_rcv, so);
1058 seldrain(&so->so_rdsel);
1059 seldrain(&so->so_wrsel);
1060 knlist_destroy(&so->so_rdsel.si_note);
1061 knlist_destroy(&so->so_wrsel.si_note);
1062 sodealloc(so);
1074 soclose(struct socket *so) argument
1080 KASSERT(!(so->so_state & SS_NOFDREF), ("soclose: SS_NOFDREF on enter"));
1082 CURVNET_SET(so->so_vnet);
1083 funsetown(&so->so_sigio);
1084 if (so->so_state & SS_ISCONNECTED) {
1085 if ((so->so_state & SS_ISDISCONNECTING) == 0) {
1086 error = sodisconnect(so);
1093 if (so->so_options & SO_LINGER) {
1094 if ((so->so_state & SS_ISDISCONNECTING) &&
1095 (so->so_state & SS_NBIO))
1097 while (so->so_state & SS_ISCONNECTED) {
1098 error = tsleep(&so->so_timeo,
1100 so->so_linger * hz);
1108 if (so->so_proto->pr_usrreqs->pru_close != NULL)
1109 (*so->so_proto->pr_usrreqs->pru_close)(so);
1111 SOCK_LOCK(so);
1112 if ((listening = (so->so_options & SO_ACCEPTCONN))) {
1116 TAILQ_SWAP(&lqueue, &so->sol_incomp, socket, so_list);
1117 TAILQ_CONCAT(&lqueue, &so->sol_comp, so_list);
1119 so->sol_qlen = so->sol_incqlen = 0;
1127 refcount_release(&so->so_count);
1130 KASSERT((so->so_state & SS_NOFDREF) == 0, ("soclose: NOFDREF"));
1131 so->so_state |= SS_NOFDREF;
1132 sorele(so);
1165 soabort(struct socket *so) argument
1174 KASSERT(so->so_count == 0, ("soabort: so_count"));
1175 KASSERT((so->so_state & SS_PROTOREF) == 0, ("soabort: SS_PROTOREF"));
1176 KASSERT(so->so_state & SS_NOFDREF, ("soabort: !SS_NOFDREF"));
1177 VNET_SO_ASSERT(so);
1179 if (so->so_proto->pr_usrreqs->pru_abort != NULL)
1180 (*so->so_proto->pr_usrreqs->pru_abort)(so);
1181 SOCK_LOCK(so);
1182 sofree(so);
1186 soaccept(struct socket *so, struct sockaddr **nam) argument
1190 SOCK_LOCK(so);
1191 KASSERT((so->so_state & SS_NOFDREF) != 0, ("soaccept: !NOFDREF"));
1192 so->so_state &= ~SS_NOFDREF;
1193 SOCK_UNLOCK(so);
1195 CURVNET_SET(so->so_vnet);
1196 error = (*so->so_proto->pr_usrreqs->pru_accept)(so, nam);
1202 soconnect(struct socket *so, struct sockaddr *nam, struct thread *td) argument
1205 return (soconnectat(AT_FDCWD, so, nam, td));
1209 soconnectat(int fd, struct socket *so, struct sockaddr *nam, struct thread *td) argument
1213 if (so->so_options & SO_ACCEPTCONN)
1216 CURVNET_SET(so->so_vnet);
1222 if (so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING) &&
1223 ((so->so_proto->pr_flags & PR_CONNREQUIRED) ||
1224 (error = sodisconnect(so)))) {
1231 so->so_error = 0;
1233 error = (*so->so_proto->pr_usrreqs->pru_connect)(so,
1236 error = (*so->so_proto->pr_usrreqs->pru_connectat)(fd,
1237 so, nam, td);
1257 sodisconnect(struct socket *so) argument
1261 if ((so->so_state & SS_ISCONNECTED) == 0)
1263 if (so->so_state & SS_ISDISCONNECTING)
1265 VNET_SO_ASSERT(so);
1266 error = (*so->so_proto->pr_usrreqs->pru_disconnect)(so);
1273 sosend_dgram(struct socket *so, struct sockaddr *addr, struct uio *uio, argument
1280 KASSERT(so->so_type == SOCK_DGRAM, ("sosend_dgram: !SOCK_DGRAM"));
1281 KASSERT(so->so_proto->pr_flags & PR_ATOMIC,
1301 (flags & MSG_DONTROUTE) && (so->so_options & SO_DONTROUTE) == 0;
1307 SOCKBUF_LOCK(&so->so_snd);
1308 if (so->so_snd.sb_state & SBS_CANTSENDMORE) {
1309 SOCKBUF_UNLOCK(&so->so_snd);
1313 if (so->so_error) {
1314 error = so->so_error;
1315 so->so_error = 0;
1316 SOCKBUF_UNLOCK(&so->so_snd);
1319 if ((so->so_state & SS_ISCONNECTED) == 0) {
1325 if ((so->so_proto->pr_flags & PR_CONNREQUIRED) &&
1326 (so->so_proto->pr_flags & PR_IMPLOPCL) == 0) {
1327 if ((so->so_state & SS_ISCONFIRMING) == 0 &&
1329 SOCKBUF_UNLOCK(&so->so_snd);
1334 if (so->so_proto->pr_flags & PR_CONNREQUIRED)
1338 SOCKBUF_UNLOCK(&so->so_snd);
1347 space = sbspace(&so->so_snd);
1351 SOCKBUF_UNLOCK(&so->so_snd);
1381 SOCK_LOCK(so);
1382 so->so_options |= SO_DONTROUTE;
1383 SOCK_UNLOCK(so);
1393 VNET_SO_ASSERT(so);
1394 error = (*so->so_proto->pr_usrreqs->pru_send)(so,
1401 (so->so_proto->pr_flags & PR_IMPLOPCL) &&
1409 SOCK_LOCK(so);
1410 so->so_options &= ~SO_DONTROUTE;
1411 SOCK_UNLOCK(so);
1438 sosend_generic(struct socket *so, struct sockaddr *addr, struct uio *uio, argument
1444 int atomic = sosendallatonce(so) || top;
1460 if (resid < 0 || (so->so_type == SOCK_STREAM && (flags & MSG_EOR))) {
1466 (flags & MSG_DONTROUTE) && (so->so_options & SO_DONTROUTE) == 0 &&
1467 (so->so_proto->pr_flags & PR_ATOMIC);
1473 error = sblock(&so->so_snd, SBLOCKWAIT(flags));
1479 SOCKBUF_LOCK(&so->so_snd);
1480 if (so->so_snd.sb_state & SBS_CANTSENDMORE) {
1481 SOCKBUF_UNLOCK(&so->so_snd);
1485 if (so->so_error) {
1486 error = so->so_error;
1487 so->so_error = 0;
1488 SOCKBUF_UNLOCK(&so->so_snd);
1491 if ((so->so_state & SS_ISCONNECTED) == 0) {
1498 if ((so->so_proto->pr_flags & PR_CONNREQUIRED) &&
1499 (so->so_proto->pr_flags & PR_IMPLOPCL) == 0) {
1500 if ((so->so_state & SS_ISCONFIRMING) == 0 &&
1502 SOCKBUF_UNLOCK(&so->so_snd);
1507 SOCKBUF_UNLOCK(&so->so_snd);
1508 if (so->so_proto->pr_flags & PR_CONNREQUIRED)
1515 space = sbspace(&so->so_snd);
1518 if ((atomic && resid > so->so_snd.sb_hiwat) ||
1519 clen > so->so_snd.sb_hiwat) {
1520 SOCKBUF_UNLOCK(&so->so_snd);
1525 (atomic || space < so->so_snd.sb_lowat || space < clen)) {
1526 if ((so->so_state & SS_NBIO) ||
1528 SOCKBUF_UNLOCK(&so->so_snd);
1532 error = sbwait(&so->so_snd);
1533 SOCKBUF_UNLOCK(&so->so_snd);
1538 SOCKBUF_UNLOCK(&so->so_snd);
1566 SOCK_LOCK(so);
1567 so->so_options |= SO_DONTROUTE;
1568 SOCK_UNLOCK(so);
1580 VNET_SO_ASSERT(so);
1581 error = (*so->so_proto->pr_usrreqs->pru_send)(so,
1589 (so->so_proto->pr_flags & PR_IMPLOPCL) &&
1597 SOCK_LOCK(so);
1598 so->so_options &= ~SO_DONTROUTE;
1599 SOCK_UNLOCK(so);
1610 sbunlock(&so->so_snd);
1620 sosend(struct socket *so, struct sockaddr *addr, struct uio *uio, argument
1625 CURVNET_SET(so->so_vnet);
1626 if (!SOLISTENING(so))
1627 error = so->so_proto->pr_usrreqs->pru_sosend(so, addr, uio,
1647 soreceive_rcvoob(struct socket *so, struct uio *uio, int flags) argument
1649 struct protosw *pr = so->so_proto;
1654 VNET_SO_ASSERT(so);
1657 error = (*pr->pr_usrreqs->pru_rcvoob)(so, m, flags & MSG_PEEK);
1723 soreceive_generic(struct socket *so, struct sockaddr **psa, struct uio *uio, argument
1729 struct protosw *pr = so->so_proto;
1744 return (soreceive_rcvoob(so, uio, flags));
1747 if ((pr->pr_flags & PR_WANTRCVD) && (so->so_state & SS_ISCONFIRMING)
1749 VNET_SO_ASSERT(so);
1750 (*pr->pr_usrreqs->pru_rcvd)(so, 0);
1753 error = sblock(&so->so_rcv, SBLOCKWAIT(flags));
1758 SOCKBUF_LOCK(&so->so_rcv);
1759 m = so->so_rcv.sb_mb;
1767 sbavail(&so->so_rcv) < uio->uio_resid) &&
1768 sbavail(&so->so_rcv) < so->so_rcv.sb_lowat &&
1770 KASSERT(m != NULL || !sbavail(&so->so_rcv),
1772 m, sbavail(&so->so_rcv)));
1773 if (so->so_error) {
1776 error = so->so_error;
1778 so->so_error = 0;
1779 SOCKBUF_UNLOCK(&so->so_rcv);
1782 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
1783 if (so->so_rcv.sb_state & SBS_CANTRCVMORE) {
1785 SOCKBUF_UNLOCK(&so->so_rcv);
1792 m = so->so_rcv.sb_mb;
1795 if ((so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING)) == 0 &&
1796 (so->so_proto->pr_flags & PR_CONNREQUIRED)) {
1797 SOCKBUF_UNLOCK(&so->so_rcv);
1802 SOCKBUF_UNLOCK(&so->so_rcv);
1805 if ((so->so_state & SS_NBIO) ||
1807 SOCKBUF_UNLOCK(&so->so_rcv);
1811 SBLASTRECORDCHK(&so->so_rcv);
1812 SBLASTMBUFCHK(&so->so_rcv);
1813 error = sbwait(&so->so_rcv);
1814 SOCKBUF_UNLOCK(&so->so_rcv);
1835 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
1838 KASSERT(m == so->so_rcv.sb_mb, ("soreceive: m != so->so_rcv.sb_mb"));
1839 SBLASTRECORDCHK(&so->so_rcv);
1840 SBLASTMBUFCHK(&so->so_rcv);
1852 sbfree(&so->so_rcv, m);
1853 so->so_rcv.sb_mb = m_free(m);
1854 m = so->so_rcv.sb_mb;
1855 sockbuf_pushsync(&so->so_rcv, nextrecord);
1878 sbfree(&so->so_rcv, m);
1879 so->so_rcv.sb_mb = m->m_next;
1883 m = so->so_rcv.sb_mb;
1887 sockbuf_pushsync(&so->so_rcv, nextrecord);
1892 SOCKBUF_UNLOCK(&so->so_rcv);
1893 VNET_SO_ASSERT(so);
1896 SOCKBUF_LOCK(&so->so_rcv);
1909 nextrecord = so->so_rcv.sb_mb->m_nextpkt;
1911 nextrecord = so->so_rcv.sb_mb;
1919 KASSERT(so->so_rcv.sb_mb == m,
1921 KASSERT(so->so_rcv.sb_lastrecord == m,
1930 KASSERT(so->so_rcv.sb_mb == nextrecord,
1932 if (so->so_rcv.sb_mb == NULL) {
1933 KASSERT(so->so_rcv.sb_lastrecord == NULL,
1938 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
1939 SBLASTRECORDCHK(&so->so_rcv);
1940 SBLASTMBUFCHK(&so->so_rcv);
1958 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
1967 so->so_rcv.sb_state &= ~SBS_RCVATMARK;
1969 if (so->so_oobmark && len > so->so_oobmark - offset)
1970 len = so->so_oobmark - offset;
1981 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
1982 SBLASTRECORDCHK(&so->so_rcv);
1983 SBLASTMBUFCHK(&so->so_rcv);
1984 SOCKBUF_UNLOCK(&so->so_rcv);
1986 SOCKBUF_LOCK(&so->so_rcv);
1998 (void)sbdroprecord_locked(&so->so_rcv);
1999 SOCKBUF_UNLOCK(&so->so_rcv);
2004 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
2013 sbfree(&so->so_rcv, m);
2018 so->so_rcv.sb_mb = m = m->m_next;
2021 so->so_rcv.sb_mb = m_free(m);
2022 m = so->so_rcv.sb_mb;
2024 sockbuf_pushsync(&so->so_rcv, nextrecord);
2025 SBLASTRECORDCHK(&so->so_rcv);
2026 SBLASTMBUFCHK(&so->so_rcv);
2050 SOCKBUF_UNLOCK(&so->so_rcv);
2053 SOCKBUF_LOCK(&so->so_rcv);
2056 sbcut_locked(&so->so_rcv, len);
2059 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
2060 if (so->so_oobmark) {
2062 so->so_oobmark -= len;
2063 if (so->so_oobmark == 0) {
2064 so->so_rcv.sb_state |= SBS_RCVATMARK;
2069 if (offset == so->so_oobmark)
2083 !sosendallatonce(so) && nextrecord == NULL) {
2084 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
2085 if (so->so_error ||
2086 so->so_rcv.sb_state & SBS_CANTRCVMORE)
2093 SOCKBUF_UNLOCK(&so->so_rcv);
2094 VNET_SO_ASSERT(so);
2095 (*pr->pr_usrreqs->pru_rcvd)(so, flags);
2096 SOCKBUF_LOCK(&so->so_rcv);
2098 SBLASTRECORDCHK(&so->so_rcv);
2099 SBLASTMBUFCHK(&so->so_rcv);
2104 if (so->so_rcv.sb_mb == NULL) {
2105 error = sbwait(&so->so_rcv);
2107 SOCKBUF_UNLOCK(&so->so_rcv);
2111 m = so->so_rcv.sb_mb;
2117 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
2121 (void) sbdroprecord_locked(&so->so_rcv);
2130 so->so_rcv.sb_mb = nextrecord;
2131 if (so->so_rcv.sb_mb == NULL) {
2132 so->so_rcv.sb_mbtail = NULL;
2133 so->so_rcv.sb_lastrecord = NULL;
2135 so->so_rcv.sb_lastrecord = nextrecord;
2137 SBLASTRECORDCHK(&so->so_rcv);
2138 SBLASTMBUFCHK(&so->so_rcv);
2146 SOCKBUF_UNLOCK(&so->so_rcv);
2147 VNET_SO_ASSERT(so);
2148 (*pr->pr_usrreqs->pru_rcvd)(so, flags);
2149 SOCKBUF_LOCK(&so->so_rcv);
2152 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
2154 (flags & MSG_EOR) == 0 && (so->so_rcv.sb_state & SBS_CANTRCVMORE) == 0) {
2155 SOCKBUF_UNLOCK(&so->so_rcv);
2158 SOCKBUF_UNLOCK(&so->so_rcv);
2163 sbunlock(&so->so_rcv);
2171 soreceive_stream(struct socket *so, struct sockaddr **psa, struct uio *uio, argument
2179 if (so->so_type != SOCK_STREAM)
2190 return (soreceive_rcvoob(so, uio, flags));
2194 sb = &so->so_rcv;
2210 if (!(so->so_state & (SS_ISCONNECTED|SS_ISDISCONNECTED))) {
2216 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
2219 if (so->so_error) {
2224 error = so->so_error;
2226 so->so_error = 0;
2240 ((so->so_state & SS_NBIO) || (flags & (MSG_DONTWAIT|MSG_NBIO)))) {
2247 ((so->so_state & SS_NBIO) ||
2270 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
2342 if ((so->so_proto->pr_flags & PR_WANTRCVD) &&
2346 VNET_SO_ASSERT(so);
2347 (*so->so_proto->pr_usrreqs->pru_rcvd)(so, flags);
2374 soreceive_dgram(struct socket *so, struct sockaddr **psa, struct uio *uio, argument
2380 struct protosw *pr = so->so_proto;
2397 return (soreceive_generic(so, psa, uio, mp0, controlp,
2406 KASSERT((so->so_rcv.sb_state & SBS_RCVATMARK) == 0,
2408 KASSERT((so->so_proto->pr_flags & PR_CONNREQUIRED) == 0,
2414 SOCKBUF_LOCK(&so->so_rcv);
2415 while ((m = so->so_rcv.sb_mb) == NULL) {
2416 KASSERT(sbavail(&so->so_rcv) == 0,
2418 sbavail(&so->so_rcv)));
2419 if (so->so_error) {
2420 error = so->so_error;
2421 so->so_error = 0;
2422 SOCKBUF_UNLOCK(&so->so_rcv);
2425 if (so->so_rcv.sb_state & SBS_CANTRCVMORE ||
2427 SOCKBUF_UNLOCK(&so->so_rcv);
2430 if ((so->so_state & SS_NBIO) ||
2432 SOCKBUF_UNLOCK(&so->so_rcv);
2435 SBLASTRECORDCHK(&so->so_rcv);
2436 SBLASTMBUFCHK(&so->so_rcv);
2437 error = sbwait(&so->so_rcv);
2439 SOCKBUF_UNLOCK(&so->so_rcv);
2443 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
2447 SBLASTRECORDCHK(&so->so_rcv);
2448 SBLASTMBUFCHK(&so->so_rcv);
2451 KASSERT(so->so_rcv.sb_lastrecord == m,
2455 KASSERT(so->so_rcv.sb_mb->m_nextpkt == nextrecord,
2461 so->so_rcv.sb_mb = NULL;
2462 sockbuf_pushsync(&so->so_rcv, nextrecord);
2468 sbfree(&so->so_rcv, m2);
2473 SBLASTRECORDCHK(&so->so_rcv);
2474 SBLASTMBUFCHK(&so->so_rcv);
2475 SOCKBUF_UNLOCK(&so->so_rcv);
2556 soreceive(struct socket *so, struct sockaddr **psa, struct uio *uio, argument
2561 CURVNET_SET(so->so_vnet);
2562 if (!SOLISTENING(so))
2563 error = (so->so_proto->pr_usrreqs->pru_soreceive(so, psa, uio,
2572 soshutdown(struct socket *so, int how) argument
2574 struct protosw *pr = so->so_proto;
2581 if ((so->so_state &
2592 if (so->so_type != SOCK_DGRAM && !SOLISTENING(so))
2597 if (SOLISTENING(so)) {
2599 SOLISTEN_LOCK(so);
2600 so->so_error = ECONNABORTED;
2601 solisten_wakeup(so); /* unlocks so */
2606 CURVNET_SET(so->so_vnet);
2608 (*pr->pr_usrreqs->pru_flush)(so, how);
2610 sorflush(so);
2612 error = (*pr->pr_usrreqs->pru_shutdown)(so);
2613 wakeup(&so->so_timeo);
2617 wakeup(&so->so_timeo);
2625 sorflush(struct socket *so) argument
2627 struct sockbuf *sb = &so->so_rcv;
2628 struct protosw *pr = so->so_proto;
2631 VNET_SO_ASSERT(so);
2646 socantrcvmore(so);
2655 aso.so_pcb = so->so_pcb;
2669 sbrelease_internal(&aso.so_rcv, so);
2677 hhook_run_socket(struct socket *so, void *hctx, int32_t h_id) argument
2680 .so = so,
2686 CURVNET_SET(so->so_vnet);
2687 HHOOKS_RUN_IF(V_socket_hhh[h_id], &hhook_data, &so->osd);
2730 so_setsockopt(struct socket *so, int level, int optname, void *optval, argument
2741 return (sosetopt(so, &sopt));
2745 sosetopt(struct socket *so, struct sockopt *sopt) argument
2756 CURVNET_SET(so->so_vnet);
2759 if (so->so_proto->pr_ctloutput != NULL) {
2760 error = (*so->so_proto->pr_ctloutput)(so, sopt);
2768 error = accept_filt_setopt(so, sopt);
2783 SOCK_LOCK(so);
2784 so->so_linger = l.l_linger;
2786 so->so_options |= SO_LINGER;
2788 so->so_options &= ~SO_LINGER;
2789 SOCK_UNLOCK(so);
2810 SOCK_LOCK(so);
2812 so->so_options |= sopt->sopt_name;
2814 so->so_options &= ~sopt->sopt_name;
2815 SOCK_UNLOCK(so);
2828 if (((so->so_proto->pr_domain->dom_family == PF_INET) ||
2829 (so->so_proto->pr_domain->dom_family == PF_INET6) ||
2830 (so->so_proto->pr_domain->dom_family == PF_ROUTE)))
2831 so->so_fibnum = optval;
2833 so->so_fibnum = 0;
2841 so->so_user_cookie = val32;
2862 error = sbsetopt(so, sopt->sopt_name, optval);
2892 so->so_snd.sb_timeo = val;
2895 so->so_rcv.sb_timeo = val;
2907 so, &extmac);
2922 so->so_ts_clock = optval;
2930 so->so_max_pacing_rate = val32;
2935 error = hhook_run_socket(so, sopt,
2941 if (error == 0 && so->so_proto->pr_ctloutput != NULL)
2942 (void)(*so->so_proto->pr_ctloutput)(so, sopt);
2980 sogetopt(struct socket *so, struct sockopt *sopt) argument
2989 CURVNET_SET(so->so_vnet);
2992 if (so->so_proto->pr_ctloutput != NULL)
2993 error = (*so->so_proto->pr_ctloutput)(so, sopt);
3001 error = accept_filt_getopt(so, sopt);
3005 SOCK_LOCK(so);
3006 l.l_onoff = so->so_options & SO_LINGER;
3007 l.l_linger = so->so_linger;
3008 SOCK_UNLOCK(so);
3025 optval = so->so_options & sopt->sopt_name;
3031 optval = so->so_proto->pr_domain->dom_family;
3035 optval = so->so_type;
3039 optval = so->so_proto->pr_protocol;
3043 SOCK_LOCK(so);
3044 optval = so->so_error;
3045 so->so_error = 0;
3046 SOCK_UNLOCK(so);
3050 optval = SOLISTENING(so) ? so->sol_sbsnd_hiwat :
3051 so->so_snd.sb_hiwat;
3055 optval = SOLISTENING(so) ? so->sol_sbrcv_hiwat :
3056 so->so_rcv.sb_hiwat;
3060 optval = SOLISTENING(so) ? so->sol_sbsnd_lowat :
3061 so->so_snd.sb_lowat;
3065 optval = SOLISTENING(so) ? so->sol_sbrcv_lowat :
3066 so->so_rcv.sb_lowat;
3072 so->so_snd.sb_timeo : so->so_rcv.sb_timeo);
3092 so, &extmac);
3108 sopt->sopt_td->td_ucred, so, &extmac);
3118 optval = SOLISTENING(so) ? so->sol_qlimit : 0;
3122 optval = SOLISTENING(so) ? so->sol_qlen : 0;
3126 optval = SOLISTENING(so) ? so->sol_incqlen : 0;
3130 optval = so->so_ts_clock;
3134 optval = so->so_max_pacing_rate;
3139 error = hhook_run_socket(so, sopt,
3268 sohasoutofband(struct socket *so) argument
3271 if (so->so_sigio != NULL)
3272 pgsigio(&so->so_sigio, SIGURG, 0);
3273 selwakeuppri(&so->so_rdsel, PSOCK);
3277 sopoll(struct socket *so, int events, struct ucred *active_cred, argument
3285 return (so->so_proto->pr_usrreqs->pru_sopoll(so, events, active_cred,
3290 sopoll_generic(struct socket *so, int events, struct ucred *active_cred, argument
3295 SOCK_LOCK(so);
3296 if (SOLISTENING(so)) {
3299 else if (!TAILQ_EMPTY(&so->sol_comp))
3301 else if ((events & POLLINIGNEOF) == 0 && so->so_error)
3304 selrecord(td, &so->so_rdsel);
3309 SOCKBUF_LOCK(&so->so_snd);
3310 SOCKBUF_LOCK(&so->so_rcv);
3312 if (soreadabledata(so))
3315 if (sowriteable(so))
3318 if (so->so_oobmark ||
3319 (so->so_rcv.sb_state & SBS_RCVATMARK))
3322 if (so->so_rcv.sb_state & SBS_CANTRCVMORE) {
3324 if (so->so_snd.sb_state & SBS_CANTSENDMORE)
3331 selrecord(td, &so->so_rdsel);
3332 so->so_rcv.sb_flags |= SB_SEL;
3335 selrecord(td, &so->so_wrsel);
3336 so->so_snd.sb_flags |= SB_SEL;
3339 SOCKBUF_UNLOCK(&so->so_rcv);
3340 SOCKBUF_UNLOCK(&so->so_snd);
3342 SOCK_UNLOCK(so);
3349 struct socket *so = kn->kn_fp->f_data; local
3356 knl = &so->so_rdsel.si_note;
3357 sb = &so->so_rcv;
3361 knl = &so->so_wrsel.si_note;
3362 sb = &so->so_snd;
3366 knl = &so->so_wrsel.si_note;
3367 sb = &so->so_snd;
3373 SOCK_LOCK(so);
3374 if (SOLISTENING(so)) {
3382 SOCK_UNLOCK(so);
3391 pru_accept_notsupp(struct socket *so, struct sockaddr **nam) argument
3398 pru_aio_queue_notsupp(struct socket *so, struct kaiocb *job) argument
3405 pru_attach_notsupp(struct socket *so, int proto, struct thread *td) argument
3412 pru_bind_notsupp(struct socket *so, struct sockaddr *nam, struct thread *td) argument
3419 pru_bindat_notsupp(int fd, struct socket *so, struct sockaddr *nam, argument
3427 pru_connect_notsupp(struct socket *so, struct sockaddr *nam, struct thread *td) argument
3434 pru_connectat_notsupp(int fd, struct socket *so, struct sockaddr *nam, argument
3449 pru_control_notsupp(struct socket *so, u_long cmd, caddr_t data, argument
3457 pru_disconnect_notsupp(struct socket *so) argument
3464 pru_listen_notsupp(struct socket *so, int backlog, struct thread *td) argument
3471 pru_peeraddr_notsupp(struct socket *so, struct sockaddr **nam) argument
3478 pru_rcvd_notsupp(struct socket *so, int flags) argument
3485 pru_rcvoob_notsupp(struct socket *so, struct mbuf *m, int flags) argument
3492 pru_send_notsupp(struct socket *so, int flags, struct mbuf *m, argument
3500 pru_ready_notsupp(struct socket *so, struct mbuf *m, int count) argument
3511 pru_sense_null(struct socket *so, struct stat *sb) argument
3514 sb->st_blksize = so->so_snd.sb_hiwat;
3519 pru_shutdown_notsupp(struct socket *so) argument
3526 pru_sockaddr_notsupp(struct socket *so, struct sockaddr **nam) argument
3533 pru_sosend_notsupp(struct socket *so, struct sockaddr *addr, struct uio *uio, argument
3541 pru_soreceive_notsupp(struct socket *so, struct sockaddr **paddr, argument
3549 pru_sopoll_notsupp(struct socket *so, int events, struct ucred *cred, argument
3559 struct socket *so = kn->kn_fp->f_data; local
3561 so_rdknl_lock(so);
3562 knlist_remove(&so->so_rdsel.si_note, kn, 1);
3563 if (!SOLISTENING(so) && knlist_empty(&so->so_rdsel.si_note))
3564 so->so_rcv.sb_flags &= ~SB_KNOTE;
3565 so_rdknl_unlock(so);
3572 struct socket *so; local
3574 so = kn->kn_fp->f_data;
3576 if (SOLISTENING(so)) {
3577 SOCK_LOCK_ASSERT(so);
3578 kn->kn_data = so->sol_qlen;
3579 if (so->so_error) {
3581 kn->kn_fflags = so->so_error;
3584 return (!TAILQ_EMPTY(&so->sol_comp));
3587 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
3589 kn->kn_data = sbavail(&so->so_rcv) - so->so_rcv.sb_ctl;
3590 if (so->so_rcv.sb_state & SBS_CANTRCVMORE) {
3592 kn->kn_fflags = so->so_error;
3594 } else if (so->so_error) /* temporary udp error */
3600 } else if (sbavail(&so->so_rcv) >= so->so_rcv.sb_lowat)
3604 return (hhook_run_socket(so, NULL, HHOOK_FILT_SOREAD));
3610 struct socket *so = kn->kn_fp->f_data; local
3612 so_wrknl_lock(so);
3613 knlist_remove(&so->so_wrsel.si_note, kn, 1);
3614 if (!SOLISTENING(so) && knlist_empty(&so->so_wrsel.si_note))
3615 so->so_snd.sb_flags &= ~SB_KNOTE;
3616 so_wrknl_unlock(so);
3623 struct socket *so; local
3625 so = kn->kn_fp->f_data;
3627 if (SOLISTENING(so))
3630 SOCKBUF_LOCK_ASSERT(&so->so_snd);
3631 kn->kn_data = sbspace(&so->so_snd);
3633 hhook_run_socket(so, kn, HHOOK_FILT_SOWRITE);
3635 if (so->so_snd.sb_state & SBS_CANTSENDMORE) {
3637 kn->kn_fflags = so->so_error;
3639 } else if (so->so_error) /* temporary udp error */
3641 else if (((so->so_state & SS_ISCONNECTED) == 0) &&
3642 (so->so_proto->pr_flags & PR_CONNREQUIRED))
3647 return (kn->kn_data >= so->so_snd.sb_lowat);
3653 struct socket *so; local
3655 so = kn->kn_fp->f_data;
3657 if (SOLISTENING(so))
3660 SOCKBUF_LOCK_ASSERT(&so->so_snd);
3661 kn->kn_data = sbused(&so->so_snd);
3670 socheckuid(struct socket *so, uid_t uid) argument
3673 if (so == NULL)
3675 if (so->so_cred->cr_uid != uid)
3713 soisconnecting(struct socket *so) argument
3716 SOCK_LOCK(so);
3717 so->so_state &= ~(SS_ISCONNECTED|SS_ISDISCONNECTING);
3718 so->so_state |= SS_ISCONNECTING;
3719 SOCK_UNLOCK(so);
3723 soisconnected(struct socket *so) argument
3726 SOCK_LOCK(so);
3727 so->so_state &= ~(SS_ISCONNECTING|SS_ISDISCONNECTING|SS_ISCONFIRMING);
3728 so->so_state |= SS_ISCONNECTED;
3730 if (so->so_qstate == SQ_INCOMP) {
3731 struct socket *head = so->so_listen;
3734 KASSERT(head, ("%s: so %p on incomp of NULL", __func__, so));
3744 SOCK_UNLOCK(so);
3746 SOCK_LOCK(so);
3747 if (__predict_false(head != so->so_listen)) {
3753 SOCK_UNLOCK(so);
3761 if ((so->so_options & SO_ACCEPTFILTER) == 0) {
3762 TAILQ_REMOVE(&head->sol_incomp, so, so_list);
3764 TAILQ_INSERT_TAIL(&head->sol_comp, so, so_list);
3766 so->so_qstate = SQ_COMP;
3767 SOCK_UNLOCK(so);
3770 SOCKBUF_LOCK(&so->so_rcv);
3771 soupcall_set(so, SO_RCV,
3774 so->so_options &= ~SO_ACCEPTFILTER;
3775 ret = head->sol_accept_filter->accf_callback(so,
3778 soupcall_clear(so, SO_RCV);
3779 SOCKBUF_UNLOCK(&so->so_rcv);
3782 SOCKBUF_UNLOCK(&so->so_rcv);
3783 SOCK_UNLOCK(so);
3788 SOCK_UNLOCK(so);
3789 wakeup(&so->so_timeo);
3790 sorwakeup(so);
3791 sowwakeup(so);
3795 soisdisconnecting(struct socket *so) argument
3798 SOCK_LOCK(so);
3799 so->so_state &= ~SS_ISCONNECTING;
3800 so->so_state |= SS_ISDISCONNECTING;
3802 if (!SOLISTENING(so)) {
3803 SOCKBUF_LOCK(&so->so_rcv);
3804 socantrcvmore_locked(so);
3805 SOCKBUF_LOCK(&so->so_snd);
3806 socantsendmore_locked(so);
3808 SOCK_UNLOCK(so);
3809 wakeup(&so->so_timeo);
3813 soisdisconnected(struct socket *so) argument
3816 SOCK_LOCK(so);
3817 so->so_state &= ~(SS_ISCONNECTING|SS_ISCONNECTED|SS_ISDISCONNECTING);
3818 so->so_state |= SS_ISDISCONNECTED;
3820 if (!SOLISTENING(so)) {
3821 SOCK_UNLOCK(so);
3822 SOCKBUF_LOCK(&so->so_rcv);
3823 socantrcvmore_locked(so);
3824 SOCKBUF_LOCK(&so->so_snd);
3825 sbdrop_locked(&so->so_snd, sbused(&so->so_snd));
3826 socantsendmore_locked(so);
3828 SOCK_UNLOCK(so);
3829 wakeup(&so->so_timeo);
3850 sodtor_set(struct socket *so, so_dtor_t *func) argument
3853 SOCK_LOCK_ASSERT(so);
3854 so->so_dtor = func;
3861 soupcall_set(struct socket *so, int which, so_upcall_t func, void *arg) argument
3865 KASSERT(!SOLISTENING(so), ("%s: so %p listening", __func__, so));
3869 sb = &so->so_rcv;
3872 sb = &so->so_snd;
3884 soupcall_clear(struct socket *so, int which) argument
3888 KASSERT(!SOLISTENING(so), ("%s: so %p listening", __func__, so));
3892 sb = &so->so_rcv;
3895 sb = &so->so_snd;
3902 ("%s: so %p no upcall to clear", __func__, so));
3909 solisten_upcall_set(struct socket *so, so_upcall_t func, void *arg) argument
3912 SOLISTEN_LOCK_ASSERT(so);
3913 so->sol_upcall = func;
3914 so->sol_upcallarg = arg;
3920 struct socket *so = arg; local
3922 if (SOLISTENING(so))
3923 SOCK_LOCK(so);
3925 SOCKBUF_LOCK(&so->so_rcv);
3931 struct socket *so = arg; local
3933 if (SOLISTENING(so))
3934 SOCK_UNLOCK(so);
3936 SOCKBUF_UNLOCK(&so->so_rcv);
3942 struct socket *so = arg; local
3944 if (SOLISTENING(so))
3945 SOCK_LOCK_ASSERT(so);
3947 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
3953 struct socket *so = arg; local
3955 if (SOLISTENING(so))
3956 SOCK_UNLOCK_ASSERT(so);
3958 SOCKBUF_UNLOCK_ASSERT(&so->so_rcv);
3964 struct socket *so = arg; local
3966 if (SOLISTENING(so))
3967 SOCK_LOCK(so);
3969 SOCKBUF_LOCK(&so->so_snd);
3975 struct socket *so = arg; local
3977 if (SOLISTENING(so))
3978 SOCK_UNLOCK(so);
3980 SOCKBUF_UNLOCK(&so->so_snd);
3986 struct socket *so = arg; local
3988 if (SOLISTENING(so))
3989 SOCK_LOCK_ASSERT(so);
3991 SOCKBUF_LOCK_ASSERT(&so->so_snd);
3997 struct socket *so = arg; local
3999 if (SOLISTENING(so))
4000 SOCK_UNLOCK_ASSERT(so);
4002 SOCKBUF_UNLOCK_ASSERT(&so->so_snd);
4014 sotoxsocket(struct socket *so, struct xsocket *xso) argument
4019 xso->xso_so = (uintptr_t)so;
4020 xso->so_type = so->so_type;
4021 xso->so_options = so->so_options;
4022 xso->so_linger = so->so_linger;
4023 xso->so_state = so->so_state;
4024 xso->so_pcb = (uintptr_t)so->so_pcb;
4025 xso->xso_protocol = so->so_proto->pr_protocol;
4026 xso->xso_family = so->so_proto->pr_domain->dom_family;
4027 xso->so_timeo = so->so_timeo;
4028 xso->so_error = so->so_error;
4029 xso->so_uid = so->so_cred->cr_uid;
4030 xso->so_pgid = so->so_sigio ? so->so_sigio->sio_pgid : 0;
4031 if (SOLISTENING(so)) {
4032 xso->so_qlen = so->sol_qlen;
4033 xso->so_incqlen = so->sol_incqlen;
4034 xso->so_qlimit = so->sol_qlimit;
4037 xso->so_state |= so->so_qstate;
4039 xso->so_oobmark = so->so_oobmark;
4040 sbtoxsockbuf(&so->so_snd, &xso->so_snd);
4041 sbtoxsockbuf(&so->so_rcv, &xso->so_rcv);
4046 so_sockbuf_rcv(struct socket *so) argument
4049 return (&so->so_rcv);
4053 so_sockbuf_snd(struct socket *so) argument
4056 return (&so->so_snd);
4060 so_state_get(const struct socket *so) argument
4063 return (so->so_state);
4067 so_state_set(struct socket *so, int val) argument
4070 so->so_state = val;
4074 so_options_get(const struct socket *so) argument
4077 return (so->so_options);
4081 so_options_set(struct socket *so, int val) argument
4084 so->so_options = val;
4088 so_error_get(const struct socket *so) argument
4091 return (so->so_error);
4095 so_error_set(struct socket *so, int val) argument
4098 so->so_error = val;
4102 so_linger_get(const struct socket *so) argument
4105 return (so->so_linger);
4109 so_linger_set(struct socket *so, int val) argument
4115 so->so_linger = val;
4119 so_protosw_get(const struct socket *so) argument
4122 return (so->so_proto);
4126 so_protosw_set(struct socket *so, struct protosw *val) argument
4129 so->so_proto = val;
4133 so_sorwakeup(struct socket *so) argument
4136 sorwakeup(so);
4140 so_sowwakeup(struct socket *so) argument
4143 sowwakeup(so);
4147 so_sorwakeup_locked(struct socket *so) argument
4150 sorwakeup_locked(so);
4154 so_sowwakeup_locked(struct socket *so) argument
4157 sowwakeup_locked(so);
4161 so_lock(struct socket *so) argument
4164 SOCK_LOCK(so);
4168 so_unlock(struct socket *so) argument
4171 SOCK_UNLOCK(so);