Home | History | Annotate | Download | only in l2cap

Lines Matching refs:p_ccb

130     tL2C_CCB    *p_ccb;
200 for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_lcb->ccb_queue.p_first_ccb)
202 l2cu_release_ccb (p_ccb);
469 void l2cu_send_peer_connect_req (tL2C_CCB *p_ccb)
475 p_ccb->p_lcb->id++;
476 l2cu_adj_id(p_ccb->p_lcb, L2CAP_ADJ_ID);
478 p_ccb->local_id = p_ccb->p_lcb->id;
480 if ((p_buf = l2cu_build_header (p_ccb->p_lcb, L2CAP_CONN_REQ_LEN, L2CAP_CMD_CONN_REQ,
481 p_ccb->local_id)) == NULL)
490 UINT16_TO_STREAM (p, p_ccb->p_rcb->real_psm);
491 UINT16_TO_STREAM (p, p_ccb->local_cid);
493 l2c_link_check_send_pkts (p_ccb->p_lcb, NULL, p_buf);
507 void l2cu_send_peer_connect_rsp (tL2C_CCB *p_ccb, UINT16 result, UINT16 status)
515 if (p_ccb->flags & CCB_FLAG_SENT_PENDING)
518 p_ccb->flags |= CCB_FLAG_SENT_PENDING;
521 if ((p_buf=l2cu_build_header(p_ccb->p_lcb, L2CAP_CONN_RSP_LEN, L2CAP_CMD_CONN_RSP, p_ccb->remote_id)) == NULL)
530 UINT16_TO_STREAM (p, p_ccb->local_cid);
531 p_ccb->remote_cid);
535 l2c_link_check_send_pkts (p_ccb->p_lcb, NULL, p_buf);
581 void l2cu_send_peer_config_req (tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg)
588 p_ccb->p_lcb->id++;
589 l2cu_adj_id(p_ccb->p_lcb, L2CAP_ADJ_ID);
591 p_ccb->local_id = p_ccb->p_lcb->id;
606 if ((p_buf = l2cu_build_header (p_ccb->p_lcb, (UINT16) (L2CAP_CONFIG_REQ_LEN + cfg_len),
607 L2CAP_CMD_CONFIG_REQ, p_ccb->local_id)) == NULL )
616 UINT16_TO_STREAM (p, p_ccb->remote_cid);
675 l2c_link_check_send_pkts (p_ccb->p_lcb, NULL, p_buf);
688 void l2cu_send_peer_config_rsp (tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg)
706 if ((p_buf = l2cu_build_header (p_ccb->p_lcb, (UINT16)(L2CAP_CONFIG_RSP_LEN + cfg_len),
707 L2CAP_CMD_CONFIG_RSP, p_ccb->remote_id)) == NULL )
715 UINT16_TO_STREAM (p, p_ccb->remote_cid);
751 UINT16_TO_STREAM (p, p_ccb->our_cfg.fcr.rtrans_tout);
752 UINT16_TO_STREAM (p, p_ccb->our_cfg.fcr.mon_tout);
768 l2c_link_check_send_pkts (p_ccb->p_lcb, NULL, p_buf);
781 void l2cu_send_peer_config_rej (tL2C_CCB *p_ccb, UINT8 *p_data, UINT16 data_len, UINT16 rej_len)
814 UINT16_TO_STREAM (p, (p_ccb->p_lcb->handle | (L2CAP_PKT_START_NON_FLUSHABLE << L2CAP_PKT_TYPE_SHIFT)));
819 UINT16_TO_STREAM (p, (p_ccb->p_lcb->handle | (L2CAP_PKT_START << L2CAP_PKT_TYPE_SHIFT)));
832 UINT8_TO_STREAM (p, p_ccb->remote_id);
836 UINT16_TO_STREAM (p, p_ccb->remote_cid);
897 l2c_link_check_send_pkts (p_ccb->p_lcb, NULL, p_buf);
910 void l2cu_send_peer_disc_req (tL2C_CCB *p_ccb)
916 p_ccb->p_lcb->id++;
917 l2cu_adj_id(p_ccb->p_lcb, L2CAP_ADJ_ID);
919 p_ccb->local_id = p_ccb->p_lcb->id;
921 if ((p_buf = l2cu_build_header(p_ccb->p_lcb, L2CAP_DISC_REQ_LEN, L2CAP_CMD_DISC_REQ, p_ccb->local_id)) == NULL)
929 UINT16_TO_STREAM (p, p_ccb->remote_cid);
930 UINT16_TO_STREAM (p, p_ccb->local_cid);
935 if (p_ccb->peer_cfg.fcr.mode == L2CAP_FCR_BASIC_MODE)
937 while (p_ccb->xmit_hold_q.p_first)
939 p_buf2 = (BT_HDR *)GKI_dequeue (&p_ccb->xmit_hold_q);
940 l2cu_set_acl_hci_header (p_buf2, p_ccb);
941 l2c_link_check_send_pkts (p_ccb->p_lcb, p_ccb, p_buf2);
945 l2c_link_check_send_pkts (p_ccb->p_lcb, NULL, p_buf);
1240 void l2cu_enqueue_ccb (tL2C_CCB *p_ccb)
1247 if (p_ccb->p_lcb != NULL)
1248 p_q = &p_ccb->p_lcb->ccb_queue;
1250 if ( (!p_ccb->in_use) || (p_q == NULL) )
1253 p_ccb->local_cid, p_ccb->in_use, p_ccb->p_lcb);
1258 p_ccb->local_cid, p_ccb->ccb_priority);
1263 p_q->p_first_ccb = p_q->p_last_ccb = p_ccb;
1264 p_ccb->p_next_ccb = p_ccb->p_prev_ccb = NULL;
1273 if (p_ccb->ccb_priority < p_ccb1->ccb_priority)
1277 p_q->p_first_ccb = p_ccb;
1279 p_ccb1->p_prev_ccb->p_next_ccb = p_ccb;
1281 p_ccb->p_next_ccb = p_ccb1;
1282 p_ccb->p_prev_ccb = p_ccb1->p_prev_ccb;
1283 p_ccb1->p_prev_ccb = p_ccb;
1294 p_q->p_last_ccb->p_next_ccb = p_ccb;
1296 p_ccb->p_next_ccb = NULL;
1297 p_ccb->p_prev_ccb = p_q->p_last_ccb;
1298 p_q->p_last_ccb = p_ccb;
1304 if (p_ccb->p_lcb != NULL)
1307 if (p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].num_ccb == 0 )
1310 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_first_ccb = p_ccb;
1312 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_serve_ccb = p_ccb;
1314 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].quota = L2CAP_GET_PRIORITY_QUOTA(p_ccb->ccb_priority);
1317 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].num_ccb++;
1332 void l2cu_dequeue_ccb (tL2C_CCB *p_ccb)
1336 L2CAP_TRACE_DEBUG ("l2cu_dequeue_ccb CID: 0x%04x", p_ccb->local_cid);
1340 if (p_ccb->p_lcb != NULL)
1341 p_q = &p_ccb->p_lcb->ccb_queue;
1343 if ( (!p_ccb->in_use) || (p_q == NULL) || (p_q->p_first_ccb == NULL) )
1346 p_ccb->local_cid, p_ccb->in_use, p_ccb->p_lcb, p_q, p_q ? p_q->p_first_ccb : 0);
1352 if (p_ccb->p_lcb != NULL)
1355 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].num_ccb--;
1358 if (p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].num_ccb == 0 )
1360 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_first_ccb = NULL;
1361 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_serve_ccb = NULL;
1366 if ( p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_first_ccb == p_ccb )
1368 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_first_ccb = p_ccb->p_next_ccb;
1371 if ( p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_serve_ccb == p_ccb )
1374 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_serve_ccb
1375 = p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_first_ccb;
1381 if (p_ccb == p_q->p_first_ccb)
1384 p_q->p_first_ccb = p_ccb->p_next_ccb;
1391 else if (p_ccb == p_q->p_last_ccb)
1394 p_q->p_last_ccb = p_ccb->p_prev_ccb;
1400 p_ccb->p_prev_ccb->p_next_ccb = p_ccb->p_next_ccb;
1401 p_ccb->p_next_ccb->p_prev_ccb = p_ccb->p_prev_ccb;
1404 p_ccb->p_next_ccb = p_ccb->p_prev_ccb = NULL;
1416 void l2cu_change_pri_ccb (tL2C_CCB *p_ccb, tL2CAP_CHNL_PRIORITY priority)
1418 if (p_ccb->ccb_priority != priority)
1421 if ( (p_ccb->p_next_ccb != NULL) || (p_ccb->p_prev_ccb != NULL) )
1426 l2cu_dequeue_ccb (p_ccb);
1428 p_ccb->ccb_priority = priority;
1429 l2cu_enqueue_ccb (p_ccb);
1436 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].num_ccb = 0;
1437 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_first_ccb = NULL;
1438 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_serve_ccb = NULL;
1440 p_ccb->ccb_priority = priority;
1442 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_first_ccb = p_ccb;
1443 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_serve_ccb = p_ccb;
1444 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].quota = L2CAP_GET_PRIORITY_QUOTA(p_ccb->ccb_priority);
1445 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].num_ccb = 1;
1464 tL2C_CCB *p_ccb;
1475 p_ccb = l2cb.p_free_ccb_first;
1476 l2cb.p_free_ccb_first = p_ccb->p_next_ccb;
1482 p_ccb = &l2cb.ccb_pool[cid - L2CAP_BASE_APPL_CID];
1484 if (p_ccb == l2cb.p_free_ccb_first)
1485 l2cb.p_free_ccb_first = p_ccb->p_next_ccb;
1490 if (p_prev->p_next_ccb == p_ccb)
1492 p_prev->p_next_ccb = p_ccb->p_next_ccb;
1494 if (p_ccb == l2cb.p_free_ccb_last)
1508 p_ccb->p_next_ccb = p_ccb->p_prev_ccb = NULL;
1510 p_ccb->in_use = TRUE;
1513 p_ccb->local_cid = L2CAP_BASE_APPL_CID + (UINT16)(p_ccb - l2cb.ccb_pool);
1515 p_ccb->p_lcb = p_lcb;
1516 p_ccb->p_rcb = NULL;
1519 p_ccb->ccb_priority = L2CAP_CHNL_PRIORITY_LOW;
1522 l2cu_enqueue_ccb (p_ccb);
1525 p_ccb->peer_cfg_bits = 0;
1528 memset (&p_ccb->our_cfg, 0, sizeof(tL2CAP_CFG_INFO));
1529 memset (&p_ccb->peer_cfg, 0, sizeof(tL2CAP_CFG_INFO));
1532 p_ccb->our_cfg.flush_to = p_ccb->peer_cfg.flush_to = L2CAP_DEFAULT_FLUSH_TO;
1533 p_ccb->our_cfg.mtu = p_ccb->peer_cfg.mtu = L2CAP_DEFAULT_MTU;
1534 p_ccb->our_cfg.qos.service_type = p_ccb->peer_cfg.qos.service_type = L2CAP_DEFAULT_SERV_TYPE;
1535 p_ccb->our_cfg.qos.token_rate = p_ccb->peer_cfg.qos.token_rate = L2CAP_DEFAULT_TOKEN_RATE;
1536 p_ccb->our_cfg.qos.token_bucket_size = p_ccb->peer_cfg.qos.token_bucket_size = L2CAP_DEFAULT_BUCKET_SIZE;
1537 p_ccb->our_cfg.qos.peak_bandwidth = p_ccb->peer_cfg.qos.peak_bandwidth = L2CAP_DEFAULT_PEAK_BANDWIDTH;
1538 p_ccb->our_cfg.qos.latency = p_ccb->peer_cfg.qos.latency = L2CAP_DEFAULT_LATENCY;
1539 p_ccb->our_cfg.qos.delay_variation = p_ccb->peer_cfg.qos.delay_variation = L2CAP_DEFAULT_DELAY;
1541 p_ccb->bypass_fcs = 0;
1542 memset (&p_ccb->ertm_info, 0, sizeof(tL2CAP_ERTM_INFO));
1543 p_ccb->peer_cfg_already_rejected = FALSE;
1544 p_ccb->fcr_cfg_tries = L2CAP_MAX_FCR_CFG_TRIES;
1545 p_ccb->fcrb.ack_timer.param = (TIMER_PARAM_TYPE)p_ccb;
1548 if (p_ccb->fcrb.ack_timer.in_use)
1549 btu_stop_quick_timer (&p_ccb->fcrb.ack_timer);
1551 p_ccb->fcrb.mon_retrans_timer.param = (TIMER_PARAM_TYPE)p_ccb;
1557 if (p_ccb->fcrb.mon_retrans_timer.in_use)
1558 btu_stop_quick_timer (&p_ccb->fcrb.mon_retrans_timer);
1561 l2c_fcr_stop_timer (p_ccb);
1563 p_ccb->ertm_info.preferred_mode = L2CAP_FCR_BASIC_MODE; /* Default mode for channel is basic mode */
1564 p_ccb->ertm_info.allowed_modes = L2CAP_FCR_CHAN_OPT_BASIC; /* Default mode for channel is basic mode */
1565 p_ccb->ertm_info.fcr_rx_pool_id = L2CAP_FCR_RX_POOL_ID;
1566 p_ccb->ertm_info.fcr_tx_pool_id = L2CAP_FCR_TX_POOL_ID;
1567 p_ccb->ertm_info.user_rx_pool_id = HCI_ACL_POOL_ID;
1568 p_ccb->ertm_info.user_tx_pool_id = HCI_ACL_POOL_ID;
1569 p_ccb->max_rx_mtu = L2CAP_MTU_SIZE;
1570 p_ccb->tx_mps = GKI_get_pool_bufsize(HCI_ACL_POOL_ID) - 32;
1572 GKI_init_q (&p_ccb->xmit_hold_q);
1574 p_ccb->cong_sent = FALSE;
1575 p_ccb->buff_quota = 2; /* This gets set after config */
1579 p_ccb->config_done = 0;
1582 L2CAP_TRACE_DEBUG ("l2cu_allocate_ccb: cid 0x%04x config_done:0x%x", cid, p_ccb->config_done);
1585 p_ccb->chnl_state = CST_CLOSED;
1586 p_ccb->flags = 0;
1587 p_ccb->tx_data_rate = L2CAP_CHNL_DATA_RATE_LOW;
1588 p_ccb->rx_data_rate = L2CAP_CHNL_DATA_RATE_LOW;
1591 p_ccb->is_flushable = FALSE;
1594 p_ccb->timer_entry.param = (TIMER_PARAM_TYPE)p_ccb;
1595 p_ccb->timer_entry.in_use = 0;
1599 return (p_ccb);
1667 void l2cu_release_ccb (tL2C_CCB *p_ccb)
1669 tL2C_LCB *p_lcb = p_ccb->p_lcb;
1670 tL2C_RCB *p_rcb = p_ccb->p_rcb;
1672 L2CAP_TRACE_DEBUG ("l2cu_release_ccb: cid 0x%04x in_use: %u", p_ccb->local_cid, p_ccb->in_use);
1675 if (!p_ccb->in_use)
1686 btu_stop_timer (&p_ccb->timer_entry);
1688 while (p_ccb->xmit_hold_q.p_first)
1689 GKI_freebuf (GKI_dequeue (&p_ccb->xmit_hold_q));
1691 l2c_fcr_cleanup (p_ccb);
1695 ( (p_ccb->local_cid >= L2CAP_BASE_APPL_CID)
1697 ||(p_ccb->local_cid == L2CAP_CONNECTIONLESS_CID)
1702 l2cu_dequeue_ccb (p_ccb);
1705 p_ccb->p_lcb = NULL;
1711 l2cb.p_free_ccb_first = p_ccb;
1712 l2cb.p_free_ccb_last = p_ccb;
1713 p_ccb->p_next_ccb = NULL;
1714 p_ccb->p_prev_ccb = NULL;
1718 p_ccb->p_next_ccb = NULL;
1719 p_ccb->p_prev_ccb = l2cb.p_free_ccb_last;
1720 l2cb.p_free_ccb_last->p_next_ccb = p_ccb;
1721 l2cb.p_free_ccb_last = p_ccb;
1725 p_ccb->in_use = FALSE;
1754 tL2C_CCB *p_ccb;
1763 for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_ccb->p_next_ccb)
1764 if ((p_ccb->in_use) && (p_ccb->remote_cid == remote_cid))
1765 return (p_ccb);
1829 void l2cu_disconnect_chnl (tL2C_CCB *p_ccb)
1831 UINT16 local_cid = p_ccb->local_cid;
1835 tL2CA_DISCONNECT_IND_CB *p_disc_cb = p_ccb->p_rcb->api.pL2CA_DisconnectInd_Cb;
1839 l2cu_send_peer_disc_req (p_ccb);
1841 l2cu_release_ccb (p_ccb);
1898 UINT8 l2cu_process_peer_cfg_req (tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg)
1921 p_ccb->peer_cfg.mtu = p_cfg->mtu;
1922 p_ccb->peer_cfg.mtu_present = TRUE;
1923 p_ccb->peer_cfg_bits |= L2CAP_CH_CFG_MASK_MTU;
1932 else if (p_ccb->peer_cfg.mtu_present)
1935 p_cfg->mtu = p_ccb->peer_cfg.mtu;
1948 p_ccb->peer_cfg.flush_to_present = TRUE;
1949 p_ccb->peer_cfg.flush_to = p_cfg->flush_to;
1950 p_ccb->peer_cfg_bits |= L2CAP_CH_CFG_MASK_FLUSH_TO;
1954 else if (p_ccb->peer_cfg.flush_to_present)
1957 p_cfg->flush_to = p_ccb->peer_cfg.flush_to;
1968 p_ccb->peer_cfg.qos = p_cfg->qos;
1969 p_ccb->peer_cfg.qos_present = TRUE;
1970 p_ccb->peer_cfg_bits |= L2CAP_CH_CFG_MASK_QOS;
1979 else if (p_ccb->peer_cfg.qos_present)
1982 p_cfg->qos = p_ccb->peer_cfg.qos;
1985 if ((fcr_status = l2c_fcr_process_peer_cfg_req (p_ccb, p_cfg)) == L2CAP_PEER_CFG_DISCONNECT)
1999 l2cu_adjust_out_mps (p_ccb);
2031 void l2cu_process_peer_cfg_rsp (tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg)
2034 if ( (p_cfg->qos_present) && (p_ccb->our_cfg.qos_present) )
2035 p_ccb->our_cfg.qos = p_cfg->qos;
2042 p_ccb->peer_cfg.fcr.rtrans_tout = p_cfg->fcr.rtrans_tout;
2043 p_ccb->peer_cfg.fcr.mon_tout = p_cfg->fcr.mon_tout;
2047 if (p_cfg->fcr.tx_win_sz < p_ccb->our_cfg.fcr.tx_win_sz)
2048 p_ccb->fcrb.max_held_acks = p_cfg->fcr.tx_win_sz / 3;
2050 p_ccb->fcrb.max_held_acks = p_ccb->our_cfg.fcr.tx_win_sz / 3;
2053 p_cfg->fcr.tx_win_sz, p_ccb->our_cfg.fcr.tx_win_sz, p_ccb->fcrb.max_held_acks);
2068 void l2cu_process_our_cfg_req (tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg)
2076 p_ccb->our_cfg.qos_present = TRUE;
2077 p_ccb->our_cfg.qos = p_cfg->qos;
2097 p_ccb->fcrb.max_held_acks = p_cfg->fcr.tx_win_sz / 3;
2100 if (p_ccb->p_lcb->peer_ext_fea & L2CAP_EXTFEA_NO_CRC)
2104 p_ccb->bypass_fcs |= L2CAP_CFG_FCS_OUR;
2114 p_ccb->our_cfg.fcr.mode = p_cfg->fcr.mode;
2115 p_ccb->our_cfg.fcr_present = p_cfg->fcr_present;
2130 p_ccb->our_cfg.flush_to = p_cfg->flush_to;
2131 p_lcb = p_ccb->p_lcb;
2161 void l2cu_process_our_cfg_rsp (tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg)
2164 if ( (p_cfg->qos_present) && (p_ccb->peer_cfg.qos_present) )
2165 p_ccb->peer_cfg.qos = p_cfg->qos;
2169 l2c_fcr_adj_our_rsp_options (p_ccb, p_cfg);
2449 tL2C_CCB *p_ccb;
2468 p_ccb = p_lcb->ccb_queue.p_first_ccb;
2470 if ((p_ccb->in_use) &&
2471 ((p_ccb->chnl_state == CST_W4_L2CAP_DISCONNECT_RSP) ||
2472 (p_ccb->chnl_state == CST_W4_L2CA_DISCONNECT_RSP)))
2571 tL2C_CCB *p_ccb;
2586 for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_next_ccb)
2588 p_next_ccb = p_ccb->p_next_ccb;
2589 l2c_csm_execute (p_ccb, L2CEVT_SEC_RE_SEND_CMD, NULL);
2605 for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_next_ccb)
2607 p_next_ccb = p_ccb->p_next_ccb;
2608 l2c_csm_execute (p_ccb, L2CEVT_SEC_RE_SEND_CMD, NULL);
2641 void l2cu_adjust_out_mps (tL2C_CCB *p_ccb)
2646 packet_size = btm_get_max_packet_size (p_ccb->p_lcb->remote_bd_addr);
2651 L2CAP_TRACE_ERROR ("l2cu_adjust_out_mps bad packet size: %u will use MPS: %u", packet_size, p_ccb->peer_cfg.fcr.mps);
2652 p_ccb->tx_mps = p_ccb->peer_cfg.fcr.mps;
2666 if (p_ccb->peer_cfg.fcr.mps >= packet_size)
2667 p_ccb->tx_mps = p_ccb->peer_cfg.fcr.mps / packet_size * packet_size;
2669 p_ccb->tx_mps = p_ccb->peer_cfg.fcr.mps;
2672 p_ccb->tx_mps, p_ccb->peer_cfg.fcr.mps, packet_size);
2689 tL2C_CCB *p_ccb;
2695 if ((p_ccb = l2cu_allocate_ccb (NULL, 0)) == NULL)
2701 p_ccb->local_cid = fixed_cid;
2702 p_ccb->remote_cid = fixed_cid;
2704 GKI_init_q (&p_ccb->xmit_hold_q);
2706 p_ccb->is_flushable = FALSE;
2708 p_ccb->timer_entry.param = (TIMER_PARAM_TYPE)p_ccb;
2714 p_ccb->our_cfg.fcr = p_ccb->peer_cfg.fcr = *p_fcr;
2716 p_ccb->ertm_info.fcr_rx_pool_id = HCI_ACL_POOL_ID;
2717 p_ccb->ertm_info.fcr_tx_pool_id = HCI_ACL_POOL_ID;
2718 p_ccb->ertm_info.user_rx_pool_id = HCI_ACL_POOL_ID;
2719 p_ccb->ertm_info.user_tx_pool_id = HCI_ACL_POOL_ID;
2721 p_ccb->fcrb.max_held_acks = p_fcr->tx_win_sz / 3;
2725 p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL] = p_ccb;
2726 p_ccb->p_lcb = p_lcb;
2730 p_ccb->chnl_state = CST_OPEN;
2733 p_ccb->fixed_chnl_idle_tout = l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].default_idle_tout;
3028 tL2C_CCB *p_ccb = NULL;
3041 p_ccb = l2cb.ccb_pool + local_cid;
3044 if (!p_ccb->in_use)
3046 p_ccb = NULL;
3049 else if (p_lcb && p_lcb != p_ccb->p_lcb)
3051 p_ccb = NULL;
3058 p_ccb = l2cb.ccb_pool;
3061 if ((p_ccb->local_cid == local_cid)
3062 &&(p_ccb->in_use)
3063 &&(p_lcb == p_ccb->p_lcb))
3066 p_ccb++;
3073 return (p_ccb);
3091 tL2C_CCB *p_ccb;
3102 p_ccb = p_lcb->rr_serv[p_lcb->rr_pri].p_serve_ccb;
3104 if (!p_ccb)
3111 p_ccb->ccb_priority, p_ccb->local_cid, p_ccb->xmit_hold_q.count );
3115 if (( p_ccb->p_next_ccb == NULL )
3116 ||( p_ccb->p_next_ccb->ccb_priority != p_ccb->ccb_priority ))
3124 p_lcb->rr_serv[p_lcb->rr_pri].p_serve_ccb = p_ccb->p_next_ccb;
3127 if (p_ccb->chnl_state != CST_OPEN)
3131 if (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_BASIC_MODE)
3133 if (p_ccb->fcrb.wait_ack || p_ccb->fcrb.remote_busy)
3136 if ( p_ccb->fcrb.retrans_q.count == 0 )
3138 if ( p_ccb->xmit_hold_q.count == 0 )
3142 if ( (p_ccb->ertm_info.fcr_tx_pool_id == HCI_ACL_POOL_ID) && (GKI_poolutilization (HCI_ACL_POOL_ID) > 90) )
3146 if ( (p_ccb->peer_cfg.fcr.mode == L2CAP_FCR_ERTM_MODE) && (l2c_fcr_is_flow_controlled (p_ccb)) )
3152 if (p_ccb->xmit_hold_q.count == 0)
3157 p_serve_ccb = p_ccb;
3197 tL2C_CCB *p_ccb;
3201 for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_ccb->p_next_ccb)
3203 if (p_ccb->chnl_state != CST_OPEN)
3206 if (p_ccb->fcrb.wait_ack || p_ccb->fcrb.remote_busy)
3209 if (p_ccb->fcrb.retrans_q.count != 0)
3210 return p_ccb;
3212 if (p_ccb->xmit_hold_q.count == 0)
3216 if ( (p_ccb->ertm_info.fcr_tx_pool_id == HCI_ACL_POOL_ID) && (GKI_poolutilization (HCI_ACL_POOL_ID) > 90) )
3220 if ( (p_ccb->peer_cfg.fcr.mode == L2CAP_FCR_ERTM_MODE) && (l2c_fcr_is_flow_controlled (p_ccb)) )
3224 return p_ccb;
3243 tL2C_CCB *p_ccb;
3252 if ((p_ccb = p_lcb->p_fixed_ccbs[xx]) == NULL)
3256 if (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_BASIC_MODE)
3258 if (p_ccb->fcrb.wait_ack || p_ccb->fcrb.remote_busy)
3262 if (p_ccb->fcrb.retrans_q.count == 0)
3264 if (p_ccb->xmit_hold_q.count == 0)
3268 if ( (p_ccb->ertm_info.fcr_tx_pool_id == HCI_ACL_POOL_ID) && (GKI_poolutilization (HCI_ACL_POOL_ID) > 90) )
3272 if ( (p_ccb->peer_cfg.fcr.mode == L2CAP_FCR_ERTM_MODE) && (l2c_fcr_is_flow_controlled (p_ccb)) )
3276 if ((p_buf = l2c_fcr_get_next_xmit_sdu_seg(p_ccb, 0)) != NULL)
3278 l2cu_check_channel_congestion (p_ccb);
3279 l2cu_set_acl_hci_header (p_buf, p_ccb);
3285 if (p_ccb->xmit_hold_q.count != 0)
3287 p_buf = (BT_HDR *)GKI_dequeue (&p_ccb->xmit_hold_q);
3293 l2cu_check_channel_congestion (p_ccb);
3294 l2cu_set_acl_hci_header (p_buf, p_ccb);
3303 p_ccb = l2cu_get_next_channel_in_rr( p_lcb );
3305 p_ccb = l2cu_get_next_channel( p_lcb );
3309 if (p_ccb == NULL)
3312 if (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_BASIC_MODE)
3314 if ((p_buf = l2c_fcr_get_next_xmit_sdu_seg(p_ccb, 0)) == NULL)
3319 p_buf = (BT_HDR *)GKI_dequeue (&p_ccb->xmit_hold_q);
3327 if ( p_ccb->p_rcb && p_ccb->p_rcb->api.pL2CA_TxComplete_Cb && (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_ERTM_MODE) )
3328 (*p_ccb->p_rcb->api.pL2CA_TxComplete_Cb)(p_ccb->local_cid, 1);
3331 l2cu_check_channel_congestion (p_ccb);
3333 l2cu_set_acl_hci_header (p_buf, p_ccb);
3347 void l2cu_set_acl_hci_header (BT_HDR *p_buf, tL2C_CCB *p_ccb)
3355 if (p_ccb->p_lcb->transport == BT_TRANSPORT_LE)
3357 UINT16_TO_STREAM (p, p_ccb->p_lcb->handle | (L2CAP_PKT_START_NON_FLUSHABLE << L2CAP_PKT_TYPE_SHIFT));
3373 if ( (((p_buf->layer_specific & L2CAP_FLUSHABLE_MASK) == L2CAP_FLUSHABLE_CH_BASED) && (p_ccb->is_flushable))
3376 UINT16_TO_STREAM (p, p_ccb->p_lcb->handle | (L2CAP_PKT_START << L2CAP_PKT_TYPE_SHIFT));
3380 UINT16_TO_STREAM (p, p_ccb->p_lcb->handle | l2cb.non_flushable_pbf);
3383 UINT16_TO_STREAM (p, p_ccb->p_lcb->handle | (L2CAP_PKT_START << L2CAP_PKT_TYPE_SHIFT));
3409 void l2cu_check_channel_congestion (tL2C_CCB *p_ccb)
3411 UINT16 q_count = p_ccb->xmit_hold_q.count;
3414 if ( p_ccb->local_cid == L2CAP_CONNECTIONLESS_CID )
3416 p_ccb->p_lcb->ucd_out_sec_pending_q.count;
3423 if (p_ccb->buff_quota != 0)
3426 if ( p_ccb->cong_sent )
3429 if (q_count <= (p_ccb->buff_quota / 2))
3431 p_ccb->cong_sent = FALSE;
3432 if (p_ccb->p_rcb && p_ccb->p_rcb->api.pL2CA_CongestionStatus_Cb)
3435 p_ccb->local_cid, q_count, p_ccb->buff_quota);
3439 (*p_ccb->p_rcb->api.pL2CA_CongestionStatus_Cb)(p_ccb->local_cid, FALSE);
3443 else if ( p_ccb->p_rcb && p_ccb->local_cid == L2CAP_CONNECTIONLESS_CID )
3445 if ( p_ccb->p_rcb->ucd.cb_info.pL2CA_UCD_Congestion_Status_Cb )
3448 p_ccb->p_lcb->ucd_out_sec_pending_q.count,
3449 p_ccb->xmit_hold_q.count, p_ccb->buff_quota);
3450 p_ccb->p_rcb->ucd.cb_info.pL2CA_UCD_Congestion_Status_Cb( p_ccb->p_lcb->remote_bd_addr, FALSE );
3460 if (p_ccb->p_lcb->p_fixed_ccbs[xx] == p_ccb)
3463 (* l2cb.fixed_reg[xx].pL2CA_FixedCong_Cb)(p_ccb->p_lcb->remote_bd_addr, FALSE);
3474 if (q_count > p_ccb->buff_quota)
3476 p_ccb->cong_sent = TRUE;
3477 if (p_ccb->p_rcb && p_ccb->p_rcb->api.pL2CA_CongestionStatus_Cb)
3480 p_ccb->local_cid, q_count, p_ccb->buff_quota);
3482 (*p_ccb->p_rcb->api.pL2CA_CongestionStatus_Cb)(p_ccb->local_cid, TRUE);
3485 else if ( p_ccb->p_rcb && p_ccb->local_cid == L2CAP_CONNECTIONLESS_CID )
3487 if ( p_ccb->p_rcb->ucd.cb_info.pL2CA_UCD_Congestion_Status_Cb )
3490 p_ccb->p_lcb->ucd_out_sec_pending_q.count,
3491 p_ccb->xmit_hold_q.count, p_ccb->buff_quota);
3492 p_ccb->p_rcb->ucd.cb_info.pL2CA_UCD_Congestion_Status_Cb( p_ccb->p_lcb->remote_bd_addr, TRUE );
3502 if (p_ccb->p_lcb->p_fixed_ccbs[xx] == p_ccb)
3505 (* l2cb.fixed_reg[xx].pL2CA_FixedCong_Cb)(p_ccb->p_lcb->remote_bd_addr, TRUE);