Lines Matching full:pcb
417 ng_btsocket_l2cap_pcb_t *pcb = NULL;
428 pcb = ng_btsocket_l2cap_pcb_by_token(msg->header.token);
429 if (pcb == NULL) {
434 mtx_lock(&pcb->pcb_mtx);
440 pcb->src.b[5], pcb->src.b[4], pcb->src.b[3],
441 pcb->src.b[2], pcb->src.b[1], pcb->src.b[0],
442 pcb->dst.b[5], pcb->dst.b[4], pcb->dst.b[3],
443 pcb->dst.b[2], pcb->dst.b[1], pcb->dst.b[0],
444 pcb->psm, op->lcid, op->result, op->status,
445 pcb->state);
447 if (pcb->state != NG_BTSOCKET_L2CAP_CONNECTING) {
448 mtx_unlock(&pcb->pcb_mtx);
454 ng_btsocket_l2cap_untimeout(pcb);
457 ng_btsocket_l2cap_timeout(pcb);
458 mtx_unlock(&pcb->pcb_mtx);
465 if((pcb->idtype == NG_L2CAP_L2CA_IDTYPE_ATT)||
466 (pcb->idtype == NG_L2CAP_L2CA_IDTYPE_SMP)){
467 pcb->encryption = op->encryption; pcb->cid = op->lcid;
468 if(pcb->need_encrypt && !(pcb->encryption)){
469 ng_btsocket_l2cap_timeout(pcb);
470 pcb->state = NG_BTSOCKET_L2CAP_W4_ENC_CHANGE;
472 pcb->state = NG_BTSOCKET_L2CAP_OPEN;
473 soisconnected(pcb->so);
482 pcb->cid = op->lcid;
483 pcb->encryption = op->encryption;
484 error = ng_btsocket_l2cap_send_l2ca_cfg_req(pcb);
487 ng_btsocket_l2cap_send_l2ca_discon_req(0, pcb);
490 pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
491 soisdisconnected(pcb->so);
493 pcb->cfg_state = NG_BTSOCKET_L2CAP_CFG_IN_SENT;
494 pcb->state = NG_BTSOCKET_L2CAP_CONFIGURING;
496 ng_btsocket_l2cap_timeout(pcb);
506 pcb->so->so_error = ng_btsocket_l2cap_result2errno(op->result);
507 pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
508 soisdisconnected(pcb->so);
510 mtx_unlock(&pcb->pcb_mtx);
525 ng_btsocket_l2cap_pcb_t *pcb = NULL;
535 pcb = ng_btsocket_l2cap_pcb_by_token(msg->header.token);
536 if (pcb == NULL) {
541 mtx_lock(&pcb->pcb_mtx);
547 pcb->src.b[5], pcb->src.b[4], pcb->src.b[3],
548 pcb->src.b[2], pcb->src.b[1], pcb->src.b[0],
549 pcb->dst.b[5], pcb->dst.b[4], pcb->dst.b[3],
550 pcb->dst.b[2], pcb->dst.b[1], pcb->dst.b[0],
551 pcb->psm, pcb->cid, op->result, pcb->state);
553 if (pcb->state != NG_BTSOCKET_L2CAP_CONNECTING) {
554 mtx_unlock(&pcb->pcb_mtx);
560 ng_btsocket_l2cap_untimeout(pcb);
565 pcb->so->so_error = ng_btsocket_l2cap_result2errno(op->result);
566 pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
567 soisdisconnected(pcb->so);
570 pcb->cfg_state = 0;
571 pcb->state = NG_BTSOCKET_L2CAP_CONFIGURING;
572 ng_btsocket_l2cap_timeout(pcb);
575 mtx_unlock(&pcb->pcb_mtx);
592 ng_btsocket_l2cap_pcb_t *pcb = NULL, *pcb1 = NULL;
614 pcb = ng_btsocket_l2cap_pcb_by_addr(&rt->src, ip->psm);
615 if (pcb != NULL) {
618 mtx_lock(&pcb->pcb_mtx);
620 CURVNET_SET(pcb->so->so_vnet);
621 so1 = sonewconn(pcb->so, 0);
641 if (bcmp(&pcb->src, NG_HCI_BDADDR_ANY, sizeof(pcb->src)) != 0)
642 bcopy(&pcb->src, &pcb1->src, sizeof(pcb1->src));
654 pcb1->imtu = pcb->imtu;
655 bcopy(&pcb->oflow, &pcb1->oflow, sizeof(pcb1->oflow));
656 pcb1->flush_timo = pcb->flush_timo;
683 if (pcb != NULL)
684 mtx_unlock(&pcb->pcb_mtx);
694 ng_btsocket_l2cap_pcb_t *pcb = NULL;
703 pcb = ng_btsocket_l2cap_pcb_by_cid(&rt->src, op->lcid,
705 if (pcb == NULL) {
710 mtx_lock(&pcb->pcb_mtx);
711 pcb->encryption = op->result;
713 if(pcb->need_encrypt){
714 ng_btsocket_l2cap_untimeout(pcb);
715 if(pcb->state != NG_BTSOCKET_L2CAP_W4_ENC_CHANGE){
716 NG_BTSOCKET_L2CAP_WARN("%s: Invalid pcb status %d",
717 __func__, pcb->state);
718 }else if(pcb->encryption){
719 pcb->state = NG_BTSOCKET_L2CAP_OPEN;
720 soisconnected(pcb->so);
722 pcb->so->so_error = EPERM;
723 ng_btsocket_l2cap_send_l2ca_discon_req(0, pcb);
724 pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
725 soisdisconnected(pcb->so);
728 mtx_unlock(&pcb->pcb_mtx);
742 ng_btsocket_l2cap_pcb_p pcb = NULL;
757 pcb = ng_btsocket_l2cap_pcb_by_token(msg->header.token);
758 if (pcb == NULL) {
769 mtx_lock(&pcb->pcb_mtx);
776 pcb->src.b[5], pcb->src.b[4], pcb->src.b[3],
777 pcb->src.b[2], pcb->src.b[1], pcb->src.b[0],
778 pcb->dst.b[5], pcb->dst.b[4], pcb->dst.b[3],
779 pcb->dst.b[2], pcb->dst.b[1], pcb->dst.b[0],
780 pcb->psm, pcb->cid, op->result, pcb->state, pcb->cfg_state);
782 if (pcb->state != NG_BTSOCKET_L2CAP_CONFIGURING) {
783 mtx_unlock(&pcb->pcb_mtx);
797 pcb->imtu = op->imtu;
798 bcopy(&op->oflow, &pcb->oflow, sizeof(pcb->oflow));
799 pcb->flush_timo = op->flush_timo;
807 pcb->cfg_state &= ~NG_BTSOCKET_L2CAP_CFG_IN_SENT;
808 pcb->cfg_state |= NG_BTSOCKET_L2CAP_CFG_IN;
810 if (pcb->cfg_state == NG_BTSOCKET_L2CAP_CFG_BOTH) {
812 ng_btsocket_l2cap_untimeout(pcb);
813 pcb->state = NG_BTSOCKET_L2CAP_OPEN;
814 soisconnected(pcb->so);
823 ng_btsocket_l2cap_untimeout(pcb);
828 pcb->so->so_error = EINVAL;
832 pcb->so->so_error = ECONNRESET;
837 ng_btsocket_l2cap_send_l2ca_discon_req(0, pcb);
840 pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
841 soisdisconnected(pcb->so);
844 mtx_unlock(&pcb->pcb_mtx);
859 ng_btsocket_l2cap_pcb_t *pcb = NULL;
870 pcb = ng_btsocket_l2cap_pcb_by_token(msg->header.token);
871 if (pcb == NULL) {
876 mtx_lock(&pcb->pcb_mtx);
883 pcb->src.b[5], pcb->src.b[4], pcb->src.b[3],
884 pcb->src.b[2], pcb->src.b[1], pcb->src.b[0],
885 pcb->dst.b[5], pcb->dst.b[4], pcb->dst.b[3],
886 pcb->dst.b[2], pcb->dst.b[1], pcb->dst.b[0],
887 pcb->psm, pcb->cid, op->result, pcb->state, pcb->cfg_state);
889 if (pcb->state != NG_BTSOCKET_L2CAP_CONFIGURING) {
890 mtx_unlock(&pcb->pcb_mtx);
905 pcb->cfg_state &= ~NG_BTSOCKET_L2CAP_CFG_OUT_SENT;
906 pcb->cfg_state |= NG_BTSOCKET_L2CAP_CFG_OUT;
908 if (pcb->cfg_state == NG_BTSOCKET_L2CAP_CFG_BOTH) {
910 ng_btsocket_l2cap_untimeout(pcb);
911 pcb->state = NG_BTSOCKET_L2CAP_OPEN;
912 soisconnected(pcb->so);
914 if (!(pcb->cfg_state & NG_BTSOCKET_L2CAP_CFG_IN_SENT)) {
916 error = ng_btsocket_l2cap_send_l2ca_cfg_req(pcb);
920 pcb->cfg_state |= NG_BTSOCKET_L2CAP_CFG_IN_SENT;
924 mtx_unlock(&pcb->pcb_mtx);
930 ng_btsocket_l2cap_untimeout(pcb);
933 ng_btsocket_l2cap_send_l2ca_discon_req(0, pcb);
936 pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
937 soisdisconnected(pcb->so);
939 mtx_unlock(&pcb->pcb_mtx);
954 ng_btsocket_l2cap_pcb_t *pcb = NULL;
965 pcb = ng_btsocket_l2cap_pcb_by_cid(&rt->src, ip->lcid,
967 if (pcb == NULL) {
972 mtx_lock(&pcb->pcb_mtx);
978 pcb->src.b[5], pcb->src.b[4], pcb->src.b[3],
979 pcb->src.b[2], pcb->src.b[1], pcb->src.b[0],
980 pcb->dst.b[5], pcb->dst.b[4], pcb->dst.b[3],
981 pcb->dst.b[2], pcb->dst.b[1], pcb->dst.b[0],
982 pcb->psm, pcb->cid, pcb->state, pcb->cfg_state);
985 if (pcb->state != NG_BTSOCKET_L2CAP_CONFIGURING) {
986 mtx_unlock(&pcb->pcb_mtx);
998 pcb->omtu = ip->omtu;
999 bcopy(&ip->iflow, &pcb->iflow, sizeof(pcb->iflow));
1000 pcb->flush_timo = ip->flush_timo;
1007 if (!(pcb->cfg_state & NG_BTSOCKET_L2CAP_CFG_OUT_SENT)) {
1008 error = ng_btsocket_l2cap_send_l2ca_cfg_rsp(pcb);
1010 ng_btsocket_l2cap_untimeout(pcb);
1012 pcb->so->so_error = error;
1015 ng_btsocket_l2cap_send_l2ca_discon_req(0, pcb);
1018 pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
1019 soisdisconnected(pcb->so);
1021 pcb->cfg_state |= NG_BTSOCKET_L2CAP_CFG_OUT_SENT;
1024 mtx_unlock(&pcb->pcb_mtx);
1039 ng_btsocket_l2cap_pcb_t *pcb = NULL;
1055 pcb = ng_btsocket_l2cap_pcb_by_token(msg->header.token);
1056 if (pcb == NULL) {
1061 mtx_lock(&pcb->pcb_mtx);
1064 if (pcb->state != NG_BTSOCKET_L2CAP_CLOSED) {
1069 pcb->src.b[5], pcb->src.b[4], pcb->src.b[3],
1070 pcb->src.b[2], pcb->src.b[1], pcb->src.b[0],
1071 pcb->dst.b[5], pcb->dst.b[4], pcb->dst.b[3],
1072 pcb->dst.b[2], pcb->dst.b[1], pcb->dst.b[0],
1073 pcb->psm, pcb->cid, op->result, pcb->state);
1075 ng_btsocket_l2cap_untimeout(pcb);
1077 pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
1078 soisdisconnected(pcb->so);
1081 mtx_unlock(&pcb->pcb_mtx);
1096 ng_btsocket_l2cap_pcb_t *pcb = NULL;
1107 pcb = ng_btsocket_l2cap_pcb_by_cid(&rt->src, ip->lcid,
1109 if (pcb == NULL) {
1120 mtx_lock(&pcb->pcb_mtx);
1126 pcb->src.b[5], pcb->src.b[4], pcb->src.b[3],
1127 pcb->src.b[2], pcb->src.b[1], pcb->src.b[0],
1128 pcb->dst.b[5], pcb->dst.b[4], pcb->dst.b[3],
1129 pcb->dst.b[2], pcb->dst.b[1], pcb->dst.b[0],
1130 pcb->psm, pcb->cid, pcb->state);
1132 if (pcb->flags & NG_BTSOCKET_L2CAP_TIMO)
1133 ng_btsocket_l2cap_untimeout(pcb);
1135 pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
1136 soisdisconnected(pcb->so);
1138 mtx_unlock(&pcb->pcb_mtx);
1153 ng_btsocket_l2cap_pcb_t *pcb = NULL;
1164 pcb = ng_btsocket_l2cap_pcb_by_token(msg->header.token);
1165 if (pcb == NULL) {
1170 mtx_lock(&pcb->pcb_mtx);
1176 pcb->src.b[5], pcb->src.b[4], pcb->src.b[3],
1177 pcb->src.b[2], pcb->src.b[1], pcb->src.b[0],
1178 pcb->dst.b[5], pcb->dst.b[4], pcb->dst.b[3],
1179 pcb->dst.b[2], pcb->dst.b[1], pcb->dst.b[0],
1180 pcb->psm, pcb->cid, op->result, op->length,
1181 pcb->state);
1183 if (pcb->state != NG_BTSOCKET_L2CAP_OPEN) {
1184 mtx_unlock(&pcb->pcb_mtx);
1190 ng_btsocket_l2cap_untimeout(pcb);
1195 sbdroprecord(&pcb->so->so_snd);
1196 if (sbavail(&pcb->so->so_snd) > 0) {
1197 if (ng_btsocket_l2cap_send2(pcb) == 0)
1198 ng_btsocket_l2cap_timeout(pcb);
1200 sbdroprecord(&pcb->so->so_snd); /* XXX */
1208 pcb->so->so_error = ng_btsocket_l2cap_result2errno(op->result);
1209 sowwakeup(pcb->so);
1211 mtx_unlock(&pcb->pcb_mtx);
1222 ng_btsocket_l2cap_send_l2ca_con_req(ng_btsocket_l2cap_pcb_p pcb)
1228 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
1230 if (pcb->rt == NULL ||
1231 pcb->rt->hook == NULL || NG_HOOK_NOT_VALID(pcb->rt->hook))
1239 msg->header.token = pcb->token;
1242 bcopy(&pcb->dst, &ip->bdaddr, sizeof(ip->bdaddr));
1243 ip->psm = pcb->psm;
1244 ip->linktype = ng_btsock_l2cap_addrtype_to_linktype(pcb->dsttype);
1245 ip->idtype = pcb->idtype;
1246 NG_SEND_MSG_HOOK(error, ng_btsocket_l2cap_node, msg,pcb->rt->hook, 0);
1292 ng_btsocket_l2cap_send_l2ca_cfg_req(ng_btsocket_l2cap_pcb_p pcb)
1298 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
1300 if (pcb->rt == NULL ||
1301 pcb->rt->hook == NULL || NG_HOOK_NOT_VALID(pcb->rt->hook))
1309 msg->header.token = pcb->token;
1312 ip->lcid = pcb->cid;
1313 ip->imtu = pcb->imtu;
1314 bcopy(&pcb->oflow, &ip->oflow, sizeof(ip->oflow));
1315 ip->flush_timo = pcb->flush_timo;
1316 ip->link_timo = pcb->link_timo;
1318 NG_SEND_MSG_HOOK(error, ng_btsocket_l2cap_node, msg,pcb->rt->hook, 0);
1328 ng_btsocket_l2cap_send_l2ca_cfg_rsp(ng_btsocket_l2cap_pcb_p pcb)
1334 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
1336 if (pcb->rt == NULL ||
1337 pcb->rt->hook == NULL || NG_HOOK_NOT_VALID(pcb->rt->hook))
1345 msg->header.token = pcb->token;
1348 ip->lcid = pcb->cid;
1349 ip->omtu = pcb->omtu;
1350 bcopy(&pcb->iflow, &ip->iflow, sizeof(ip->iflow));
1352 NG_SEND_MSG_HOOK(error, ng_btsocket_l2cap_node, msg, pcb->rt->hook, 0);
1363 ng_btsocket_l2cap_pcb_p pcb)
1369 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
1371 if (pcb->rt == NULL ||
1372 pcb->rt->hook == NULL || NG_HOOK_NOT_VALID(pcb->rt->hook))
1383 ip->lcid = pcb->cid;
1384 ip->idtype = pcb->idtype;
1386 NG_SEND_MSG_HOOK(error, ng_btsocket_l2cap_node, msg,pcb->rt->hook, 0);
1406 ng_btsocket_l2cap_pcb_t *pcb = NULL;
1477 pcb = ng_btsocket_l2cap_pcb_by_cid(&rt->src, hdr->dcid,idtype);
1478 if (pcb == NULL) {
1483 mtx_lock(&pcb->pcb_mtx);
1485 if (pcb->state != NG_BTSOCKET_L2CAP_OPEN) {
1491 hdr->dcid, pcb->state);
1493 mtx_unlock(&pcb->pcb_mtx);
1499 if (hdr->length > pcb->imtu) {
1506 hdr->dcid, hdr->length, pcb->imtu);
1508 mtx_unlock(&pcb->pcb_mtx);
1514 if (m->m_pkthdr.len > sbspace(&pcb->so->so_rcv)) {
1529 sbspace(&pcb->so->so_rcv));
1531 mtx_unlock(&pcb->pcb_mtx);
1537 sbappendrecord(&pcb->so->so_rcv, m);
1540 sorwakeup(pcb->so);
1542 mtx_unlock(&pcb->pcb_mtx);
1591 LIST_FOREACH(pcb, &ng_btsocket_l2cap_sockets, next) {
1594 mtx_lock(&pcb->pcb_mtx);
1596 if (bcmp(&rt->src, &pcb->src, sizeof(pcb->src)) != 0 ||
1597 pcb->psm != clt_hdr->psm ||
1598 pcb->state != NG_BTSOCKET_L2CAP_OPEN ||
1599 (pcb->so->so_options & SO_BROADCAST) == 0 ||
1600 m->m_pkthdr.len > sbspace(&pcb->so->so_rcv))
1611 sbappendrecord(&pcb->so->so_rcv, copy);
1612 sorwakeup(pcb->so);
1615 mtx_unlock(&pcb->pcb_mtx);
1829 ng_btsocket_l2cap_pcb_p pcb = NULL, pcb_next = NULL;
1839 for (pcb = LIST_FIRST(&ng_btsocket_l2cap_sockets); pcb != NULL; ) {
1840 mtx_lock(&pcb->pcb_mtx);
1841 pcb_next = LIST_NEXT(pcb, next);
1843 if (pcb->rt != NULL &&
1844 pcb->rt->hook != NULL && NG_HOOK_NOT_VALID(pcb->rt->hook)) {
1845 if (pcb->flags & NG_BTSOCKET_L2CAP_TIMO)
1846 ng_btsocket_l2cap_untimeout(pcb);
1848 pcb->so->so_error = ENETDOWN;
1849 pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
1850 soisdisconnected(pcb->so);
1852 pcb->token = 0;
1853 pcb->cid = 0;
1854 pcb->rt = NULL;
1857 mtx_unlock(&pcb->pcb_mtx);
1858 pcb = pcb_next;
1978 ng_btsocket_l2cap_pcb_p pcb = so2l2cap_pcb(so);
1993 if (pcb != NULL)
2004 /* Allocate the PCB */
2005 pcb = malloc(sizeof(*pcb),
2007 if (pcb == NULL)
2010 /* Link the PCB and the socket */
2011 so->so_pcb = (caddr_t) pcb;
2012 pcb->so = so;
2013 pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
2015 /* Initialize PCB */
2016 pcb->imtu = pcb->omtu = NG_L2CAP_MTU_DEFAULT;
2019 pcb->iflow.flags = 0x0;
2020 pcb->iflow.service_type = NG_HCI_SERVICE_TYPE_BEST_EFFORT;
2021 pcb->iflow.token_rate = 0xffffffff; /* maximum */
2022 pcb->iflow.token_bucket_size = 0xffffffff; /* maximum */
2023 pcb->iflow.peak_bandwidth = 0x00000000; /* maximum */
2024 pcb->iflow.latency = 0xffffffff; /* don't care */
2025 pcb->iflow.delay_variation = 0xffffffff; /* don't care */
2027 bcopy(&pcb->iflow, &pcb->oflow, sizeof(pcb->oflow));
2029 pcb->flush_timo = NG_L2CAP_FLUSH_TIMO_DEFAULT;
2030 pcb->link_timo = NG_L2CAP_LINK_TIMO_DEFAULT;
2033 * XXX Mark PCB mutex as DUPOK to prevent "duplicated lock of
2035 * ng_btsocket_l2cap_process_l2ca_con_ind() holds both PCB mutexes
2036 * for "old" (accepting) PCB and "new" (created) PCB.
2039 mtx_init(&pcb->pcb_mtx, "btsocks_l2cap_pcb_mtx", NULL,
2041 callout_init_mtx(&pcb->timo, &pcb->pcb_mtx, 0);
2044 * Add the PCB to the list
2067 /* Set PCB token. Use ng_btsocket_l2cap_sockets_mtx for protection */
2071 pcb->token = token;
2073 LIST_INSERT_HEAD(&ng_btsocket_l2cap_sockets, pcb, next);
2089 ng_btsocket_l2cap_pcb_t *pcb = NULL;
2118 LIST_FOREACH(pcb, &ng_btsocket_l2cap_sockets, next)
2119 if (psm != 0 && psm == pcb->psm &&
2120 bcmp(&pcb->src, &sa->l2cap_bdaddr, sizeof(bdaddr_t)) == 0)
2123 if (pcb == NULL) {
2125 pcb = so2l2cap_pcb(so);
2126 if (pcb != NULL) {
2127 bcopy(&sa->l2cap_bdaddr, &pcb->src, sizeof(pcb->src));
2128 pcb->psm = psm;
2147 ng_btsocket_l2cap_pcb_t *pcb = so2l2cap_pcb(so);
2155 if (pcb == NULL)
2159 if (pcb->state == NG_BTSOCKET_L2CAP_CONNECTING)
2193 if (pcb->psm != 0 && pcb->psm != le16toh(sa->l2cap_psm))
2204 mtx_lock(&pcb->pcb_mtx);
2207 bcopy(&sa->l2cap_bdaddr, &pcb->dst, sizeof(pcb->dst));
2208 pcb->psm = le16toh(sa->l2cap_psm);
2209 pcb->dsttype = sa->l2cap_bdaddr_type;
2210 pcb->cid = 0;
2211 pcb->idtype = idtype;
2212 pcb->rt = NULL;
2213 have_src = bcmp(&pcb->src, NG_HCI_BDADDR_ANY, sizeof(pcb->src));
2221 if (bcmp(&pcb->src, &rt->src, sizeof(rt->src)) == 0)
2224 if (bcmp(&pcb->dst, &rt->src, sizeof(rt->src)) != 0)
2230 pcb->rt = rt;
2233 bcopy(&rt->src, &pcb->src, sizeof(pcb->src));
2234 pcb->srctype =
2246 error = ng_btsocket_l2cap_send_l2ca_con_req(pcb);
2248 pcb->flags |= NG_BTSOCKET_L2CAP_CLIENT;
2249 pcb->state = NG_BTSOCKET_L2CAP_CONNECTING;
2250 soisconnecting(pcb->so);
2252 ng_btsocket_l2cap_timeout(pcb);
2256 mtx_unlock(&pcb->pcb_mtx);
2281 ng_btsocket_l2cap_pcb_p pcb = so2l2cap_pcb(so);
2285 if (pcb == NULL)
2293 mtx_lock(&pcb->pcb_mtx);
2299 error = sooptcopyout(sopt, &pcb->imtu,
2300 sizeof(pcb->imtu));
2304 error = sooptcopyout(sopt, &pcb->omtu,
2305 sizeof(pcb->omtu));
2309 error = sooptcopyout(sopt, &pcb->iflow,
2310 sizeof(pcb->iflow));
2314 error = sooptcopyout(sopt, &pcb->oflow,
2315 sizeof(pcb->oflow));
2319 error = sooptcopyout(sopt, &pcb->flush_timo,
2320 sizeof(pcb->flush_timo));
2323 error = sooptcopyout(sopt, &pcb->need_encrypt,
2324 sizeof(pcb->need_encrypt));
2342 if (pcb->state != NG_BTSOCKET_L2CAP_CLOSED) {
2351 pcb->imtu = v.mtu;
2357 bcopy(&v.flow, &pcb->oflow, sizeof(pcb->oflow));
2364 pcb->flush_timo = v.flush_timo;
2367 if((pcb->state != NG_BTSOCKET_L2CAP_OPEN) &&
2368 (pcb->state != NG_BTSOCKET_L2CAP_W4_ENC_CHANGE)){
2372 pcb->need_encrypt = (v.encryption)?1:0;
2388 mtx_unlock(&pcb->pcb_mtx);
2400 ng_btsocket_l2cap_pcb_p pcb = so2l2cap_pcb(so);
2402 KASSERT(pcb != NULL, ("ng_btsocket_l2cap_detach: pcb == NULL"));
2408 mtx_lock(&pcb->pcb_mtx);
2411 if (pcb->flags & NG_BTSOCKET_L2CAP_TIMO)
2412 ng_btsocket_l2cap_untimeout(pcb);
2414 if (pcb->state != NG_BTSOCKET_L2CAP_CLOSED &&
2415 pcb->state != NG_BTSOCKET_L2CAP_DISCONNECTING)
2417 ng_btsocket_l2cap_send_l2ca_discon_req(0, pcb);
2419 pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
2421 LIST_REMOVE(pcb, next);
2423 mtx_unlock(&pcb->pcb_mtx);
2426 mtx_destroy(&pcb->pcb_mtx);
2427 bzero(pcb, sizeof(*pcb));
2428 free(pcb, M_NETGRAPH_BTSOCKET_L2CAP);
2441 ng_btsocket_l2cap_pcb_p pcb = so2l2cap_pcb(so);
2444 if (pcb == NULL)
2449 mtx_lock(&pcb->pcb_mtx);
2451 if (pcb->state == NG_BTSOCKET_L2CAP_DISCONNECTING) {
2452 mtx_unlock(&pcb->pcb_mtx);
2456 if (pcb->state != NG_BTSOCKET_L2CAP_CLOSED) {
2458 if (pcb->flags & NG_BTSOCKET_L2CAP_TIMO)
2459 ng_btsocket_l2cap_untimeout(pcb);
2461 error = ng_btsocket_l2cap_send_l2ca_discon_req(pcb->token, pcb);
2463 pcb->state = NG_BTSOCKET_L2CAP_DISCONNECTING;
2466 ng_btsocket_l2cap_timeout(pcb);
2472 mtx_unlock(&pcb->pcb_mtx);
2484 ng_btsocket_l2cap_pcb_p pcb = so2l2cap_pcb(so);
2491 if (pcb == NULL) {
2501 if (pcb->psm == 0) {
2519 ng_btsocket_l2cap_pcb_p pcb = so2l2cap_pcb(so);
2522 if (pcb == NULL)
2530 .l2cap_psm = htole16(pcb->psm),
2532 bcopy(&pcb->dst, &l2cap->l2cap_bdaddr, sizeof(l2cap->l2cap_bdaddr));
2533 switch(pcb->idtype){
2544 l2cap->l2cap_bdaddr_type = pcb->dsttype;
2557 ng_btsocket_l2cap_pcb_t *pcb = so2l2cap_pcb(so);
2566 if (pcb == NULL || m == NULL || control != NULL) {
2571 mtx_lock(&pcb->pcb_mtx);
2574 if (pcb->state != NG_BTSOCKET_L2CAP_OPEN) {
2575 mtx_unlock(&pcb->pcb_mtx);
2581 if (pcb->rt == NULL ||
2582 pcb->rt->hook == NULL || NG_HOOK_NOT_VALID(pcb->rt->hook)) {
2583 mtx_unlock(&pcb->pcb_mtx);
2589 if (m->m_pkthdr.len > pcb->omtu) {
2591 "%s: Packet too big, len=%d, omtu=%d\n", __func__, m->m_pkthdr.len, pcb->omtu);
2593 mtx_unlock(&pcb->pcb_mtx);
2605 sbappendrecord(&pcb->so->so_snd, m);
2608 if (!(pcb->flags & NG_BTSOCKET_L2CAP_TIMO)) {
2609 error = ng_btsocket_l2cap_send2(pcb);
2611 ng_btsocket_l2cap_timeout(pcb);
2613 sbdroprecord(&pcb->so->so_snd); /* XXX */
2616 mtx_unlock(&pcb->pcb_mtx);
2629 ng_btsocket_l2cap_send2(ng_btsocket_l2cap_pcb_p pcb)
2635 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
2637 if (sbavail(&pcb->so->so_snd) == 0)
2640 m = m_dup(pcb->so->so_snd.sb_mb, M_NOWAIT);
2658 hdr->token = pcb->token;
2660 hdr->lcid = pcb->cid;
2661 hdr->idtype = pcb->idtype;
2665 hdr->token, pcb->state);
2672 NG_SEND_DATA_ONLY(error, pcb->rt->hook, m);
2683 ng_btsocket_l2cap_pcb_p pcb = so2l2cap_pcb(so);
2686 if (pcb == NULL)
2694 .l2cap_psm = htole16(pcb->psm),
2695 .l2cap_bdaddr_type = pcb->srctype,
2697 bcopy(&pcb->src, &l2cap->l2cap_bdaddr, sizeof(l2cap->l2cap_bdaddr));
2782 ng_btsocket_l2cap_timeout(ng_btsocket_l2cap_pcb_p pcb)
2784 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
2786 if (!(pcb->flags & NG_BTSOCKET_L2CAP_TIMO)) {
2787 pcb->flags |= NG_BTSOCKET_L2CAP_TIMO;
2788 callout_reset(&pcb->timo, bluetooth_l2cap_ertx_timeout(),
2789 ng_btsocket_l2cap_process_timeout, pcb);
2800 ng_btsocket_l2cap_untimeout(ng_btsocket_l2cap_pcb_p pcb)
2802 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
2804 if (pcb->flags & NG_BTSOCKET_L2CAP_TIMO) {
2805 callout_stop(&pcb->timo);
2806 pcb->flags &= ~NG_BTSOCKET_L2CAP_TIMO;
2819 ng_btsocket_l2cap_pcb_p pcb = (ng_btsocket_l2cap_pcb_p) xpcb;
2821 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
2823 pcb->flags &= ~NG_BTSOCKET_L2CAP_TIMO;
2824 pcb->so->so_error = ETIMEDOUT;
2826 switch (pcb->state) {
2831 if (pcb->cid != 0)
2832 ng_btsocket_l2cap_send_l2ca_discon_req(0, pcb);
2835 pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
2836 soisdisconnected(pcb->so);
2841 sbdroprecord(&pcb->so->so_snd);
2842 sowwakeup(pcb->so);
2847 pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
2848 soisdisconnected(pcb->so);
2853 "%s: Invalid socket state=%d\n", __func__, pcb->state);