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

Function unp_connect2

freebsd/kern/uipc_usrreq.c:1680–1726  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1678}
1679
1680static int
1681unp_connect2(struct socket *so, struct socket *so2, int req)
1682{
1683 struct unpcb *unp;
1684 struct unpcb *unp2;
1685
1686 unp = sotounpcb(so);
1687 KASSERT(unp != NULL, ("unp_connect2: unp == NULL"));
1688 unp2 = sotounpcb(so2);
1689 KASSERT(unp2 != NULL, ("unp_connect2: unp2 == NULL"));
1690
1691 UNP_PCB_LOCK_ASSERT(unp);
1692 UNP_PCB_LOCK_ASSERT(unp2);
1693 KASSERT(unp->unp_conn == NULL,
1694 ("%s: socket %p is already connected", __func__, unp));
1695
1696 if (so2->so_type != so->so_type)
1697 return (EPROTOTYPE);
1698 unp->unp_conn = unp2;
1699 unp_pcb_hold(unp2);
1700 unp_pcb_hold(unp);
1701 switch (so->so_type) {
1702 case SOCK_DGRAM:
1703 UNP_REF_LIST_LOCK();
1704 LIST_INSERT_HEAD(&unp2->unp_refs, unp, unp_reflink);
1705 UNP_REF_LIST_UNLOCK();
1706 soisconnected(so);
1707 break;
1708
1709 case SOCK_STREAM:
1710 case SOCK_SEQPACKET:
1711 KASSERT(unp2->unp_conn == NULL,
1712 ("%s: socket %p is already connected", __func__, unp2));
1713 unp2->unp_conn = unp;
1714 if (req == PRU_CONNECT &&
1715 ((unp->unp_flags | unp2->unp_flags) & UNP_CONNWAIT))
1716 soisconnecting(so);
1717 else
1718 soisconnected(so);
1719 soisconnected(so2);
1720 break;
1721
1722 default:
1723 panic("unp_connect2");
1724 }
1725 return (0);
1726}
1727
1728static void
1729unp_disconnect(struct unpcb *unp, struct unpcb *unp2)

Callers 2

uipc_connect2Function · 0.85
unp_connectatFunction · 0.85

Calls 4

unp_pcb_holdFunction · 0.85
soisconnectedFunction · 0.85
soisconnectingFunction · 0.85
panicFunction · 0.70

Tested by

no test coverage detected