Lines Matching full:p_ccb
118 tL2C_CCB *p_ccb;
186 for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_lcb->ccb_queue.p_first_ccb)
188 l2cu_release_ccb (p_ccb);
405 void l2cu_send_peer_connect_req (tL2C_CCB *p_ccb)
411 p_ccb->p_lcb->id++;
412 l2cu_adj_id(p_ccb->p_lcb, L2CAP_ADJ_ID);
414 p_ccb->local_id = p_ccb->p_lcb->id;
416 if ((p_buf = l2cu_build_header (p_ccb->p_lcb, L2CAP_CONN_REQ_LEN, L2CAP_CMD_CONN_REQ,
417 p_ccb->local_id)) == NULL)
426 UINT16_TO_STREAM (p, p_ccb->p_rcb->real_psm);
427 UINT16_TO_STREAM (p, p_ccb->local_cid);
429 l2c_link_check_send_pkts (p_ccb->p_lcb, NULL, p_buf);
443 void l2cu_send_peer_connect_rsp (tL2C_CCB *p_ccb, UINT16 result, UINT16 status)
451 if (p_ccb->flags & CCB_FLAG_SENT_PENDING)
454 p_ccb->flags |= CCB_FLAG_SENT_PENDING;
457 if ((p_buf=l2cu_build_header(p_ccb->p_lcb, L2CAP_CONN_RSP_LEN, L2CAP_CMD_CONN_RSP, p_ccb->remote_id)) == NULL)
466 UINT16_TO_STREAM (p, p_ccb->local_cid);
467 UINT16_TO_STREAM (p, p_ccb->remote_cid);
471 l2c_link_check_send_pkts (p_ccb->p_lcb, NULL, p_buf);
517 void l2cu_send_peer_config_req (tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg)
524 p_ccb->p_lcb->id++;
525 l2cu_adj_id(p_ccb->p_lcb, L2CAP_ADJ_ID);
527 p_ccb->local_id = p_ccb->p_lcb->id;
542 if ((p_buf = l2cu_build_header (p_ccb->p_lcb, (UINT16) (L2CAP_CONFIG_REQ_LEN + cfg_len),
543 L2CAP_CMD_CONFIG_REQ, p_ccb->local_id)) == NULL )
552 UINT16_TO_STREAM (p, p_ccb->remote_cid);
611 l2c_link_check_send_pkts (p_ccb->p_lcb, NULL, p_buf);
624 void l2cu_send_peer_config_rsp (tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg)
642 if ((p_buf = l2cu_build_header (p_ccb->p_lcb, (UINT16)(L2CAP_CONFIG_RSP_LEN + cfg_len),
643 L2CAP_CMD_CONFIG_RSP, p_ccb->remote_id)) == NULL )
651 UINT16_TO_STREAM (p, p_ccb->remote_cid);
687 UINT16_TO_STREAM (p, p_ccb->our_cfg.fcr.rtrans_tout);
688 UINT16_TO_STREAM (p, p_ccb->our_cfg.fcr.mon_tout);
704 l2c_link_check_send_pkts (p_ccb->p_lcb, NULL, p_buf);
717 void l2cu_send_peer_config_rej (tL2C_CCB *p_ccb, UINT8 *p_data, UINT16 data_len, UINT16 rej_len)
737 UINT16_TO_STREAM (p, (p_ccb->p_lcb->handle | (L2CAP_PKT_START_NON_FLUSHABLE << L2CAP_PKT_TYPE_SHIFT)));
742 UINT16_TO_STREAM (p, (p_ccb->p_lcb->handle | (L2CAP_PKT_START << L2CAP_PKT_TYPE_SHIFT)));
755 UINT8_TO_STREAM (p, p_ccb->remote_id);
759 UINT16_TO_STREAM (p, p_ccb->remote_cid);
805 l2c_link_check_send_pkts (p_ccb->p_lcb, NULL, p_buf);
818 void l2cu_send_peer_disc_req (tL2C_CCB *p_ccb)
824 p_ccb->p_lcb->id++;
825 l2cu_adj_id(p_ccb->p_lcb, L2CAP_ADJ_ID);
827 p_ccb->local_id = p_ccb->p_lcb->id;
829 if ((p_buf = l2cu_build_header(p_ccb->p_lcb, L2CAP_DISC_REQ_LEN, L2CAP_CMD_DISC_REQ, p_ccb->local_id)) == NULL)
837 UINT16_TO_STREAM (p, p_ccb->remote_cid);
838 UINT16_TO_STREAM (p, p_ccb->local_cid);
843 if (p_ccb->peer_cfg.fcr.mode == L2CAP_FCR_BASIC_MODE)
845 while (p_ccb->xmit_hold_q.p_first)
847 p_buf2 = (BT_HDR *)GKI_dequeue (&p_ccb->xmit_hold_q);
848 l2cu_set_acl_hci_header (p_buf2, p_ccb);
849 l2c_link_check_send_pkts (p_ccb->p_lcb, p_ccb, p_buf2);
853 l2c_link_check_send_pkts (p_ccb->p_lcb, NULL, p_buf);
1133 void l2cu_enqueue_ccb (tL2C_CCB *p_ccb)
1140 if (p_ccb->p_lcb != NULL)
1141 p_q = &p_ccb->p_lcb->ccb_queue;
1143 if ( (!p_ccb->in_use) || (p_q == NULL) )
1146 p_ccb->local_cid, p_ccb->in_use, p_ccb->p_lcb);
1151 p_ccb->local_cid, p_ccb->ccb_priority);
1156 p_q->p_first_ccb = p_q->p_last_ccb = p_ccb;
1157 p_ccb->p_next_ccb = p_ccb->p_prev_ccb = NULL;
1166 if (p_ccb->ccb_priority < p_ccb1->ccb_priority)
1170 p_q->p_first_ccb = p_ccb;
1172 p_ccb1->p_prev_ccb->p_next_ccb = p_ccb;
1174 p_ccb->p_next_ccb = p_ccb1;
1175 p_ccb->p_prev_ccb = p_ccb1->p_prev_ccb;
1176 p_ccb1->p_prev_ccb = p_ccb;
1187 p_q->p_last_ccb->p_next_ccb = p_ccb;
1189 p_ccb->p_next_ccb = NULL;
1190 p_ccb->p_prev_ccb = p_q->p_last_ccb;
1191 p_q->p_last_ccb = p_ccb;
1197 if (p_ccb->p_lcb != NULL)
1200 if (p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].num_ccb == 0 )
1203 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_first_ccb = p_ccb;
1205 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_serve_ccb = p_ccb;
1207 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].quota = L2CAP_GET_PRIORITY_QUOTA(p_ccb->ccb_priority);
1210 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].num_ccb++;
1225 void l2cu_dequeue_ccb (tL2C_CCB *p_ccb)
1229 L2CAP_TRACE_DEBUG1 ("l2cu_dequeue_ccb CID: 0x%04x", p_ccb->local_cid);
1233 if (p_ccb->p_lcb != NULL)
1234 p_q = &p_ccb->p_lcb->ccb_queue;
1236 if ( (!p_ccb->in_use) || (p_q == NULL) || (p_q->p_first_ccb == NULL) )
1239 p_ccb->local_cid, p_ccb->in_use, p_ccb->p_lcb, p_q, p_q ? p_q->p_first_ccb : 0);
1245 if (p_ccb->p_lcb != NULL)
1248 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].num_ccb--;
1251 if (p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].num_ccb == 0 )
1253 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_first_ccb = NULL;
1254 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_serve_ccb = NULL;
1259 if ( p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_first_ccb == p_ccb )
1261 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_first_ccb = p_ccb->p_next_ccb;
1264 if ( p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_serve_ccb == p_ccb )
1267 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_serve_ccb
1268 = p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_first_ccb;
1274 if (p_ccb == p_q->p_first_ccb)
1277 p_q->p_first_ccb = p_ccb->p_next_ccb;
1284 else if (p_ccb == p_q->p_last_ccb)
1287 p_q->p_last_ccb = p_ccb->p_prev_ccb;
1293 p_ccb->p_prev_ccb->p_next_ccb = p_ccb->p_next_ccb;
1294 p_ccb->p_next_ccb->p_prev_ccb = p_ccb->p_prev_ccb;
1297 p_ccb->p_next_ccb = p_ccb->p_prev_ccb = NULL;
1309 void l2cu_change_pri_ccb (tL2C_CCB *p_ccb, tL2CAP_CHNL_PRIORITY priority)
1311 if (p_ccb->ccb_priority != priority)
1314 if ( (p_ccb->p_next_ccb != NULL) || (p_ccb->p_prev_ccb != NULL) )
1319 l2cu_dequeue_ccb (p_ccb);
1321 p_ccb->ccb_priority = priority;
1322 l2cu_enqueue_ccb (p_ccb);
1329 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].num_ccb = 0;
1330 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_first_ccb = NULL;
1331 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_serve_ccb = NULL;
1333 p_ccb->ccb_priority = priority;
1335 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_first_ccb = p_ccb;
1336 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_serve_ccb = p_ccb;
1337 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].quota = L2CAP_GET_PRIORITY_QUOTA(p_ccb->ccb_priority);
1338 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].num_ccb = 1;
1357 tL2C_CCB *p_ccb;
1368 p_ccb = l2cb.p_free_ccb_first;
1369 l2cb.p_free_ccb_first = p_ccb->p_next_ccb;
1375 p_ccb = &l2cb.ccb_pool[cid - L2CAP_BASE_APPL_CID];
1377 if (p_ccb == l2cb.p_free_ccb_first)
1378 l2cb.p_free_ccb_first = p_ccb->p_next_ccb;
1383 if (p_prev->p_next_ccb == p_ccb)
1385 p_prev->p_next_ccb = p_ccb->p_next_ccb;
1387 if (p_ccb == l2cb.p_free_ccb_last)
1401 p_ccb->p_next_ccb = p_ccb->p_prev_ccb = NULL;
1403 p_ccb->in_use = TRUE;
1406 p_ccb->local_cid = L2CAP_BASE_APPL_CID + (UINT16)(p_ccb - l2cb.ccb_pool);
1408 p_ccb->p_lcb = p_lcb;
1409 p_ccb->p_rcb = NULL;
1412 p_ccb->ccb_priority = L2CAP_CHNL_PRIORITY_LOW;
1415 l2cu_enqueue_ccb (p_ccb);
1418 p_ccb->peer_cfg_bits = 0;
1421 memset (&p_ccb->our_cfg, 0, sizeof(tL2CAP_CFG_INFO));
1422 memset (&p_ccb->peer_cfg, 0, sizeof(tL2CAP_CFG_INFO));
1425 p_ccb->our_cfg.flush_to = p_ccb->peer_cfg.flush_to = L2CAP_DEFAULT_FLUSH_TO;
1426 p_ccb->our_cfg.mtu = p_ccb->peer_cfg.mtu = L2CAP_DEFAULT_MTU;
1427 p_ccb->our_cfg.qos.service_type = p_ccb->peer_cfg.qos.service_type = L2CAP_DEFAULT_SERV_TYPE;
1428 p_ccb->our_cfg.qos.token_rate = p_ccb->peer_cfg.qos.token_rate = L2CAP_DEFAULT_TOKEN_RATE;
1429 p_ccb->our_cfg.qos.token_bucket_size = p_ccb->peer_cfg.qos.token_bucket_size = L2CAP_DEFAULT_BUCKET_SIZE;
1430 p_ccb->our_cfg.qos.peak_bandwidth = p_ccb->peer_cfg.qos.peak_bandwidth = L2CAP_DEFAULT_PEAK_BANDWIDTH;
1431 p_ccb->our_cfg.qos.latency = p_ccb->peer_cfg.qos.latency = L2CAP_DEFAULT_LATENCY;
1432 p_ccb->our_cfg.qos.delay_variation = p_ccb->peer_cfg.qos.delay_variation = L2CAP_DEFAULT_DELAY;
1434 p_ccb->bypass_fcs = 0;
1435 memset (&p_ccb->ertm_info, 0, sizeof(tL2CAP_ERTM_INFO));
1436 p_ccb->peer_cfg_already_rejected = FALSE;
1437 p_ccb->fcr_cfg_tries = L2CAP_MAX_FCR_CFG_TRIES;
1438 p_ccb->fcrb.ack_timer.param = (TIMER_PARAM_TYPE)p_ccb;
1441 if (p_ccb->fcrb.ack_timer.in_use)
1442 btu_stop_quick_timer (&p_ccb->fcrb.ack_timer);
1444 p_ccb->fcrb.mon_retrans_timer.param = (TIMER_PARAM_TYPE)p_ccb;
1450 if (p_ccb->fcrb.mon_retrans_timer.in_use)
1451 btu_stop_quick_timer (&p_ccb->fcrb.mon_retrans_timer);
1454 l2c_fcr_stop_timer (p_ccb);
1456 p_ccb->ertm_info.preferred_mode = L2CAP_FCR_BASIC_MODE; /* Default mode for channel is basic mode */
1457 p_ccb->ertm_info.allowed_modes = L2CAP_FCR_CHAN_OPT_BASIC; /* Default mode for channel is basic mode */
1458 p_ccb->ertm_info.fcr_rx_pool_id = L2CAP_FCR_RX_POOL_ID;
1459 p_ccb->ertm_info.fcr_tx_pool_id = L2CAP_FCR_TX_POOL_ID;
1460 p_ccb->ertm_info.user_rx_pool_id = HCI_ACL_POOL_ID;
1461 p_ccb->ertm_info.user_tx_pool_id = HCI_ACL_POOL_ID;
1462 p_ccb->max_rx_mtu = L2CAP_MTU_SIZE;
1463 p_ccb->tx_mps = GKI_get_pool_bufsize(HCI_ACL_POOL_ID) - 32;
1465 GKI_init_q (&p_ccb->xmit_hold_q);
1467 p_ccb->cong_sent = FALSE;
1468 p_ccb->buff_quota = 2; /* This gets set after config */
1472 p_ccb->config_done = 0;
1475 L2CAP_TRACE_DEBUG2 ("l2cu_allocate_ccb: cid 0x%04x config_done:0x%x", cid, p_ccb->config_done);
1478 p_ccb->chnl_state = CST_CLOSED;
1479 p_ccb->flags = 0;
1480 p_ccb->tx_data_rate = L2CAP_CHNL_DATA_RATE_LOW;
1481 p_ccb->rx_data_rate = L2CAP_CHNL_DATA_RATE_LOW;
1484 p_ccb->is_flushable = FALSE;
1487 p_ccb->timer_entry.param = (TIMER_PARAM_TYPE)p_ccb;
1488 p_ccb->timer_entry.in_use = 0;
1492 return (p_ccb);
1560 void l2cu_release_ccb (tL2C_CCB *p_ccb)
1562 tL2C_LCB *p_lcb = p_ccb->p_lcb;
1563 tL2C_RCB *p_rcb = p_ccb->p_rcb;
1565 L2CAP_TRACE_DEBUG2 ("l2cu_release_ccb: cid 0x%04x in_use: %u", p_ccb->local_cid, p_ccb->in_use);
1568 if (!p_ccb->in_use)
1579 btu_stop_timer (&p_ccb->timer_entry);
1581 while (p_ccb->xmit_hold_q.p_first)
1582 GKI_freebuf (GKI_dequeue (&p_ccb->xmit_hold_q));
1584 l2c_fcr_cleanup (p_ccb);
1588 ( (p_ccb->local_cid >= L2CAP_BASE_APPL_CID)
1590 ||(p_ccb->local_cid == L2CAP_CONNECTIONLESS_CID)
1595 l2cu_dequeue_ccb (p_ccb);
1598 p_ccb->p_lcb = NULL;
1604 l2cb.p_free_ccb_first = p_ccb;
1605 l2cb.p_free_ccb_last = p_ccb;
1606 p_ccb->p_next_ccb = NULL;
1607 p_ccb->p_prev_ccb = NULL;
1611 p_ccb->p_next_ccb = NULL;
1612 p_ccb->p_prev_ccb = l2cb.p_free_ccb_last;
1613 l2cb.p_free_ccb_last->p_next_ccb = p_ccb;
1614 l2cb.p_free_ccb_last = p_ccb;
1618 p_ccb->in_use = FALSE;
1647 tL2C_CCB *p_ccb;
1656 for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_ccb->p_next_ccb)
1657 if ((p_ccb->in_use) && (p_ccb->remote_cid == remote_cid))
1658 return (p_ccb);
1722 void l2cu_disconnect_chnl (tL2C_CCB *p_ccb)
1724 UINT16 local_cid = p_ccb->local_cid;
1728 tL2CA_DISCONNECT_IND_CB *p_disc_cb = p_ccb->p_rcb->api.pL2CA_DisconnectInd_Cb;
1732 l2cu_send_peer_disc_req (p_ccb);
1734 l2cu_release_ccb (p_ccb);
1791 UINT8 l2cu_process_peer_cfg_req (tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg)
1814 p_ccb->peer_cfg.mtu = p_cfg->mtu;
1815 p_ccb->peer_cfg.mtu_present = TRUE;
1816 p_ccb->peer_cfg_bits |= L2CAP_CH_CFG_MASK_MTU;
1825 else if (p_ccb->peer_cfg.mtu_present)
1828 p_cfg->mtu = p_ccb->peer_cfg.mtu;
1841 p_ccb->peer_cfg.flush_to_present = TRUE;
1842 p_ccb->peer_cfg.flush_to = p_cfg->flush_to;
1843 p_ccb->peer_cfg_bits |= L2CAP_CH_CFG_MASK_FLUSH_TO;
1847 else if (p_ccb->peer_cfg.flush_to_present)
1850 p_cfg->flush_to = p_ccb->peer_cfg.flush_to;
1861 p_ccb->peer_cfg.qos = p_cfg->qos;
1862 p_ccb->peer_cfg.qos_present = TRUE;
1863 p_ccb->peer_cfg_bits |= L2CAP_CH_CFG_MASK_QOS;
1872 else if (p_ccb->peer_cfg.qos_present)
1875 p_cfg->qos = p_ccb->peer_cfg.qos;
1878 if ((fcr_status = l2c_fcr_process_peer_cfg_req (p_ccb, p_cfg)) == L2CAP_PEER_CFG_DISCONNECT)
1892 l2cu_adjust_out_mps (p_ccb);
1924 void l2cu_process_peer_cfg_rsp (tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg)
1927 if ( (p_cfg->qos_present) && (p_ccb->our_cfg.qos_present) )
1928 p_ccb->our_cfg.qos = p_cfg->qos;
1935 p_ccb->peer_cfg.fcr.rtrans_tout = p_cfg->fcr.rtrans_tout;
1936 p_ccb->peer_cfg.fcr.mon_tout = p_cfg->fcr.mon_tout;
1940 if (p_cfg->fcr.tx_win_sz < p_ccb->our_cfg.fcr.tx_win_sz)
1941 p_ccb->fcrb.max_held_acks = p_cfg->fcr.tx_win_sz / 3;
1943 p_ccb->fcrb.max_held_acks = p_ccb->our_cfg.fcr.tx_win_sz / 3;
1946 p_cfg->fcr.tx_win_sz, p_ccb->our_cfg.fcr.tx_win_sz, p_ccb->fcrb.max_held_acks);
1961 void l2cu_process_our_cfg_req (tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg)
1969 p_ccb->our_cfg.qos_present = TRUE;
1970 p_ccb->our_cfg.qos = p_cfg->qos;
1990 p_ccb->fcrb.max_held_acks = p_cfg->fcr.tx_win_sz / 3;
1993 if (p_ccb->p_lcb->peer_ext_fea & L2CAP_EXTFEA_NO_CRC)
1997 p_ccb->bypass_fcs |= L2CAP_CFG_FCS_OUR;
2007 p_ccb->our_cfg.fcr.mode = p_cfg->fcr.mode;
2008 p_ccb->our_cfg.fcr_present = p_cfg->fcr_present;
2023 p_ccb->our_cfg.flush_to = p_cfg->flush_to;
2024 p_lcb = p_ccb->p_lcb;
2054 void l2cu_process_our_cfg_rsp (tL2C_CCB *p_ccb, tL2CAP_CFG_INFO *p_cfg)
2057 if ( (p_cfg->qos_present) && (p_ccb->peer_cfg.qos_present) )
2058 p_ccb->peer_cfg.qos = p_cfg->qos;
2062 l2c_fcr_adj_our_rsp_options (p_ccb, p_cfg);
2339 tL2C_CCB *p_ccb;
2358 p_ccb = p_lcb->ccb_queue.p_first_ccb;
2360 if ((p_ccb->in_use) &&
2361 ((p_ccb->chnl_state == CST_W4_L2CAP_DISCONNECT_RSP) ||
2362 (p_ccb->chnl_state == CST_W4_L2CA_DISCONNECT_RSP)))
2461 tL2C_CCB *p_ccb;
2476 for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_next_ccb)
2478 p_next_ccb = p_ccb->p_next_ccb;
2479 l2c_csm_execute (p_ccb, L2CEVT_SEC_RE_SEND_CMD, NULL);
2495 for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_next_ccb)
2497 p_next_ccb = p_ccb->p_next_ccb;
2498 l2c_csm_execute (p_ccb, L2CEVT_SEC_RE_SEND_CMD, NULL);
2531 void l2cu_adjust_out_mps (tL2C_CCB *p_ccb)
2536 packet_size = btm_get_max_packet_size (p_ccb->p_lcb->remote_bd_addr);
2541 L2CAP_TRACE_ERROR2 ("l2cu_adjust_out_mps bad packet size: %u will use MPS: %u", packet_size, p_ccb->peer_cfg.fcr.mps);
2542 p_ccb->tx_mps = p_ccb->peer_cfg.fcr.mps;
2556 if (p_ccb->peer_cfg.fcr.mps >= packet_size)
2557 p_ccb->tx_mps = p_ccb->peer_cfg.fcr.mps / packet_size * packet_size;
2559 p_ccb->tx_mps = p_ccb->peer_cfg.fcr.mps;
2562 p_ccb->tx_mps, p_ccb->peer_cfg.fcr.mps, packet_size);
2579 tL2C_CCB *p_ccb;
2585 if ((p_ccb = l2cu_allocate_ccb (NULL, 0)) == NULL)
2591 p_ccb->local_cid = fixed_cid;
2592 p_ccb->remote_cid = fixed_cid;
2594 GKI_init_q (&p_ccb->xmit_hold_q);
2596 p_ccb->is_flushable = FALSE;
2598 p_ccb->timer_entry.param = (TIMER_PARAM_TYPE)p_ccb;
2604 p_ccb->our_cfg.fcr = p_ccb->peer_cfg.fcr = *p_fcr;
2606 p_ccb->ertm_info.fcr_rx_pool_id = HCI_ACL_POOL_ID;
2607 p_ccb->ertm_info.fcr_tx_pool_id = HCI_ACL_POOL_ID;
2608 p_ccb->ertm_info.user_rx_pool_id = HCI_ACL_POOL_ID;
2609 p_ccb->ertm_info.user_tx_pool_id = HCI_ACL_POOL_ID;
2611 p_ccb->fcrb.max_held_acks = p_fcr->tx_win_sz / 3;
2615 p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL] = p_ccb;
2616 p_ccb->p_lcb = p_lcb;
2620 p_ccb->chnl_state = CST_OPEN;
2623 p_ccb->fixed_chnl_idle_tout = l2cb.fixed_reg[fixed_cid - L2CAP_FIRST_FIXED_CHNL].default_idle_tout;
2857 tL2C_CCB *p_ccb = NULL;
2870 p_ccb = l2cb.ccb_pool + local_cid;
2873 if (!p_ccb->in_use)
2875 p_ccb = NULL;
2878 else if (p_lcb && p_lcb != p_ccb->p_lcb)
2880 p_ccb = NULL;
2887 p_ccb = l2cb.ccb_pool;
2890 if ((p_ccb->local_cid == local_cid)
2891 &&(p_ccb->in_use)
2892 &&(p_lcb == p_ccb->p_lcb))
2895 p_ccb++;
2902 return (p_ccb);
2920 tL2C_CCB *p_ccb;
2931 p_ccb = p_lcb->rr_serv[p_lcb->rr_pri].p_serve_ccb;
2933 if (!p_ccb)
2940 p_ccb->ccb_priority, p_ccb->local_cid, p_ccb->xmit_hold_q.count );
2944 p_ccb->p_next_ccb == NULL )
2945 ||( p_ccb->p_next_ccb->ccb_priority != p_ccb->ccb_priority ))
2953 p_lcb->rr_serv[p_lcb->rr_pri].p_serve_ccb = p_ccb->p_next_ccb;
2956 if (p_ccb->chnl_state != CST_OPEN)
2960 if (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_BASIC_MODE)
2962 if (p_ccb->fcrb.wait_ack || p_ccb->fcrb.remote_busy)
2965 if ( p_ccb->fcrb.retrans_q.count == 0 )
2967 if ( p_ccb->xmit_hold_q.count == 0 )
2971 if ( (p_ccb->ertm_info.fcr_tx_pool_id == HCI_ACL_POOL_ID) && (GKI_poolutilization (HCI_ACL_POOL_ID) > 90) )
2975 if ( (p_ccb->peer_cfg.fcr.mode == L2CAP_FCR_ERTM_MODE) && (l2c_fcr_is_flow_controlled (p_ccb)) )
2981 if (p_ccb->xmit_hold_q.count == 0)
2986 p_serve_ccb = p_ccb;
3026 tL2C_CCB *p_ccb;
3030 for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_ccb->p_next_ccb)
3032 if (p_ccb->chnl_state != CST_OPEN)
3035 if (p_ccb->fcrb.wait_ack || p_ccb->fcrb.remote_busy)
3038 if (p_ccb->fcrb.retrans_q.count != 0)
3039 return p_ccb;
3041 if (p_ccb->xmit_hold_q.count == 0)
3045 if ( (p_ccb->ertm_info.fcr_tx_pool_id == HCI_ACL_POOL_ID) && (GKI_poolutilization (HCI_ACL_POOL_ID) > 90) )
3049 if ( (p_ccb->peer_cfg.fcr.mode == L2CAP_FCR_ERTM_MODE) && (l2c_fcr_is_flow_controlled (p_ccb)) )
3053 return p_ccb;
3072 tL2C_CCB *p_ccb;
3081 if ((p_ccb = p_lcb->p_fixed_ccbs[xx]) == NULL)
3085 if (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_BASIC_MODE)
3087 if (p_ccb->fcrb.wait_ack || p_ccb->fcrb.remote_busy)
3091 if (p_ccb->fcrb.retrans_q.count == 0)
3093 if (p_ccb->xmit_hold_q.count == 0)
3097 if ( (p_ccb->ertm_info.fcr_tx_pool_id == HCI_ACL_POOL_ID) && (GKI_poolutilization (HCI_ACL_POOL_ID) > 90) )
3101 if ( (p_ccb->peer_cfg.fcr.mode == L2CAP_FCR_ERTM_MODE) && (l2c_fcr_is_flow_controlled (p_ccb)) )
3105 if ((p_buf = l2c_fcr_get_next_xmit_sdu_seg(p_ccb, 0)) != NULL)
3107 l2cu_set_acl_hci_header (p_buf, p_ccb);
3113 if (p_ccb->xmit_hold_q.count != 0)
3115 p_buf = (BT_HDR *)GKI_dequeue (&p_ccb->xmit_hold_q);
3121 l2cu_set_acl_hci_header (p_buf, p_ccb);
3130 p_ccb = l2cu_get_next_channel_in_rr( p_lcb );
3132 p_ccb = l2cu_get_next_channel( p_lcb );
3136 if (p_ccb == NULL)
3139 if (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_BASIC_MODE)
3141 if ((p_buf = l2c_fcr_get_next_xmit_sdu_seg(p_ccb, 0)) == NULL)
3146 p_buf = (BT_HDR *)GKI_dequeue (&p_ccb->xmit_hold_q);
3154 if ( p_ccb->p_rcb && p_ccb->p_rcb->api.pL2CA_TxComplete_Cb && (p_ccb->peer_cfg.fcr.mode != L2CAP_FCR_ERTM_MODE) )
3155 (*p_ccb->p_rcb->api.pL2CA_TxComplete_Cb)(p_ccb->local_cid, 1);
3158 l2cu_check_channel_congestion (p_ccb);
3160 l2cu_set_acl_hci_header (p_buf, p_ccb);
3174 void l2cu_set_acl_hci_header (BT_HDR *p_buf, tL2C_CCB *p_ccb)
3182 if ( (((p_buf->layer_specific & L2CAP_FLUSHABLE_MASK) == L2CAP_FLUSHABLE_CH_BASED) && (p_ccb->is_flushable))
3185 UINT16_TO_STREAM (p, p_ccb->p_lcb->handle | (L2CAP_PKT_START << L2CAP_PKT_TYPE_SHIFT));
3189 UINT16_TO_STREAM (p, p_ccb->p_lcb->handle | l2cb.non_flushable_pbf);
3192 UINT16_TO_STREAM (p, p_ccb->p_lcb->handle | (L2CAP_PKT_START << L2CAP_PKT_TYPE_SHIFT));
3195 if (p_ccb->p_lcb->is_ble_link)
3234 void l2cu_check_channel_congestion (tL2C_CCB *p_ccb)
3236 UINT16 q_count = p_ccb->xmit_hold_q.count;
3239 if ( p_ccb->local_cid == L2CAP_CONNECTIONLESS_CID )
3241 q_count += p_ccb->p_lcb->ucd_out_sec_pending_q.count;
3248 if ((p_ccb->p_rcb)&&(p_ccb->buff_quota != 0))
3251 if ( p_ccb->cong_sent )
3254 if (q_count <= (p_ccb->buff_quota / 2))
3256 p_ccb->cong_sent = FALSE;
3257 if (p_ccb->p_rcb->api.pL2CA_CongestionStatus_Cb)
3260 p_ccb->local_cid, q_count, p_ccb->buff_quota);
3264 (*p_ccb->p_rcb->api.pL2CA_CongestionStatus_Cb)(p_ccb->local_cid, FALSE);
3268 else if ( p_ccb->local_cid == L2CAP_CONNECTIONLESS_CID )
3270 if ( p_ccb->p_rcb->ucd.cb_info.pL2CA_UCD_Congestion_Status_Cb )
3273 p_ccb->p_lcb->ucd_out_sec_pending_q.count,
3274 p_ccb->xmit_hold_q.count, p_ccb->buff_quota);
3275 p_ccb->p_rcb->ucd.cb_info.pL2CA_UCD_Congestion_Status_Cb( p_ccb->p_lcb->remote_bd_addr, FALSE );
3284 if (q_count > p_ccb->buff_quota)
3286 p_ccb->cong_sent = TRUE;
3287 if (p_ccb->p_rcb->api.pL2CA_CongestionStatus_Cb)
3290 p_ccb->local_cid, q_count, p_ccb->buff_quota);
3292 (*p_ccb->p_rcb->api.pL2CA_CongestionStatus_Cb)(p_ccb->local_cid, TRUE);
3295 else if ( p_ccb->local_cid == L2CAP_CONNECTIONLESS_CID )
3297 if ( p_ccb->p_rcb->ucd.cb_info.pL2CA_UCD_Congestion_Status_Cb )
3300 p_ccb->p_lcb->ucd_out_sec_pending_q.count,
3301 p_ccb->xmit_hold_q.count, p_ccb->buff_quota);
3302 p_ccb->p_rcb->ucd.cb_info.pL2CA_UCD_Congestion_Status_Cb( p_ccb->p_lcb->remote_bd_addr, TRUE );