Lines Matching full:so
166 static int soreceive_generic_locked(struct socket *so,
169 static int soreceive_rcvoob(struct socket *so, struct uio *uio,
171 static int soreceive_stream_locked(struct socket *so, struct sockbuf *sb,
174 static int sosend_generic_locked(struct socket *so, struct sockaddr *addr,
211 #define VNET_SO_ASSERT(so) \ argument
213 ("%s:%d curvnet is NULL, so=%p", __func__, __LINE__, (so)));
257 * The purpose of the UINT_MAX / 3 limit, is so that the formula in sysctl_somaxconn()
347 static int so_unsplice(struct socket *so, bool timeout);
754 * of the change so that they can update their dependent limits as required.
795 struct socket *so; in soalloc() local
797 so = uma_zalloc(socket_zone, M_NOWAIT | M_ZERO); in soalloc()
798 if (so == NULL) in soalloc()
801 if (mac_socket_init(so, M_NOWAIT) != 0) { in soalloc()
802 uma_zfree(socket_zone, so); in soalloc()
806 if (khelp_init_osd(HELPER_CLASS_SOCKET, &so->osd)) { in soalloc()
807 uma_zfree(socket_zone, so); in soalloc()
814 * a feature to change class of an existing lock, so we use DUPOK. in soalloc()
816 mtx_init(&so->so_lock, "socket", NULL, MTX_DEF | MTX_DUPOK); in soalloc()
817 mtx_init(&so->so_snd_mtx, "so_snd", NULL, MTX_DEF); in soalloc()
818 mtx_init(&so->so_rcv_mtx, "so_rcv", NULL, MTX_DEF); in soalloc()
819 so->so_rcv.sb_sel = &so->so_rdsel; in soalloc()
820 so->so_snd.sb_sel = &so->so_wrsel; in soalloc()
821 sx_init(&so->so_snd_sx, "so_snd_sx"); in soalloc()
822 sx_init(&so->so_rcv_sx, "so_rcv_sx"); in soalloc()
823 TAILQ_INIT(&so->so_snd.sb_aiojobq); in soalloc()
824 TAILQ_INIT(&so->so_rcv.sb_aiojobq); in soalloc()
825 TASK_INIT(&so->so_snd.sb_aiotask, 0, soaio_snd, so); in soalloc()
826 TASK_INIT(&so->so_rcv.sb_aiotask, 0, soaio_rcv, so); in soalloc()
828 VNET_ASSERT(vnet != NULL, ("%s:%d vnet is NULL, so=%p", in soalloc()
829 __func__, __LINE__, so)); in soalloc()
830 so->so_vnet = vnet; in soalloc()
834 if (hhook_run_socket(so, NULL, HHOOK_SOCKET_CREATE)) { in soalloc()
836 uma_zfree(socket_zone, so); in soalloc()
841 so->so_gencnt = ++so_gencnt; in soalloc()
848 return (so); in soalloc()
857 sodealloc(struct socket *so) in sodealloc() argument
860 KASSERT(so->so_count == 0, ("sodealloc(): so_count %d", so->so_count)); in sodealloc()
861 KASSERT(so->so_pcb == NULL, ("sodealloc(): so_pcb != NULL")); in sodealloc()
864 so->so_gencnt = ++so_gencnt; in sodealloc()
867 VNET_ASSERT(so->so_vnet != NULL, ("%s:%d so_vnet is NULL, so=%p", in sodealloc()
868 __func__, __LINE__, so)); in sodealloc()
869 so->so_vnet->vnet_sockcnt--; in sodealloc()
873 mac_socket_destroy(so); in sodealloc()
876 hhook_run_socket(so, NULL, HHOOK_SOCKET_CLOSE); in sodealloc()
879 khelp_destroy_osd(&so->osd); in sodealloc()
880 if (SOLISTENING(so)) { in sodealloc()
881 if (so->sol_accept_filter != NULL) in sodealloc()
882 accept_filt_setopt(so, NULL); in sodealloc()
884 if (so->so_rcv.sb_hiwat) in sodealloc()
885 (void)chgsbsize(so->so_cred->cr_uidinfo, in sodealloc()
886 &so->so_rcv.sb_hiwat, 0, RLIM_INFINITY); in sodealloc()
887 if (so->so_snd.sb_hiwat) in sodealloc()
888 (void)chgsbsize(so->so_cred->cr_uidinfo, in sodealloc()
889 &so->so_snd.sb_hiwat, 0, RLIM_INFINITY); in sodealloc()
890 sx_destroy(&so->so_snd_sx); in sodealloc()
891 sx_destroy(&so->so_rcv_sx); in sodealloc()
892 mtx_destroy(&so->so_snd_mtx); in sodealloc()
893 mtx_destroy(&so->so_rcv_mtx); in sodealloc()
895 crfree(so->so_cred); in sodealloc()
896 mtx_destroy(&so->so_lock); in sodealloc()
897 uma_zfree(socket_zone, so); in sodealloc()
909 struct socket *so; in socreate() local
946 so = soalloc(CRED_TO_VNET(cred)); in socreate()
947 if (so == NULL) in socreate()
950 so->so_type = type; in socreate()
951 so->so_cred = crhold(cred); in socreate()
955 so->so_fibnum = td->td_proc->p_fibnum; in socreate()
957 so->so_fibnum = 0; in socreate()
958 so->so_proto = prp; in socreate()
960 mac_socket_create(cred, so); in socreate()
962 knlist_init(&so->so_rdsel.si_note, so, so_rdknl_lock, so_rdknl_unlock, in socreate()
964 knlist_init(&so->so_wrsel.si_note, so, so_wrknl_lock, so_wrknl_unlock, in socreate()
967 so->so_snd.sb_mtx = &so->so_snd_mtx; in socreate()
968 so->so_rcv.sb_mtx = &so->so_rcv_mtx; in socreate()
974 CURVNET_SET(so->so_vnet); in socreate()
975 error = prp->pr_attach(so, proto, td); in socreate()
978 sodealloc(so); in socreate()
981 soref(so); in socreate()
982 *aso = so; in socreate()
1015 struct socket *so; local
1153 VNET_ASSERT(head->so_vnet != NULL, ("%s: so %p vnet is NULL",
1155 so = soalloc(head->so_vnet);
1156 if (so == NULL) {
1162 so->so_listen = head;
1163 so->so_type = head->so_type;
1179 so->so_options = head->so_options & (SO_ACCEPTFILTER | SO_KEEPALIVE |
1181 so->so_linger = head->so_linger;
1182 so->so_state = head->so_state;
1183 so->so_fibnum = head->so_fibnum;
1184 so->so_proto = head->so_proto;
1185 so->so_cred = crhold(head->so_cred);
1188 if (hhook_run_socket(so, head, HHOOK_SOCKET_NEWCONN)) {
1189 sodealloc(so);
1196 mac_socket_newconn(head, so);
1198 knlist_init(&so->so_rdsel.si_note, so, so_rdknl_lock, so_rdknl_unlock,
1200 knlist_init(&so->so_wrsel.si_note, so, so_wrknl_lock, so_wrknl_unlock,
1203 if (soreserve(so, head->sol_sbsnd_hiwat, head->sol_sbrcv_hiwat)) {
1204 sodealloc(so);
1209 so->so_rcv.sb_lowat = head->sol_sbrcv_lowat;
1210 so->so_snd.sb_lowat = head->sol_sbsnd_lowat;
1211 so->so_rcv.sb_timeo = head->sol_sbrcv_timeo;
1212 so->so_snd.sb_timeo = head->sol_sbsnd_timeo;
1213 so->so_rcv.sb_flags = head->sol_sbrcv_flags & SB_AUTOSIZE;
1214 so->so_snd.sb_flags = head->sol_sbsnd_flags &
1216 if ((so->so_proto->pr_flags & PR_SOCKBUF) == 0) {
1217 so->so_snd.sb_mtx = &so->so_snd_mtx;
1218 so->so_rcv.sb_mtx = &so->so_rcv_mtx;
1221 return (so);
1228 struct socket *so; local
1230 if ((so = solisten_clone(head)) == NULL)
1233 if (so->so_proto->pr_attach(so, 0, NULL) != 0) {
1234 sodealloc(so);
1240 (void)solisten_enqueue(so, connstatus);
1242 return (so);
1252 solisten_enqueue(struct socket *so, int connstatus) argument
1254 struct socket *head = so->so_listen;
1256 MPASS(refcount_load(&so->so_count) == 0);
1257 refcount_init(&so->so_count, 1);
1262 so->so_state |= connstatus;
1265 TAILQ_INSERT_TAIL(&head->sol_comp, so, so_list);
1266 so->so_qstate = SQ_COMP;
1292 TAILQ_INSERT_TAIL(&head->sol_incomp, so, so_list);
1293 so->so_qstate = SQ_INCOMP;
1310 struct socket *so; local
1314 so = soalloc(head->so_vnet);
1315 if (so == NULL) {
1321 so->so_type = head->so_type;
1322 so->so_options = head->so_options;
1323 so->so_linger = head->so_linger;
1324 so->so_state = (head->so_state & SS_NBIO) | SS_ISCONNECTED;
1325 so->so_fibnum = head->so_fibnum;
1326 so->so_proto = head->so_proto;
1327 so->so_cred = crhold(head->so_cred);
1329 mac_socket_newconn(head, so);
1331 knlist_init(&so->so_rdsel.si_note, so, so_rdknl_lock, so_rdknl_unlock,
1333 knlist_init(&so->so_wrsel.si_note, so, so_wrknl_lock, so_wrknl_unlock,
1336 if (soreserve(so, head->so_snd.sb_hiwat, head->so_rcv.sb_hiwat)) {
1337 sodealloc(so);
1342 if (so->so_proto->pr_attach(so, 0, NULL)) {
1343 sodealloc(so);
1348 so->so_rcv.sb_lowat = head->so_rcv.sb_lowat;
1349 so->so_snd.sb_lowat = head->so_snd.sb_lowat;
1350 so->so_rcv.sb_timeo = head->so_rcv.sb_timeo;
1351 so->so_snd.sb_timeo = head->so_snd.sb_timeo;
1352 so->so_rcv.sb_flags |= head->so_rcv.sb_flags & SB_AUTOSIZE;
1353 so->so_snd.sb_flags |= head->so_snd.sb_flags & SB_AUTOSIZE;
1354 if ((so->so_proto->pr_flags & PR_SOCKBUF) == 0) {
1355 so->so_snd.sb_mtx = &so->so_snd_mtx;
1356 so->so_rcv.sb_mtx = &so->so_rcv_mtx;
1359 soref(so);
1361 return (so);
1366 sobind(struct socket *so, struct sockaddr *nam, struct thread *td) argument
1370 CURVNET_SET(so->so_vnet);
1371 error = so->so_proto->pr_bind(so, nam, td);
1377 sobindat(int fd, struct socket *so, struct sockaddr *nam, struct thread *td) argument
1381 CURVNET_SET(so->so_vnet);
1382 error = so->so_proto->pr_bindat(fd, so, nam, td);
1392 * socket-layer listen state. Call backs are used so that the protocol can
1400 solisten(struct socket *so, int backlog, struct thread *td) argument
1404 CURVNET_SET(so->so_vnet);
1405 error = so->so_proto->pr_listen(so, backlog, td);
1415 solisten_proto_check(struct socket *so) argument
1417 SOCK_LOCK_ASSERT(so);
1419 if ((so->so_state & (SS_ISCONNECTED | SS_ISCONNECTING |
1424 * Sleeping is not permitted here, so simply fail if userspace is
1429 if (!sx_try_xlock(&so->so_snd_sx))
1431 if (!sx_try_xlock(&so->so_rcv_sx)) {
1432 sx_xunlock(&so->so_snd_sx);
1435 mtx_lock(&so->so_snd_mtx);
1436 mtx_lock(&so->so_rcv_mtx);
1439 if (!SOLISTENING(so)) {
1443 ktls = so->so_snd.sb_tls_info != NULL ||
1444 so->so_rcv.sb_tls_info != NULL;
1449 (so->so_snd.sb_flags & (SB_AIO | SB_AIO_RUNNING)) != 0 ||
1450 (so->so_rcv.sb_flags & (SB_AIO | SB_AIO_RUNNING)) != 0) {
1451 solisten_proto_abort(so);
1463 solisten_proto_abort(struct socket *so) argument
1465 mtx_unlock(&so->so_snd_mtx);
1466 mtx_unlock(&so->so_rcv_mtx);
1467 sx_xunlock(&so->so_snd_sx);
1468 sx_xunlock(&so->so_rcv_sx);
1472 solisten_proto(struct socket *so, int backlog) argument
1479 SOCK_LOCK_ASSERT(so);
1480 KASSERT((so->so_state & (SS_ISCONNECTED | SS_ISCONNECTING |
1482 ("%s: bad socket state %p", __func__, so));
1484 if (SOLISTENING(so))
1490 sbrcv_lowat = so->so_rcv.sb_lowat;
1491 sbsnd_lowat = so->so_snd.sb_lowat;
1492 sbrcv_hiwat = so->so_rcv.sb_hiwat;
1493 sbsnd_hiwat = so->so_snd.sb_hiwat;
1494 sbrcv_flags = so->so_rcv.sb_flags;
1495 sbsnd_flags = so->so_snd.sb_flags;
1496 sbrcv_timeo = so->so_rcv.sb_timeo;
1497 sbsnd_timeo = so->so_snd.sb_timeo;
1500 mac_socketpeer_label_free(so->so_peerlabel);
1503 if (!(so->so_proto->pr_flags & PR_SOCKBUF)) {
1504 sbdestroy(so, SO_SND);
1505 sbdestroy(so, SO_RCV);
1509 bzero(&so->so_rcv,
1513 so->sol_sbrcv_lowat = sbrcv_lowat;
1514 so->sol_sbsnd_lowat = sbsnd_lowat;
1515 so->sol_sbrcv_hiwat = sbrcv_hiwat;
1516 so->sol_sbsnd_hiwat = sbsnd_hiwat;
1517 so->sol_sbrcv_flags = sbrcv_flags;
1518 so->sol_sbsnd_flags = sbsnd_flags;
1519 so->sol_sbrcv_timeo = sbrcv_timeo;
1520 so->sol_sbsnd_timeo = sbsnd_timeo;
1522 so->sol_qlen = so->sol_incqlen = 0;
1523 TAILQ_INIT(&so->sol_incomp);
1524 TAILQ_INIT(&so->sol_comp);
1526 so->sol_accept_filter = NULL;
1527 so->sol_accept_filter_arg = NULL;
1528 so->sol_accept_filter_str = NULL;
1530 so->sol_upcall = NULL;
1531 so->sol_upcallarg = NULL;
1533 so->so_options |= SO_ACCEPTCONN;
1538 so->sol_qlimit = backlog;
1540 mtx_unlock(&so->so_snd_mtx);
1541 mtx_unlock(&so->so_rcv_mtx);
1542 sx_xunlock(&so->so_snd_sx);
1543 sx_xunlock(&so->so_rcv_sx);
1579 struct socket *so; local
1604 so = TAILQ_FIRST(&head->sol_comp);
1605 SOCK_LOCK(so);
1606 KASSERT(so->so_qstate == SQ_COMP,
1607 ("%s: so %p not SQ_COMP", __func__, so));
1609 so->so_qstate = SQ_NONE;
1610 so->so_listen = NULL;
1611 TAILQ_REMOVE(&head->sol_comp, so, so_list);
1613 so->so_state |= (head->so_state & SS_NBIO);
1615 so->so_state |= (flags & SOCK_NONBLOCK) ? SS_NBIO : 0;
1616 SOCK_UNLOCK(so);
1619 *ret = so;
1660 * Splice the output from so to the input of so2.
1663 so_splice(struct socket *so, struct socket *so2, struct splice *splice) argument
1671 if (so->so_proto->pr_protocol != IPPROTO_TCP ||
1674 if (so->so_vnet != so2->so_vnet)
1678 KASSERT(so->so_proto->pr_sosend == sosend_generic,
1685 so->so_splice_sent = 0;
1686 sp->src = so;
1690 SOCK_LOCK(so);
1691 if (SOLISTENING(so))
1693 else if ((so->so_state & (SS_ISCONNECTED | SS_ISCONNECTING)) == 0)
1695 else if (so->so_splice != NULL)
1698 SOCK_UNLOCK(so);
1702 SOCK_RECVBUF_LOCK(so);
1703 if (so->so_rcv.sb_tls_info != NULL) {
1704 SOCK_RECVBUF_UNLOCK(so);
1705 SOCK_UNLOCK(so);
1709 so->so_rcv.sb_flags |= SB_SPLICED;
1710 so->so_splice = sp;
1711 soref(so);
1712 SOCK_RECVBUF_UNLOCK(so);
1713 SOCK_UNLOCK(so);
1725 so_unsplice(so, false);
1729 if (so->so_snd.sb_tls_info != NULL) {
1732 so_unsplice(so, false);
1758 so_unsplice(struct socket *so, bool timeout) argument
1765 * First unset SB_SPLICED and hide the splice structure so that
1769 SOCK_LOCK(so);
1770 if (SOLISTENING(so)) {
1771 SOCK_UNLOCK(so);
1774 SOCK_RECVBUF_LOCK(so);
1775 if ((so->so_rcv.sb_flags & SB_SPLICED) == 0) {
1776 SOCK_RECVBUF_UNLOCK(so);
1777 SOCK_UNLOCK(so);
1780 sp = so->so_splice;
1787 SOCK_RECVBUF_UNLOCK(so);
1788 SOCK_UNLOCK(so);
1792 so->so_rcv.sb_flags &= ~SB_SPLICED;
1793 so->so_splice = NULL;
1794 SOCK_RECVBUF_UNLOCK(so);
1795 SOCK_UNLOCK(so);
1848 sorwakeup(so);
1849 CURVNET_SET(so->so_vnet);
1850 sorele(so);
1863 sofree(struct socket *so) argument
1865 struct protosw *pr = so->so_proto;
1867 SOCK_LOCK_ASSERT(so);
1868 KASSERT(refcount_load(&so->so_count) == 0,
1869 ("%s: so %p has references", __func__, so));
1870 KASSERT(SOLISTENING(so) || so->so_qstate == SQ_NONE,
1871 ("%s: so %p is on listen queue", __func__, so));
1872 KASSERT(SOLISTENING(so) || (so->so_rcv.sb_flags & SB_SPLICED) == 0,
1873 ("%s: so %p rcvbuf is spliced", __func__, so));
1874 KASSERT(SOLISTENING(so) || (so->so_snd.sb_flags & SB_SPLICED) == 0,
1875 ("%s: so %p sndbuf is spliced", __func__, so));
1876 KASSERT(so->so_splice == NULL && so->so_splice_back == NULL,
1877 ("%s: so %p has spliced data", __func__, so));
1879 SOCK_UNLOCK(so);
1881 if (so->so_dtor != NULL)
1882 so->so_dtor(so);
1884 VNET_SO_ASSERT(so);
1886 pr->pr_detach(so);
1888 if (!(pr->pr_flags & PR_SOCKBUF) && !SOLISTENING(so)) {
1895 SOCK_SENDBUF_LOCK(so);
1896 SOCK_RECVBUF_LOCK(so);
1898 sbdestroy(so, SO_SND);
1899 sbdestroy(so, SO_RCV);
1901 SOCK_SENDBUF_UNLOCK(so);
1902 SOCK_RECVBUF_UNLOCK(so);
1905 seldrain(&so->so_rdsel);
1906 seldrain(&so->so_wrsel);
1907 knlist_destroy(&so->so_rdsel.si_note);
1908 knlist_destroy(&so->so_wrsel.si_note);
1909 sodealloc(so);
1917 sorele_locked(struct socket *so) argument
1919 SOCK_LOCK_ASSERT(so);
1920 if (refcount_release(&so->so_count))
1921 sofree(so);
1923 SOCK_UNLOCK(so);
1935 soclose(struct socket *so) argument
1941 CURVNET_SET(so->so_vnet);
1942 funsetown(&so->so_sigio);
1943 if (so->so_state & SS_ISCONNECTED) {
1944 if ((so->so_state & SS_ISDISCONNECTING) == 0) {
1945 error = sodisconnect(so);
1953 if ((so->so_options & SO_LINGER) != 0 && so->so_linger != 0) {
1954 if ((so->so_state & SS_ISDISCONNECTING) &&
1955 (so->so_state & SS_NBIO))
1957 while (so->so_state & SS_ISCONNECTED) {
1958 error = tsleep(&so->so_timeo,
1960 so->so_linger * hz);
1968 if (so->so_proto->pr_close != NULL)
1969 so->so_proto->pr_close(so);
1971 SOCK_LOCK(so);
1972 if ((listening = SOLISTENING(so))) {
1976 TAILQ_SWAP(&lqueue, &so->sol_incomp, socket, so_list);
1977 TAILQ_CONCAT(&lqueue, &so->sol_comp, so_list);
1979 so->sol_qlen = so->sol_incqlen = 0;
1986 last = refcount_release(&so->so_count);
1988 __func__, so));
1991 sorele_locked(so);
2014 * This interface will call into the protocol code, so must not be called
2024 soabort(struct socket *so) argument
2027 VNET_SO_ASSERT(so);
2029 if (so->so_proto->pr_abort != NULL)
2030 so->so_proto->pr_abort(so);
2031 SOCK_LOCK(so);
2032 sorele_locked(so);
2036 soaccept(struct socket *so, struct sockaddr *sa) argument
2043 CURVNET_SET(so->so_vnet);
2044 error = so->so_proto->pr_accept(so, sa);
2046 ("%s: protocol %p sockaddr overflow", __func__, so->so_proto));
2052 sopeeraddr(struct socket *so, struct sockaddr *sa) argument
2061 error = so->so_proto->pr_peeraddr(so, sa);
2063 ("%s: protocol %p sockaddr overflow", __func__, so->so_proto));
2069 sosockaddr(struct socket *so, struct sockaddr *sa) argument
2076 CURVNET_SET(so->so_vnet);
2077 error = so->so_proto->pr_sockaddr(so, sa);
2079 ("%s: protocol %p sockaddr overflow", __func__, so->so_proto));
2086 soconnect(struct socket *so, struct sockaddr *nam, struct thread *td) argument
2089 return (soconnectat(AT_FDCWD, so, nam, td));
2093 soconnectat(int fd, struct socket *so, struct sockaddr *nam, struct thread *td) argument
2097 CURVNET_SET(so->so_vnet);
2107 if (so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING) &&
2108 ((so->so_proto->pr_flags & PR_CONNREQUIRED) ||
2109 (error = sodisconnect(so)))) {
2116 so->so_error = 0;
2118 error = so->so_proto->pr_connect(so, nam, td);
2120 error = so->so_proto->pr_connectat(fd, so, nam, td);
2140 sodisconnect(struct socket *so) argument
2144 if ((so->so_state & SS_ISCONNECTED) == 0)
2146 if (so->so_state & SS_ISDISCONNECTING)
2148 VNET_SO_ASSERT(so);
2149 error = so->so_proto->pr_disconnect(so);
2154 sosend_dgram(struct socket *so, struct sockaddr *addr, struct uio *uio, argument
2161 KASSERT(so->so_type == SOCK_DGRAM, ("sosend_dgram: !SOCK_DGRAM"));
2162 KASSERT(so->so_proto->pr_flags & PR_ATOMIC,
2182 (flags & MSG_DONTROUTE) && (so->so_options & SO_DONTROUTE) == 0;
2188 SOCKBUF_LOCK(&so->so_snd);
2189 if (so->so_snd.sb_state & SBS_CANTSENDMORE) {
2190 SOCKBUF_UNLOCK(&so->so_snd);
2194 if (so->so_error) {
2195 error = so->so_error;
2196 so->so_error = 0;
2197 SOCKBUF_UNLOCK(&so->so_snd);
2200 if ((so->so_state & SS_ISCONNECTED) == 0) {
2206 if ((so->so_proto->pr_flags & PR_CONNREQUIRED) &&
2207 (so->so_proto->pr_flags & PR_IMPLOPCL) == 0) {
2209 SOCKBUF_UNLOCK(&so->so_snd);
2214 if (so->so_proto->pr_flags & PR_CONNREQUIRED)
2218 SOCKBUF_UNLOCK(&so->so_snd);
2227 space = sbspace(&so->so_snd);
2231 SOCKBUF_UNLOCK(&so->so_snd);
2261 SOCK_LOCK(so);
2262 so->so_options |= SO_DONTROUTE;
2263 SOCK_UNLOCK(so);
2273 VNET_SO_ASSERT(so);
2274 error = so->so_proto->pr_send(so, (flags & MSG_OOB) ? PRUS_OOB :
2280 (so->so_proto->pr_flags & PR_IMPLOPCL) &&
2288 SOCK_LOCK(so);
2289 so->so_options &= ~SO_DONTROUTE;
2290 SOCK_UNLOCK(so);
2317 sosend_generic_locked(struct socket *so, struct sockaddr *addr, struct uio *uio, argument
2323 int atomic = sosendallatonce(so) || top;
2334 SOCK_IO_SEND_ASSERT_LOCKED(so);
2352 if (resid < 0 || (so->so_type == SOCK_STREAM && (flags & MSG_EOR))) {
2358 (flags & MSG_DONTROUTE) && (so->so_options & SO_DONTROUTE) == 0 &&
2359 (so->so_proto->pr_flags & PR_ATOMIC);
2367 tls = ktls_hold(so->so_snd.sb_tls_info);
2394 SOCKBUF_LOCK(&so->so_snd);
2395 if (so->so_snd.sb_state & SBS_CANTSENDMORE) {
2396 SOCKBUF_UNLOCK(&so->so_snd);
2400 if (so->so_error) {
2401 error = so->so_error;
2402 so->so_error = 0;
2403 SOCKBUF_UNLOCK(&so->so_snd);
2406 if ((so->so_state & SS_ISCONNECTED) == 0) {
2413 if ((so->so_proto->pr_flags & PR_CONNREQUIRED) &&
2414 (so->so_proto->pr_flags & PR_IMPLOPCL) == 0) {
2416 SOCKBUF_UNLOCK(&so->so_snd);
2421 SOCKBUF_UNLOCK(&so->so_snd);
2422 if (so->so_proto->pr_flags & PR_CONNREQUIRED)
2429 space = sbspace(&so->so_snd);
2432 if ((atomic && resid > so->so_snd.sb_hiwat) ||
2433 clen > so->so_snd.sb_hiwat) {
2434 SOCKBUF_UNLOCK(&so->so_snd);
2439 (atomic || space < so->so_snd.sb_lowat || space < clen)) {
2440 if ((so->so_state & SS_NBIO) ||
2442 SOCKBUF_UNLOCK(&so->so_snd);
2446 error = sbwait(so, SO_SND);
2447 SOCKBUF_UNLOCK(&so->so_snd);
2452 SOCKBUF_UNLOCK(&so->so_snd);
2500 SOCK_LOCK(so);
2501 so->so_options |= SO_DONTROUTE;
2502 SOCK_UNLOCK(so);
2514 VNET_SO_ASSERT(so);
2523 (so->so_proto->pr_flags & PR_IMPLOPCL) &&
2534 error = so->so_proto->pr_send(so, pr_send_flag, top,
2538 SOCK_LOCK(so);
2539 so->so_options &= ~SO_DONTROUTE;
2540 SOCK_UNLOCK(so);
2549 soref(so);
2550 ktls_enqueue(top, so, tls_enq_cnt);
2575 sosend_generic(struct socket *so, struct sockaddr *addr, struct uio *uio, argument
2580 error = SOCK_IO_SEND_LOCK(so, SBLOCKWAIT(flags));
2583 error = sosend_generic_locked(so, addr, uio, top, control, flags, td);
2584 SOCK_IO_SEND_UNLOCK(so);
2597 sosend(struct socket *so, struct sockaddr *addr, struct uio *uio, argument
2602 CURVNET_SET(so->so_vnet);
2603 error = so->so_proto->pr_sosend(so, addr, uio,
2613 sousrsend(struct socket *so, struct sockaddr *addr, struct uio *uio, argument
2622 CURVNET_SET(so->so_vnet);
2623 error = so->so_proto->pr_sosend(so, addr, uio, NULL, control, flags,
2634 (so->so_proto->pr_flags & PR_ATOMIC) == 0 &&
2640 if (error == EPIPE && (so->so_options & SO_NOSIGPIPE) == 0 &&
2666 soreceive_rcvoob(struct socket *so, struct uio *uio, int flags) argument
2668 struct protosw *pr = so->so_proto;
2673 VNET_SO_ASSERT(so);
2676 error = pr->pr_rcvoob(so, m, flags & MSG_PEEK);
2693 * buffer so that other consumers see the values consistently. 'nextrecord'
2729 * so specifies, followed by an optional mbuf or mbufs containing ancillary
2742 soreceive_generic_locked(struct socket *so, struct sockaddr **psa, argument
2748 struct protosw *pr = so->so_proto;
2754 SOCK_IO_RECV_ASSERT_LOCKED(so);
2765 SOCKBUF_LOCK(&so->so_rcv);
2766 m = so->so_rcv.sb_mb;
2774 sbavail(&so->so_rcv) < uio->uio_resid) &&
2775 sbavail(&so->so_rcv) < so->so_rcv.sb_lowat &&
2777 KASSERT(m != NULL || !sbavail(&so->so_rcv),
2779 m, sbavail(&so->so_rcv)));
2780 if (so->so_error || so->so_rerror) {
2783 if (so->so_error)
2784 error = so->so_error;
2786 error = so->so_rerror;
2788 if (so->so_error)
2789 so->so_error = 0;
2791 so->so_rerror = 0;
2793 SOCKBUF_UNLOCK(&so->so_rcv);
2796 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
2797 if (so->so_rcv.sb_state & SBS_CANTRCVMORE) {
2801 else if (so->so_rcv.sb_tlsdcc == 0 &&
2802 so->so_rcv.sb_tlscc == 0) {
2806 SOCKBUF_UNLOCK(&so->so_rcv);
2812 m = so->so_rcv.sb_mb;
2815 if ((so->so_state & (SS_ISCONNECTING | SS_ISCONNECTED |
2817 (so->so_proto->pr_flags & PR_CONNREQUIRED) != 0) {
2818 SOCKBUF_UNLOCK(&so->so_rcv);
2823 SOCKBUF_UNLOCK(&so->so_rcv);
2826 if ((so->so_state & SS_NBIO) ||
2828 SOCKBUF_UNLOCK(&so->so_rcv);
2832 SBLASTRECORDCHK(&so->so_rcv);
2833 SBLASTMBUFCHK(&so->so_rcv);
2834 error = sbwait(so, SO_RCV);
2835 SOCKBUF_UNLOCK(&so->so_rcv);
2856 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
2859 KASSERT(m == so->so_rcv.sb_mb, ("soreceive: m != so->so_rcv.sb_mb"));
2860 SBLASTRECORDCHK(&so->so_rcv);
2861 SBLASTMBUFCHK(&so->so_rcv);
2873 sbfree(&so->so_rcv, m);
2874 so->so_rcv.sb_mb = m_free(m);
2875 m = so->so_rcv.sb_mb;
2876 sockbuf_pushsync(&so->so_rcv, nextrecord);
2908 SOCKBUF_UNLOCK(&so->so_rcv);
2925 sbfree(&so->so_rcv, m);
2926 so->so_rcv.sb_mb = m->m_next;
2930 m = so->so_rcv.sb_mb;
2934 sockbuf_pushsync(&so->so_rcv, nextrecord);
2949 nextrecord = so->so_rcv.sb_mb->m_nextpkt;
2951 nextrecord = so->so_rcv.sb_mb;
2959 KASSERT(so->so_rcv.sb_mb == m,
2961 KASSERT(so->so_rcv.sb_lastrecord == m,
2970 KASSERT(so->so_rcv.sb_mb == nextrecord,
2972 if (so->so_rcv.sb_mb == NULL) {
2973 KASSERT(so->so_rcv.sb_lastrecord == NULL,
2978 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
2979 SBLASTRECORDCHK(&so->so_rcv);
2980 SBLASTMBUFCHK(&so->so_rcv);
2985 * used to store the type of any mbuf reads that have happened so far
2998 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
3007 so->so_rcv.sb_state &= ~SBS_RCVATMARK;
3009 if (so->so_oobmark && len > so->so_oobmark - offset)
3010 len = so->so_oobmark - offset;
3021 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
3022 SBLASTRECORDCHK(&so->so_rcv);
3023 SBLASTMBUFCHK(&so->so_rcv);
3024 SOCKBUF_UNLOCK(&so->so_rcv);
3031 SOCKBUF_LOCK(&so->so_rcv);
3035 * from the record, so it is necessary to
3043 (void)sbdroprecord_locked(&so->so_rcv);
3044 SOCKBUF_UNLOCK(&so->so_rcv);
3049 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
3058 sbfree(&so->so_rcv, m);
3063 so->so_rcv.sb_mb = m = m->m_next;
3066 so->so_rcv.sb_mb = m_free(m);
3067 m = so->so_rcv.sb_mb;
3069 sockbuf_pushsync(&so->so_rcv, nextrecord);
3070 SBLASTRECORDCHK(&so->so_rcv);
3071 SBLASTMBUFCHK(&so->so_rcv);
3095 SOCKBUF_UNLOCK(&so->so_rcv);
3098 SOCKBUF_LOCK(&so->so_rcv);
3101 sbcut_locked(&so->so_rcv, len);
3104 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
3105 if (so->so_oobmark) {
3107 so->so_oobmark -= len;
3108 if (so->so_oobmark == 0) {
3109 so->so_rcv.sb_state |= SBS_RCVATMARK;
3114 if (offset == so->so_oobmark)
3128 !sosendallatonce(so) && nextrecord == NULL) {
3129 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
3130 if (so->so_error || so->so_rerror ||
3131 so->so_rcv.sb_state & SBS_CANTRCVMORE)
3138 SOCKBUF_UNLOCK(&so->so_rcv);
3139 VNET_SO_ASSERT(so);
3140 pr->pr_rcvd(so, flags);
3141 SOCKBUF_LOCK(&so->so_rcv);
3142 if (__predict_false(so->so_rcv.sb_mb == NULL &&
3143 (so->so_error || so->so_rerror ||
3144 so->so_rcv.sb_state & SBS_CANTRCVMORE)))
3147 SBLASTRECORDCHK(&so->so_rcv);
3148 SBLASTMBUFCHK(&so->so_rcv);
3153 if (so->so_rcv.sb_mb == NULL) {
3154 error = sbwait(so, SO_RCV);
3156 SOCKBUF_UNLOCK(&so->so_rcv);
3160 m = so->so_rcv.sb_mb;
3166 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
3172 (void) sbdroprecord_locked(&so->so_rcv);
3181 so->so_rcv.sb_mb = nextrecord;
3182 if (so->so_rcv.sb_mb == NULL) {
3183 so->so_rcv.sb_mbtail = NULL;
3184 so->so_rcv.sb_lastrecord = NULL;
3186 so->so_rcv.sb_lastrecord = nextrecord;
3188 SBLASTRECORDCHK(&so->so_rcv);
3189 SBLASTMBUFCHK(&so->so_rcv);
3197 SOCKBUF_UNLOCK(&so->so_rcv);
3198 VNET_SO_ASSERT(so);
3199 pr->pr_rcvd(so, flags);
3200 SOCKBUF_LOCK(&so->so_rcv);
3203 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
3205 (flags & MSG_EOR) == 0 && (so->so_rcv.sb_state & SBS_CANTRCVMORE) == 0) {
3206 SOCKBUF_UNLOCK(&so->so_rcv);
3209 SOCKBUF_UNLOCK(&so->so_rcv);
3218 soreceive_generic(struct socket *so, struct sockaddr **psa, struct uio *uio, argument
3230 return (soreceive_rcvoob(so, uio, flags));
3237 error = SOCK_IO_RECV_LOCK(so, SBLOCKWAIT(flags));
3240 error = soreceive_generic_locked(so, psa, uio, mp, controlp, flagsp);
3241 SOCK_IO_RECV_UNLOCK(so);
3249 soreceive_stream_locked(struct socket *so, struct sockbuf *sb, argument
3256 SOCK_IO_RECV_ASSERT_LOCKED(so);
3265 if (!(so->so_state & (SS_ISCONNECTED|SS_ISDISCONNECTED))) {
3271 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
3274 if (so->so_error) {
3279 error = so->so_error;
3281 so->so_error = 0;
3295 ((so->so_state & SS_NBIO) || (flags & (MSG_DONTWAIT|MSG_NBIO)))) {
3302 ((so->so_state & SS_NBIO) ||
3319 error = sbwait(so, SO_RCV);
3325 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
3397 if ((so->so_proto->pr_flags & PR_WANTRCVD) &&
3401 VNET_SO_ASSERT(so);
3402 so->so_proto->pr_rcvd(so, flags);
3421 soreceive_stream(struct socket *so, struct sockaddr **psa, struct uio *uio, argument
3427 sb = &so->so_rcv;
3430 if (so->so_type != SOCK_STREAM)
3441 return (soreceive_rcvoob(so, uio, flags));
3454 return (soreceive_generic(so, psa, uio, mp0, controlp,
3462 error = SOCK_IO_RECV_LOCK(so, SBLOCKWAIT(flags));
3467 SOCK_IO_RECV_UNLOCK(so);
3468 return (soreceive_generic(so, psa, uio, mp0, controlp,
3472 error = soreceive_stream_locked(so, sb, psa, uio, mp0, controlp, flags);
3473 SOCK_IO_RECV_UNLOCK(so);
3484 soreceive_dgram(struct socket *so, struct sockaddr **psa, struct uio *uio, argument
3490 struct protosw *pr = so->so_proto;
3507 return (soreceive_generic(so, psa, uio, mp0, controlp,
3516 KASSERT((so->so_rcv.sb_state & SBS_RCVATMARK) == 0,
3518 KASSERT((so->so_proto->pr_flags & PR_CONNREQUIRED) == 0,
3524 SOCKBUF_LOCK(&so->so_rcv);
3525 while ((m = so->so_rcv.sb_mb) == NULL) {
3526 KASSERT(sbavail(&so->so_rcv) == 0,
3528 sbavail(&so->so_rcv)));
3529 if (so->so_error) {
3530 error = so->so_error;
3531 so->so_error = 0;
3532 SOCKBUF_UNLOCK(&so->so_rcv);
3535 if (so->so_rcv.sb_state & SBS_CANTRCVMORE ||
3537 SOCKBUF_UNLOCK(&so->so_rcv);
3540 if ((so->so_state & SS_NBIO) ||
3542 SOCKBUF_UNLOCK(&so->so_rcv);
3545 SBLASTRECORDCHK(&so->so_rcv);
3546 SBLASTMBUFCHK(&so->so_rcv);
3547 error = sbwait(so, SO_RCV);
3549 SOCKBUF_UNLOCK(&so->so_rcv);
3553 SOCKBUF_LOCK_ASSERT(&so->so_rcv);
3557 SBLASTRECORDCHK(&so->so_rcv);
3558 SBLASTMBUFCHK(&so->so_rcv);
3561 KASSERT(so->so_rcv.sb_lastrecord == m,
3565 KASSERT(so->so_rcv.sb_mb->m_nextpkt == nextrecord,
3571 so->so_rcv.sb_mb = NULL;
3572 sockbuf_pushsync(&so->so_rcv, nextrecord);
3578 sbfree(&so->so_rcv, m2);
3583 SBLASTRECORDCHK(&so->so_rcv);
3584 SBLASTMBUFCHK(&so->so_rcv);
3585 SOCKBUF_UNLOCK(&so->so_rcv);
3660 soreceive(struct socket *so, struct sockaddr **psa, struct uio *uio, argument
3665 CURVNET_SET(so->so_vnet);
3666 error = so->so_proto->pr_soreceive(so, psa, uio, mp0, controlp, flagsp);
3672 soshutdown(struct socket *so, enum shutdown_how how) argument
3676 CURVNET_SET(so->so_vnet);
3677 error = so->so_proto->pr_shutdown(so, how);
3687 sorflush(struct socket *so) argument
3691 VNET_SO_ASSERT(so);
3705 socantrcvmore(so);
3707 error = SOCK_IO_RECV_LOCK(so, SBL_WAIT | SBL_NOINTR);
3709 KASSERT(SOLISTENING(so),
3710 ("%s: soiolock(%p) failed", __func__, so));
3714 sbrelease(so, SO_RCV);
3715 SOCK_IO_RECV_UNLOCK(so);
3720 sosetfib(struct socket *so, int fibnum) argument
3725 SOCK_LOCK(so);
3726 so->so_fibnum = fibnum;
3727 SOCK_UNLOCK(so);
3738 hhook_run_socket(struct socket *so, void *hctx, int32_t h_id) argument
3741 .so = so,
3747 CURVNET_SET(so->so_vnet);
3748 HHOOKS_RUN_IF(V_socket_hhh[h_id], &hhook_data, &so->osd);
3792 so_setsockopt(struct socket *so, int level, int optname, void *optval, argument
3803 return (sosetopt(so, &sopt));
3807 sosetopt(struct socket *so, struct sockopt *sopt) argument
3818 CURVNET_SET(so->so_vnet);
3821 error = so->so_proto->pr_ctloutput(so, sopt);
3825 error = accept_filt_setopt(so, sopt);
3840 SOCK_LOCK(so);
3841 so->so_linger = l.l_linger;
3843 so->so_options |= SO_LINGER;
3845 so->so_options &= ~SO_LINGER;
3846 SOCK_UNLOCK(so);
3868 SOCK_LOCK(so);
3870 so->so_options |= sopt->sopt_name;
3872 so->so_options &= ~sopt->sopt_name;
3873 SOCK_UNLOCK(so);
3877 error = so->so_proto->pr_ctloutput(so, sopt);
3885 so->so_user_cookie = val32;
3892 error = so->so_proto->pr_setsbopt(so, sopt);
3922 SOCK_LOCK(so);
3924 (SOLISTENING(so) ? &so->sol_sbsnd_timeo :
3925 &so->so_snd.sb_timeo) :
3926 (SOLISTENING(so) ? &so->sol_sbrcv_timeo :
3927 &so->so_rcv.sb_timeo);
3929 SOCK_UNLOCK(so);
3939 so, &extmac);
3954 so->so_ts_clock = optval;
3962 so->so_max_pacing_rate = val32;
4014 error = so_splice(so, so2, &splice);
4017 error = so_unsplice(so, false);
4024 error = hhook_run_socket(so, sopt,
4032 (void)so->so_proto->pr_ctloutput(so, sopt);
4070 sogetopt(struct socket *so, struct sockopt *sopt) argument
4079 CURVNET_SET(so->so_vnet);
4082 error = so->so_proto->pr_ctloutput(so, sopt);
4088 error = accept_filt_getopt(so, sopt);
4092 SOCK_LOCK(so);
4093 l.l_onoff = so->so_options & SO_LINGER;
4094 l.l_linger = so->so_linger;
4095 SOCK_UNLOCK(so);
4115 optval = so->so_options & sopt->sopt_name;
4121 SOCK_LOCK(so);
4122 optval = so->so_fibnum;
4123 SOCK_UNLOCK(so);
4127 optval = so->so_proto->pr_domain->dom_family;
4131 optval = so->so_type;
4135 optval = so->so_proto->pr_protocol;
4139 SOCK_LOCK(so);
4140 if (so->so_error) {
4141 optval = so->so_error;
4142 so->so_error = 0;
4144 optval = so->so_rerror;
4145 so->so_rerror = 0;
4147 SOCK_UNLOCK(so);
4151 SOCK_LOCK(so);
4152 optval = SOLISTENING(so) ? so->sol_sbsnd_hiwat :
4153 so->so_snd.sb_hiwat;
4154 SOCK_UNLOCK(so);
4158 SOCK_LOCK(so);
4159 optval = SOLISTENING(so) ? so->sol_sbrcv_hiwat :
4160 so->so_rcv.sb_hiwat;
4161 SOCK_UNLOCK(so);
4165 SOCK_LOCK(so);
4166 optval = SOLISTENING(so) ? so->sol_sbsnd_lowat :
4167 so->so_snd.sb_lowat;
4168 SOCK_UNLOCK(so);
4172 SOCK_LOCK(so);
4173 optval = SOLISTENING(so) ? so->sol_sbrcv_lowat :
4174 so->so_rcv.sb_lowat;
4175 SOCK_UNLOCK(so);
4180 SOCK_LOCK(so);
4182 (SOLISTENING(so) ? so->sol_sbsnd_timeo :
4183 so->so_snd.sb_timeo) :
4184 (SOLISTENING(so) ? so->sol_sbrcv_timeo :
4185 so->so_rcv.sb_timeo));
4186 SOCK_UNLOCK(so);
4206 so, &extmac);
4222 sopt->sopt_td->td_ucred, so, &extmac);
4232 SOCK_LOCK(so);
4233 optval = SOLISTENING(so) ? so->sol_qlimit : 0;
4234 SOCK_UNLOCK(so);
4238 SOCK_LOCK(so);
4239 optval = SOLISTENING(so) ? so->sol_qlen : 0;
4240 SOCK_UNLOCK(so);
4244 SOCK_LOCK(so);
4245 optval = SOLISTENING(so) ? so->sol_incqlen : 0;
4246 SOCK_UNLOCK(so);
4250 optval = so->so_ts_clock;
4254 optval = so->so_max_pacing_rate;
4269 error = SOCK_IO_RECV_LOCK(so, SBL_WAIT);
4272 SOCK_LOCK(so);
4273 if (SOLISTENING(so)) {
4276 n = so->so_splice_sent;
4278 SOCK_UNLOCK(so);
4279 SOCK_IO_RECV_UNLOCK(so);
4287 error = hhook_run_socket(so, sopt,
4415 sohasoutofband(struct socket *so) argument
4418 if (so->so_sigio != NULL)
4419 pgsigio(&so->so_sigio, SIGURG, 0);
4420 selwakeuppri(&so->so_rdsel, PSOCK);
4424 sopoll_generic(struct socket *so, int events, struct thread *td) argument
4428 SOCK_LOCK(so);
4429 if (SOLISTENING(so)) {
4432 else if (!TAILQ_EMPTY(&so->sol_comp))
4434 else if ((events & POLLINIGNEOF) == 0 && so->so_error)
4437 selrecord(td, &so->so_rdsel);
4442 SOCK_SENDBUF_LOCK(so);
4443 SOCK_RECVBUF_LOCK(so);
4445 if (soreadabledata(so) && !isspliced(so))
4448 if (sowriteable(so) && !issplicedback(so))
4451 if (so->so_oobmark ||
4452 (so->so_rcv.sb_state & SBS_RCVATMARK))
4455 if (so->so_rcv.sb_state & SBS_CANTRCVMORE) {
4457 if (so->so_snd.sb_state & SBS_CANTSENDMORE)
4461 if (so->so_rcv.sb_state & SBS_CANTRCVMORE)
4466 selrecord(td, &so->so_rdsel);
4467 so->so_rcv.sb_flags |= SB_SEL;
4470 selrecord(td, &so->so_wrsel);
4471 so->so_snd.sb_flags |= SB_SEL;
4474 SOCK_RECVBUF_UNLOCK(so);
4475 SOCK_SENDBUF_UNLOCK(so);
4477 SOCK_UNLOCK(so);
4482 sokqfilter_generic(struct socket *so, struct knote *kn) argument
4491 knl = &so->so_rdsel.si_note;
4492 sb = &so->so_rcv;
4497 knl = &so->so_wrsel.si_note;
4498 sb = &so->so_snd;
4503 knl = &so->so_wrsel.si_note;
4504 sb = &so->so_snd;
4511 SOCK_LOCK(so);
4512 if (SOLISTENING(so)) {
4515 SOCK_BUF_LOCK(so, which);
4521 SOCK_BUF_UNLOCK(so, which);
4523 SOCK_UNLOCK(so);
4530 struct socket *so = kn->kn_fp->f_data; local
4532 so_rdknl_lock(so);
4533 knlist_remove(&so->so_rdsel.si_note, kn, 1);
4534 if (!SOLISTENING(so) && knlist_empty(&so->so_rdsel.si_note))
4535 so->so_rcv.sb_flags &= ~SB_KNOTE;
4536 so_rdknl_unlock(so);
4543 struct socket *so; local
4545 so = kn->kn_fp->f_data;
4547 if (SOLISTENING(so)) {
4548 SOCK_LOCK_ASSERT(so);
4549 kn->kn_data = so->sol_qlen;
4550 if (so->so_error) {
4552 kn->kn_fflags = so->so_error;
4555 return (!TAILQ_EMPTY(&so->sol_comp));
4558 if ((so->so_rcv.sb_flags & SB_SPLICED) != 0)
4561 SOCK_RECVBUF_LOCK_ASSERT(so);
4563 kn->kn_data = sbavail(&so->so_rcv) - so->so_rcv.sb_ctl;
4564 if (so->so_rcv.sb_state & SBS_CANTRCVMORE) {
4566 kn->kn_fflags = so->so_error;
4568 } else if (so->so_error || so->so_rerror)
4574 } else if (sbavail(&so->so_rcv) >= so->so_rcv.sb_lowat)
4579 return (hhook_run_socket(so, NULL, HHOOK_FILT_SOREAD));
4588 struct socket *so = kn->kn_fp->f_data; local
4590 so_wrknl_lock(so);
4591 knlist_remove(&so->so_wrsel.si_note, kn, 1);
4592 if (!SOLISTENING(so) && knlist_empty(&so->so_wrsel.si_note))
4593 so->so_snd.sb_flags &= ~SB_KNOTE;
4594 so_wrknl_unlock(so);
4601 struct socket *so; local
4603 so = kn->kn_fp->f_data;
4605 if (SOLISTENING(so))
4608 SOCK_SENDBUF_LOCK_ASSERT(so);
4609 kn->kn_data = sbspace(&so->so_snd);
4612 hhook_run_socket(so, kn, HHOOK_FILT_SOWRITE);
4615 if (so->so_snd.sb_state & SBS_CANTSENDMORE) {
4617 kn->kn_fflags = so->so_error;
4619 } else if (so->so_error) /* temporary udp error */
4621 else if (((so->so_state & SS_ISCONNECTED) == 0) &&
4622 (so->so_proto->pr_flags & PR_CONNREQUIRED))
4627 return (kn->kn_data >= so->so_snd.sb_lowat);
4633 struct socket *so; local
4635 so = kn->kn_fp->f_data;
4637 if (SOLISTENING(so))
4640 SOCK_SENDBUF_LOCK_ASSERT(so);
4641 kn->kn_data = sbused(&so->so_snd);
4650 socheckuid(struct socket *so, uid_t uid) argument
4653 if (so == NULL)
4655 if (so->so_cred->cr_uid != uid)
4693 soisconnecting(struct socket *so) argument
4696 SOCK_LOCK(so);
4697 so->so_state &= ~(SS_ISCONNECTED|SS_ISDISCONNECTING);
4698 so->so_state |= SS_ISCONNECTING;
4699 SOCK_UNLOCK(so);
4703 soisconnected(struct socket *so) argument
4707 SOCK_LOCK(so);
4708 so->so_state &= ~(SS_ISCONNECTING|SS_ISDISCONNECTING);
4709 so->so_state |= SS_ISCONNECTED;
4711 if (so->so_qstate == SQ_INCOMP) {
4712 struct socket *head = so->so_listen;
4715 KASSERT(head, ("%s: so %p on incomp of NULL", __func__, so));
4725 SOCK_UNLOCK(so);
4727 SOCK_LOCK(so);
4728 if (__predict_false(head != so->so_listen)) {
4734 SOCK_UNLOCK(so);
4743 if ((so->so_options & SO_ACCEPTFILTER) == 0) {
4744 TAILQ_REMOVE(&head->sol_incomp, so, so_list);
4746 TAILQ_INSERT_TAIL(&head->sol_comp, so, so_list);
4748 so->so_qstate = SQ_COMP;
4749 SOCK_UNLOCK(so);
4752 SOCK_RECVBUF_LOCK(so);
4753 soupcall_set(so, SO_RCV,
4756 so->so_options &= ~SO_ACCEPTFILTER;
4757 ret = head->sol_accept_filter->accf_callback(so,
4760 soupcall_clear(so, SO_RCV);
4761 SOCK_RECVBUF_UNLOCK(so);
4764 SOCK_RECVBUF_UNLOCK(so);
4765 SOCK_UNLOCK(so);
4770 SOCK_UNLOCK(so);
4771 wakeup(&so->so_timeo);
4772 sorwakeup(so);
4773 sowwakeup(so);
4777 soisdisconnecting(struct socket *so) argument
4780 SOCK_LOCK(so);
4781 so->so_state &= ~SS_ISCONNECTING;
4782 so->so_state |= SS_ISDISCONNECTING;
4784 if (!SOLISTENING(so)) {
4785 SOCK_RECVBUF_LOCK(so);
4786 socantrcvmore_locked(so);
4787 SOCK_SENDBUF_LOCK(so);
4788 socantsendmore_locked(so);
4790 SOCK_UNLOCK(so);
4791 wakeup(&so->so_timeo);
4795 soisdisconnected(struct socket *so) argument
4798 SOCK_LOCK(so);
4807 so->so_state |= SS_ISDISCONNECTED;
4809 so->so_state &= ~(SS_ISCONNECTING|SS_ISCONNECTED|SS_ISDISCONNECTING);
4811 if (!SOLISTENING(so)) {
4812 SOCK_UNLOCK(so);
4813 SOCK_RECVBUF_LOCK(so);
4814 socantrcvmore_locked(so);
4815 SOCK_SENDBUF_LOCK(so);
4816 sbdrop_locked(&so->so_snd, sbused(&so->so_snd));
4817 socantsendmore_locked(so);
4819 SOCK_UNLOCK(so);
4820 wakeup(&so->so_timeo);
4824 soiolock(struct socket *so, struct sx *sx, int flags) argument
4843 if (__predict_false(SOLISTENING(so))) {
4874 sodtor_set(struct socket *so, so_dtor_t *func) argument
4877 SOCK_LOCK_ASSERT(so);
4878 so->so_dtor = func;
4885 soupcall_set(struct socket *so, sb_which which, so_upcall_t func, void *arg) argument
4889 KASSERT(!SOLISTENING(so), ("%s: so %p listening", __func__, so));
4893 sb = &so->so_rcv;
4896 sb = &so->so_snd;
4899 SOCK_BUF_LOCK_ASSERT(so, which);
4906 soupcall_clear(struct socket *so, sb_which which) argument
4910 KASSERT(!SOLISTENING(so), ("%s: so %p listening", __func__, so));
4914 sb = &so->so_rcv;
4917 sb = &so->so_snd;
4920 SOCK_BUF_LOCK_ASSERT(so, which);
4922 ("%s: so %p no upcall to clear", __func__, so));
4929 solisten_upcall_set(struct socket *so, so_upcall_t func, void *arg) argument
4932 SOLISTEN_LOCK_ASSERT(so);
4933 so->sol_upcall = func;
4934 so->sol_upcallarg = arg;
4940 struct socket *so = arg; local
4943 if (SOLISTENING(so)) {
4944 SOLISTEN_LOCK(so);
4946 SOCK_RECVBUF_LOCK(so);
4947 if (__predict_false(SOLISTENING(so))) {
4948 SOCK_RECVBUF_UNLOCK(so);
4957 struct socket *so = arg; local
4959 if (SOLISTENING(so))
4960 SOLISTEN_UNLOCK(so);
4962 SOCK_RECVBUF_UNLOCK(so);
4968 struct socket *so = arg; local
4971 if (SOLISTENING(so))
4972 SOLISTEN_LOCK_ASSERT(so);
4974 SOCK_RECVBUF_LOCK_ASSERT(so);
4976 if (SOLISTENING(so))
4977 SOLISTEN_UNLOCK_ASSERT(so);
4979 SOCK_RECVBUF_UNLOCK_ASSERT(so);
4986 struct socket *so = arg; local
4989 if (SOLISTENING(so)) {
4990 SOLISTEN_LOCK(so);
4992 SOCK_SENDBUF_LOCK(so);
4993 if (__predict_false(SOLISTENING(so))) {
4994 SOCK_SENDBUF_UNLOCK(so);
5003 struct socket *so = arg; local
5005 if (SOLISTENING(so))
5006 SOLISTEN_UNLOCK(so);
5008 SOCK_SENDBUF_UNLOCK(so);
5014 struct socket *so = arg; local
5017 if (SOLISTENING(so))
5018 SOLISTEN_LOCK_ASSERT(so);
5020 SOCK_SENDBUF_LOCK_ASSERT(so);
5022 if (SOLISTENING(so))
5023 SOLISTEN_UNLOCK_ASSERT(so);
5025 SOCK_SENDBUF_UNLOCK_ASSERT(so);
5031 * the kernel-format socket structure pointed to by so. This is done to
5038 sotoxsocket(struct socket *so, struct xsocket *xso) argument
5043 xso->xso_so = (uintptr_t)so;
5044 xso->so_type = so->so_type;
5045 xso->so_options = so->so_options;
5046 xso->so_linger = so->so_linger;
5047 xso->so_state = so->so_state;
5048 xso->so_pcb = (uintptr_t)so->so_pcb;
5049 xso->xso_protocol = so->so_proto->pr_protocol;
5050 xso->xso_family = so->so_proto->pr_domain->dom_family;
5051 xso->so_timeo = so->so_timeo;
5052 xso->so_error = so->so_error;
5053 xso->so_uid = so->so_cred->cr_uid;
5054 xso->so_pgid = so->so_sigio ? so->so_sigio->sio_pgid : 0;
5055 SOCK_LOCK(so);
5056 xso->so_fibnum = so->so_fibnum;
5057 if (SOLISTENING(so)) {
5058 xso->so_qlen = so->sol_qlen;
5059 xso->so_incqlen = so->sol_incqlen;
5060 xso->so_qlimit = so->sol_qlimit;
5063 xso->so_state |= so->so_qstate;
5065 xso->so_oobmark = so->so_oobmark;
5066 sbtoxsockbuf(&so->so_snd, &xso->so_snd);
5067 sbtoxsockbuf(&so->so_rcv, &xso->so_rcv);
5068 if ((so->so_rcv.sb_flags & SB_SPLICED) != 0)
5069 xso->so_splice_so = (uintptr_t)so->so_splice->dst;
5071 SOCK_UNLOCK(so);
5075 so_options_get(const struct socket *so) argument
5078 return (so->so_options);
5082 so_options_set(struct socket *so, int val) argument
5085 so->so_options = val;
5089 so_error_get(const struct socket *so) argument
5092 return (so->so_error);
5096 so_error_set(struct socket *so, int val) argument
5099 so->so_error = val;