Lines Matching refs:pcb

158 	(ng_btsocket_rfcomm_pcb_p pcb, u_int8_t cr, u_int8_t flow_control, 
167 (ng_btsocket_rfcomm_pcb_p pcb);
169 (ng_btsocket_rfcomm_pcb_p pcb);
171 (ng_btsocket_rfcomm_pcb_p pcb);
174 (ng_btsocket_rfcomm_pcb_p pcb, int limit);
176 (ng_btsocket_rfcomm_pcb_p pcb, int error);
183 (ng_btsocket_rfcomm_pcb_p pcb);
185 (ng_btsocket_rfcomm_pcb_p pcb);
391 ng_btsocket_rfcomm_pcb_p pcb = so2rfcomm_pcb(so);
404 if (pcb != NULL)
416 pcb = malloc(sizeof(*pcb),
418 if (pcb == NULL)
422 so->so_pcb = (caddr_t) pcb;
423 pcb->so = so;
426 pcb->state = NG_BTSOCKET_RFCOMM_DLC_CLOSED;
427 pcb->flags = NG_BTSOCKET_RFCOMM_DLC_CFC;
429 pcb->lmodem =
430 pcb->rmodem = (RFCOMM_MODEM_RTC | RFCOMM_MODEM_RTR | RFCOMM_MODEM_DV);
432 pcb->mtu = RFCOMM_DEFAULT_MTU;
433 pcb->tx_cred = 0;
434 pcb->rx_cred = RFCOMM_DEFAULT_CREDITS;
436 mtx_init(&pcb->pcb_mtx, "btsocks_rfcomm_pcb_mtx", NULL, MTX_DEF);
437 callout_init_mtx(&pcb->timo, &pcb->pcb_mtx, 0);
441 LIST_INSERT_HEAD(&ng_btsocket_rfcomm_sockets, pcb, next);
455 ng_btsocket_rfcomm_pcb_t *pcb = so2rfcomm_pcb(so), *pcb1;
458 if (pcb == NULL)
471 mtx_lock(&pcb->pcb_mtx);
481 mtx_unlock(&pcb->pcb_mtx);
490 bcopy(&sa->rfcomm_bdaddr, &pcb->src, sizeof(pcb->src));
491 pcb->channel = sa->rfcomm_channel;
493 mtx_unlock(&pcb->pcb_mtx);
506 ng_btsocket_rfcomm_pcb_t *pcb = so2rfcomm_pcb(so);
512 if (pcb == NULL)
538 * Look for session between "pcb->src" and "sa->rfcomm_bdaddr" (dst)
543 s = ng_btsocket_rfcomm_session_by_addr(&pcb->src, &sa->rfcomm_bdaddr);
557 &pcb->src, &sa->rfcomm_bdaddr, td);
572 mtx_lock(&pcb->pcb_mtx);
577 mtx_unlock(&pcb->pcb_mtx);
597 bcopy(&sa->rfcomm_bdaddr, &pcb->dst, sizeof(pcb->dst));
598 pcb->channel = sa->rfcomm_channel;
599 pcb->dlci = dlci;
601 LIST_INSERT_HEAD(&s->dlcs, pcb, session_next);
602 pcb->session = s;
604 ng_btsocket_rfcomm_timeout(pcb);
605 soisconnecting(pcb->so);
608 pcb->mtu = s->mtu;
609 bcopy(&so2l2cap_pcb(s->l2so)->src, &pcb->src,
610 sizeof(pcb->src));
612 pcb->state = NG_BTSOCKET_RFCOMM_DLC_CONFIGURING;
614 error = ng_btsocket_rfcomm_send_pn(pcb);
618 pcb->state = NG_BTSOCKET_RFCOMM_DLC_W4_CONNECT;
626 mtx_unlock(&pcb->pcb_mtx);
652 ng_btsocket_rfcomm_pcb_p pcb = so2rfcomm_pcb(so);
656 if (pcb == NULL)
661 mtx_lock(&pcb->pcb_mtx);
667 error = sooptcopyout(sopt, &pcb->mtu, sizeof(pcb->mtu));
671 fcinfo.lmodem = pcb->lmodem;
672 fcinfo.rmodem = pcb->rmodem;
673 fcinfo.tx_cred = pcb->tx_cred;
674 fcinfo.rx_cred = pcb->rx_cred;
675 fcinfo.cfc = (pcb->flags & NG_BTSOCKET_RFCOMM_DLC_CFC)?
701 mtx_unlock(&pcb->pcb_mtx);
713 ng_btsocket_rfcomm_pcb_p pcb = so2rfcomm_pcb(so);
715 KASSERT(pcb != NULL, ("ng_btsocket_rfcomm_detach: pcb == NULL"));
717 mtx_lock(&pcb->pcb_mtx);
719 switch (pcb->state) {
725 if (pcb->flags & NG_BTSOCKET_RFCOMM_DLC_TIMO)
726 ng_btsocket_rfcomm_untimeout(pcb);
728 if (pcb->state == NG_BTSOCKET_RFCOMM_DLC_W4_CONNECT)
729 pcb->flags |= NG_BTSOCKET_RFCOMM_DLC_DETACHED;
731 pcb->state = NG_BTSOCKET_RFCOMM_DLC_DISCONNECTING;
741 while (pcb->state != NG_BTSOCKET_RFCOMM_DLC_CLOSED)
742 msleep(&pcb->state, &pcb->pcb_mtx, PZERO, "rf_det", 0);
744 if (pcb->session != NULL)
745 panic("%s: pcb->session != NULL\n", __func__);
746 if (pcb->flags & NG_BTSOCKET_RFCOMM_DLC_TIMO)
748 __func__, pcb->flags);
751 LIST_REMOVE(pcb, next);
754 mtx_unlock(&pcb->pcb_mtx);
756 mtx_destroy(&pcb->pcb_mtx);
757 bzero(pcb, sizeof(*pcb));
758 free(pcb, M_NETGRAPH_BTSOCKET_RFCOMM);
771 ng_btsocket_rfcomm_pcb_p pcb = so2rfcomm_pcb(so);
773 if (pcb == NULL)
776 mtx_lock(&pcb->pcb_mtx);
778 if (pcb->state == NG_BTSOCKET_RFCOMM_DLC_DISCONNECTING) {
779 mtx_unlock(&pcb->pcb_mtx);
784 if (pcb->flags & NG_BTSOCKET_RFCOMM_DLC_TIMO)
785 ng_btsocket_rfcomm_untimeout(pcb);
787 switch (pcb->state) {
797 pcb->state = NG_BTSOCKET_RFCOMM_DLC_DISCONNECTING;
809 __func__, pcb->state, pcb->flags);
813 mtx_unlock(&pcb->pcb_mtx);
825 ng_btsocket_rfcomm_pcb_p pcb = so2rfcomm_pcb(so), pcb1;
830 if (pcb == NULL)
832 if (pcb->channel > 30)
837 mtx_lock(&pcb->pcb_mtx);
839 if (pcb->channel == 0) {
844 bcmp(&pcb1->src, &pcb->src, sizeof(pcb->src)) == 0)
847 for (pcb->channel = 30; pcb->channel > 0; pcb->channel --)
848 if (!(usedchannels & (1 << (pcb->channel - 1))))
851 if (pcb->channel == 0) {
853 mtx_unlock(&pcb->pcb_mtx);
861 mtx_unlock(&pcb->pcb_mtx);
932 ng_btsocket_rfcomm_pcb_p pcb = so2rfcomm_pcb(so);
935 if (pcb == NULL)
938 bcopy(&pcb->dst, &sa.rfcomm_bdaddr, sizeof(sa.rfcomm_bdaddr));
939 sa.rfcomm_channel = pcb->channel;
956 ng_btsocket_rfcomm_pcb_t *pcb = so2rfcomm_pcb(so);
960 if (pcb == NULL || m == NULL || control != NULL) {
965 mtx_lock(&pcb->pcb_mtx);
968 if (pcb->state != NG_BTSOCKET_RFCOMM_DLC_CONNECTED) {
969 mtx_unlock(&pcb->pcb_mtx);
975 sbappend(&pcb->so->so_snd, m, flags);
978 if (!(pcb->flags & NG_BTSOCKET_RFCOMM_DLC_SENDING)) {
979 pcb->flags |= NG_BTSOCKET_RFCOMM_DLC_SENDING;
983 mtx_unlock(&pcb->pcb_mtx);
998 ng_btsocket_rfcomm_pcb_p pcb = so2rfcomm_pcb(so);
1001 if (pcb == NULL)
1004 bcopy(&pcb->src, &sa.rfcomm_bdaddr, sizeof(sa.rfcomm_bdaddr));
1005 sa.rfcomm_channel = pcb->channel;
1150 ng_btsocket_rfcomm_pcb_p pcb = NULL, pcb1 = NULL;
1162 pcb = ng_btsocket_rfcomm_pcb_listener(&l2pcb->src, channel);
1163 if (pcb == NULL)
1172 mtx_lock(&pcb->pcb_mtx);
1174 if (pcb->so->so_qlen <= pcb->so->so_qlimit) {
1175 CURVNET_SET(pcb->so->so_vnet);
1176 so1 = sonewconn(pcb->so, 0);
1180 mtx_unlock(&pcb->pcb_mtx);
1216 ng_btsocket_rfcomm_pcb_p pcb = NULL, pcb_next = NULL;
1229 for (pcb = LIST_FIRST(&s->dlcs); pcb != NULL; ) {
1230 mtx_lock(&pcb->pcb_mtx);
1231 pcb_next = LIST_NEXT(pcb, session_next);
1233 if (pcb->state == NG_BTSOCKET_RFCOMM_DLC_W4_CONNECT) {
1234 pcb->mtu = s->mtu;
1235 bcopy(&so2l2cap_pcb(s->l2so)->src, &pcb->src,
1236 sizeof(pcb->src));
1238 error = ng_btsocket_rfcomm_send_pn(pcb);
1240 pcb->state = NG_BTSOCKET_RFCOMM_DLC_CONFIGURING;
1242 ng_btsocket_rfcomm_pcb_kill(pcb, error);
1245 mtx_unlock(&pcb->pcb_mtx);
1246 pcb = pcb_next;
1681 ng_btsocket_rfcomm_pcb_p pcb = NULL, pcb_next = NULL;
1691 for (pcb = LIST_FIRST(&s->dlcs); pcb != NULL; ) {
1692 mtx_lock(&pcb->pcb_mtx);
1693 pcb_next = LIST_NEXT(pcb, session_next);
1697 __func__, pcb->dlci, pcb->state, pcb->flags);
1699 if (pcb->state == NG_BTSOCKET_RFCOMM_DLC_CONNECTED)
1704 ng_btsocket_rfcomm_pcb_kill(pcb, error);
1706 mtx_unlock(&pcb->pcb_mtx);
1707 pcb = pcb_next;
1718 ng_btsocket_rfcomm_pcb_p pcb = NULL, pcb_next = NULL;
1728 for (pcb = LIST_FIRST(&s->dlcs); pcb != NULL; ) {
1729 mtx_lock(&pcb->pcb_mtx);
1730 pcb_next = LIST_NEXT(pcb, session_next);
1732 switch (pcb->state) {
1740 if (pcb->flags & NG_BTSOCKET_RFCOMM_DLC_DETACHED)
1741 ng_btsocket_rfcomm_pcb_kill(pcb, 0);
1742 else if (pcb->flags & NG_BTSOCKET_RFCOMM_DLC_TIMEDOUT)
1743 ng_btsocket_rfcomm_pcb_kill(pcb, ETIMEDOUT);
1754 if (pcb->flags & NG_BTSOCKET_RFCOMM_DLC_TIMEDOUT)
1755 ng_btsocket_rfcomm_pcb_kill(pcb, ETIMEDOUT);
1768 error = ng_btsocket_rfcomm_pcb_send(pcb, ALOT);
1770 ng_btsocket_rfcomm_pcb_kill(pcb, error);
1783 if (!(pcb->flags & NG_BTSOCKET_RFCOMM_DLC_TIMO)) {
1785 pcb->session, RFCOMM_FRAME_DISC,
1786 pcb->dlci);
1788 ng_btsocket_rfcomm_timeout(pcb);
1790 ng_btsocket_rfcomm_pcb_kill(pcb, error);
1791 } else if (pcb->flags & NG_BTSOCKET_RFCOMM_DLC_TIMEDOUT)
1792 ng_btsocket_rfcomm_pcb_kill(pcb, ETIMEDOUT);
1798 __func__, pcb->state, pcb->flags);
1802 mtx_unlock(&pcb->pcb_mtx);
1803 pcb = pcb_next;
1986 ng_btsocket_rfcomm_pcb_p pcb = NULL;
2036 pcb = ng_btsocket_rfcomm_pcb_by_dlci(s, dlci);
2037 if (pcb != NULL) {
2038 mtx_lock(&pcb->pcb_mtx);
2040 if (pcb->state != NG_BTSOCKET_RFCOMM_DLC_CONNECTING) {
2043 __func__, dlci, pcb->state, pcb->flags);
2044 mtx_unlock(&pcb->pcb_mtx);
2049 ng_btsocket_rfcomm_untimeout(pcb);
2053 error = ng_btsocket_rfcomm_send_msc(pcb);
2056 pcb->state = NG_BTSOCKET_RFCOMM_DLC_CONNECTED;
2057 soisconnected(pcb->so);
2059 ng_btsocket_rfcomm_pcb_kill(pcb, error);
2061 mtx_unlock(&pcb->pcb_mtx);
2071 pcb = ng_btsocket_rfcomm_connect_ind(s, RFCOMM_SRVCHANNEL(dlci));
2072 if (pcb != NULL) {
2073 mtx_lock(&pcb->pcb_mtx);
2075 pcb->dlci = dlci;
2079 error = ng_btsocket_rfcomm_send_msc(pcb);
2082 pcb->state = NG_BTSOCKET_RFCOMM_DLC_CONNECTED;
2083 soisconnected(pcb->so);
2085 ng_btsocket_rfcomm_pcb_kill(pcb, error);
2087 mtx_unlock(&pcb->pcb_mtx);
2102 ng_btsocket_rfcomm_pcb_p pcb = NULL;
2125 pcb = ng_btsocket_rfcomm_pcb_by_dlci(s, dlci);
2126 if (pcb != NULL) {
2129 mtx_lock(&pcb->pcb_mtx);
2133 __func__, dlci, pcb->state, pcb->flags);
2138 if (pcb->state == NG_BTSOCKET_RFCOMM_DLC_CONNECTED)
2143 ng_btsocket_rfcomm_pcb_kill(pcb, err);
2145 mtx_unlock(&pcb->pcb_mtx);
2165 ng_btsocket_rfcomm_pcb_p pcb = NULL;
2200 pcb = ng_btsocket_rfcomm_pcb_by_dlci(s, dlci);
2201 if (pcb != NULL) {
2202 mtx_lock(&pcb->pcb_mtx);
2206 __func__, dlci, pcb->state, pcb->flags);
2208 switch (pcb->state) {
2210 ng_btsocket_rfcomm_untimeout(pcb);
2212 error = ng_btsocket_rfcomm_send_msc(pcb);
2214 pcb->state = NG_BTSOCKET_RFCOMM_DLC_CONNECTED;
2215 soisconnected(pcb->so);
2220 ng_btsocket_rfcomm_pcb_kill(pcb, 0);
2226 __func__, dlci, pcb->state, pcb->flags);
2231 mtx_unlock(&pcb->pcb_mtx);
2249 ng_btsocket_rfcomm_pcb_p pcb = NULL;
2264 pcb = ng_btsocket_rfcomm_pcb_by_dlci(s, dlci);
2265 if (pcb != NULL) {
2266 mtx_lock(&pcb->pcb_mtx);
2270 __func__, dlci, pcb->state, pcb->flags);
2272 if (pcb->state == NG_BTSOCKET_RFCOMM_DLC_CONNECTED)
2277 ng_btsocket_rfcomm_pcb_kill(pcb, error);
2279 mtx_unlock(&pcb->pcb_mtx);
2296 ng_btsocket_rfcomm_pcb_p pcb = NULL;
2315 pcb = ng_btsocket_rfcomm_pcb_by_dlci(s, dlci);
2316 if (pcb == NULL) {
2323 mtx_lock(&pcb->pcb_mtx);
2326 if (pcb->state != NG_BTSOCKET_RFCOMM_DLC_CONNECTED) {
2329 __func__, dlci, pcb->state, pcb->flags);
2335 if (((pcb->flags & NG_BTSOCKET_RFCOMM_DLC_CFC) && pcb->rx_cred <= 0) ||
2336 (pcb->lmodem & RFCOMM_MODEM_FC)) {
2340 __func__, dlci, pcb->state, pcb->flags,
2341 pcb->rx_cred, pcb->lmodem);
2346 if ((pcb->flags & NG_BTSOCKET_RFCOMM_DLC_CFC) && pf) {
2350 __func__, *mtod(m0, u_int8_t *), dlci, pcb->state,
2351 pcb->flags, pcb->rx_cred, pcb->tx_cred);
2353 pcb->tx_cred += *mtod(m0, u_int8_t *);
2357 ng_btsocket_rfcomm_pcb_send(pcb, ALOT);
2363 if (pcb->flags & NG_BTSOCKET_RFCOMM_DLC_CFC) {
2365 if (-- pcb->rx_cred <= RFCOMM_MAX_CREDITS / 2)
2366 ng_btsocket_rfcomm_send_credits(pcb);
2370 "rx_cred=%d, tx_cred=%d\n", __func__, dlci, pcb->state, pcb->flags,
2371 pcb->rx_cred, pcb->tx_cred);
2375 if (m0->m_pkthdr.len > pcb->mtu) {
2378 __func__, dlci, pcb->state, pcb->flags,
2379 pcb->mtu, m0->m_pkthdr.len);
2382 } else if (m0->m_pkthdr.len > sbspace(&pcb->so->so_rcv)) {
2393 __func__, dlci, pcb->state, pcb->flags,
2394 m0->m_pkthdr.len, sbspace(&pcb->so->so_rcv));
2399 sbappend(&pcb->so->so_rcv, m0, 0);
2402 sorwakeup(pcb->so);
2406 mtx_unlock(&pcb->pcb_mtx);
2606 ng_btsocket_rfcomm_pcb_t *pcb = NULL;
2619 pcb = ng_btsocket_rfcomm_pcb_by_dlci(s, RFCOMM_DLCI(msc->address));
2620 if (pcb == NULL) {
2629 mtx_lock(&pcb->pcb_mtx);
2631 if (pcb->state != NG_BTSOCKET_RFCOMM_DLC_CONNECTING &&
2632 pcb->state != NG_BTSOCKET_RFCOMM_DLC_CONNECTED) {
2636 pcb->state);
2638 mtx_unlock(&pcb->pcb_mtx);
2644 pcb->rmodem = msc->modem; /* Update remote port signals */
2652 if (!(pcb->rmodem & RFCOMM_MODEM_FC) &&
2653 !(pcb->flags & NG_BTSOCKET_RFCOMM_DLC_CFC))
2654 ng_btsocket_rfcomm_pcb_send(pcb, ALOT);
2657 mtx_unlock(&pcb->pcb_mtx);
2822 ng_btsocket_rfcomm_pcb_t *pcb = NULL;
2844 pcb = ng_btsocket_rfcomm_pcb_by_dlci(s, pn->dlci);
2845 if (pcb != NULL) {
2846 mtx_lock(&pcb->pcb_mtx);
2850 ng_btsocket_rfcomm_set_pn(pcb, 1, pn->flow_control,
2853 if (pcb->flags & NG_BTSOCKET_RFCOMM_DLC_CFC) {
2867 if (pcb->state == NG_BTSOCKET_RFCOMM_DLC_CONFIGURING) {
2868 ng_btsocket_rfcomm_set_pn(pcb, 0,
2871 pcb->state = NG_BTSOCKET_RFCOMM_DLC_CONNECTING;
2877 __func__, pn->dlci, pcb->state);
2882 mtx_unlock(&pcb->pcb_mtx);
2885 pcb = ng_btsocket_rfcomm_connect_ind(s,
2887 if (pcb != NULL) {
2888 mtx_lock(&pcb->pcb_mtx);
2890 pcb->dlci = pn->dlci;
2892 ng_btsocket_rfcomm_set_pn(pcb, 1, pn->flow_control,
2895 if (pcb->flags & NG_BTSOCKET_RFCOMM_DLC_CFC) {
2909 ng_btsocket_rfcomm_timeout(pcb);
2910 pcb->state = NG_BTSOCKET_RFCOMM_DLC_CONNECTING;
2911 soisconnecting(pcb->so);
2913 ng_btsocket_rfcomm_pcb_kill(pcb, error);
2915 mtx_unlock(&pcb->pcb_mtx);
2929 * Set PN parameters for dlci. Caller must hold pcb->pcb_mtx.
2951 ng_btsocket_rfcomm_set_pn(ng_btsocket_rfcomm_pcb_p pcb, u_int8_t cr,
2954 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
2956 pcb->mtu = le16toh(mtu);
2960 pcb->flags |= NG_BTSOCKET_RFCOMM_DLC_CFC;
2961 pcb->tx_cred = credits;
2963 pcb->flags &= ~NG_BTSOCKET_RFCOMM_DLC_CFC;
2964 pcb->tx_cred = 0;
2968 pcb->flags |= NG_BTSOCKET_RFCOMM_DLC_CFC;
2969 pcb->tx_cred = credits;
2971 pcb->flags &= ~NG_BTSOCKET_RFCOMM_DLC_CFC;
2972 pcb->tx_cred = 0;
2978 __func__, cr, pcb->dlci, pcb->state, pcb->flags, pcb->mtu,
2979 pcb->rx_cred, pcb->tx_cred);
3109 * Send MSC request. Caller must hold pcb->pcb_mtx and pcb->session->session_mtx
3113 ng_btsocket_rfcomm_send_msc(ng_btsocket_rfcomm_pcb_p pcb)
3119 mtx_assert(&pcb->session->session_mtx, MA_OWNED);
3120 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
3134 msc->address = RFCOMM_MKADDRESS(1, pcb->dlci);
3135 msc->modem = pcb->lmodem;
3139 __func__, pcb->dlci, pcb->state, pcb->flags, msc->address,
3142 return (ng_btsocket_rfcomm_send_uih(pcb->session,
3143 RFCOMM_MKADDRESS(INITIATOR(pcb->session), 0), 0, 0, m));
3147 * Send PN request. Caller must hold pcb->pcb_mtx and pcb->session->session_mtx
3151 ng_btsocket_rfcomm_send_pn(ng_btsocket_rfcomm_pcb_p pcb)
3157 mtx_assert(&pcb->session->session_mtx, MA_OWNED);
3158 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
3172 pn->dlci = pcb->dlci;
3179 pn->priority = (pcb->dlci < 56)? (((pcb->dlci >> 3) << 3) + 7) : 61;
3181 pn->mtu = htole16(pcb->mtu);
3184 if (pcb->flags & NG_BTSOCKET_RFCOMM_DLC_CFC) {
3186 pn->credits = pcb->rx_cred;
3194 "credits=%d\n", __func__, pcb->dlci, pcb->state, pcb->flags, pcb->mtu,
3197 return (ng_btsocket_rfcomm_send_uih(pcb->session,
3198 RFCOMM_MKADDRESS(INITIATOR(pcb->session), 0), 0, 0, m));
3206 ng_btsocket_rfcomm_send_credits(ng_btsocket_rfcomm_pcb_p pcb)
3211 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
3212 mtx_assert(&pcb->session->session_mtx, MA_OWNED);
3217 __func__, pcb->dlci, pcb->state, pcb->flags, pcb->mtu,
3218 sbspace(&pcb->so->so_rcv), pcb->tx_cred, pcb->rx_cred);
3220 credits = sbspace(&pcb->so->so_rcv) / pcb->mtu;
3222 if (pcb->rx_cred + credits > RFCOMM_MAX_CREDITS)
3223 credits = RFCOMM_MAX_CREDITS - pcb->rx_cred;
3226 pcb->session,
3227 RFCOMM_MKADDRESS(INITIATOR(pcb->session),
3228 pcb->dlci), 1, credits, NULL);
3230 pcb->rx_cred += credits;
3234 "rx_cred=%d, tx_cred=%d\n", __func__, credits, pcb->dlci, pcb->state,
3235 pcb->flags, pcb->rx_cred, pcb->tx_cred);
3240 __func__, error, pcb->dlci, pcb->state,
3241 pcb->flags, pcb->mtu, sbspace(&pcb->so->so_rcv),
3242 pcb->tx_cred, pcb->rx_cred);
3256 * Caller must hold pcb->pcb_mtx and pcb->session->session_mtx
3260 ng_btsocket_rfcomm_pcb_send(ng_btsocket_rfcomm_pcb_p pcb, int limit)
3265 mtx_assert(&pcb->session->session_mtx, MA_OWNED);
3266 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
3268 if (pcb->flags & NG_BTSOCKET_RFCOMM_DLC_CFC)
3269 limit = min(limit, pcb->tx_cred);
3270 else if (!(pcb->rmodem & RFCOMM_MODEM_FC))
3279 __func__, pcb->dlci, pcb->flags, pcb->rmodem,
3280 pcb->tx_cred);
3286 length = min(pcb->mtu, sbavail(&pcb->so->so_snd));
3291 m = ng_btsocket_rfcomm_prepare_packet(&pcb->so->so_snd, length);
3297 sbdrop(&pcb->so->so_snd, length);
3299 error = ng_btsocket_rfcomm_send_uih(pcb->session,
3300 RFCOMM_MKADDRESS(INITIATOR(pcb->session),
3301 pcb->dlci), 0, 0, m);
3306 if (pcb->flags & NG_BTSOCKET_RFCOMM_DLC_CFC)
3307 pcb->tx_cred -= sent;
3310 pcb->flags &= ~NG_BTSOCKET_RFCOMM_DLC_SENDING;
3311 sowwakeup(pcb->so);
3320 * Caller must hold pcb->pcb_mtx and pcb->session->session_mtx
3324 ng_btsocket_rfcomm_pcb_kill(ng_btsocket_rfcomm_pcb_p pcb, int error)
3326 ng_btsocket_rfcomm_session_p s = pcb->session;
3330 __func__, pcb->so, pcb->dlci, pcb->state, pcb->flags, error);
3332 if (pcb->session == NULL)
3333 panic("%s: DLC without session, pcb=%p, state=%d, flags=%#x\n",
3334 __func__, pcb, pcb->state, pcb->flags);
3336 mtx_assert(&pcb->session->session_mtx, MA_OWNED);
3337 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
3339 if (pcb->flags & NG_BTSOCKET_RFCOMM_DLC_TIMO)
3340 ng_btsocket_rfcomm_untimeout(pcb);
3343 LIST_REMOVE(pcb, session_next);
3344 pcb->session = NULL;
3347 pcb->state = NG_BTSOCKET_RFCOMM_DLC_CLOSED;
3348 pcb->so->so_error = error;
3349 soisdisconnected(pcb->so);
3350 wakeup(&pcb->state);
3401 ng_btsocket_rfcomm_pcb_p pcb = NULL;
3405 LIST_FOREACH(pcb, &s->dlcs, session_next)
3406 if (pcb->dlci == dlci)
3409 return (pcb);
3419 ng_btsocket_rfcomm_pcb_p pcb = NULL, pcb1 = NULL;
3423 LIST_FOREACH(pcb, &ng_btsocket_rfcomm_sockets, next) {
3424 if (pcb->channel != channel ||
3425 !(pcb->so->so_options & SO_ACCEPTCONN))
3428 if (bcmp(&pcb->src, src, sizeof(*src)) == 0)
3431 if (bcmp(&pcb->src, NG_HCI_BDADDR_ANY, sizeof(bdaddr_t)) == 0)
3432 pcb1 = pcb;
3437 return ((pcb != NULL)? pcb : pcb1);
3451 ng_btsocket_rfcomm_timeout(ng_btsocket_rfcomm_pcb_p pcb)
3453 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
3455 if (!(pcb->flags & NG_BTSOCKET_RFCOMM_DLC_TIMO)) {
3456 pcb->flags |= NG_BTSOCKET_RFCOMM_DLC_TIMO;
3457 pcb->flags &= ~NG_BTSOCKET_RFCOMM_DLC_TIMEDOUT;
3458 callout_reset(&pcb->timo, ng_btsocket_rfcomm_timo * hz,
3459 ng_btsocket_rfcomm_process_timeout, pcb);
3465 * Unset pcb timeout. Caller MUST hold pcb_mtx
3469 ng_btsocket_rfcomm_untimeout(ng_btsocket_rfcomm_pcb_p pcb)
3471 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
3473 if (pcb->flags & NG_BTSOCKET_RFCOMM_DLC_TIMO) {
3474 callout_stop(&pcb->timo);
3475 pcb->flags &= ~NG_BTSOCKET_RFCOMM_DLC_TIMO;
3476 pcb->flags &= ~NG_BTSOCKET_RFCOMM_DLC_TIMEDOUT;
3482 * Process pcb timeout
3488 ng_btsocket_rfcomm_pcb_p pcb = (ng_btsocket_rfcomm_pcb_p) xpcb;
3490 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
3494 __func__, pcb->so, pcb->dlci, pcb->state, pcb->flags);
3496 pcb->flags &= ~NG_BTSOCKET_RFCOMM_DLC_TIMO;
3497 pcb->flags |= NG_BTSOCKET_RFCOMM_DLC_TIMEDOUT;
3499 switch (pcb->state) {
3502 pcb->state = NG_BTSOCKET_RFCOMM_DLC_DISCONNECTING;
3512 __func__, pcb->dlci, pcb->state, pcb->flags);