Lines Matching refs:pcb

418 	ng_btsocket_l2cap_pcb_t	*pcb = NULL;
429 pcb = ng_btsocket_l2cap_pcb_by_token(msg->header.token);
430 if (pcb == NULL) {
435 mtx_lock(&pcb->pcb_mtx);
441 pcb->src.b[5], pcb->src.b[4], pcb->src.b[3],
442 pcb->src.b[2], pcb->src.b[1], pcb->src.b[0],
443 pcb->dst.b[5], pcb->dst.b[4], pcb->dst.b[3],
444 pcb->dst.b[2], pcb->dst.b[1], pcb->dst.b[0],
445 pcb->psm, op->lcid, op->result, op->status,
446 pcb->state);
448 if (pcb->state != NG_BTSOCKET_L2CAP_CONNECTING) {
449 mtx_unlock(&pcb->pcb_mtx);
455 ng_btsocket_l2cap_untimeout(pcb);
458 ng_btsocket_l2cap_timeout(pcb);
459 mtx_unlock(&pcb->pcb_mtx);
466 if((pcb->idtype == NG_L2CAP_L2CA_IDTYPE_ATT)||
467 (pcb->idtype == NG_L2CAP_L2CA_IDTYPE_SMP)){
468 pcb->encryption = op->encryption; pcb->cid = op->lcid;
469 if(pcb->need_encrypt && !(pcb->encryption)){
470 ng_btsocket_l2cap_timeout(pcb);
471 pcb->state = NG_BTSOCKET_L2CAP_W4_ENC_CHANGE;
473 pcb->state = NG_BTSOCKET_L2CAP_OPEN;
474 soisconnected(pcb->so);
483 pcb->cid = op->lcid;
484 pcb->encryption = op->encryption;
485 error = ng_btsocket_l2cap_send_l2ca_cfg_req(pcb);
488 ng_btsocket_l2cap_send_l2ca_discon_req(0, pcb);
491 pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
492 soisdisconnected(pcb->so);
494 pcb->cfg_state = NG_BTSOCKET_L2CAP_CFG_IN_SENT;
495 pcb->state = NG_BTSOCKET_L2CAP_CONFIGURING;
497 ng_btsocket_l2cap_timeout(pcb);
507 pcb->so->so_error = ng_btsocket_l2cap_result2errno(op->result);
508 pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
509 soisdisconnected(pcb->so);
511 mtx_unlock(&pcb->pcb_mtx);
526 ng_btsocket_l2cap_pcb_t *pcb = NULL;
536 pcb = ng_btsocket_l2cap_pcb_by_token(msg->header.token);
537 if (pcb == NULL) {
542 mtx_lock(&pcb->pcb_mtx);
548 pcb->src.b[5], pcb->src.b[4], pcb->src.b[3],
549 pcb->src.b[2], pcb->src.b[1], pcb->src.b[0],
550 pcb->dst.b[5], pcb->dst.b[4], pcb->dst.b[3],
551 pcb->dst.b[2], pcb->dst.b[1], pcb->dst.b[0],
552 pcb->psm, pcb->cid, op->result, pcb->state);
554 if (pcb->state != NG_BTSOCKET_L2CAP_CONNECTING) {
555 mtx_unlock(&pcb->pcb_mtx);
561 ng_btsocket_l2cap_untimeout(pcb);
566 pcb->so->so_error = ng_btsocket_l2cap_result2errno(op->result);
567 pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
568 soisdisconnected(pcb->so);
571 pcb->cfg_state = 0;
572 pcb->state = NG_BTSOCKET_L2CAP_CONFIGURING;
573 ng_btsocket_l2cap_timeout(pcb);
576 mtx_unlock(&pcb->pcb_mtx);
593 ng_btsocket_l2cap_pcb_t *pcb = NULL, *pcb1 = NULL;
615 pcb = ng_btsocket_l2cap_pcb_by_addr(&rt->src, ip->psm);
616 if (pcb != NULL) {
619 mtx_lock(&pcb->pcb_mtx);
626 if (pcb->so->so_qlen <= pcb->so->so_qlimit) {
627 CURVNET_SET(pcb->so->so_vnet);
628 so1 = sonewconn(pcb->so, 0);
650 if (bcmp(&pcb->src, NG_HCI_BDADDR_ANY, sizeof(pcb->src)) != 0)
651 bcopy(&pcb->src, &pcb1->src, sizeof(pcb1->src));
663 pcb1->imtu = pcb->imtu;
664 bcopy(&pcb->oflow, &pcb1->oflow, sizeof(pcb1->oflow));
665 pcb1->flush_timo = pcb->flush_timo;
692 if (pcb != NULL)
693 mtx_unlock(&pcb->pcb_mtx);
703 ng_btsocket_l2cap_pcb_t *pcb = NULL;
713 pcb = ng_btsocket_l2cap_pcb_by_cid(&rt->src, op->lcid,
715 if (pcb == NULL) {
720 mtx_lock(&pcb->pcb_mtx);
721 pcb->encryption = op->result;
723 if(pcb->need_encrypt){
724 ng_btsocket_l2cap_untimeout(pcb);
725 if(pcb->state != NG_BTSOCKET_L2CAP_W4_ENC_CHANGE){
726 NG_BTSOCKET_L2CAP_WARN("%s: Invalid pcb status %d",
727 __func__, pcb->state);
728 }else if(pcb->encryption){
729 pcb->state = NG_BTSOCKET_L2CAP_OPEN;
730 soisconnected(pcb->so);
732 pcb->so->so_error = EPERM;
733 ng_btsocket_l2cap_send_l2ca_discon_req(0, pcb);
734 pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
735 soisdisconnected(pcb->so);
738 mtx_unlock(&pcb->pcb_mtx);
752 ng_btsocket_l2cap_pcb_p pcb = NULL;
767 pcb = ng_btsocket_l2cap_pcb_by_token(msg->header.token);
768 if (pcb == NULL) {
779 mtx_lock(&pcb->pcb_mtx);
786 pcb->src.b[5], pcb->src.b[4], pcb->src.b[3],
787 pcb->src.b[2], pcb->src.b[1], pcb->src.b[0],
788 pcb->dst.b[5], pcb->dst.b[4], pcb->dst.b[3],
789 pcb->dst.b[2], pcb->dst.b[1], pcb->dst.b[0],
790 pcb->psm, pcb->cid, op->result, pcb->state, pcb->cfg_state);
792 if (pcb->state != NG_BTSOCKET_L2CAP_CONFIGURING) {
793 mtx_unlock(&pcb->pcb_mtx);
807 pcb->imtu = op->imtu;
808 bcopy(&op->oflow, &pcb->oflow, sizeof(pcb->oflow));
809 pcb->flush_timo = op->flush_timo;
817 pcb->cfg_state &= ~NG_BTSOCKET_L2CAP_CFG_IN_SENT;
818 pcb->cfg_state |= NG_BTSOCKET_L2CAP_CFG_IN;
820 if (pcb->cfg_state == NG_BTSOCKET_L2CAP_CFG_BOTH) {
822 ng_btsocket_l2cap_untimeout(pcb);
823 pcb->state = NG_BTSOCKET_L2CAP_OPEN;
824 soisconnected(pcb->so);
833 ng_btsocket_l2cap_untimeout(pcb);
838 pcb->so->so_error = EINVAL;
842 pcb->so->so_error = ECONNRESET;
847 ng_btsocket_l2cap_send_l2ca_discon_req(0, pcb);
850 pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
851 soisdisconnected(pcb->so);
854 mtx_unlock(&pcb->pcb_mtx);
869 ng_btsocket_l2cap_pcb_t *pcb = NULL;
880 pcb = ng_btsocket_l2cap_pcb_by_token(msg->header.token);
881 if (pcb == NULL) {
886 mtx_lock(&pcb->pcb_mtx);
893 pcb->src.b[5], pcb->src.b[4], pcb->src.b[3],
894 pcb->src.b[2], pcb->src.b[1], pcb->src.b[0],
895 pcb->dst.b[5], pcb->dst.b[4], pcb->dst.b[3],
896 pcb->dst.b[2], pcb->dst.b[1], pcb->dst.b[0],
897 pcb->psm, pcb->cid, op->result, pcb->state, pcb->cfg_state);
899 if (pcb->state != NG_BTSOCKET_L2CAP_CONFIGURING) {
900 mtx_unlock(&pcb->pcb_mtx);
915 pcb->cfg_state &= ~NG_BTSOCKET_L2CAP_CFG_OUT_SENT;
916 pcb->cfg_state |= NG_BTSOCKET_L2CAP_CFG_OUT;
918 if (pcb->cfg_state == NG_BTSOCKET_L2CAP_CFG_BOTH) {
920 ng_btsocket_l2cap_untimeout(pcb);
921 pcb->state = NG_BTSOCKET_L2CAP_OPEN;
922 soisconnected(pcb->so);
924 if (!(pcb->cfg_state & NG_BTSOCKET_L2CAP_CFG_IN_SENT)) {
926 error = ng_btsocket_l2cap_send_l2ca_cfg_req(pcb);
930 pcb->cfg_state |= NG_BTSOCKET_L2CAP_CFG_IN_SENT;
934 mtx_unlock(&pcb->pcb_mtx);
940 ng_btsocket_l2cap_untimeout(pcb);
943 ng_btsocket_l2cap_send_l2ca_discon_req(0, pcb);
946 pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
947 soisdisconnected(pcb->so);
949 mtx_unlock(&pcb->pcb_mtx);
964 ng_btsocket_l2cap_pcb_t *pcb = NULL;
975 pcb = ng_btsocket_l2cap_pcb_by_cid(&rt->src, ip->lcid,
977 if (pcb == NULL) {
982 mtx_lock(&pcb->pcb_mtx);
988 pcb->src.b[5], pcb->src.b[4], pcb->src.b[3],
989 pcb->src.b[2], pcb->src.b[1], pcb->src.b[0],
990 pcb->dst.b[5], pcb->dst.b[4], pcb->dst.b[3],
991 pcb->dst.b[2], pcb->dst.b[1], pcb->dst.b[0],
992 pcb->psm, pcb->cid, pcb->state, pcb->cfg_state);
995 if (pcb->state != NG_BTSOCKET_L2CAP_CONFIGURING) {
996 mtx_unlock(&pcb->pcb_mtx);
1008 pcb->omtu = ip->omtu;
1009 bcopy(&ip->iflow, &pcb->iflow, sizeof(pcb->iflow));
1010 pcb->flush_timo = ip->flush_timo;
1017 if (!(pcb->cfg_state & NG_BTSOCKET_L2CAP_CFG_OUT_SENT)) {
1018 error = ng_btsocket_l2cap_send_l2ca_cfg_rsp(pcb);
1020 ng_btsocket_l2cap_untimeout(pcb);
1022 pcb->so->so_error = error;
1025 ng_btsocket_l2cap_send_l2ca_discon_req(0, pcb);
1028 pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
1029 soisdisconnected(pcb->so);
1031 pcb->cfg_state |= NG_BTSOCKET_L2CAP_CFG_OUT_SENT;
1034 mtx_unlock(&pcb->pcb_mtx);
1049 ng_btsocket_l2cap_pcb_t *pcb = NULL;
1065 pcb = ng_btsocket_l2cap_pcb_by_token(msg->header.token);
1066 if (pcb == NULL) {
1071 mtx_lock(&pcb->pcb_mtx);
1074 if (pcb->state != NG_BTSOCKET_L2CAP_CLOSED) {
1079 pcb->src.b[5], pcb->src.b[4], pcb->src.b[3],
1080 pcb->src.b[2], pcb->src.b[1], pcb->src.b[0],
1081 pcb->dst.b[5], pcb->dst.b[4], pcb->dst.b[3],
1082 pcb->dst.b[2], pcb->dst.b[1], pcb->dst.b[0],
1083 pcb->psm, pcb->cid, op->result, pcb->state);
1085 ng_btsocket_l2cap_untimeout(pcb);
1087 pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
1088 soisdisconnected(pcb->so);
1091 mtx_unlock(&pcb->pcb_mtx);
1106 ng_btsocket_l2cap_pcb_t *pcb = NULL;
1117 pcb = ng_btsocket_l2cap_pcb_by_cid(&rt->src, ip->lcid,
1119 if (pcb == NULL) {
1130 mtx_lock(&pcb->pcb_mtx);
1136 pcb->src.b[5], pcb->src.b[4], pcb->src.b[3],
1137 pcb->src.b[2], pcb->src.b[1], pcb->src.b[0],
1138 pcb->dst.b[5], pcb->dst.b[4], pcb->dst.b[3],
1139 pcb->dst.b[2], pcb->dst.b[1], pcb->dst.b[0],
1140 pcb->psm, pcb->cid, pcb->state);
1142 if (pcb->flags & NG_BTSOCKET_L2CAP_TIMO)
1143 ng_btsocket_l2cap_untimeout(pcb);
1145 pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
1146 soisdisconnected(pcb->so);
1148 mtx_unlock(&pcb->pcb_mtx);
1163 ng_btsocket_l2cap_pcb_t *pcb = NULL;
1174 pcb = ng_btsocket_l2cap_pcb_by_token(msg->header.token);
1175 if (pcb == NULL) {
1180 mtx_lock(&pcb->pcb_mtx);
1186 pcb->src.b[5], pcb->src.b[4], pcb->src.b[3],
1187 pcb->src.b[2], pcb->src.b[1], pcb->src.b[0],
1188 pcb->dst.b[5], pcb->dst.b[4], pcb->dst.b[3],
1189 pcb->dst.b[2], pcb->dst.b[1], pcb->dst.b[0],
1190 pcb->psm, pcb->cid, op->result, op->length,
1191 pcb->state);
1193 if (pcb->state != NG_BTSOCKET_L2CAP_OPEN) {
1194 mtx_unlock(&pcb->pcb_mtx);
1200 ng_btsocket_l2cap_untimeout(pcb);
1205 sbdroprecord(&pcb->so->so_snd);
1206 if (sbavail(&pcb->so->so_snd) > 0) {
1207 if (ng_btsocket_l2cap_send2(pcb) == 0)
1208 ng_btsocket_l2cap_timeout(pcb);
1210 sbdroprecord(&pcb->so->so_snd); /* XXX */
1218 pcb->so->so_error = ng_btsocket_l2cap_result2errno(op->result);
1219 sowwakeup(pcb->so);
1221 mtx_unlock(&pcb->pcb_mtx);
1232 ng_btsocket_l2cap_send_l2ca_con_req(ng_btsocket_l2cap_pcb_p pcb)
1238 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
1240 if (pcb->rt == NULL ||
1241 pcb->rt->hook == NULL || NG_HOOK_NOT_VALID(pcb->rt->hook))
1249 msg->header.token = pcb->token;
1252 bcopy(&pcb->dst, &ip->bdaddr, sizeof(ip->bdaddr));
1253 ip->psm = pcb->psm;
1254 ip->linktype = ng_btsock_l2cap_addrtype_to_linktype(pcb->dsttype);
1255 ip->idtype = pcb->idtype;
1256 NG_SEND_MSG_HOOK(error, ng_btsocket_l2cap_node, msg,pcb->rt->hook, 0);
1302 ng_btsocket_l2cap_send_l2ca_cfg_req(ng_btsocket_l2cap_pcb_p pcb)
1308 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
1310 if (pcb->rt == NULL ||
1311 pcb->rt->hook == NULL || NG_HOOK_NOT_VALID(pcb->rt->hook))
1319 msg->header.token = pcb->token;
1322 ip->lcid = pcb->cid;
1323 ip->imtu = pcb->imtu;
1324 bcopy(&pcb->oflow, &ip->oflow, sizeof(ip->oflow));
1325 ip->flush_timo = pcb->flush_timo;
1326 ip->link_timo = pcb->link_timo;
1328 NG_SEND_MSG_HOOK(error, ng_btsocket_l2cap_node, msg,pcb->rt->hook, 0);
1338 ng_btsocket_l2cap_send_l2ca_cfg_rsp(ng_btsocket_l2cap_pcb_p pcb)
1344 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
1346 if (pcb->rt == NULL ||
1347 pcb->rt->hook == NULL || NG_HOOK_NOT_VALID(pcb->rt->hook))
1355 msg->header.token = pcb->token;
1358 ip->lcid = pcb->cid;
1359 ip->omtu = pcb->omtu;
1360 bcopy(&pcb->iflow, &ip->iflow, sizeof(ip->iflow));
1362 NG_SEND_MSG_HOOK(error, ng_btsocket_l2cap_node, msg, pcb->rt->hook, 0);
1373 ng_btsocket_l2cap_pcb_p pcb)
1379 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
1381 if (pcb->rt == NULL ||
1382 pcb->rt->hook == NULL || NG_HOOK_NOT_VALID(pcb->rt->hook))
1393 ip->lcid = pcb->cid;
1394 ip->idtype = pcb->idtype;
1396 NG_SEND_MSG_HOOK(error, ng_btsocket_l2cap_node, msg,pcb->rt->hook, 0);
1416 ng_btsocket_l2cap_pcb_t *pcb = NULL;
1488 pcb = ng_btsocket_l2cap_pcb_by_cid(&rt->src, hdr->dcid,idtype);
1489 if (pcb == NULL) {
1494 mtx_lock(&pcb->pcb_mtx);
1496 if (pcb->state != NG_BTSOCKET_L2CAP_OPEN) {
1502 hdr->dcid, pcb->state);
1504 mtx_unlock(&pcb->pcb_mtx);
1510 if (hdr->length > pcb->imtu) {
1517 hdr->dcid, hdr->length, pcb->imtu);
1519 mtx_unlock(&pcb->pcb_mtx);
1525 if (m->m_pkthdr.len > sbspace(&pcb->so->so_rcv)) {
1541 sbspace(&pcb->so->so_rcv));
1543 mtx_unlock(&pcb->pcb_mtx);
1549 sbappendrecord(&pcb->so->so_rcv, m);
1552 sorwakeup(pcb->so);
1554 mtx_unlock(&pcb->pcb_mtx);
1603 LIST_FOREACH(pcb, &ng_btsocket_l2cap_sockets, next) {
1606 mtx_lock(&pcb->pcb_mtx);
1608 if (bcmp(&rt->src, &pcb->src, sizeof(pcb->src)) != 0 ||
1609 pcb->psm != clt_hdr->psm ||
1610 pcb->state != NG_BTSOCKET_L2CAP_OPEN ||
1611 (pcb->so->so_options & SO_BROADCAST) == 0 ||
1612 m->m_pkthdr.len > sbspace(&pcb->so->so_rcv))
1623 sbappendrecord(&pcb->so->so_rcv, copy);
1624 sorwakeup(pcb->so);
1627 mtx_unlock(&pcb->pcb_mtx);
1841 ng_btsocket_l2cap_pcb_p pcb = NULL, pcb_next = NULL;
1851 for (pcb = LIST_FIRST(&ng_btsocket_l2cap_sockets); pcb != NULL; ) {
1852 mtx_lock(&pcb->pcb_mtx);
1853 pcb_next = LIST_NEXT(pcb, next);
1855 if (pcb->rt != NULL &&
1856 pcb->rt->hook != NULL && NG_HOOK_NOT_VALID(pcb->rt->hook)) {
1857 if (pcb->flags & NG_BTSOCKET_L2CAP_TIMO)
1858 ng_btsocket_l2cap_untimeout(pcb);
1860 pcb->so->so_error = ENETDOWN;
1861 pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
1862 soisdisconnected(pcb->so);
1864 pcb->token = 0;
1865 pcb->cid = 0;
1866 pcb->rt = NULL;
1869 mtx_unlock(&pcb->pcb_mtx);
1870 pcb = pcb_next;
2006 ng_btsocket_l2cap_pcb_p pcb = so2l2cap_pcb(so);
2021 if (pcb != NULL)
2033 pcb = malloc(sizeof(*pcb),
2035 if (pcb == NULL)
2039 so->so_pcb = (caddr_t) pcb;
2040 pcb->so = so;
2041 pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
2044 pcb->imtu = pcb->omtu = NG_L2CAP_MTU_DEFAULT;
2047 pcb->iflow.flags = 0x0;
2048 pcb->iflow.service_type = NG_HCI_SERVICE_TYPE_BEST_EFFORT;
2049 pcb->iflow.token_rate = 0xffffffff; /* maximum */
2050 pcb->iflow.token_bucket_size = 0xffffffff; /* maximum */
2051 pcb->iflow.peak_bandwidth = 0x00000000; /* maximum */
2052 pcb->iflow.latency = 0xffffffff; /* don't care */
2053 pcb->iflow.delay_variation = 0xffffffff; /* don't care */
2055 bcopy(&pcb->iflow, &pcb->oflow, sizeof(pcb->oflow));
2057 pcb->flush_timo = NG_L2CAP_FLUSH_TIMO_DEFAULT;
2058 pcb->link_timo = NG_L2CAP_LINK_TIMO_DEFAULT;
2067 mtx_init(&pcb->pcb_mtx, "btsocks_l2cap_pcb_mtx", NULL,
2069 callout_init_mtx(&pcb->timo, &pcb->pcb_mtx, 0);
2099 pcb->token = token;
2101 LIST_INSERT_HEAD(&ng_btsocket_l2cap_sockets, pcb, next);
2117 ng_btsocket_l2cap_pcb_t *pcb = NULL;
2146 LIST_FOREACH(pcb, &ng_btsocket_l2cap_sockets, next)
2147 if (psm != 0 && psm == pcb->psm &&
2148 bcmp(&pcb->src, &sa->l2cap_bdaddr, sizeof(bdaddr_t)) == 0)
2151 if (pcb == NULL) {
2153 pcb = so2l2cap_pcb(so);
2154 if (pcb != NULL) {
2155 bcopy(&sa->l2cap_bdaddr, &pcb->src, sizeof(pcb->src));
2156 pcb->psm = psm;
2175 ng_btsocket_l2cap_pcb_t *pcb = so2l2cap_pcb(so);
2183 if (pcb == NULL)
2187 if (pcb->state == NG_BTSOCKET_L2CAP_CONNECTING)
2221 if (pcb->psm != 0 && pcb->psm != le16toh(sa->l2cap_psm))
2232 mtx_lock(&pcb->pcb_mtx);
2235 bcopy(&sa->l2cap_bdaddr, &pcb->dst, sizeof(pcb->dst));
2236 pcb->psm = le16toh(sa->l2cap_psm);
2237 pcb->dsttype = sa->l2cap_bdaddr_type;
2238 pcb->cid = 0;
2239 pcb->idtype = idtype;
2240 pcb->rt = NULL;
2241 have_src = bcmp(&pcb->src, NG_HCI_BDADDR_ANY, sizeof(pcb->src));
2249 if (bcmp(&pcb->src, &rt->src, sizeof(rt->src)) == 0)
2252 if (bcmp(&pcb->dst, &rt->src, sizeof(rt->src)) != 0)
2258 pcb->rt = rt;
2261 bcopy(&rt->src, &pcb->src, sizeof(pcb->src));
2262 pcb->srctype =
2274 error = ng_btsocket_l2cap_send_l2ca_con_req(pcb);
2276 pcb->flags |= NG_BTSOCKET_L2CAP_CLIENT;
2277 pcb->state = NG_BTSOCKET_L2CAP_CONNECTING;
2278 soisconnecting(pcb->so);
2280 ng_btsocket_l2cap_timeout(pcb);
2284 mtx_unlock(&pcb->pcb_mtx);
2309 ng_btsocket_l2cap_pcb_p pcb = so2l2cap_pcb(so);
2313 if (pcb == NULL)
2321 mtx_lock(&pcb->pcb_mtx);
2327 error = sooptcopyout(sopt, &pcb->imtu,
2328 sizeof(pcb->imtu));
2332 error = sooptcopyout(sopt, &pcb->omtu,
2333 sizeof(pcb->omtu));
2337 error = sooptcopyout(sopt, &pcb->iflow,
2338 sizeof(pcb->iflow));
2342 error = sooptcopyout(sopt, &pcb->oflow,
2343 sizeof(pcb->oflow));
2347 error = sooptcopyout(sopt, &pcb->flush_timo,
2348 sizeof(pcb->flush_timo));
2351 error = sooptcopyout(sopt, &pcb->need_encrypt,
2352 sizeof(pcb->need_encrypt));
2371 if (pcb->state != NG_BTSOCKET_L2CAP_CLOSED) {
2380 pcb->imtu = v.mtu;
2386 bcopy(&v.flow, &pcb->oflow, sizeof(pcb->oflow));
2393 pcb->flush_timo = v.flush_timo;
2396 if((pcb->state != NG_BTSOCKET_L2CAP_OPEN) &&
2397 (pcb->state != NG_BTSOCKET_L2CAP_W4_ENC_CHANGE)){
2401 pcb->need_encrypt = (v.encryption)?1:0;
2417 mtx_unlock(&pcb->pcb_mtx);
2429 ng_btsocket_l2cap_pcb_p pcb = so2l2cap_pcb(so);
2431 KASSERT(pcb != NULL, ("ng_btsocket_l2cap_detach: pcb == NULL"));
2437 mtx_lock(&pcb->pcb_mtx);
2440 if (pcb->flags & NG_BTSOCKET_L2CAP_TIMO)
2441 ng_btsocket_l2cap_untimeout(pcb);
2443 if (pcb->state != NG_BTSOCKET_L2CAP_CLOSED &&
2444 pcb->state != NG_BTSOCKET_L2CAP_DISCONNECTING)
2446 ng_btsocket_l2cap_send_l2ca_discon_req(0, pcb);
2448 pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
2450 LIST_REMOVE(pcb, next);
2452 mtx_unlock(&pcb->pcb_mtx);
2455 mtx_destroy(&pcb->pcb_mtx);
2456 bzero(pcb, sizeof(*pcb));
2457 free(pcb, M_NETGRAPH_BTSOCKET_L2CAP);
2470 ng_btsocket_l2cap_pcb_p pcb = so2l2cap_pcb(so);
2473 if (pcb == NULL)
2478 mtx_lock(&pcb->pcb_mtx);
2480 if (pcb->state == NG_BTSOCKET_L2CAP_DISCONNECTING) {
2481 mtx_unlock(&pcb->pcb_mtx);
2485 if (pcb->state != NG_BTSOCKET_L2CAP_CLOSED) {
2487 if (pcb->flags & NG_BTSOCKET_L2CAP_TIMO)
2488 ng_btsocket_l2cap_untimeout(pcb);
2490 error = ng_btsocket_l2cap_send_l2ca_discon_req(pcb->token, pcb);
2492 pcb->state = NG_BTSOCKET_L2CAP_DISCONNECTING;
2495 ng_btsocket_l2cap_timeout(pcb);
2501 mtx_unlock(&pcb->pcb_mtx);
2513 ng_btsocket_l2cap_pcb_p pcb = so2l2cap_pcb(so);
2520 if (pcb == NULL) {
2528 if (pcb->psm == 0) {
2545 ng_btsocket_l2cap_pcb_p pcb = so2l2cap_pcb(so);
2548 if (pcb == NULL)
2553 bcopy(&pcb->dst, &sa.l2cap_bdaddr, sizeof(sa.l2cap_bdaddr));
2554 sa.l2cap_psm = htole16(pcb->psm);
2557 switch(pcb->idtype){
2568 sa.l2cap_bdaddr_type = pcb->dsttype;
2582 ng_btsocket_l2cap_pcb_t *pcb = so2l2cap_pcb(so);
2591 if (pcb == NULL || m == NULL || control != NULL) {
2596 mtx_lock(&pcb->pcb_mtx);
2599 if (pcb->state != NG_BTSOCKET_L2CAP_OPEN) {
2600 mtx_unlock(&pcb->pcb_mtx);
2606 if (pcb->rt == NULL ||
2607 pcb->rt->hook == NULL || NG_HOOK_NOT_VALID(pcb->rt->hook)) {
2608 mtx_unlock(&pcb->pcb_mtx);
2614 if (m->m_pkthdr.len > pcb->omtu) {
2616 "%s: Packet too big, len=%d, omtu=%d\n", __func__, m->m_pkthdr.len, pcb->omtu);
2618 mtx_unlock(&pcb->pcb_mtx);
2630 sbappendrecord(&pcb->so->so_snd, m);
2633 if (!(pcb->flags & NG_BTSOCKET_L2CAP_TIMO)) {
2634 error = ng_btsocket_l2cap_send2(pcb);
2636 ng_btsocket_l2cap_timeout(pcb);
2638 sbdroprecord(&pcb->so->so_snd); /* XXX */
2641 mtx_unlock(&pcb->pcb_mtx);
2654 ng_btsocket_l2cap_send2(ng_btsocket_l2cap_pcb_p pcb)
2660 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
2662 if (sbavail(&pcb->so->so_snd) == 0)
2665 m = m_dup(pcb->so->so_snd.sb_mb, M_NOWAIT);
2683 hdr->token = pcb->token;
2685 hdr->lcid = pcb->cid;
2686 hdr->idtype = pcb->idtype;
2690 hdr->token, pcb->state);
2697 NG_SEND_DATA_ONLY(error, pcb->rt->hook, m);
2709 ng_btsocket_l2cap_pcb_p pcb = so2l2cap_pcb(so);
2712 if (pcb == NULL)
2717 bcopy(&pcb->src, &sa.l2cap_bdaddr, sizeof(sa.l2cap_bdaddr));
2718 sa.l2cap_psm = htole16(pcb->psm);
2722 sa.l2cap_bdaddr_type = pcb->srctype;
2811 ng_btsocket_l2cap_timeout(ng_btsocket_l2cap_pcb_p pcb)
2813 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
2815 if (!(pcb->flags & NG_BTSOCKET_L2CAP_TIMO)) {
2816 pcb->flags |= NG_BTSOCKET_L2CAP_TIMO;
2817 callout_reset(&pcb->timo, bluetooth_l2cap_ertx_timeout(),
2818 ng_btsocket_l2cap_process_timeout, pcb);
2829 ng_btsocket_l2cap_untimeout(ng_btsocket_l2cap_pcb_p pcb)
2831 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
2833 if (pcb->flags & NG_BTSOCKET_L2CAP_TIMO) {
2834 callout_stop(&pcb->timo);
2835 pcb->flags &= ~NG_BTSOCKET_L2CAP_TIMO;
2848 ng_btsocket_l2cap_pcb_p pcb = (ng_btsocket_l2cap_pcb_p) xpcb;
2850 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
2852 pcb->flags &= ~NG_BTSOCKET_L2CAP_TIMO;
2853 pcb->so->so_error = ETIMEDOUT;
2855 switch (pcb->state) {
2860 if (pcb->cid != 0)
2861 ng_btsocket_l2cap_send_l2ca_discon_req(0, pcb);
2864 pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
2865 soisdisconnected(pcb->so);
2870 sbdroprecord(&pcb->so->so_snd);
2871 sowwakeup(pcb->so);
2876 pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
2877 soisdisconnected(pcb->so);
2882 "%s: Invalid socket state=%d\n", __func__, pcb->state);