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

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);
621 CURVNET_SET(pcb->so->so_vnet);
622 so1 = sonewconn(pcb->so, 0);
642 if (bcmp(&pcb->src, NG_HCI_BDADDR_ANY, sizeof(pcb->src)) != 0)
643 bcopy(&pcb->src, &pcb1->src, sizeof(pcb1->src));
655 pcb1->imtu = pcb->imtu;
656 bcopy(&pcb->oflow, &pcb1->oflow, sizeof(pcb1->oflow));
657 pcb1->flush_timo = pcb->flush_timo;
684 if (pcb != NULL)
685 mtx_unlock(&pcb->pcb_mtx);
695 ng_btsocket_l2cap_pcb_t *pcb = NULL;
704 pcb = ng_btsocket_l2cap_pcb_by_cid(&rt->src, op->lcid,
706 if (pcb == NULL) {
711 mtx_lock(&pcb->pcb_mtx);
712 pcb->encryption = op->result;
714 if(pcb->need_encrypt){
715 ng_btsocket_l2cap_untimeout(pcb);
716 if(pcb->state != NG_BTSOCKET_L2CAP_W4_ENC_CHANGE){
717 NG_BTSOCKET_L2CAP_WARN("%s: Invalid pcb status %d",
718 __func__, pcb->state);
719 }else if(pcb->encryption){
720 pcb->state = NG_BTSOCKET_L2CAP_OPEN;
721 soisconnected(pcb->so);
723 pcb->so->so_error = EPERM;
724 ng_btsocket_l2cap_send_l2ca_discon_req(0, pcb);
725 pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
726 soisdisconnected(pcb->so);
729 mtx_unlock(&pcb->pcb_mtx);
743 ng_btsocket_l2cap_pcb_p pcb = NULL;
758 pcb = ng_btsocket_l2cap_pcb_by_token(msg->header.token);
759 if (pcb == NULL) {
770 mtx_lock(&pcb->pcb_mtx);
777 pcb->src.b[5], pcb->src.b[4], pcb->src.b[3],
778 pcb->src.b[2], pcb->src.b[1], pcb->src.b[0],
779 pcb->dst.b[5], pcb->dst.b[4], pcb->dst.b[3],
780 pcb->dst.b[2], pcb->dst.b[1], pcb->dst.b[0],
781 pcb->psm, pcb->cid, op->result, pcb->state, pcb->cfg_state);
783 if (pcb->state != NG_BTSOCKET_L2CAP_CONFIGURING) {
784 mtx_unlock(&pcb->pcb_mtx);
798 pcb->imtu = op->imtu;
799 bcopy(&op->oflow, &pcb->oflow, sizeof(pcb->oflow));
800 pcb->flush_timo = op->flush_timo;
808 pcb->cfg_state &= ~NG_BTSOCKET_L2CAP_CFG_IN_SENT;
809 pcb->cfg_state |= NG_BTSOCKET_L2CAP_CFG_IN;
811 if (pcb->cfg_state == NG_BTSOCKET_L2CAP_CFG_BOTH) {
813 ng_btsocket_l2cap_untimeout(pcb);
814 pcb->state = NG_BTSOCKET_L2CAP_OPEN;
815 soisconnected(pcb->so);
824 ng_btsocket_l2cap_untimeout(pcb);
829 pcb->so->so_error = EINVAL;
833 pcb->so->so_error = ECONNRESET;
838 ng_btsocket_l2cap_send_l2ca_discon_req(0, pcb);
841 pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
842 soisdisconnected(pcb->so);
845 mtx_unlock(&pcb->pcb_mtx);
860 ng_btsocket_l2cap_pcb_t *pcb = NULL;
871 pcb = ng_btsocket_l2cap_pcb_by_token(msg->header.token);
872 if (pcb == NULL) {
877 mtx_lock(&pcb->pcb_mtx);
884 pcb->src.b[5], pcb->src.b[4], pcb->src.b[3],
885 pcb->src.b[2], pcb->src.b[1], pcb->src.b[0],
886 pcb->dst.b[5], pcb->dst.b[4], pcb->dst.b[3],
887 pcb->dst.b[2], pcb->dst.b[1], pcb->dst.b[0],
888 pcb->psm, pcb->cid, op->result, pcb->state, pcb->cfg_state);
890 if (pcb->state != NG_BTSOCKET_L2CAP_CONFIGURING) {
891 mtx_unlock(&pcb->pcb_mtx);
906 pcb->cfg_state &= ~NG_BTSOCKET_L2CAP_CFG_OUT_SENT;
907 pcb->cfg_state |= NG_BTSOCKET_L2CAP_CFG_OUT;
909 if (pcb->cfg_state == NG_BTSOCKET_L2CAP_CFG_BOTH) {
911 ng_btsocket_l2cap_untimeout(pcb);
912 pcb->state = NG_BTSOCKET_L2CAP_OPEN;
913 soisconnected(pcb->so);
915 if (!(pcb->cfg_state & NG_BTSOCKET_L2CAP_CFG_IN_SENT)) {
917 error = ng_btsocket_l2cap_send_l2ca_cfg_req(pcb);
921 pcb->cfg_state |= NG_BTSOCKET_L2CAP_CFG_IN_SENT;
925 mtx_unlock(&pcb->pcb_mtx);
931 ng_btsocket_l2cap_untimeout(pcb);
934 ng_btsocket_l2cap_send_l2ca_discon_req(0, pcb);
937 pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
938 soisdisconnected(pcb->so);
940 mtx_unlock(&pcb->pcb_mtx);
955 ng_btsocket_l2cap_pcb_t *pcb = NULL;
966 pcb = ng_btsocket_l2cap_pcb_by_cid(&rt->src, ip->lcid,
968 if (pcb == NULL) {
973 mtx_lock(&pcb->pcb_mtx);
979 pcb->src.b[5], pcb->src.b[4], pcb->src.b[3],
980 pcb->src.b[2], pcb->src.b[1], pcb->src.b[0],
981 pcb->dst.b[5], pcb->dst.b[4], pcb->dst.b[3],
982 pcb->dst.b[2], pcb->dst.b[1], pcb->dst.b[0],
983 pcb->psm, pcb->cid, pcb->state, pcb->cfg_state);
986 if (pcb->state != NG_BTSOCKET_L2CAP_CONFIGURING) {
987 mtx_unlock(&pcb->pcb_mtx);
999 pcb->omtu = ip->omtu;
1000 bcopy(&ip->iflow, &pcb->iflow, sizeof(pcb->iflow));
1001 pcb->flush_timo = ip->flush_timo;
1008 if (!(pcb->cfg_state & NG_BTSOCKET_L2CAP_CFG_OUT_SENT)) {
1009 error = ng_btsocket_l2cap_send_l2ca_cfg_rsp(pcb);
1011 ng_btsocket_l2cap_untimeout(pcb);
1013 pcb->so->so_error = error;
1016 ng_btsocket_l2cap_send_l2ca_discon_req(0, pcb);
1019 pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
1020 soisdisconnected(pcb->so);
1022 pcb->cfg_state |= NG_BTSOCKET_L2CAP_CFG_OUT_SENT;
1025 mtx_unlock(&pcb->pcb_mtx);
1040 ng_btsocket_l2cap_pcb_t *pcb = NULL;
1056 pcb = ng_btsocket_l2cap_pcb_by_token(msg->header.token);
1057 if (pcb == NULL) {
1062 mtx_lock(&pcb->pcb_mtx);
1065 if (pcb->state != NG_BTSOCKET_L2CAP_CLOSED) {
1070 pcb->src.b[5], pcb->src.b[4], pcb->src.b[3],
1071 pcb->src.b[2], pcb->src.b[1], pcb->src.b[0],
1072 pcb->dst.b[5], pcb->dst.b[4], pcb->dst.b[3],
1073 pcb->dst.b[2], pcb->dst.b[1], pcb->dst.b[0],
1074 pcb->psm, pcb->cid, op->result, pcb->state);
1076 ng_btsocket_l2cap_untimeout(pcb);
1078 pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
1079 soisdisconnected(pcb->so);
1082 mtx_unlock(&pcb->pcb_mtx);
1097 ng_btsocket_l2cap_pcb_t *pcb = NULL;
1108 pcb = ng_btsocket_l2cap_pcb_by_cid(&rt->src, ip->lcid,
1110 if (pcb == NULL) {
1121 mtx_lock(&pcb->pcb_mtx);
1127 pcb->src.b[5], pcb->src.b[4], pcb->src.b[3],
1128 pcb->src.b[2], pcb->src.b[1], pcb->src.b[0],
1129 pcb->dst.b[5], pcb->dst.b[4], pcb->dst.b[3],
1130 pcb->dst.b[2], pcb->dst.b[1], pcb->dst.b[0],
1131 pcb->psm, pcb->cid, pcb->state);
1133 if (pcb->flags & NG_BTSOCKET_L2CAP_TIMO)
1134 ng_btsocket_l2cap_untimeout(pcb);
1136 pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
1137 soisdisconnected(pcb->so);
1139 mtx_unlock(&pcb->pcb_mtx);
1154 ng_btsocket_l2cap_pcb_t *pcb = NULL;
1165 pcb = ng_btsocket_l2cap_pcb_by_token(msg->header.token);
1166 if (pcb == NULL) {
1171 mtx_lock(&pcb->pcb_mtx);
1177 pcb->src.b[5], pcb->src.b[4], pcb->src.b[3],
1178 pcb->src.b[2], pcb->src.b[1], pcb->src.b[0],
1179 pcb->dst.b[5], pcb->dst.b[4], pcb->dst.b[3],
1180 pcb->dst.b[2], pcb->dst.b[1], pcb->dst.b[0],
1181 pcb->psm, pcb->cid, op->result, op->length,
1182 pcb->state);
1184 if (pcb->state != NG_BTSOCKET_L2CAP_OPEN) {
1185 mtx_unlock(&pcb->pcb_mtx);
1191 ng_btsocket_l2cap_untimeout(pcb);
1196 sbdroprecord(&pcb->so->so_snd);
1197 if (sbavail(&pcb->so->so_snd) > 0) {
1198 if (ng_btsocket_l2cap_send2(pcb) == 0)
1199 ng_btsocket_l2cap_timeout(pcb);
1201 sbdroprecord(&pcb->so->so_snd); /* XXX */
1209 pcb->so->so_error = ng_btsocket_l2cap_result2errno(op->result);
1210 sowwakeup(pcb->so);
1212 mtx_unlock(&pcb->pcb_mtx);
1223 ng_btsocket_l2cap_send_l2ca_con_req(ng_btsocket_l2cap_pcb_p pcb)
1229 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
1231 if (pcb->rt == NULL ||
1232 pcb->rt->hook == NULL || NG_HOOK_NOT_VALID(pcb->rt->hook))
1240 msg->header.token = pcb->token;
1243 bcopy(&pcb->dst, &ip->bdaddr, sizeof(ip->bdaddr));
1244 ip->psm = pcb->psm;
1245 ip->linktype = ng_btsock_l2cap_addrtype_to_linktype(pcb->dsttype);
1246 ip->idtype = pcb->idtype;
1247 NG_SEND_MSG_HOOK(error, ng_btsocket_l2cap_node, msg,pcb->rt->hook, 0);
1293 ng_btsocket_l2cap_send_l2ca_cfg_req(ng_btsocket_l2cap_pcb_p pcb)
1299 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
1301 if (pcb->rt == NULL ||
1302 pcb->rt->hook == NULL || NG_HOOK_NOT_VALID(pcb->rt->hook))
1310 msg->header.token = pcb->token;
1313 ip->lcid = pcb->cid;
1314 ip->imtu = pcb->imtu;
1315 bcopy(&pcb->oflow, &ip->oflow, sizeof(ip->oflow));
1316 ip->flush_timo = pcb->flush_timo;
1317 ip->link_timo = pcb->link_timo;
1319 NG_SEND_MSG_HOOK(error, ng_btsocket_l2cap_node, msg,pcb->rt->hook, 0);
1329 ng_btsocket_l2cap_send_l2ca_cfg_rsp(ng_btsocket_l2cap_pcb_p pcb)
1335 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
1337 if (pcb->rt == NULL ||
1338 pcb->rt->hook == NULL || NG_HOOK_NOT_VALID(pcb->rt->hook))
1346 msg->header.token = pcb->token;
1349 ip->lcid = pcb->cid;
1350 ip->omtu = pcb->omtu;
1351 bcopy(&pcb->iflow, &ip->iflow, sizeof(ip->iflow));
1353 NG_SEND_MSG_HOOK(error, ng_btsocket_l2cap_node, msg, pcb->rt->hook, 0);
1364 ng_btsocket_l2cap_pcb_p pcb)
1370 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
1372 if (pcb->rt == NULL ||
1373 pcb->rt->hook == NULL || NG_HOOK_NOT_VALID(pcb->rt->hook))
1384 ip->lcid = pcb->cid;
1385 ip->idtype = pcb->idtype;
1387 NG_SEND_MSG_HOOK(error, ng_btsocket_l2cap_node, msg,pcb->rt->hook, 0);
1407 ng_btsocket_l2cap_pcb_t *pcb = NULL;
1478 pcb = ng_btsocket_l2cap_pcb_by_cid(&rt->src, hdr->dcid,idtype);
1479 if (pcb == NULL) {
1484 mtx_lock(&pcb->pcb_mtx);
1486 if (pcb->state != NG_BTSOCKET_L2CAP_OPEN) {
1492 hdr->dcid, pcb->state);
1494 mtx_unlock(&pcb->pcb_mtx);
1500 if (hdr->length > pcb->imtu) {
1507 hdr->dcid, hdr->length, pcb->imtu);
1509 mtx_unlock(&pcb->pcb_mtx);
1515 if (m->m_pkthdr.len > sbspace(&pcb->so->so_rcv)) {
1530 sbspace(&pcb->so->so_rcv));
1532 mtx_unlock(&pcb->pcb_mtx);
1538 sbappendrecord(&pcb->so->so_rcv, m);
1541 sorwakeup(pcb->so);
1543 mtx_unlock(&pcb->pcb_mtx);
1592 LIST_FOREACH(pcb, &ng_btsocket_l2cap_sockets, next) {
1595 mtx_lock(&pcb->pcb_mtx);
1597 if (bcmp(&rt->src, &pcb->src, sizeof(pcb->src)) != 0 ||
1598 pcb->psm != clt_hdr->psm ||
1599 pcb->state != NG_BTSOCKET_L2CAP_OPEN ||
1600 (pcb->so->so_options & SO_BROADCAST) == 0 ||
1601 m->m_pkthdr.len > sbspace(&pcb->so->so_rcv))
1612 sbappendrecord(&pcb->so->so_rcv, copy);
1613 sorwakeup(pcb->so);
1616 mtx_unlock(&pcb->pcb_mtx);
1830 ng_btsocket_l2cap_pcb_p pcb = NULL, pcb_next = NULL;
1840 for (pcb = LIST_FIRST(&ng_btsocket_l2cap_sockets); pcb != NULL; ) {
1841 mtx_lock(&pcb->pcb_mtx);
1842 pcb_next = LIST_NEXT(pcb, next);
1844 if (pcb->rt != NULL &&
1845 pcb->rt->hook != NULL && NG_HOOK_NOT_VALID(pcb->rt->hook)) {
1846 if (pcb->flags & NG_BTSOCKET_L2CAP_TIMO)
1847 ng_btsocket_l2cap_untimeout(pcb);
1849 pcb->so->so_error = ENETDOWN;
1850 pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
1851 soisdisconnected(pcb->so);
1853 pcb->token = 0;
1854 pcb->cid = 0;
1855 pcb->rt = NULL;
1858 mtx_unlock(&pcb->pcb_mtx);
1859 pcb = pcb_next;
1995 ng_btsocket_l2cap_pcb_p pcb = so2l2cap_pcb(so);
2010 if (pcb != NULL)
2022 pcb = malloc(sizeof(*pcb),
2024 if (pcb == NULL)
2028 so->so_pcb = (caddr_t) pcb;
2029 pcb->so = so;
2030 pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
2033 pcb->imtu = pcb->omtu = NG_L2CAP_MTU_DEFAULT;
2036 pcb->iflow.flags = 0x0;
2037 pcb->iflow.service_type = NG_HCI_SERVICE_TYPE_BEST_EFFORT;
2038 pcb->iflow.token_rate = 0xffffffff; /* maximum */
2039 pcb->iflow.token_bucket_size = 0xffffffff; /* maximum */
2040 pcb->iflow.peak_bandwidth = 0x00000000; /* maximum */
2041 pcb->iflow.latency = 0xffffffff; /* don't care */
2042 pcb->iflow.delay_variation = 0xffffffff; /* don't care */
2044 bcopy(&pcb->iflow, &pcb->oflow, sizeof(pcb->oflow));
2046 pcb->flush_timo = NG_L2CAP_FLUSH_TIMO_DEFAULT;
2047 pcb->link_timo = NG_L2CAP_LINK_TIMO_DEFAULT;
2056 mtx_init(&pcb->pcb_mtx, "btsocks_l2cap_pcb_mtx", NULL,
2058 callout_init_mtx(&pcb->timo, &pcb->pcb_mtx, 0);
2088 pcb->token = token;
2090 LIST_INSERT_HEAD(&ng_btsocket_l2cap_sockets, pcb, next);
2106 ng_btsocket_l2cap_pcb_t *pcb = NULL;
2135 LIST_FOREACH(pcb, &ng_btsocket_l2cap_sockets, next)
2136 if (psm != 0 && psm == pcb->psm &&
2137 bcmp(&pcb->src, &sa->l2cap_bdaddr, sizeof(bdaddr_t)) == 0)
2140 if (pcb == NULL) {
2142 pcb = so2l2cap_pcb(so);
2143 if (pcb != NULL) {
2144 bcopy(&sa->l2cap_bdaddr, &pcb->src, sizeof(pcb->src));
2145 pcb->psm = psm;
2164 ng_btsocket_l2cap_pcb_t *pcb = so2l2cap_pcb(so);
2172 if (pcb == NULL)
2176 if (pcb->state == NG_BTSOCKET_L2CAP_CONNECTING)
2210 if (pcb->psm != 0 && pcb->psm != le16toh(sa->l2cap_psm))
2221 mtx_lock(&pcb->pcb_mtx);
2224 bcopy(&sa->l2cap_bdaddr, &pcb->dst, sizeof(pcb->dst));
2225 pcb->psm = le16toh(sa->l2cap_psm);
2226 pcb->dsttype = sa->l2cap_bdaddr_type;
2227 pcb->cid = 0;
2228 pcb->idtype = idtype;
2229 pcb->rt = NULL;
2230 have_src = bcmp(&pcb->src, NG_HCI_BDADDR_ANY, sizeof(pcb->src));
2238 if (bcmp(&pcb->src, &rt->src, sizeof(rt->src)) == 0)
2241 if (bcmp(&pcb->dst, &rt->src, sizeof(rt->src)) != 0)
2247 pcb->rt = rt;
2250 bcopy(&rt->src, &pcb->src, sizeof(pcb->src));
2251 pcb->srctype =
2263 error = ng_btsocket_l2cap_send_l2ca_con_req(pcb);
2265 pcb->flags |= NG_BTSOCKET_L2CAP_CLIENT;
2266 pcb->state = NG_BTSOCKET_L2CAP_CONNECTING;
2267 soisconnecting(pcb->so);
2269 ng_btsocket_l2cap_timeout(pcb);
2273 mtx_unlock(&pcb->pcb_mtx);
2298 ng_btsocket_l2cap_pcb_p pcb = so2l2cap_pcb(so);
2302 if (pcb == NULL)
2310 mtx_lock(&pcb->pcb_mtx);
2316 error = sooptcopyout(sopt, &pcb->imtu,
2317 sizeof(pcb->imtu));
2321 error = sooptcopyout(sopt, &pcb->omtu,
2322 sizeof(pcb->omtu));
2326 error = sooptcopyout(sopt, &pcb->iflow,
2327 sizeof(pcb->iflow));
2331 error = sooptcopyout(sopt, &pcb->oflow,
2332 sizeof(pcb->oflow));
2336 error = sooptcopyout(sopt, &pcb->flush_timo,
2337 sizeof(pcb->flush_timo));
2340 error = sooptcopyout(sopt, &pcb->need_encrypt,
2341 sizeof(pcb->need_encrypt));
2359 if (pcb->state != NG_BTSOCKET_L2CAP_CLOSED) {
2368 pcb->imtu = v.mtu;
2374 bcopy(&v.flow, &pcb->oflow, sizeof(pcb->oflow));
2381 pcb->flush_timo = v.flush_timo;
2384 if((pcb->state != NG_BTSOCKET_L2CAP_OPEN) &&
2385 (pcb->state != NG_BTSOCKET_L2CAP_W4_ENC_CHANGE)){
2389 pcb->need_encrypt = (v.encryption)?1:0;
2405 mtx_unlock(&pcb->pcb_mtx);
2417 ng_btsocket_l2cap_pcb_p pcb = so2l2cap_pcb(so);
2419 KASSERT(pcb != NULL, ("ng_btsocket_l2cap_detach: pcb == NULL"));
2425 mtx_lock(&pcb->pcb_mtx);
2428 if (pcb->flags & NG_BTSOCKET_L2CAP_TIMO)
2429 ng_btsocket_l2cap_untimeout(pcb);
2431 if (pcb->state != NG_BTSOCKET_L2CAP_CLOSED &&
2432 pcb->state != NG_BTSOCKET_L2CAP_DISCONNECTING)
2434 ng_btsocket_l2cap_send_l2ca_discon_req(0, pcb);
2436 pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
2438 LIST_REMOVE(pcb, next);
2440 mtx_unlock(&pcb->pcb_mtx);
2443 mtx_destroy(&pcb->pcb_mtx);
2444 bzero(pcb, sizeof(*pcb));
2445 free(pcb, M_NETGRAPH_BTSOCKET_L2CAP);
2458 ng_btsocket_l2cap_pcb_p pcb = so2l2cap_pcb(so);
2461 if (pcb == NULL)
2466 mtx_lock(&pcb->pcb_mtx);
2468 if (pcb->state == NG_BTSOCKET_L2CAP_DISCONNECTING) {
2469 mtx_unlock(&pcb->pcb_mtx);
2473 if (pcb->state != NG_BTSOCKET_L2CAP_CLOSED) {
2475 if (pcb->flags & NG_BTSOCKET_L2CAP_TIMO)
2476 ng_btsocket_l2cap_untimeout(pcb);
2478 error = ng_btsocket_l2cap_send_l2ca_discon_req(pcb->token, pcb);
2480 pcb->state = NG_BTSOCKET_L2CAP_DISCONNECTING;
2483 ng_btsocket_l2cap_timeout(pcb);
2489 mtx_unlock(&pcb->pcb_mtx);
2501 ng_btsocket_l2cap_pcb_p pcb = so2l2cap_pcb(so);
2508 if (pcb == NULL) {
2516 if (pcb->psm == 0) {
2533 ng_btsocket_l2cap_pcb_p pcb = so2l2cap_pcb(so);
2536 if (pcb == NULL)
2541 bcopy(&pcb->dst, &sa.l2cap_bdaddr, sizeof(sa.l2cap_bdaddr));
2542 sa.l2cap_psm = htole16(pcb->psm);
2545 switch(pcb->idtype){
2556 sa.l2cap_bdaddr_type = pcb->dsttype;
2570 ng_btsocket_l2cap_pcb_t *pcb = so2l2cap_pcb(so);
2579 if (pcb == NULL || m == NULL || control != NULL) {
2584 mtx_lock(&pcb->pcb_mtx);
2587 if (pcb->state != NG_BTSOCKET_L2CAP_OPEN) {
2588 mtx_unlock(&pcb->pcb_mtx);
2594 if (pcb->rt == NULL ||
2595 pcb->rt->hook == NULL || NG_HOOK_NOT_VALID(pcb->rt->hook)) {
2596 mtx_unlock(&pcb->pcb_mtx);
2602 if (m->m_pkthdr.len > pcb->omtu) {
2604 "%s: Packet too big, len=%d, omtu=%d\n", __func__, m->m_pkthdr.len, pcb->omtu);
2606 mtx_unlock(&pcb->pcb_mtx);
2618 sbappendrecord(&pcb->so->so_snd, m);
2621 if (!(pcb->flags & NG_BTSOCKET_L2CAP_TIMO)) {
2622 error = ng_btsocket_l2cap_send2(pcb);
2624 ng_btsocket_l2cap_timeout(pcb);
2626 sbdroprecord(&pcb->so->so_snd); /* XXX */
2629 mtx_unlock(&pcb->pcb_mtx);
2642 ng_btsocket_l2cap_send2(ng_btsocket_l2cap_pcb_p pcb)
2648 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
2650 if (sbavail(&pcb->so->so_snd) == 0)
2653 m = m_dup(pcb->so->so_snd.sb_mb, M_NOWAIT);
2671 hdr->token = pcb->token;
2673 hdr->lcid = pcb->cid;
2674 hdr->idtype = pcb->idtype;
2678 hdr->token, pcb->state);
2685 NG_SEND_DATA_ONLY(error, pcb->rt->hook, m);
2697 ng_btsocket_l2cap_pcb_p pcb = so2l2cap_pcb(so);
2700 if (pcb == NULL)
2705 bcopy(&pcb->src, &sa.l2cap_bdaddr, sizeof(sa.l2cap_bdaddr));
2706 sa.l2cap_psm = htole16(pcb->psm);
2710 sa.l2cap_bdaddr_type = pcb->srctype;
2797 ng_btsocket_l2cap_timeout(ng_btsocket_l2cap_pcb_p pcb)
2799 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
2801 if (!(pcb->flags & NG_BTSOCKET_L2CAP_TIMO)) {
2802 pcb->flags |= NG_BTSOCKET_L2CAP_TIMO;
2803 callout_reset(&pcb->timo, bluetooth_l2cap_ertx_timeout(),
2804 ng_btsocket_l2cap_process_timeout, pcb);
2815 ng_btsocket_l2cap_untimeout(ng_btsocket_l2cap_pcb_p pcb)
2817 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
2819 if (pcb->flags & NG_BTSOCKET_L2CAP_TIMO) {
2820 callout_stop(&pcb->timo);
2821 pcb->flags &= ~NG_BTSOCKET_L2CAP_TIMO;
2834 ng_btsocket_l2cap_pcb_p pcb = (ng_btsocket_l2cap_pcb_p) xpcb;
2836 mtx_assert(&pcb->pcb_mtx, MA_OWNED);
2838 pcb->flags &= ~NG_BTSOCKET_L2CAP_TIMO;
2839 pcb->so->so_error = ETIMEDOUT;
2841 switch (pcb->state) {
2846 if (pcb->cid != 0)
2847 ng_btsocket_l2cap_send_l2ca_discon_req(0, pcb);
2850 pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
2851 soisdisconnected(pcb->so);
2856 sbdroprecord(&pcb->so->so_snd);
2857 sowwakeup(pcb->so);
2862 pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
2863 soisdisconnected(pcb->so);
2868 "%s: Invalid socket state=%d\n", __func__, pcb->state);