Lines Matching defs:so

171 soisconnecting(struct socket *so)
174 KASSERT(solocked(so));
176 so->so_state &= ~(SS_ISCONNECTED|SS_ISDISCONNECTING);
177 so->so_state |= SS_ISCONNECTING;
181 soisconnected(struct socket *so)
185 head = so->so_head;
187 KASSERT(solocked(so));
188 KASSERT(head == NULL || solocked2(so, head));
190 so->so_state &= ~(SS_ISCONNECTING | SS_ISDISCONNECTING);
191 so->so_state |= SS_ISCONNECTED;
192 if (head && so->so_onq == &head->so_q0) {
193 if ((so->so_options & SO_ACCEPTFILTER) == 0) {
198 soqremque(so, 0);
199 soqinsque(head, so, 1);
203 so->so_upcall =
205 so->so_upcallarg = head->so_accf->so_accept_filter_arg;
206 so->so_rcv.sb_flags |= SB_UPCALL;
207 so->so_options &= ~SO_ACCEPTFILTER;
208 (*so->so_upcall)(so, so->so_upcallarg,
212 cv_broadcast(&so->so_cv);
213 sorwakeup(so);
214 sowwakeup(so);
219 soisdisconnecting(struct socket *so)
222 KASSERT(solocked(so));
224 so->so_state &= ~SS_ISCONNECTING;
225 so->so_state |= (SS_ISDISCONNECTING|SS_CANTRCVMORE|SS_CANTSENDMORE);
226 cv_broadcast(&so->so_cv);
227 sowwakeup(so);
228 sorwakeup(so);
232 soisdisconnected(struct socket *so)
235 KASSERT(solocked(so));
237 so->so_state &= ~(SS_ISCONNECTING|SS_ISCONNECTED|SS_ISDISCONNECTING);
238 so->so_state |= (SS_CANTRCVMORE|SS_CANTSENDMORE|SS_ISDISCONNECTED);
239 cv_broadcast(&so->so_cv);
240 sowwakeup(so);
241 sorwakeup(so);
269 struct socket *so;
312 if ((so = soget(false)) == NULL) {
315 so->so_type = head->so_type;
316 so->so_options = head->so_options & ~SO_ACCEPTCONN;
317 so->so_linger = head->so_linger;
318 so->so_state = head->so_state | SS_NOFDREF;
319 so->so_proto = head->so_proto;
320 so->so_timeo = head->so_timeo;
321 so->so_pgid = head->so_pgid;
322 so->so_send = head->so_send;
323 so->so_receive = head->so_receive;
324 so->so_uidinfo = head->so_uidinfo;
325 so->so_egid = head->so_egid;
326 so->so_cpid = head->so_cpid;
332 * so_lock is stable while we hold the socket locked, so no
336 so->so_lock = head->so_lock;
342 so->so_mowner = head->so_mowner;
343 so->so_rcv.sb_mowner = head->so_rcv.sb_mowner;
344 so->so_snd.sb_mowner = head->so_snd.sb_mowner;
346 if (soreserve(so, head->so_snd.sb_hiwat, head->so_rcv.sb_hiwat)) {
349 so->so_snd.sb_lowat = head->so_snd.sb_lowat;
350 so->so_rcv.sb_lowat = head->so_rcv.sb_lowat;
351 so->so_rcv.sb_timeo = head->so_rcv.sb_timeo;
352 so->so_snd.sb_timeo = head->so_snd.sb_timeo;
353 so->so_rcv.sb_flags |= head->so_rcv.sb_flags & (SB_AUTOSIZE | SB_ASYNC);
354 so->so_snd.sb_flags |= head->so_snd.sb_flags & (SB_AUTOSIZE | SB_ASYNC);
358 * lock may be assigned at this point (if so, it will be held).
360 error = (*so->so_proto->pr_usrreqs->pr_attach)(so, 0);
363 KASSERT(solocked(so));
364 KASSERT(so->so_accf == NULL);
365 soput(so);
371 KASSERT(solocked2(head, so));
377 soqinsque(head, so, soqueue);
379 so->so_state |= SS_ISCONNECTED;
383 return so;
389 struct socket *so;
391 so = pool_cache_get(socket_cache, (waitok ? PR_WAITOK : PR_NOWAIT));
392 if (__predict_false(so == NULL))
394 memset(so, 0, sizeof(*so));
395 TAILQ_INIT(&so->so_q0);
396 TAILQ_INIT(&so->so_q);
397 cv_init(&so->so_cv, "socket");
398 cv_init(&so->so_rcv.sb_cv, "netio");
399 cv_init(&so->so_snd.sb_cv, "netio");
400 selinit(&so->so_rcv.sb_sel);
401 selinit(&so->so_snd.sb_sel);
402 so->so_rcv.sb_so = so;
403 so->so_snd.sb_so = so;
404 return so;
408 soput(struct socket *so)
411 KASSERT(!cv_has_waiters(&so->so_cv));
412 KASSERT(!cv_has_waiters(&so->so_rcv.sb_cv));
413 KASSERT(!cv_has_waiters(&so->so_snd.sb_cv));
414 seldestroy(&so->so_rcv.sb_sel);
415 seldestroy(&so->so_snd.sb_sel);
416 mutex_obj_free(so->so_lock);
417 cv_destroy(&so->so_cv);
418 cv_destroy(&so->so_rcv.sb_cv);
419 cv_destroy(&so->so_snd.sb_cv);
420 pool_cache_put(socket_cache, so);
431 soqinsque(struct socket *head, struct socket *so, int q)
434 KASSERT(solocked2(head, so));
435 KASSERT(so->so_onq == NULL);
436 KASSERT(so->so_head == NULL);
438 so->so_head = head;
441 so->so_onq = &head->so_q0;
444 so->so_onq = &head->so_q;
446 TAILQ_INSERT_TAIL(so->so_onq, so, so_qe);
456 soqremque(struct socket *so, int q)
458 struct socket *head = so->so_head;
461 KASSERT(solocked(so));
462 KASSERT(so->so_onq != NULL);
466 if (so->so_onq != &head->so_q0)
470 if (so->so_onq != &head->so_q)
474 KASSERT(solocked2(so, head));
475 TAILQ_REMOVE(so->so_onq, so, so_qe);
476 so->so_onq = NULL;
477 so->so_head = NULL;
488 socantsendmore(struct socket *so)
490 KASSERT(solocked(so));
492 so->so_state |= SS_CANTSENDMORE;
493 sowwakeup(so);
503 socantrcvmore(struct socket *so)
505 KASSERT(solocked(so));
507 so->so_state |= SS_CANTRCVMORE;
508 sorwakeup(so);
516 soroverflow(struct socket *so)
518 KASSERT(solocked(so));
520 so->so_rcv.sb_overflowed++;
521 if (so->so_options & SO_RERROR) {
522 so->so_rerror = SET_ERROR(ENOBUFS);
523 sorwakeup(so);
533 struct socket *so;
537 so = sb->sb_so;
539 KASSERT(solocked(so));
542 lock = so->so_lock;
547 if (__predict_false(lock != atomic_load_relaxed(&so->so_lock)))
548 solockretry(so, lock);
558 sowakeup(struct socket *so, struct sockbuf *sb, int code)
562 KASSERT(solocked(so));
563 KASSERT(sb->sb_so == so);
590 fownsignal(so->so_pgid, SIGIO, code, band, so);
592 (*so->so_upcall)(so, so->so_upcallarg, band, M_DONTWAIT);
597 * socket's condition variables so that they can restart their waits
603 solockreset(struct socket *so, kmutex_t *lock)
606 KASSERT(solocked(so));
608 so->so_lock = lock;
609 cv_broadcast(&so->so_snd.sb_cv);
610 cv_broadcast(&so->so_rcv.sb_cv);
611 cv_broadcast(&so->so_cv);
663 soreserve(struct socket *so, u_long sndcc, u_long rcvcc)
665 KASSERT(so->so_pcb == NULL || solocked(so));
671 * so we want to make sure (hiwat - lowat) >= (some bytes).
681 if (sbreserve(&so->so_snd, sndcc, so) == 0)
683 if (sbreserve(&so->so_rcv, rcvcc, so) == 0)
685 if (so->so_rcv.sb_lowat == 0)
686 so->so_rcv.sb_lowat = 1;
687 if (so->so_snd.sb_lowat == 0)
688 so->so_snd.sb_lowat = lowat;
689 if (so->so_snd.sb_lowat > so->so_snd.sb_hiwat)
690 so->so_snd.sb_lowat = so->so_snd.sb_hiwat;
693 sbrelease(&so->so_snd, so);
700 * Attempt to scale mbmax so that mbcnt doesn't become limiting
704 sbreserve(struct sockbuf *sb, u_long cc, struct socket *so)
710 KASSERT(so->so_pcb == NULL || solocked(so));
711 KASSERT(sb->sb_so == so);
719 uidinfo = so->so_uidinfo;
734 sbrelease(struct sockbuf *sb, struct socket *so)
737 KASSERT(sb->sb_so == so);
740 (void)chgsbsize(so->so_uidinfo, &sb->sb_hiwat, 0, RLIM_INFINITY);
1473 solockretry(struct socket *so, kmutex_t *lock)
1476 while (lock != atomic_load_relaxed(&so->so_lock)) {
1478 lock = atomic_load_consume(&so->so_lock);
1484 solocked(const struct socket *so)
1488 * Used only for diagnostic assertions, so so_lock should be
1491 return mutex_owned(so->so_lock);
1500 * Used only for diagnostic assertions, so so_lock should be
1513 sosetlock(struct socket *so)
1515 if (so->so_lock == NULL) {
1518 so->so_lock = lock;
1522 KASSERT(solocked(so));
1533 struct socket *so;
1546 so = sb->sb_so;
1547 lock = so->so_lock;
1549 cv_wait(&so->so_cv, lock);
1552 error = cv_wait_sig(&so->so_cv, lock);
1553 if (__predict_false(lock != atomic_load_relaxed(&so->so_lock)))
1554 solockretry(so, lock);
1563 struct socket *so;
1565 so = sb->sb_so;
1567 KASSERT(solocked(so));
1571 cv_broadcast(&so->so_cv);
1575 sowait(struct socket *so, bool catch_p, int timo)
1580 KASSERT(solocked(so));
1583 lock = so->so_lock;
1585 error = cv_timedwait_sig(&so->so_cv, lock, timo);
1587 error = cv_timedwait(&so->so_cv, lock, timo);
1588 if (__predict_false(lock != atomic_load_relaxed(&so->so_lock)))
1589 solockretry(so, lock);
1615 sofindproc(struct socket *so, int all, void (*pr)(const char *, ...))
1625 if (so == NULL)
1657 if ((struct socket *)fp->f_data != so) {
1664 so, p->p_comm, p->p_pid);
1682 struct socket *so;
1717 so = (struct socket *)fp->f_data;
1718 if (so == NULL)
1721 if (so->so_proto->pr_domain->dom_family == AF_INET)
1724 else if (so->so_proto->pr_domain->dom_family == AF_INET6)
1727 else if (so->so_proto->pr_domain->dom_family == pseudo_AF_KEY)
1729 else if (so->so_proto->pr_domain->dom_family == AF_ROUTE)
1734 sb_snd = &so->so_snd;
1735 sb_rcv = &so->so_rcv;
1741 pr("---SOCKET %p: type %s\n", so, family);
1743 sofindproc(so, opt_a == true ? 1 : 0, pr);