Home | History | Annotate | Download | only in hl
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 2003-2012 Broadcom Corporation
      4  *
      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:
      8  *
      9  *  http://www.apache.org/licenses/LICENSE-2.0
     10  *
     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.
     16  *
     17  ******************************************************************************/
     18 
     19 /******************************************************************************
     20  *
     21  *  This file implements utility functions for the HeaLth device profile
     22  *  (HL).
     23  *
     24  ******************************************************************************/
     25 
     26 #include <stdio.h>
     27 #include <string.h>
     28 
     29 #include "bt_target.h"
     30 #if defined(HL_INCLUDED) && (HL_INCLUDED == TRUE)
     31 
     32 
     33 #include "gki.h"
     34 #include "utl.h"
     35 #include "bta_hl_int.h"
     36 #include "bta_hl_co.h"
     37 #include "mca_defs.h"
     38 #include "mca_api.h"
     39 
     40 
     41 /*******************************************************************************
     42 **
     43 ** Function      bta_hl_set_ctrl_psm_for_dch
     44 **
     45 ** Description    This function set the control PSM for the DCH setup
     46 **
     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)
     51 {
     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;
     54     UNUSED(mdl_idx);
     55 
     56     if (p_mcb->sdp.num_recs)
     57     {
     58         if (p_mcb->ctrl_psm != ctrl_psm)
     59         {
     60             /* can not use a different ctrl PSM than the current one*/
     61             success = FALSE;
     62         }
     63     }
     64     else
     65     {
     66         /* No SDP info control i.e. channel was opened by the peer */
     67         update_ctrl_psm = TRUE;
     68     }
     69 
     70     if (success && update_ctrl_psm)
     71     {
     72         p_mcb->ctrl_psm = ctrl_psm;
     73     }
     74 
     75 
     76 #if BTA_HL_DEBUG == TRUE
     77     if (!success)
     78     {
     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 );
     81     }
     82 #endif
     83 
     84     return success;
     85 }
     86 
     87 
     88 /*******************************************************************************
     89 **
     90 ** Function      bta_hl_find_sdp_idx_using_ctrl_psm
     91 **
     92 ** Description
     93 **
     94 ** Returns      UINT8 pool_id
     95 **
     96 *******************************************************************************/
     97 BOOLEAN bta_hl_find_sdp_idx_using_ctrl_psm(tBTA_HL_SDP *p_sdp,
     98                                            UINT16 ctrl_psm,
     99                                            UINT8 *p_sdp_idx)
    100 {
    101     BOOLEAN found=FALSE;
    102     tBTA_HL_SDP_REC     *p_rec;
    103     UINT8 i;
    104 
    105     if (ctrl_psm != 0)
    106     {
    107         for (i=0; i<p_sdp->num_recs; i++)
    108         {
    109             p_rec = &p_sdp->sdp_rec[i];
    110             if (p_rec->ctrl_psm == ctrl_psm)
    111             {
    112                 *p_sdp_idx = i;
    113                 found = TRUE;
    114                 break;
    115             }
    116         }
    117     }
    118     else
    119     {
    120         *p_sdp_idx = 0;
    121         found = TRUE;
    122     }
    123 
    124 #if BTA_HL_DEBUG == TRUE
    125     if (!found)
    126     {
    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 );
    129     }
    130 #endif
    131     return found;
    132 }
    133 
    134 /*******************************************************************************
    135 **
    136 ** Function      bta_hl_set_user_tx_pool_id
    137 **
    138 ** Description  This function sets the user tx pool id
    139 **
    140 ** Returns      UINT8 pool_id
    141 **
    142 *******************************************************************************/
    143 
    144 UINT8 bta_hl_set_user_tx_pool_id(UINT16 max_tx_size)
    145 {
    146     UINT8 pool_id;
    147 
    148     if (max_tx_size > GKI_get_pool_bufsize (HCI_ACL_POOL_ID))
    149     {
    150         pool_id = BTA_HL_LRG_DATA_POOL_ID;
    151     }
    152     else
    153     {
    154         pool_id = L2CAP_DEFAULT_ERM_POOL_ID;
    155     }
    156 
    157 #if BTA_HL_DEBUG == TRUE
    158     APPL_TRACE_DEBUG("bta_hl_set_user_rx_pool_id pool_id=%d max_tx_size=%d default_ertm_pool_size=%d",
    159                       pool_id, max_tx_size, GKI_get_pool_bufsize (HCI_ACL_POOL_ID));
    160 #endif
    161 
    162     return pool_id;
    163 }
    164 
    165 /*******************************************************************************
    166 **
    167 ** Function      bta_hl_set_user_rx_pool_id
    168 **
    169 ** Description  This function sets the user trx pool id
    170 **
    171 ** Returns      UINT8 pool_id
    172 **
    173 *******************************************************************************/
    174 
    175 UINT8 bta_hl_set_user_rx_pool_id(UINT16 mtu)
    176 {
    177     UINT8 pool_id;
    178 
    179     if (mtu > GKI_get_pool_bufsize (HCI_ACL_POOL_ID))
    180     {
    181         pool_id = BTA_HL_LRG_DATA_POOL_ID;
    182     }
    183     else
    184     {
    185         pool_id = L2CAP_DEFAULT_ERM_POOL_ID;
    186     }
    187 
    188 #if BTA_HL_DEBUG == TRUE
    189     APPL_TRACE_DEBUG("bta_hl_set_user_rx_pool_id pool_id=%d mtu=%d default_ertm_pool_size=%d",
    190                       pool_id, mtu, GKI_get_pool_bufsize (HCI_ACL_POOL_ID));
    191 #endif
    192 
    193     return pool_id;
    194 }
    195 
    196 
    197 
    198 /*******************************************************************************
    199 **
    200 ** Function      bta_hl_set_tx_win_size
    201 **
    202 ** Description  This function sets the tx window size
    203 **
    204 ** Returns      UINT8 tx_win_size
    205 **
    206 *******************************************************************************/
    207 UINT8 bta_hl_set_tx_win_size(UINT16 mtu, UINT16 mps)
    208 {
    209     UINT8 tx_win_size;
    210 
    211     if (mtu <= mps)
    212     {
    213         tx_win_size =1;
    214     }
    215     else
    216     {
    217         if (mps > 0)
    218         {
    219             tx_win_size = (mtu/mps)+1;
    220         }
    221         else
    222         {
    223             APPL_TRACE_ERROR("The MPS is zero");
    224             tx_win_size = 10;
    225         }
    226     }
    227 
    228 #if BTA_HL_DEBUG == TRUE
    229     APPL_TRACE_DEBUG("bta_hl_set_tx_win_size win_size=%d mtu=%d mps=%d",
    230                       tx_win_size, mtu, mps);
    231 #endif
    232     return tx_win_size;
    233 }
    234 
    235 /*******************************************************************************
    236 **
    237 ** Function      bta_hl_set_mps
    238 **
    239 ** Description  This function sets the MPS
    240 **
    241 ** Returns      UINT16 MPS
    242 **
    243 *******************************************************************************/
    244 UINT16 bta_hl_set_mps(UINT16 mtu)
    245 {
    246     UINT16 mps;
    247     if (mtu > BTA_HL_L2C_MPS)
    248     {
    249         mps = BTA_HL_L2C_MPS;
    250     }
    251     else
    252     {
    253         mps = mtu;
    254     }
    255 #if BTA_HL_DEBUG == TRUE
    256     APPL_TRACE_DEBUG("bta_hl_set_mps mps=%d mtu=%d",
    257                       mps, mtu);
    258 #endif
    259     return mps;
    260 }
    261 
    262 
    263 /*******************************************************************************
    264 **
    265 ** Function      bta_hl_clean_mdl_cb
    266 **
    267 ** Description  This function clean up the specified MDL control block
    268 **
    269 ** Returns      void
    270 **
    271 *******************************************************************************/
    272 void bta_hl_clean_mdl_cb(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx)
    273 {
    274     tBTA_HL_MDL_CB      *p_dcb  = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
    275 #if BTA_HL_DEBUG == TRUE
    276     APPL_TRACE_DEBUG("bta_hl_clean_mdl_cb app_idx=%d mcl_idx=%d mdl_idx=%d",
    277                       app_idx, mcl_idx, mdl_idx);
    278 #endif
    279     utl_freebuf((void **) &p_dcb->p_tx_pkt);
    280     utl_freebuf((void **) &p_dcb->p_rx_pkt);
    281     utl_freebuf((void **) &p_dcb->p_echo_tx_pkt);
    282     utl_freebuf((void **) &p_dcb->p_echo_rx_pkt);
    283 
    284     memset((void *)p_dcb, 0 , sizeof(tBTA_HL_MDL_CB));
    285 }
    286 
    287 
    288 /*******************************************************************************
    289 **
    290 ** Function      bta_hl_get_buf
    291 **
    292 ** Description  This function allocate a buffer based on the specified data size
    293 **
    294 ** Returns      BT_HDR *.
    295 **
    296 *******************************************************************************/
    297 BT_HDR * bta_hl_get_buf(UINT16 data_size)
    298 {
    299     BT_HDR *p_new;
    300     UINT16 size = data_size + L2CAP_MIN_OFFSET + BT_HDR_SIZE;
    301 
    302     if (size < GKI_MAX_BUF_SIZE)
    303     {
    304         p_new = (BT_HDR *)GKI_getbuf(size);
    305     }
    306     else
    307     {
    308         p_new = (BT_HDR *) GKI_getpoolbuf(BTA_HL_LRG_DATA_POOL_ID);
    309     }
    310 
    311     if (p_new)
    312     {
    313         p_new->len = data_size;
    314         p_new->offset = L2CAP_MIN_OFFSET;
    315     }
    316 
    317     return p_new;
    318 }
    319 
    320 /*******************************************************************************
    321 **
    322 ** Function      bta_hl_find_service_in_db
    323 **
    324 ** Description  This function check the specified service class(es) can be find in
    325 **              the received SDP database
    326 **
    327 ** Returns      BOOLEAN TRUE - found
    328 **                      FALSE - not found
    329 **
    330 *******************************************************************************/
    331 BOOLEAN bta_hl_find_service_in_db( UINT8 app_idx, UINT8 mcl_idx,
    332                                    UINT16 service_uuid,
    333                                    tSDP_DISC_REC **pp_rec )
    334 {
    335     tBTA_HL_MCL_CB          *p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
    336     BOOLEAN found = TRUE;
    337 
    338     switch (service_uuid)
    339     {
    340         case UUID_SERVCLASS_HDP_SINK:
    341         case UUID_SERVCLASS_HDP_SOURCE:
    342             if ((*pp_rec = SDP_FindServiceInDb(p_mcb->p_db, service_uuid,
    343                                                *pp_rec)) == NULL)
    344             {
    345                 found = FALSE;
    346             }
    347             break;
    348         default:
    349             if (((*pp_rec = bta_hl_find_sink_or_src_srv_class_in_db(p_mcb->p_db,
    350                                                                     *pp_rec)) == NULL))
    351             {
    352                 found = FALSE;
    353             }
    354             break;
    355     }
    356     return found;
    357 }
    358 
    359 /*******************************************************************************
    360 **
    361 ** Function      bta_hl_get_service_uuids
    362 **
    363 **
    364 ** Description  This function finds the service class(es) for both CCH and DCH oeprations
    365 **
    366 ** Returns      UINT16 - service_id
    367 **                       if service_uuid = 0xFFFF then it means service uuid
    368 **                       can be either Sink or Source
    369 **
    370 *******************************************************************************/
    371 UINT16 bta_hl_get_service_uuids(UINT8 sdp_oper, UINT8 app_idx, UINT8 mcl_idx,
    372                                 UINT8 mdl_idx )
    373 {
    374     tBTA_HL_MDL_CB          *p_dcb;
    375     UINT16                  service_uuid = 0xFFFF; /* both Sink and Source */
    376 
    377     switch (sdp_oper)
    378     {
    379 
    380         case BTA_HL_SDP_OP_DCH_OPEN_INIT:
    381         case BTA_HL_SDP_OP_DCH_RECONNECT_INIT:
    382             p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
    383             if (p_dcb->local_mdep_id != BTA_HL_ECHO_TEST_MDEP_ID)
    384             {
    385                 if (p_dcb->peer_mdep_role == BTA_HL_MDEP_ROLE_SINK)
    386                 {
    387                     service_uuid = UUID_SERVCLASS_HDP_SINK;
    388                 }
    389                 else
    390                 {
    391                     service_uuid = UUID_SERVCLASS_HDP_SOURCE;
    392                 }
    393             }
    394             break;
    395         case BTA_HL_SDP_OP_CCH_INIT:
    396         default:
    397             /* use default that is both Sink and Source */
    398             break;
    399     }
    400 #if BTA_HL_DEBUG == TRUE
    401     APPL_TRACE_DEBUG("bta_hl_get_service_uuids service_uuid=0x%x",service_uuid );
    402 #endif
    403     return service_uuid;
    404 }
    405 
    406 /*******************************************************************************
    407 **
    408 ** Function      bta_hl_find_echo_cfg_rsp
    409 **
    410 **
    411 ** Description  This function finds the configuration response for the echo test
    412 **
    413 ** Returns      BOOLEAN - TRUE found
    414 **                        FALSE not found
    415 **
    416 *******************************************************************************/
    417 BOOLEAN bta_hl_find_echo_cfg_rsp(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdep_idx, UINT8 cfg,
    418                                  UINT8 *p_cfg_rsp)
    419 {
    420     tBTA_HL_APP_CB      *p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
    421     tBTA_HL_MDEP        *p_mdep= &p_acb->sup_feature.mdep[mdep_idx];
    422     BOOLEAN             status =TRUE;
    423 
    424     if (p_mdep->mdep_id == BTA_HL_ECHO_TEST_MDEP_ID)
    425     {
    426         if ((cfg == BTA_HL_DCH_CFG_RELIABLE) || (cfg == BTA_HL_DCH_CFG_STREAMING))
    427         {
    428             *p_cfg_rsp = cfg;
    429         }
    430         else if (cfg == BTA_HL_DCH_CFG_NO_PREF )
    431         {
    432             *p_cfg_rsp = BTA_HL_DEFAULT_ECHO_TEST_SRC_DCH_CFG;
    433         }
    434         else
    435         {
    436             status = FALSE;
    437             APPL_TRACE_ERROR("Inavlid echo cfg value");
    438         }
    439         return status;
    440     }
    441 
    442 #if BTA_HL_DEBUG == TRUE
    443     if (!status)
    444     {
    445         APPL_TRACE_DEBUG("bta_hl_find_echo_cfg_rsp status=failed app_idx=%d mcl_idx=%d mdep_idx=%d cfg=%d",
    446                           app_idx, mcl_idx, mdep_idx, cfg);
    447     }
    448 #endif
    449 
    450     return status;
    451 }
    452 
    453 /*******************************************************************************
    454 **
    455 ** Function      bta_hl_validate_dch_cfg
    456 **
    457 ** Description  This function validate the DCH configuration
    458 **
    459 ** Returns      BOOLEAN - TRUE cfg is valid
    460 **                        FALSE not valid
    461 **
    462 *******************************************************************************/
    463 BOOLEAN bta_hl_validate_cfg(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx,
    464                             UINT8 cfg)
    465 {
    466     tBTA_HL_MDL_CB      *p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
    467     BOOLEAN is_valid =FALSE;
    468 
    469 
    470     if (!bta_hl_is_the_first_reliable_existed(app_idx, mcl_idx) &&
    471         (cfg != BTA_HL_DCH_CFG_RELIABLE))
    472     {
    473         APPL_TRACE_ERROR("the first DCH should be a reliable channel");
    474         return is_valid;
    475     }
    476 
    477     switch (p_dcb->local_cfg)
    478     {
    479         case BTA_HL_DCH_CFG_NO_PREF:
    480 
    481             if ((cfg == BTA_HL_DCH_CFG_RELIABLE) || (cfg == BTA_HL_DCH_CFG_STREAMING))
    482             {
    483                 is_valid = TRUE;
    484             }
    485             break;
    486         case BTA_HL_DCH_CFG_RELIABLE:
    487         case BTA_HL_DCH_CFG_STREAMING:
    488             if (p_dcb->local_cfg == cfg )
    489             {
    490                 is_valid = TRUE;
    491             }
    492             break;
    493         default:
    494             break;
    495     }
    496 
    497 #if BTA_HL_DEBUG == TRUE
    498     if (!is_valid)
    499     {
    500         APPL_TRACE_DEBUG("bta_hl_validate_dch_open_cfg is_valid=%d, cfg=%d", is_valid, cfg );
    501     }
    502 #endif
    503     return is_valid;
    504 }
    505 
    506 /*******************************************************************************
    507 **
    508 ** Function       bta_hl_find_cch_cb_indexes
    509 **
    510 ** Description  This function finds the indexes needed for the CCH state machine
    511 **
    512 ** Returns      BOOLEAN - TRUE found
    513 **                        FALSE not found
    514 **
    515 *******************************************************************************/
    516 BOOLEAN bta_hl_find_cch_cb_indexes(tBTA_HL_DATA *p_msg,
    517                                    UINT8 *p_app_idx,
    518                                    UINT8  *p_mcl_idx)
    519 {
    520     BOOLEAN found = FALSE;
    521     tBTA_HL_MCL_CB      *p_mcb;
    522     UINT8               app_idx = 0, mcl_idx = 0;
    523 
    524     switch (p_msg->hdr.event)
    525     {
    526         case BTA_HL_CCH_SDP_OK_EVT:
    527         case BTA_HL_CCH_SDP_FAIL_EVT:
    528             app_idx = p_msg->cch_sdp.app_idx;
    529             mcl_idx = p_msg->cch_sdp.mcl_idx;
    530             found = TRUE;
    531             break;
    532 
    533         case BTA_HL_MCA_CONNECT_IND_EVT:
    534 
    535             if (bta_hl_find_app_idx_using_handle(p_msg->mca_evt.app_handle, &app_idx))
    536             {
    537                 if (bta_hl_find_mcl_idx(app_idx, p_msg->mca_evt.mca_data.connect_ind.bd_addr, &mcl_idx))
    538                 {
    539                     /* local initiated */
    540                     found = TRUE;
    541                 }
    542                 else if (!bta_hl_find_mcl_idx_using_handle(p_msg->mca_evt.mcl_handle, &app_idx, &mcl_idx)&&
    543                          bta_hl_find_avail_mcl_idx(app_idx, &mcl_idx))
    544                 {
    545                     /* remote initiated */
    546                     p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
    547                     p_mcb->in_use = TRUE;
    548                     p_mcb->cch_oper = BTA_HL_CCH_OP_REMOTE_OPEN;
    549                     found = TRUE;
    550                 }
    551             }
    552             break;
    553 
    554         case BTA_HL_MCA_DISCONNECT_IND_EVT:
    555 
    556             if (bta_hl_find_mcl_idx_using_handle(p_msg->mca_evt.mcl_handle, &app_idx,  &mcl_idx))
    557             {
    558                 found = TRUE;
    559             }
    560             else if (bta_hl_find_app_idx_using_handle(p_msg->mca_evt.app_handle, &app_idx) &&
    561                      bta_hl_find_mcl_idx(app_idx, p_msg->mca_evt.mca_data.disconnect_ind.bd_addr, &mcl_idx))
    562             {
    563                 found = TRUE;
    564             }
    565 
    566             if (found)
    567             {
    568                 p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
    569                 if ((p_mcb->cch_oper != BTA_HL_CCH_OP_LOCAL_CLOSE) && (p_mcb->cch_oper != BTA_HL_CCH_OP_LOCAL_OPEN) )
    570                 {
    571                     p_mcb->cch_oper = BTA_HL_CCH_OP_REMOTE_CLOSE;
    572                 }
    573             }
    574             break;
    575 
    576         case BTA_HL_MCA_RSP_TOUT_IND_EVT:
    577 
    578             if (bta_hl_find_mcl_idx_using_handle(p_msg->mca_evt.mcl_handle, &app_idx,  &mcl_idx))
    579             {
    580                 found = TRUE;
    581             }
    582 
    583             if (found)
    584             {
    585                 p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
    586                 if ((p_mcb->cch_oper != BTA_HL_CCH_OP_REMOTE_CLOSE) && (p_mcb->cch_oper != BTA_HL_CCH_OP_LOCAL_OPEN))
    587                 {
    588                     p_mcb->cch_oper = BTA_HL_CCH_OP_LOCAL_CLOSE;
    589                 }
    590             }
    591             break;
    592         default:
    593             break;
    594     }
    595 
    596 
    597     if (found)
    598     {
    599         *p_app_idx = app_idx;
    600         *p_mcl_idx = mcl_idx;
    601     }
    602 
    603 #if BTA_HL_DEBUG == TRUE
    604     if (!found)
    605     {
    606         APPL_TRACE_DEBUG("bta_hl_find_cch_cb_indexes event=%s found=%d app_idx=%d mcl_idx=%d",
    607                           bta_hl_evt_code(p_msg->hdr.event), found, app_idx, mcl_idx);
    608     }
    609 #endif
    610 
    611     return found;
    612 }
    613 
    614 /*******************************************************************************
    615 **
    616 ** Function       bta_hl_find_dch_cb_indexes
    617 **
    618 ** Description  This function finds the indexes needed for the DCH state machine
    619 **
    620 ** Returns      BOOLEAN - TRUE found
    621 **                        FALSE not found
    622 **
    623 *******************************************************************************/
    624 BOOLEAN bta_hl_find_dch_cb_indexes(tBTA_HL_DATA *p_msg,
    625                                    UINT8 *p_app_idx,
    626                                    UINT8 *p_mcl_idx,
    627                                    UINT8 *p_mdl_idx)
    628 {
    629     BOOLEAN         found = FALSE;
    630     tBTA_HL_MCL_CB  *p_mcb;
    631     UINT8           app_idx = 0, mcl_idx = 0, mdl_idx = 0;
    632 
    633     switch (p_msg->hdr.event)
    634     {
    635         case BTA_HL_MCA_CREATE_CFM_EVT:
    636             if (bta_hl_find_mcl_idx_using_handle(p_msg->mca_evt.mcl_handle, &app_idx, &mcl_idx) &&
    637                 bta_hl_find_mdl_idx( app_idx,  mcl_idx,  p_msg->mca_evt.mca_data.create_cfm.mdl_id, &mdl_idx))
    638             {
    639                 found = TRUE;
    640             }
    641             break;
    642 
    643         case BTA_HL_MCA_CREATE_IND_EVT:
    644         case BTA_HL_MCA_RECONNECT_IND_EVT:
    645             if (bta_hl_find_mcl_idx_using_handle(p_msg->mca_evt.mcl_handle, &app_idx, &mcl_idx) &&
    646                 bta_hl_find_avail_mdl_idx( app_idx,  mcl_idx, &mdl_idx))
    647             {
    648                 found = TRUE;
    649             }
    650             break;
    651 
    652         case BTA_HL_MCA_OPEN_CFM_EVT:
    653             if (bta_hl_find_mcl_idx_using_handle(p_msg->mca_evt.mcl_handle, &app_idx, &mcl_idx) &&
    654                 bta_hl_find_mdl_idx( app_idx,  mcl_idx,  p_msg->mca_evt.mca_data.open_cfm.mdl_id, &mdl_idx))
    655             {
    656                 found = TRUE;
    657             }
    658             break;
    659 
    660         case BTA_HL_MCA_OPEN_IND_EVT:
    661             if (bta_hl_find_mcl_idx_using_handle(p_msg->mca_evt.mcl_handle, &app_idx, &mcl_idx) &&
    662                 bta_hl_find_mdl_idx( app_idx,  mcl_idx,  p_msg->mca_evt.mca_data.open_ind.mdl_id, &mdl_idx))
    663             {
    664                 found = TRUE;
    665             }
    666             break;
    667 
    668         case BTA_HL_MCA_CLOSE_CFM_EVT:
    669 
    670             if (bta_hl_find_mdl_idx_using_handle((tBTA_HL_MDL_HANDLE)p_msg->mca_evt.mca_data.close_cfm.mdl,
    671                                                  &app_idx, &mcl_idx, &mdl_idx))
    672             {
    673                 found = TRUE;
    674             }
    675             break;
    676         case BTA_HL_MCA_CLOSE_IND_EVT:
    677 
    678             if (bta_hl_find_mdl_idx_using_handle((tBTA_HL_MDL_HANDLE)p_msg->mca_evt.mca_data.close_ind.mdl,
    679                                                  &app_idx, &mcl_idx, &mdl_idx))
    680             {
    681                 found = TRUE;
    682             }
    683             break;
    684         case BTA_HL_API_SEND_DATA_EVT:
    685 
    686             if (bta_hl_find_mdl_idx_using_handle(p_msg->api_send_data.mdl_handle,
    687                                                  &app_idx, &mcl_idx, &mdl_idx ))
    688             {
    689                 found = TRUE;
    690             }
    691 
    692             break;
    693 
    694         case BTA_HL_MCA_CONG_CHG_EVT:
    695 
    696             if (bta_hl_find_mdl_idx_using_handle((tBTA_HL_MDL_HANDLE)p_msg->mca_evt.mca_data.cong_chg.mdl,
    697                                                  &app_idx, &mcl_idx, &mdl_idx ))
    698             {
    699                 found = TRUE;
    700             }
    701 
    702             break;
    703 
    704         case BTA_HL_MCA_RCV_DATA_EVT:
    705             app_idx = p_msg->mca_rcv_data_evt.app_idx;
    706             mcl_idx = p_msg->mca_rcv_data_evt.mcl_idx;
    707             mdl_idx = p_msg->mca_rcv_data_evt.mdl_idx;
    708             found = TRUE;
    709             break;
    710         case BTA_HL_DCH_RECONNECT_EVT:
    711         case BTA_HL_DCH_OPEN_EVT:
    712         case BTA_HL_DCH_ECHO_TEST_EVT:
    713         case BTA_HL_DCH_SDP_FAIL_EVT:
    714             app_idx = p_msg->dch_sdp.app_idx;
    715             mcl_idx = p_msg->dch_sdp.mcl_idx;
    716             mdl_idx = p_msg->dch_sdp.mdl_idx;
    717             found = TRUE;
    718             break;
    719         case BTA_HL_MCA_RECONNECT_CFM_EVT:
    720             if (bta_hl_find_mcl_idx_using_handle(p_msg->mca_evt.mcl_handle, &app_idx, &mcl_idx) &&
    721                 bta_hl_find_mdl_idx( app_idx,  mcl_idx,  p_msg->mca_evt.mca_data.reconnect_cfm.mdl_id, &mdl_idx))
    722             {
    723                 found = TRUE;
    724             }
    725             break;
    726 
    727 
    728         case BTA_HL_API_DCH_CREATE_RSP_EVT:
    729             if (bta_hl_find_mcl_idx_using_handle(p_msg->api_dch_create_rsp.mcl_handle, &app_idx, &mcl_idx)&&
    730                 bta_hl_find_mdl_idx( app_idx,  mcl_idx,p_msg->api_dch_create_rsp.mdl_id, &mdl_idx))
    731             {
    732                 found = TRUE;
    733             }
    734             break;
    735         case BTA_HL_MCA_ABORT_IND_EVT:
    736             if (bta_hl_find_mcl_idx_using_handle(p_msg->mca_evt.mcl_handle, &app_idx, &mcl_idx) &&
    737                 bta_hl_find_mdl_idx( app_idx,  mcl_idx,p_msg->mca_evt.mca_data.abort_ind.mdl_id, &mdl_idx))
    738             {
    739                 found = TRUE;
    740             }
    741             break;
    742         case BTA_HL_MCA_ABORT_CFM_EVT:
    743             if (bta_hl_find_mcl_idx_using_handle(p_msg->mca_evt.mcl_handle, &app_idx,  &mcl_idx) &&
    744                 bta_hl_find_mdl_idx( app_idx,  mcl_idx,  p_msg->mca_evt.mca_data.abort_cfm.mdl_id, &mdl_idx))
    745             {
    746                 found = TRUE;
    747             }
    748             break;
    749         case BTA_HL_CI_GET_TX_DATA_EVT:
    750         case BTA_HL_CI_PUT_RX_DATA_EVT:
    751             if (bta_hl_find_mdl_idx_using_handle(p_msg->ci_get_put_data.mdl_handle, &app_idx, &mcl_idx, &mdl_idx))
    752             {
    753                 found = TRUE;
    754             }
    755             break;
    756         case BTA_HL_CI_GET_ECHO_DATA_EVT:
    757         case BTA_HL_CI_PUT_ECHO_DATA_EVT:
    758             if (bta_hl_find_mcl_idx_using_handle(p_msg->ci_get_put_echo_data.mcl_handle, &app_idx, &mcl_idx))
    759             {
    760                 p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
    761                 mdl_idx = p_mcb->echo_mdl_idx;
    762                 found = TRUE;
    763             }
    764             break;
    765 
    766         default:
    767             break;
    768 
    769     }
    770 
    771     if (found)
    772     {
    773         *p_app_idx = app_idx;
    774         *p_mcl_idx = mcl_idx;
    775         *p_mdl_idx = mdl_idx;
    776     }
    777 #if BTA_HL_DEBUG == TRUE
    778     if (!found)
    779     {
    780         APPL_TRACE_DEBUG("bta_hl_find_dch_cb_indexes event=%s found=%d app_idx=%d mcl_idx=%d mdl_idx=%d",
    781                           bta_hl_evt_code(p_msg->hdr.event), found, *p_app_idx, *p_mcl_idx, *p_mdl_idx  );
    782     }
    783 #endif
    784 
    785     return found;
    786 }
    787 
    788 /*******************************************************************************
    789 **
    790 ** Function      bta_hl_allocate_mdl_id
    791 **
    792 ** Description  This function allocates a MDL ID
    793 **
    794 ** Returns      UINT16 - MDL ID
    795 **
    796 *******************************************************************************/
    797 UINT16  bta_hl_allocate_mdl_id(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx )
    798 {
    799     UINT16  mdl_id=0;
    800     tBTA_HL_MCL_CB      *p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
    801     BOOLEAN duplicate_id;
    802     UINT8 i, mdl_cfg_idx;
    803 
    804     do
    805     {
    806         duplicate_id = FALSE;
    807         mdl_id = ((mdl_id+1) & 0xFEFF);
    808         /* check mdl_ids that are used for the current conenctions */
    809         for (i=0; i< BTA_HL_NUM_MDLS_PER_MCL; i++)
    810         {
    811             if (p_mcb->mdl[i].in_use &&
    812                 (i != mdl_idx) &&
    813                 (p_mcb->mdl[i].mdl_id == mdl_id) )
    814             {
    815                 duplicate_id = TRUE;
    816                 break;
    817             }
    818         }
    819 
    820         if (duplicate_id)
    821         {
    822             /* start from the beginning to get another MDL value*/
    823             continue;
    824         }
    825         else
    826         {
    827             /* check mdl_ids that are stored in the persistent memory */
    828             if (bta_hl_find_mdl_cfg_idx(app_idx,mcl_idx, mdl_id, &mdl_cfg_idx))
    829             {
    830                 duplicate_id = TRUE;
    831             }
    832             else
    833             {
    834                 /* found a new MDL value */
    835                 break;
    836             }
    837         }
    838 
    839     }while (TRUE);
    840 
    841 #if BTA_HL_DEBUG == TRUE
    842     APPL_TRACE_DEBUG("bta_hl_allocate_mdl OK mdl_id=%d",  mdl_id);
    843 #endif
    844     return mdl_id;
    845 }
    846 /*******************************************************************************
    847 **
    848 ** Function      bta_hl_find_mdl_idx
    849 **
    850 ** Description  This function finds the MDL index based on mdl_id
    851 **
    852 ** Returns      BOOLEAN TRUE-found
    853 **
    854 *******************************************************************************/
    855 BOOLEAN bta_hl_find_mdl_idx(UINT8 app_idx, UINT8 mcl_idx, UINT16 mdl_id,
    856                             UINT8 *p_mdl_idx)
    857 {
    858     tBTA_HL_MCL_CB      *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
    859     BOOLEAN found=FALSE;
    860     UINT8 i;
    861 
    862     for (i=0; i < BTA_HL_NUM_MDLS_PER_MCL ; i ++)
    863     {
    864         if (p_mcb->mdl[i].in_use  &&
    865             (mdl_id !=0) &&
    866             (p_mcb->mdl[i].mdl_id== mdl_id))
    867         {
    868             found = TRUE;
    869             *p_mdl_idx = i;
    870             break;
    871         }
    872     }
    873 
    874 #if BTA_HL_DEBUG == TRUE
    875     if (!found)
    876     {
    877         APPL_TRACE_DEBUG("bta_hl_find_mdl_idx found=%d mdl_id=%d mdl_idx=%d ",
    878                           found, mdl_id, i);
    879     }
    880 #endif
    881 
    882     return found;
    883 }
    884 
    885 /*******************************************************************************
    886 **
    887 ** Function      bta_hl_find_an_active_mdl_idx
    888 **
    889 ** Description  This function finds an active MDL
    890 **
    891 ** Returns      BOOLEAN TRUE-found
    892 **
    893 *******************************************************************************/
    894 BOOLEAN bta_hl_find_an_active_mdl_idx(UINT8 app_idx, UINT8 mcl_idx,
    895                                       UINT8 *p_mdl_idx)
    896 {
    897     tBTA_HL_MCL_CB      *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
    898     BOOLEAN found=FALSE;
    899     UINT8 i;
    900 
    901     for (i=0; i < BTA_HL_NUM_MDLS_PER_MCL ; i ++)
    902     {
    903         if (p_mcb->mdl[i].in_use  &&
    904             (p_mcb->mdl[i].dch_state == BTA_HL_DCH_OPEN_ST))
    905         {
    906             found = TRUE;
    907             *p_mdl_idx = i;
    908             break;
    909         }
    910     }
    911 
    912 #if BTA_HL_DEBUG == TRUE
    913     if (found)
    914     {
    915         APPL_TRACE_DEBUG("bta_hl_find_an_opened_mdl_idx found=%d app_idx=%d mcl_idx=%d mdl_idx=%d",
    916                           found, app_idx, mcl_idx, i);
    917     }
    918 #endif
    919 
    920     return found;
    921 }
    922 
    923 /*******************************************************************************
    924 **
    925 ** Function      bta_hl_find_dch_setup_mdl_idx
    926 **
    927 ** Description  This function finds a MDL which in the DCH setup state
    928 **
    929 ** Returns      BOOLEAN TRUE-found
    930 **
    931 *******************************************************************************/
    932 BOOLEAN bta_hl_find_dch_setup_mdl_idx(UINT8 app_idx, UINT8 mcl_idx,
    933                                       UINT8 *p_mdl_idx)
    934 {
    935     tBTA_HL_MCL_CB      *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
    936     BOOLEAN found=FALSE;
    937     UINT8 i;
    938 
    939     for (i=0; i < BTA_HL_NUM_MDLS_PER_MCL ; i ++)
    940     {
    941         if (p_mcb->mdl[i].in_use  &&
    942             (p_mcb->mdl[i].dch_state == BTA_HL_DCH_OPENING_ST))
    943         {
    944             found = TRUE;
    945             *p_mdl_idx = i;
    946             break;
    947         }
    948     }
    949 
    950 #if BTA_HL_DEBUG == TRUE
    951     if (found)
    952     {
    953         APPL_TRACE_DEBUG("bta_hl_find_dch_setup_mdl_idx found=%d app_idx=%d mcl_idx=%d mdl_idx=%d",
    954                           found, app_idx, mcl_idx, i);
    955     }
    956 #endif
    957 
    958     return found;
    959 }
    960 
    961 /*******************************************************************************
    962 **
    963 ** Function      bta_hl_find_an_in_use_mcl_idx
    964 **
    965 ** Description  This function finds an in-use MCL control block index
    966 **
    967 ** Returns      BOOLEAN TRUE-found
    968 **
    969 *******************************************************************************/
    970 BOOLEAN bta_hl_find_an_in_use_mcl_idx(UINT8 app_idx,
    971                                       UINT8 *p_mcl_idx)
    972 {
    973     tBTA_HL_MCL_CB      *p_mcb;
    974     BOOLEAN found=FALSE;
    975     UINT8 i;
    976 
    977     for (i=0; i < BTA_HL_NUM_MCLS ; i ++)
    978     {
    979         p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, i);
    980         if (p_mcb->in_use  &&
    981             (p_mcb->cch_state != BTA_HL_CCH_IDLE_ST))
    982         {
    983             found = TRUE;
    984             *p_mcl_idx = i;
    985             break;
    986         }
    987     }
    988 
    989 #if BTA_HL_DEBUG == TRUE
    990     if (found)
    991     {
    992         APPL_TRACE_DEBUG("bta_hl_find_an_in_use_mcl_idx found=%d app_idx=%d mcl_idx=%d ",
    993                           found, app_idx, i);
    994     }
    995 #endif
    996 
    997     return found;
    998 }
    999 
   1000 
   1001 /*******************************************************************************
   1002 **
   1003 ** Function      bta_hl_find_an_in_use_app_idx
   1004 **
   1005 ** Description  This function finds an in-use application control block index
   1006 **
   1007 ** Returns      BOOLEAN TRUE-found
   1008 **
   1009 *******************************************************************************/
   1010 BOOLEAN bta_hl_find_an_in_use_app_idx(UINT8 *p_app_idx)
   1011 {
   1012     tBTA_HL_APP_CB      *p_acb ;
   1013     BOOLEAN found=FALSE;
   1014     UINT8 i;
   1015 
   1016     for (i=0; i < BTA_HL_NUM_APPS ; i ++)
   1017     {
   1018         p_acb  = BTA_HL_GET_APP_CB_PTR(i);
   1019         if (p_acb->in_use)
   1020         {
   1021             found = TRUE;
   1022             *p_app_idx = i;
   1023             break;
   1024         }
   1025     }
   1026 
   1027 #if BTA_HL_DEBUG == TRUE
   1028     if (found)
   1029     {
   1030         APPL_TRACE_DEBUG("bta_hl_find_an_in_use_app_idx found=%d app_idx=%d ",
   1031                           found, i);
   1032     }
   1033 #endif
   1034 
   1035     return found;
   1036 }
   1037 /*******************************************************************************
   1038 **
   1039 ** Function      bta_hl_find_app_idx
   1040 **
   1041 ** Description  This function finds the application control block index based on
   1042 **              the application ID
   1043 **
   1044 ** Returns      BOOLEAN TRUE-found
   1045 **
   1046 *******************************************************************************/
   1047 BOOLEAN bta_hl_find_app_idx(UINT8 app_id, UINT8 *p_app_idx)
   1048 {
   1049     BOOLEAN found=FALSE;
   1050     UINT8 i;
   1051 
   1052     for (i=0; i < BTA_HL_NUM_APPS ; i ++)
   1053     {
   1054         if (bta_hl_cb.acb[i].in_use &&
   1055             (bta_hl_cb.acb[i].app_id == app_id))
   1056         {
   1057             found = TRUE;
   1058             *p_app_idx = i;
   1059             break;
   1060         }
   1061     }
   1062 
   1063 #if BTA_HL_DEBUG == TRUE
   1064     APPL_TRACE_DEBUG("bta_hl_find_app_idx found=%d app_id=%d idx=%d ",
   1065                       found, app_id, i);
   1066 #endif
   1067 
   1068     return found;
   1069 }
   1070 
   1071 
   1072 /*******************************************************************************
   1073 **
   1074 ** Function      bta_hl_find_app_idx_using_handle
   1075 **
   1076 ** Description  This function finds the application control block index based on
   1077 **              the application handle
   1078 **
   1079 ** Returns      BOOLEAN TRUE-found
   1080 **
   1081 *******************************************************************************/
   1082 BOOLEAN bta_hl_find_app_idx_using_handle(tBTA_HL_APP_HANDLE app_handle,
   1083                                          UINT8 *p_app_idx)
   1084 {
   1085     BOOLEAN found=FALSE;
   1086     UINT8 i;
   1087 
   1088     for (i=0; i < BTA_HL_NUM_APPS ; i ++)
   1089     {
   1090         if (bta_hl_cb.acb[i].in_use &&
   1091             (bta_hl_cb.acb[i].app_handle == app_handle))
   1092         {
   1093             found = TRUE;
   1094             *p_app_idx = i;
   1095             break;
   1096         }
   1097     }
   1098 
   1099 #if BTA_HL_DEBUG == TRUE
   1100     if (!found)
   1101     {
   1102         APPL_TRACE_DEBUG("bta_hl_find_app_idx_using_mca_handle status=%d handle=%d app_idx=%d ",
   1103                           found, app_handle , i);
   1104     }
   1105 #endif
   1106 
   1107     return found;
   1108 }
   1109 
   1110 
   1111 /*******************************************************************************
   1112 **
   1113 ** Function      bta_hl_find_mcl_idx_using_handle
   1114 **
   1115 ** Description  This function finds the MCL control block index based on
   1116 **              the MCL handle
   1117 **
   1118 ** Returns      BOOLEAN TRUE-found
   1119 **
   1120 *******************************************************************************/
   1121 BOOLEAN bta_hl_find_mcl_idx_using_handle( tBTA_HL_MCL_HANDLE mcl_handle,
   1122                                           UINT8 *p_app_idx, UINT8 *p_mcl_idx)
   1123 {
   1124     tBTA_HL_APP_CB  *p_acb;
   1125     BOOLEAN         found=FALSE;
   1126     UINT8 i = 0,j = 0;
   1127 
   1128     for (i=0; i<BTA_HL_NUM_APPS; i++)
   1129     {
   1130         p_acb = BTA_HL_GET_APP_CB_PTR(i);
   1131         if (p_acb->in_use)
   1132         {
   1133             for (j=0; j < BTA_HL_NUM_MCLS ; j++)
   1134             {
   1135                 if ( p_acb->mcb[j].mcl_handle == mcl_handle )
   1136                 {
   1137                     found = TRUE;
   1138                     *p_app_idx = i;
   1139                     *p_mcl_idx = j;
   1140                     break;
   1141                 }
   1142             }
   1143         }
   1144     }
   1145 
   1146 #if BTA_HL_DEBUG == TRUE
   1147     if (!found)
   1148     {
   1149         APPL_TRACE_DEBUG("bta_hl_find_mcl_idx_using_handle found=%d app_idx=%d mcl_idx=%d",
   1150                           found, i, j);
   1151     }
   1152 #endif
   1153     return found;
   1154 }
   1155 
   1156 /*******************************************************************************
   1157 **
   1158 ** Function      bta_hl_find_mcl_idx
   1159 **
   1160 ** Description  This function finds the MCL control block index based on
   1161 **              the peer BD address
   1162 **
   1163 ** Returns      BOOLEAN TRUE-found
   1164 **
   1165 *******************************************************************************/
   1166 BOOLEAN bta_hl_find_mcl_idx(UINT8 app_idx, BD_ADDR p_bd_addr, UINT8 *p_mcl_idx)
   1167 {
   1168     BOOLEAN found=FALSE;
   1169     UINT8 i;
   1170 
   1171     for (i=0; i < BTA_HL_NUM_MCLS ; i ++)
   1172     {
   1173         BTA_HL_GET_MCL_CB_PTR(app_idx, i);
   1174 
   1175         if (bta_hl_cb.acb[app_idx].mcb[i].in_use &&
   1176             (!memcmp (bta_hl_cb.acb[app_idx].mcb[i].bd_addr, p_bd_addr, BD_ADDR_LEN)))
   1177         {
   1178             found = TRUE;
   1179             *p_mcl_idx = i;
   1180             break;
   1181         }
   1182     }
   1183 
   1184 #if BTA_HL_DEBUG == TRUE
   1185     if (!found)
   1186     {
   1187         APPL_TRACE_DEBUG("bta_hl_find_mcl_idx found=%d idx=%d",
   1188                           found, i);
   1189     }
   1190 #endif
   1191     return found;
   1192 }
   1193 
   1194 
   1195 
   1196 /*******************************************************************************
   1197 **
   1198 ** Function      bta_hl_find_mdl_idx_using_handle
   1199 **
   1200 ** Description  This function finds the MDL control block index based on
   1201 **              the MDL handle
   1202 **
   1203 ** Returns      BOOLEAN TRUE-found
   1204 **
   1205 *******************************************************************************/
   1206 BOOLEAN bta_hl_find_mdl_idx_using_handle(tBTA_HL_MDL_HANDLE mdl_handle,
   1207                                          UINT8 *p_app_idx,UINT8 *p_mcl_idx,
   1208                                          UINT8 *p_mdl_idx)
   1209 {
   1210     tBTA_HL_APP_CB      *p_acb;
   1211     tBTA_HL_MCL_CB      *p_mcb;
   1212     tBTA_HL_MDL_CB      *p_dcb;
   1213     BOOLEAN found=FALSE;
   1214     UINT8 i,j,k;
   1215 
   1216     for (i=0; i < BTA_HL_NUM_APPS ; i ++)
   1217     {
   1218         p_acb = BTA_HL_GET_APP_CB_PTR(i);
   1219         if (p_acb->in_use)
   1220         {
   1221             for (j=0; j< BTA_HL_NUM_MCLS; j++)
   1222             {
   1223                 p_mcb = BTA_HL_GET_MCL_CB_PTR(i,j);
   1224                 if (p_mcb->in_use)
   1225                 {
   1226                     for (k=0; k< BTA_HL_NUM_MDLS_PER_MCL; k++)
   1227                     {
   1228                         p_dcb = BTA_HL_GET_MDL_CB_PTR(i,j,k);
   1229                         if (p_dcb->in_use)
   1230                         {
   1231                             if (p_dcb->mdl_handle == mdl_handle)
   1232                             {
   1233                                 found = TRUE;
   1234                                 *p_app_idx = i;
   1235                                 *p_mcl_idx =j;
   1236                                 *p_mdl_idx = k;
   1237                                 break;
   1238                             }
   1239                         }
   1240                     }
   1241                 }
   1242             }
   1243         }
   1244     }
   1245 
   1246 
   1247 #if BTA_HL_DEBUG == TRUE
   1248     if (!found)
   1249     {
   1250         APPL_TRACE_DEBUG("bta_hl_find_mdl_idx_using_handle found=%d mdl_handle=%d  ",
   1251                           found, mdl_handle);
   1252     }
   1253 #endif
   1254     return found;
   1255 }
   1256 /*******************************************************************************
   1257 **
   1258 ** Function      bta_hl_is_the_first_reliable_existed
   1259 **
   1260 ** Description  This function checks whether the first reliable DCH channel
   1261 **              has been setup on the MCL or not
   1262 **
   1263 ** Returns      BOOLEAN - TRUE exist
   1264 **                        FALSE does not exist
   1265 **
   1266 *******************************************************************************/
   1267 BOOLEAN bta_hl_is_the_first_reliable_existed(UINT8 app_idx, UINT8 mcl_idx )
   1268 {
   1269     tBTA_HL_MCL_CB      *p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
   1270     BOOLEAN is_existed =FALSE;
   1271     UINT8 i ;
   1272 
   1273     for (i=0; i< BTA_HL_NUM_MDLS_PER_MCL; i++)
   1274     {
   1275         if (p_mcb->mdl[i].in_use && p_mcb->mdl[i].is_the_first_reliable)
   1276         {
   1277             is_existed = TRUE;
   1278             break;
   1279         }
   1280     }
   1281 
   1282 #if BTA_HL_DEBUG == TRUE
   1283     APPL_TRACE_DEBUG("bta_hl_is_the_first_reliable_existed is_existed=%d  ",is_existed );
   1284 #endif
   1285     return is_existed;
   1286 }
   1287 
   1288 /*******************************************************************************
   1289 **
   1290 ** Function      bta_hl_find_non_active_mdl_cfg
   1291 **
   1292 ** Description  This function finds a valid MDL configiration index and this
   1293 **              MDL ID is not active
   1294 **
   1295 ** Returns      BOOLEAN - TRUE found
   1296 **                        FALSE not found
   1297 **
   1298 *******************************************************************************/
   1299 BOOLEAN  bta_hl_find_non_active_mdl_cfg(UINT8 app_idx, UINT8 start_mdl_cfg_idx,
   1300                                         UINT8 *p_mdl_cfg_idx)
   1301 {
   1302 
   1303     tBTA_HL_MCL_CB      *p_mcb;
   1304     tBTA_HL_MDL_CB      *p_dcb;
   1305     tBTA_HL_MDL_CFG     *p_mdl;
   1306     BOOLEAN             mdl_in_use;
   1307     BOOLEAN             found = FALSE;
   1308     UINT8               i,j,k;
   1309 
   1310     for (i = start_mdl_cfg_idx; i< BTA_HL_NUM_MDL_CFGS; i++)
   1311     {
   1312         mdl_in_use = FALSE;
   1313         p_mdl = BTA_HL_GET_MDL_CFG_PTR(app_idx, i);
   1314         for (j=0; j< BTA_HL_NUM_MCLS; j++)
   1315         {
   1316             p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, j);
   1317             if (p_mcb->in_use &&
   1318                 !memcmp(p_mdl->peer_bd_addr,p_mcb->bd_addr,BD_ADDR_LEN))
   1319             {
   1320 
   1321                 for (k=0; k<BTA_HL_NUM_MDLS_PER_MCL; k++)
   1322                 {
   1323                     p_dcb  = BTA_HL_GET_MDL_CB_PTR(app_idx, j, k);
   1324 
   1325                     if (p_dcb->in_use &&  p_mdl->mdl_id == p_dcb->mdl_id)
   1326                     {
   1327                         mdl_in_use = TRUE;
   1328                         break;
   1329                     }
   1330                 }
   1331             }
   1332 
   1333             if (mdl_in_use)
   1334             {
   1335                 break;
   1336             }
   1337         }
   1338 
   1339         if (!mdl_in_use)
   1340         {
   1341             *p_mdl_cfg_idx = i;
   1342             found = TRUE;
   1343             break;
   1344         }
   1345     }
   1346 
   1347     return found;
   1348 }
   1349 
   1350 /*******************************************************************************
   1351 **
   1352 ** Function      bta_hl_find_mdl_cfg_idx
   1353 **
   1354 ** Description  This function finds an available MDL configuration index
   1355 **
   1356 ** Returns      BOOLEAN - TRUE found
   1357 **                        FALSE not found
   1358 **
   1359 *******************************************************************************/
   1360 BOOLEAN  bta_hl_find_avail_mdl_cfg_idx(UINT8 app_idx, UINT8 mcl_idx,
   1361                                        UINT8 *p_mdl_cfg_idx)
   1362 {
   1363     tBTA_HL_MDL_CFG     *p_mdl, *p_mdl1, *p_mdl2;
   1364     UINT8               i;
   1365     BOOLEAN             found=FALSE;
   1366     UINT8               first_mdl_cfg_idx, second_mdl_cfg_idx, older_mdl_cfg_idx;
   1367     BOOLEAN             done;
   1368     UNUSED(mcl_idx);
   1369 
   1370     for (i=0; i< BTA_HL_NUM_MDL_CFGS; i++)
   1371     {
   1372         p_mdl = BTA_HL_GET_MDL_CFG_PTR(app_idx, i);
   1373         if (!p_mdl->active  )
   1374         {
   1375             /* found an unused space to store mdl cfg*/
   1376             found=TRUE;
   1377             *p_mdl_cfg_idx =i;
   1378             break;
   1379         }
   1380     }
   1381 
   1382     if (!found)
   1383     {
   1384         /* all available mdl cfg spaces are in use so we need to find the mdl cfg which is
   1385         not currently in use and has the the oldest time stamp to remove*/
   1386 
   1387         found = TRUE;
   1388         if (bta_hl_find_non_active_mdl_cfg(app_idx,0, &first_mdl_cfg_idx))
   1389         {
   1390             if (bta_hl_find_non_active_mdl_cfg(app_idx,(UINT8) (first_mdl_cfg_idx+1), &second_mdl_cfg_idx))
   1391             {
   1392                 done = FALSE;
   1393                 while (!done)
   1394                 {
   1395                     p_mdl1 = BTA_HL_GET_MDL_CFG_PTR(app_idx, first_mdl_cfg_idx);
   1396                     p_mdl2 = BTA_HL_GET_MDL_CFG_PTR(app_idx, second_mdl_cfg_idx);
   1397 
   1398                     if (p_mdl1->time < p_mdl2->time)
   1399                     {
   1400                         older_mdl_cfg_idx =  first_mdl_cfg_idx;
   1401                     }
   1402                     else
   1403                     {
   1404                         older_mdl_cfg_idx =  second_mdl_cfg_idx;
   1405                     }
   1406 
   1407                     if (bta_hl_find_non_active_mdl_cfg(app_idx,(UINT8) (second_mdl_cfg_idx+1), &second_mdl_cfg_idx))
   1408                     {
   1409                         first_mdl_cfg_idx = older_mdl_cfg_idx;
   1410                     }
   1411                     else
   1412                     {
   1413                         done = TRUE;
   1414                     }
   1415                 }
   1416 
   1417                 *p_mdl_cfg_idx = older_mdl_cfg_idx;
   1418 
   1419             }
   1420             else
   1421             {
   1422                 *p_mdl_cfg_idx = first_mdl_cfg_idx;
   1423             }
   1424 
   1425         }
   1426         else
   1427         {
   1428             found = FALSE;
   1429         }
   1430     }
   1431 
   1432 #if BTA_HL_DEBUG == TRUE
   1433     if (!found)
   1434     {
   1435         APPL_TRACE_DEBUG("bta_hl_find_avail_mdl_cfg_idx found=%d mdl_cfg_idx=%d ",found, *p_mdl_cfg_idx  );
   1436     }
   1437 #endif
   1438 
   1439     return found;
   1440 
   1441 
   1442 }
   1443 
   1444 /*******************************************************************************
   1445 **
   1446 ** Function      bta_hl_find_mdl_cfg_idx
   1447 **
   1448 ** Description  This function finds the MDL configuration index based on
   1449 **              the MDL ID
   1450 **
   1451 ** Returns      BOOLEAN - TRUE found
   1452 **                        FALSE not found
   1453 **
   1454 *******************************************************************************/
   1455 BOOLEAN  bta_hl_find_mdl_cfg_idx(UINT8 app_idx, UINT8 mcl_idx,
   1456                                  tBTA_HL_MDL_ID mdl_id, UINT8 *p_mdl_cfg_idx)
   1457 {
   1458     tBTA_HL_MCL_CB      *p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
   1459     tBTA_HL_MDL_CFG     *p_mdl;
   1460     UINT8 i ;
   1461     BOOLEAN found=FALSE;
   1462 
   1463     *p_mdl_cfg_idx = 0;
   1464     for (i=0; i< BTA_HL_NUM_MDL_CFGS; i++)
   1465     {
   1466         p_mdl = BTA_HL_GET_MDL_CFG_PTR(app_idx, i);
   1467         if(p_mdl->active)
   1468             APPL_TRACE_DEBUG("bta_hl_find_mdl_cfg_idx: mdl_id =%d, p_mdl->mdl_id=%d",mdl_id,
   1469                               p_mdl->mdl_id);
   1470         if (p_mdl->active &&
   1471             (!memcmp (p_mcb->bd_addr, p_mdl->peer_bd_addr, BD_ADDR_LEN))&&
   1472             (p_mdl->mdl_id == mdl_id))
   1473         {
   1474             found=TRUE;
   1475             *p_mdl_cfg_idx =i;
   1476             break;
   1477         }
   1478     }
   1479 
   1480 #if BTA_HL_DEBUG == TRUE
   1481     if (!found)
   1482     {
   1483         APPL_TRACE_DEBUG("bta_hl_find_mdl_cfg_idx found=%d mdl_cfg_idx=%d ",found, i );
   1484     }
   1485 #endif
   1486 
   1487     return found;
   1488 
   1489 
   1490 }
   1491 
   1492 
   1493 /*******************************************************************************
   1494 **
   1495 ** Function      bta_hl_get_cur_time
   1496 **
   1497 ** Description  This function get the cuurent time value
   1498 **
   1499 ** Returns      BOOLEAN - TRUE found
   1500 **                        FALSE not found
   1501 **
   1502 *******************************************************************************/
   1503 BOOLEAN  bta_hl_get_cur_time(UINT8 app_idx, UINT8 *p_cur_time)
   1504 {
   1505     tBTA_HL_MDL_CFG     *p_mdl;
   1506     UINT8 i, j, time_latest, time;
   1507     BOOLEAN found=FALSE, result=TRUE;
   1508 
   1509     for (i=0; i< BTA_HL_NUM_MDL_CFGS; i++)
   1510     {
   1511         p_mdl = BTA_HL_GET_MDL_CFG_PTR(app_idx, i);
   1512         if (p_mdl->active)
   1513         {
   1514             found=TRUE;
   1515             time_latest = p_mdl->time;
   1516             for (j=(i+1); j< BTA_HL_NUM_MDL_CFGS; j++ )
   1517             {
   1518                 p_mdl = BTA_HL_GET_MDL_CFG_PTR(app_idx, j);
   1519                 if (p_mdl->active)
   1520                 {
   1521                     time = p_mdl->time;
   1522                     if (time > time_latest)
   1523                     {
   1524                         time_latest = time;
   1525                     }
   1526                 }
   1527             }
   1528             break;
   1529         }
   1530     }
   1531 
   1532 
   1533     if (found)
   1534     {
   1535         if (time_latest < BTA_HL_MAX_TIME)
   1536         {
   1537             *p_cur_time = time_latest+1;
   1538         }
   1539         else
   1540         {
   1541             /* need to wrap around */
   1542             result = FALSE;
   1543         }
   1544     }
   1545     else
   1546     {
   1547         *p_cur_time = BTA_HL_MIN_TIME;
   1548     }
   1549 
   1550 #if BTA_HL_DEBUG == TRUE
   1551     if (!result)
   1552     {
   1553         APPL_TRACE_DEBUG("bta_hl_get_cur_time result=%s cur_time=%d",
   1554                           (result?"OK":"FAIL"), *p_cur_time);
   1555     }
   1556 #endif
   1557 
   1558     return result;
   1559 }
   1560 
   1561 /*******************************************************************************
   1562 **
   1563 ** Function      bta_hl_sort_cfg_time_idx
   1564 **
   1565 ** Description  This function sort the mdl configuration idx stored in array a
   1566 **              based on decending time value
   1567 **
   1568 ** Returns      BOOLEAN - TRUE found
   1569 **                        FALSE not found
   1570 **
   1571 *******************************************************************************/
   1572 void bta_hl_sort_cfg_time_idx(UINT8 app_idx, UINT8 *a, UINT8 n)
   1573 {
   1574     tBTA_HL_APP_CB      *p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
   1575     UINT8 temp_time, temp_idx;
   1576     INT16 i, j;
   1577     for (i = 1; i < n; ++i)
   1578     {
   1579         temp_idx = a[i];
   1580         temp_time = p_acb->mdl_cfg[temp_idx].time;
   1581         j = i - 1;
   1582         while ((j >= 0) && (temp_time < p_acb->mdl_cfg[a[j]].time))
   1583         {
   1584             a[j + 1] = a[j];
   1585             --j;
   1586         }
   1587         a[j + 1] = temp_idx;
   1588     }
   1589 }
   1590 
   1591 /*******************************************************************************
   1592 **
   1593 ** Function      bta_hl_compact_mdl_cfg_time
   1594 **
   1595 ** Description  This function finds the MDL configuration index based on
   1596 **              the MDL ID
   1597 **
   1598 ** Returns      BOOLEAN - TRUE found
   1599 **                        FALSE not found
   1600 **
   1601 *******************************************************************************/
   1602 void  bta_hl_compact_mdl_cfg_time(UINT8 app_idx, UINT8 mdep_id)
   1603 {
   1604     tBTA_HL_MDL_CFG     *p_mdl;
   1605     UINT8 i, time_min, cnt=0;
   1606     UINT8   s_arr[BTA_HL_NUM_MDL_CFGS];
   1607 
   1608 
   1609     for (i=0; i< BTA_HL_NUM_MDL_CFGS; i++)
   1610     {
   1611         p_mdl = BTA_HL_GET_MDL_CFG_PTR(app_idx, i);
   1612         if (p_mdl->active )
   1613         {
   1614             s_arr[cnt]= i;
   1615             cnt++;
   1616         }
   1617     }
   1618 
   1619 
   1620 
   1621 #if BTA_HL_DEBUG == TRUE
   1622     APPL_TRACE_DEBUG("bta_hl_compact_mdl_cfg_time cnt=%d ",cnt );
   1623 #endif
   1624 
   1625 
   1626     if (cnt)
   1627     {
   1628         bta_hl_sort_cfg_time_idx(app_idx, s_arr, cnt);
   1629         time_min = BTA_HL_MIN_TIME;
   1630         for (i=0;i<cnt; i++)
   1631         {
   1632             p_mdl = BTA_HL_GET_MDL_CFG_PTR(app_idx, s_arr[i]);
   1633             p_mdl->time = time_min + i;
   1634             bta_hl_co_save_mdl(mdep_id, s_arr[i], p_mdl);
   1635         }
   1636     }
   1637 
   1638 
   1639 }
   1640 
   1641 
   1642 
   1643 /*******************************************************************************
   1644 **
   1645 ** Function      bta_hl_is_mdl_exsit_in_mcl
   1646 **
   1647 ** Description  This function checks whether the MDL ID
   1648 **              has already existed in teh MCL or not
   1649 **
   1650 ** Returns      BOOLEAN - TRUE exist
   1651 **                        FALSE does not exist
   1652 **
   1653 *******************************************************************************/
   1654 BOOLEAN  bta_hl_is_mdl_exsit_in_mcl(UINT8 app_idx, BD_ADDR bd_addr,
   1655                                     tBTA_HL_MDL_ID mdl_id)
   1656 {
   1657     tBTA_HL_MDL_CFG     *p_mdl;
   1658     BOOLEAN             found = FALSE;
   1659     UINT8               i;
   1660 
   1661     for (i = 0; i< BTA_HL_NUM_MDL_CFGS; i++)
   1662     {
   1663         p_mdl = BTA_HL_GET_MDL_CFG_PTR(app_idx, i);
   1664         if (p_mdl->active &&
   1665             !memcmp(p_mdl->peer_bd_addr, bd_addr,BD_ADDR_LEN))
   1666         {
   1667             if (mdl_id != BTA_HL_DELETE_ALL_MDL_IDS)
   1668             {
   1669                 if (p_mdl->mdl_id == mdl_id)
   1670                 {
   1671                     found = TRUE;
   1672                     break;
   1673                 }
   1674             }
   1675             else
   1676             {
   1677                 found = TRUE;
   1678                 break;
   1679             }
   1680         }
   1681     }
   1682 
   1683     return found;
   1684 }
   1685 
   1686 /*******************************************************************************
   1687 **
   1688 ** Function      bta_hl_delete_mdl_cfg
   1689 **
   1690 ** Description  This function delete the specified MDL ID
   1691 **
   1692 ** Returns      BOOLEAN - TRUE Success
   1693 **                        FALSE Failed
   1694 **
   1695 *******************************************************************************/
   1696 BOOLEAN  bta_hl_delete_mdl_cfg(UINT8 app_idx, BD_ADDR bd_addr,
   1697                                tBTA_HL_MDL_ID mdl_id)
   1698 {
   1699     tBTA_HL_MDL_CFG     *p_mdl;
   1700     BOOLEAN             success = FALSE;
   1701     UINT8               i;
   1702 
   1703     for (i = 0; i< BTA_HL_NUM_MDL_CFGS; i++)
   1704     {
   1705         p_mdl = BTA_HL_GET_MDL_CFG_PTR(app_idx, i);
   1706         if (p_mdl->active &&
   1707             !memcmp(p_mdl->peer_bd_addr, bd_addr,BD_ADDR_LEN))
   1708         {
   1709             if (mdl_id != BTA_HL_DELETE_ALL_MDL_IDS)
   1710             {
   1711                 if (p_mdl->mdl_id == mdl_id)
   1712                 {
   1713                     bta_hl_co_delete_mdl(p_mdl->local_mdep_id, i);
   1714                     memset(p_mdl, 0, sizeof(tBTA_HL_MDL_CFG));
   1715                     success = TRUE;
   1716                     break;
   1717                 }
   1718             }
   1719             else
   1720             {
   1721                 bta_hl_co_delete_mdl(p_mdl->local_mdep_id, i);
   1722                 memset(p_mdl, 0, sizeof(tBTA_HL_MDL_CFG));
   1723                 success = TRUE;
   1724             }
   1725         }
   1726     }
   1727 
   1728     return success;
   1729 }
   1730 
   1731 
   1732 /*******************************************************************************
   1733 **
   1734 ** Function      bta_hl_is_mdl_value_valid
   1735 **
   1736 **
   1737 ** Description  This function checks the specified MDL ID is in valid range or not
   1738 **
   1739 ** Returns      BOOLEAN - TRUE Success
   1740 **                        FALSE Failed
   1741 **
   1742 ** note:   mdl_id range   0x0000 reserved,
   1743 **                        0x0001-oxFEFF dynamic range,
   1744 **                        0xFF00-0xFFFE reserved,
   1745 **                        0xFFFF indicates all MDLs (for delete operation only)
   1746 **
   1747 *******************************************************************************/
   1748 BOOLEAN  bta_hl_is_mdl_value_valid(tBTA_HL_MDL_ID mdl_id)
   1749 {
   1750     BOOLEAN             status = TRUE;
   1751 
   1752     if (mdl_id != BTA_HL_DELETE_ALL_MDL_IDS)
   1753     {
   1754         if (mdl_id != 0)
   1755         {
   1756             if (mdl_id > BTA_HL_MAX_MDL_VAL )
   1757             {
   1758                 status = FALSE;
   1759             }
   1760         }
   1761         else
   1762         {
   1763             status = FALSE;
   1764         }
   1765     }
   1766 
   1767     return status;
   1768 }
   1769 
   1770 /*******************************************************************************
   1771 **
   1772 ** Function      bta_hl_find_mdep_cfg_idx
   1773 **
   1774 ** Description  This function finds the MDEP configuration index based
   1775 **                on the local MDEP ID
   1776 **
   1777 ** Returns      BOOLEAN - TRUE found
   1778 **                        FALSE not found
   1779 **
   1780 *******************************************************************************/
   1781 BOOLEAN bta_hl_find_mdep_cfg_idx(UINT8 app_idx,  tBTA_HL_MDEP_ID local_mdep_id,
   1782                                  UINT8 *p_mdep_cfg_idx)
   1783 {
   1784     tBTA_HL_APP_CB      *p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
   1785     tBTA_HL_SUP_FEATURE     *p_sup_feature= &p_acb->sup_feature;
   1786     BOOLEAN found =FALSE;
   1787     UINT8 i;
   1788 
   1789     for (i=0; i< p_sup_feature->num_of_mdeps; i++)
   1790     {
   1791         if ( p_sup_feature->mdep[i].mdep_id == local_mdep_id)
   1792         {
   1793             found = TRUE;
   1794             *p_mdep_cfg_idx = i;
   1795             break;
   1796         }
   1797     }
   1798 
   1799 #if BTA_HL_DEBUG == TRUE
   1800     if (!found)
   1801     {
   1802         APPL_TRACE_DEBUG("bta_hl_find_mdep_cfg_idx found=%d mdep_idx=%d local_mdep_id=%d ",
   1803                           found,i, local_mdep_id );
   1804     }
   1805 #endif
   1806     return found;
   1807 }
   1808 
   1809 
   1810 /*******************************************************************************
   1811 **
   1812 ** Function      bta_hl_find_rxtx_apdu_size
   1813 **
   1814 ** Description  This function finds the maximum APDU rx and tx sizes based on
   1815 **              the MDEP configuration data
   1816 **
   1817 ** Returns      void
   1818 **
   1819 *******************************************************************************/
   1820 void bta_hl_find_rxtx_apdu_size(UINT8 app_idx, UINT8 mdep_cfg_idx,
   1821                                 UINT16 *p_rx_apu_size,
   1822                                 UINT16 *p_tx_apu_size)
   1823 {
   1824     tBTA_HL_APP_CB      *p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
   1825     tBTA_HL_MDEP_CFG     *p_mdep_cfg;
   1826     UINT8 i;
   1827     UINT16 max_rx_apdu_size=0, max_tx_apdu_size=0;
   1828 
   1829     p_mdep_cfg = &p_acb->sup_feature.mdep[mdep_cfg_idx].mdep_cfg;
   1830 
   1831 
   1832     for (i=0; i< p_mdep_cfg->num_of_mdep_data_types ; i++)
   1833     {
   1834 
   1835         if (max_rx_apdu_size < p_mdep_cfg->data_cfg[i].max_rx_apdu_size)
   1836         {
   1837             max_rx_apdu_size = p_mdep_cfg->data_cfg[i].max_rx_apdu_size;
   1838         }
   1839 
   1840         if (max_tx_apdu_size < p_mdep_cfg->data_cfg[i].max_tx_apdu_size)
   1841         {
   1842             max_tx_apdu_size = p_mdep_cfg->data_cfg[i].max_tx_apdu_size;
   1843         }
   1844     }
   1845 
   1846 
   1847     *p_rx_apu_size = max_rx_apdu_size;
   1848     *p_tx_apu_size = max_tx_apdu_size;
   1849 
   1850 #if BTA_HL_DEBUG == TRUE
   1851     APPL_TRACE_DEBUG("bta_hl_find_rxtx_apdu_size max_rx_apdu_size=%d max_tx_apdu_size=%d ",
   1852                       max_rx_apdu_size, max_tx_apdu_size );
   1853 #endif
   1854 
   1855 
   1856 }
   1857 
   1858 /*******************************************************************************
   1859 **
   1860 ** Function      bta_hl_validate_peer_cfg
   1861 **
   1862 ** Description  This function validates the peer DCH configuration
   1863 **
   1864 ** Returns      BOOLEAN - TRUE validation is successful
   1865 **                        FALSE validation failed
   1866 **
   1867 *******************************************************************************/
   1868 BOOLEAN bta_hl_validate_peer_cfg(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx,
   1869                                  tBTA_HL_MDEP_ID peer_mdep_id,
   1870                                  tBTA_HL_MDEP_ROLE peer_mdep_role,
   1871                                  UINT8 sdp_idx)
   1872 {
   1873     tBTA_HL_MCL_CB      *p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
   1874     tBTA_HL_MDL_CB      *p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
   1875     tBTA_HL_SDP_REC     *p_rec;
   1876     BOOLEAN peer_found =FALSE;
   1877     UINT8 i;
   1878 
   1879     APPL_TRACE_DEBUG("bta_hl_validate_peer_cfg sdp_idx=%d app_idx %d", sdp_idx, app_idx);
   1880 
   1881 
   1882     if (p_dcb->local_mdep_id == BTA_HL_ECHO_TEST_MDEP_ID)
   1883     {
   1884         return TRUE;
   1885     }
   1886 
   1887     p_rec = &p_mcb->sdp.sdp_rec[sdp_idx];
   1888     for (i=0; i< p_rec->num_mdeps; i++)
   1889     {
   1890         APPL_TRACE_DEBUG("mdep_id %d peer_mdep_id %d",p_rec->mdep_cfg[i].mdep_id , peer_mdep_id);
   1891         APPL_TRACE_DEBUG("mdep_role %d peer_mdep_role %d",p_rec->mdep_cfg[i].mdep_role,
   1892                           peer_mdep_role)
   1893         if ( (p_rec->mdep_cfg[i].mdep_id == peer_mdep_id) &&
   1894              (p_rec->mdep_cfg[i].mdep_role == peer_mdep_role))
   1895         {
   1896             peer_found = TRUE;
   1897 
   1898             break;
   1899         }
   1900     }
   1901 
   1902 #if BTA_HL_DEBUG == TRUE
   1903     if (!peer_found)
   1904     {
   1905         APPL_TRACE_DEBUG("bta_hl_validate_peer_cfg failed num_mdeps=%d",p_rec->num_mdeps);
   1906     }
   1907 #endif
   1908     return peer_found;
   1909 }
   1910 
   1911 /*******************************************************************************
   1912 **
   1913 ** Function      bta_hl_chk_local_cfg
   1914 **
   1915 ** Description  This function check whether the local DCH configuration is OK or not
   1916 **
   1917 ** Returns      tBTA_HL_STATUS - OK - local DCH configuration is OK
   1918 **                               NO_FIRST_RELIABLE - the streaming DCH configuration
   1919 **                                                   is not OK and it needs to use
   1920 **                                                   reliable DCH configuration
   1921 **
   1922 *******************************************************************************/
   1923 tBTA_HL_STATUS bta_hl_chk_local_cfg(UINT8 app_idx, UINT8 mcl_idx,
   1924                                     UINT8 mdep_cfg_idx,
   1925                                     tBTA_HL_DCH_CFG local_cfg)
   1926 {
   1927     tBTA_HL_APP_CB      *p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
   1928     tBTA_HL_STATUS status = BTA_HL_STATUS_OK;
   1929 
   1930     if ( mdep_cfg_idx &&
   1931          (p_acb->sup_feature.mdep[mdep_cfg_idx].mdep_cfg.mdep_role == BTA_HL_MDEP_ROLE_SOURCE) &&
   1932          (!bta_hl_is_the_first_reliable_existed(app_idx, mcl_idx)) &&
   1933          (local_cfg != BTA_HL_DCH_CFG_RELIABLE))
   1934     {
   1935         status =  BTA_HL_STATUS_NO_FIRST_RELIABLE;
   1936         APPL_TRACE_ERROR("BTA_HL_STATUS_INVALID_DCH_CFG");
   1937     }
   1938 
   1939     return status;
   1940 }
   1941 
   1942 
   1943 /*******************************************************************************
   1944 **
   1945 ** Function      bta_hl_validate_reconnect_params
   1946 **
   1947 ** Description  This function validates the reconnect parameters
   1948 **
   1949 ** Returns      BOOLEAN - TRUE validation is successful
   1950 **                        FALSE validation failed
   1951 *******************************************************************************/
   1952 BOOLEAN bta_hl_validate_reconnect_params(UINT8 app_idx, UINT8 mcl_idx,
   1953                                          tBTA_HL_API_DCH_RECONNECT *p_reconnect,
   1954                                          UINT8 *p_mdep_cfg_idx, UINT8 *p_mdl_cfg_idx)
   1955 {
   1956     tBTA_HL_APP_CB      *p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
   1957     tBTA_HL_SUP_FEATURE *p_sup_feature = &p_acb->sup_feature;
   1958     UINT8               num_mdeps;
   1959     UINT8               mdl_cfg_idx;
   1960     BOOLEAN local_mdep_id_found =FALSE;
   1961     BOOLEAN mdl_cfg_found =FALSE;
   1962     BOOLEAN            status=FALSE;
   1963     UINT8 i, in_use_mdl_idx = 0;
   1964 
   1965 #if BTA_HL_DEBUG == TRUE
   1966     APPL_TRACE_DEBUG("bta_hl_validate_reconnect_params  mdl_id=%d app_idx=%d", p_reconnect->mdl_id, app_idx);
   1967 #endif
   1968     if (bta_hl_find_mdl_cfg_idx(app_idx, mcl_idx, p_reconnect->mdl_id, &mdl_cfg_idx))
   1969     {
   1970         mdl_cfg_found = TRUE;
   1971     }
   1972 
   1973 #if BTA_HL_DEBUG == TRUE
   1974     if (!mdl_cfg_found)
   1975     {
   1976         APPL_TRACE_DEBUG("mdl_cfg_found not found");
   1977     }
   1978 #endif
   1979 
   1980 
   1981     if (mdl_cfg_found)
   1982     {
   1983         num_mdeps = p_sup_feature->num_of_mdeps;
   1984         for (i=0; i< num_mdeps ; i++)
   1985         {
   1986             if ( p_sup_feature->mdep[i].mdep_id == p_acb->mdl_cfg[mdl_cfg_idx].local_mdep_id)
   1987             {
   1988                 local_mdep_id_found = TRUE;
   1989                 *p_mdep_cfg_idx =i;
   1990                 *p_mdl_cfg_idx = mdl_cfg_idx;
   1991                 break;
   1992             }
   1993         }
   1994     }
   1995 
   1996 #if BTA_HL_DEBUG == TRUE
   1997     if (!local_mdep_id_found)
   1998     {
   1999         APPL_TRACE_DEBUG("local_mdep_id not found");
   2000     }
   2001 #endif
   2002 
   2003 
   2004     if (local_mdep_id_found)
   2005     {
   2006         if (!bta_hl_find_mdl_idx(app_idx,mcl_idx, p_reconnect->mdl_id, &in_use_mdl_idx))
   2007         {
   2008             status= TRUE;
   2009         }
   2010         else
   2011         {
   2012             APPL_TRACE_ERROR("mdl_id=%d is curreltly in use",p_reconnect->mdl_id);
   2013         }
   2014     }
   2015 
   2016 #if BTA_HL_DEBUG == TRUE
   2017     if (!status)
   2018     {
   2019         APPL_TRACE_DEBUG("Reconnect validation failed local_mdep_id found=%d mdl_cfg_idx found=%d in_use_mdl_idx=%d ",
   2020                           local_mdep_id_found,  mdl_cfg_found, in_use_mdl_idx);
   2021     }
   2022 #endif
   2023     return status;
   2024 }
   2025 
   2026 /*******************************************************************************
   2027 **
   2028 ** Function      bta_hl_find_avail_mcl_idx
   2029 **
   2030 ** Returns      BOOLEAN - TRUE found
   2031 **                        FALSE not found
   2032 **
   2033 *******************************************************************************/
   2034 BOOLEAN bta_hl_find_avail_mcl_idx(UINT8 app_idx, UINT8 *p_mcl_idx)
   2035 {
   2036     BOOLEAN found=FALSE;
   2037     UINT8 i;
   2038 
   2039     for (i=0; i < BTA_HL_NUM_MCLS ; i ++)
   2040     {
   2041         if (!bta_hl_cb.acb[app_idx].mcb[i].in_use)
   2042         {
   2043             found = TRUE;
   2044             *p_mcl_idx = i;
   2045             break;
   2046         }
   2047     }
   2048 
   2049 #if BTA_HL_DEBUG == TRUE
   2050     if (!found)
   2051     {
   2052         APPL_TRACE_DEBUG("bta_hl_find_avail_mcl_idx found=%d idx=%d",
   2053                           found, i);
   2054     }
   2055 #endif
   2056     return found;
   2057 }
   2058 
   2059 
   2060 
   2061 /*******************************************************************************
   2062 **
   2063 ** Function      bta_hl_find_avail_mdl_idx
   2064 **
   2065 ** Description  This function finds an available MDL control block index
   2066 **
   2067 ** Returns      BOOLEAN - TRUE found
   2068 **                        FALSE not found
   2069 **
   2070 *******************************************************************************/
   2071 BOOLEAN bta_hl_find_avail_mdl_idx(UINT8 app_idx, UINT8 mcl_idx,
   2072                                   UINT8 *p_mdl_idx)
   2073 {
   2074     tBTA_HL_MCL_CB      *p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
   2075     BOOLEAN found=FALSE;
   2076     UINT8 i;
   2077 
   2078     for (i=0; i < BTA_HL_NUM_MDLS_PER_MCL ; i ++)
   2079     {
   2080         if (!p_mcb->mdl[i].in_use)
   2081         {
   2082             memset((void *)&p_mcb->mdl[i],0, sizeof(tBTA_HL_MDL_CB));
   2083             found = TRUE;
   2084             *p_mdl_idx = i;
   2085             break;
   2086         }
   2087     }
   2088 
   2089 #if BTA_HL_DEBUG == TRUE
   2090     if (!found)
   2091     {
   2092         APPL_TRACE_DEBUG("bta_hl_find_avail_mdl_idx found=%d idx=%d",
   2093                           found, i);
   2094     }
   2095 #endif
   2096     return found;
   2097 }
   2098 
   2099 /*******************************************************************************
   2100 **
   2101 ** Function      bta_hl_is_a_duplicate_id
   2102 **
   2103 ** Description  This function finds the application has been used or not
   2104 **
   2105 ** Returns      BOOLEAN - TRUE the app_id is a duplicate ID
   2106 **                        FALSE not a duplicate ID
   2107 *******************************************************************************/
   2108 BOOLEAN bta_hl_is_a_duplicate_id(UINT8 app_id)
   2109 {
   2110     BOOLEAN is_duplicate=FALSE;
   2111     UINT8 i;
   2112 
   2113     for (i=0; i < BTA_HL_NUM_APPS ; i ++)
   2114     {
   2115         if (bta_hl_cb.acb[i].in_use &&
   2116             (bta_hl_cb.acb[i].app_id == app_id))
   2117         {
   2118             is_duplicate = TRUE;
   2119 
   2120             break;
   2121         }
   2122     }
   2123 
   2124 #if BTA_HL_DEBUG == TRUE
   2125     if (is_duplicate)
   2126     {
   2127 
   2128         APPL_TRACE_DEBUG("bta_hl_is_a_duplicate_id app_id=%d is_duplicate=%d",
   2129                           app_id, is_duplicate);
   2130     }
   2131 #endif
   2132 
   2133     return is_duplicate;
   2134 }
   2135 
   2136 
   2137 /*******************************************************************************
   2138 **
   2139 ** Function      bta_hl_find_avail_app_idx
   2140 **
   2141 ** Description  This function finds an available application control block index
   2142 **
   2143 ** Returns      BOOLEAN - TRUE found
   2144 **                        FALSE not found
   2145 **
   2146 *******************************************************************************/
   2147 BOOLEAN bta_hl_find_avail_app_idx(UINT8 *p_idx)
   2148 {
   2149     BOOLEAN found=FALSE;
   2150     UINT8 i;
   2151 
   2152     for (i=0; i < BTA_HL_NUM_APPS ; i ++)
   2153     {
   2154         if (!bta_hl_cb.acb[i].in_use)
   2155         {
   2156             found = TRUE;
   2157             *p_idx = i;
   2158             break;
   2159         }
   2160     }
   2161 
   2162 #if BTA_HL_DEBUG == TRUE
   2163     if (!found)
   2164     {
   2165         APPL_TRACE_DEBUG("bta_hl_find_avail_app_idx found=%d app_idx=%d",
   2166                           found, i);
   2167     }
   2168 #endif
   2169     return found;
   2170 }
   2171 
   2172 /*******************************************************************************
   2173 **
   2174 ** Function      bta_hl_app_update
   2175 **
   2176 ** Description  This function registers an HDP application MCAP and DP
   2177 **
   2178 ** Returns      tBTA_HL_STATUS -registration status
   2179 **
   2180 *******************************************************************************/
   2181 tBTA_HL_STATUS bta_hl_app_update(UINT8 app_id, BOOLEAN is_register)
   2182 {
   2183     tBTA_HL_STATUS  status = BTA_HL_STATUS_OK;
   2184     tBTA_HL_APP_CB  *p_acb = BTA_HL_GET_APP_CB_PTR(0);
   2185     tMCA_CS         mca_cs;
   2186     UINT8           i, mdep_idx, num_of_mdeps;
   2187     UINT8           mdep_counter = 0;
   2188 
   2189 
   2190 #if BTA_HL_DEBUG == TRUE
   2191     APPL_TRACE_DEBUG("bta_hl_app_update app_id=%d", app_id);
   2192 #endif
   2193 
   2194     if (is_register)
   2195     {
   2196         if ((status == BTA_HL_STATUS_OK) &&
   2197         bta_hl_co_get_num_of_mdep(app_id, &num_of_mdeps))
   2198         {
   2199             for (i=0; i < num_of_mdeps; i++)
   2200             {
   2201                 mca_cs.type = MCA_TDEP_DATA;
   2202                 mca_cs.max_mdl = BTA_HL_NUM_MDLS_PER_MDEP;
   2203                 mca_cs.p_data_cback = bta_hl_mcap_data_cback;
   2204                 /* Find the first available mdep index, and create a MDL Endpoint */
   2205                 // make a function later if needed
   2206                 for (mdep_idx = 1; mdep_idx < BTA_HL_NUM_MDEPS; mdep_idx++)
   2207                 {
   2208                     if ( p_acb->sup_feature.mdep[mdep_idx].mdep_id == 0)
   2209                     {
   2210                         break; /* We found an available index */
   2211                     }
   2212                     else
   2213                     {
   2214                         mdep_counter++;
   2215                     }
   2216                 }
   2217                 /* If no available MDEPs, return error */
   2218                 if (mdep_idx == BTA_HL_NUM_MDEPS)
   2219                 {
   2220                     APPL_TRACE_ERROR("bta_hl_app_update: Out of MDEP IDs");
   2221                     status = BTA_HL_STATUS_MCAP_REG_FAIL;
   2222                     break;
   2223                 }
   2224                 if (MCA_CreateDep((tMCA_HANDLE)p_acb->app_handle,
   2225                               &(p_acb->sup_feature.mdep[mdep_idx].mdep_id), &mca_cs) == MCA_SUCCESS)
   2226                 {
   2227                     if (bta_hl_co_get_mdep_config(app_id,
   2228                                                   mdep_idx,
   2229                                                   mdep_counter,
   2230                                                   p_acb->sup_feature.mdep[mdep_idx].mdep_id,
   2231                                                   &p_acb->sup_feature.mdep[mdep_idx].mdep_cfg))
   2232                     {
   2233                         p_acb->sup_feature.mdep[mdep_idx].ori_app_id = app_id;
   2234                         APPL_TRACE_DEBUG("mdep idx %d id %d ori_app_id %d num data type %d",mdep_idx,
   2235                                p_acb->sup_feature.mdep[mdep_idx].mdep_id,
   2236                                p_acb->sup_feature.mdep[mdep_idx].ori_app_id,
   2237                                p_acb->sup_feature.mdep[mdep_idx].mdep_cfg.num_of_mdep_data_types);
   2238                         if (p_acb->sup_feature.mdep[mdep_idx].mdep_cfg.mdep_role ==
   2239                             BTA_HL_MDEP_ROLE_SOURCE)
   2240                         {
   2241                             p_acb->sup_feature.app_role_mask |= BTA_HL_MDEP_ROLE_MASK_SOURCE;
   2242                         }
   2243                         else if (p_acb->sup_feature.mdep[mdep_idx].mdep_cfg.mdep_role ==
   2244                                  BTA_HL_MDEP_ROLE_SINK)
   2245                         {
   2246                             p_acb->sup_feature.app_role_mask |= BTA_HL_MDEP_ROLE_MASK_SINK;
   2247                         }
   2248                         else
   2249                         {
   2250                             APPL_TRACE_ERROR("bta_hl_app_registration: Invalid Role %d",
   2251                                             p_acb->sup_feature.mdep[mdep_idx].mdep_cfg.mdep_role);
   2252                             status = BTA_HL_STATUS_MDEP_CO_FAIL;
   2253                             break;
   2254                         }
   2255                     }
   2256                     else
   2257                     {
   2258                         APPL_TRACE_ERROR("bta_hl_app_registration: Cfg callout failed");
   2259                         status = BTA_HL_STATUS_MDEP_CO_FAIL;
   2260                         break;
   2261                     }
   2262                 }
   2263                 else
   2264                 {
   2265                     APPL_TRACE_ERROR("bta_hl_app_registration: MCA_CreateDep failed");
   2266                     status = BTA_HL_STATUS_MCAP_REG_FAIL;
   2267                     break;
   2268                 }
   2269 
   2270             }
   2271             p_acb->sup_feature.num_of_mdeps += num_of_mdeps;
   2272             APPL_TRACE_DEBUG("num_of_mdeps %d", p_acb->sup_feature.num_of_mdeps);
   2273 
   2274             if ((status == BTA_HL_STATUS_OK) &&
   2275                 (p_acb->sup_feature.app_role_mask == BTA_HL_MDEP_ROLE_MASK_SOURCE))
   2276             {
   2277                 p_acb->sup_feature.advertize_source_sdp =
   2278                 bta_hl_co_advrtise_source_sdp(app_id);
   2279             }
   2280 
   2281             if ((status == BTA_HL_STATUS_OK)&&
   2282                 (!bta_hl_co_get_echo_config(app_id, &p_acb->sup_feature.echo_cfg)))
   2283             {
   2284                 status = BTA_HL_STATUS_ECHO_CO_FAIL;
   2285             }
   2286 
   2287             if ((status == BTA_HL_STATUS_OK)&&
   2288                 (!bta_hl_co_load_mdl_config(app_id, BTA_HL_NUM_MDL_CFGS, &p_acb->mdl_cfg[0])))
   2289             {
   2290                 status = BTA_HL_STATUS_MDL_CFG_CO_FAIL;
   2291             }
   2292         }
   2293         else
   2294         {
   2295             status = BTA_HL_STATUS_MDEP_CO_FAIL;
   2296         }
   2297     }
   2298     else
   2299     {
   2300         for (i=1; i<BTA_HL_NUM_MDEPS; i++)
   2301         {
   2302             if (p_acb->sup_feature.mdep[i].ori_app_id == app_id)
   2303             {
   2304                 APPL_TRACE_DEBUG("Found index %", i);
   2305 
   2306 
   2307                 if (MCA_DeleteDep((tMCA_HANDLE)p_acb->app_handle,
   2308                                   (p_acb->sup_feature.mdep[i].mdep_id)) != MCA_SUCCESS)
   2309                 {
   2310                     APPL_TRACE_ERROR("Error deregistering");
   2311                     status = BTA_HL_STATUS_MCAP_REG_FAIL;
   2312                     return status;
   2313                 }
   2314                 memset(&p_acb->sup_feature.mdep[i], 0, sizeof(tBTA_HL_MDEP));
   2315             }
   2316         }
   2317 
   2318 
   2319     }
   2320 
   2321     if (status == BTA_HL_STATUS_OK)
   2322     {
   2323         /* Register/Update MDEP(s) in SDP Record */
   2324         status = bta_hl_sdp_update(app_id);
   2325     }
   2326     /* else do cleanup */
   2327 
   2328 
   2329     return status;
   2330 }
   2331 
   2332 
   2333 /*******************************************************************************
   2334 **
   2335 ** Function      bta_hl_app_registration
   2336 **
   2337 ** Description  This function registers an HDP application MCAP and DP
   2338 **
   2339 ** Returns      tBTA_HL_STATUS -registration status
   2340 **
   2341 *******************************************************************************/
   2342 tBTA_HL_STATUS bta_hl_app_registration(UINT8 app_idx)
   2343 {
   2344     tBTA_HL_STATUS  status = BTA_HL_STATUS_OK;
   2345     tBTA_HL_APP_CB  *p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
   2346     tMCA_REG        reg;
   2347     tMCA_CS         mca_cs;
   2348     UINT8           i, num_of_mdeps;
   2349     UINT8           mdep_counter = 0;
   2350 
   2351 #if BTA_HL_DEBUG == TRUE
   2352     APPL_TRACE_DEBUG("bta_hl_app_registration app_idx=%d", app_idx);
   2353 #endif
   2354 
   2355     reg.ctrl_psm = p_acb->ctrl_psm;
   2356     reg.data_psm = p_acb->data_psm;
   2357     reg.sec_mask = p_acb->sec_mask;
   2358     reg.rsp_tout = BTA_HL_MCAP_RSP_TOUT;
   2359 
   2360     if ( (p_acb->app_handle = (tBTA_HL_APP_HANDLE) MCA_Register(&reg, bta_hl_mcap_ctrl_cback))!=0)
   2361     {
   2362         mca_cs.type = MCA_TDEP_ECHO;
   2363         mca_cs.max_mdl = BTA_HL_NUM_MDLS_PER_MDEP;
   2364         mca_cs.p_data_cback = bta_hl_mcap_data_cback;
   2365 
   2366         if (MCA_CreateDep((tMCA_HANDLE)p_acb->app_handle,
   2367                           &(p_acb->sup_feature.mdep[0].mdep_id),
   2368                           &mca_cs) == MCA_SUCCESS)
   2369         {
   2370             if (p_acb->sup_feature.mdep[0].mdep_id != BTA_HL_ECHO_TEST_MDEP_ID)
   2371             {
   2372                 status = BTA_HL_STATUS_MCAP_REG_FAIL;
   2373                 APPL_TRACE_ERROR("BAD MDEP ID for echo test mdep_id=%d",
   2374                                   p_acb->sup_feature.mdep[0].mdep_id );
   2375             }
   2376         }
   2377         else
   2378         {
   2379             status = BTA_HL_STATUS_MCAP_REG_FAIL;
   2380             APPL_TRACE_ERROR("MCA_CreateDep for echo test(mdep_id=0) failed");
   2381         }
   2382 
   2383 
   2384         if ((status == BTA_HL_STATUS_OK) &&
   2385             bta_hl_co_get_num_of_mdep(p_acb->app_id, &num_of_mdeps))
   2386         {
   2387             p_acb->sup_feature.num_of_mdeps = num_of_mdeps+1;
   2388 
   2389             for (i=1; i<p_acb->sup_feature.num_of_mdeps; i++)
   2390             {
   2391                 mca_cs.type = MCA_TDEP_DATA;
   2392                 mca_cs.max_mdl = BTA_HL_NUM_MDLS_PER_MDEP;
   2393                 mca_cs.p_data_cback = bta_hl_mcap_data_cback;
   2394 
   2395                 if (MCA_CreateDep((tMCA_HANDLE)p_acb->app_handle,
   2396                                   &(p_acb->sup_feature.mdep[i].mdep_id), &mca_cs) == MCA_SUCCESS)
   2397                 {
   2398                     if (bta_hl_co_get_mdep_config(p_acb->app_id,
   2399                                                   i,mdep_counter,
   2400                                                   p_acb->sup_feature.mdep[i].mdep_id,
   2401                                                   &p_acb->sup_feature.mdep[i].mdep_cfg))
   2402                     {
   2403                         if (p_acb->sup_feature.mdep[i].mdep_cfg.mdep_role == BTA_HL_MDEP_ROLE_SOURCE)
   2404                         {
   2405                             p_acb->sup_feature.app_role_mask |= BTA_HL_MDEP_ROLE_MASK_SOURCE;
   2406                         }
   2407                         else if (p_acb->sup_feature.mdep[i].mdep_cfg.mdep_role == BTA_HL_MDEP_ROLE_SINK)
   2408                         {
   2409                             p_acb->sup_feature.app_role_mask |= BTA_HL_MDEP_ROLE_MASK_SINK;
   2410                         }
   2411                         else
   2412                         {
   2413                             status = BTA_HL_STATUS_MDEP_CO_FAIL;
   2414                             break;
   2415                         }
   2416                         p_acb->sup_feature.mdep[i].ori_app_id = p_acb->app_id;
   2417                         APPL_TRACE_DEBUG("index %d ori_app_id %d", i,
   2418                                           p_acb->sup_feature.mdep[i].ori_app_id);
   2419                     }
   2420                     else
   2421                     {
   2422                         status = BTA_HL_STATUS_MDEP_CO_FAIL;
   2423                         break;
   2424                     }
   2425                 }
   2426                 else
   2427                 {
   2428                     status = BTA_HL_STATUS_MCAP_REG_FAIL;
   2429                     break;
   2430                 }
   2431             }
   2432 
   2433 
   2434 
   2435             if ((status == BTA_HL_STATUS_OK) &&
   2436                 (p_acb->sup_feature.app_role_mask == BTA_HL_MDEP_ROLE_MASK_SOURCE))
   2437             {
   2438                 /* this is a source only applciation */
   2439                 p_acb->sup_feature.advertize_source_sdp =
   2440                 bta_hl_co_advrtise_source_sdp(p_acb->app_id);
   2441             }
   2442 
   2443             if ((status == BTA_HL_STATUS_OK)&&
   2444                 (!bta_hl_co_get_echo_config(p_acb->app_id, &p_acb->sup_feature.echo_cfg)))
   2445             {
   2446                 status = BTA_HL_STATUS_ECHO_CO_FAIL;
   2447             }
   2448 
   2449             if ((status == BTA_HL_STATUS_OK)&&
   2450                 (!bta_hl_co_load_mdl_config(p_acb->app_id, BTA_HL_NUM_MDL_CFGS, &p_acb->mdl_cfg[0])))
   2451             {
   2452                 status = BTA_HL_STATUS_MDL_CFG_CO_FAIL;
   2453             }
   2454         }
   2455         else
   2456         {
   2457             status = BTA_HL_STATUS_MDEP_CO_FAIL;
   2458         }
   2459     }
   2460     else
   2461     {
   2462         status = BTA_HL_STATUS_MCAP_REG_FAIL;
   2463     }
   2464 
   2465     if (status == BTA_HL_STATUS_OK)
   2466     {
   2467         status = bta_hl_sdp_register(app_idx);
   2468     }
   2469 
   2470     return status;
   2471 }
   2472 
   2473 
   2474 /*******************************************************************************
   2475 **
   2476 ** Function         bta_hl_discard_data
   2477 **
   2478 ** Description  This function discard an HDP event
   2479 **
   2480 ** Returns     void
   2481 **
   2482 *******************************************************************************/
   2483 void bta_hl_discard_data(UINT16 event, tBTA_HL_DATA *p_data)
   2484 {
   2485 
   2486 #if BTA_HL_DEBUG == TRUE
   2487     APPL_TRACE_ERROR("BTA HL Discard event=%s",bta_hl_evt_code(event));
   2488 
   2489 #endif
   2490 
   2491     switch (event)
   2492     {
   2493         case BTA_HL_API_SEND_DATA_EVT:
   2494             break;
   2495 
   2496         case BTA_HL_MCA_RCV_DATA_EVT:
   2497             utl_freebuf((void**)&p_data->mca_rcv_data_evt.p_pkt);
   2498             break;
   2499 
   2500         default:
   2501             /*Nothing to free*/
   2502             break;
   2503     }
   2504 }
   2505 
   2506 /*******************************************************************************
   2507 **
   2508 ** Function         bta_hl_save_mdl_cfg
   2509 **
   2510 ** Description    This function saves the MDL configuration
   2511 **
   2512 ** Returns     void
   2513 **
   2514 *******************************************************************************/
   2515 void bta_hl_save_mdl_cfg(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx )
   2516 {
   2517     tBTA_HL_APP_CB      *p_acb  = BTA_HL_GET_APP_CB_PTR(app_idx);
   2518     tBTA_HL_MCL_CB      *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
   2519     tBTA_HL_MDL_CB      *p_dcb  = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
   2520     UINT8 mdl_cfg_idx;
   2521     tBTA_HL_MDL_ID mdl_id;
   2522     BOOLEAN      found=TRUE;
   2523     tBTA_HL_MDL_CFG mdl_cfg;
   2524     tBTA_HL_MDEP *p_mdep_cfg;
   2525     tBTA_HL_L2CAP_CFG_INFO l2cap_cfg;
   2526     UINT8 time_val = 0;
   2527     mdl_id = p_dcb->mdl_id;
   2528     if (!bta_hl_find_mdl_cfg_idx(app_idx, mcl_idx, mdl_id, &mdl_cfg_idx))
   2529     {
   2530         if (!bta_hl_find_avail_mdl_cfg_idx(app_idx, mcl_idx, &mdl_cfg_idx))
   2531         {
   2532             APPL_TRACE_ERROR("No space to save the MDL config");
   2533             found= FALSE; /*no space available*/
   2534         }
   2535     }
   2536 
   2537     if (found)
   2538     {
   2539         bta_hl_get_l2cap_cfg(p_dcb->mdl_handle, &l2cap_cfg);
   2540         if (!bta_hl_get_cur_time(app_idx, &time_val ))
   2541         {
   2542             bta_hl_compact_mdl_cfg_time(app_idx,p_dcb->local_mdep_id);
   2543             bta_hl_get_cur_time(app_idx, &time_val);
   2544         }
   2545         mdl_cfg.active = TRUE;
   2546         mdl_cfg.time = time_val;
   2547         mdl_cfg.mdl_id  = p_dcb->mdl_id;
   2548         mdl_cfg.dch_mode = p_dcb->dch_mode;
   2549         mdl_cfg.mtu = l2cap_cfg.mtu;
   2550         mdl_cfg.fcs = l2cap_cfg.fcs;
   2551 
   2552         bdcpy(mdl_cfg.peer_bd_addr, p_mcb->bd_addr);
   2553         mdl_cfg.local_mdep_id= p_dcb->local_mdep_id;
   2554         p_mdep_cfg = &p_acb->sup_feature.mdep[p_dcb->local_mdep_cfg_idx];
   2555         mdl_cfg.local_mdep_role= p_mdep_cfg->mdep_cfg.mdep_role;
   2556         memcpy(&p_acb->mdl_cfg[mdl_cfg_idx], &mdl_cfg, sizeof(tBTA_HL_MDL_CFG));
   2557         bta_hl_co_save_mdl(mdl_cfg.local_mdep_id, mdl_cfg_idx, &mdl_cfg);
   2558     }
   2559 
   2560 #if BTA_HL_DEBUG == TRUE
   2561     if (found)
   2562     {
   2563         if (p_dcb->mtu != l2cap_cfg.mtu)
   2564         {
   2565             APPL_TRACE_WARNING("MCAP and L2CAP peer mtu size out of sync from MCAP mtu=%d from l2cap mtu=%d",
   2566                                 p_dcb->mtu, l2cap_cfg.mtu);
   2567         }
   2568         APPL_TRACE_DEBUG("bta_hl_save_mdl_cfg saved=%d", found);
   2569         APPL_TRACE_DEBUG("Saved. L2cap cfg mdl_id=%d mtu=%d fcs=%d dch_mode=%d",
   2570                           mdl_cfg.mdl_id, mdl_cfg.mtu, mdl_cfg.fcs,  mdl_cfg.dch_mode);
   2571     }
   2572 #endif
   2573 
   2574 
   2575 
   2576 }
   2577 
   2578 /*******************************************************************************
   2579 **
   2580 ** Function      bta_hl_set_dch_chan_cfg
   2581 **
   2582 ** Description    This function setups the L2CAP DCH channel configuration
   2583 **
   2584 ** Returns     void
   2585 *******************************************************************************/
   2586 void bta_hl_set_dch_chan_cfg(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx,tBTA_HL_DATA *p_data)
   2587 {
   2588     tBTA_HL_APP_CB *p_acb  = BTA_HL_GET_APP_CB_PTR(app_idx);
   2589     tBTA_HL_MDL_CB *p_dcb  = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
   2590     UINT8 l2cap_mode = L2CAP_FCR_ERTM_MODE;
   2591     tBTA_HL_SUP_FEATURE *p_sup_feature= &p_acb->sup_feature;
   2592     UINT8 local_mdep_cfg_idx = p_dcb->local_mdep_cfg_idx;
   2593 
   2594     switch (p_dcb->dch_oper)
   2595     {
   2596         case BTA_HL_DCH_OP_LOCAL_RECONNECT:
   2597         case BTA_HL_DCH_OP_REMOTE_RECONNECT:
   2598             if (p_dcb->dch_mode  == BTA_HL_DCH_MODE_STREAMING)
   2599                 l2cap_mode = L2CAP_FCR_STREAM_MODE;
   2600             break;
   2601         case BTA_HL_DCH_OP_LOCAL_OPEN:
   2602             if (p_data->mca_evt.mca_data.create_cfm.cfg == BTA_HL_DCH_CFG_STREAMING)
   2603                 l2cap_mode = L2CAP_FCR_STREAM_MODE;
   2604             break;
   2605         case BTA_HL_DCH_OP_REMOTE_OPEN:
   2606             if (p_dcb->local_cfg == BTA_HL_DCH_CFG_STREAMING )
   2607                 l2cap_mode = L2CAP_FCR_STREAM_MODE;
   2608             break;
   2609         default:
   2610             APPL_TRACE_ERROR("Invalid dch oper=%d for set dch chan cfg", p_dcb->dch_oper);
   2611             break;
   2612     }
   2613     p_dcb->chnl_cfg.fcr_opt.mode        = l2cap_mode;
   2614     p_dcb->chnl_cfg.fcr_opt.mps         = bta_hl_set_mps(p_dcb->max_rx_apdu_size);
   2615     p_dcb->chnl_cfg.fcr_opt.tx_win_sz   = bta_hl_set_tx_win_size(p_dcb->max_rx_apdu_size,
   2616                                                                  p_dcb->chnl_cfg.fcr_opt.mps);
   2617     p_dcb->chnl_cfg.fcr_opt.max_transmit= BTA_HL_L2C_MAX_TRANSMIT;
   2618     p_dcb->chnl_cfg.fcr_opt.rtrans_tout = BTA_HL_L2C_RTRANS_TOUT;
   2619     p_dcb->chnl_cfg.fcr_opt.mon_tout    = BTA_HL_L2C_MON_TOUT;
   2620 
   2621     p_dcb->chnl_cfg.user_rx_pool_id     = bta_hl_set_user_rx_pool_id(p_dcb->max_rx_apdu_size);
   2622     p_dcb->chnl_cfg.user_tx_pool_id     = bta_hl_set_user_tx_pool_id(p_dcb->max_tx_apdu_size);
   2623     p_dcb->chnl_cfg.fcr_rx_pool_id      = BTA_HL_L2C_FCR_RX_POOL_ID;
   2624     p_dcb->chnl_cfg.fcr_tx_pool_id      = BTA_HL_L2C_FCR_TX_POOL_ID;
   2625     p_dcb->chnl_cfg.data_mtu            = p_dcb->max_rx_apdu_size;
   2626 
   2627     p_dcb->chnl_cfg.fcs = BTA_HL_MCA_NO_FCS;
   2628     if (local_mdep_cfg_idx !=  BTA_HL_ECHO_TEST_MDEP_CFG_IDX)
   2629     {
   2630         if (p_sup_feature->mdep[local_mdep_cfg_idx].mdep_cfg.mdep_role ==
   2631             BTA_HL_MDEP_ROLE_SOURCE)
   2632         {
   2633             p_dcb->chnl_cfg.fcs = BTA_HL_DEFAULT_SOURCE_FCS;
   2634         }
   2635     }
   2636     else
   2637     {
   2638         p_dcb->chnl_cfg.fcs = BTA_HL_MCA_USE_FCS;
   2639     }
   2640 
   2641 #if BTA_HL_DEBUG == TRUE
   2642     APPL_TRACE_DEBUG("L2CAP Params l2cap_mode[3-ERTM 4-STREAM]=%d", l2cap_mode);
   2643     APPL_TRACE_DEBUG("Use FCS =%s mtu=%d", ((p_dcb->chnl_cfg.fcs & 1)?"YES":"NO"),
   2644                       p_dcb->chnl_cfg.data_mtu);
   2645     APPL_TRACE_DEBUG("tx_win_sz=%d, max_transmit=%d, rtrans_tout=%d, mon_tout=%d, mps=%d",
   2646                       p_dcb->chnl_cfg.fcr_opt.tx_win_sz,
   2647                       p_dcb->chnl_cfg.fcr_opt.max_transmit,
   2648                       p_dcb->chnl_cfg.fcr_opt.rtrans_tout,
   2649                       p_dcb->chnl_cfg.fcr_opt.mon_tout,
   2650                       p_dcb->chnl_cfg.fcr_opt.mps);
   2651 
   2652     APPL_TRACE_DEBUG("USER rx_pool_id=%d, tx_pool_id=%d, FCR rx_pool_id=%d, tx_pool_id=%d",
   2653                       p_dcb->chnl_cfg.user_rx_pool_id,
   2654                       p_dcb->chnl_cfg.user_tx_pool_id,
   2655                       p_dcb->chnl_cfg.fcr_rx_pool_id,
   2656                       p_dcb->chnl_cfg.fcr_tx_pool_id);
   2657 
   2658 #endif
   2659 
   2660 
   2661 
   2662 
   2663 
   2664 
   2665 
   2666 
   2667 }
   2668 
   2669 /*******************************************************************************
   2670 **
   2671 ** Function      bta_hl_get_l2cap_cfg
   2672 **
   2673 ** Description    This function get the current L2CAP channel configuration
   2674 **
   2675 ** Returns     BOOLEAN - TRUE - operation is successful
   2676 *******************************************************************************/
   2677 BOOLEAN bta_hl_get_l2cap_cfg(tBTA_HL_MDL_HANDLE mdl_hnd, tBTA_HL_L2CAP_CFG_INFO *p_cfg)
   2678 {
   2679     BOOLEAN success = FALSE;
   2680     UINT16 lcid;
   2681     tL2CAP_CFG_INFO *p_our_cfg;
   2682     tL2CAP_CH_CFG_BITS our_cfg_bits;
   2683     tL2CAP_CFG_INFO *p_peer_cfg;
   2684     tL2CAP_CH_CFG_BITS peer_cfg_bits;
   2685 
   2686     lcid = MCA_GetL2CapChannel((tMCA_DL) mdl_hnd);
   2687     if ( lcid &&
   2688          L2CA_GetCurrentConfig(lcid, &p_our_cfg, &our_cfg_bits, &p_peer_cfg,
   2689                                &peer_cfg_bits))
   2690     {
   2691         p_cfg->fcs = BTA_HL_MCA_NO_FCS;
   2692         if (our_cfg_bits & L2CAP_CH_CFG_MASK_FCS)
   2693         {
   2694             p_cfg->fcs |= p_our_cfg->fcs;
   2695         }
   2696         else
   2697         {
   2698             p_cfg->fcs = BTA_HL_MCA_USE_FCS;
   2699         }
   2700 
   2701         if (p_cfg->fcs != BTA_HL_MCA_USE_FCS )
   2702         {
   2703             if (peer_cfg_bits & L2CAP_CH_CFG_MASK_FCS)
   2704             {
   2705                 p_cfg->fcs |= p_peer_cfg->fcs;
   2706             }
   2707             else
   2708             {
   2709                 p_cfg->fcs = BTA_HL_MCA_USE_FCS;
   2710             }
   2711         }
   2712 
   2713         p_cfg->mtu =0;
   2714         if (peer_cfg_bits & L2CAP_CH_CFG_MASK_MTU)
   2715         {
   2716             p_cfg->mtu = p_peer_cfg->mtu;
   2717         }
   2718         else
   2719         {
   2720             p_cfg->mtu = L2CAP_DEFAULT_MTU;
   2721         }
   2722         success = TRUE;
   2723     }
   2724     else
   2725     {
   2726       p_cfg->mtu = L2CAP_DEFAULT_MTU;
   2727       p_cfg->fcs = BTA_HL_L2C_NO_FCS;
   2728     }
   2729 
   2730 #if BTA_HL_DEBUG == TRUE
   2731     if (!success)
   2732     {
   2733         APPL_TRACE_DEBUG("bta_hl_get_l2cap_cfg success=%d mdl=%d lcid=%d", success, mdl_hnd, lcid);
   2734         APPL_TRACE_DEBUG("l2cap mtu=%d fcs=%d", p_cfg->mtu, p_cfg->fcs);
   2735     }
   2736 #endif
   2737 
   2738     return success;
   2739 }
   2740 
   2741 /*******************************************************************************
   2742 **
   2743 ** Function      bta_hl_validate_chan_cfg
   2744 **
   2745 ** Description    This function validates the L2CAP channel configuration
   2746 **
   2747 ** Returns     BOOLEAN - TRUE - validation is successful
   2748 *******************************************************************************/
   2749 BOOLEAN bta_hl_validate_chan_cfg(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx)
   2750 {
   2751     tBTA_HL_APP_CB *p_acb  = BTA_HL_GET_APP_CB_PTR(app_idx);
   2752     tBTA_HL_MDL_CB *p_dcb  = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
   2753     BOOLEAN success = FALSE;
   2754     UINT8 mdl_cfg_idx = 0;
   2755     tBTA_HL_L2CAP_CFG_INFO l2cap_cfg;
   2756     BOOLEAN get_l2cap_result, get_mdl_result;
   2757 
   2758     get_l2cap_result = bta_hl_get_l2cap_cfg(p_dcb->mdl_handle, &l2cap_cfg);
   2759     get_mdl_result = bta_hl_find_mdl_cfg_idx(app_idx, mcl_idx, p_dcb->mdl_id, &mdl_cfg_idx);
   2760 
   2761     if (get_l2cap_result && get_mdl_result)
   2762     {
   2763         if ((p_acb->mdl_cfg[mdl_cfg_idx].mtu <= l2cap_cfg.mtu) &&
   2764             (p_acb->mdl_cfg[mdl_cfg_idx].fcs == l2cap_cfg.fcs) &&
   2765             (p_acb->mdl_cfg[mdl_cfg_idx].dch_mode == p_dcb->dch_mode))
   2766         {
   2767             success = TRUE;
   2768         }
   2769     }
   2770 
   2771 
   2772 #if BTA_HL_DEBUG == TRUE
   2773 
   2774     if (p_dcb->mtu != l2cap_cfg.mtu)
   2775     {
   2776         APPL_TRACE_WARNING("MCAP and L2CAP peer mtu size out of sync from MCAP mtu=%d from l2cap mtu=%d",
   2777                             p_dcb->mtu, l2cap_cfg.mtu);
   2778     }
   2779 
   2780     if (!success)
   2781     {
   2782         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);
   2783         APPL_TRACE_DEBUG("Cur. L2cap cfg mtu=%d fcs=%d dch_mode=%d", l2cap_cfg.mtu, l2cap_cfg.fcs, p_dcb->dch_mode);
   2784         APPL_TRACE_DEBUG("From saved: L2cap cfg mtu=%d fcs=%d dch_mode=%d", p_acb->mdl_cfg[mdl_cfg_idx].mtu,
   2785                           p_acb->mdl_cfg[mdl_cfg_idx].fcs , p_acb->mdl_cfg[mdl_cfg_idx].dch_mode);
   2786     }
   2787 #endif
   2788 
   2789     return success;
   2790 }
   2791 
   2792 
   2793 /*******************************************************************************
   2794 **
   2795 ** Function      bta_hl_is_cong_on
   2796 **
   2797 ** Description    This function checks whether the congestion condition is on or not
   2798 **
   2799 ** Returns      BOOLEAN - TRUE DCH is congested
   2800 **                        FALSE not congested
   2801 **
   2802 *******************************************************************************/
   2803 BOOLEAN  bta_hl_is_cong_on(UINT8 app_id, BD_ADDR bd_addr, tBTA_HL_MDL_ID mdl_id)
   2804 
   2805 {
   2806     tBTA_HL_MDL_CB      *p_dcb;
   2807     UINT8   app_idx = 0, mcl_idx, mdl_idx;
   2808     BOOLEAN cong_status = TRUE;
   2809 
   2810     if (bta_hl_find_app_idx(app_id, &app_idx))
   2811     {
   2812         if (bta_hl_find_mcl_idx(app_idx, bd_addr, &mcl_idx ))
   2813         {
   2814             if (bta_hl_find_mdl_idx(app_idx, mcl_idx, mdl_id, &mdl_idx ))
   2815             {
   2816                 p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
   2817                 cong_status  = p_dcb->cong;
   2818             }
   2819         }
   2820     }
   2821 
   2822     return cong_status;
   2823 }
   2824 
   2825 /*******************************************************************************
   2826 **
   2827 ** Function      bta_hl_check_cch_close
   2828 **
   2829 ** Description   This function checks whether there is a pending CCH close request
   2830 **               or not
   2831 **
   2832 ** Returns      void
   2833 *******************************************************************************/
   2834 void bta_hl_check_cch_close(UINT8 app_idx, UINT8 mcl_idx, tBTA_HL_DATA *p_data, BOOLEAN check_dch_setup )
   2835 {
   2836     tBTA_HL_MCL_CB      *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
   2837     tBTA_HL_MDL_CB      *p_dcb;
   2838     UINT8               mdl_idx;
   2839 
   2840 #if (BTA_HL_DEBUG == TRUE)
   2841     APPL_TRACE_DEBUG("bta_hl_check_cch_close cch_close_dch_oper=%d",p_mcb->cch_close_dch_oper );
   2842 #endif
   2843 
   2844     if (p_mcb->cch_oper == BTA_HL_CCH_OP_LOCAL_CLOSE)
   2845     {
   2846         if (check_dch_setup && bta_hl_find_dch_setup_mdl_idx(app_idx, mcl_idx, &mdl_idx))
   2847         {
   2848             p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
   2849             if (!p_mcb->rsp_tout)
   2850             {
   2851                 p_mcb->cch_close_dch_oper = BTA_HL_CCH_CLOSE_OP_DCH_ABORT;
   2852 
   2853                 if (!p_dcb->abort_oper)
   2854                 {
   2855                     p_dcb->abort_oper |= BTA_HL_ABORT_CCH_CLOSE_MASK;
   2856                     bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_ABORT_EVT, p_data);
   2857                 }
   2858             }
   2859             else
   2860             {
   2861                 p_mcb->cch_close_dch_oper = BTA_HL_CCH_CLOSE_OP_DCH_CLOSE;
   2862                 bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_CMPL_EVT, p_data);
   2863             }
   2864         }
   2865         else if (bta_hl_find_an_active_mdl_idx(app_idx, mcl_idx,&mdl_idx))
   2866         {
   2867             p_mcb->cch_close_dch_oper = BTA_HL_CCH_CLOSE_OP_DCH_CLOSE;
   2868             bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_EVT, p_data);
   2869         }
   2870         else
   2871         {
   2872             p_mcb->cch_close_dch_oper = BTA_HL_CCH_CLOSE_OP_DCH_NONE;
   2873             bta_hl_cch_sm_execute(app_idx, mcl_idx, BTA_HL_CCH_CLOSE_EVT, p_data);
   2874         }
   2875     }
   2876 }
   2877 
   2878 /*******************************************************************************
   2879 **
   2880 ** Function         bta_hl_clean_app
   2881 **
   2882 ** Description      Cleans up the HDP application resources and control block
   2883 **
   2884 ** Returns          void
   2885 **
   2886 *******************************************************************************/
   2887 void bta_hl_clean_app(UINT8 app_idx)
   2888 {
   2889     tBTA_HL_APP_CB         *p_acb   = BTA_HL_GET_APP_CB_PTR(app_idx);
   2890     int i, num_act_apps=0;
   2891 
   2892 #if BTA_HL_DEBUG == TRUE
   2893     APPL_TRACE_DEBUG("bta_hl_clean_app");
   2894 #endif
   2895     MCA_Deregister((tMCA_HANDLE)p_acb->app_handle);
   2896 
   2897     if (p_acb->sdp_handle) SDP_DeleteRecord(p_acb->sdp_handle);
   2898 
   2899     memset((void *) p_acb, 0, sizeof(tBTA_HL_APP_CB));
   2900 
   2901     /* check any application is still active */
   2902     for (i=0; i < BTA_HL_NUM_APPS ; i ++)
   2903     {
   2904         p_acb = BTA_HL_GET_APP_CB_PTR(i);
   2905         if (p_acb->in_use) num_act_apps++;
   2906     }
   2907 
   2908     if (!num_act_apps)
   2909     {
   2910         bta_sys_remove_uuid(UUID_SERVCLASS_HDP_PROFILE);
   2911     }
   2912 }
   2913 
   2914 /*******************************************************************************
   2915 **
   2916 ** Function      bta_hl_check_deregistration
   2917 **
   2918 ** Description   This function checks whether there is a pending deregistration
   2919 **               request or not
   2920 **
   2921 ** Returns      void
   2922 *******************************************************************************/
   2923 void bta_hl_check_deregistration(UINT8 app_idx, tBTA_HL_DATA *p_data )
   2924 {
   2925     tBTA_HL_APP_CB      *p_acb  = BTA_HL_GET_APP_CB_PTR(app_idx);
   2926     tBTA_HL_MCL_CB      *p_mcb;
   2927     UINT8               mcl_idx;
   2928     tBTA_HL             evt_data;
   2929 
   2930 #if (BTA_HL_DEBUG == TRUE)
   2931     APPL_TRACE_DEBUG("bta_hl_check_deregistration");
   2932 #endif
   2933 
   2934     if (p_acb->deregistering)
   2935     {
   2936         if (bta_hl_find_an_in_use_mcl_idx(app_idx, &mcl_idx))
   2937         {
   2938             p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
   2939             if (p_mcb->cch_oper != BTA_HL_CCH_OP_LOCAL_CLOSE)
   2940             {
   2941                 if (p_mcb->cch_state == BTA_HL_CCH_OPENING_ST)
   2942                     p_mcb->force_close_local_cch_opening = TRUE;
   2943                 p_mcb->cch_oper = BTA_HL_CCH_OP_LOCAL_CLOSE;
   2944                 APPL_TRACE_DEBUG("p_mcb->force_close_local_cch_opening=%d", p_mcb->force_close_local_cch_opening  );
   2945                 bta_hl_check_cch_close(app_idx,mcl_idx,p_data, TRUE);
   2946             }
   2947         }
   2948         else
   2949         {
   2950             /* all cchs are closed */
   2951             evt_data.dereg_cfm.app_handle = p_acb->app_handle;
   2952             evt_data.dereg_cfm.app_id = p_data->api_dereg.app_id;
   2953             evt_data.dereg_cfm.status = BTA_HL_STATUS_OK;
   2954             p_acb->p_cback(BTA_HL_DEREGISTER_CFM_EVT, (tBTA_HL *) &evt_data );
   2955             bta_hl_clean_app(app_idx);
   2956             bta_hl_check_disable(p_data);
   2957         }
   2958     }
   2959 }
   2960 
   2961 
   2962 /*******************************************************************************
   2963 **
   2964 ** Function      bta_hl_check_disable
   2965 **
   2966 ** Description   This function checks whether there is a pending disable
   2967 **               request or not
   2968 **
   2969 ** Returns      void
   2970 **
   2971 *******************************************************************************/
   2972 void bta_hl_check_disable(tBTA_HL_DATA *p_data )
   2973 {
   2974     tBTA_HL_CB          *p_cb= &bta_hl_cb;
   2975     tBTA_HL_APP_CB      *p_acb;
   2976     UINT8               app_idx;
   2977     tBTA_HL_CTRL        evt_data;
   2978 
   2979 #if (BTA_HL_DEBUG == TRUE)
   2980     APPL_TRACE_DEBUG("bta_hl_check_disable");
   2981 #endif
   2982 
   2983     if (bta_hl_cb.disabling)
   2984     {
   2985         if (bta_hl_find_an_in_use_app_idx(&app_idx))
   2986         {
   2987             p_acb  = BTA_HL_GET_APP_CB_PTR(app_idx);
   2988             if (!p_acb->deregistering)
   2989             {
   2990                 p_acb->deregistering = TRUE;
   2991                 bta_hl_check_deregistration(app_idx, p_data);
   2992             }
   2993         }
   2994         else
   2995         {
   2996             /* all apps are deregistered */
   2997             bta_sys_deregister(BTA_ID_HL);
   2998             evt_data.disable_cfm.status = BTA_HL_STATUS_OK;
   2999             if (p_cb->p_ctrl_cback) p_cb->p_ctrl_cback(BTA_HL_CTRL_DISABLE_CFM_EVT, (tBTA_HL_CTRL *) &evt_data);
   3000             memset((void *) p_cb, 0, sizeof(tBTA_HL_CB));
   3001         }
   3002     }
   3003 }
   3004 
   3005 /*******************************************************************************
   3006 **
   3007 ** Function      bta_hl_build_abort_cfm
   3008 **
   3009 ** Description   This function builds the abort confirmation event data
   3010 **
   3011 ** Returns      None
   3012 **
   3013 *******************************************************************************/
   3014 void  bta_hl_build_abort_cfm(tBTA_HL *p_evt_data,
   3015                              tBTA_HL_APP_HANDLE app_handle,
   3016                              tBTA_HL_MCL_HANDLE mcl_handle,
   3017                              tBTA_HL_STATUS status)
   3018 {
   3019     p_evt_data->dch_abort_cfm.status = status;
   3020     p_evt_data->dch_abort_cfm.mcl_handle = mcl_handle;
   3021     p_evt_data->dch_abort_cfm.app_handle = app_handle;
   3022 }
   3023 
   3024 /*******************************************************************************
   3025 **
   3026 ** Function      bta_hl_build_abort_ind
   3027 **
   3028 ** Description   This function builds the abort indication event data
   3029 **
   3030 ** Returns      None
   3031 **
   3032 *******************************************************************************/
   3033 void  bta_hl_build_abort_ind(tBTA_HL *p_evt_data,
   3034                              tBTA_HL_APP_HANDLE app_handle,
   3035                              tBTA_HL_MCL_HANDLE mcl_handle)
   3036 {
   3037     p_evt_data->dch_abort_ind.mcl_handle = mcl_handle;
   3038     p_evt_data->dch_abort_ind.app_handle = app_handle;
   3039 }
   3040 /*******************************************************************************
   3041 **
   3042 ** Function      bta_hl_build_close_cfm
   3043 **
   3044 ** Description   This function builds the close confirmation event data
   3045 **
   3046 ** Returns      None
   3047 **
   3048 *******************************************************************************/
   3049 void  bta_hl_build_dch_close_cfm(tBTA_HL *p_evt_data,
   3050                                  tBTA_HL_APP_HANDLE app_handle,
   3051                                  tBTA_HL_MCL_HANDLE mcl_handle,
   3052                                  tBTA_HL_MDL_HANDLE mdl_handle,
   3053                                  tBTA_HL_STATUS status)
   3054 {
   3055     p_evt_data->dch_close_cfm.status = status;
   3056     p_evt_data->dch_close_cfm.mdl_handle = mdl_handle;
   3057     p_evt_data->dch_close_cfm.mcl_handle = mcl_handle;
   3058     p_evt_data->dch_close_cfm.app_handle = app_handle;
   3059 }
   3060 
   3061 /*******************************************************************************
   3062 **
   3063 ** Function      bta_hl_build_dch_close_ind
   3064 **
   3065 ** Description   This function builds the close indication event data
   3066 **
   3067 ** Returns      None
   3068 **
   3069 *******************************************************************************/
   3070 void  bta_hl_build_dch_close_ind(tBTA_HL *p_evt_data,
   3071                                  tBTA_HL_APP_HANDLE app_handle,
   3072                                  tBTA_HL_MCL_HANDLE mcl_handle,
   3073                                  tBTA_HL_MDL_HANDLE mdl_handle,
   3074                                  BOOLEAN intentional)
   3075 {
   3076     p_evt_data->dch_close_ind.mdl_handle = mdl_handle;
   3077     p_evt_data->dch_close_ind.mcl_handle = mcl_handle;
   3078     p_evt_data->dch_close_ind.app_handle = app_handle;
   3079     p_evt_data->dch_close_ind.intentional = intentional;
   3080 }
   3081 
   3082 /*******************************************************************************
   3083 **
   3084 ** Function      bta_hl_build_send_data_cfm
   3085 **
   3086 ** Description   This function builds the send data confirmation event data
   3087 **
   3088 ** Returns      None
   3089 **
   3090 *******************************************************************************/
   3091 void  bta_hl_build_send_data_cfm(tBTA_HL *p_evt_data,
   3092                                  tBTA_HL_APP_HANDLE app_handle,
   3093                                  tBTA_HL_MCL_HANDLE mcl_handle,
   3094                                  tBTA_HL_MDL_HANDLE mdl_handle,
   3095                                  tBTA_HL_STATUS status )
   3096 {
   3097 
   3098     p_evt_data->dch_send_data_cfm.mdl_handle = mdl_handle;
   3099     p_evt_data->dch_send_data_cfm.mcl_handle = mcl_handle;
   3100     p_evt_data->dch_send_data_cfm.app_handle = app_handle;
   3101     p_evt_data->dch_send_data_cfm.status = status;
   3102 }
   3103 
   3104 /*******************************************************************************
   3105 **
   3106 ** Function      bta_hl_build_rcv_data_ind
   3107 **
   3108 ** Description   This function builds the received data indication event data
   3109 **
   3110 ** Returns      None
   3111 **
   3112 *******************************************************************************/
   3113 void  bta_hl_build_rcv_data_ind(tBTA_HL *p_evt_data,
   3114                                 tBTA_HL_APP_HANDLE app_handle,
   3115                                 tBTA_HL_MCL_HANDLE mcl_handle,
   3116                                 tBTA_HL_MDL_HANDLE mdl_handle)
   3117 {
   3118     p_evt_data->dch_rcv_data_ind.mdl_handle = mdl_handle;
   3119     p_evt_data->dch_rcv_data_ind.mcl_handle = mcl_handle;
   3120     p_evt_data->dch_rcv_data_ind.app_handle = app_handle;
   3121 }
   3122 
   3123 
   3124 /*******************************************************************************
   3125 **
   3126 ** Function      bta_hl_build_cch_open_cfm
   3127 **
   3128 ** Description   This function builds the CCH open confirmation event data
   3129 **
   3130 ** Returns      None
   3131 **
   3132 *******************************************************************************/
   3133 void  bta_hl_build_cch_open_cfm(tBTA_HL *p_evt_data,
   3134                                 UINT8 app_id,
   3135                                 tBTA_HL_APP_HANDLE app_handle,
   3136                                 tBTA_HL_MCL_HANDLE mcl_handle,
   3137                                 BD_ADDR bd_addr,
   3138                                 tBTA_HL_STATUS status )
   3139 {
   3140     p_evt_data->cch_open_cfm.app_id = app_id;
   3141     p_evt_data->cch_open_cfm.app_handle = app_handle;
   3142     p_evt_data->cch_open_cfm.mcl_handle = mcl_handle;
   3143     bdcpy(p_evt_data->cch_open_cfm.bd_addr, bd_addr);
   3144     p_evt_data->cch_open_cfm.status = status;
   3145     APPL_TRACE_DEBUG("bta_hl_build_cch_open_cfm: status=%d",status);
   3146 }
   3147 
   3148 /*******************************************************************************
   3149 **
   3150 ** Function      bta_hl_build_cch_open_ind
   3151 **
   3152 ** Description   This function builds the CCH open indication event data
   3153 **
   3154 ** Returns      None
   3155 **
   3156 *******************************************************************************/
   3157 void  bta_hl_build_cch_open_ind(tBTA_HL *p_evt_data, tBTA_HL_APP_HANDLE app_handle,
   3158                                 tBTA_HL_MCL_HANDLE mcl_handle,
   3159                                 BD_ADDR bd_addr )
   3160 {
   3161 
   3162     p_evt_data->cch_open_ind.app_handle = app_handle;
   3163     p_evt_data->cch_open_ind.mcl_handle = mcl_handle;
   3164     bdcpy(p_evt_data->cch_open_ind.bd_addr, bd_addr);
   3165 }
   3166 
   3167 /*******************************************************************************
   3168 **
   3169 ** Function      bta_hl_build_cch_close_cfm
   3170 **
   3171 ** Description   This function builds the CCH close confirmation event data
   3172 **
   3173 ** Returns      None
   3174 **
   3175 *******************************************************************************/
   3176 void  bta_hl_build_cch_close_cfm(tBTA_HL *p_evt_data,
   3177                                  tBTA_HL_APP_HANDLE app_handle,
   3178                                  tBTA_HL_MCL_HANDLE mcl_handle,
   3179                                  tBTA_HL_STATUS status )
   3180 {
   3181     p_evt_data->cch_close_cfm.mcl_handle = mcl_handle;
   3182     p_evt_data->cch_close_cfm.app_handle = app_handle;
   3183     p_evt_data->cch_close_cfm.status = status;
   3184 }
   3185 
   3186 
   3187 /*******************************************************************************
   3188 **
   3189 ** Function      bta_hl_build_cch_close_ind
   3190 **
   3191 ** Description   This function builds the CCH colse indication event data
   3192 **
   3193 ** Returns      None
   3194 **
   3195 *******************************************************************************/
   3196 void  bta_hl_build_cch_close_ind(tBTA_HL *p_evt_data,
   3197                                  tBTA_HL_APP_HANDLE app_handle,
   3198                                  tBTA_HL_MCL_HANDLE mcl_handle,
   3199                                  BOOLEAN intentional)
   3200 {
   3201     p_evt_data->cch_close_ind.mcl_handle = mcl_handle;
   3202     p_evt_data->cch_close_ind.app_handle = app_handle;
   3203     p_evt_data->cch_close_ind.intentional = intentional;
   3204 }
   3205 
   3206 /*******************************************************************************
   3207 **
   3208 ** Function      bta_hl_build_dch_open_cfm
   3209 **
   3210 ** Description   This function builds the DCH open confirmation event data
   3211 **
   3212 ** Returns      None
   3213 **
   3214 *******************************************************************************/
   3215 void  bta_hl_build_dch_open_cfm(tBTA_HL *p_evt_data,
   3216                                 tBTA_HL_APP_HANDLE app_handle,
   3217                                 tBTA_HL_MCL_HANDLE mcl_handle,
   3218                                 tBTA_HL_MDL_HANDLE mdl_handle,
   3219                                 tBTA_HL_MDEP_ID local_mdep_id,
   3220                                 tBTA_HL_MDL_ID mdl_id,
   3221                                 tBTA_HL_DCH_MODE dch_mode,
   3222                                 BOOLEAN first_reliable,
   3223                                 UINT16 mtu,
   3224                                 tBTA_HL_STATUS status)
   3225 
   3226 {
   3227     p_evt_data->dch_open_cfm.mdl_handle = mdl_handle;
   3228     p_evt_data->dch_open_cfm.mcl_handle = mcl_handle;
   3229     p_evt_data->dch_open_cfm.app_handle = app_handle;
   3230     p_evt_data->dch_open_cfm.local_mdep_id = local_mdep_id;
   3231     p_evt_data->dch_open_cfm.mdl_id = mdl_id;
   3232     p_evt_data->dch_open_cfm.dch_mode = dch_mode;
   3233     p_evt_data->dch_open_cfm.first_reliable = first_reliable;
   3234     p_evt_data->dch_open_cfm.mtu = mtu;
   3235     p_evt_data->dch_open_cfm.status = status;
   3236 }
   3237 
   3238 
   3239 /*******************************************************************************
   3240 **
   3241 ** Function      bta_hl_build_sdp_query_cfm
   3242 **
   3243 ** Description   This function builds the SDP query indication event data
   3244 **
   3245 ** Returns      None
   3246 **
   3247 *******************************************************************************/
   3248 void  bta_hl_build_sdp_query_cfm(tBTA_HL *p_evt_data,
   3249                                  UINT8 app_id,
   3250                                  tBTA_HL_APP_HANDLE app_handle,
   3251                                  BD_ADDR bd_addr,
   3252                                  tBTA_HL_SDP *p_sdp,
   3253                                  tBTA_HL_STATUS status)
   3254 
   3255 {
   3256     APPL_TRACE_DEBUG("bta_hl_build_sdp_query_cfm: app_id = %d, app_handle=%d",
   3257                         app_id,app_handle);
   3258     p_evt_data->sdp_query_cfm.app_id = app_id;
   3259     p_evt_data->sdp_query_cfm.app_handle = app_handle;
   3260     bdcpy(p_evt_data->sdp_query_cfm.bd_addr, bd_addr);
   3261     p_evt_data->sdp_query_cfm.p_sdp = p_sdp;
   3262     p_evt_data->sdp_query_cfm.status = status;
   3263 }
   3264 
   3265 
   3266 /*******************************************************************************
   3267 **
   3268 ** Function      bta_hl_build_delete_mdl_cfm
   3269 **
   3270 ** Description   This function builds the delete MDL confirmation event data
   3271 **
   3272 ** Returns      None
   3273 **
   3274 *******************************************************************************/
   3275 void  bta_hl_build_delete_mdl_cfm(tBTA_HL *p_evt_data,
   3276                                   tBTA_HL_APP_HANDLE app_handle,
   3277                                   tBTA_HL_MCL_HANDLE mcl_handle,
   3278                                   tBTA_HL_MDL_ID mdl_id,
   3279                                   tBTA_HL_STATUS status)
   3280 
   3281 {
   3282     p_evt_data->delete_mdl_cfm.mcl_handle = mcl_handle;
   3283     p_evt_data->delete_mdl_cfm.app_handle = app_handle;
   3284     p_evt_data->delete_mdl_cfm.mdl_id = mdl_id;
   3285     p_evt_data->delete_mdl_cfm.status = status;
   3286 }
   3287 
   3288 /*******************************************************************************
   3289 **
   3290 ** Function      bta_hl_build_echo_test_cfm
   3291 **
   3292 ** Description   This function builds the echo test confirmation event data
   3293 **
   3294 ** Returns      None
   3295 **
   3296 *******************************************************************************/
   3297 void  bta_hl_build_echo_test_cfm(tBTA_HL *p_evt_data,
   3298                                  tBTA_HL_APP_HANDLE app_handle,
   3299                                  tBTA_HL_MCL_HANDLE mcl_handle,
   3300                                  tBTA_HL_STATUS status )
   3301 {
   3302     p_evt_data->echo_test_cfm.mcl_handle = mcl_handle;
   3303     p_evt_data->echo_test_cfm.app_handle = app_handle;
   3304     p_evt_data->echo_test_cfm.status = status;
   3305 }
   3306 
   3307 
   3308 /*****************************************************************************
   3309 **  Debug Functions
   3310 *****************************************************************************/
   3311 #if (BTA_HL_DEBUG == TRUE)
   3312 
   3313 /*******************************************************************************
   3314 **
   3315 ** Function         bta_hl_status_code
   3316 **
   3317 ** Description      get the status string pointer
   3318 **
   3319 ** Returns          char * - status string pointer
   3320 **
   3321 *******************************************************************************/
   3322 char *bta_hl_status_code(tBTA_HL_STATUS status)
   3323 {
   3324     switch (status)
   3325     {
   3326         case BTA_HL_STATUS_OK:
   3327             return "BTA_HL_STATUS_OK";
   3328         case BTA_HL_STATUS_FAIL:
   3329             return "BTA_HL_STATUS_FAIL";
   3330         case BTA_HL_STATUS_ABORTED:
   3331             return "BTA_HL_STATUS_ABORTED";
   3332         case BTA_HL_STATUS_NO_RESOURCE:
   3333             return "BTA_HL_STATUS_NO_RESOURCE";
   3334         case BTA_HL_STATUS_LAST_ITEM:
   3335             return "BTA_HL_STATUS_LAST_ITEM";
   3336         case BTA_HL_STATUS_DUPLICATE_APP_ID:
   3337             return "BTA_HL_STATUS_DUPLICATE_APP_ID";
   3338         case BTA_HL_STATUS_INVALID_APP_HANDLE:
   3339             return "BTA_HL_STATUS_INVALID_APP_HANDLE";
   3340         case BTA_HL_STATUS_INVALID_MCL_HANDLE:
   3341             return "BTA_HL_STATUS_INVALID_MCL_HANDLE";
   3342         case BTA_HL_STATUS_MCAP_REG_FAIL:
   3343             return "BTA_HL_STATUS_MCAP_REG_FAIL";
   3344         case BTA_HL_STATUS_MDEP_CO_FAIL:
   3345             return "BTA_HL_STATUS_MDEP_CO_FAIL";
   3346         case BTA_HL_STATUS_ECHO_CO_FAIL:
   3347             return "BTA_HL_STATUS_ECHO_CO_FAIL";
   3348         case BTA_HL_STATUS_MDL_CFG_CO_FAIL:
   3349             return "BTA_HL_STATUS_MDL_CFG_CO_FAIL";
   3350         case BTA_HL_STATUS_SDP_NO_RESOURCE:
   3351             return "BTA_HL_STATUS_SDP_NO_RESOURCE";
   3352         case BTA_HL_STATUS_SDP_FAIL:
   3353             return "BTA_HL_STATUS_SDP_FAIL";
   3354         case BTA_HL_STATUS_NO_CCH:
   3355             return "BTA_HL_STATUS_NO_CCH";
   3356         case BTA_HL_STATUS_NO_MCL:
   3357             return "BTA_HL_STATUS_NO_MCL";
   3358 
   3359         case BTA_HL_STATUS_NO_FIRST_RELIABLE:
   3360             return "BTA_HL_STATUS_NO_FIRST_RELIABLE";
   3361         case BTA_HL_STATUS_INVALID_DCH_CFG:
   3362             return "BTA_HL_STATUS_INVALID_DCH_CFG";
   3363         case BTA_HL_STATUS_INVALID_BD_ADDR:
   3364             return "BTA_HL_STATUS_INVALID_BD_ADDR";
   3365         case BTA_HL_STATUS_INVALID_RECONNECT_CFG:
   3366             return "BTA_HL_STATUS_INVALID_RECONNECT_CFG";
   3367         case BTA_HL_STATUS_ECHO_TEST_BUSY:
   3368             return "BTA_HL_STATUS_ECHO_TEST_BUSY";
   3369         case BTA_HL_STATUS_INVALID_LOCAL_MDEP_ID:
   3370             return "BTA_HL_STATUS_INVALID_LOCAL_MDEP_ID";
   3371         case BTA_HL_STATUS_INVALID_MDL_ID:
   3372             return "BTA_HL_STATUS_INVALID_MDL_ID";
   3373         case BTA_HL_STATUS_NO_MDL_ID_FOUND:
   3374             return "BTA_HL_STATUS_NO_MDL_ID_FOUND";
   3375         case BTA_HL_STATUS_DCH_BUSY:
   3376             return "BTA_HL_STATUS_DCH_BUSY";
   3377         default:
   3378             return "Unknown status code";
   3379     }
   3380 }
   3381 /*******************************************************************************
   3382 **
   3383 ** Function         bta_hl_evt_code
   3384 **
   3385 ** Description      Maps HL event code to the corresponding event string
   3386 **
   3387 ** Returns          string pointer for the associated event name
   3388 **
   3389 *******************************************************************************/
   3390 char *bta_hl_evt_code(tBTA_HL_INT_EVT evt_code)
   3391 {
   3392     switch (evt_code)
   3393     {
   3394         case BTA_HL_CCH_OPEN_EVT:
   3395             return "BTA_HL_CCH_OPEN_EVT";
   3396         case BTA_HL_CCH_SDP_OK_EVT:
   3397             return "BTA_HL_CCH_SDP_OK_EVT";
   3398         case BTA_HL_CCH_SDP_FAIL_EVT:
   3399             return "BTA_HL_CCH_SDP_FAIL_EVT";
   3400         case BTA_HL_MCA_CONNECT_IND_EVT:
   3401             return "BTA_HL_MCA_CONNECT_IND_EVT";
   3402         case BTA_HL_MCA_DISCONNECT_IND_EVT:
   3403             return "BTA_HL_MCA_DISCONNECT_IND_EVT";
   3404 
   3405         case BTA_HL_CCH_CLOSE_EVT:
   3406             return "BTA_HL_CCH_CLOSE_EVT";
   3407         case BTA_HL_CCH_CLOSE_CMPL_EVT:
   3408             return "BTA_HL_CCH_CLOSE_CMPL_EVT";
   3409         case BTA_HL_DCH_OPEN_EVT:
   3410             return "BTA_HL_DCH_OPEN_EVT";
   3411         case BTA_HL_MCA_CREATE_IND_EVT:
   3412             return "BTA_HL_MCA_CREATE_IND_EVT";
   3413         case BTA_HL_MCA_CREATE_CFM_EVT:
   3414             return "BTA_HL_MCA_CREATE_CFM_EVT";
   3415         case BTA_HL_MCA_OPEN_IND_EVT:
   3416             return "BTA_HL_MCA_OPEN_IND_EVT";
   3417         case BTA_HL_MCA_OPEN_CFM_EVT:
   3418             return "BTA_HL_MCA_OPEN_CFM_EVT";
   3419         case BTA_HL_DCH_CLOSE_EVT:
   3420             return "BTA_HL_DCH_CLOSE_EVT";
   3421         case BTA_HL_MCA_CLOSE_IND_EVT:
   3422             return "BTA_HL_MCA_CLOSE_IND_EVT";
   3423         case BTA_HL_MCA_CLOSE_CFM_EVT:
   3424             return "BTA_HL_MCA_CLOSE_CFM_EVT";
   3425         case BTA_HL_API_SEND_DATA_EVT:
   3426             return "BTA_HL_API_SEND_DATA_EVT";
   3427         case BTA_HL_MCA_RCV_DATA_EVT:
   3428             return "BTA_HL_MCA_RCV_DATA_EVT";
   3429         case BTA_HL_DCH_CLOSE_CMPL_EVT:
   3430             return "BTA_HL_DCH_CLOSE_CMPL_EVT";
   3431 
   3432         case BTA_HL_API_ENABLE_EVT:
   3433             return "BTA_HL_API_ENABLE_EVT";
   3434         case BTA_HL_API_DISABLE_EVT:
   3435             return "BTA_HL_API_DISABLE_EVT";
   3436         case BTA_HL_API_UPDATE_EVT:
   3437              return "BTA_HL_API_UPDATE_EVT";
   3438         case BTA_HL_API_REGISTER_EVT:
   3439             return "BTA_HL_API_REGISTER_EVT";
   3440         case BTA_HL_API_DEREGISTER_EVT:
   3441             return "BTA_HL_API_DEREGISTER_EVT";
   3442 
   3443         case BTA_HL_API_CCH_OPEN_EVT:
   3444             return "BTA_HL_API_CCH_OPEN_EVT";
   3445 
   3446         case BTA_HL_API_CCH_CLOSE_EVT:
   3447             return "BTA_HL_API_CCH_CLOSE_EVT";
   3448         case BTA_HL_API_DCH_OPEN_EVT:
   3449             return "BTA_HL_API_DCH_OPEN_EVT";
   3450 
   3451         case BTA_HL_API_DCH_RECONNECT_EVT:
   3452             return "BTA_HL_API_DCH_RECONNECT_EVT";
   3453         case BTA_HL_API_DCH_CLOSE_EVT:
   3454             return "BTA_HL_API_DCH_CLOSE_EVT";
   3455         case BTA_HL_API_DELETE_MDL_EVT:
   3456             return "BTA_HL_API_DELETE_MDL_EVT";
   3457         case BTA_HL_API_DCH_ABORT_EVT:
   3458             return "BTA_HL_API_DCH_ABORT_EVT";
   3459 
   3460         case BTA_HL_DCH_RECONNECT_EVT:
   3461             return "BTA_HL_DCH_RECONNECT_EVT";
   3462         case BTA_HL_DCH_SDP_INIT_EVT:
   3463             return "BTA_HL_DCH_SDP_INIT_EVT";
   3464         case BTA_HL_DCH_SDP_FAIL_EVT:
   3465             return "BTA_HL_DCH_SDP_FAIL_EVT";
   3466         case BTA_HL_API_DCH_ECHO_TEST_EVT:
   3467             return "BTA_HL_API_DCH_ECHO_TEST_EVT";
   3468         case BTA_HL_DCH_CLOSE_ECHO_TEST_EVT:
   3469             return "BTA_HL_DCH_CLOSE_ECHO_TEST_EVT";
   3470         case BTA_HL_MCA_RECONNECT_IND_EVT:
   3471             return "BTA_HL_MCA_RECONNECT_IND_EVT";
   3472         case BTA_HL_MCA_RECONNECT_CFM_EVT:
   3473             return "BTA_HL_MCA_RECONNECT_CFM_EVT";
   3474         case BTA_HL_API_DCH_CREATE_RSP_EVT:
   3475             return "BTA_HL_API_DCH_CREATE_RSP_EVT";
   3476         case BTA_HL_DCH_ABORT_EVT:
   3477             return "BTA_HL_DCH_ABORT_EVT";
   3478         case BTA_HL_MCA_ABORT_IND_EVT:
   3479             return "BTA_HL_MCA_ABORT_IND_EVT";
   3480         case BTA_HL_MCA_ABORT_CFM_EVT:
   3481             return "BTA_HL_MCA_ABORT_CFM_EVT";
   3482         case BTA_HL_MCA_DELETE_IND_EVT:
   3483             return "BTA_HL_MCA_DELETE_IND_EVT";
   3484         case BTA_HL_MCA_DELETE_CFM_EVT:
   3485             return "BTA_HL_MCA_DELETE_CFM_EVT";
   3486         case BTA_HL_MCA_CONG_CHG_EVT:
   3487             return "BTA_HL_MCA_CONG_CHG_EVT";
   3488         case BTA_HL_CI_GET_TX_DATA_EVT:
   3489             return "BTA_HL_CI_GET_TX_DATA_EVT";
   3490         case BTA_HL_CI_PUT_RX_DATA_EVT:
   3491             return "BTA_HL_CI_PUT_RX_DATA_EVT";
   3492         case BTA_HL_CI_GET_ECHO_DATA_EVT:
   3493             return "BTA_HL_CI_GET_ECHO_DATA_EVT";
   3494         case BTA_HL_DCH_ECHO_TEST_EVT:
   3495             return "BTA_HL_DCH_ECHO_TEST_EVT";
   3496         case BTA_HL_CI_PUT_ECHO_DATA_EVT:
   3497             return "BTA_HL_CI_PUT_ECHO_DATA_EVT";
   3498         case BTA_HL_API_SDP_QUERY_EVT:
   3499             return "BTA_HL_API_SDP_QUERY_EVT";
   3500         case BTA_HL_SDP_QUERY_OK_EVT:
   3501             return "BTA_HL_SDP_QUERY_OK_EVT";
   3502         case BTA_HL_SDP_QUERY_FAIL_EVT:
   3503             return "BTA_HL_SDP_QUERY_FAIL_EVT";
   3504         case BTA_HL_MCA_RSP_TOUT_IND_EVT:
   3505             return "BTA_HL_MCA_RSP_TOUT_IND_EVT";
   3506 
   3507         default:
   3508             return "Unknown HL event code";
   3509     }
   3510 }
   3511 
   3512 #endif  /* Debug Functions */
   3513 #endif // HL_INCLUDED
   3514 
   3515 
   3516 
   3517 
   3518 
   3519 
   3520 
   3521 
   3522