Lines Matching full:pcb

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