• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /freebsd-13-stable/sys/netgraph/bluetooth/socket/

Lines Matching refs:pcb

160 	(ng_btsocket_rfcomm_pcb_p pcb, u_int8_t cr, u_int8_t flow_control, 
169 (ng_btsocket_rfcomm_pcb_p pcb);
171 (ng_btsocket_rfcomm_pcb_p pcb);
173 (ng_btsocket_rfcomm_pcb_p pcb);
176 (ng_btsocket_rfcomm_pcb_p pcb, int limit);
178 (ng_btsocket_rfcomm_pcb_p pcb, int error);
185 (ng_btsocket_rfcomm_pcb_p pcb);
187 (ng_btsocket_rfcomm_pcb_p pcb);
394 ng_btsocket_rfcomm_pcb_p pcb = so2rfcomm_pcb(so);
407 if (pcb != NULL)
419 pcb = malloc(sizeof(*pcb),
421 if (pcb == NULL)
425 so->so_pcb = (caddr_t) pcb;
426 pcb->so = so;
429 pcb->state = NG_BTSOCKET_RFCOMM_DLC_CLOSED;
430 pcb->flags = NG_BTSOCKET_RFCOMM_DLC_CFC;
432 pcb->lmodem =
433 pcb->rmodem = (RFCOMM_MODEM_RTC | RFCOMM_MODEM_RTR | RFCOMM_MODEM_DV);
435 pcb->mtu = RFCOMM_DEFAULT_MTU;
436 pcb->tx_cred = 0;
437 pcb->rx_cred = RFCOMM_DEFAULT_CREDITS;
439 mtx_init(&pcb->pcb_mtx, "btsocks_rfcomm_pcb_mtx", NULL, MTX_DEF);
440 callout_init_mtx(&pcb->timo, &pcb->pcb_mtx, 0);
444 LIST_INSERT_HEAD(&ng_btsocket_rfcomm_sockets, pcb, next);
458 ng_btsocket_rfcomm_pcb_t *pcb = so2rfcomm_pcb(so), *pcb1;
461 if (pcb == NULL)
474 mtx_lock(&pcb->pcb_mtx);
484 mtx_unlock(&pcb->pcb_mtx);
493 bcopy(&sa->rfcomm_bdaddr, &pcb->src, sizeof(pcb->src));
494 pcb->channel = sa->rfcomm_channel;
496 mtx_unlock(&pcb->pcb_mtx);
509 ng_btsocket_rfcomm_pcb_t *pcb = so2rfcomm_pcb(so);
515 if (pcb == NULL)
541 * Look for session between "pcb->src" and "sa->rfcomm_bdaddr" (dst)
546 s = ng_btsocket_rfcomm_session_by_addr(&pcb->src, &sa->rfcomm_bdaddr);
560 &pcb->src, &sa->rfcomm_bdaddr, td);
575 mtx_lock(&pcb->pcb_mtx);
580 mtx_unlock(&pcb->pcb_mtx);
600 bcopy(&sa->rfcomm_bdaddr, &pcb->dst, sizeof(pcb->dst));
601 pcb->channel = sa->rfcomm_channel;
602 pcb->dlci = dlci;
604 LIST_INSERT_HEAD(&s->dlcs, pcb, session_next);
605 pcb->session = s;
607 ng_btsocket_rfcomm_timeout(pcb);
608 soisconnecting(pcb->so);
611 pcb->mtu = s->mtu;
612 bcopy(&so2l2cap_pcb(s->l2so)->src, &pcb->src,
613 sizeof(pcb->src));
615 pcb->state = NG_BTSOCKET_RFCOMM_DLC_CONFIGURING;
617 error = ng_btsocket_rfcomm_send_pn(pcb);
621 pcb->state = NG_BTSOCKET_RFCOMM_DLC_W4_CONNECT;
629 mtx_unlock(&pcb->pcb_mtx);
655 ng_btsocket_rfcomm_pcb_p pcb = so2rfcomm_pcb(so);
659 if (pcb == NULL)
664 mtx_lock(&pcb->pcb_mtx);
670 error = sooptcopyout(sopt, &pcb->mtu, sizeof(pcb->mtu));
674 fcinfo.lmodem = pcb->lmodem;
675 fcinfo.rmodem = pcb->rmodem;
676 fcinfo.tx_cred = pcb->tx_cred;
677 fcinfo.rx_cred = pcb->rx_cred;
678 fcinfo.cfc = (pcb->flags & NG_BTSOCKET_RFCOMM_DLC_CFC)?
704 mtx_unlock(&pcb->pcb_mtx);
716 ng_btsocket_rfcomm_pcb_p pcb = so2rfcomm_pcb(so);
718 KASSERT(pcb != NULL, ("ng_btsocket_rfcomm_detach: pcb == NULL"));
720 mtx_lock(&pcb->pcb_mtx);
722 switch (pcb->state) {
728 if (pcb->flags & NG_BTSOCKET_RFCOMM_DLC_TIMO)
729 ng_btsocket_rfcomm_untimeout(pcb);
731 if (pcb->state == NG_BTSOCKET_RFCOMM_DLC_W4_CONNECT)
732 pcb->flags |= NG_BTSOCKET_RFCOMM_DLC_DETACHED;
734 pcb->state = NG_BTSOCKET_RFCOMM_DLC_DISCONNECTING;
744 while (pcb->state != NG_BTSOCKET_RFCOMM_DLC_CLOSED)
745 msleep(&pcb->state, &pcb->pcb_mtx, PZERO, "rf_det", 0);
747 if (pcb->session != NULL)
748 panic("%s: pcb->session != NULL\n", __func__);
749 if (pcb->flags & NG_BTSOCKET_RFCOMM_DLC_TIMO)
751 __func__, pcb->flags);
754 LIST_REMOVE(pcb, next);
757 mtx_unlock(&pcb->pcb_mtx);
759 mtx_destroy(&pcb->pcb_mtx);
760 bzero(pcb, sizeof(*pcb));
761 free(pcb, M_NETGRAPH_BTSOCKET_RFCOMM);
774 ng_btsocket_rfcomm_pcb_p pcb = so2rfcomm_pcb(so);
776 if (pcb == NULL)
779 mtx_lock(&pcb->pcb_mtx);
781 if (pcb->state == NG_BTSOCKET_RFCOMM_DLC_DISCONNECTING) {
782 mtx_unlock(&pcb->pcb_mtx);
787 if (pcb->flags & NG_BTSOCKET_RFCOMM_DLC_TIMO)
788 ng_btsocket_rfcomm_untimeout(pcb);
790 switch (pcb->state) {
800 pcb->state = NG_BTSOCKET_RFCOMM_DLC_DISCONNECTING;
812 __func__, pcb->state, pcb->flags);
816 mtx_unlock(&pcb->pcb_mtx);
828 ng_btsocket_rfcomm_pcb_p pcb = so2rfcomm_pcb(so), pcb1;
833 if (pcb == NULL)
835 if (pcb->channel > 30)
840 mtx_lock(&pcb->pcb_mtx);
842 if (pcb->channel == 0) {
847 bcmp(&pcb1->src, &pcb->src, sizeof(pcb->src)) == 0)
850 for (pcb->channel = 30; pcb->channel > 0; pcb->channel --)
851 if (!(usedchannels & (1 << (pcb->channel - 1))))
854 if (pcb->channel == 0) {
856 mtx_unlock(&pcb->pcb_mtx);
864 mtx_unlock(&pcb->pcb_mtx);
935 ng_btsocket_rfcomm_pcb_p pcb = so2rfcomm_pcb(so);
938 if (pcb == NULL)
941 bcopy(&pcb->dst, &sa.rfcomm_bdaddr, sizeof(sa.rfcomm_bdaddr));
942 sa.rfcomm_channel = pcb->channel;
959 ng_btsocket_rfcomm_pcb_t *pcb = so2rfcomm_pcb(so);
963 if (pcb == NULL || m == NULL || control != NULL) {
968 mtx_lock(&pcb->pcb_mtx);
971 if (pcb->state != NG_BTSOCKET_RFCOMM_DLC_CONNECTED) {
972 mtx_unlock(&pcb->pcb_mtx);
978 sbappend(&pcb->so->so_snd, m, flags);
981 if (!(pcb->flags & NG_BTSOCKET_RFCOMM_DLC_SENDING)) {
982 pcb->flags |= NG_BTSOCKET_RFCOMM_DLC_SENDING;
986 mtx_unlock(&pcb->pcb_mtx);
1001 ng_btsocket_rfcomm_pcb_p pcb = so2rfcomm_pcb(so);
1004 if (pcb == NULL)
1007 bcopy(&pcb->src, &sa.rfcomm_bdaddr, sizeof(sa.rfcomm_bdaddr));
1008 sa.rfcomm_channel = pcb->channel;
1153 ng_btsocket_rfcomm_pcb_p pcb = NULL, pcb1 = NULL;
1165 pcb = ng_btsocket_rfcomm_pcb_listener(&l2pcb->src, channel);
1166 if (pcb == NULL)
1175 mtx_lock(&pcb->pcb_mtx);
1177 CURVNET_SET(pcb->so->so_vnet);
1178 so1 = sonewconn(pcb->so, 0);
1181 mtx_unlock(&pcb->pcb_mtx);
1217 ng_btsocket_rfcomm_pcb_p pcb = NULL, pcb_next = NULL;
1230 for (pcb = LIST_FIRST(&s->dlcs); pcb != NULL; ) {
1231 mtx_lock(&pcb->pcb_mtx);
1232 pcb_next = LIST_NEXT(pcb, session_next);
1234 if (pcb->state == NG_BTSOCKET_RFCOMM_DLC_W4_CONNECT) {
1235 pcb->mtu = s->mtu;
1236 bcopy(&so2l2cap_pcb(s->l2so)->src, &pcb->src,
1237 sizeof(pcb->src));
1239 error = ng_btsocket_rfcomm_send_pn(pcb);
1241 pcb->state = NG_BTSOCKET_RFCOMM_DLC_CONFIGURING;
1243 ng_btsocket_rfcomm_pcb_kill(pcb, error);
1246 mtx_unlock(&pcb->pcb_mtx);
1247 pcb = pcb_next;
1660 ng_btsocket_rfcomm_pcb_p pcb = NULL, pcb_next = NULL;
1670 for (pcb = LIST_FIRST(&s->dlcs); pcb != NULL; ) {
1671 mtx_lock(&pcb->pcb_mtx);
1672 pcb_next = LIST_NEXT(pcb, session_next);
1676 __func__, pcb->dlci, pcb->state, pcb->flags);
1678 if (pcb->state == NG_BTSOCKET_RFCOMM_DLC_CONNECTED)
1683 ng_btsocket_rfcomm_pcb_kill(pcb, error);
1685 mtx_unlock(&pcb->pcb_mtx);
1686 pcb = pcb_next;
1697 ng_btsocket_rfcomm_pcb_p pcb = NULL, pcb_next = NULL;
1707 for (pcb = LIST_FIRST(&s->dlcs); pcb != NULL; ) {
1708 mtx_lock(&pcb->pcb_mtx);
1709 pcb_next = LIST_NEXT(pcb, session_next);
1711 switch (pcb->state) {
1718 if (pcb->flags & NG_BTSOCKET_RFCOMM_DLC_DETACHED)
1719 ng_btsocket_rfcomm_pcb_kill(pcb, 0);
1720 else if (pcb->flags & NG_BTSOCKET_RFCOMM_DLC_TIMEDOUT)
1721 ng_btsocket_rfcomm_pcb_kill(pcb, ETIMEDOUT);
1732 if (pcb->flags & NG_BTSOCKET_RFCOMM_DLC_TIMEDOUT)
1733 ng_btsocket_rfcomm_pcb_kill(pcb, ETIMEDOUT);
1746 error = ng_btsocket_rfcomm_pcb_send(pcb, ALOT);
1748 ng_btsocket_rfcomm_pcb_kill(pcb, error);
1761 if (!(pcb->flags & NG_BTSOCKET_RFCOMM_DLC_TIMO)) {
1763 pcb->session, RFCOMM_FRAME_DISC,
1764 pcb->dlci);
1766 ng_btsocket_rfcomm_timeout(pcb);
1768 ng_btsocket_rfcomm_pcb_kill(pcb, error);
1769 } else if (pcb->flags & NG_BTSOCKET_RFCOMM_DLC_TIMEDOUT)
1770 ng_btsocket_rfcomm_pcb_kill(pcb, ETIMEDOUT);
1776 __func__, pcb->state, pcb->flags);
1780 mtx_unlock(&pcb->pcb_mtx);
1781 pcb = pcb_next;
1964 ng_btsocket_rfcomm_pcb_p pcb = NULL;
2014 pcb = ng_btsocket_rfcomm_pcb_by_dlci(s, dlci);
2015 if (pcb != NULL) {
2016 mtx_lock(&pcb->pcb_mtx);
2018 if (pcb->state != NG_BTSOCKET_RFCOMM_DLC_CONNECTING) {
2021 __func__, dlci, pcb->state, pcb->flags);
2022 mtx_unlock(&pcb->pcb_mtx);
2027 ng_btsocket_rfcomm_untimeout(pcb);
2031 error = ng_btsocket_rfcomm_send_msc(pcb);
2034 pcb->state = NG_BTSOCKET_RFCOMM_DLC_CONNECTED;
2035 soisconnected(pcb->so);
2037 ng_btsocket_rfcomm_pcb_kill(pcb, error);
2039 mtx_unlock(&pcb->pcb_mtx);
2049 pcb = ng_btsocket_rfcomm_connect_ind(s, RFCOMM_SRVCHANNEL(dlci));
2050 if (pcb != NULL) {
2051 mtx_lock(&pcb->pcb_mtx);
2053 pcb->dlci = dlci;
2057 error = ng_btsocket_rfcomm_send_msc(pcb);
2060 pcb->state = NG_BTSOCKET_RFCOMM_DLC_CONNECTED;
2061 soisconnected(pcb->so);
2063 ng_btsocket_rfcomm_pcb_kill(pcb, error);
2065 mtx_unlock(&pcb->pcb_mtx);
2080 ng_btsocket_rfcomm_pcb_p pcb = NULL;
2103 pcb = ng_btsocket_rfcomm_pcb_by_dlci(s, dlci);
2104 if (pcb != NULL) {
2107 mtx_lock(&pcb->pcb_mtx);
2111 __func__, dlci, pcb->state, pcb->flags);
2116 if (pcb->state == NG_BTSOCKET_RFCOMM_DLC_CONNECTED)
2121 ng_btsocket_rfcomm_pcb_kill(pcb, err);
2123 mtx_unlock(&pcb->pcb_mtx);
2143 ng_btsocket_rfcomm_pcb_p pcb = NULL;
2178 pcb = ng_btsocket_rfcomm_pcb_by_dlci(s, dlci);
2179 if (pcb != NULL) {
2180 mtx_lock(&pcb->pcb_mtx);
2184 __func__, dlci, pcb->state, pcb->flags);
2186 switch (pcb->state) {
2188 ng_btsocket_rfcomm_untimeout(pcb);
2190 error = ng_btsocket_rfcomm_send_msc(pcb);
2192 pcb->state = NG_BTSOCKET_RFCOMM_DLC_CONNECTED;
2193 soisconnected(pcb->so);
2198 ng_btsocket_rfcomm_pcb_kill(pcb, 0);
2204 __func__, dlci, pcb->state, pcb->flags);
2209 mtx_unlock(&pcb->pcb_mtx);
2227 ng_btsocket_rfcomm_pcb_p pcb = NULL;
2242 pcb = ng_btsocket_rfcomm_pcb_by_dlci(s, dlci);
2243 if (pcb != NULL) {
2244 mtx_lock(&pcb->pcb_mtx);
2248 __func__, dlci, pcb->state, pcb->flags);
2250 if (pcb->state == NG_BTSOCKET_RFCOMM_DLC_CONNECTED)
2255 ng_btsocket_rfcomm_pcb_kill(pcb, error);
2257 mtx_unlock(&pcb->pcb_mtx);
2274 ng_btsocket_rfcomm_pcb_p pcb = NULL;
2293 pcb = ng_btsocket_rfcomm_pcb_by_dlci(s, dlci);
2294 if (pcb == NULL) {
2301 mtx_lock(&pcb->pcb_mtx);
2304 if (pcb->state != NG_BTSOCKET_RFCOMM_DLC_CONNECTED) {
2307 __func__, dlci, pcb->state, pcb->flags);
2313 if (((pcb->flags & NG_BTSOCKET_RFCOMM_DLC_CFC) && pcb->rx_cred <= 0) ||
2314 (pcb->lmodem & RFCOMM_MODEM_FC)) {
2318 __func__, dlci, pcb->state, pcb->flags,
2319 pcb->rx_cred, pcb->lmodem);
2324 if ((pcb->flags & NG_BTSOCKET_RFCOMM_DLC_CFC) && pf) {
2328 __func__, *mtod(m0, u_int8_t *), dlci, pcb->state,
2329 pcb->flags, pcb->rx_cred, pcb->tx_cred);
2331 pcb->tx_cred += *mtod(m0, u_int8_t *);
2335 ng_btsocket_rfcomm_pcb_send(pcb, ALOT);
2341 if (pcb->flags & NG_BTSOCKET_RFCOMM_DLC_CFC) {
2343 if (-- pcb->rx_cred <= RFCOMM_MAX_CREDITS / 2)
2344 ng_btsocket_rfcomm_send_credits(pcb);
2348 "rx_cred=%d, tx_cred=%d\n", __func__, dlci, pcb->state, pcb->flags,
2349 pcb->rx_cred, pcb->tx_cred);
2353 if (m0->m_pkthdr.len > pcb->mtu) {
2356 __func__, dlci, pcb->state, pcb->flags,
2357 pcb->mtu, m0->m_pkthdr.len);
2360 } else if (m0->m_pkthdr.len > sbspace(&pcb->so->so_rcv)) {
2370 __func__, dlci, pcb->state, pcb->flags,
2371 m0->m_pkthdr.len, sbspace(&pcb->so->so_rcv));
2376 sbappend(&pcb->so->so_rcv, m0, 0);
2379 sorwakeup(pcb->so);
2383 mtx_unlock(&pcb->pcb_mtx);
2583 ng_btsocket_rfcomm_pcb_t *pcb = NULL;
2596 pcb = ng_btsocket_rfcomm_pcb_by_dlci(s, RFCOMM_DLCI(msc->address));
2597 if (pcb == NULL) {
2606 mtx_lock(&pcb->pcb_mtx);
2608 if (pcb->state != NG_BTSOCKET_RFCOMM_DLC_CONNECTING &&
2609 pcb->state != NG_BTSOCKET_RFCOMM_DLC_CONNECTED) {
2613 pcb->state);
2615 mtx_unlock(&pcb->pcb_mtx);
2621 pcb->rmodem = msc->modem; /* Update remote port signals */
2629 if (!(pcb->rmodem & RFCOMM_MODEM_FC) &&
2630 !(pcb->flags & NG_BTSOCKET_RFCOMM_DLC_CFC))
2631 ng_btsocket_rfcomm_pcb_send(pcb, ALOT);
2634 mtx_unlock(&pcb->pcb_mtx);
2799 ng_btsocket_rfcomm_pcb_t *pcb = NULL;
2821 pcb = ng_btsocket_rfcomm_pcb_by_dlci(s, pn->dlci);
2822 if (pcb != NULL) {
2823 mtx_lock(&pcb->pcb_mtx);
2827 ng_btsocket_rfcomm_set_pn(pcb, 1, pn->flow_control,
2830 if (pcb->flags & NG_BTSOCKET_RFCOMM_DLC_CFC) {
2844 if (pcb->state == NG_BTSOCKET_RFCOMM_DLC_CONFIGURING) {
2845 ng_btsocket_rfcomm_set_pn(pcb, 0,
2848 pcb->state = NG_BTSOCKET_RFCOMM_DLC_CONNECTING;
2854 __func__, pn->dlci, pcb->state);
2859 mtx_unlock(&pcb->pcb_mtx);
2862 pcb = ng_btsocket_rfcomm_connect_ind(s,
2864 if (pcb != NULL) {
2865 mtx_lock(&pcb->pcb_mtx);
2867 pcb->dlci = pn->dlci;
2869 ng_btsocket_rfcomm_set_pn(pcb, 1, pn->flow_control,
2872 if (pcb->flags & NG_BTSOCKET_RFCOMM_DLC_CFC) {
2886 ng_btsocket_rfcomm_timeout(pcb);
2887 pcb->state = NG_BTSOCKET_RFCOMM_DLC_CONNECTING;
2888 soisconnecting(pcb->so);
2890 ng_btsocket_rfcomm_pcb_kill(pcb, error);
2892 mtx_unlock(&pcb->pcb_mtx);
2906 * Set PN parameters for dlci. Caller must hold pcb->pcb_mtx.
2928 ng_btsocket_rfcomm_set_pn(ng_btsocket_rfcomm_pcb_p pcb, u_int8_t cr,
2931 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
2933 pcb->mtu = le16toh(mtu);
2937 pcb->flags |= NG_BTSOCKET_RFCOMM_DLC_CFC;
2938 pcb->tx_cred = credits;
2940 pcb->flags &= ~NG_BTSOCKET_RFCOMM_DLC_CFC;
2941 pcb->tx_cred = 0;
2945 pcb->flags |= NG_BTSOCKET_RFCOMM_DLC_CFC;
2946 pcb->tx_cred = credits;
2948 pcb->flags &= ~NG_BTSOCKET_RFCOMM_DLC_CFC;
2949 pcb->tx_cred = 0;
2955 __func__, cr, pcb->dlci, pcb->state, pcb->flags, pcb->mtu,
2956 pcb->rx_cred, pcb->tx_cred);
3086 * Send MSC request. Caller must hold pcb->pcb_mtx and pcb->session->session_mtx
3090 ng_btsocket_rfcomm_send_msc(ng_btsocket_rfcomm_pcb_p pcb)
3096 mtx_assert(&pcb->session->session_mtx, MA_OWNED);
3097 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
3111 msc->address = RFCOMM_MKADDRESS(1, pcb->dlci);
3112 msc->modem = pcb->lmodem;
3116 __func__, pcb->dlci, pcb->state, pcb->flags, msc->address,
3119 return (ng_btsocket_rfcomm_send_uih(pcb->session,
3120 RFCOMM_MKADDRESS(INITIATOR(pcb->session), 0), 0, 0, m));
3124 * Send PN request. Caller must hold pcb->pcb_mtx and pcb->session->session_mtx
3128 ng_btsocket_rfcomm_send_pn(ng_btsocket_rfcomm_pcb_p pcb)
3134 mtx_assert(&pcb->session->session_mtx, MA_OWNED);
3135 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
3149 pn->dlci = pcb->dlci;
3156 pn->priority = (pcb->dlci < 56)? (((pcb->dlci >> 3) << 3) + 7) : 61;
3158 pn->mtu = htole16(pcb->mtu);
3161 if (pcb->flags & NG_BTSOCKET_RFCOMM_DLC_CFC) {
3163 pn->credits = pcb->rx_cred;
3171 "credits=%d\n", __func__, pcb->dlci, pcb->state, pcb->flags, pcb->mtu,
3174 return (ng_btsocket_rfcomm_send_uih(pcb->session,
3175 RFCOMM_MKADDRESS(INITIATOR(pcb->session), 0), 0, 0, m));
3183 ng_btsocket_rfcomm_send_credits(ng_btsocket_rfcomm_pcb_p pcb)
3188 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
3189 mtx_assert(&pcb->session->session_mtx, MA_OWNED);
3194 __func__, pcb->dlci, pcb->state, pcb->flags, pcb->mtu,
3195 sbspace(&pcb->so->so_rcv), pcb->tx_cred, pcb->rx_cred);
3197 credits = sbspace(&pcb->so->so_rcv) / pcb->mtu;
3199 if (pcb->rx_cred + credits > RFCOMM_MAX_CREDITS)
3200 credits = RFCOMM_MAX_CREDITS - pcb->rx_cred;
3203 pcb->session,
3204 RFCOMM_MKADDRESS(INITIATOR(pcb->session),
3205 pcb->dlci), 1, credits, NULL);
3207 pcb->rx_cred += credits;
3211 "rx_cred=%d, tx_cred=%d\n", __func__, credits, pcb->dlci, pcb->state,
3212 pcb->flags, pcb->rx_cred, pcb->tx_cred);
3217 __func__, error, pcb->dlci, pcb->state,
3218 pcb->flags, pcb->mtu, sbspace(&pcb->so->so_rcv),
3219 pcb->tx_cred, pcb->rx_cred);
3233 * Caller must hold pcb->pcb_mtx and pcb->session->session_mtx
3237 ng_btsocket_rfcomm_pcb_send(ng_btsocket_rfcomm_pcb_p pcb, int limit)
3242 mtx_assert(&pcb->session->session_mtx, MA_OWNED);
3243 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
3245 if (pcb->flags & NG_BTSOCKET_RFCOMM_DLC_CFC)
3246 limit = min(limit, pcb->tx_cred);
3247 else if (!(pcb->rmodem & RFCOMM_MODEM_FC))
3256 __func__, pcb->dlci, pcb->flags, pcb->rmodem,
3257 pcb->tx_cred);
3263 length = min(pcb->mtu, sbavail(&pcb->so->so_snd));
3268 m = ng_btsocket_rfcomm_prepare_packet(&pcb->so->so_snd, length);
3274 sbdrop(&pcb->so->so_snd, length);
3276 error = ng_btsocket_rfcomm_send_uih(pcb->session,
3277 RFCOMM_MKADDRESS(INITIATOR(pcb->session),
3278 pcb->dlci), 0, 0, m);
3283 if (pcb->flags & NG_BTSOCKET_RFCOMM_DLC_CFC)
3284 pcb->tx_cred -= sent;
3287 pcb->flags &= ~NG_BTSOCKET_RFCOMM_DLC_SENDING;
3288 sowwakeup(pcb->so);
3297 * Caller must hold pcb->pcb_mtx and pcb->session->session_mtx
3301 ng_btsocket_rfcomm_pcb_kill(ng_btsocket_rfcomm_pcb_p pcb, int error)
3303 ng_btsocket_rfcomm_session_p s = pcb->session;
3307 __func__, pcb->so, pcb->dlci, pcb->state, pcb->flags, error);
3309 if (pcb->session == NULL)
3310 panic("%s: DLC without session, pcb=%p, state=%d, flags=%#x\n",
3311 __func__, pcb, pcb->state, pcb->flags);
3313 mtx_assert(&pcb->session->session_mtx, MA_OWNED);
3314 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
3316 if (pcb->flags & NG_BTSOCKET_RFCOMM_DLC_TIMO)
3317 ng_btsocket_rfcomm_untimeout(pcb);
3320 LIST_REMOVE(pcb, session_next);
3321 pcb->session = NULL;
3324 pcb->state = NG_BTSOCKET_RFCOMM_DLC_CLOSED;
3325 pcb->so->so_error = error;
3326 soisdisconnected(pcb->so);
3327 wakeup(&pcb->state);
3378 ng_btsocket_rfcomm_pcb_p pcb = NULL;
3382 LIST_FOREACH(pcb, &s->dlcs, session_next)
3383 if (pcb->dlci == dlci)
3386 return (pcb);
3396 ng_btsocket_rfcomm_pcb_p pcb = NULL, pcb1 = NULL;
3400 LIST_FOREACH(pcb, &ng_btsocket_rfcomm_sockets, next) {
3401 if (pcb->channel != channel || !SOLISTENING(pcb->so))
3404 if (bcmp(&pcb->src, src, sizeof(*src)) == 0)
3407 if (bcmp(&pcb->src, NG_HCI_BDADDR_ANY, sizeof(bdaddr_t)) == 0)
3408 pcb1 = pcb;
3413 return ((pcb != NULL)? pcb : pcb1);
3427 ng_btsocket_rfcomm_timeout(ng_btsocket_rfcomm_pcb_p pcb)
3429 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
3431 if (!(pcb->flags & NG_BTSOCKET_RFCOMM_DLC_TIMO)) {
3432 pcb->flags |= NG_BTSOCKET_RFCOMM_DLC_TIMO;
3433 pcb->flags &= ~NG_BTSOCKET_RFCOMM_DLC_TIMEDOUT;
3434 callout_reset(&pcb->timo, ng_btsocket_rfcomm_timo * hz,
3435 ng_btsocket_rfcomm_process_timeout, pcb);
3441 * Unset pcb timeout. Caller MUST hold pcb_mtx
3445 ng_btsocket_rfcomm_untimeout(ng_btsocket_rfcomm_pcb_p pcb)
3447 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
3449 if (pcb->flags & NG_BTSOCKET_RFCOMM_DLC_TIMO) {
3450 callout_stop(&pcb->timo);
3451 pcb->flags &= ~NG_BTSOCKET_RFCOMM_DLC_TIMO;
3452 pcb->flags &= ~NG_BTSOCKET_RFCOMM_DLC_TIMEDOUT;
3458 * Process pcb timeout
3464 ng_btsocket_rfcomm_pcb_p pcb = (ng_btsocket_rfcomm_pcb_p) xpcb;
3466 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
3470 __func__, pcb->so, pcb->dlci, pcb->state, pcb->flags);
3472 pcb->flags &= ~NG_BTSOCKET_RFCOMM_DLC_TIMO;
3473 pcb->flags |= NG_BTSOCKET_RFCOMM_DLC_TIMEDOUT;
3475 switch (pcb->state) {
3478 pcb->state = NG_BTSOCKET_RFCOMM_DLC_DISCONNECTING;
3488 __func__, pcb->dlci, pcb->state, pcb->flags);