MCPcopy Create free account
hub / github.com/F-Stack/f-stack / uipc_attach

Function uipc_attach

freebsd/kern/uipc_usrreq.c:516–585  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

514}
515
516static int
517uipc_attach(struct socket *so, int proto, struct thread *td)
518{
519 u_long sendspace, recvspace;
520 struct unpcb *unp;
521 int error;
522 bool locked;
523
524 KASSERT(so->so_pcb == NULL, ("uipc_attach: so_pcb != NULL"));
525 if (so->so_snd.sb_hiwat == 0 || so->so_rcv.sb_hiwat == 0) {
526 switch (so->so_type) {
527 case SOCK_STREAM:
528 sendspace = unpst_sendspace;
529 recvspace = unpst_recvspace;
530 break;
531
532 case SOCK_DGRAM:
533 sendspace = unpdg_sendspace;
534 recvspace = unpdg_recvspace;
535 break;
536
537 case SOCK_SEQPACKET:
538 sendspace = unpsp_sendspace;
539 recvspace = unpsp_recvspace;
540 break;
541
542 default:
543 panic("uipc_attach");
544 }
545 error = soreserve(so, sendspace, recvspace);
546 if (error)
547 return (error);
548 }
549 unp = uma_zalloc(unp_zone, M_NOWAIT | M_ZERO);
550 if (unp == NULL)
551 return (ENOBUFS);
552 LIST_INIT(&unp->unp_refs);
553 UNP_PCB_LOCK_INIT(unp);
554 unp->unp_socket = so;
555 so->so_pcb = unp;
556 refcount_init(&unp->unp_refcount, 1);
557
558 if ((locked = UNP_LINK_WOWNED()) == false)
559 UNP_LINK_WLOCK();
560
561 unp->unp_gencnt = ++unp_gencnt;
562 unp->unp_ino = ++unp_ino;
563 unp_count++;
564 switch (so->so_type) {
565 case SOCK_STREAM:
566 LIST_INSERT_HEAD(&unp_shead, unp, unp_link);
567 break;
568
569 case SOCK_DGRAM:
570 LIST_INSERT_HEAD(&unp_dhead, unp, unp_link);
571 break;
572
573 case SOCK_SEQPACKET:

Callers

nothing calls this directly

Calls 4

soreserveFunction · 0.85
refcount_initFunction · 0.85
panicFunction · 0.70
uma_zallocFunction · 0.50

Tested by

no test coverage detected