1 /******************************************************************************
3 * Copyright (C) 2003-2012 Broadcom Corporation
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
17 ******************************************************************************/
19 /******************************************************************************
21 * This file implements utility functions for the HeaLth device profile
24 ******************************************************************************/
29 #include "bt_target.h"
30 #if defined(HL_INCLUDED) && (HL_INCLUDED == TRUE)
33 #include "bt_common.h"
35 #include "bta_hl_int.h"
36 #include "bta_hl_co.h"
41 /*******************************************************************************
43 ** Function bta_hl_set_ctrl_psm_for_dch
45 ** Description This function set the control PSM for the DCH setup
47 ** Returns BOOLEAN - TRUE - control PSM setting is successful
48 *******************************************************************************/
49 BOOLEAN bta_hl_set_ctrl_psm_for_dch(UINT8 app_idx, UINT8 mcl_idx,
50 UINT8 mdl_idx, UINT16 ctrl_psm)
52 tBTA_HL_MCL_CB *p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
53 BOOLEAN success = TRUE, update_ctrl_psm = FALSE;
56 if (p_mcb->sdp.num_recs)
58 if (p_mcb->ctrl_psm != ctrl_psm)
60 /* can not use a different ctrl PSM than the current one*/
66 /* No SDP info control i.e. channel was opened by the peer */
67 update_ctrl_psm = TRUE;
70 if (success && update_ctrl_psm)
72 p_mcb->ctrl_psm = ctrl_psm;
76 #if BTA_HL_DEBUG == TRUE
79 APPL_TRACE_DEBUG("bta_hl_set_ctrl_psm_for_dch num_recs=%d success=%d update_ctrl_psm=%d ctrl_psm=0x%x ",
80 p_mcb->sdp.num_recs, success, update_ctrl_psm, ctrl_psm );
88 /*******************************************************************************
90 ** Function bta_hl_find_sdp_idx_using_ctrl_psm
94 ** Returns TRUE if found
96 *******************************************************************************/
97 BOOLEAN bta_hl_find_sdp_idx_using_ctrl_psm(tBTA_HL_SDP *p_sdp,
102 tBTA_HL_SDP_REC *p_rec;
107 for (i=0; i<p_sdp->num_recs; i++)
109 p_rec = &p_sdp->sdp_rec[i];
110 if (p_rec->ctrl_psm == ctrl_psm)
124 #if BTA_HL_DEBUG == TRUE
127 APPL_TRACE_DEBUG("bta_hl_find_sdp_idx_using_ctrl_psm found=%d sdp_idx=%d ctrl_psm=0x%x ",
128 found, *p_sdp_idx, ctrl_psm );
134 /*******************************************************************************
136 ** Function bta_hl_set_user_tx_buf_size
138 ** Description This function sets the user tx buffer size
140 ** Returns UINT16 buf_size
142 *******************************************************************************/
144 UINT16 bta_hl_set_user_tx_buf_size(UINT16 max_tx_size)
146 if (max_tx_size > BT_DEFAULT_BUFFER_SIZE)
147 return BTA_HL_LRG_DATA_BUF_SIZE;
148 return L2CAP_INVALID_ERM_BUF_SIZE;
151 /*******************************************************************************
153 ** Function bta_hl_set_user_rx_buf_size
155 ** Description This function sets the user rx buffer size
157 ** Returns UINT16 buf_size
159 *******************************************************************************/
161 UINT16 bta_hl_set_user_rx_buf_size(UINT16 mtu)
163 if (mtu > BT_DEFAULT_BUFFER_SIZE)
164 return BTA_HL_LRG_DATA_BUF_SIZE;
165 return L2CAP_INVALID_ERM_BUF_SIZE;
170 /*******************************************************************************
172 ** Function bta_hl_set_tx_win_size
174 ** Description This function sets the tx window size
176 ** Returns UINT8 tx_win_size
178 *******************************************************************************/
179 UINT8 bta_hl_set_tx_win_size(UINT16 mtu, UINT16 mps)
191 tx_win_size = (mtu/mps)+1;
195 APPL_TRACE_ERROR("The MPS is zero");
200 #if BTA_HL_DEBUG == TRUE
201 APPL_TRACE_DEBUG("bta_hl_set_tx_win_size win_size=%d mtu=%d mps=%d",
202 tx_win_size, mtu, mps);
207 /*******************************************************************************
209 ** Function bta_hl_set_mps
211 ** Description This function sets the MPS
213 ** Returns UINT16 MPS
215 *******************************************************************************/
216 UINT16 bta_hl_set_mps(UINT16 mtu)
219 if (mtu > BTA_HL_L2C_MPS)
221 mps = BTA_HL_L2C_MPS;
227 #if BTA_HL_DEBUG == TRUE
228 APPL_TRACE_DEBUG("bta_hl_set_mps mps=%d mtu=%d",
235 /*******************************************************************************
237 ** Function bta_hl_clean_mdl_cb
239 ** Description This function clean up the specified MDL control block
243 *******************************************************************************/
244 void bta_hl_clean_mdl_cb(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx)
246 tBTA_HL_MDL_CB *p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
247 #if BTA_HL_DEBUG == TRUE
248 APPL_TRACE_DEBUG("bta_hl_clean_mdl_cb app_idx=%d mcl_idx=%d mdl_idx=%d",
249 app_idx, mcl_idx, mdl_idx);
251 osi_free_and_reset((void **)&p_dcb->p_tx_pkt);
252 osi_free_and_reset((void **)&p_dcb->p_rx_pkt);
253 osi_free_and_reset((void **)&p_dcb->p_echo_tx_pkt);
254 osi_free_and_reset((void **)&p_dcb->p_echo_rx_pkt);
256 memset((void *)p_dcb, 0 , sizeof(tBTA_HL_MDL_CB));
260 /*******************************************************************************
262 ** Function bta_hl_get_buf
264 ** Description This function allocate a buffer based on the specified data size
268 *******************************************************************************/
269 BT_HDR * bta_hl_get_buf(UINT16 data_size, BOOLEAN fcs_use)
271 size_t size = data_size + L2CAP_MIN_OFFSET + BT_HDR_SIZE + L2CAP_FCS_LEN
272 + L2CAP_EXT_CONTROL_OVERHEAD;
275 size += L2CAP_FCS_LEN;
277 BT_HDR *p_new = (BT_HDR *)osi_malloc(size);
278 p_new->len = data_size;
279 p_new->offset = L2CAP_MIN_OFFSET;
284 /*******************************************************************************
286 ** Function bta_hl_find_service_in_db
288 ** Description This function check the specified service class(es) can be find in
289 ** the received SDP database
291 ** Returns BOOLEAN TRUE - found
294 *******************************************************************************/
295 BOOLEAN bta_hl_find_service_in_db( UINT8 app_idx, UINT8 mcl_idx,
297 tSDP_DISC_REC **pp_rec )
299 tBTA_HL_MCL_CB *p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
300 BOOLEAN found = TRUE;
302 switch (service_uuid)
304 case UUID_SERVCLASS_HDP_SINK:
305 case UUID_SERVCLASS_HDP_SOURCE:
306 if ((*pp_rec = SDP_FindServiceInDb(p_mcb->p_db, service_uuid,
313 if (((*pp_rec = bta_hl_find_sink_or_src_srv_class_in_db(p_mcb->p_db,
323 /*******************************************************************************
325 ** Function bta_hl_get_service_uuids
328 ** Description This function finds the service class(es) for both CCH and DCH oeprations
330 ** Returns UINT16 - service_id
331 ** if service_uuid = 0xFFFF then it means service uuid
332 ** can be either Sink or Source
334 *******************************************************************************/
335 UINT16 bta_hl_get_service_uuids(UINT8 sdp_oper, UINT8 app_idx, UINT8 mcl_idx,
338 tBTA_HL_MDL_CB *p_dcb;
339 UINT16 service_uuid = 0xFFFF; /* both Sink and Source */
344 case BTA_HL_SDP_OP_DCH_OPEN_INIT:
345 case BTA_HL_SDP_OP_DCH_RECONNECT_INIT:
346 p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
347 if (p_dcb->local_mdep_id != BTA_HL_ECHO_TEST_MDEP_ID)
349 if (p_dcb->peer_mdep_role == BTA_HL_MDEP_ROLE_SINK)
351 service_uuid = UUID_SERVCLASS_HDP_SINK;
355 service_uuid = UUID_SERVCLASS_HDP_SOURCE;
359 case BTA_HL_SDP_OP_CCH_INIT:
361 /* use default that is both Sink and Source */
364 #if BTA_HL_DEBUG == TRUE
365 APPL_TRACE_DEBUG("bta_hl_get_service_uuids service_uuid=0x%x",service_uuid );
370 /*******************************************************************************
372 ** Function bta_hl_find_echo_cfg_rsp
375 ** Description This function finds the configuration response for the echo test
377 ** Returns BOOLEAN - TRUE found
380 *******************************************************************************/
381 BOOLEAN bta_hl_find_echo_cfg_rsp(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdep_idx, UINT8 cfg,
384 tBTA_HL_APP_CB *p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
385 tBTA_HL_MDEP *p_mdep= &p_acb->sup_feature.mdep[mdep_idx];
386 BOOLEAN status =TRUE;
388 if (p_mdep->mdep_id == BTA_HL_ECHO_TEST_MDEP_ID)
390 if ((cfg == BTA_HL_DCH_CFG_RELIABLE) || (cfg == BTA_HL_DCH_CFG_STREAMING))
394 else if (cfg == BTA_HL_DCH_CFG_NO_PREF )
396 *p_cfg_rsp = BTA_HL_DEFAULT_ECHO_TEST_SRC_DCH_CFG;
401 APPL_TRACE_ERROR("Inavlid echo cfg value");
406 #if BTA_HL_DEBUG == TRUE
409 APPL_TRACE_DEBUG("bta_hl_find_echo_cfg_rsp status=failed app_idx=%d mcl_idx=%d mdep_idx=%d cfg=%d",
410 app_idx, mcl_idx, mdep_idx, cfg);
417 /*******************************************************************************
419 ** Function bta_hl_validate_dch_cfg
421 ** Description This function validate the DCH configuration
423 ** Returns BOOLEAN - TRUE cfg is valid
426 *******************************************************************************/
427 BOOLEAN bta_hl_validate_cfg(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx,
430 tBTA_HL_MDL_CB *p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
431 BOOLEAN is_valid =FALSE;
434 if (!bta_hl_is_the_first_reliable_existed(app_idx, mcl_idx) &&
435 (cfg != BTA_HL_DCH_CFG_RELIABLE))
437 APPL_TRACE_ERROR("the first DCH should be a reliable channel");
441 switch (p_dcb->local_cfg)
443 case BTA_HL_DCH_CFG_NO_PREF:
445 if ((cfg == BTA_HL_DCH_CFG_RELIABLE) || (cfg == BTA_HL_DCH_CFG_STREAMING))
450 case BTA_HL_DCH_CFG_RELIABLE:
451 case BTA_HL_DCH_CFG_STREAMING:
452 if (p_dcb->local_cfg == cfg )
461 #if BTA_HL_DEBUG == TRUE
464 APPL_TRACE_DEBUG("bta_hl_validate_dch_open_cfg is_valid=%d, cfg=%d", is_valid, cfg );
470 /*******************************************************************************
472 ** Function bta_hl_find_cch_cb_indexes
474 ** Description This function finds the indexes needed for the CCH state machine
476 ** Returns BOOLEAN - TRUE found
479 *******************************************************************************/
480 BOOLEAN bta_hl_find_cch_cb_indexes(tBTA_HL_DATA *p_msg,
484 BOOLEAN found = FALSE;
485 tBTA_HL_MCL_CB *p_mcb;
486 UINT8 app_idx = 0, mcl_idx = 0;
488 switch (p_msg->hdr.event)
490 case BTA_HL_CCH_SDP_OK_EVT:
491 case BTA_HL_CCH_SDP_FAIL_EVT:
492 app_idx = p_msg->cch_sdp.app_idx;
493 mcl_idx = p_msg->cch_sdp.mcl_idx;
497 case BTA_HL_MCA_CONNECT_IND_EVT:
499 if (bta_hl_find_app_idx_using_handle(p_msg->mca_evt.app_handle, &app_idx))
501 if (bta_hl_find_mcl_idx(app_idx, p_msg->mca_evt.mca_data.connect_ind.bd_addr, &mcl_idx))
503 /* local initiated */
506 else if (!bta_hl_find_mcl_idx_using_handle(p_msg->mca_evt.mcl_handle, &app_idx, &mcl_idx)&&
507 bta_hl_find_avail_mcl_idx(app_idx, &mcl_idx))
509 /* remote initiated */
510 p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
511 p_mcb->in_use = TRUE;
512 p_mcb->cch_oper = BTA_HL_CCH_OP_REMOTE_OPEN;
518 case BTA_HL_MCA_DISCONNECT_IND_EVT:
520 if (bta_hl_find_mcl_idx_using_handle(p_msg->mca_evt.mcl_handle, &app_idx, &mcl_idx))
524 else if (bta_hl_find_app_idx_using_handle(p_msg->mca_evt.app_handle, &app_idx) &&
525 bta_hl_find_mcl_idx(app_idx, p_msg->mca_evt.mca_data.disconnect_ind.bd_addr, &mcl_idx))
532 p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
533 if ((p_mcb->cch_oper != BTA_HL_CCH_OP_LOCAL_CLOSE) && (p_mcb->cch_oper != BTA_HL_CCH_OP_LOCAL_OPEN) )
535 p_mcb->cch_oper = BTA_HL_CCH_OP_REMOTE_CLOSE;
540 case BTA_HL_MCA_RSP_TOUT_IND_EVT:
542 if (bta_hl_find_mcl_idx_using_handle(p_msg->mca_evt.mcl_handle, &app_idx, &mcl_idx))
549 p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
550 if ((p_mcb->cch_oper != BTA_HL_CCH_OP_REMOTE_CLOSE) && (p_mcb->cch_oper != BTA_HL_CCH_OP_LOCAL_OPEN))
552 p_mcb->cch_oper = BTA_HL_CCH_OP_LOCAL_CLOSE;
563 *p_app_idx = app_idx;
564 *p_mcl_idx = mcl_idx;
567 #if BTA_HL_DEBUG == TRUE
570 APPL_TRACE_DEBUG("bta_hl_find_cch_cb_indexes event=%s found=%d app_idx=%d mcl_idx=%d",
571 bta_hl_evt_code(p_msg->hdr.event), found, app_idx, mcl_idx);
578 /*******************************************************************************
580 ** Function bta_hl_find_dch_cb_indexes
582 ** Description This function finds the indexes needed for the DCH state machine
584 ** Returns BOOLEAN - TRUE found
587 *******************************************************************************/
588 BOOLEAN bta_hl_find_dch_cb_indexes(tBTA_HL_DATA *p_msg,
593 BOOLEAN found = FALSE;
594 tBTA_HL_MCL_CB *p_mcb;
595 UINT8 app_idx = 0, mcl_idx = 0, mdl_idx = 0;
597 switch (p_msg->hdr.event)
599 case BTA_HL_MCA_CREATE_CFM_EVT:
600 if (bta_hl_find_mcl_idx_using_handle(p_msg->mca_evt.mcl_handle, &app_idx, &mcl_idx) &&
601 bta_hl_find_mdl_idx( app_idx, mcl_idx, p_msg->mca_evt.mca_data.create_cfm.mdl_id, &mdl_idx))
607 case BTA_HL_MCA_CREATE_IND_EVT:
608 case BTA_HL_MCA_RECONNECT_IND_EVT:
609 if (bta_hl_find_mcl_idx_using_handle(p_msg->mca_evt.mcl_handle, &app_idx, &mcl_idx) &&
610 bta_hl_find_avail_mdl_idx( app_idx, mcl_idx, &mdl_idx))
616 case BTA_HL_MCA_OPEN_CFM_EVT:
617 if (bta_hl_find_mcl_idx_using_handle(p_msg->mca_evt.mcl_handle, &app_idx, &mcl_idx) &&
618 bta_hl_find_mdl_idx( app_idx, mcl_idx, p_msg->mca_evt.mca_data.open_cfm.mdl_id, &mdl_idx))
624 case BTA_HL_MCA_OPEN_IND_EVT:
625 if (bta_hl_find_mcl_idx_using_handle(p_msg->mca_evt.mcl_handle, &app_idx, &mcl_idx) &&
626 bta_hl_find_mdl_idx( app_idx, mcl_idx, p_msg->mca_evt.mca_data.open_ind.mdl_id, &mdl_idx))
632 case BTA_HL_MCA_CLOSE_CFM_EVT:
634 if (bta_hl_find_mdl_idx_using_handle((tBTA_HL_MDL_HANDLE)p_msg->mca_evt.mca_data.close_cfm.mdl,
635 &app_idx, &mcl_idx, &mdl_idx))
640 case BTA_HL_MCA_CLOSE_IND_EVT:
642 if (bta_hl_find_mdl_idx_using_handle((tBTA_HL_MDL_HANDLE)p_msg->mca_evt.mca_data.close_ind.mdl,
643 &app_idx, &mcl_idx, &mdl_idx))
648 case BTA_HL_API_SEND_DATA_EVT:
650 if (bta_hl_find_mdl_idx_using_handle(p_msg->api_send_data.mdl_handle,
651 &app_idx, &mcl_idx, &mdl_idx ))
658 case BTA_HL_MCA_CONG_CHG_EVT:
660 if (bta_hl_find_mdl_idx_using_handle((tBTA_HL_MDL_HANDLE)p_msg->mca_evt.mca_data.cong_chg.mdl,
661 &app_idx, &mcl_idx, &mdl_idx ))
668 case BTA_HL_MCA_RCV_DATA_EVT:
669 app_idx = p_msg->mca_rcv_data_evt.app_idx;
670 mcl_idx = p_msg->mca_rcv_data_evt.mcl_idx;
671 mdl_idx = p_msg->mca_rcv_data_evt.mdl_idx;
674 case BTA_HL_DCH_RECONNECT_EVT:
675 case BTA_HL_DCH_OPEN_EVT:
676 case BTA_HL_DCH_ECHO_TEST_EVT:
677 case BTA_HL_DCH_SDP_FAIL_EVT:
678 app_idx = p_msg->dch_sdp.app_idx;
679 mcl_idx = p_msg->dch_sdp.mcl_idx;
680 mdl_idx = p_msg->dch_sdp.mdl_idx;
683 case BTA_HL_MCA_RECONNECT_CFM_EVT:
684 if (bta_hl_find_mcl_idx_using_handle(p_msg->mca_evt.mcl_handle, &app_idx, &mcl_idx) &&
685 bta_hl_find_mdl_idx( app_idx, mcl_idx, p_msg->mca_evt.mca_data.reconnect_cfm.mdl_id, &mdl_idx))
692 case BTA_HL_API_DCH_CREATE_RSP_EVT:
693 if (bta_hl_find_mcl_idx_using_handle(p_msg->api_dch_create_rsp.mcl_handle, &app_idx, &mcl_idx)&&
694 bta_hl_find_mdl_idx( app_idx, mcl_idx,p_msg->api_dch_create_rsp.mdl_id, &mdl_idx))
699 case BTA_HL_MCA_ABORT_IND_EVT:
700 if (bta_hl_find_mcl_idx_using_handle(p_msg->mca_evt.mcl_handle, &app_idx, &mcl_idx) &&
701 bta_hl_find_mdl_idx( app_idx, mcl_idx,p_msg->mca_evt.mca_data.abort_ind.mdl_id, &mdl_idx))
706 case BTA_HL_MCA_ABORT_CFM_EVT:
707 if (bta_hl_find_mcl_idx_using_handle(p_msg->mca_evt.mcl_handle, &app_idx, &mcl_idx) &&
708 bta_hl_find_mdl_idx( app_idx, mcl_idx, p_msg->mca_evt.mca_data.abort_cfm.mdl_id, &mdl_idx))
713 case BTA_HL_CI_GET_TX_DATA_EVT:
714 case BTA_HL_CI_PUT_RX_DATA_EVT:
715 if (bta_hl_find_mdl_idx_using_handle(p_msg->ci_get_put_data.mdl_handle, &app_idx, &mcl_idx, &mdl_idx))
720 case BTA_HL_CI_GET_ECHO_DATA_EVT:
721 case BTA_HL_CI_PUT_ECHO_DATA_EVT:
722 if (bta_hl_find_mcl_idx_using_handle(p_msg->ci_get_put_echo_data.mcl_handle, &app_idx, &mcl_idx))
724 p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
725 mdl_idx = p_mcb->echo_mdl_idx;
737 *p_app_idx = app_idx;
738 *p_mcl_idx = mcl_idx;
739 *p_mdl_idx = mdl_idx;
741 #if BTA_HL_DEBUG == TRUE
744 APPL_TRACE_DEBUG("bta_hl_find_dch_cb_indexes event=%s found=%d app_idx=%d mcl_idx=%d mdl_idx=%d",
745 bta_hl_evt_code(p_msg->hdr.event), found, *p_app_idx, *p_mcl_idx, *p_mdl_idx );
752 /*******************************************************************************
754 ** Function bta_hl_allocate_mdl_id
756 ** Description This function allocates a MDL ID
758 ** Returns UINT16 - MDL ID
760 *******************************************************************************/
761 UINT16 bta_hl_allocate_mdl_id(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx )
764 tBTA_HL_MCL_CB *p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
765 BOOLEAN duplicate_id;
766 UINT8 i, mdl_cfg_idx;
770 duplicate_id = FALSE;
771 mdl_id = ((mdl_id+1) & 0xFEFF);
772 /* check mdl_ids that are used for the current conenctions */
773 for (i=0; i< BTA_HL_NUM_MDLS_PER_MCL; i++)
775 if (p_mcb->mdl[i].in_use &&
777 (p_mcb->mdl[i].mdl_id == mdl_id) )
786 /* start from the beginning to get another MDL value*/
791 /* check mdl_ids that are stored in the persistent memory */
792 if (bta_hl_find_mdl_cfg_idx(app_idx,mcl_idx, mdl_id, &mdl_cfg_idx))
798 /* found a new MDL value */
805 #if BTA_HL_DEBUG == TRUE
806 APPL_TRACE_DEBUG("bta_hl_allocate_mdl OK mdl_id=%d", mdl_id);
810 /*******************************************************************************
812 ** Function bta_hl_find_mdl_idx
814 ** Description This function finds the MDL index based on mdl_id
816 ** Returns BOOLEAN TRUE-found
818 *******************************************************************************/
819 BOOLEAN bta_hl_find_mdl_idx(UINT8 app_idx, UINT8 mcl_idx, UINT16 mdl_id,
822 tBTA_HL_MCL_CB *p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
826 for (i=0; i < BTA_HL_NUM_MDLS_PER_MCL ; i ++)
828 if (p_mcb->mdl[i].in_use &&
830 (p_mcb->mdl[i].mdl_id== mdl_id))
838 #if BTA_HL_DEBUG == TRUE
841 APPL_TRACE_DEBUG("bta_hl_find_mdl_idx found=%d mdl_id=%d mdl_idx=%d ",
849 /*******************************************************************************
851 ** Function bta_hl_find_an_active_mdl_idx
853 ** Description This function finds an active MDL
855 ** Returns BOOLEAN TRUE-found
857 *******************************************************************************/
858 BOOLEAN bta_hl_find_an_active_mdl_idx(UINT8 app_idx, UINT8 mcl_idx,
861 tBTA_HL_MCL_CB *p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
865 for (i=0; i < BTA_HL_NUM_MDLS_PER_MCL ; i ++)
867 if (p_mcb->mdl[i].in_use &&
868 (p_mcb->mdl[i].dch_state == BTA_HL_DCH_OPEN_ST))
876 #if BTA_HL_DEBUG == TRUE
879 APPL_TRACE_DEBUG("bta_hl_find_an_opened_mdl_idx found=%d app_idx=%d mcl_idx=%d mdl_idx=%d",
880 found, app_idx, mcl_idx, i);
887 /*******************************************************************************
889 ** Function bta_hl_find_dch_setup_mdl_idx
891 ** Description This function finds a MDL which in the DCH setup state
893 ** Returns BOOLEAN TRUE-found
895 *******************************************************************************/
896 BOOLEAN bta_hl_find_dch_setup_mdl_idx(UINT8 app_idx, UINT8 mcl_idx,
899 tBTA_HL_MCL_CB *p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
903 for (i=0; i < BTA_HL_NUM_MDLS_PER_MCL ; i ++)
905 if (p_mcb->mdl[i].in_use &&
906 (p_mcb->mdl[i].dch_state == BTA_HL_DCH_OPENING_ST))
914 #if BTA_HL_DEBUG == TRUE
917 APPL_TRACE_DEBUG("bta_hl_find_dch_setup_mdl_idx found=%d app_idx=%d mcl_idx=%d mdl_idx=%d",
918 found, app_idx, mcl_idx, i);
925 /*******************************************************************************
927 ** Function bta_hl_find_an_in_use_mcl_idx
929 ** Description This function finds an in-use MCL control block index
931 ** Returns BOOLEAN TRUE-found
933 *******************************************************************************/
934 BOOLEAN bta_hl_find_an_in_use_mcl_idx(UINT8 app_idx,
937 tBTA_HL_MCL_CB *p_mcb;
941 for (i=0; i < BTA_HL_NUM_MCLS ; i ++)
943 p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, i);
945 (p_mcb->cch_state != BTA_HL_CCH_IDLE_ST))
953 #if BTA_HL_DEBUG == TRUE
956 APPL_TRACE_DEBUG("bta_hl_find_an_in_use_mcl_idx found=%d app_idx=%d mcl_idx=%d ",
965 /*******************************************************************************
967 ** Function bta_hl_find_an_in_use_app_idx
969 ** Description This function finds an in-use application control block index
971 ** Returns BOOLEAN TRUE-found
973 *******************************************************************************/
974 BOOLEAN bta_hl_find_an_in_use_app_idx(UINT8 *p_app_idx)
976 tBTA_HL_APP_CB *p_acb ;
980 for (i=0; i < BTA_HL_NUM_APPS ; i ++)
982 p_acb = BTA_HL_GET_APP_CB_PTR(i);
991 #if BTA_HL_DEBUG == TRUE
994 APPL_TRACE_DEBUG("bta_hl_find_an_in_use_app_idx found=%d app_idx=%d ",
1001 /*******************************************************************************
1003 ** Function bta_hl_find_app_idx
1005 ** Description This function finds the application control block index based on
1006 ** the application ID
1008 ** Returns BOOLEAN TRUE-found
1010 *******************************************************************************/
1011 BOOLEAN bta_hl_find_app_idx(UINT8 app_id, UINT8 *p_app_idx)
1013 BOOLEAN found=FALSE;
1016 for (i=0; i < BTA_HL_NUM_APPS ; i ++)
1018 if (bta_hl_cb.acb[i].in_use &&
1019 (bta_hl_cb.acb[i].app_id == app_id))
1027 #if BTA_HL_DEBUG == TRUE
1028 APPL_TRACE_DEBUG("bta_hl_find_app_idx found=%d app_id=%d idx=%d ",
1036 /*******************************************************************************
1038 ** Function bta_hl_find_app_idx_using_handle
1040 ** Description This function finds the application control block index based on
1041 ** the application handle
1043 ** Returns BOOLEAN TRUE-found
1045 *******************************************************************************/
1046 BOOLEAN bta_hl_find_app_idx_using_handle(tBTA_HL_APP_HANDLE app_handle,
1049 BOOLEAN found=FALSE;
1052 for (i=0; i < BTA_HL_NUM_APPS ; i ++)
1054 if (bta_hl_cb.acb[i].in_use &&
1055 (bta_hl_cb.acb[i].app_handle == app_handle))
1063 #if BTA_HL_DEBUG == TRUE
1066 APPL_TRACE_DEBUG("bta_hl_find_app_idx_using_mca_handle status=%d handle=%d app_idx=%d ",
1067 found, app_handle , i);
1075 /*******************************************************************************
1077 ** Function bta_hl_find_mcl_idx_using_handle
1079 ** Description This function finds the MCL control block index based on
1082 ** Returns BOOLEAN TRUE-found
1084 *******************************************************************************/
1085 BOOLEAN bta_hl_find_mcl_idx_using_handle( tBTA_HL_MCL_HANDLE mcl_handle,
1086 UINT8 *p_app_idx, UINT8 *p_mcl_idx)
1088 tBTA_HL_APP_CB *p_acb;
1089 BOOLEAN found=FALSE;
1092 for (i=0; i<BTA_HL_NUM_APPS; i++)
1094 p_acb = BTA_HL_GET_APP_CB_PTR(i);
1097 for (j=0; j < BTA_HL_NUM_MCLS ; j++)
1099 if ( p_acb->mcb[j].mcl_handle == mcl_handle )
1110 #if BTA_HL_DEBUG == TRUE
1113 APPL_TRACE_DEBUG("bta_hl_find_mcl_idx_using_handle found=%d app_idx=%d mcl_idx=%d",
1120 /*******************************************************************************
1122 ** Function bta_hl_find_mcl_idx
1124 ** Description This function finds the MCL control block index based on
1125 ** the peer BD address
1127 ** Returns BOOLEAN TRUE-found
1129 *******************************************************************************/
1130 BOOLEAN bta_hl_find_mcl_idx(UINT8 app_idx, BD_ADDR p_bd_addr, UINT8 *p_mcl_idx)
1132 BOOLEAN found=FALSE;
1135 for (i=0; i < BTA_HL_NUM_MCLS ; i ++)
1137 if (bta_hl_cb.acb[app_idx].mcb[i].in_use &&
1138 (!memcmp (bta_hl_cb.acb[app_idx].mcb[i].bd_addr, p_bd_addr, BD_ADDR_LEN)))
1146 #if BTA_HL_DEBUG == TRUE
1149 APPL_TRACE_DEBUG("bta_hl_find_mcl_idx found=%d idx=%d",
1158 /*******************************************************************************
1160 ** Function bta_hl_find_mdl_idx_using_handle
1162 ** Description This function finds the MDL control block index based on
1165 ** Returns BOOLEAN TRUE-found
1167 *******************************************************************************/
1168 BOOLEAN bta_hl_find_mdl_idx_using_handle(tBTA_HL_MDL_HANDLE mdl_handle,
1169 UINT8 *p_app_idx,UINT8 *p_mcl_idx,
1172 tBTA_HL_APP_CB *p_acb;
1173 tBTA_HL_MCL_CB *p_mcb;
1174 tBTA_HL_MDL_CB *p_dcb;
1175 BOOLEAN found=FALSE;
1178 for (i=0; i < BTA_HL_NUM_APPS ; i ++)
1180 p_acb = BTA_HL_GET_APP_CB_PTR(i);
1183 for (j=0; j< BTA_HL_NUM_MCLS; j++)
1185 p_mcb = BTA_HL_GET_MCL_CB_PTR(i,j);
1188 for (k=0; k< BTA_HL_NUM_MDLS_PER_MCL; k++)
1190 p_dcb = BTA_HL_GET_MDL_CB_PTR(i,j,k);
1193 if (p_dcb->mdl_handle == mdl_handle)
1209 #if BTA_HL_DEBUG == TRUE
1212 APPL_TRACE_DEBUG("bta_hl_find_mdl_idx_using_handle found=%d mdl_handle=%d ",
1218 /*******************************************************************************
1220 ** Function bta_hl_is_the_first_reliable_existed
1222 ** Description This function checks whether the first reliable DCH channel
1223 ** has been setup on the MCL or not
1225 ** Returns BOOLEAN - TRUE exist
1226 ** FALSE does not exist
1228 *******************************************************************************/
1229 BOOLEAN bta_hl_is_the_first_reliable_existed(UINT8 app_idx, UINT8 mcl_idx )
1231 tBTA_HL_MCL_CB *p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
1232 BOOLEAN is_existed =FALSE;
1235 for (i=0; i< BTA_HL_NUM_MDLS_PER_MCL; i++)
1237 if (p_mcb->mdl[i].in_use && p_mcb->mdl[i].is_the_first_reliable)
1244 #if BTA_HL_DEBUG == TRUE
1245 APPL_TRACE_DEBUG("bta_hl_is_the_first_reliable_existed is_existed=%d ",is_existed );
1250 /*******************************************************************************
1252 ** Function bta_hl_find_non_active_mdl_cfg
1254 ** Description This function finds a valid MDL configiration index and this
1255 ** MDL ID is not active
1257 ** Returns BOOLEAN - TRUE found
1260 *******************************************************************************/
1261 BOOLEAN bta_hl_find_non_active_mdl_cfg(UINT8 app_idx, UINT8 start_mdl_cfg_idx,
1262 UINT8 *p_mdl_cfg_idx)
1265 tBTA_HL_MCL_CB *p_mcb;
1266 tBTA_HL_MDL_CB *p_dcb;
1267 tBTA_HL_MDL_CFG *p_mdl;
1269 BOOLEAN found = FALSE;
1272 for (i = start_mdl_cfg_idx; i< BTA_HL_NUM_MDL_CFGS; i++)
1275 p_mdl = BTA_HL_GET_MDL_CFG_PTR(app_idx, i);
1276 for (j=0; j< BTA_HL_NUM_MCLS; j++)
1278 p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, j);
1279 if (p_mcb->in_use &&
1280 !memcmp(p_mdl->peer_bd_addr,p_mcb->bd_addr,BD_ADDR_LEN))
1283 for (k=0; k<BTA_HL_NUM_MDLS_PER_MCL; k++)
1285 p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, j, k);
1287 if (p_dcb->in_use && p_mdl->mdl_id == p_dcb->mdl_id)
1312 /*******************************************************************************
1314 ** Function bta_hl_find_mdl_cfg_idx
1316 ** Description This function finds an available MDL configuration index
1318 ** Returns BOOLEAN - TRUE found
1321 *******************************************************************************/
1322 BOOLEAN bta_hl_find_avail_mdl_cfg_idx(UINT8 app_idx, UINT8 mcl_idx,
1323 UINT8 *p_mdl_cfg_idx)
1325 tBTA_HL_MDL_CFG *p_mdl, *p_mdl1, *p_mdl2;
1327 BOOLEAN found=FALSE;
1328 UINT8 first_mdl_cfg_idx, second_mdl_cfg_idx, older_mdl_cfg_idx;
1332 for (i=0; i< BTA_HL_NUM_MDL_CFGS; i++)
1334 p_mdl = BTA_HL_GET_MDL_CFG_PTR(app_idx, i);
1335 if (!p_mdl->active )
1337 /* found an unused space to store mdl cfg*/
1346 /* all available mdl cfg spaces are in use so we need to find the mdl cfg which is
1347 not currently in use and has the the oldest time stamp to remove*/
1350 if (bta_hl_find_non_active_mdl_cfg(app_idx,0, &first_mdl_cfg_idx))
1352 if (bta_hl_find_non_active_mdl_cfg(app_idx,(UINT8) (first_mdl_cfg_idx+1), &second_mdl_cfg_idx))
1357 p_mdl1 = BTA_HL_GET_MDL_CFG_PTR(app_idx, first_mdl_cfg_idx);
1358 p_mdl2 = BTA_HL_GET_MDL_CFG_PTR(app_idx, second_mdl_cfg_idx);
1360 if (p_mdl1->time < p_mdl2->time)
1362 older_mdl_cfg_idx = first_mdl_cfg_idx;
1366 older_mdl_cfg_idx = second_mdl_cfg_idx;
1369 if (bta_hl_find_non_active_mdl_cfg(app_idx,(UINT8) (second_mdl_cfg_idx+1), &second_mdl_cfg_idx))
1371 first_mdl_cfg_idx = older_mdl_cfg_idx;
1379 *p_mdl_cfg_idx = older_mdl_cfg_idx;
1384 *p_mdl_cfg_idx = first_mdl_cfg_idx;
1394 #if BTA_HL_DEBUG == TRUE
1397 APPL_TRACE_DEBUG("bta_hl_find_avail_mdl_cfg_idx found=%d mdl_cfg_idx=%d ",found, *p_mdl_cfg_idx );
1406 /*******************************************************************************
1408 ** Function bta_hl_find_mdl_cfg_idx
1410 ** Description This function finds the MDL configuration index based on
1413 ** Returns BOOLEAN - TRUE found
1416 *******************************************************************************/
1417 BOOLEAN bta_hl_find_mdl_cfg_idx(UINT8 app_idx, UINT8 mcl_idx,
1418 tBTA_HL_MDL_ID mdl_id, UINT8 *p_mdl_cfg_idx)
1420 tBTA_HL_MCL_CB *p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
1421 tBTA_HL_MDL_CFG *p_mdl;
1423 BOOLEAN found=FALSE;
1426 for (i=0; i< BTA_HL_NUM_MDL_CFGS; i++)
1428 p_mdl = BTA_HL_GET_MDL_CFG_PTR(app_idx, i);
1430 APPL_TRACE_DEBUG("bta_hl_find_mdl_cfg_idx: mdl_id =%d, p_mdl->mdl_id=%d",mdl_id,
1432 if (p_mdl->active &&
1433 (!memcmp (p_mcb->bd_addr, p_mdl->peer_bd_addr, BD_ADDR_LEN))&&
1434 (p_mdl->mdl_id == mdl_id))
1442 #if BTA_HL_DEBUG == TRUE
1445 APPL_TRACE_DEBUG("bta_hl_find_mdl_cfg_idx found=%d mdl_cfg_idx=%d ",found, i );
1455 /*******************************************************************************
1457 ** Function bta_hl_get_cur_time
1459 ** Description This function get the cuurent time value
1461 ** Returns BOOLEAN - TRUE found
1464 *******************************************************************************/
1465 BOOLEAN bta_hl_get_cur_time(UINT8 app_idx, UINT8 *p_cur_time)
1467 tBTA_HL_MDL_CFG *p_mdl;
1468 UINT8 i, j, time_latest, time;
1469 BOOLEAN found=FALSE, result=TRUE;
1471 for (i=0; i< BTA_HL_NUM_MDL_CFGS; i++)
1473 p_mdl = BTA_HL_GET_MDL_CFG_PTR(app_idx, i);
1477 time_latest = p_mdl->time;
1478 for (j=(i+1); j< BTA_HL_NUM_MDL_CFGS; j++ )
1480 p_mdl = BTA_HL_GET_MDL_CFG_PTR(app_idx, j);
1484 if (time > time_latest)
1497 if (time_latest < BTA_HL_MAX_TIME)
1499 *p_cur_time = time_latest+1;
1503 /* need to wrap around */
1509 *p_cur_time = BTA_HL_MIN_TIME;
1512 #if BTA_HL_DEBUG == TRUE
1515 APPL_TRACE_DEBUG("bta_hl_get_cur_time result=%s cur_time=%d",
1516 (result?"OK":"FAIL"), *p_cur_time);
1523 /*******************************************************************************
1525 ** Function bta_hl_sort_cfg_time_idx
1527 ** Description This function sort the mdl configuration idx stored in array a
1528 ** based on decending time value
1530 ** Returns BOOLEAN - TRUE found
1533 *******************************************************************************/
1534 void bta_hl_sort_cfg_time_idx(UINT8 app_idx, UINT8 *a, UINT8 n)
1536 tBTA_HL_APP_CB *p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
1537 UINT8 temp_time, temp_idx;
1539 for (i = 1; i < n; ++i)
1542 temp_time = p_acb->mdl_cfg[temp_idx].time;
1544 while ((j >= 0) && (temp_time < p_acb->mdl_cfg[a[j]].time))
1549 a[j + 1] = temp_idx;
1553 /*******************************************************************************
1555 ** Function bta_hl_compact_mdl_cfg_time
1557 ** Description This function finds the MDL configuration index based on
1560 ** Returns BOOLEAN - TRUE found
1563 *******************************************************************************/
1564 void bta_hl_compact_mdl_cfg_time(UINT8 app_idx, UINT8 mdep_id)
1566 tBTA_HL_MDL_CFG *p_mdl;
1567 UINT8 i, time_min, cnt=0;
1568 UINT8 s_arr[BTA_HL_NUM_MDL_CFGS];
1571 for (i=0; i< BTA_HL_NUM_MDL_CFGS; i++)
1573 p_mdl = BTA_HL_GET_MDL_CFG_PTR(app_idx, i);
1583 #if BTA_HL_DEBUG == TRUE
1584 APPL_TRACE_DEBUG("bta_hl_compact_mdl_cfg_time cnt=%d ",cnt );
1590 bta_hl_sort_cfg_time_idx(app_idx, s_arr, cnt);
1591 time_min = BTA_HL_MIN_TIME;
1592 for (i=0;i<cnt; i++)
1594 p_mdl = BTA_HL_GET_MDL_CFG_PTR(app_idx, s_arr[i]);
1595 p_mdl->time = time_min + i;
1596 bta_hl_co_save_mdl(mdep_id, s_arr[i], p_mdl);
1605 /*******************************************************************************
1607 ** Function bta_hl_is_mdl_exsit_in_mcl
1609 ** Description This function checks whether the MDL ID
1610 ** has already existed in teh MCL or not
1612 ** Returns BOOLEAN - TRUE exist
1613 ** FALSE does not exist
1615 *******************************************************************************/
1616 BOOLEAN bta_hl_is_mdl_exsit_in_mcl(UINT8 app_idx, BD_ADDR bd_addr,
1617 tBTA_HL_MDL_ID mdl_id)
1619 tBTA_HL_MDL_CFG *p_mdl;
1620 BOOLEAN found = FALSE;
1623 for (i = 0; i< BTA_HL_NUM_MDL_CFGS; i++)
1625 p_mdl = BTA_HL_GET_MDL_CFG_PTR(app_idx, i);
1626 if (p_mdl->active &&
1627 !memcmp(p_mdl->peer_bd_addr, bd_addr,BD_ADDR_LEN))
1629 if (mdl_id != BTA_HL_DELETE_ALL_MDL_IDS)
1631 if (p_mdl->mdl_id == mdl_id)
1648 /*******************************************************************************
1650 ** Function bta_hl_delete_mdl_cfg
1652 ** Description This function delete the specified MDL ID
1654 ** Returns BOOLEAN - TRUE Success
1657 *******************************************************************************/
1658 BOOLEAN bta_hl_delete_mdl_cfg(UINT8 app_idx, BD_ADDR bd_addr,
1659 tBTA_HL_MDL_ID mdl_id)
1661 tBTA_HL_MDL_CFG *p_mdl;
1662 BOOLEAN success = FALSE;
1665 for (i = 0; i< BTA_HL_NUM_MDL_CFGS; i++)
1667 p_mdl = BTA_HL_GET_MDL_CFG_PTR(app_idx, i);
1668 if (p_mdl->active &&
1669 !memcmp(p_mdl->peer_bd_addr, bd_addr,BD_ADDR_LEN))
1671 if (mdl_id != BTA_HL_DELETE_ALL_MDL_IDS)
1673 if (p_mdl->mdl_id == mdl_id)
1675 bta_hl_co_delete_mdl(p_mdl->local_mdep_id, i);
1676 memset(p_mdl, 0, sizeof(tBTA_HL_MDL_CFG));
1683 bta_hl_co_delete_mdl(p_mdl->local_mdep_id, i);
1684 memset(p_mdl, 0, sizeof(tBTA_HL_MDL_CFG));
1694 /*******************************************************************************
1696 ** Function bta_hl_is_mdl_value_valid
1699 ** Description This function checks the specified MDL ID is in valid range or not
1701 ** Returns BOOLEAN - TRUE Success
1704 ** note: mdl_id range 0x0000 reserved,
1705 ** 0x0001-oxFEFF dynamic range,
1706 ** 0xFF00-0xFFFE reserved,
1707 ** 0xFFFF indicates all MDLs (for delete operation only)
1709 *******************************************************************************/
1710 BOOLEAN bta_hl_is_mdl_value_valid(tBTA_HL_MDL_ID mdl_id)
1712 BOOLEAN status = TRUE;
1714 if (mdl_id != BTA_HL_DELETE_ALL_MDL_IDS)
1718 if (mdl_id > BTA_HL_MAX_MDL_VAL )
1732 /*******************************************************************************
1734 ** Function bta_hl_find_mdep_cfg_idx
1736 ** Description This function finds the MDEP configuration index based
1737 ** on the local MDEP ID
1739 ** Returns BOOLEAN - TRUE found
1742 *******************************************************************************/
1743 BOOLEAN bta_hl_find_mdep_cfg_idx(UINT8 app_idx, tBTA_HL_MDEP_ID local_mdep_id,
1744 UINT8 *p_mdep_cfg_idx)
1746 tBTA_HL_APP_CB *p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
1747 tBTA_HL_SUP_FEATURE *p_sup_feature= &p_acb->sup_feature;
1748 BOOLEAN found =FALSE;
1751 for (i=0; i< p_sup_feature->num_of_mdeps; i++)
1753 if ( p_sup_feature->mdep[i].mdep_id == local_mdep_id)
1756 *p_mdep_cfg_idx = i;
1761 #if BTA_HL_DEBUG == TRUE
1764 APPL_TRACE_DEBUG("bta_hl_find_mdep_cfg_idx found=%d mdep_idx=%d local_mdep_id=%d ",
1765 found,i, local_mdep_id );
1772 /*******************************************************************************
1774 ** Function bta_hl_find_rxtx_apdu_size
1776 ** Description This function finds the maximum APDU rx and tx sizes based on
1777 ** the MDEP configuration data
1781 *******************************************************************************/
1782 void bta_hl_find_rxtx_apdu_size(UINT8 app_idx, UINT8 mdep_cfg_idx,
1783 UINT16 *p_rx_apu_size,
1784 UINT16 *p_tx_apu_size)
1786 tBTA_HL_APP_CB *p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
1787 tBTA_HL_MDEP_CFG *p_mdep_cfg;
1789 UINT16 max_rx_apdu_size=0, max_tx_apdu_size=0;
1791 p_mdep_cfg = &p_acb->sup_feature.mdep[mdep_cfg_idx].mdep_cfg;
1794 for (i=0; i< p_mdep_cfg->num_of_mdep_data_types ; i++)
1797 if (max_rx_apdu_size < p_mdep_cfg->data_cfg[i].max_rx_apdu_size)
1799 max_rx_apdu_size = p_mdep_cfg->data_cfg[i].max_rx_apdu_size;
1802 if (max_tx_apdu_size < p_mdep_cfg->data_cfg[i].max_tx_apdu_size)
1804 max_tx_apdu_size = p_mdep_cfg->data_cfg[i].max_tx_apdu_size;
1809 *p_rx_apu_size = max_rx_apdu_size;
1810 *p_tx_apu_size = max_tx_apdu_size;
1812 #if BTA_HL_DEBUG == TRUE
1813 APPL_TRACE_DEBUG("bta_hl_find_rxtx_apdu_size max_rx_apdu_size=%d max_tx_apdu_size=%d ",
1814 max_rx_apdu_size, max_tx_apdu_size );
1820 /*******************************************************************************
1822 ** Function bta_hl_validate_peer_cfg
1824 ** Description This function validates the peer DCH configuration
1826 ** Returns BOOLEAN - TRUE validation is successful
1827 ** FALSE validation failed
1829 *******************************************************************************/
1830 BOOLEAN bta_hl_validate_peer_cfg(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx,
1831 tBTA_HL_MDEP_ID peer_mdep_id,
1832 tBTA_HL_MDEP_ROLE peer_mdep_role,
1835 tBTA_HL_MCL_CB *p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
1836 tBTA_HL_MDL_CB *p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
1837 tBTA_HL_SDP_REC *p_rec;
1838 BOOLEAN peer_found =FALSE;
1841 APPL_TRACE_DEBUG("bta_hl_validate_peer_cfg sdp_idx=%d app_idx %d", sdp_idx, app_idx);
1844 if (p_dcb->local_mdep_id == BTA_HL_ECHO_TEST_MDEP_ID)
1849 p_rec = &p_mcb->sdp.sdp_rec[sdp_idx];
1850 for (i=0; i< p_rec->num_mdeps; i++)
1852 APPL_TRACE_DEBUG("mdep_id %d peer_mdep_id %d",p_rec->mdep_cfg[i].mdep_id , peer_mdep_id);
1853 APPL_TRACE_DEBUG("mdep_role %d peer_mdep_role %d",p_rec->mdep_cfg[i].mdep_role,
1855 if ( (p_rec->mdep_cfg[i].mdep_id == peer_mdep_id) &&
1856 (p_rec->mdep_cfg[i].mdep_role == peer_mdep_role))
1864 #if BTA_HL_DEBUG == TRUE
1867 APPL_TRACE_DEBUG("bta_hl_validate_peer_cfg failed num_mdeps=%d",p_rec->num_mdeps);
1873 /*******************************************************************************
1875 ** Function bta_hl_chk_local_cfg
1877 ** Description This function check whether the local DCH configuration is OK or not
1879 ** Returns tBTA_HL_STATUS - OK - local DCH configuration is OK
1880 ** NO_FIRST_RELIABLE - the streaming DCH configuration
1881 ** is not OK and it needs to use
1882 ** reliable DCH configuration
1884 *******************************************************************************/
1885 tBTA_HL_STATUS bta_hl_chk_local_cfg(UINT8 app_idx, UINT8 mcl_idx,
1887 tBTA_HL_DCH_CFG local_cfg)
1889 tBTA_HL_APP_CB *p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
1890 tBTA_HL_STATUS status = BTA_HL_STATUS_OK;
1892 if ( mdep_cfg_idx &&
1893 (p_acb->sup_feature.mdep[mdep_cfg_idx].mdep_cfg.mdep_role == BTA_HL_MDEP_ROLE_SOURCE) &&
1894 (!bta_hl_is_the_first_reliable_existed(app_idx, mcl_idx)) &&
1895 (local_cfg != BTA_HL_DCH_CFG_RELIABLE))
1897 status = BTA_HL_STATUS_NO_FIRST_RELIABLE;
1898 APPL_TRACE_ERROR("BTA_HL_STATUS_INVALID_DCH_CFG");
1905 /*******************************************************************************
1907 ** Function bta_hl_validate_reconnect_params
1909 ** Description This function validates the reconnect parameters
1911 ** Returns BOOLEAN - TRUE validation is successful
1912 ** FALSE validation failed
1913 *******************************************************************************/
1914 BOOLEAN bta_hl_validate_reconnect_params(UINT8 app_idx, UINT8 mcl_idx,
1915 tBTA_HL_API_DCH_RECONNECT *p_reconnect,
1916 UINT8 *p_mdep_cfg_idx, UINT8 *p_mdl_cfg_idx)
1918 tBTA_HL_APP_CB *p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
1919 tBTA_HL_SUP_FEATURE *p_sup_feature = &p_acb->sup_feature;
1922 BOOLEAN local_mdep_id_found =FALSE;
1923 BOOLEAN mdl_cfg_found =FALSE;
1924 BOOLEAN status=FALSE;
1925 UINT8 i, in_use_mdl_idx = 0;
1927 #if BTA_HL_DEBUG == TRUE
1928 APPL_TRACE_DEBUG("bta_hl_validate_reconnect_params mdl_id=%d app_idx=%d", p_reconnect->mdl_id, app_idx);
1930 if (bta_hl_find_mdl_cfg_idx(app_idx, mcl_idx, p_reconnect->mdl_id, &mdl_cfg_idx))
1932 mdl_cfg_found = TRUE;
1935 #if BTA_HL_DEBUG == TRUE
1938 APPL_TRACE_DEBUG("mdl_cfg_found not found");
1945 num_mdeps = p_sup_feature->num_of_mdeps;
1946 for (i=0; i< num_mdeps ; i++)
1948 if ( p_sup_feature->mdep[i].mdep_id == p_acb->mdl_cfg[mdl_cfg_idx].local_mdep_id)
1950 local_mdep_id_found = TRUE;
1952 *p_mdl_cfg_idx = mdl_cfg_idx;
1958 #if BTA_HL_DEBUG == TRUE
1959 if (!local_mdep_id_found)
1961 APPL_TRACE_DEBUG("local_mdep_id not found");
1966 if (local_mdep_id_found)
1968 if (!bta_hl_find_mdl_idx(app_idx,mcl_idx, p_reconnect->mdl_id, &in_use_mdl_idx))
1974 APPL_TRACE_ERROR("mdl_id=%d is curreltly in use",p_reconnect->mdl_id);
1978 #if BTA_HL_DEBUG == TRUE
1981 APPL_TRACE_DEBUG("Reconnect validation failed local_mdep_id found=%d mdl_cfg_idx found=%d in_use_mdl_idx=%d ",
1982 local_mdep_id_found, mdl_cfg_found, in_use_mdl_idx);
1988 /*******************************************************************************
1990 ** Function bta_hl_find_avail_mcl_idx
1992 ** Returns BOOLEAN - TRUE found
1995 *******************************************************************************/
1996 BOOLEAN bta_hl_find_avail_mcl_idx(UINT8 app_idx, UINT8 *p_mcl_idx)
1998 BOOLEAN found=FALSE;
2001 for (i=0; i < BTA_HL_NUM_MCLS ; i ++)
2003 if (!bta_hl_cb.acb[app_idx].mcb[i].in_use)
2011 #if BTA_HL_DEBUG == TRUE
2014 APPL_TRACE_DEBUG("bta_hl_find_avail_mcl_idx found=%d idx=%d",
2023 /*******************************************************************************
2025 ** Function bta_hl_find_avail_mdl_idx
2027 ** Description This function finds an available MDL control block index
2029 ** Returns BOOLEAN - TRUE found
2032 *******************************************************************************/
2033 BOOLEAN bta_hl_find_avail_mdl_idx(UINT8 app_idx, UINT8 mcl_idx,
2036 tBTA_HL_MCL_CB *p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
2037 BOOLEAN found=FALSE;
2040 for (i=0; i < BTA_HL_NUM_MDLS_PER_MCL ; i ++)
2042 if (!p_mcb->mdl[i].in_use)
2044 memset((void *)&p_mcb->mdl[i],0, sizeof(tBTA_HL_MDL_CB));
2051 #if BTA_HL_DEBUG == TRUE
2054 APPL_TRACE_DEBUG("bta_hl_find_avail_mdl_idx found=%d idx=%d",
2061 /*******************************************************************************
2063 ** Function bta_hl_is_a_duplicate_id
2065 ** Description This function finds the application has been used or not
2067 ** Returns BOOLEAN - TRUE the app_id is a duplicate ID
2068 ** FALSE not a duplicate ID
2069 *******************************************************************************/
2070 BOOLEAN bta_hl_is_a_duplicate_id(UINT8 app_id)
2072 BOOLEAN is_duplicate=FALSE;
2075 for (i=0; i < BTA_HL_NUM_APPS ; i ++)
2077 if (bta_hl_cb.acb[i].in_use &&
2078 (bta_hl_cb.acb[i].app_id == app_id))
2080 is_duplicate = TRUE;
2086 #if BTA_HL_DEBUG == TRUE
2090 APPL_TRACE_DEBUG("bta_hl_is_a_duplicate_id app_id=%d is_duplicate=%d",
2091 app_id, is_duplicate);
2095 return is_duplicate;
2099 /*******************************************************************************
2101 ** Function bta_hl_find_avail_app_idx
2103 ** Description This function finds an available application control block index
2105 ** Returns BOOLEAN - TRUE found
2108 *******************************************************************************/
2109 BOOLEAN bta_hl_find_avail_app_idx(UINT8 *p_idx)
2111 BOOLEAN found=FALSE;
2114 for (i=0; i < BTA_HL_NUM_APPS ; i ++)
2116 if (!bta_hl_cb.acb[i].in_use)
2124 #if BTA_HL_DEBUG == TRUE
2127 APPL_TRACE_DEBUG("bta_hl_find_avail_app_idx found=%d app_idx=%d",
2134 /*******************************************************************************
2136 ** Function bta_hl_app_update
2138 ** Description This function registers an HDP application MCAP and DP
2140 ** Returns tBTA_HL_STATUS -registration status
2142 *******************************************************************************/
2143 tBTA_HL_STATUS bta_hl_app_update(UINT8 app_id, BOOLEAN is_register)
2145 tBTA_HL_STATUS status = BTA_HL_STATUS_OK;
2146 tBTA_HL_APP_CB *p_acb = BTA_HL_GET_APP_CB_PTR(0);
2148 UINT8 i, mdep_idx, num_of_mdeps;
2149 UINT8 mdep_counter = 0;
2152 #if BTA_HL_DEBUG == TRUE
2153 APPL_TRACE_DEBUG("bta_hl_app_update app_id=%d", app_id);
2158 if ((status == BTA_HL_STATUS_OK) &&
2159 bta_hl_co_get_num_of_mdep(app_id, &num_of_mdeps))
2161 for (i=0; i < num_of_mdeps; i++)
2163 mca_cs.type = MCA_TDEP_DATA;
2164 mca_cs.max_mdl = BTA_HL_NUM_MDLS_PER_MDEP;
2165 mca_cs.p_data_cback = bta_hl_mcap_data_cback;
2166 /* Find the first available mdep index, and create a MDL Endpoint */
2167 // make a function later if needed
2168 for (mdep_idx = 1; mdep_idx < BTA_HL_NUM_MDEPS; mdep_idx++)
2170 if ( p_acb->sup_feature.mdep[mdep_idx].mdep_id == 0)
2172 break; /* We found an available index */
2179 /* If no available MDEPs, return error */
2180 if (mdep_idx == BTA_HL_NUM_MDEPS)
2182 APPL_TRACE_ERROR("bta_hl_app_update: Out of MDEP IDs");
2183 status = BTA_HL_STATUS_MCAP_REG_FAIL;
2186 if (MCA_CreateDep((tMCA_HANDLE)p_acb->app_handle,
2187 &(p_acb->sup_feature.mdep[mdep_idx].mdep_id), &mca_cs) == MCA_SUCCESS)
2189 if (bta_hl_co_get_mdep_config(app_id,
2192 p_acb->sup_feature.mdep[mdep_idx].mdep_id,
2193 &p_acb->sup_feature.mdep[mdep_idx].mdep_cfg))
2195 p_acb->sup_feature.mdep[mdep_idx].ori_app_id = app_id;
2196 APPL_TRACE_DEBUG("mdep idx %d id %d ori_app_id %d num data type %d",mdep_idx,
2197 p_acb->sup_feature.mdep[mdep_idx].mdep_id,
2198 p_acb->sup_feature.mdep[mdep_idx].ori_app_id,
2199 p_acb->sup_feature.mdep[mdep_idx].mdep_cfg.num_of_mdep_data_types);
2200 if (p_acb->sup_feature.mdep[mdep_idx].mdep_cfg.mdep_role ==
2201 BTA_HL_MDEP_ROLE_SOURCE)
2203 p_acb->sup_feature.app_role_mask |= BTA_HL_MDEP_ROLE_MASK_SOURCE;
2205 else if (p_acb->sup_feature.mdep[mdep_idx].mdep_cfg.mdep_role ==
2206 BTA_HL_MDEP_ROLE_SINK)
2208 p_acb->sup_feature.app_role_mask |= BTA_HL_MDEP_ROLE_MASK_SINK;
2212 APPL_TRACE_ERROR("bta_hl_app_registration: Invalid Role %d",
2213 p_acb->sup_feature.mdep[mdep_idx].mdep_cfg.mdep_role);
2214 status = BTA_HL_STATUS_MDEP_CO_FAIL;
2220 APPL_TRACE_ERROR("bta_hl_app_registration: Cfg callout failed");
2221 status = BTA_HL_STATUS_MDEP_CO_FAIL;
2227 APPL_TRACE_ERROR("bta_hl_app_registration: MCA_CreateDep failed");
2228 status = BTA_HL_STATUS_MCAP_REG_FAIL;
2233 p_acb->sup_feature.num_of_mdeps += num_of_mdeps;
2234 APPL_TRACE_DEBUG("num_of_mdeps %d", p_acb->sup_feature.num_of_mdeps);
2236 if ((status == BTA_HL_STATUS_OK) &&
2237 (p_acb->sup_feature.app_role_mask == BTA_HL_MDEP_ROLE_MASK_SOURCE))
2239 p_acb->sup_feature.advertize_source_sdp =
2240 bta_hl_co_advrtise_source_sdp(app_id);
2243 if ((status == BTA_HL_STATUS_OK)&&
2244 (!bta_hl_co_get_echo_config(app_id, &p_acb->sup_feature.echo_cfg)))
2246 status = BTA_HL_STATUS_ECHO_CO_FAIL;
2249 if ((status == BTA_HL_STATUS_OK)&&
2250 (!bta_hl_co_load_mdl_config(app_id, BTA_HL_NUM_MDL_CFGS, &p_acb->mdl_cfg[0])))
2252 status = BTA_HL_STATUS_MDL_CFG_CO_FAIL;
2257 status = BTA_HL_STATUS_MDEP_CO_FAIL;
2262 for (i=1; i<BTA_HL_NUM_MDEPS; i++)
2264 if (p_acb->sup_feature.mdep[i].ori_app_id == app_id)
2266 APPL_TRACE_DEBUG("Found index %", i);
2269 if (MCA_DeleteDep((tMCA_HANDLE)p_acb->app_handle,
2270 (p_acb->sup_feature.mdep[i].mdep_id)) != MCA_SUCCESS)
2272 APPL_TRACE_ERROR("Error deregistering");
2273 status = BTA_HL_STATUS_MCAP_REG_FAIL;
2276 memset(&p_acb->sup_feature.mdep[i], 0, sizeof(tBTA_HL_MDEP));
2283 if (status == BTA_HL_STATUS_OK)
2285 /* Register/Update MDEP(s) in SDP Record */
2286 status = bta_hl_sdp_update(app_id);
2288 /* else do cleanup */
2295 /*******************************************************************************
2297 ** Function bta_hl_app_registration
2299 ** Description This function registers an HDP application MCAP and DP
2301 ** Returns tBTA_HL_STATUS -registration status
2303 *******************************************************************************/
2304 tBTA_HL_STATUS bta_hl_app_registration(UINT8 app_idx)
2306 tBTA_HL_STATUS status = BTA_HL_STATUS_OK;
2307 tBTA_HL_APP_CB *p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
2310 UINT8 i, num_of_mdeps;
2311 UINT8 mdep_counter = 0;
2313 #if BTA_HL_DEBUG == TRUE
2314 APPL_TRACE_DEBUG("bta_hl_app_registration app_idx=%d", app_idx);
2317 reg.ctrl_psm = p_acb->ctrl_psm;
2318 reg.data_psm = p_acb->data_psm;
2319 reg.sec_mask = p_acb->sec_mask;
2320 reg.rsp_tout = BTA_HL_MCAP_RSP_TOUT;
2322 if ( (p_acb->app_handle = (tBTA_HL_APP_HANDLE) MCA_Register(®, bta_hl_mcap_ctrl_cback))!=0)
2324 mca_cs.type = MCA_TDEP_ECHO;
2325 mca_cs.max_mdl = BTA_HL_NUM_MDLS_PER_MDEP;
2326 mca_cs.p_data_cback = bta_hl_mcap_data_cback;
2328 if (MCA_CreateDep((tMCA_HANDLE)p_acb->app_handle,
2329 &(p_acb->sup_feature.mdep[0].mdep_id),
2330 &mca_cs) == MCA_SUCCESS)
2332 if (p_acb->sup_feature.mdep[0].mdep_id != BTA_HL_ECHO_TEST_MDEP_ID)
2334 status = BTA_HL_STATUS_MCAP_REG_FAIL;
2335 APPL_TRACE_ERROR("BAD MDEP ID for echo test mdep_id=%d",
2336 p_acb->sup_feature.mdep[0].mdep_id );
2341 status = BTA_HL_STATUS_MCAP_REG_FAIL;
2342 APPL_TRACE_ERROR("MCA_CreateDep for echo test(mdep_id=0) failed");
2346 if ((status == BTA_HL_STATUS_OK) &&
2347 bta_hl_co_get_num_of_mdep(p_acb->app_id, &num_of_mdeps))
2349 p_acb->sup_feature.num_of_mdeps = num_of_mdeps+1;
2351 for (i=1; i<p_acb->sup_feature.num_of_mdeps; i++)
2353 mca_cs.type = MCA_TDEP_DATA;
2354 mca_cs.max_mdl = BTA_HL_NUM_MDLS_PER_MDEP;
2355 mca_cs.p_data_cback = bta_hl_mcap_data_cback;
2357 if (MCA_CreateDep((tMCA_HANDLE)p_acb->app_handle,
2358 &(p_acb->sup_feature.mdep[i].mdep_id), &mca_cs) == MCA_SUCCESS)
2360 if (bta_hl_co_get_mdep_config(p_acb->app_id,
2362 p_acb->sup_feature.mdep[i].mdep_id,
2363 &p_acb->sup_feature.mdep[i].mdep_cfg))
2365 if (p_acb->sup_feature.mdep[i].mdep_cfg.mdep_role == BTA_HL_MDEP_ROLE_SOURCE)
2367 p_acb->sup_feature.app_role_mask |= BTA_HL_MDEP_ROLE_MASK_SOURCE;
2369 else if (p_acb->sup_feature.mdep[i].mdep_cfg.mdep_role == BTA_HL_MDEP_ROLE_SINK)
2371 p_acb->sup_feature.app_role_mask |= BTA_HL_MDEP_ROLE_MASK_SINK;
2375 status = BTA_HL_STATUS_MDEP_CO_FAIL;
2378 p_acb->sup_feature.mdep[i].ori_app_id = p_acb->app_id;
2379 APPL_TRACE_DEBUG("index %d ori_app_id %d", i,
2380 p_acb->sup_feature.mdep[i].ori_app_id);
2384 status = BTA_HL_STATUS_MDEP_CO_FAIL;
2390 status = BTA_HL_STATUS_MCAP_REG_FAIL;
2397 if ((status == BTA_HL_STATUS_OK) &&
2398 (p_acb->sup_feature.app_role_mask == BTA_HL_MDEP_ROLE_MASK_SOURCE))
2400 /* this is a source only applciation */
2401 p_acb->sup_feature.advertize_source_sdp =
2402 bta_hl_co_advrtise_source_sdp(p_acb->app_id);
2405 if ((status == BTA_HL_STATUS_OK)&&
2406 (!bta_hl_co_get_echo_config(p_acb->app_id, &p_acb->sup_feature.echo_cfg)))
2408 status = BTA_HL_STATUS_ECHO_CO_FAIL;
2411 if ((status == BTA_HL_STATUS_OK)&&
2412 (!bta_hl_co_load_mdl_config(p_acb->app_id, BTA_HL_NUM_MDL_CFGS, &p_acb->mdl_cfg[0])))
2414 status = BTA_HL_STATUS_MDL_CFG_CO_FAIL;
2419 status = BTA_HL_STATUS_MDEP_CO_FAIL;
2424 status = BTA_HL_STATUS_MCAP_REG_FAIL;
2427 if (status == BTA_HL_STATUS_OK)
2429 status = bta_hl_sdp_register(app_idx);
2436 /*******************************************************************************
2438 ** Function bta_hl_discard_data
2440 ** Description This function discard an HDP event
2444 *******************************************************************************/
2445 void bta_hl_discard_data(UINT16 event, tBTA_HL_DATA *p_data)
2448 #if BTA_HL_DEBUG == TRUE
2449 APPL_TRACE_ERROR("BTA HL Discard event=%s",bta_hl_evt_code(event));
2455 case BTA_HL_API_SEND_DATA_EVT:
2458 case BTA_HL_MCA_RCV_DATA_EVT:
2459 osi_free_and_reset((void **)&p_data->mca_rcv_data_evt.p_pkt);
2468 /*******************************************************************************
2470 ** Function bta_hl_save_mdl_cfg
2472 ** Description This function saves the MDL configuration
2476 *******************************************************************************/
2477 void bta_hl_save_mdl_cfg(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx )
2479 tBTA_HL_APP_CB *p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
2480 tBTA_HL_MCL_CB *p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
2481 tBTA_HL_MDL_CB *p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
2483 tBTA_HL_MDL_ID mdl_id;
2485 tBTA_HL_MDL_CFG mdl_cfg;
2486 tBTA_HL_MDEP *p_mdep_cfg;
2487 tBTA_HL_L2CAP_CFG_INFO l2cap_cfg;
2489 mdl_id = p_dcb->mdl_id;
2490 if (!bta_hl_find_mdl_cfg_idx(app_idx, mcl_idx, mdl_id, &mdl_cfg_idx))
2492 if (!bta_hl_find_avail_mdl_cfg_idx(app_idx, mcl_idx, &mdl_cfg_idx))
2494 APPL_TRACE_ERROR("No space to save the MDL config");
2495 found= FALSE; /*no space available*/
2501 bta_hl_get_l2cap_cfg(p_dcb->mdl_handle, &l2cap_cfg);
2502 if (!bta_hl_get_cur_time(app_idx, &time_val ))
2504 bta_hl_compact_mdl_cfg_time(app_idx,p_dcb->local_mdep_id);
2505 bta_hl_get_cur_time(app_idx, &time_val);
2507 mdl_cfg.active = TRUE;
2508 mdl_cfg.time = time_val;
2509 mdl_cfg.mdl_id = p_dcb->mdl_id;
2510 mdl_cfg.dch_mode = p_dcb->dch_mode;
2511 mdl_cfg.mtu = l2cap_cfg.mtu;
2512 mdl_cfg.fcs = l2cap_cfg.fcs;
2514 bdcpy(mdl_cfg.peer_bd_addr, p_mcb->bd_addr);
2515 mdl_cfg.local_mdep_id= p_dcb->local_mdep_id;
2516 p_mdep_cfg = &p_acb->sup_feature.mdep[p_dcb->local_mdep_cfg_idx];
2517 mdl_cfg.local_mdep_role= p_mdep_cfg->mdep_cfg.mdep_role;
2518 memcpy(&p_acb->mdl_cfg[mdl_cfg_idx], &mdl_cfg, sizeof(tBTA_HL_MDL_CFG));
2519 bta_hl_co_save_mdl(mdl_cfg.local_mdep_id, mdl_cfg_idx, &mdl_cfg);
2522 #if BTA_HL_DEBUG == TRUE
2525 if (p_dcb->mtu != l2cap_cfg.mtu)
2527 APPL_TRACE_WARNING("MCAP and L2CAP peer mtu size out of sync from MCAP mtu=%d from l2cap mtu=%d",
2528 p_dcb->mtu, l2cap_cfg.mtu);
2530 APPL_TRACE_DEBUG("bta_hl_save_mdl_cfg saved=%d", found);
2531 APPL_TRACE_DEBUG("Saved. L2cap cfg mdl_id=%d mtu=%d fcs=%d dch_mode=%d",
2532 mdl_cfg.mdl_id, mdl_cfg.mtu, mdl_cfg.fcs, mdl_cfg.dch_mode);
2540 /*******************************************************************************
2542 ** Function bta_hl_set_dch_chan_cfg
2544 ** Description This function setups the L2CAP DCH channel configuration
2547 *******************************************************************************/
2548 void bta_hl_set_dch_chan_cfg(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx,tBTA_HL_DATA *p_data)
2550 tBTA_HL_APP_CB *p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
2551 tBTA_HL_MDL_CB *p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
2552 UINT8 l2cap_mode = L2CAP_FCR_ERTM_MODE;
2553 tBTA_HL_SUP_FEATURE *p_sup_feature= &p_acb->sup_feature;
2554 UINT8 local_mdep_cfg_idx = p_dcb->local_mdep_cfg_idx;
2556 switch (p_dcb->dch_oper)
2558 case BTA_HL_DCH_OP_LOCAL_RECONNECT:
2559 case BTA_HL_DCH_OP_REMOTE_RECONNECT:
2560 if (p_dcb->dch_mode == BTA_HL_DCH_MODE_STREAMING)
2561 l2cap_mode = L2CAP_FCR_STREAM_MODE;
2563 case BTA_HL_DCH_OP_LOCAL_OPEN:
2564 if (p_data->mca_evt.mca_data.create_cfm.cfg == BTA_HL_DCH_CFG_STREAMING)
2565 l2cap_mode = L2CAP_FCR_STREAM_MODE;
2567 case BTA_HL_DCH_OP_REMOTE_OPEN:
2568 if (p_dcb->local_cfg == BTA_HL_DCH_CFG_STREAMING )
2569 l2cap_mode = L2CAP_FCR_STREAM_MODE;
2572 APPL_TRACE_ERROR("Invalid dch oper=%d for set dch chan cfg", p_dcb->dch_oper);
2575 p_dcb->chnl_cfg.fcr_opt.mode = l2cap_mode;
2576 p_dcb->chnl_cfg.fcr_opt.mps = bta_hl_set_mps(p_dcb->max_rx_apdu_size);
2577 p_dcb->chnl_cfg.fcr_opt.tx_win_sz = bta_hl_set_tx_win_size(p_dcb->max_rx_apdu_size,
2578 p_dcb->chnl_cfg.fcr_opt.mps);
2579 p_dcb->chnl_cfg.fcr_opt.max_transmit= BTA_HL_L2C_MAX_TRANSMIT;
2580 p_dcb->chnl_cfg.fcr_opt.rtrans_tout = BTA_HL_L2C_RTRANS_TOUT;
2581 p_dcb->chnl_cfg.fcr_opt.mon_tout = BTA_HL_L2C_MON_TOUT;
2583 p_dcb->chnl_cfg.user_rx_buf_size = bta_hl_set_user_rx_buf_size(p_dcb->max_rx_apdu_size);
2584 p_dcb->chnl_cfg.user_tx_buf_size = bta_hl_set_user_tx_buf_size(p_dcb->max_tx_apdu_size);
2585 p_dcb->chnl_cfg.fcr_rx_buf_size = L2CAP_INVALID_ERM_BUF_SIZE;
2586 p_dcb->chnl_cfg.fcr_tx_buf_size = L2CAP_INVALID_ERM_BUF_SIZE;
2587 p_dcb->chnl_cfg.data_mtu = p_dcb->max_rx_apdu_size;
2589 p_dcb->chnl_cfg.fcs = BTA_HL_MCA_NO_FCS;
2590 if (local_mdep_cfg_idx != BTA_HL_ECHO_TEST_MDEP_CFG_IDX)
2592 if (p_sup_feature->mdep[local_mdep_cfg_idx].mdep_cfg.mdep_role ==
2593 BTA_HL_MDEP_ROLE_SOURCE)
2595 p_dcb->chnl_cfg.fcs = BTA_HL_DEFAULT_SOURCE_FCS;
2600 p_dcb->chnl_cfg.fcs = BTA_HL_MCA_USE_FCS;
2603 #if BTA_HL_DEBUG == TRUE
2604 APPL_TRACE_DEBUG("L2CAP Params l2cap_mode[3-ERTM 4-STREAM]=%d", l2cap_mode);
2605 APPL_TRACE_DEBUG("Use FCS =%s mtu=%d", ((p_dcb->chnl_cfg.fcs & 1)?"YES":"NO"),
2606 p_dcb->chnl_cfg.data_mtu);
2607 APPL_TRACE_DEBUG("tx_win_sz=%d, max_transmit=%d, rtrans_tout=%d, mon_tout=%d, mps=%d",
2608 p_dcb->chnl_cfg.fcr_opt.tx_win_sz,
2609 p_dcb->chnl_cfg.fcr_opt.max_transmit,
2610 p_dcb->chnl_cfg.fcr_opt.rtrans_tout,
2611 p_dcb->chnl_cfg.fcr_opt.mon_tout,
2612 p_dcb->chnl_cfg.fcr_opt.mps);
2614 APPL_TRACE_DEBUG("USER rx_buf_size=%d, tx_buf_size=%d, FCR rx_buf_size=%d, tx_buf_size=%d",
2615 p_dcb->chnl_cfg.user_rx_buf_size,
2616 p_dcb->chnl_cfg.user_tx_buf_size,
2617 p_dcb->chnl_cfg.fcr_rx_buf_size,
2618 p_dcb->chnl_cfg.fcr_tx_buf_size);
2631 /*******************************************************************************
2633 ** Function bta_hl_get_l2cap_cfg
2635 ** Description This function get the current L2CAP channel configuration
2637 ** Returns BOOLEAN - TRUE - operation is successful
2638 *******************************************************************************/
2639 BOOLEAN bta_hl_get_l2cap_cfg(tBTA_HL_MDL_HANDLE mdl_hnd, tBTA_HL_L2CAP_CFG_INFO *p_cfg)
2641 BOOLEAN success = FALSE;
2643 tL2CAP_CFG_INFO *p_our_cfg;
2644 tL2CAP_CH_CFG_BITS our_cfg_bits;
2645 tL2CAP_CFG_INFO *p_peer_cfg;
2646 tL2CAP_CH_CFG_BITS peer_cfg_bits;
2648 lcid = MCA_GetL2CapChannel((tMCA_DL) mdl_hnd);
2650 L2CA_GetCurrentConfig(lcid, &p_our_cfg, &our_cfg_bits, &p_peer_cfg,
2653 p_cfg->fcs = BTA_HL_MCA_NO_FCS;
2654 if (our_cfg_bits & L2CAP_CH_CFG_MASK_FCS)
2656 p_cfg->fcs |= p_our_cfg->fcs;
2660 p_cfg->fcs = BTA_HL_MCA_USE_FCS;
2663 if (p_cfg->fcs != BTA_HL_MCA_USE_FCS )
2665 if (peer_cfg_bits & L2CAP_CH_CFG_MASK_FCS)
2667 p_cfg->fcs |= p_peer_cfg->fcs;
2671 p_cfg->fcs = BTA_HL_MCA_USE_FCS;
2676 if (peer_cfg_bits & L2CAP_CH_CFG_MASK_MTU)
2678 p_cfg->mtu = p_peer_cfg->mtu;
2682 p_cfg->mtu = L2CAP_DEFAULT_MTU;
2688 p_cfg->mtu = L2CAP_DEFAULT_MTU;
2689 p_cfg->fcs = BTA_HL_L2C_NO_FCS;
2692 #if BTA_HL_DEBUG == TRUE
2695 APPL_TRACE_DEBUG("bta_hl_get_l2cap_cfg success=%d mdl=%d lcid=%d", success, mdl_hnd, lcid);
2696 APPL_TRACE_DEBUG("l2cap mtu=%d fcs=%d", p_cfg->mtu, p_cfg->fcs);
2703 /*******************************************************************************
2705 ** Function bta_hl_validate_chan_cfg
2707 ** Description This function validates the L2CAP channel configuration
2709 ** Returns BOOLEAN - TRUE - validation is successful
2710 *******************************************************************************/
2711 BOOLEAN bta_hl_validate_chan_cfg(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx)
2713 tBTA_HL_APP_CB *p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
2714 tBTA_HL_MDL_CB *p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
2715 BOOLEAN success = FALSE;
2716 UINT8 mdl_cfg_idx = 0;
2717 tBTA_HL_L2CAP_CFG_INFO l2cap_cfg;
2718 BOOLEAN get_l2cap_result, get_mdl_result;
2720 get_l2cap_result = bta_hl_get_l2cap_cfg(p_dcb->mdl_handle, &l2cap_cfg);
2721 get_mdl_result = bta_hl_find_mdl_cfg_idx(app_idx, mcl_idx, p_dcb->mdl_id, &mdl_cfg_idx);
2723 if (get_l2cap_result && get_mdl_result)
2725 if ((p_acb->mdl_cfg[mdl_cfg_idx].mtu <= l2cap_cfg.mtu) &&
2726 (p_acb->mdl_cfg[mdl_cfg_idx].fcs == l2cap_cfg.fcs) &&
2727 (p_acb->mdl_cfg[mdl_cfg_idx].dch_mode == p_dcb->dch_mode))
2734 #if BTA_HL_DEBUG == TRUE
2736 if (p_dcb->mtu != l2cap_cfg.mtu)
2738 APPL_TRACE_WARNING("MCAP and L2CAP peer mtu size out of sync from MCAP mtu=%d from l2cap mtu=%d",
2739 p_dcb->mtu, l2cap_cfg.mtu);
2744 APPL_TRACE_DEBUG("bta_hl_validate_chan_cfg success=%d app_idx=%d mcl_idx=%d mdl_idx=%d",success, app_idx, mcl_idx, mdl_idx);
2745 APPL_TRACE_DEBUG("Cur. L2cap cfg mtu=%d fcs=%d dch_mode=%d", l2cap_cfg.mtu, l2cap_cfg.fcs, p_dcb->dch_mode);
2746 APPL_TRACE_DEBUG("From saved: L2cap cfg mtu=%d fcs=%d dch_mode=%d", p_acb->mdl_cfg[mdl_cfg_idx].mtu,
2747 p_acb->mdl_cfg[mdl_cfg_idx].fcs , p_acb->mdl_cfg[mdl_cfg_idx].dch_mode);
2755 /*******************************************************************************
2757 ** Function bta_hl_is_cong_on
2759 ** Description This function checks whether the congestion condition is on or not
2761 ** Returns BOOLEAN - TRUE DCH is congested
2762 ** FALSE not congested
2764 *******************************************************************************/
2765 BOOLEAN bta_hl_is_cong_on(UINT8 app_id, BD_ADDR bd_addr, tBTA_HL_MDL_ID mdl_id)
2768 tBTA_HL_MDL_CB *p_dcb;
2769 UINT8 app_idx = 0, mcl_idx, mdl_idx;
2770 BOOLEAN cong_status = TRUE;
2772 if (bta_hl_find_app_idx(app_id, &app_idx))
2774 if (bta_hl_find_mcl_idx(app_idx, bd_addr, &mcl_idx ))
2776 if (bta_hl_find_mdl_idx(app_idx, mcl_idx, mdl_id, &mdl_idx ))
2778 p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
2779 cong_status = p_dcb->cong;
2787 /*******************************************************************************
2789 ** Function bta_hl_check_cch_close
2791 ** Description This function checks whether there is a pending CCH close request
2795 *******************************************************************************/
2796 void bta_hl_check_cch_close(UINT8 app_idx, UINT8 mcl_idx, tBTA_HL_DATA *p_data, BOOLEAN check_dch_setup )
2798 tBTA_HL_MCL_CB *p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
2799 tBTA_HL_MDL_CB *p_dcb;
2802 #if (BTA_HL_DEBUG == TRUE)
2803 APPL_TRACE_DEBUG("bta_hl_check_cch_close cch_close_dch_oper=%d",p_mcb->cch_close_dch_oper );
2806 if (p_mcb->cch_oper == BTA_HL_CCH_OP_LOCAL_CLOSE)
2808 if (check_dch_setup && bta_hl_find_dch_setup_mdl_idx(app_idx, mcl_idx, &mdl_idx))
2810 p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
2811 if (!p_mcb->rsp_tout)
2813 p_mcb->cch_close_dch_oper = BTA_HL_CCH_CLOSE_OP_DCH_ABORT;
2815 if (!p_dcb->abort_oper)
2817 p_dcb->abort_oper |= BTA_HL_ABORT_CCH_CLOSE_MASK;
2818 bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_ABORT_EVT, p_data);
2823 p_mcb->cch_close_dch_oper = BTA_HL_CCH_CLOSE_OP_DCH_CLOSE;
2824 bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_CMPL_EVT, p_data);
2827 else if (bta_hl_find_an_active_mdl_idx(app_idx, mcl_idx,&mdl_idx))
2829 p_mcb->cch_close_dch_oper = BTA_HL_CCH_CLOSE_OP_DCH_CLOSE;
2830 bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_EVT, p_data);
2834 p_mcb->cch_close_dch_oper = BTA_HL_CCH_CLOSE_OP_DCH_NONE;
2835 bta_hl_cch_sm_execute(app_idx, mcl_idx, BTA_HL_CCH_CLOSE_EVT, p_data);
2840 /*******************************************************************************
2842 ** Function bta_hl_clean_app
2844 ** Description Cleans up the HDP application resources and control block
2848 *******************************************************************************/
2849 void bta_hl_clean_app(UINT8 app_idx)
2851 tBTA_HL_APP_CB *p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
2852 int i, num_act_apps=0;
2854 #if BTA_HL_DEBUG == TRUE
2855 APPL_TRACE_DEBUG("bta_hl_clean_app");
2857 MCA_Deregister((tMCA_HANDLE)p_acb->app_handle);
2859 if (p_acb->sdp_handle) SDP_DeleteRecord(p_acb->sdp_handle);
2861 memset((void *) p_acb, 0, sizeof(tBTA_HL_APP_CB));
2863 /* check any application is still active */
2864 for (i=0; i < BTA_HL_NUM_APPS ; i ++)
2866 p_acb = BTA_HL_GET_APP_CB_PTR(i);
2867 if (p_acb->in_use) num_act_apps++;
2872 bta_sys_remove_uuid(UUID_SERVCLASS_HDP_PROFILE);
2876 /*******************************************************************************
2878 ** Function bta_hl_check_deregistration
2880 ** Description This function checks whether there is a pending deregistration
2884 *******************************************************************************/
2885 void bta_hl_check_deregistration(UINT8 app_idx, tBTA_HL_DATA *p_data )
2887 tBTA_HL_APP_CB *p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
2888 tBTA_HL_MCL_CB *p_mcb;
2892 #if (BTA_HL_DEBUG == TRUE)
2893 APPL_TRACE_DEBUG("bta_hl_check_deregistration");
2896 if (p_acb->deregistering)
2898 if (bta_hl_find_an_in_use_mcl_idx(app_idx, &mcl_idx))
2900 p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
2901 if (p_mcb->cch_oper != BTA_HL_CCH_OP_LOCAL_CLOSE)
2903 if (p_mcb->cch_state == BTA_HL_CCH_OPENING_ST)
2904 p_mcb->force_close_local_cch_opening = TRUE;
2905 p_mcb->cch_oper = BTA_HL_CCH_OP_LOCAL_CLOSE;
2906 APPL_TRACE_DEBUG("p_mcb->force_close_local_cch_opening=%d", p_mcb->force_close_local_cch_opening );
2907 bta_hl_check_cch_close(app_idx,mcl_idx,p_data, TRUE);
2912 /* all cchs are closed */
2913 evt_data.dereg_cfm.app_handle = p_acb->app_handle;
2914 evt_data.dereg_cfm.app_id = p_data->api_dereg.app_id;
2915 evt_data.dereg_cfm.status = BTA_HL_STATUS_OK;
2916 p_acb->p_cback(BTA_HL_DEREGISTER_CFM_EVT, (tBTA_HL *) &evt_data );
2917 bta_hl_clean_app(app_idx);
2918 bta_hl_check_disable(p_data);
2924 /*******************************************************************************
2926 ** Function bta_hl_check_disable
2928 ** Description This function checks whether there is a pending disable
2933 *******************************************************************************/
2934 void bta_hl_check_disable(tBTA_HL_DATA *p_data )
2936 tBTA_HL_CB *p_cb= &bta_hl_cb;
2937 tBTA_HL_APP_CB *p_acb;
2939 tBTA_HL_CTRL evt_data;
2941 #if (BTA_HL_DEBUG == TRUE)
2942 APPL_TRACE_DEBUG("bta_hl_check_disable");
2945 if (bta_hl_cb.disabling)
2947 if (bta_hl_find_an_in_use_app_idx(&app_idx))
2949 p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
2950 if (!p_acb->deregistering)
2952 p_acb->deregistering = TRUE;
2953 bta_hl_check_deregistration(app_idx, p_data);
2958 /* all apps are deregistered */
2959 bta_sys_deregister(BTA_ID_HL);
2960 evt_data.disable_cfm.status = BTA_HL_STATUS_OK;
2961 if (p_cb->p_ctrl_cback) p_cb->p_ctrl_cback(BTA_HL_CTRL_DISABLE_CFM_EVT, (tBTA_HL_CTRL *) &evt_data);
2962 memset((void *) p_cb, 0, sizeof(tBTA_HL_CB));
2967 /*******************************************************************************
2969 ** Function bta_hl_build_abort_cfm
2971 ** Description This function builds the abort confirmation event data
2975 *******************************************************************************/
2976 void bta_hl_build_abort_cfm(tBTA_HL *p_evt_data,
2977 tBTA_HL_APP_HANDLE app_handle,
2978 tBTA_HL_MCL_HANDLE mcl_handle,
2979 tBTA_HL_STATUS status)
2981 p_evt_data->dch_abort_cfm.status = status;
2982 p_evt_data->dch_abort_cfm.mcl_handle = mcl_handle;
2983 p_evt_data->dch_abort_cfm.app_handle = app_handle;
2986 /*******************************************************************************
2988 ** Function bta_hl_build_abort_ind
2990 ** Description This function builds the abort indication event data
2994 *******************************************************************************/
2995 void bta_hl_build_abort_ind(tBTA_HL *p_evt_data,
2996 tBTA_HL_APP_HANDLE app_handle,
2997 tBTA_HL_MCL_HANDLE mcl_handle)
2999 p_evt_data->dch_abort_ind.mcl_handle = mcl_handle;
3000 p_evt_data->dch_abort_ind.app_handle = app_handle;
3002 /*******************************************************************************
3004 ** Function bta_hl_build_close_cfm
3006 ** Description This function builds the close confirmation event data
3010 *******************************************************************************/
3011 void bta_hl_build_dch_close_cfm(tBTA_HL *p_evt_data,
3012 tBTA_HL_APP_HANDLE app_handle,
3013 tBTA_HL_MCL_HANDLE mcl_handle,
3014 tBTA_HL_MDL_HANDLE mdl_handle,
3015 tBTA_HL_STATUS status)
3017 p_evt_data->dch_close_cfm.status = status;
3018 p_evt_data->dch_close_cfm.mdl_handle = mdl_handle;
3019 p_evt_data->dch_close_cfm.mcl_handle = mcl_handle;
3020 p_evt_data->dch_close_cfm.app_handle = app_handle;
3023 /*******************************************************************************
3025 ** Function bta_hl_build_dch_close_ind
3027 ** Description This function builds the close indication event data
3031 *******************************************************************************/
3032 void bta_hl_build_dch_close_ind(tBTA_HL *p_evt_data,
3033 tBTA_HL_APP_HANDLE app_handle,
3034 tBTA_HL_MCL_HANDLE mcl_handle,
3035 tBTA_HL_MDL_HANDLE mdl_handle,
3036 BOOLEAN intentional)
3038 p_evt_data->dch_close_ind.mdl_handle = mdl_handle;
3039 p_evt_data->dch_close_ind.mcl_handle = mcl_handle;
3040 p_evt_data->dch_close_ind.app_handle = app_handle;
3041 p_evt_data->dch_close_ind.intentional = intentional;
3044 /*******************************************************************************
3046 ** Function bta_hl_build_send_data_cfm
3048 ** Description This function builds the send data confirmation event data
3052 *******************************************************************************/
3053 void bta_hl_build_send_data_cfm(tBTA_HL *p_evt_data,
3054 tBTA_HL_APP_HANDLE app_handle,
3055 tBTA_HL_MCL_HANDLE mcl_handle,
3056 tBTA_HL_MDL_HANDLE mdl_handle,
3057 tBTA_HL_STATUS status )
3060 p_evt_data->dch_send_data_cfm.mdl_handle = mdl_handle;
3061 p_evt_data->dch_send_data_cfm.mcl_handle = mcl_handle;
3062 p_evt_data->dch_send_data_cfm.app_handle = app_handle;
3063 p_evt_data->dch_send_data_cfm.status = status;
3066 /*******************************************************************************
3068 ** Function bta_hl_build_rcv_data_ind
3070 ** Description This function builds the received data indication event data
3074 *******************************************************************************/
3075 void bta_hl_build_rcv_data_ind(tBTA_HL *p_evt_data,
3076 tBTA_HL_APP_HANDLE app_handle,
3077 tBTA_HL_MCL_HANDLE mcl_handle,
3078 tBTA_HL_MDL_HANDLE mdl_handle)
3080 p_evt_data->dch_rcv_data_ind.mdl_handle = mdl_handle;
3081 p_evt_data->dch_rcv_data_ind.mcl_handle = mcl_handle;
3082 p_evt_data->dch_rcv_data_ind.app_handle = app_handle;
3086 /*******************************************************************************
3088 ** Function bta_hl_build_cch_open_cfm
3090 ** Description This function builds the CCH open confirmation event data
3094 *******************************************************************************/
3095 void bta_hl_build_cch_open_cfm(tBTA_HL *p_evt_data,
3097 tBTA_HL_APP_HANDLE app_handle,
3098 tBTA_HL_MCL_HANDLE mcl_handle,
3100 tBTA_HL_STATUS status )
3102 p_evt_data->cch_open_cfm.app_id = app_id;
3103 p_evt_data->cch_open_cfm.app_handle = app_handle;
3104 p_evt_data->cch_open_cfm.mcl_handle = mcl_handle;
3105 bdcpy(p_evt_data->cch_open_cfm.bd_addr, bd_addr);
3106 p_evt_data->cch_open_cfm.status = status;
3107 APPL_TRACE_DEBUG("bta_hl_build_cch_open_cfm: status=%d",status);
3110 /*******************************************************************************
3112 ** Function bta_hl_build_cch_open_ind
3114 ** Description This function builds the CCH open indication event data
3118 *******************************************************************************/
3119 void bta_hl_build_cch_open_ind(tBTA_HL *p_evt_data, tBTA_HL_APP_HANDLE app_handle,
3120 tBTA_HL_MCL_HANDLE mcl_handle,
3124 p_evt_data->cch_open_ind.app_handle = app_handle;
3125 p_evt_data->cch_open_ind.mcl_handle = mcl_handle;
3126 bdcpy(p_evt_data->cch_open_ind.bd_addr, bd_addr);
3129 /*******************************************************************************
3131 ** Function bta_hl_build_cch_close_cfm
3133 ** Description This function builds the CCH close confirmation event data
3137 *******************************************************************************/
3138 void bta_hl_build_cch_close_cfm(tBTA_HL *p_evt_data,
3139 tBTA_HL_APP_HANDLE app_handle,
3140 tBTA_HL_MCL_HANDLE mcl_handle,
3141 tBTA_HL_STATUS status )
3143 p_evt_data->cch_close_cfm.mcl_handle = mcl_handle;
3144 p_evt_data->cch_close_cfm.app_handle = app_handle;
3145 p_evt_data->cch_close_cfm.status = status;
3149 /*******************************************************************************
3151 ** Function bta_hl_build_cch_close_ind
3153 ** Description This function builds the CCH colse indication event data
3157 *******************************************************************************/
3158 void bta_hl_build_cch_close_ind(tBTA_HL *p_evt_data,
3159 tBTA_HL_APP_HANDLE app_handle,
3160 tBTA_HL_MCL_HANDLE mcl_handle,
3161 BOOLEAN intentional)
3163 p_evt_data->cch_close_ind.mcl_handle = mcl_handle;
3164 p_evt_data->cch_close_ind.app_handle = app_handle;
3165 p_evt_data->cch_close_ind.intentional = intentional;
3168 /*******************************************************************************
3170 ** Function bta_hl_build_dch_open_cfm
3172 ** Description This function builds the DCH open confirmation event data
3176 *******************************************************************************/
3177 void bta_hl_build_dch_open_cfm(tBTA_HL *p_evt_data,
3178 tBTA_HL_APP_HANDLE app_handle,
3179 tBTA_HL_MCL_HANDLE mcl_handle,
3180 tBTA_HL_MDL_HANDLE mdl_handle,
3181 tBTA_HL_MDEP_ID local_mdep_id,
3182 tBTA_HL_MDL_ID mdl_id,
3183 tBTA_HL_DCH_MODE dch_mode,
3184 BOOLEAN first_reliable,
3186 tBTA_HL_STATUS status)
3189 p_evt_data->dch_open_cfm.mdl_handle = mdl_handle;
3190 p_evt_data->dch_open_cfm.mcl_handle = mcl_handle;
3191 p_evt_data->dch_open_cfm.app_handle = app_handle;
3192 p_evt_data->dch_open_cfm.local_mdep_id = local_mdep_id;
3193 p_evt_data->dch_open_cfm.mdl_id = mdl_id;
3194 p_evt_data->dch_open_cfm.dch_mode = dch_mode;
3195 p_evt_data->dch_open_cfm.first_reliable = first_reliable;
3196 p_evt_data->dch_open_cfm.mtu = mtu;
3197 p_evt_data->dch_open_cfm.status = status;
3201 /*******************************************************************************
3203 ** Function bta_hl_build_sdp_query_cfm
3205 ** Description This function builds the SDP query indication event data
3209 *******************************************************************************/
3210 void bta_hl_build_sdp_query_cfm(tBTA_HL *p_evt_data,
3212 tBTA_HL_APP_HANDLE app_handle,
3215 tBTA_HL_STATUS status)
3218 APPL_TRACE_DEBUG("bta_hl_build_sdp_query_cfm: app_id = %d, app_handle=%d",
3220 p_evt_data->sdp_query_cfm.app_id = app_id;
3221 p_evt_data->sdp_query_cfm.app_handle = app_handle;
3222 bdcpy(p_evt_data->sdp_query_cfm.bd_addr, bd_addr);
3223 p_evt_data->sdp_query_cfm.p_sdp = p_sdp;
3224 p_evt_data->sdp_query_cfm.status = status;
3228 /*******************************************************************************
3230 ** Function bta_hl_build_delete_mdl_cfm
3232 ** Description This function builds the delete MDL confirmation event data
3236 *******************************************************************************/
3237 void bta_hl_build_delete_mdl_cfm(tBTA_HL *p_evt_data,
3238 tBTA_HL_APP_HANDLE app_handle,
3239 tBTA_HL_MCL_HANDLE mcl_handle,
3240 tBTA_HL_MDL_ID mdl_id,
3241 tBTA_HL_STATUS status)
3244 p_evt_data->delete_mdl_cfm.mcl_handle = mcl_handle;
3245 p_evt_data->delete_mdl_cfm.app_handle = app_handle;
3246 p_evt_data->delete_mdl_cfm.mdl_id = mdl_id;
3247 p_evt_data->delete_mdl_cfm.status = status;
3250 /*******************************************************************************
3252 ** Function bta_hl_build_echo_test_cfm
3254 ** Description This function builds the echo test confirmation event data
3258 *******************************************************************************/
3259 void bta_hl_build_echo_test_cfm(tBTA_HL *p_evt_data,
3260 tBTA_HL_APP_HANDLE app_handle,
3261 tBTA_HL_MCL_HANDLE mcl_handle,
3262 tBTA_HL_STATUS status )
3264 p_evt_data->echo_test_cfm.mcl_handle = mcl_handle;
3265 p_evt_data->echo_test_cfm.app_handle = app_handle;
3266 p_evt_data->echo_test_cfm.status = status;
3270 /*****************************************************************************
3272 *****************************************************************************/
3273 #if (BTA_HL_DEBUG == TRUE)
3275 /*******************************************************************************
3277 ** Function bta_hl_status_code
3279 ** Description get the status string pointer
3281 ** Returns char * - status string pointer
3283 *******************************************************************************/
3284 char *bta_hl_status_code(tBTA_HL_STATUS status)
3288 case BTA_HL_STATUS_OK:
3289 return "BTA_HL_STATUS_OK";
3290 case BTA_HL_STATUS_FAIL:
3291 return "BTA_HL_STATUS_FAIL";
3292 case BTA_HL_STATUS_ABORTED:
3293 return "BTA_HL_STATUS_ABORTED";
3294 case BTA_HL_STATUS_NO_RESOURCE:
3295 return "BTA_HL_STATUS_NO_RESOURCE";
3296 case BTA_HL_STATUS_LAST_ITEM:
3297 return "BTA_HL_STATUS_LAST_ITEM";
3298 case BTA_HL_STATUS_DUPLICATE_APP_ID:
3299 return "BTA_HL_STATUS_DUPLICATE_APP_ID";
3300 case BTA_HL_STATUS_INVALID_APP_HANDLE:
3301 return "BTA_HL_STATUS_INVALID_APP_HANDLE";
3302 case BTA_HL_STATUS_INVALID_MCL_HANDLE:
3303 return "BTA_HL_STATUS_INVALID_MCL_HANDLE";
3304 case BTA_HL_STATUS_MCAP_REG_FAIL:
3305 return "BTA_HL_STATUS_MCAP_REG_FAIL";
3306 case BTA_HL_STATUS_MDEP_CO_FAIL:
3307 return "BTA_HL_STATUS_MDEP_CO_FAIL";
3308 case BTA_HL_STATUS_ECHO_CO_FAIL:
3309 return "BTA_HL_STATUS_ECHO_CO_FAIL";
3310 case BTA_HL_STATUS_MDL_CFG_CO_FAIL:
3311 return "BTA_HL_STATUS_MDL_CFG_CO_FAIL";
3312 case BTA_HL_STATUS_SDP_NO_RESOURCE:
3313 return "BTA_HL_STATUS_SDP_NO_RESOURCE";
3314 case BTA_HL_STATUS_SDP_FAIL:
3315 return "BTA_HL_STATUS_SDP_FAIL";
3316 case BTA_HL_STATUS_NO_CCH:
3317 return "BTA_HL_STATUS_NO_CCH";
3318 case BTA_HL_STATUS_NO_MCL:
3319 return "BTA_HL_STATUS_NO_MCL";
3321 case BTA_HL_STATUS_NO_FIRST_RELIABLE:
3322 return "BTA_HL_STATUS_NO_FIRST_RELIABLE";
3323 case BTA_HL_STATUS_INVALID_DCH_CFG:
3324 return "BTA_HL_STATUS_INVALID_DCH_CFG";
3325 case BTA_HL_STATUS_INVALID_BD_ADDR:
3326 return "BTA_HL_STATUS_INVALID_BD_ADDR";
3327 case BTA_HL_STATUS_INVALID_RECONNECT_CFG:
3328 return "BTA_HL_STATUS_INVALID_RECONNECT_CFG";
3329 case BTA_HL_STATUS_ECHO_TEST_BUSY:
3330 return "BTA_HL_STATUS_ECHO_TEST_BUSY";
3331 case BTA_HL_STATUS_INVALID_LOCAL_MDEP_ID:
3332 return "BTA_HL_STATUS_INVALID_LOCAL_MDEP_ID";
3333 case BTA_HL_STATUS_INVALID_MDL_ID:
3334 return "BTA_HL_STATUS_INVALID_MDL_ID";
3335 case BTA_HL_STATUS_NO_MDL_ID_FOUND:
3336 return "BTA_HL_STATUS_NO_MDL_ID_FOUND";
3337 case BTA_HL_STATUS_DCH_BUSY:
3338 return "BTA_HL_STATUS_DCH_BUSY";
3340 return "Unknown status code";
3343 /*******************************************************************************
3345 ** Function bta_hl_evt_code
3347 ** Description Maps HL event code to the corresponding event string
3349 ** Returns string pointer for the associated event name
3351 *******************************************************************************/
3352 char *bta_hl_evt_code(tBTA_HL_INT_EVT evt_code)
3356 case BTA_HL_CCH_OPEN_EVT:
3357 return "BTA_HL_CCH_OPEN_EVT";
3358 case BTA_HL_CCH_SDP_OK_EVT:
3359 return "BTA_HL_CCH_SDP_OK_EVT";
3360 case BTA_HL_CCH_SDP_FAIL_EVT:
3361 return "BTA_HL_CCH_SDP_FAIL_EVT";
3362 case BTA_HL_MCA_CONNECT_IND_EVT:
3363 return "BTA_HL_MCA_CONNECT_IND_EVT";
3364 case BTA_HL_MCA_DISCONNECT_IND_EVT:
3365 return "BTA_HL_MCA_DISCONNECT_IND_EVT";
3367 case BTA_HL_CCH_CLOSE_EVT:
3368 return "BTA_HL_CCH_CLOSE_EVT";
3369 case BTA_HL_CCH_CLOSE_CMPL_EVT:
3370 return "BTA_HL_CCH_CLOSE_CMPL_EVT";
3371 case BTA_HL_DCH_OPEN_EVT:
3372 return "BTA_HL_DCH_OPEN_EVT";
3373 case BTA_HL_MCA_CREATE_IND_EVT:
3374 return "BTA_HL_MCA_CREATE_IND_EVT";
3375 case BTA_HL_MCA_CREATE_CFM_EVT:
3376 return "BTA_HL_MCA_CREATE_CFM_EVT";
3377 case BTA_HL_MCA_OPEN_IND_EVT:
3378 return "BTA_HL_MCA_OPEN_IND_EVT";
3379 case BTA_HL_MCA_OPEN_CFM_EVT:
3380 return "BTA_HL_MCA_OPEN_CFM_EVT";
3381 case BTA_HL_DCH_CLOSE_EVT:
3382 return "BTA_HL_DCH_CLOSE_EVT";
3383 case BTA_HL_MCA_CLOSE_IND_EVT:
3384 return "BTA_HL_MCA_CLOSE_IND_EVT";
3385 case BTA_HL_MCA_CLOSE_CFM_EVT:
3386 return "BTA_HL_MCA_CLOSE_CFM_EVT";
3387 case BTA_HL_API_SEND_DATA_EVT:
3388 return "BTA_HL_API_SEND_DATA_EVT";
3389 case BTA_HL_MCA_RCV_DATA_EVT:
3390 return "BTA_HL_MCA_RCV_DATA_EVT";
3391 case BTA_HL_DCH_CLOSE_CMPL_EVT:
3392 return "BTA_HL_DCH_CLOSE_CMPL_EVT";
3394 case BTA_HL_API_ENABLE_EVT:
3395 return "BTA_HL_API_ENABLE_EVT";
3396 case BTA_HL_API_DISABLE_EVT:
3397 return "BTA_HL_API_DISABLE_EVT";
3398 case BTA_HL_API_UPDATE_EVT:
3399 return "BTA_HL_API_UPDATE_EVT";
3400 case BTA_HL_API_REGISTER_EVT:
3401 return "BTA_HL_API_REGISTER_EVT";
3402 case BTA_HL_API_DEREGISTER_EVT:
3403 return "BTA_HL_API_DEREGISTER_EVT";
3405 case BTA_HL_API_CCH_OPEN_EVT:
3406 return "BTA_HL_API_CCH_OPEN_EVT";
3408 case BTA_HL_API_CCH_CLOSE_EVT:
3409 return "BTA_HL_API_CCH_CLOSE_EVT";
3410 case BTA_HL_API_DCH_OPEN_EVT:
3411 return "BTA_HL_API_DCH_OPEN_EVT";
3413 case BTA_HL_API_DCH_RECONNECT_EVT:
3414 return "BTA_HL_API_DCH_RECONNECT_EVT";
3415 case BTA_HL_API_DCH_CLOSE_EVT:
3416 return "BTA_HL_API_DCH_CLOSE_EVT";
3417 case BTA_HL_API_DELETE_MDL_EVT:
3418 return "BTA_HL_API_DELETE_MDL_EVT";
3419 case BTA_HL_API_DCH_ABORT_EVT:
3420 return "BTA_HL_API_DCH_ABORT_EVT";
3422 case BTA_HL_DCH_RECONNECT_EVT:
3423 return "BTA_HL_DCH_RECONNECT_EVT";
3424 case BTA_HL_DCH_SDP_INIT_EVT:
3425 return "BTA_HL_DCH_SDP_INIT_EVT";
3426 case BTA_HL_DCH_SDP_FAIL_EVT:
3427 return "BTA_HL_DCH_SDP_FAIL_EVT";
3428 case BTA_HL_API_DCH_ECHO_TEST_EVT:
3429 return "BTA_HL_API_DCH_ECHO_TEST_EVT";
3430 case BTA_HL_DCH_CLOSE_ECHO_TEST_EVT:
3431 return "BTA_HL_DCH_CLOSE_ECHO_TEST_EVT";
3432 case BTA_HL_MCA_RECONNECT_IND_EVT:
3433 return "BTA_HL_MCA_RECONNECT_IND_EVT";
3434 case BTA_HL_MCA_RECONNECT_CFM_EVT:
3435 return "BTA_HL_MCA_RECONNECT_CFM_EVT";
3436 case BTA_HL_API_DCH_CREATE_RSP_EVT:
3437 return "BTA_HL_API_DCH_CREATE_RSP_EVT";
3438 case BTA_HL_DCH_ABORT_EVT:
3439 return "BTA_HL_DCH_ABORT_EVT";
3440 case BTA_HL_MCA_ABORT_IND_EVT:
3441 return "BTA_HL_MCA_ABORT_IND_EVT";
3442 case BTA_HL_MCA_ABORT_CFM_EVT:
3443 return "BTA_HL_MCA_ABORT_CFM_EVT";
3444 case BTA_HL_MCA_DELETE_IND_EVT:
3445 return "BTA_HL_MCA_DELETE_IND_EVT";
3446 case BTA_HL_MCA_DELETE_CFM_EVT:
3447 return "BTA_HL_MCA_DELETE_CFM_EVT";
3448 case BTA_HL_MCA_CONG_CHG_EVT:
3449 return "BTA_HL_MCA_CONG_CHG_EVT";
3450 case BTA_HL_CI_GET_TX_DATA_EVT:
3451 return "BTA_HL_CI_GET_TX_DATA_EVT";
3452 case BTA_HL_CI_PUT_RX_DATA_EVT:
3453 return "BTA_HL_CI_PUT_RX_DATA_EVT";
3454 case BTA_HL_CI_GET_ECHO_DATA_EVT:
3455 return "BTA_HL_CI_GET_ECHO_DATA_EVT";
3456 case BTA_HL_DCH_ECHO_TEST_EVT:
3457 return "BTA_HL_DCH_ECHO_TEST_EVT";
3458 case BTA_HL_CI_PUT_ECHO_DATA_EVT:
3459 return "BTA_HL_CI_PUT_ECHO_DATA_EVT";
3460 case BTA_HL_API_SDP_QUERY_EVT:
3461 return "BTA_HL_API_SDP_QUERY_EVT";
3462 case BTA_HL_SDP_QUERY_OK_EVT:
3463 return "BTA_HL_SDP_QUERY_OK_EVT";
3464 case BTA_HL_SDP_QUERY_FAIL_EVT:
3465 return "BTA_HL_SDP_QUERY_FAIL_EVT";
3466 case BTA_HL_MCA_RSP_TOUT_IND_EVT:
3467 return "BTA_HL_MCA_RSP_TOUT_IND_EVT";
3470 return "Unknown HL event code";
3474 #endif /* Debug Functions */
3475 #endif // HL_INCLUDED