Lines Matching defs:so

137 	struct socket *so;
139 so = pool_get(&socket_pool, (wait == M_WAIT ? PR_WAITOK : PR_NOWAIT) |
141 if (so == NULL)
157 refcnt_init_trace(&so->so_refcnt, DT_REFCNT_IDX_SOCKET);
158 rw_init_flags(&so->so_lock, dom_name, RWL_DUPOK);
159 rw_init(&so->so_rcv.sb_lock, "sbufrcv");
160 rw_init(&so->so_snd.sb_lock, "sbufsnd");
161 mtx_init_flags(&so->so_rcv.sb_mtx, IPL_MPFLOOR, "sbrcv", 0);
162 mtx_init_flags(&so->so_snd.sb_mtx, IPL_MPFLOOR, "sbsnd", 0);
163 klist_init_mutex(&so->so_rcv.sb_klist, &so->so_rcv.sb_mtx);
164 klist_init_mutex(&so->so_snd.sb_klist, &so->so_snd.sb_mtx);
165 sigio_init(&so->so_sigio);
166 TAILQ_INIT(&so->so_q0);
167 TAILQ_INIT(&so->so_q);
169 return (so);
184 struct socket *so;
195 so = soalloc(prp, M_WAIT);
196 so->so_type = type;
198 so->so_state = SS_PRIV;
199 so->so_ruid = p->p_ucred->cr_ruid;
200 so->so_euid = p->p_ucred->cr_uid;
201 so->so_rgid = p->p_ucred->cr_rgid;
202 so->so_egid = p->p_ucred->cr_gid;
203 so->so_cpid = p->p_p->ps_pid;
204 so->so_proto = prp;
205 so->so_snd.sb_timeo_nsecs = INFSLP;
206 so->so_rcv.sb_timeo_nsecs = INFSLP;
208 solock(so);
209 error = pru_attach(so, proto, M_WAIT);
211 so->so_state |= SS_NOFDREF;
213 sofree(so, 0);
216 sounlock(so);
217 *aso = so;
222 sobind(struct socket *so, struct mbuf *nam, struct proc *p)
224 soassertlocked(so);
225 return pru_bind(so, nam, p);
229 solisten(struct socket *so, int backlog)
235 switch (so->so_type) {
243 soassertlocked(so);
245 if (so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING|SS_ISDISCONNECTING))
248 if (isspliced(so) || issplicedback(so))
251 error = pru_listen(so);
254 if (TAILQ_FIRST(&so->so_q) == NULL)
255 so->so_options |= SO_ACCEPTCONN;
260 so->so_qlimit = backlog;
265 sorele(struct socket *so)
267 if (refcnt_rele(&so->so_refcnt) == 0)
270 sigio_free(&so->so_sigio);
271 klist_free(&so->so_rcv.sb_klist);
272 klist_free(&so->so_snd.sb_klist);
274 mtx_enter(&so->so_snd.sb_mtx);
275 sbrelease(so, &so->so_snd);
276 mtx_leave(&so->so_snd.sb_mtx);
278 if (so->so_proto->pr_flags & PR_RIGHTS &&
279 so->so_proto->pr_domain->dom_dispose)
280 (*so->so_proto->pr_domain->dom_dispose)(so->so_rcv.sb_mb);
281 m_purge(so->so_rcv.sb_mb);
284 if (so->so_sp)
285 pool_put(&sosplice_pool, so->so_sp);
287 pool_put(&socket_pool, so);
293 sofree(struct socket *so, int keep_lock)
295 int persocket = solock_persocket(so);
297 soassertlocked(so);
299 if (so->so_pcb || (so->so_state & SS_NOFDREF) == 0) {
301 sounlock(so);
304 if (so->so_head) {
305 struct socket *head = so->so_head;
312 if (so->so_onq == &head->so_q) {
314 sounlock(so);
320 sounlock(so);
322 solock(so);
324 if (so->so_onq != &head->so_q0) {
325 sounlock(so);
332 soqremque(so, 0);
341 sounlock(so);
342 sorele(so);
346 solinger_nsec(struct socket *so)
348 if (so->so_linger == 0)
351 return SEC_TO_NSEC(so->so_linger);
360 soclose(struct socket *so, int flags)
365 solock(so);
367 sigio_free(&so->so_sigio);
368 if (so->so_state & SS_ISCONNECTED) {
369 if (so->so_pcb == NULL)
371 if ((so->so_state & SS_ISDISCONNECTING) == 0) {
372 error = sodisconnect(so);
376 if (so->so_options & SO_LINGER) {
377 if ((so->so_state & SS_ISDISCONNECTING) &&
380 while (so->so_state & SS_ISCONNECTED) {
381 error = sosleep_nsec(so, &so->so_timeo,
383 solinger_nsec(so));
390 if (so->so_pcb) {
392 error2 = pru_detach(so);
396 if (so->so_options & SO_ACCEPTCONN) {
397 int persocket = solock_persocket(so);
399 while ((so2 = TAILQ_FIRST(&so->so_q0)) != NULL) {
403 sounlock(so);
407 solock(so);
409 while ((so2 = TAILQ_FIRST(&so->so_q)) != NULL) {
414 sounlock(so);
419 solock(so);
424 if (so->so_sp) {
427 sounlock(so);
428 mtx_enter(&so->so_snd.sb_mtx);
433 if ((soback = so->so_sp->ssp_soback) == NULL) {
434 mtx_leave(&so->so_snd.sb_mtx);
438 mtx_leave(&so->so_snd.sb_mtx);
441 * `so' can be only unspliced, and never spliced again.
442 * Thus if issplicedback(so) check is positive, socket is
447 if (issplicedback(so)) {
450 if (so->so_sp->ssp_soback == so)
452 sounsplice(so->so_sp->ssp_soback, so, freeing);
458 sblock(&so->so_rcv, SBL_WAIT | SBL_NOINTR);
459 if (isspliced(so)) {
463 if (so == so->so_sp->ssp_socket)
465 sosp = soref(so->so_sp->ssp_socket);
466 sounsplice(so, so->so_sp->ssp_socket, freeing);
469 sbunlock(&so->so_rcv);
471 timeout_del_barrier(&so->so_sp->ssp_idleto);
472 task_del(sosplice_taskq, &so->so_sp->ssp_task);
475 solock(so);
479 if (so->so_state & SS_NOFDREF)
480 panic("soclose NOFDREF: so %p, so_type %d", so, so->so_type);
481 so->so_state |= SS_NOFDREF;
484 sofree(so, 0);
489 soabort(struct socket *so)
491 soassertlocked(so);
492 pru_abort(so);
496 soaccept(struct socket *so, struct mbuf *nam)
500 soassertlocked(so);
502 if ((so->so_state & SS_NOFDREF) == 0)
503 panic("soaccept !NOFDREF: so %p, so_type %d", so, so->so_type);
504 so->so_state &= ~SS_NOFDREF;
505 if ((so->so_state & SS_ISDISCONNECTED) == 0 ||
506 (so->so_proto->pr_flags & PR_ABRTACPTDIS) == 0)
507 error = pru_accept(so, nam);
514 soconnect(struct socket *so, struct mbuf *nam)
518 soassertlocked(so);
520 if (so->so_options & SO_ACCEPTCONN)
528 if (so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING) &&
529 ((so->so_proto->pr_flags & PR_CONNREQUIRED) ||
530 (error = sodisconnect(so))))
533 error = pru_connect(so, nam);
556 sodisconnect(struct socket *so)
560 soassertlocked(so);
562 if ((so->so_state & SS_ISCONNECTED) == 0)
564 if (so->so_state & SS_ISDISCONNECTING)
566 error = pru_disconnect(so);
591 sosend(struct socket *so, struct mbuf *addr, struct uio *uio, struct mbuf *top,
597 int atomic = sosendallatonce(so) || top;
604 if (so->so_type == SOCK_STREAM && (flags & MSG_EOR)) {
620 if (so->so_proto->pr_domain->dom_family == AF_UNIX &&
631 if ((error = sblock(&so->so_snd, SBLOCKWAIT(flags))) != 0)
633 mtx_enter(&so->so_snd.sb_mtx);
634 so->so_snd.sb_state |= SS_ISSENDING;
636 if (so->so_snd.sb_state & SS_CANTSENDMORE)
638 if ((error = READ_ONCE(so->so_error))) {
639 so->so_error = 0;
642 if ((so->so_state & SS_ISCONNECTED) == 0) {
643 if (so->so_proto->pr_flags & PR_CONNREQUIRED) {
649 space = sbspace_locked(so, &so->so_snd);
652 if (so->so_proto->pr_domain->dom_family == AF_UNIX) {
653 if (atomic && resid > so->so_snd.sb_hiwat)
656 if (clen > so->so_snd.sb_hiwat ||
657 (atomic && resid > so->so_snd.sb_hiwat - clen))
662 (atomic || space < so->so_snd.sb_lowat))) {
665 sbunlock(&so->so_snd);
666 error = sbwait(&so->so_snd);
667 so->so_snd.sb_state &= ~SS_ISSENDING;
668 mtx_leave(&so->so_snd.sb_mtx);
683 mtx_leave(&so->so_snd.sb_mtx);
685 mtx_enter(&so->so_snd.sb_mtx);
694 so->so_snd.sb_state &= ~SS_ISSENDING;
695 if (top && so->so_options & SO_ZEROIZE)
697 mtx_leave(&so->so_snd.sb_mtx);
698 solock_shared(so);
700 error = pru_sendoob(so, top, addr, control);
702 error = pru_send(so, top, addr, control);
703 sounlock_shared(so);
704 mtx_enter(&so->so_snd.sb_mtx);
714 so->so_snd.sb_state &= ~SS_ISSENDING;
715 mtx_leave(&so->so_snd.sb_mtx);
716 sbunlock(&so->so_snd);
792 * into the socket buffer so that other consumers see the values
828 * must begin with an address if the protocol so specifies,
841 soreceive(struct socket *so, struct mbuf **paddr, struct uio *uio,
849 const struct protosw *pr = so->so_proto;
864 solock_shared(so);
865 error = pru_rcvoob(so, m, flags & MSG_PEEK);
866 sounlock_shared(so);
882 if ((error = sblock(&so->so_rcv, SBLOCKWAIT(flags))) != 0)
884 mtx_enter(&so->so_rcv.sb_mtx);
886 m = so->so_rcv.sb_mb;
888 if (isspliced(so))
903 so->so_rcv.sb_cc < uio->uio_resid) &&
904 (so->so_rcv.sb_cc < so->so_rcv.sb_lowat ||
905 ((flags & MSG_WAITALL) && uio->uio_resid <= so->so_rcv.sb_hiwat)) &&
908 if (m == NULL && so->so_rcv.sb_cc)
910 if (!isspliced(so))
912 panic("receive 1: so %p, so_type %d, sb_cc %lu",
913 so, so->so_type, so->so_rcv.sb_cc);
915 if ((error2 = READ_ONCE(so->so_error))) {
920 so->so_error = 0;
923 if (so->so_rcv.sb_state & SS_CANTRCVMORE) {
926 else if (so->so_rcv.sb_cc == 0)
931 m = so->so_rcv.sb_mb;
934 if ((so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING)) == 0 &&
935 (so->so_proto->pr_flags & PR_CONNREQUIRED)) {
945 SBLASTRECORDCHK(&so->so_rcv, "soreceive sbwait 1");
946 SBLASTMBUFCHK(&so->so_rcv, "soreceive sbwait 1");
948 sbunlock(&so->so_rcv);
949 error = sbwait(&so->so_rcv);
950 mtx_leave(&so->so_rcv.sb_mtx);
971 KASSERT(m == so->so_rcv.sb_mb);
972 SBLASTRECORDCHK(&so->so_rcv, "soreceive 1");
973 SBLASTMBUFCHK(&so->so_rcv, "soreceive 1");
978 panic("receive 1a: so %p, so_type %d, m %p, m_type %d",
979 so, so->so_type, m, m->m_type);
987 sbfree(&so->so_rcv, m);
990 so->so_rcv.sb_mb = m->m_next;
992 m = so->so_rcv.sb_mb;
994 so->so_rcv.sb_mb = m_free(m);
995 m = so->so_rcv.sb_mb;
997 sbsync(&so->so_rcv, nextrecord);
1011 sbfree(&so->so_rcv, m);
1012 so->so_rcv.sb_mb = m->m_next;
1015 m = so->so_rcv.sb_mb;
1016 sbsync(&so->so_rcv, nextrecord);
1019 mtx_leave(&so->so_rcv.sb_mtx);
1023 mtx_enter(&so->so_rcv.sb_mtx);
1032 mtx_leave(&so->so_rcv.sb_mtx);
1034 mtx_enter(&so->so_rcv.sb_mtx);
1040 nextrecord = so->so_rcv.sb_mb->m_nextpkt;
1042 nextrecord = so->so_rcv.sb_mb;
1058 SBLASTRECORDCHK(&so->so_rcv, "soreceive 2");
1059 SBLASTMBUFCHK(&so->so_rcv, "soreceive 2");
1078 panic("receive 3: so %p, so_type %d, m %p, m_type %d",
1079 so, so->so_type, m, m->m_type);
1082 so->so_rcv.sb_state &= ~SS_RCVATMARK;
1084 if (so->so_oobmark && len > so->so_oobmark - offset)
1085 len = so->so_oobmark - offset;
1097 SBLASTRECORDCHK(&so->so_rcv, "soreceive uiomove");
1098 SBLASTMBUFCHK(&so->so_rcv, "soreceive uiomove");
1100 mtx_leave(&so->so_rcv.sb_mtx);
1102 mtx_enter(&so->so_rcv.sb_mtx);
1116 sbfree(&so->so_rcv, m);
1120 so->so_rcv.sb_mb = m = m->m_next;
1123 so->so_rcv.sb_mb = m_free(m);
1124 m = so->so_rcv.sb_mb;
1128 * so->so_rcv.sb_mb != NULL.
1130 KASSERT(so->so_rcv.sb_mb == m);
1134 so->so_rcv.sb_lastrecord = m;
1136 so->so_rcv.sb_mb = nextrecord;
1137 SB_EMPTY_FIXUP(&so->so_rcv);
1139 SBLASTRECORDCHK(&so->so_rcv, "soreceive 3");
1140 SBLASTMBUFCHK(&so->so_rcv, "soreceive 3");
1151 so->so_rcv.sb_cc -= len;
1152 so->so_rcv.sb_datacc -= len;
1155 if (so->so_oobmark) {
1157 so->so_oobmark -= len;
1158 if (so->so_oobmark == 0) {
1159 so->so_rcv.sb_state |= SS_RCVATMARK;
1164 if (offset == so->so_oobmark)
1178 !sosendallatonce(so) && !nextrecord) {
1179 if (so->so_rcv.sb_state & SS_CANTRCVMORE ||
1180 so->so_error)
1182 SBLASTRECORDCHK(&so->so_rcv, "soreceive sbwait 2");
1183 SBLASTMBUFCHK(&so->so_rcv, "soreceive sbwait 2");
1184 if (sbwait(&so->so_rcv)) {
1185 mtx_leave(&so->so_rcv.sb_mtx);
1186 sbunlock(&so->so_rcv);
1189 if ((m = so->so_rcv.sb_mb) != NULL)
1197 (void) sbdroprecord(so, &so->so_rcv);
1206 so->so_rcv.sb_mb = nextrecord;
1207 if (so->so_rcv.sb_mb == NULL) {
1208 so->so_rcv.sb_mbtail = NULL;
1209 so->so_rcv.sb_lastrecord = NULL;
1211 so->so_rcv.sb_lastrecord = nextrecord;
1213 SBLASTRECORDCHK(&so->so_rcv, "soreceive 4");
1214 SBLASTMBUFCHK(&so->so_rcv, "soreceive 4");
1216 mtx_leave(&so->so_rcv.sb_mtx);
1217 solock_shared(so);
1218 pru_rcvd(so);
1219 sounlock_shared(so);
1220 mtx_enter(&so->so_rcv.sb_mtx);
1225 (so->so_rcv.sb_state & SS_CANTRCVMORE) == 0) {
1226 mtx_leave(&so->so_rcv.sb_mtx);
1227 sbunlock(&so->so_rcv);
1237 mtx_leave(&so->so_rcv.sb_mtx);
1238 sbunlock(&so->so_rcv);
1243 soshutdown(struct socket *so, int how)
1249 sorflush(so);
1252 sorflush(so);
1255 solock(so);
1256 error = pru_shutdown(so);
1257 sounlock(so);
1268 sorflush(struct socket *so)
1270 struct sockbuf *sb = &so->so_rcv;
1272 const struct protosw *pr = so->so_proto;
1279 solock_shared(so);
1280 socantrcvmore(so);
1281 sounlock_shared(so);
1336 sosplice(struct socket *so, int fd, off_t max, struct timeval *tv)
1343 if ((so->so_proto->pr_flags & PR_SPLICE) == 0)
1352 if ((error = sblock(&so->so_rcv, SBL_WAIT)) != 0)
1354 if (so->so_sp && so->so_sp->ssp_socket) {
1355 sosp = soref(so->so_sp->ssp_socket);
1356 sounsplice(so, so->so_sp->ssp_socket, 0);
1360 sbunlock(&so->so_rcv);
1389 so->so_proto->pr_usrreqs->pru_send) {
1394 if ((error = sblock(&so->so_rcv, SBL_WAIT)) != 0)
1397 sbunlock(&so->so_rcv);
1400 sosplice_solock_pair(so, sosp);
1402 if ((so->so_options & SO_ACCEPTCONN) ||
1407 if ((so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING)) == 0 &&
1408 (so->so_proto->pr_flags & PR_CONNREQUIRED)) {
1416 if (so->so_sp == NULL) {
1420 timeout_set_flags(&so_sp->ssp_idleto, soidle, so,
1422 task_set(&so_sp->ssp_task, sotask, so);
1424 so->so_sp = so_sp;
1436 if (so->so_sp->ssp_socket || sosp->so_sp->ssp_soback) {
1441 so->so_splicelen = 0;
1442 so->so_splicemax = max;
1444 so->so_idletv = *tv;
1446 timerclear(&so->so_idletv);
1453 /* Splice so and sosp together. */
1454 mtx_enter(&so->so_rcv.sb_mtx);
1456 so->so_sp->ssp_socket = sosp;
1457 sosp->so_sp->ssp_soback = so;
1459 mtx_leave(&so->so_rcv.sb_mtx);
1461 sosplice_sounlock_pair(so, sosp);
1464 if (somove(so, M_WAIT)) {
1465 mtx_enter(&so->so_rcv.sb_mtx);
1467 so->so_rcv.sb_flags |= SB_SPLICE;
1470 mtx_leave(&so->so_rcv.sb_mtx);
1473 sbunlock(&so->so_rcv);
1478 sosplice_sounlock_pair(so, sosp);
1480 sbunlock(&so->so_rcv);
1487 sounsplice(struct socket *so, struct socket *sosp, int freeing)
1489 sbassertlocked(&so->so_rcv);
1491 mtx_enter(&so->so_rcv.sb_mtx);
1493 so->so_rcv.sb_flags &= ~SB_SPLICE;
1495 so->so_sp->ssp_socket = sosp->so_sp->ssp_soback = NULL;
1497 mtx_leave(&so->so_rcv.sb_mtx);
1499 task_del(sosplice_taskq, &so->so_splicetask);
1500 timeout_del(&so->so_idleto);
1506 solock_shared(so);
1507 mtx_enter(&so->so_rcv.sb_mtx);
1508 readable = soreadable(so);
1509 mtx_leave(&so->so_rcv.sb_mtx);
1511 sorwakeup(so);
1512 sounlock_shared(so);
1525 struct socket *so = arg;
1527 sblock(&so->so_rcv, SBL_WAIT | SBL_NOINTR);
1528 if (so->so_rcv.sb_flags & SB_SPLICE) {
1531 WRITE_ONCE(so->so_error, ETIMEDOUT);
1532 sosp = soref(so->so_sp->ssp_socket);
1533 sounsplice(so, so->so_sp->ssp_socket, 0);
1536 sbunlock(&so->so_rcv);
1542 struct socket *so = arg;
1545 sblock(&so->so_rcv, SBL_WAIT | SBL_NOINTR);
1546 if (so->so_rcv.sb_flags & SB_SPLICE) {
1547 if (so->so_proto->pr_flags & PR_WANTRCVD)
1549 somove(so, M_DONTWAIT);
1551 sbunlock(&so->so_rcv);
1566 somove(struct socket *so, int wait)
1568 struct socket *sosp = so->so_sp->ssp_socket;
1575 sbassertlocked(&so->so_rcv);
1577 if (so->so_proto->pr_flags & PR_WANTRCVD)
1578 sblock(&so->so_snd, SBL_WAIT | SBL_NOINTR);
1580 mtx_enter(&so->so_rcv.sb_mtx);
1584 if ((error = READ_ONCE(so->so_error)))
1601 len = so->so_rcv.sb_datacc;
1602 if (so->so_splicemax) {
1603 KASSERT(so->so_splicelen < so->so_splicemax);
1604 if (so->so_splicemax <= so->so_splicelen + len) {
1605 len = so->so_splicemax - so->so_splicelen;
1610 if (so->so_oobmark && so->so_oobmark < len &&
1611 so->so_oobmark < space + 1024)
1625 SBLASTRECORDCHK(&so->so_rcv, "somove 1");
1626 SBLASTMBUFCHK(&so->so_rcv, "somove 1");
1627 m = so->so_rcv.sb_mb;
1633 if (so->so_proto->pr_flags & PR_ADDR) {
1636 panic("somove soname: so %p, so_type %d, m %p, "
1637 "m_type %d", so, so->so_type, m, m->m_type);
1644 sbdroprecord(so, &so->so_rcv);
1645 if (so->so_proto->pr_flags & PR_WANTRCVD) {
1647 mtx_leave(&so->so_rcv.sb_mtx);
1648 solock_shared(so);
1649 pru_rcvd(so);
1650 sounlock_shared(so);
1651 mtx_enter(&so->so_rcv.sb_mtx);
1671 if (so->so_proto->pr_flags & PR_ATOMIC) {
1673 panic("somove !PKTHDR: so %p, so_type %d, m %p, "
1674 "m_type %d", so, so->so_type, m, m->m_type);
1689 m = so->so_rcv.sb_mb;
1690 sbfree(&so->so_rcv, m);
1691 so->so_rcv.sb_mb = m_free(m);
1692 sbsync(&so->so_rcv, nextrecord);
1698 m = so->so_rcv.sb_mb;
1700 sbfree(&so->so_rcv, m);
1701 so->so_rcv.sb_mb = m_free(m);
1702 m = so->so_rcv.sb_mb;
1703 sbsync(&so->so_rcv, nextrecord);
1706 SBLASTRECORDCHK(&so->so_rcv, "somove 2");
1707 SBLASTMBUFCHK(&so->so_rcv, "somove 2");
1716 panic("somove type: so %p, so_type %d, m %p, "
1717 "m_type %d", so, so->so_type, *mp, (*mp)->m_type);
1728 *mp = m_copym(so->so_rcv.sb_mb, 0, size, wait);
1733 so->so_rcv.sb_mb->m_data += size;
1734 so->so_rcv.sb_mb->m_len -= size;
1735 so->so_rcv.sb_cc -= size;
1736 so->so_rcv.sb_datacc -= size;
1738 *mp = so->so_rcv.sb_mb;
1739 sbfree(&so->so_rcv, *mp);
1740 so->so_rcv.sb_mb = (*mp)->m_next;
1741 sbsync(&so->so_rcv, nextrecord);
1746 SBLASTRECORDCHK(&so->so_rcv, "somove 3");
1747 SBLASTMBUFCHK(&so->so_rcv, "somove 3");
1748 SBCHECK(so, &so->so_rcv);
1758 rcvstate = so->so_rcv.sb_state;
1759 so->so_rcv.sb_state &= ~SS_RCVATMARK;
1760 oobmark = so->so_oobmark;
1761 so->so_oobmark = oobmark > len ? oobmark - len : 0;
1764 so->so_rcv.sb_state |= SS_RCVATMARK;
1770 if (so->so_proto->pr_flags & PR_WANTRCVD) {
1772 mtx_leave(&so->so_rcv.sb_mtx);
1773 solock_shared(so);
1774 pru_rcvd(so);
1775 sounlock_shared(so);
1776 mtx_enter(&so->so_rcv.sb_mtx);
1785 (so->so_options & SO_OOBINLINE)) {
1795 mtx_leave(&so->so_rcv.sb_mtx);
1799 mtx_enter(&so->so_rcv.sb_mtx);
1810 so->so_splicelen += oobmark;
1821 mtx_leave(&so->so_rcv.sb_mtx);
1825 mtx_enter(&so->so_rcv.sb_mtx);
1835 so->so_splicelen += 1;
1846 if (so->so_rcv.sb_cc == 0 || maxreached)
1850 mtx_leave(&so->so_rcv.sb_mtx);
1854 mtx_enter(&so->so_rcv.sb_mtx);
1863 so->so_splicelen += len;
1872 if (!error && maxreached && so->so_splicemax == so->so_splicelen)
1875 WRITE_ONCE(so->so_error, error);
1877 if (((so->so_rcv.sb_state & SS_CANTRCVMORE) &&
1878 so->so_rcv.sb_cc == 0) ||
1884 mtx_leave(&so->so_rcv.sb_mtx);
1886 if (so->so_proto->pr_flags & PR_WANTRCVD)
1887 sbunlock(&so->so_snd);
1891 sounsplice(so, sosp, 0);
1896 if (timerisset(&so->so_idletv))
1897 timeout_add_tv(&so->so_idleto, &so->so_idletv);
1903 sorwakeup(struct socket *so)
1906 if (so->so_proto->pr_flags & PR_SPLICE) {
1907 mtx_enter(&so->so_rcv.sb_mtx);
1908 if (so->so_rcv.sb_flags & SB_SPLICE)
1909 task_add(sosplice_taskq, &so->so_splicetask);
1910 if (isspliced(so)) {
1911 mtx_leave(&so->so_rcv.sb_mtx);
1914 mtx_leave(&so->so_rcv.sb_mtx);
1917 sowakeup(so, &so->so_rcv);
1918 if (so->so_upcall)
1919 (*(so->so_upcall))(so, so->so_upcallarg, M_DONTWAIT);
1923 sowwakeup(struct socket *so)
1926 if (so->so_proto->pr_flags & PR_SPLICE) {
1927 mtx_enter(&so->so_snd.sb_mtx);
1928 if (so->so_snd.sb_flags & SB_SPLICE)
1930 &so->so_sp->ssp_soback->so_splicetask);
1931 if (issplicedback(so)) {
1932 mtx_leave(&so->so_snd.sb_mtx);
1935 mtx_leave(&so->so_snd.sb_mtx);
1938 sowakeup(so, &so->so_snd);
1942 sosetopt(struct socket *so, int level, int optname, struct mbuf *m)
1947 if (so->so_proto->pr_ctloutput) {
1948 solock(so);
1949 error = (*so->so_proto->pr_ctloutput)(PRCO_SETOPT, so,
1951 sounlock(so);
1964 solock(so);
1965 so->so_linger = mtod(m, struct linger *)->l_linger;
1967 so->so_options |= optname;
1969 so->so_options &= ~optname;
1970 sounlock(so);
1990 solock(so);
1992 so->so_options |= optname;
1994 so->so_options &= ~optname;
1995 sounlock(so);
2012 &so->so_snd : &so->so_rcv);
2031 sbreserve(so, sb, cnt)) {
2052 &so->so_snd : &so->so_rcv);
2074 if (so->so_proto->pr_domain &&
2075 so->so_proto->pr_domain->dom_protosw &&
2076 so->so_proto->pr_ctloutput) {
2078 so->so_proto->pr_domain;
2081 solock(so);
2082 error = (*so->so_proto->pr_ctloutput)
2083 (PRCO_SETOPT, so, level, optname, m);
2084 sounlock(so);
2091 error = sosplice(so, -1, 0, NULL);
2095 error = sosplice(so, *mtod(m, int *), 0, NULL);
2097 error = sosplice(so,
2115 sogetopt(struct socket *so, int level, int optname, struct mbuf *m)
2120 if (so->so_proto->pr_ctloutput) {
2123 solock(so);
2124 error = (*so->so_proto->pr_ctloutput)(PRCO_GETOPT, so,
2126 sounlock(so);
2137 solock_shared(so);
2139 so->so_options & SO_LINGER;
2140 mtod(m, struct linger *)->l_linger = so->so_linger;
2141 sounlock_shared(so);
2155 *mtod(m, int *) = so->so_options & optname;
2163 *mtod(m, int *) = so->so_type;
2167 solock(so);
2168 *mtod(m, int *) = so->so_error;
2169 so->so_error = 0;
2170 sounlock(so);
2175 *mtod(m, int *) = so->so_proto->pr_domain->dom_family;
2179 *mtod(m, int *) = so->so_proto->pr_protocol;
2183 *mtod(m, int *) = so->so_snd.sb_hiwat;
2187 *mtod(m, int *) = so->so_rcv.sb_hiwat;
2191 *mtod(m, int *) = so->so_snd.sb_lowat;
2195 *mtod(m, int *) = so->so_rcv.sb_lowat;
2202 &so->so_snd : &so->so_rcv);
2219 if (so->so_proto->pr_domain &&
2220 so->so_proto->pr_domain->dom_protosw &&
2221 so->so_proto->pr_ctloutput) {
2223 so->so_proto->pr_domain;
2226 solock(so);
2227 error = (*so->so_proto->pr_ctloutput)
2228 (PRCO_GETOPT, so, level, optname, m);
2229 sounlock(so);
2242 solock_shared(so);
2243 len = so->so_sp ? so->so_sp->ssp_len : 0;
2244 sounlock_shared(so);
2251 if (so->so_proto->pr_protocol == AF_UNIX) {
2252 struct unpcb *unp = sotounpcb(so);
2254 solock(so);
2259 sounlock(so);
2262 sounlock(so);
2276 sohasoutofband(struct socket *so)
2278 pgsigio(&so->so_sigio, SIGURG, 0);
2279 knote(&so->so_rcv.sb_klist, 0);
2283 sofilt_lock(struct socket *so, struct sockbuf *sb)
2285 switch (so->so_proto->pr_domain->dom_family) {
2291 rw_enter_write(&so->so_lock);
2299 sofilt_unlock(struct socket *so, struct sockbuf *sb)
2303 switch (so->so_proto->pr_domain->dom_family) {
2309 rw_exit_write(&so->so_lock);
2317 struct socket *so = kn->kn_fp->f_data;
2323 sb = &so->so_rcv;
2327 sb = &so->so_snd;
2331 sb = &so->so_rcv;
2345 struct socket *so = kn->kn_fp->f_data;
2347 klist_remove(&so->so_rcv.sb_klist, kn);
2353 struct socket *so = kn->kn_fp->f_data;
2354 u_int state = READ_ONCE(so->so_state);
2355 u_int error = READ_ONCE(so->so_error);
2358 MUTEX_ASSERT_LOCKED(&so->so_rcv.sb_mtx);
2360 if (so->so_options & SO_ACCEPTCONN) {
2361 short qlen = READ_ONCE(so->so_qlen);
2363 soassertlocked_readonly(so);
2373 rv = qlen || soreadable(so);
2380 kn->kn_data = so->so_rcv.sb_cc;
2382 if (isspliced(so)) {
2386 if (so->so_rcv.sb_state & SS_CANTRCVMORE) {
2399 rv = (kn->kn_data >= so->so_rcv.sb_lowat);
2408 struct socket *so = kn->kn_fp->f_data;
2410 klist_remove(&so->so_snd.sb_klist, kn);
2416 struct socket *so = kn->kn_fp->f_data;
2417 u_int state = READ_ONCE(so->so_state);
2418 u_int error = READ_ONCE(so->so_error);
2421 MUTEX_ASSERT_LOCKED(&so->so_snd.sb_mtx);
2423 kn->kn_data = sbspace_locked(so, &so->so_snd);
2424 if (so->so_snd.sb_state & SS_CANTSENDMORE) {
2435 (so->so_proto->pr_flags & PR_CONNREQUIRED)) {
2440 rv = (kn->kn_data >= so->so_snd.sb_lowat);
2449 struct socket *so = kn->kn_fp->f_data;
2452 MUTEX_ASSERT_LOCKED(&so->so_rcv.sb_mtx);
2455 if (isspliced(so)) {
2460 if (so->so_oobmark || (so->so_rcv.sb_state & SS_RCVATMARK)) {
2462 kn->kn_data -= so->so_oobmark;
2468 u_int state = READ_ONCE(so->so_state);
2482 struct socket *so = kn->kn_fp->f_data;
2485 sofilt_lock(so, &so->so_snd);
2487 sofilt_unlock(so, &so->so_snd);
2495 struct socket *so = kn->kn_fp->f_data;
2498 sofilt_lock(so, &so->so_snd);
2500 sofilt_unlock(so, &so->so_snd);
2508 struct socket *so = kn->kn_fp->f_data;
2511 sofilt_lock(so, &so->so_rcv);
2513 sofilt_unlock(so, &so->so_rcv);
2521 struct socket *so = kn->kn_fp->f_data;
2524 sofilt_lock(so, &so->so_rcv);
2526 sofilt_unlock(so, &so->so_rcv);
2559 struct socket *so = v;
2561 (*pr)("socket %p\n", so);
2562 (*pr)("so_type: %i\n", so->so_type);
2563 (*pr)("so_options: 0x%04x\n", so->so_options); /* %b */
2564 (*pr)("so_linger: %i\n", so->so_linger);
2565 (*pr)("so_state: 0x%04x\n", so->so_state);
2566 (*pr)("so_pcb: %p\n", so->so_pcb);
2567 (*pr)("so_proto: %p\n", so->so_proto);
2568 (*pr)("so_sigio: %p\n", so->so_sigio.sir_sigio);
2570 (*pr)("so_head: %p\n", so->so_head);
2571 (*pr)("so_onq: %p\n", so->so_onq);
2572 (*pr)("so_q0: @%p first: %p\n", &so->so_q0, TAILQ_FIRST(&so->so_q0));
2573 (*pr)("so_q: @%p first: %p\n", &so->so_q, TAILQ_FIRST(&so->so_q));
2574 (*pr)("so_eq: next: %p\n", TAILQ_NEXT(so, so_qe));
2575 (*pr)("so_q0len: %i\n", so->so_q0len);
2576 (*pr)("so_qlen: %i\n", so->so_qlen);
2577 (*pr)("so_qlimit: %i\n", so->so_qlimit);
2578 (*pr)("so_timeo: %i\n", so->so_timeo);
2579 (*pr)("so_obmark: %lu\n", so->so_oobmark);
2581 (*pr)("so_sp: %p\n", so->so_sp);
2582 if (so->so_sp != NULL) {
2583 (*pr)("\tssp_socket: %p\n", so->so_sp->ssp_socket);
2584 (*pr)("\tssp_soback: %p\n", so->so_sp->ssp_soback);
2586 (unsigned long long)so->so_sp->ssp_len);
2588 (unsigned long long)so->so_sp->ssp_max);
2589 (*pr)("\tssp_idletv: %lld %ld\n", so->so_sp->ssp_idletv.tv_sec,
2590 so->so_sp->ssp_idletv.tv_usec);
2592 timeout_pending(&so->so_sp->ssp_idleto) ? "" : "not ",
2593 so->so_sp->ssp_idleto.to_time);
2597 sobuf_print(&so->so_rcv, pr);
2599 sobuf_print(&so->so_snd, pr);
2602 so->so_upcall, so->so_upcallarg);
2604 (*pr)("so_euid: %d so_ruid: %d\n", so->so_euid, so->so_ruid);
2605 (*pr)("so_egid: %d so_rgid: %d\n", so->so_egid, so->so_rgid);
2606 (*pr)("so_cpid: %d\n", so->so_cpid);