Home | History | Annotate | Download | only in l2cap

Lines Matching refs:p_lcb

57     tL2C_LCB    *p_lcb = &l2cb.lcb_pool[0];
59 for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_lcb++)
61 if (!p_lcb->in_use)
63 alarm_free(p_lcb->l2c_lcb_timer);
64 alarm_free(p_lcb->info_resp_timer);
65 memset (p_lcb, 0, sizeof (tL2C_LCB));
67 memcpy (p_lcb->remote_bd_addr, p_bd_addr, BD_ADDR_LEN);
69 p_lcb->in_use = TRUE;
70 p_lcb->link_state = LST_DISCONNECTED;
71 p_lcb->handle = HCI_INVALID_HANDLE;
72 p_lcb->link_flush_tout = 0xFFFF;
73 p_lcb->l2c_lcb_timer = alarm_new("l2c_lcb.l2c_lcb_timer");
74 p_lcb->info_resp_timer = alarm_new("l2c_lcb.info_resp_timer");
75 p_lcb->idle_timeout = l2cb.idle_timeout;
76 p_lcb->id = 1; /* spec does not allow '0' */
77 p_lcb->is_bonding = is_bonding;
79 p_lcb->transport = transport;
80 p_lcb->tx_data_len = controller_get_interface()->get_ble_default_data_packet_length();
81 p_lcb->le_sec_pending_q = fixed_queue_new(SIZE_MAX);
95 p_lcb->ucd_out_sec_pending_q = fixed_queue_new(SIZE_MAX);
96 p_lcb->ucd_in_sec_pending_q = fixed_queue_new(SIZE_MAX);
98 p_lcb->link_xmit_data_q = list_new(NULL);
99 return (p_lcb);
119 tL2C_LCB *p_lcb = l2cu_find_lcb_by_bd_addr (p_bd_addr, BT_TRANSPORT_BR_EDR);
121 if (p_lcb)
126 p_lcb->is_bonding = is_bonding;
140 void l2cu_release_lcb (tL2C_LCB *p_lcb)
144 p_lcb->in_use = FALSE;
145 p_lcb->is_bonding = FALSE;
148 alarm_free(p_lcb->l2c_lcb_timer);
149 p_lcb->l2c_lcb_timer = NULL;
150 alarm_free(p_lcb->info_resp_timer);
151 p_lcb->info_resp_timer = NULL;
154 osi_free_and_reset((void **)&p_lcb->p_hcit_rcv_acl);
158 if (p_lcb->transport == BT_TRANSPORT_BR_EDR)
161 btm_remove_sco_links(p_lcb->remote_bd_addr);
164 if (p_lcb->sent_not_acked > 0)
167 if (p_lcb->transport == BT_TRANSPORT_LE)
169 l2cb.controller_le_xmit_window += p_lcb->sent_not_acked;
178 l2cb.controller_xmit_window += p_lcb->sent_not_acked;
188 if (!memcmp(l2cb.ble_connecting_bda, p_lcb->remote_bd_addr, BD_ADDR_LEN))
193 l2cu_process_fixed_disc_cback(p_lcb);
197 for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_lcb->ccb_queue.p_first_ccb)
203 if ((p_lcb->link_state == LST_CONNECTED) || (p_lcb->link_state == LST_DISCONNECTING))
205 btm_acl_removed (p_lcb->remote_bd_addr, p_lcb->transport);
207 btm_acl_removed (p_lcb->remote_bd_addr, BT_TRANSPORT_BR_EDR);
211 if (p_lcb->link_xmit_data_q)
213 while (!list_is_empty(p_lcb->link_xmit_data_q)) {
214 BT_HDR *p_buf = list_front(p_lcb->link_xmit_data_q);
215 list_remove(p_lcb->link_xmit_data_q, p_buf);
218 list_free(p_lcb->link_xmit_data_q);
219 p_lcb->link_xmit_data_q = NULL;
224 l2c_ucd_delete_sec_pending_q(p_lcb);
229 if (p_lcb->transport == BT_TRANSPORT_LE)
246 if (p_lcb->p_echo_rsp_cb)
248 tL2CA_ECHO_RSP_CB *p_cb = p_lcb->p_echo_rsp_cb;
251 p_lcb->p_echo_rsp_cb = NULL;
257 if (p_lcb->le_sec_pending_q)
259 while (!fixed_queue_is_empty(p_lcb->le_sec_pending_q))
261 tL2CAP_SEC_DATA *p_buf = (tL2CAP_SEC_DATA*) fixed_queue_try_dequeue(p_lcb->le_sec_pending_q);
263 p_buf->p_callback(p_lcb->remote_bd_addr, p_lcb->transport, p_buf->p_ref_data, BTM_DEV_RESET);
266 fixed_queue_free(p_lcb->le_sec_pending_q, NULL);
267 p_lcb->le_sec_pending_q = NULL;
285 tL2C_LCB *p_lcb = &l2cb.lcb_pool[0];
287 for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_lcb++)
289 if ((p_lcb->in_use) &&
291 p_lcb->transport == transport &&
293 (!memcmp (p_lcb->remote_bd_addr, p_bd_addr, BD_ADDR_LEN)))
295 return (p_lcb);
332 BOOLEAN l2c_is_cmd_rejected (UINT8 cmd_code, UINT8 id, tL2C_LCB *p_lcb)
344 l2cu_send_peer_cmd_reject (p_lcb, L2CAP_CMD_REJ_MTU_EXCEEDED, id, L2CAP_DEFAULT_MTU, 0);
362 BT_HDR *l2cu_build_header (tL2C_LCB *p_lcb, UINT16 len, UINT8 cmd, UINT8 id)
373 if (p_lcb->transport == BT_TRANSPORT_LE)
375 UINT16_TO_STREAM (p, (p_lcb->handle | (L2CAP_PKT_START_NON_FLUSHABLE << L2CAP_PKT_TYPE_SHIFT)));
381 UINT16_TO_STREAM (p, p_lcb->handle | l2cb.non_flushable_pbf);
383 UINT16_TO_STREAM (p, (p_lcb->handle | (L2CAP_PKT_START << L2CAP_PKT_TYPE_SHIFT)));
391 if (p_lcb->transport == BT_TRANSPORT_LE)
420 void l2cu_adj_id (tL2C_LCB *p_lcb, UINT8 adj_mask)
422 if ((adj_mask & L2CAP_ADJ_ZERO_ID) && !p_lcb->id)
424 p_lcb->id++;
438 void l2cu_send_peer_cmd_reject (tL2C_LCB *p_lcb, UINT16 reason, UINT8 rem_id,
453 if ((p_buf = l2cu_build_header (p_lcb, (UINT16) (L2CAP_CMD_REJECT_LEN + param_len), L2CAP_CMD_REJECT, rem_id)) == NULL )
470 l2c_link_check_send_pkts (p_lcb, NULL, p_buf);
490 p_ccb->p_lcb->id++;
491 l2cu_adj_id(p_ccb->p_lcb, L2CAP_ADJ_ID);
493 p_ccb->local_id = p_ccb->p_lcb->id;
495 if ((p_buf = l2cu_build_header (p_ccb->p_lcb, L2CAP_CONN_REQ_LEN, L2CAP_CMD_CONN_REQ,
508 l2c_link_check_send_pkts (p_ccb->p_lcb, NULL, p_buf);
536 if ((p_buf=l2cu_build_header(p_ccb->p_lcb, L2CAP_CONN_RSP_LEN, L2CAP_CMD_CONN_RSP, p_ccb->remote_id)) == NULL)
550 l2c_link_check_send_pkts (p_ccb->p_lcb, NULL, p_buf);
565 void l2cu_reject_connection (tL2C_LCB *p_lcb, UINT16 remote_cid, UINT8 rem_id, UINT16 result)
570 if ((p_buf = l2cu_build_header(p_lcb, L2CAP_CONN_RSP_LEN, L2CAP_CMD_CONN_RSP, rem_id)) == NULL )
583 l2c_link_check_send_pkts (p_lcb, NULL, p_buf);
603 p_ccb->p_lcb->id++;
604 l2cu_adj_id(p_ccb->p_lcb, L2CAP_ADJ_ID);
606 p_ccb->local_id = p_ccb->p_lcb->id;
621 if ((p_buf = l2cu_build_header (p_ccb->p_lcb, (UINT16) (L2CAP_CONFIG_REQ_LEN + cfg_len),
690 l2c_link_check_send_pkts (p_ccb->p_lcb, NULL, p_buf);
721 if ((p_buf = l2cu_build_header (p_ccb->p_lcb, (UINT16)(L2CAP_CONFIG_RSP_LEN + cfg_len),
783 l2c_link_check_send_pkts (p_ccb->p_lcb, NULL, p_buf);
821 UINT16_TO_STREAM (p, (p_ccb->p_lcb->handle | (L2CAP_PKT_START_NON_FLUSHABLE << L2CAP_PKT_TYPE_SHIFT)));
826 UINT16_TO_STREAM (p, (p_ccb->p_lcb->handle | (L2CAP_PKT_START << L2CAP_PKT_TYPE_SHIFT)));
904 l2c_link_check_send_pkts (p_ccb->p_lcb, NULL, p_buf);
922 if ((!p_ccb) || (p_ccb->p_lcb == NULL))
929 p_ccb->p_lcb->id++;
930 l2cu_adj_id(p_ccb->p_lcb, L2CAP_ADJ_ID);
932 p_ccb->local_id = p_ccb->p_lcb->id;
934 if ((p_buf = l2cu_build_header(p_ccb->p_lcb, L2CAP_DISC_REQ_LEN, L2CAP_CMD_DISC_REQ, p_ccb->local_id)) == NULL)
953 l2c_link_check_send_pkts (p_ccb->p_lcb, p_ccb, p_buf2);
957 l2c_link_check_send_pkts (p_ccb->p_lcb, NULL, p_buf);
975 void l2cu_send_peer_disc_rsp (tL2C_LCB *p_lcb
981 if ((p_buf=l2cu_build_header(p_lcb, L2CAP_DISC_RSP_LEN, L2CAP_CMD_DISC_RSP, remote_id)) == NULL)
992 l2c_link_check_send_pkts (p_lcb, NULL, p_buf);
1007 void l2cu_send_peer_echo_req (tL2C_LCB *p_lcb, UINT8 *p_data, UINT16 data_len)
1012 p_lcb->id++;
1013 l2cu_adj_id(p_lcb, L2CAP_ADJ_ZERO_ID); /* check for wrap to '0' */
1015 if ((p_buf = l2cu_build_header(p_lcb, (UINT16) (L2CAP_ECHO_REQ_LEN + data_len), L2CAP_CMD_ECHO_REQ, p_lcb->id)) == NULL)
1028 l2c_link_check_send_pkts (p_lcb, NULL, p_buf);
1042 void l2cu_send_peer_echo_rsp (tL2C_LCB *p_lcb, UINT8 id, UINT8 *p_data, UINT16 data_len)
1048 if (!id || id == p_lcb->cur_echo_id)
1055 p_lcb->cur_echo_id = id;
1068 if ((p_buf = l2cu_build_header (p_lcb, (UINT16)(L2CAP_ECHO_RSP_LEN + data_len), L2CAP_CMD_ECHO_RSP, id)) == NULL)
1082 l2c_link_check_send_pkts (p_lcb, NULL, p_buf);
1094 void l2cu_send_peer_info_req (tL2C_LCB *p_lcb, UINT16 info_type)
1100 p_lcb->id++;
1101 l2cu_adj_id(p_lcb, L2CAP_ADJ_ID);
1103 if ((p_buf = l2cu_build_header(p_lcb, 2, L2CAP_CMD_INFO_REQ, p_lcb->id)) == NULL)
1116 p_lcb->w4_info_rsp = TRUE;
1117 alarm_set_on_queue(p_lcb->info_resp_timer, L2CAP_WAIT_INFO_RSP_TIMEOUT_MS,
1118 l2c_info_resp_timer_timeout, p_lcb,
1121 l2c_link_check_send_pkts (p_lcb, NULL, p_buf);
1135 void l2cu_send_peer_info_rsp (tL2C_LCB *p_lcb, UINT8 remote_id, UINT16 info_type)
1165 if ((p_buf = l2cu_build_header(p_lcb, len, L2CAP_CMD_INFO_RSP, remote_id)) == NULL)
1188 if (p_lcb->transport == BT_TRANSPORT_LE)
1244 l2c_link_check_send_pkts (p_lcb, NULL, p_buf);
1264 if (p_ccb->p_lcb != NULL)
1265 p_q = &p_ccb->p_lcb->ccb_queue;
1269 L2CAP_TRACE_ERROR ("l2cu_enqueue_ccb CID: 0x%04x ERROR in_use: %u p_lcb: 0x%08x",
1270 p_ccb->local_cid, p_ccb->in_use, p_ccb->p_lcb);
1321 if (p_ccb->p_lcb != NULL)
1324 if (p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].num_ccb == 0 )
1327 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_first_ccb = p_ccb;
1329 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_serve_ccb = p_ccb;
1331 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].quota = L2CAP_GET_PRIORITY_QUOTA(p_ccb->ccb_priority);
1334 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].num_ccb++;
1357 if (p_ccb->p_lcb != NULL)
1358 p_q = &p_ccb->p_lcb->ccb_queue;
1362 L2CAP_TRACE_ERROR ("l2cu_dequeue_ccb CID: 0x%04x ERROR in_use: %u p_lcb: 0x%08x p_q: 0x%08x p_q->p_first_ccb: 0x%08x",
1363 p_ccb->local_cid, p_ccb->in_use, p_ccb->p_lcb, p_q, p_q ? p_q->p_first_ccb : 0);
1369 if (p_ccb->p_lcb != NULL)
1372 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].num_ccb--;
1375 if (p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].num_ccb == 0 )
1377 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_first_ccb = NULL;
1378 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_serve_ccb = NULL;
1383 if ( p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_first_ccb == p_ccb )
1385 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_first_ccb = p_ccb->p_next_ccb;
1388 if ( p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_serve_ccb == p_ccb )
1391 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_serve_ccb
1392 = p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_first_ccb;
1453 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].num_ccb = 0;
1454 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_first_ccb = NULL;
1455 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_serve_ccb = NULL;
1459 p_lcb->rr_serv[p_ccb->ccb_priority].p_first_ccb = p_ccb;
1460 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].p_serve_ccb = p_ccb;
1461 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].quota = L2CAP_GET_PRIORITY_QUOTA(p_ccb->ccb_priority);
1462 p_ccb->p_lcb->rr_serv[p_ccb->ccb_priority].num_ccb = 1;
1479 tL2C_CCB *l2cu_allocate_ccb (tL2C_LCB *p_lcb, UINT16 cid)
1532 p_ccb->p_lcb = p_lcb;
1539 if (p_lcb)
1630 tL2C_LCB *p_lcb = l2cu_find_lcb_by_handle(handle);
1632 if (!p_lcb)
1635 p_lcb->is_bonding = FALSE;
1638 if (p_lcb->ccb_queue.p_first_ccb != NULL)
1642 if ((p_lcb->link_state == LST_CONNECTED) ||
1643 (p_lcb->link_state == LST_CONNECTING) ||
1644 (p_lcb->link_state == LST_DISCONNECTING)) {
1647 if (p_lcb->idle_timeout == 0) {
1648 if (btsnd_hcic_disconnect (p_lcb->handle, HCI_ERR_PEER_USER)) {
1649 p_lcb->link_state = LST_DISCONNECTING;
1655 alarm_set_on_queue(p_lcb->l2c_lcb_timer, timeout_ms,
1656 l2c_lcb_timer_timeout, p_lcb,
1677 tL2C_LCB *p_lcb = p_ccb->p_lcb;
1698 btm_sec_clr_temp_auth_service (p_lcb->remote_bd_addr);
1710 if ( (p_lcb) &&
1721 p_ccb->p_lcb = NULL;
1744 if ((p_lcb) && p_lcb->in_use && (p_lcb->link_state == LST_CONNECTED))
1746 if (!p_lcb->ccb_queue.p_first_ccb)
1748 l2cu_no_dynamic_ccbs (p_lcb);
1768 tL2C_CCB *l2cu_find_ccb_by_remote_cid (tL2C_LCB *p_lcb, UINT16 remote_cid)
1773 if (!p_lcb)
1779 for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_ccb->p_next_ccb)
2141 tL2C_LCB *p_lcb;
2171 if (p_ccb->p_lcb->peer_ext_fea & L2CAP_EXTFEA_NO_CRC)
2202 p_lcb = p_ccb->p_lcb;
2204 if (p_cfg->flush_to < p_lcb->link_flush_tout)
2206 p_lcb->link_flush_tout = p_cfg->flush_to;
2213 btsnd_hcic_write_auto_flush_tout (p_lcb->handle, hci_flush_to);
2257 tL2C_LCB *p_lcb = &l2cb.lcb_pool[0];
2259 for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_lcb++)
2261 if ((p_lcb->in_use) && (p_lcb->handle != HCI_INVALID_HANDLE))
2263 l2c_link_hci_disc_comp (p_lcb->handle, (UINT8) -1);
2280 BOOLEAN l2cu_create_conn (tL2C_LCB *p_lcb, tBT_TRANSPORT transport)
2293 BTM_ReadDevInfo(p_lcb->remote_bd_addr, &dev_type, &addr_type);
2300 p_lcb->ble_addr_type = addr_type;
2301 p_lcb->transport = BT_TRANSPORT_LE;
2303 return (l2cble_create_conn(p_lcb));
2311 if (p_lcb_cur == p_lcb)
2336 p_lcb->link_state = LST_CONNECTING_WAIT_SWITCH;
2337 p_lcb->link_role = HCI_ROLE_MASTER;
2341 alarm_set_on_queue(p_lcb->l2c_lcb_timer,
2343 l2c_lcb_timer_timeout, p_lcb,
2351 p_lcb->link_state = LST_CONNECTING;
2353 return (l2cu_create_conn_after_switch (p_lcb));
2369 tL2C_LCB *p_lcb = &l2cb.lcb_pool[0];
2371 for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_lcb++)
2373 if ((p_lcb->in_use) && (p_lcb->acl_priority == L2CAP_PRIORITY_HIGH))
2393 BOOLEAN l2cu_create_conn_after_switch (tL2C_LCB *p_lcb)
2402 tBTM_SEC_DEV_REC *p_dev_rec = btm_find_dev (p_lcb->remote_bd_addr);
2408 l2cb.disallow_switch, num_acl, no_hi_prio_chs, p_lcb->is_bonding);
2412 if ( ((!l2cb.disallow_switch && (num_acl < 3)) || (p_lcb->is_bonding && (no_hi_prio_chs==0)))
2418 p_lcb->link_state = LST_CONNECTING;
2421 if ((p_inq_info = BTM_InqDbRead(p_lcb->remote_bd_addr)) != NULL)
2436 if (!btsnd_hcic_create_conn (p_lcb->remote_bd_addr,
2447 l2cu_release_lcb (p_lcb);
2453 alarm_set_on_queue(p_lcb->l2c_lcb_timer,
2455 l2c_lcb_timer_timeout, p_lcb,
2475 tL2C_LCB *p_lcb = &l2cb.lcb_pool[0];
2477 for (i = 0; i < MAX_L2CAP_LINKS; i++, p_lcb++)
2479 if ((p_lcb->in_use) && (p_lcb->link_state == state))
2481 return (p_lcb);
2504 tL2C_LCB *p_lcb;
2509 p_lcb = &l2cb.lcb_pool[0];
2511 for (i = 0; i < MAX_L2CAP_LINKS; i++, p_lcb++)
2513 if (p_lcb->in_use)
2516 if ((!p_lcb->ccb_queue.p_first_ccb) || (p_lcb->link_state == LST_DISCONNECTING))
2522 else if (p_lcb->ccb_queue.p_first_ccb == p_lcb->ccb_queue.p_last_ccb)
2524 p_ccb = p_lcb->ccb_queue.p_first_ccb;
2554 tL2C_LCB *p_lcb;
2562 if ((p_lcb = l2cu_find_lcb_by_bd_addr(bd_addr, BT_TRANSPORT_BR_EDR)) == NULL)
2571 if ((!reset_after_rs && (priority != p_lcb->acl_priority)) ||
2573 ( reset_after_rs && p_lcb->acl_priority == L2CAP_PRIORITY_HIGH))
2579 UINT16_TO_STREAM (pp, p_lcb->handle);
2585 if (p_lcb->acl_priority != priority)
2587 p_lcb->acl_priority = priority;
2626 tL2C_LCB *p_lcb;
2636 p_lcb = l2cu_find_lcb_by_bd_addr (p_bda, BT_TRANSPORT_BR_EDR);
2639 if (p_lcb)
2642 for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_next_ccb)
2656 for (xx = 0, p_lcb = &l2cb.lcb_pool[0]; xx < MAX_L2CAP_LINKS; xx++, p_lcb++)
2658 if (p_lcb->in_use)
2661 for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_next_ccb)
2702 packet_size = btm_get_max_packet_size (p_ccb->p_lcb->remote_bd_addr);
2742 BOOLEAN l2cu_initialize_fixed_ccb (tL2C_LCB *p_lcb, UINT16 fixed_cid, tL2CAP_FCR_OPTS *p_fcr)
2748 p_ccb = p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL];
2760 alarm_cancel(p_lcb->l2c_lcb_timer);
2782 p_lcb->p_fixed_ccbs[fixed_cid - L2CAP_FIRST_FIXED_CHNL] = p_ccb;
2783 p_ccb->p_lcb = p_lcb;
2786 if (p_lcb->link_state == LST_CONNECTED)
2806 void l2cu_no_dynamic_ccbs (tL2C_LCB *p_lcb)
2809 period_ms_t timeout_ms = p_lcb->idle_timeout * 1000;
2817 if ((p_lcb->p_fixed_ccbs[xx] != NULL) &&
2818 (p_lcb->p_fixed_ccbs[xx]->fixed_chnl_idle_tout * 1000 > timeout_ms)) {
2819 timeout_ms = p_lcb->p_fixed_ccbs[xx]->fixed_chnl_idle_tout * 1000;
2825 if (p_lcb->is_bonding)
2832 rc = btm_sec_disconnect (p_lcb->handle, HCI_ERR_PEER_USER);
2835 l2cu_process_fixed_disc_cback(p_lcb);
2836 p_lcb->link_state = LST_DISCONNECTING;
2841 l2cu_process_fixed_disc_cback(p_lcb);
2843 p_lcb->link_state = LST_DISCONNECTING;
2846 else if ( (p_lcb->is_bonding)
2847 && (btsnd_hcic_disconnect (p_lcb->handle, HCI_ERR_PEER_USER)) )
2849 l2cu_process_fixed_disc_cback(p_lcb);
2850 p_lcb->link_state = LST_DISCONNECTING;
2863 alarm_set_on_queue(p_lcb->l2c_lcb_timer, timeout_ms,
2864 l2c_lcb_timer_timeout, p_lcb,
2867 alarm_cancel(p_lcb->l2c_lcb_timer);
2881 void l2cu_process_fixed_chnl_resp (tL2C_LCB *p_lcb)
2884 if (p_lcb->transport == BT_TRANSPORT_BR_EDR)
2887 p_lcb->peer_chnl_mask[0] &= (L2CAP_FIXED_CHNL_SIG_BIT| \
2892 p_lcb->peer_chnl_mask[0] = l2cb.l2c_ble_fixed_chnls_mask;
2900 if (p_lcb->transport == BT_TRANSPORT_BR_EDR &&
2907 if (p_lcb->peer_chnl_mask[(xx + L2CAP_FIRST_FIXED_CHNL) / 8]
2910 if (p_lcb->p_fixed_ccbs[xx])
2911 p_lcb->p_fixed_ccbs[xx]->chnl_state = CST_OPEN;
2914 p_lcb->remote_bd_addr, TRUE, 0, p_lcb->transport);
2917 p_lcb->remote_bd_addr, TRUE, 0, BT_TRANSPORT_BR_EDR);
2924 p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason, p_lcb->transport);
2927 p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason, BT_TRANSPORT_BR_EDR);
2930 if (p_lcb->p_fixed_ccbs[xx])
2932 l2cu_release_ccb (p_lcb->p_fixed_ccbs[xx]);
2933 p_lcb->p_fixed_ccbs[xx] = NULL;
2952 void l2cu_process_fixed_disc_cback (tL2C_LCB *p_lcb)
2957 UINT8 peer_channel_mask = p_lcb->peer_chnl_mask[0];
2960 if (p_lcb->transport == BT_TRANSPORT_LE)
2961 p_lcb->peer_chnl_mask[0] = 0;
2965 if (p_lcb->p_fixed_ccbs[xx])
2967 if (p_lcb->p_fixed_ccbs[xx] != p_lcb->p_pending_ccb)
2970 p_l2c_chnl_ctrl_block = p_lcb->p_fixed_ccbs[xx];
2971 p_lcb->p_fixed_ccbs[xx] = NULL;
2975 p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason, p_lcb->transport);
2978 p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason, BT_TRANSPORT_BR_EDR);
2986 p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason, p_lcb->transport);
2989 p_lcb->remote_bd_addr, FALSE, p_lcb->disc_reason, BT_TRANSPORT_BR_EDR);
3006 void l2cu_send_peer_ble_par_req (tL2C_LCB *p_lcb, UINT16 min_int, UINT16 max_int,
3013 p_lcb->id++;
3014 l2cu_adj_id (p_lcb, L2CAP_ADJ_ID);
3016 if ((p_buf = l2cu_build_header (p_lcb, L2CAP_CMD_BLE_UPD_REQ_LEN,
3017 L2CAP_CMD_BLE_UPDATE_REQ, p_lcb->id)) == NULL )
3031 l2c_link_check_send_pkts (p_lcb, NULL, p_buf);
3044 void l2cu_send_peer_ble_par_rsp (tL2C_LCB *p_lcb, UINT16 reason, UINT8 rem_id)
3049 if ((p_buf = l2cu_build_header (p_lcb, L2CAP_CMD_BLE_UPD_RSP_LEN,
3061 l2c_link_check_send_pkts (p_lcb, NULL, p_buf);
3078 tL2C_LCB *p_lcb = NULL;
3085 p_lcb = p_ccb->p_lcb;
3088 p_ccb->p_lcb->id++;
3089 l2cu_adj_id(p_ccb->p_lcb, L2CAP_ADJ_ID);
3091 p_ccb->local_id = p_ccb->p_lcb->id;
3093 if ((p_buf = l2cu_build_header (p_lcb, L2CAP_CMD_BLE_CREDIT_BASED_CONN_REQ_LEN,
3094 L2CAP_CMD_BLE_CREDIT_BASED_CONN_REQ, p_lcb->id)) == NULL )
3117 l2c_link_check_send_pkts (p_lcb, NULL, p_buf);
3130 void l2cu_reject_ble_connection (tL2C_LCB *p_lcb, UINT8 rem_id, UINT16 result)
3135 if ((p_buf = l2cu_build_header(p_lcb, L2CAP_CMD_BLE_CREDIT_BASED_CONN_RES_LEN,
3151 l2c_link_check_send_pkts (p_lcb, NULL, p_buf);
3170 if ((p_buf = l2cu_build_header(p_ccb->p_lcb, L2CAP_CMD_BLE_CREDIT_BASED_CONN_RES_LEN,
3186 l2c_link_check_send_pkts (p_ccb->p_lcb, NULL, p_buf);
3203 tL2C_LCB *p_lcb = NULL;
3207 p_lcb = p_ccb->p_lcb;
3210 p_ccb->p_lcb->id++;
3211 l2cu_adj_id(p_ccb->p_lcb, L2CAP_ADJ_ID);
3213 p_ccb->local_id = p_ccb->p_lcb->id;
3215 if ((p_buf = l2cu_build_header (p_lcb, L2CAP_CMD_BLE_FLOW_CTRL_CREDIT_LEN,
3216 L2CAP_CMD_BLE_FLOW_CTRL_CREDIT, p_lcb->id)) == NULL )
3228 l2c_link_check_send_pkts (p_lcb, NULL, p_buf);
3245 tL2C_LCB *p_lcb = NULL;
3250 p_lcb = p_ccb->p_lcb;
3253 p_ccb->p_lcb->id++;
3254 l2cu_adj_id(p_ccb->p_lcb, L2CAP_ADJ_ID);
3256 p_ccb->local_id = p_ccb->p_lcb->id;
3257 if ((p_buf = l2cu_build_header (p_lcb, L2CAP_DISC_REQ_LEN,
3258 L2CAP_CMD_DISC_REQ, p_lcb->id)) == NULL )
3270 l2c_link_check_send_pkts (p_lcb, NULL, p_buf);
3292 tL2C_LCB *p_lcb = &l2cb.lcb_pool[0];
3294 for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_lcb++)
3296 if ((p_lcb->in_use) && (p_lcb->handle == handle))
3298 return (p_lcb);
3317 tL2C_CCB *l2cu_find_ccb_by_cid (tL2C_LCB *p_lcb, UINT16 local_cid)
3340 else if (p_lcb && p_lcb != p_ccb->p_lcb)
3354 &&(p_lcb == p_ccb->p_lcb))
3379 static tL2C_CCB *l2cu_get_next_channel_in_rr(tL2C_LCB *p_lcb)
3390 for ( j = 0; (j < p_lcb->rr_serv[p_lcb->rr_pri].num_ccb)&&(!p_serve_ccb); j++)
3393 p_ccb = p_lcb->rr_serv[p_lcb->rr_pri].p_serve_ccb;
3397 L2CAP_TRACE_ERROR("p_serve_ccb is NULL, rr_pri=%d", p_lcb->rr_pri);
3411 p_lcb->rr_serv[p_lcb->rr_pri].p_serve_ccb = p_lcb->rr_serv[p_lcb->rr_pri].p_first_ccb;
3416 p_lcb->rr_serv[p_lcb->rr_pri].p_serve_ccb = p_ccb->p_next_ccb;
3422 if (p_ccb->p_lcb->transport == BT_TRANSPORT_LE)
3457 p_lcb->rr_serv[p_lcb->rr_pri].quota--;
3461 if ((p_lcb->rr_serv[p_lcb->rr_pri].quota == 0)||(!p_serve_ccb))
3464 p_lcb->rr_pri = (p_lcb->rr_pri + 1) % L2CAP_NUM_CHNL_PRIORITY;
3466 p_lcb->rr_serv[p_lcb->rr_pri].quota = L2CAP_GET_PRIORITY_QUOTA(p_lcb->rr_pri);
3474 p_lcb->rr_serv[p_serve_ccb->ccb_priority].quota,
3493 static tL2C_CCB *l2cu_get_next_channel(tL2C_LCB *p_lcb)
3499 for (p_ccb = p_lcb->ccb_queue.p_first_ccb; p_ccb; p_ccb = p_ccb->p_next_ccb)
3535 BT_HDR *l2cu_get_next_buffer_to_send (tL2C_LCB *p_lcb)
3546 if ((p_ccb = p_lcb->p_fixed_ccbs[xx]) == NULL)
3597 p_ccb = l2cu_get_next_channel_in_rr( p_lcb );
3599 p_ccb = l2cu_get_next_channel( p_lcb );
3606 if (p_ccb->p_lcb->transport == BT_TRANSPORT_LE)
3665 if (p_ccb->p_lcb->transport == BT_TRANSPORT_LE)
3667 UINT16_TO_STREAM (p, p_ccb->p_lcb->handle | (L2CAP_PKT_START_NON_FLUSHABLE << L2CAP_PKT_TYPE_SHIFT));
3687 UINT16_TO_STREAM (p, p_ccb->p_lcb->handle | (L2CAP_PKT_START << L2CAP_PKT_TYPE_SHIFT));
3691 UINT16_TO_STREAM (p, p_ccb->p_lcb->handle | l2cb.non_flushable_pbf);
3694 UINT16_TO_STREAM (p, p_ccb->p_lcb->handle | (L2CAP_PKT_START << L2CAP_PKT_TYPE_SHIFT));
3728 q_count += fixed_queue_length(p_ccb->p_lcb->ucd_out_sec_pending_q);
3758 fixed_queue_length(p_ccb->p_lcb->ucd_out_sec_pending_q),
3761 p_ccb->p_rcb->ucd.cb_info.pL2CA_UCD_Congestion_Status_Cb( p_ccb->p_lcb->remote_bd_addr, FALSE );
3771 if (p_ccb->p_lcb->p_fixed_ccbs[xx] == p_ccb)
3774 (* l2cb.fixed_reg[xx].pL2CA_FixedCong_Cb)(p_ccb->p_lcb->remote_bd_addr, FALSE);
3801 fixed_queue_length(p_ccb->p_lcb->ucd_out_sec_pending_q),
3804 p_ccb->p_rcb->ucd.cb_info.pL2CA_UCD_Congestion_Status_Cb( p_ccb->p_lcb->remote_bd_addr, TRUE );
3814 if (p_ccb->p_lcb->p_fixed_ccbs[xx] == p_ccb)
3817 (* l2cb.fixed_reg[xx].pL2CA_FixedCong_Cb)(p_ccb->p_lcb->remote_bd_addr, TRUE);