/******************************************************************************
 *
 *  Copyright (C) 2009-2012 Broadcom Corporation
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at:
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 ******************************************************************************/

/************************************************************************************
 *
 *  Filename:      btif_hl.c
 *
 *  Description:   Health Device Profile Bluetooth Interface
 *
 *
 ***********************************************************************************/
#define LOG_TAG "BTIF_HL"

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <time.h>
#include <fcntl.h>
#include <unistd.h>
#include <pthread.h>
#include <signal.h>
#include <ctype.h>
#include <sys/select.h>
#include <sys/poll.h>
#include <cutils/sockets.h>
#include <cutils/log.h>

#include <hardware/bluetooth.h>
#include <hardware/bt_hl.h>

#include "btif_common.h"
#include "btif_util.h"
#include "gki.h"
#include "bd.h"
#include "bta_api.h"
#include "bta_hl_api.h"
#include "mca_api.h"
#include "btif_hl.h"
#include "btif_storage.h"
#include "btu.h"

#define MAX_DATATYPE_SUPPORTED 8

extern int btif_hl_update_maxfd( int max_org_s);
extern void btif_hl_select_monitor_callback( fd_set *p_cur_set, fd_set *p_org_set );
extern void btif_hl_select_wakeup_callback( fd_set *p_org_set , int wakeup_signal );
extern int btif_hl_update_maxfd( int max_org_s);
extern void btif_hl_select_monitor_callback( fd_set *p_cur_set, fd_set *p_org_set );
extern void btif_hl_select_wakeup_callback( fd_set *p_org_set , int wakeup_signal );
extern void btif_hl_soc_thread_init(void);
extern void btif_hl_release_mcl_sockets(UINT8 app_idx, UINT8 mcl_idx);
extern BOOLEAN btif_hl_create_socket(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx);
extern void btif_hl_release_socket(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx);

btif_hl_cb_t btif_hl_cb;
btif_hl_cb_t *p_btif_hl_cb = &btif_hl_cb;

/************************************************************************************
**  Static variables
************************************************************************************/
static bthl_callbacks_t  bt_hl_callbacks_cb;
static bthl_callbacks_t *bt_hl_callbacks=NULL;

/* signal socketpair to wake up select loop */

const int btif_hl_signal_select_wakeup = 1;
const int btif_hl_signal_select_exit = 2;
const int btif_hl_signal_select_close_connected = 3;

static int listen_s = -1;
static int connected_s = -1;
static int select_thread_id = -1;
static int signal_fds[2] = { -1, -1 };
static BUFFER_Q soc_queue;
static int reg_counter;

static inline int btif_hl_select_wakeup(void);
static inline int btif_hl_select_close_connected(void);
static inline int btif_hl_close_select_thread(void);
static UINT8 btif_hl_get_next_app_id(void);
static int btif_hl_get_next_channel_id(UINT8 app_id);
static void btif_hl_init_next_app_id(void);
static void btif_hl_init_next_channel_id(void);
static void btif_hl_ctrl_cback(tBTA_HL_CTRL_EVT event, tBTA_HL_CTRL *p_data);
static void btif_hl_set_state(btif_hl_state_t state);
static btif_hl_state_t btif_hl_get_state(void);
static void btif_hl_cback(tBTA_HL_EVT event, tBTA_HL *p_data);
static void btif_hl_proc_cb_evt(UINT16 event, char* p_param);

#define CHECK_CALL_CBACK(P_CB, P_CBACK, ...)\
    if (P_CB && P_CB->P_CBACK) {            \
        P_CB->P_CBACK(__VA_ARGS__);         \
    }                                       \
    else {                                  \
        ASSERTC(0, "Callback is NULL", 0);  \
    }


#define BTIF_HL_CALL_CBACK(P_CB, P_CBACK, ...)\
     if((p_btif_hl_cb->state != BTIF_HL_STATE_DISABLING) &&\
         (p_btif_hl_cb->state != BTIF_HL_STATE_DISABLED))  \
     {                                                     \
        if (P_CB && P_CB->P_CBACK) {                       \
            P_CB->P_CBACK(__VA_ARGS__);                    \
        }                                                  \
        else {                                             \
            ASSERTC(0, "Callback is NULL", 0);             \
        }                                                  \
    }


#define CHECK_BTHL_INIT() if (bt_hl_callbacks == NULL)\
    {\
        BTIF_TRACE_WARNING("BTHL: %s: BTHL not initialized", __FUNCTION__);\
        return BT_STATUS_NOT_READY;\
    }\
    else\
    {\
        BTIF_TRACE_EVENT("BTHL: %s", __FUNCTION__);\
    }


static const btif_hl_data_type_cfg_t data_type_table[] = {
    /* Data Specilization                   Ntx     Nrx (from Bluetooth SIG's HDP whitepaper)*/
    {BTIF_HL_DATA_TYPE_PULSE_OXIMETER,      9216,   256},
    {BTIF_HL_DATA_TYPE_BLOOD_PRESSURE_MON,  896,    224},
    {BTIF_HL_DATA_TYPE_BODY_THERMOMETER,    896,    224},
    {BTIF_HL_DATA_TYPE_BODY_WEIGHT_SCALE,   896,    224},
    {BTIF_HL_DATA_TYPE_GLUCOSE_METER,       896,    224},
    {BTIF_HL_DATA_TYPE_STEP_COUNTER,        6624,   224},
    {BTIF_HL_DATA_TYPE_BCA,                 7730,   1230},
    {BTIF_HL_DATA_TYPE_PEAK_FLOW    ,       2030,   224},
    {BTIF_HL_DATA_TYPE_ACTIVITY_HUB,        5120,   224},
    {BTIF_HL_DATA_TYPE_AMM,                 1024,   64}
};

#define BTIF_HL_DATA_TABLE_SIZE  (sizeof(data_type_table) / sizeof(btif_hl_data_type_cfg_t))
#define BTIF_HL_DEFAULT_SRC_TX_APDU_SIZE   10240 /* use this size if the data type is not
                                                    defined in the table; for future proof */
#define BTIF_HL_DEFAULT_SRC_RX_APDU_SIZE   512  /* use this size if the data type is not
                                                   defined in the table; for future proof */

#define BTIF_HL_ECHO_MAX_TX_RX_APDU_SIZE 1024

/************************************************************************************
**  Static utility functions
************************************************************************************/

#define BTIF_IF_GET_NAME 16
void btif_hl_display_calling_process_name(void)
{
    char name[16];
    prctl(BTIF_IF_GET_NAME, name, 0, 0, 0);
    BTIF_TRACE_DEBUG("Process name (%s)", name);
}
#define BTIF_TIMEOUT_CCH_NO_DCH_SECS   30
/*******************************************************************************
**
** Function      btif_hl_if_channel_setup_pending
**
** Description   check whether channel id is in setup pending state or not
**
** Returns      BOOLEAN
**
*******************************************************************************/
BOOLEAN btif_hl_if_channel_setup_pending(int channel_id, UINT8 *p_app_idx, UINT8 *p_mcl_idx)
{
    btif_hl_app_cb_t    *p_acb;
    btif_hl_mcl_cb_t    *p_mcb;
    UINT8 i, j;
    BOOLEAN found=FALSE;
    for (i=0; i < BTA_HL_NUM_APPS ; i ++)
    {
        p_acb  =BTIF_HL_GET_APP_CB_PTR(i);
        if (p_acb->in_use)
        {
            for (j=0; j< BTA_HL_NUM_MCLS; j++)
            {
                p_mcb = BTIF_HL_GET_MCL_CB_PTR(i, j);
                if (p_mcb->in_use &&
                    p_mcb->is_connected && p_mcb->pcb.channel_id == channel_id )
                {
                    found = TRUE;
                    *p_app_idx = i;
                    *p_mcl_idx = j;
                    break;
                }
            }
        }
        if (found)
            break;
    }
    BTIF_TRACE_DEBUG("%s found=%d channel_id=0x%08x",
                      __FUNCTION__, found, channel_id, *p_app_idx, *p_mcl_idx);
    return found;

}
/*******************************************************************************
**
** Function      btif_hl_num_dchs_in_use
**
** Description find number of DCHs in use
**
** Returns      UINT8
*******************************************************************************/
UINT8 btif_hl_num_dchs_in_use(UINT8 mcl_handle){

    btif_hl_app_cb_t    * p_acb;
    btif_hl_mcl_cb_t    *p_mcb;
    UINT8               i,j,x;
    UINT8               cnt=0;

    for (i=0; i<BTA_HL_NUM_APPS; i++)
    {
        BTIF_TRACE_DEBUG("btif_hl_num_dchs:i = %d",i);
        p_acb =BTIF_HL_GET_APP_CB_PTR(i);
        if (p_acb && p_acb->in_use)
        {
            for (j=0; j < BTA_HL_NUM_MCLS ; j++)
            {
                if(p_acb->mcb[j].in_use)
                    BTIF_TRACE_DEBUG("btif_hl_num_dchs:mcb in use j=%d, mcl_handle=%d,mcb handle=%d",
                                        j,mcl_handle, p_acb->mcb[j].mcl_handle);
                if (p_acb->mcb[j].in_use &&
                    (p_acb->mcb[j].mcl_handle == mcl_handle))
                {
                    p_mcb = &p_acb->mcb[j];
                    BTIF_TRACE_DEBUG("btif_hl_num_dchs: mcl handle found j =%d",j);
                    for (x=0; x < BTA_HL_NUM_MDLS_PER_MCL ; x ++)
                    {
                        if (p_mcb->mdl[x].in_use)
                        {
                            BTIF_TRACE_DEBUG("btif_hl_num_dchs_in_use:found x =%d",x);
                            cnt++;
                        }
                    }
                }
            }
        }
    }

    BTIF_TRACE_DEBUG("%s dch in use count=%d", __FUNCTION__, cnt);
    return cnt;
}
/*******************************************************************************
**
** Function      btif_hl_tmr_hdlr
**
** Description   Process timer timeout
**
** Returns      void
*******************************************************************************/
void btif_hl_tmr_hdlr(TIMER_LIST_ENT *tle)
{
    btif_hl_mcl_cb_t    *p_mcb;
    UINT8               i,j;
    BTIF_TRACE_DEBUG("%s timer_in_use=%d",  __FUNCTION__, tle->in_use );

    for (i=0; i < BTA_HL_NUM_APPS ; i ++)
    {
        for (j=0; j< BTA_HL_NUM_MCLS; j++)
        {
            p_mcb =BTIF_HL_GET_MCL_CB_PTR(i,j);

            if (p_mcb->cch_timer_active)
            {
                BTIF_TRACE_DEBUG("%app_idx=%d, mcl_idx=%d mcl-connected=%d",
                                  i, j,  p_mcb->is_connected);
                p_mcb->cch_timer_active = FALSE;
                if (p_mcb->is_connected)
                {
                    BTIF_TRACE_DEBUG("Idle timeout Close CCH app_idx=%d mcl_idx=%d mcl_handle=%d",
                                      i ,j, p_mcb->mcl_handle);
                    BTA_HlCchClose(p_mcb->mcl_handle);
                }
                else
                {
                    BTIF_TRACE_DEBUG("CCH idle timeout But CCH not connected app_idx=%d mcl_idx=%d ",i,j);
                }
            }
        }
    }
}
/*******************************************************************************
**
** Function      btif_hl_stop_cch_timer
**
** Description  stop CCH timer
**
** Returns      void
*******************************************************************************/
void btif_hl_stop_cch_timer(UINT8 app_idx, UINT8 mcl_idx)
{
    btif_hl_mcl_cb_t    *p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
    BTIF_TRACE_DEBUG("%s app_idx=%d, mcl_idx=%d timer_in_use=%d",
                      __FUNCTION__,app_idx, mcl_idx, p_mcb->cch_timer.in_use);

    p_mcb->cch_timer_active = FALSE;
    if (p_mcb->cch_timer.in_use)
    {
        BTIF_TRACE_DEBUG("stop CCH timer ");
        btu_stop_timer(&p_mcb->cch_timer);
    }
}
/*******************************************************************************
**
** Function      btif_hl_start_cch_timer
**
** Description  start CCH timer
**
** Returns      void
*******************************************************************************/
void btif_hl_start_cch_timer(UINT8 app_idx, UINT8 mcl_idx)
{
    btif_hl_mcl_cb_t    *p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
    BTIF_TRACE_DEBUG("%s app_idx=%d, mcl_idx=%d  timer_active=%d timer_in_use=%d",
                      __FUNCTION__,app_idx, mcl_idx,
                      p_mcb->cch_timer_active, p_mcb->cch_timer.in_use);

    p_mcb->cch_timer_active = TRUE;
    if (!p_mcb->cch_timer.in_use)
    {
        BTIF_TRACE_DEBUG("Start CCH timer ");
        memset(&p_mcb->cch_timer, 0, sizeof(TIMER_LIST_ENT));
        p_mcb->cch_timer.param = (UINT32)btif_hl_tmr_hdlr;
        btu_start_timer(&p_mcb->cch_timer, BTU_TTYPE_USER_FUNC,
                        BTIF_TIMEOUT_CCH_NO_DCH_SECS);
    }
    else
    {
        BTIF_TRACE_DEBUG("Restart CCH timer ");
        btu_stop_timer(&p_mcb->cch_timer);
        btu_start_timer(&p_mcb->cch_timer, BTU_TTYPE_USER_FUNC,
                        BTIF_TIMEOUT_CCH_NO_DCH_SECS);
    }

}
/*******************************************************************************
**
** Function      btif_hl_find_mdl_idx
**
** Description  Find the MDL index using MDL ID
**
** Returns      BOOLEAN
**
*******************************************************************************/
static BOOLEAN btif_hl_find_mdl_idx(UINT8 app_idx, UINT8 mcl_idx, UINT16 mdl_id,
                                    UINT8 *p_mdl_idx)
{
    btif_hl_mcl_cb_t      *p_mcb  = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
    BOOLEAN found=FALSE;
    UINT8 i;

    for (i=0; i < BTA_HL_NUM_MDLS_PER_MCL ; i ++)
    {
        if (p_mcb->mdl[i].in_use  &&
            (mdl_id !=0) &&
            (p_mcb->mdl[i].mdl_id== mdl_id))
        {
            found = TRUE;
            *p_mdl_idx = i;
            break;
        }
    }

    BTIF_TRACE_DEBUG("%s found=%d mdl_id=%d mdl_idx=%d ",
                      __FUNCTION__,found, mdl_id, i);

    return found;
}

/*******************************************************************************
**
** Function      btif_hl_get_buf
**
** Description   get buffer
**
** Returns     void
**
*******************************************************************************/
void * btif_hl_get_buf(UINT16 size)
{
    void *p_new;

    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
    BTIF_TRACE_DEBUG("ret size=%d GKI_MAX_BUF_SIZE=%d",size, 6000);

    if (size < 6000)
    {
        p_new = GKI_getbuf(size);
    }
    else
    {
        BTIF_TRACE_DEBUG("btif_hl_get_buf use HL large data pool");
        p_new = GKI_getpoolbuf(4);
    }

    return p_new;
}
/*******************************************************************************
**
** Function      btif_hl_free_buf
**
** Description free buffer
**
** Return void
**
*******************************************************************************/
void btif_hl_free_buf(void **p)
{
    if (*p != NULL)
    {
        BTIF_TRACE_DEBUG("%s OK", __FUNCTION__ );
        GKI_freebuf(*p);
        *p = NULL;
    }
    else
        BTIF_TRACE_ERROR("%s NULL pointer",__FUNCTION__ );
}
/*******************************************************************************
**
** Function      btif_hl_is_the_first_reliable_existed
**
** Description  This function checks whether the first reliable DCH channel
**              has been setup on the MCL or not
**
** Returns      BOOLEAN - TRUE exist
**                        FALSE does not exist
**
*******************************************************************************/
BOOLEAN btif_hl_is_the_first_reliable_existed(UINT8 app_idx, UINT8 mcl_idx )
{
    btif_hl_mcl_cb_t          *p_mcb  =BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
    BOOLEAN is_existed =FALSE;
    UINT8 i ;

    for (i=0; i< BTA_HL_NUM_MDLS_PER_MCL; i++)
    {
        if (p_mcb->mdl[i].in_use && p_mcb->mdl[i].is_the_first_reliable)
        {
            is_existed = TRUE;
            break;
        }
    }

    BTIF_TRACE_DEBUG("bta_hl_is_the_first_reliable_existed is_existed=%d  ",is_existed );
    return is_existed;
}
/*******************************************************************************
**
** Function      btif_hl_clean_delete_mdl
**
** Description   Cleanup the delete mdl control block
**
** Returns     Nothing
**
*******************************************************************************/
static void btif_hl_clean_delete_mdl(btif_hl_delete_mdl_t *p_cb)
{
    BTIF_TRACE_DEBUG("%s", __FUNCTION__ );
    memset(p_cb, 0 , sizeof(btif_hl_delete_mdl_t));
}

/*******************************************************************************
**
** Function      btif_hl_clean_pcb
**
** Description   Cleanup the pending chan control block
**
** Returns     Nothing
**
*******************************************************************************/
static void btif_hl_clean_pcb(btif_hl_pending_chan_cb_t *p_pcb)
{
    BTIF_TRACE_DEBUG("%s", __FUNCTION__ );
    memset(p_pcb, 0 , sizeof(btif_hl_pending_chan_cb_t));
}


/*******************************************************************************
**
** Function      btif_hl_clean_mdl_cb
**
** Description   Cleanup the MDL control block
**
** Returns     Nothing
**
*******************************************************************************/
static void btif_hl_clean_mdl_cb(btif_hl_mdl_cb_t *p_dcb)
{
    BTIF_TRACE_DEBUG("%s", __FUNCTION__ );
    btif_hl_free_buf((void **) &p_dcb->p_rx_pkt);
    btif_hl_free_buf((void **) &p_dcb->p_tx_pkt);
    memset(p_dcb, 0 , sizeof(btif_hl_mdl_cb_t));
}


/*******************************************************************************
**
** Function      btif_hl_reset_mcb
**
** Description   Reset MCL control block
**
** Returns      BOOLEAN
**
*******************************************************************************/
static void btif_hl_clean_mcl_cb(UINT8 app_idx, UINT8 mcl_idx)
{
    btif_hl_mcl_cb_t     *p_mcb;
    BTIF_TRACE_DEBUG("%s app_idx=%d, mcl_idx=%d", __FUNCTION__,app_idx, mcl_idx);
    p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
    memset(p_mcb, 0, sizeof(btif_hl_mcl_cb_t));
}


/*******************************************************************************
**
** Function      btif_hl_find_sdp_idx_using_mdep_filter
**
** Description  This function finds the SDP record index using MDEP filter parameters
**
** Returns      BOOLEAN
**
*******************************************************************************/
static void btif_hl_reset_mdep_filter(UINT8 app_idx)
{
    btif_hl_app_cb_t          *p_acb  =BTIF_HL_GET_APP_CB_PTR(app_idx);
    p_acb->filter.num_elems = 0;
}

/*******************************************************************************
**
** Function      btif_hl_find_sdp_idx_using_mdep_filter
**
** Description  This function finds the SDP record index using MDEP filter parameters
**
** Returns      BOOLEAN
**
*******************************************************************************/
static BOOLEAN btif_hl_find_sdp_idx_using_mdep_filter(UINT8 app_idx, UINT8 mcl_idx, UINT8 *p_sdp_idx)
{
    btif_hl_app_cb_t          *p_acb  =BTIF_HL_GET_APP_CB_PTR(app_idx);
    btif_hl_mcl_cb_t          *p_mcb  =BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
    UINT8                   i, j, num_recs,num_elems, num_mdeps, mdep_cnt, mdep_idx;
    tBTA_HL_MDEP_ROLE       peer_mdep_role;
    UINT16                  data_type;
    tBTA_HL_SDP_MDEP_CFG    *p_mdep;
    BOOLEAN                 found = FALSE;
    BOOLEAN                 elem_found;

    BTIF_TRACE_DEBUG("btif_hl_find_sdp_idx_using_mdep_filter");
    num_recs = p_mcb->sdp.num_recs;
    num_elems = p_acb->filter.num_elems;
    if (!num_elems)
    {
        BTIF_TRACE_DEBUG("btif_hl_find_sdp_idx_using_mdep_filter num_elem=0");
        *p_sdp_idx = 0;
        found = TRUE;
        return found;
    }

    for (i=0; i<num_recs; i++)
    {
        num_mdeps = p_mcb->sdp.sdp_rec[i].num_mdeps;
        for (j=0; j<num_elems; j++ )
        {
            data_type = p_acb->filter.elem[j].data_type;
            peer_mdep_role = p_acb->filter.elem[j].peer_mdep_role;
            elem_found = FALSE;
            mdep_cnt =0;
            mdep_idx=0;
            while (!elem_found && mdep_idx < num_mdeps )
            {
                p_mdep = &(p_mcb->sdp.sdp_rec[i].mdep_cfg[mdep_idx]);
                if ( (p_mdep->data_type == data_type) &&
                     (p_mdep->mdep_role == peer_mdep_role) )
                {
                    elem_found = TRUE;
                }
                else
                {
                    mdep_idx++;
                }
            }

            if (!elem_found)
            {
                found = FALSE;
                break;
            }
            else
            {
                found = TRUE;
            }
        }

        if (found)
        {
            BTIF_TRACE_DEBUG("btif_hl_find_sdp_idx_using_mdep_filter found idx=%d",i);
            *p_sdp_idx = i;
            break;
        }
    }

    BTIF_TRACE_DEBUG("%s found=%d sdp_idx=%d",__FUNCTION__ , found, *p_sdp_idx);

    btif_hl_reset_mdep_filter(app_idx);

    return found;
}
/*******************************************************************************
**
** Function      btif_hl_is_reconnect_possible
**
** Description  check reconnect is possible or not
**
** Returns      BOOLEAN
**
*******************************************************************************/
BOOLEAN btif_hl_is_reconnect_possible(UINT8 app_idx, UINT8 mcl_idx,  int mdep_cfg_idx,
                                      tBTA_HL_DCH_OPEN_PARAM *p_dch_open_api, tBTA_HL_MDL_ID *p_mdl_id)
{
    btif_hl_app_cb_t     *p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
    btif_hl_mcl_cb_t     *p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
    tBTA_HL_DCH_CFG      local_cfg = p_dch_open_api->local_cfg;
    tBTA_HL_DCH_MODE     dch_mode = BTA_HL_DCH_MODE_RELIABLE;
    BOOLEAN              use_mdl_dch_mode=FALSE;
    btif_hl_mdl_cfg_t    *p_mdl;
    btif_hl_mdl_cfg_t    *p_mdl1;
    UINT8                i, j;
    BOOLEAN              is_reconnect_ok=FALSE;
    BOOLEAN              stream_mode_avail=FALSE;
    UINT16               data_type = p_acb->sup_feature.mdep[mdep_cfg_idx].mdep_cfg.data_cfg[0].data_type;
    tBTA_HL_MDEP_ID      peer_mdep_id = p_dch_open_api->peer_mdep_id;
    UINT8                mdl_idx;


    BTIF_TRACE_DEBUG("%s app_idx=%d mcl_idx=%d mdep_cfg_idx=%d",
                      __FUNCTION__, app_idx, mcl_idx, mdep_cfg_idx  );
    switch (local_cfg)
    {
        case BTA_HL_DCH_CFG_NO_PREF:
            if (!btif_hl_is_the_first_reliable_existed(app_idx, mcl_idx))
            {
                dch_mode = BTA_HL_DCH_MODE_RELIABLE;
            }
            else
            {
                use_mdl_dch_mode = TRUE;
            }
            break;
        case BTA_HL_DCH_CFG_RELIABLE:
            dch_mode = BTA_HL_DCH_MODE_RELIABLE;
            break;
        case BTA_HL_DCH_CFG_STREAMING:
            dch_mode = BTA_HL_DCH_MODE_STREAMING;
            break;
        default:
            BTIF_TRACE_ERROR("Invalid local_cfg=%d",local_cfg );
            return is_reconnect_ok;
            break;

    }

    BTIF_TRACE_DEBUG("local_cfg=%d use_mdl_dch_mode=%d dch_mode=%d ",
                      local_cfg, use_mdl_dch_mode, dch_mode  );

    for (i=0, p_mdl=&p_acb->mdl_cfg[0] ; i< BTA_HL_NUM_MDL_CFGS; i++, p_mdl++ )
    {
        if (p_mdl->base.active &&
            p_mdl->extra.data_type ==data_type &&
            (p_mdl->extra.peer_mdep_id != BTA_HL_INVALID_MDEP_ID && p_mdl->extra.peer_mdep_id == peer_mdep_id) &&
            memcpy(p_mdl->base.peer_bd_addr, p_mcb->bd_addr,sizeof(BD_ADDR) ) &&
            p_mdl->base.mdl_id &&
            !btif_hl_find_mdl_idx(app_idx, mcl_idx,p_mdl->base.mdl_id, &mdl_idx))
        {
            BTIF_TRACE_DEBUG("i=%d Matched active=%d   mdl_id =%d, mdl_dch_mode=%d",
                              i, p_mdl->base.active, p_mdl->base.mdl_id,p_mdl->base.dch_mode);
            if (!use_mdl_dch_mode)
            {
                if (p_mdl->base.dch_mode == dch_mode)
                {
                    is_reconnect_ok = TRUE;
                    *p_mdl_id = p_mdl->base.mdl_id;
                    BTIF_TRACE_DEBUG("reconnect is possible dch_mode=%d mdl_id=%d", dch_mode, p_mdl->base.mdl_id );
                    break;
                }
            }
            else
            {
                is_reconnect_ok = TRUE;
                for (j=i, p_mdl1=&p_acb->mdl_cfg[i]; j< BTA_HL_NUM_MDL_CFGS; j++, p_mdl1++)
                {
                    if (p_mdl1->base.active &&
                        p_mdl1->extra.data_type == data_type &&
                        (p_mdl1->extra.peer_mdep_id != BTA_HL_INVALID_MDEP_ID && p_mdl1->extra.peer_mdep_id == peer_mdep_id) &&
                        memcpy(p_mdl1->base.peer_bd_addr, p_mcb->bd_addr,sizeof(BD_ADDR)) &&
                        p_mdl1->base.dch_mode == BTA_HL_DCH_MODE_STREAMING)
                    {
                        stream_mode_avail = TRUE;
                        BTIF_TRACE_DEBUG("found streaming mode mdl index=%d", j);
                        break;
                    }
                }

                if (stream_mode_avail)
                {
                    dch_mode = BTA_HL_DCH_MODE_STREAMING;
                    *p_mdl_id = p_mdl1->base.mdl_id;
                    BTIF_TRACE_DEBUG("reconnect is ok index=%d dch_mode=streaming  mdl_id=%d", j, *p_mdl_id);
                    break;
                }
                else
                {
                    dch_mode= p_mdl->base.dch_mode;
                    *p_mdl_id = p_mdl->base.mdl_id;
                    BTIF_TRACE_DEBUG("reconnect is ok index=%d  dch_mode=%d mdl_id=%d", i,  p_mdl->base.dch_mode, *p_mdl_id);
                    break;

                }
            }

        }

    }

    BTIF_TRACE_DEBUG("is_reconnect_ok  dch_mode=%d mdl_id=%d",is_reconnect_ok, dch_mode, *p_mdl_id);
    return is_reconnect_ok;
}

/*******************************************************************************
**
** Function      btif_hl_dch_open
**
** Description   Process DCH open request using the DCH Open API parameters
**
** Returns      BOOLEAN
**
*******************************************************************************/
BOOLEAN btif_hl_dch_open(UINT8 app_id, BD_ADDR bd_addr,
                         tBTA_HL_DCH_OPEN_PARAM *p_dch_open_api,
                         int mdep_cfg_idx,
                         btif_hl_pend_dch_op_t op, int *channel_id){
    btif_hl_app_cb_t            *p_acb;
    btif_hl_mcl_cb_t            *p_mcb;
    btif_hl_pending_chan_cb_t   *p_pcb;
    UINT8                       app_idx, mcl_idx;
    BOOLEAN                     status = FALSE;
    tBTA_HL_MDL_ID              mdl_id;
    tBTA_HL_DCH_RECONNECT_PARAM reconnect_param;

    BTIF_TRACE_DEBUG("%s app_id=%d ",
                      __FUNCTION__, app_id );
    BTIF_TRACE_DEBUG("DB [%02x:%02x:%02x:%02x:%02x:%02x]",
                      bd_addr[0],  bd_addr[1],bd_addr[2],  bd_addr[3], bd_addr[4],  bd_addr[5]);

    if (btif_hl_find_app_idx(app_id, &app_idx))
    {
        if (btif_hl_find_mcl_idx(app_idx, bd_addr , &mcl_idx))
        {
            p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);

            p_pcb = BTIF_HL_GET_PCB_PTR(app_idx, mcl_idx);
            if (!p_pcb->in_use)
            {
                p_mcb->req_ctrl_psm = p_dch_open_api->ctrl_psm;

                p_pcb->in_use = TRUE;
                *channel_id       =
                p_pcb->channel_id =  (int) btif_hl_get_next_channel_id(app_id);
                p_pcb->cb_state = BTIF_HL_CHAN_CB_STATE_CONNECTING_PENDING;
                p_pcb->mdep_cfg_idx = mdep_cfg_idx;
                memcpy(p_pcb->bd_addr, bd_addr, sizeof(BD_ADDR));
                p_pcb->op = op;

                if (p_mcb->sdp.num_recs)
                {
                    if (p_mcb->valid_sdp_idx)
                    {
                        p_dch_open_api->ctrl_psm  = p_mcb->ctrl_psm;
                    }

                    if (!btif_hl_is_reconnect_possible(app_idx, mcl_idx, mdep_cfg_idx, p_dch_open_api, &mdl_id ))
                    {

                        BTIF_TRACE_DEBUG("Issue DCH open" );
                        BTA_HlDchOpen(p_mcb->mcl_handle, p_dch_open_api);
                    }
                    else
                    {
                        reconnect_param.ctrl_psm = p_mcb->ctrl_psm;
                        reconnect_param.mdl_id = mdl_id;;
                        BTIF_TRACE_DEBUG("Issue Reconnect ctrl_psm=0x%x mdl_id=0x%x",reconnect_param.ctrl_psm, reconnect_param.mdl_id   );
                        BTA_HlDchReconnect(p_mcb->mcl_handle, &reconnect_param);
                    }

                    status = TRUE;
                }
                else
                {
                    p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
                    p_mcb->cch_oper = BTIF_HL_CCH_OP_DCH_OPEN;
                    BTA_HlSdpQuery(app_id,p_acb->app_handle, bd_addr);
                    status = TRUE;
                }
            }
        }
    }

    BTIF_TRACE_DEBUG("status=%d ", status);
    return status;
}
/*******************************************************************************
**
** Function      btif_hl_copy_bda
**
** Description  copy bt_bdaddr_t to BD_ADDR format
**
** Returns      void
**
*******************************************************************************/
void btif_hl_copy_bda(bt_bdaddr_t *bd_addr, BD_ADDR  bda){
    UINT8 i;
    for (i=0; i<6; i++)
    {
        bd_addr->address[i] = bda[i] ;
    }
}
/*******************************************************************************
**
** Function      btif_hl_copy_bda
**
** Description  display bt_bdaddr_t
**
** Returns      BOOLEAN
**
*******************************************************************************/
void btif_hl_display_bt_bda(bt_bdaddr_t *bd_addr){
    BTIF_TRACE_DEBUG("DB [%02x:%02x:%02x:%02x:%02x:%02x]",
                      bd_addr->address[0],   bd_addr->address[1], bd_addr->address[2],
                      bd_addr->address[3],  bd_addr->address[4],   bd_addr->address[5]);
}

/*******************************************************************************
**
** Function         btif_hl_dch_abort
**
** Description      Process DCH abort request
**
** Returns          Nothing
**
*******************************************************************************/
void  btif_hl_dch_abort(UINT8 app_idx, UINT8 mcl_idx){
    btif_hl_mcl_cb_t      *p_mcb;

    BTIF_TRACE_DEBUG("%s app_idx=%d mcl_idx=%d",__FUNCTION__, app_idx, mcl_idx );
    p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
    if (p_mcb->is_connected)
    {
        BTA_HlDchAbort(p_mcb->mcl_handle);
    }
    else
    {
        p_mcb->pcb.abort_pending = TRUE;
    }

}
/*******************************************************************************
**
** Function      btif_hl_cch_open
**
** Description   Process CCH open request
**
** Returns     Nothing
**
*******************************************************************************/
BOOLEAN btif_hl_cch_open(UINT8 app_id, BD_ADDR bd_addr, UINT16 ctrl_psm,
                         int mdep_cfg_idx,
                         btif_hl_pend_dch_op_t op, int *channel_id){

    btif_hl_app_cb_t            *p_acb;
    btif_hl_mcl_cb_t            *p_mcb;
    btif_hl_pending_chan_cb_t   *p_pcb;
    UINT8                       app_idx, mcl_idx, chan_idx;
    BOOLEAN                     status = TRUE;

    BTIF_TRACE_DEBUG("%s app_id=%d ctrl_psm=%d mdep_cfg_idx=%d op=%d",
                      __FUNCTION__, app_id, ctrl_psm, mdep_cfg_idx, op);
    BTIF_TRACE_DEBUG("DB [%02x:%02x:%02x:%02x:%02x:%02x]",
                      bd_addr[0],  bd_addr[1],bd_addr[2],  bd_addr[3], bd_addr[4],  bd_addr[5]);

    if (btif_hl_find_app_idx(app_id, &app_idx))
    {
        p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);

        if (!btif_hl_find_mcl_idx(app_idx, bd_addr, &mcl_idx))
        {
            if (btif_hl_find_avail_mcl_idx(app_idx, &mcl_idx))
            {
                p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
                memset(p_mcb,0, sizeof(btif_hl_mcl_cb_t));
                p_mcb->in_use = TRUE;
                bdcpy(p_mcb->bd_addr, bd_addr);

                if (!ctrl_psm)
                {
                    p_mcb->cch_oper = BTIF_HL_CCH_OP_MDEP_FILTERING;
                }
                else
                {
                    p_mcb->cch_oper        = BTIF_HL_CCH_OP_MATCHED_CTRL_PSM;
                    p_mcb->req_ctrl_psm    = ctrl_psm;
                }

                p_pcb = BTIF_HL_GET_PCB_PTR(app_idx, mcl_idx);
                p_pcb->in_use = TRUE;
                p_pcb->mdep_cfg_idx = mdep_cfg_idx;
                memcpy(p_pcb->bd_addr, bd_addr, sizeof(BD_ADDR));
                p_pcb->op = op;

                switch (op)
                {
                    case BTIF_HL_PEND_DCH_OP_OPEN:
                        *channel_id       =
                        p_pcb->channel_id =  (int) btif_hl_get_next_channel_id(app_id);
                        p_pcb->cb_state = BTIF_HL_CHAN_CB_STATE_CONNECTING_PENDING;
                        break;
                    case BTIF_HL_PEND_DCH_OP_DELETE_MDL:
                        p_pcb->channel_id =  p_acb->delete_mdl.channel_id;
                        p_pcb->cb_state = BTIF_HL_CHAN_CB_STATE_DESTROYED_PENDING;
                        break;
                    default:
                        break;
                }
                BTA_HlSdpQuery(app_id,p_acb->app_handle, bd_addr);
            }
            else
            {
                status = FALSE;
                BTIF_TRACE_ERROR("Open CCH request discarded- No mcl cb");
            }
        }
        else
        {
            status = FALSE;
            BTIF_TRACE_ERROR("Open CCH request discarded- already in USE");
        }
    }
    else
    {
        status = FALSE;
        BTIF_TRACE_ERROR("Invalid app_id=%d", app_id);
    }

    if (channel_id)
    {
        BTIF_TRACE_DEBUG("status=%d channel_id=0x%08x", status, *channel_id);
    }
    else
    {
        BTIF_TRACE_DEBUG("status=%d ", status);
    }
    return status;
}


/*******************************************************************************
**
** Function      btif_hl_find_mdl_idx_using_handle
**
** Description  Find the MDL index using channel id
**
** Returns      BOOLEAN
**
*******************************************************************************/
BOOLEAN btif_hl_find_mdl_cfg_idx_using_channel_id(int channel_id,
                                                  UINT8 *p_app_idx,
                                                  UINT8 *p_mdl_cfg_idx){
    btif_hl_app_cb_t      *p_acb;
    btif_hl_mdl_cfg_t     *p_mdl;
    BOOLEAN found=FALSE;
    UINT8 i,j;
    int mdl_cfg_channel_id;

    for (i=0; i < BTA_HL_NUM_APPS ; i ++)
    {
        p_acb =BTIF_HL_GET_APP_CB_PTR(i);
        for (j=0; j< BTA_HL_NUM_MDL_CFGS; j++)
        {
            p_mdl =BTIF_HL_GET_MDL_CFG_PTR(i,j);
            mdl_cfg_channel_id = *(BTIF_HL_GET_MDL_CFG_CHANNEL_ID_PTR(i,j));
            if (p_acb->in_use &&
                p_mdl->base.active &&
                (mdl_cfg_channel_id == channel_id))
            {
                found = TRUE;
                *p_app_idx = i;
                *p_mdl_cfg_idx =j;
                break;
            }
        }
    }

    BTIF_TRACE_EVENT("%s found=%d channel_id=0x%08x, app_idx=%d mdl_cfg_idx=%d  ",
                      __FUNCTION__,found,channel_id, i,j );
    return found;
}
/*******************************************************************************
**
** Function      btif_hl_find_mdl_idx_using_handle
**
** Description  Find the MDL index using channel id
**
** Returns      BOOLEAN
**
*******************************************************************************/
BOOLEAN btif_hl_find_mdl_idx_using_channel_id(int channel_id,
                                              UINT8 *p_app_idx,UINT8 *p_mcl_idx,
                                              UINT8 *p_mdl_idx){
    btif_hl_app_cb_t      *p_acb;
    btif_hl_mcl_cb_t      *p_mcb;
    btif_hl_mdl_cb_t      *p_dcb;
    BOOLEAN found=FALSE;
    UINT8 i,j,k;

    for (i=0; i < BTA_HL_NUM_APPS ; i ++)
    {
        p_acb =BTIF_HL_GET_APP_CB_PTR(i);
        for (j=0; j< BTA_HL_NUM_MCLS; j++)
        {
            p_mcb =BTIF_HL_GET_MCL_CB_PTR(i,j);
            for (k=0; k< BTA_HL_NUM_MDLS_PER_MCL; k++)
            {
                p_dcb =BTIF_HL_GET_MDL_CB_PTR(i,j,k);
                if (p_acb->in_use &&
                    p_mcb->in_use &&
                    p_dcb->in_use &&
                    (p_dcb->channel_id == channel_id))
                {
                    found = TRUE;
                    *p_app_idx = i;
                    *p_mcl_idx =j;
                    *p_mdl_idx = k;
                    break;
                }
            }
        }
    }
    BTIF_TRACE_DEBUG("%s found=%d app_idx=%d mcl_idx=%d mdl_idx=%d  ",
                      __FUNCTION__,found,i,j,k );
    return found;
}

/*******************************************************************************
**
** Function      btif_hl_find_channel_id_using_mdl_id
**
** Description  Find channel id using mdl_id'
**
** Returns      BOOLEAN
*********************************************************************************/
BOOLEAN btif_hl_find_channel_id_using_mdl_id(UINT8 app_idx, tBTA_HL_MDL_ID mdl_id,
                                            int *p_channel_id){
    btif_hl_app_cb_t      *p_acb;
    btif_hl_mdl_cfg_t     *p_mdl;
    BOOLEAN found=FALSE;
    UINT8 j=0;
    int mdl_cfg_channel_id;
    p_acb =BTIF_HL_GET_APP_CB_PTR(app_idx);
    if (p_acb && p_acb->in_use)
        {
            for (j=0; j< BTA_HL_NUM_MDL_CFGS; j++)
                {
                    p_mdl =BTIF_HL_GET_MDL_CFG_PTR(app_idx,j);
                    mdl_cfg_channel_id = *(BTIF_HL_GET_MDL_CFG_CHANNEL_ID_PTR(app_idx,j));
                    if ( p_mdl->base.active && (p_mdl->base.mdl_id == mdl_id))
                    {
                            found = TRUE;
                            *p_channel_id = mdl_cfg_channel_id;
                            break;
                    }
                }
        }
    BTIF_TRACE_EVENT("%s found=%d channel_id=0x%08x, mdl_id=0x%x app_idx=%d mdl_cfg_idx=%d  ",
                    __FUNCTION__,found,*p_channel_id,mdl_id, app_idx,j );
    return found;
}


/*******************************************************************************
**
** Function      btif_hl_find_mdl_idx_using_handle
**
** Description  Find the MDL index using handle
**
** Returns      BOOLEAN
**
*******************************************************************************/
BOOLEAN btif_hl_find_mdl_idx_using_handle(tBTA_HL_MDL_HANDLE mdl_handle,
                                          UINT8 *p_app_idx,UINT8 *p_mcl_idx,
                                          UINT8 *p_mdl_idx){
    btif_hl_app_cb_t      *p_acb;
    btif_hl_mcl_cb_t      *p_mcb;
    btif_hl_mdl_cb_t      *p_dcb;
    BOOLEAN found=FALSE;
    UINT8 i,j,k;

    for (i=0; i < BTA_HL_NUM_APPS ; i ++)
    {
        p_acb =BTIF_HL_GET_APP_CB_PTR(i);
        for (j=0; j< BTA_HL_NUM_MCLS; j++)
        {
            p_mcb =BTIF_HL_GET_MCL_CB_PTR(i,j);
            for (k=0; k< BTA_HL_NUM_MDLS_PER_MCL; k++)
            {
                p_dcb =BTIF_HL_GET_MDL_CB_PTR(i,j,k);
                if (p_acb->in_use &&
                    p_mcb->in_use &&
                    p_dcb->in_use &&
                    (p_dcb->mdl_handle == mdl_handle))
                {
                    found = TRUE;
                    *p_app_idx = i;
                    *p_mcl_idx =j;
                    *p_mdl_idx = k;
                    break;
                }
            }
        }
    }


    BTIF_TRACE_EVENT("%s found=%d app_idx=%d mcl_idx=%d mdl_idx=%d  ",
                      __FUNCTION__,found,i,j,k );
    return found;
}
/*******************************************************************************
**
** Function        btif_hl_find_peer_mdep_id
**
** Description      Find the peer MDEP ID from the received SPD records
**
** Returns          BOOLEAN
**
*******************************************************************************/
static BOOLEAN btif_hl_find_peer_mdep_id(UINT8 app_id, BD_ADDR bd_addr,
                                         tBTA_HL_MDEP_ROLE local_mdep_role,
                                         UINT16 data_type,
                                         tBTA_HL_MDEP_ID *p_peer_mdep_id){
    UINT8               app_idx, mcl_idx;
    btif_hl_app_cb_t     *p_acb;
    btif_hl_mcl_cb_t     *p_mcb;
    tBTA_HL_SDP_REC     *p_rec;
    UINT8               i, num_mdeps;
    BOOLEAN             found = FALSE;
    tBTA_HL_MDEP_ROLE   peer_mdep_role;


    BTIF_TRACE_DEBUG("%s app_id=%d local_mdep_role=%d, data_type=%d",
                      __FUNCTION__, app_id, local_mdep_role, data_type);

    BTIF_TRACE_DEBUG("DB [%02x:%02x:%02x:%02x:%02x:%02x]",
                      bd_addr[0],  bd_addr[1],
                      bd_addr[2],  bd_addr[3],
                      bd_addr[4],  bd_addr[5]);


    BTIF_TRACE_DEBUG("local_mdep_role=%d", local_mdep_role);
    BTIF_TRACE_DEBUG("data_type=%d", data_type);

    if (local_mdep_role == BTA_HL_MDEP_ROLE_SINK)
        peer_mdep_role = BTA_HL_MDEP_ROLE_SOURCE;
    else
        peer_mdep_role = BTA_HL_MDEP_ROLE_SINK;

    if (btif_hl_find_app_idx(app_id, &app_idx) )
    {
        p_acb  = BTIF_HL_GET_APP_CB_PTR(app_idx);
        if (btif_hl_find_mcl_idx(app_idx, bd_addr, &mcl_idx))
        {
            p_mcb  =BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);

            BTIF_TRACE_DEBUG("app_idx=%d mcl_idx=%d",app_idx, mcl_idx);
            BTIF_TRACE_DEBUG("valid_spd_idx=%d sdp_idx=%d",p_mcb->valid_sdp_idx, p_mcb->sdp_idx);
            if (p_mcb->valid_sdp_idx)
            {
                p_rec = &p_mcb->sdp.sdp_rec[p_mcb->sdp_idx];
                num_mdeps = p_rec->num_mdeps;
                BTIF_TRACE_DEBUG("num_mdeps=%d", num_mdeps);

                for (i=0; i< num_mdeps; i++)
                {
                    BTIF_TRACE_DEBUG("p_rec->mdep_cfg[%d].mdep_role=%d",i, p_rec->mdep_cfg[i].mdep_role);
                    BTIF_TRACE_DEBUG("p_rec->mdep_cfg[%d].data_type =%d",i, p_rec->mdep_cfg[i].data_type );
                    if ((p_rec->mdep_cfg[i].mdep_role == peer_mdep_role) &&
                        (p_rec->mdep_cfg[i].data_type == data_type))
                    {
                        found = TRUE;
                        *p_peer_mdep_id = p_rec->mdep_cfg[i].mdep_id;
                        break;
                    }
                }
            }
        }
    }

    BTIF_TRACE_DEBUG("found =%d  *p_peer_mdep_id=%d", found,  *p_peer_mdep_id);

    return found;
}

/*******************************************************************************
**
** Function      btif_hl_find_mdep_cfg_idx
**
** Description  Find the MDEP configuration index using local MDEP_ID
**
** Returns      BOOLEAN
**
*******************************************************************************/
static  BOOLEAN btif_hl_find_mdep_cfg_idx(UINT8 app_idx,  tBTA_HL_MDEP_ID local_mdep_id,
                                          UINT8 *p_mdep_cfg_idx){
    btif_hl_app_cb_t      *p_acb =BTIF_HL_GET_APP_CB_PTR(app_idx);
    tBTA_HL_SUP_FEATURE     *p_sup_feature= &p_acb->sup_feature;
    BOOLEAN found =FALSE;
    UINT8 i;

    for (i=0; i< p_sup_feature->num_of_mdeps; i++)
    {
        BTIF_TRACE_DEBUG("btif_hl_find_mdep_cfg_idx: mdep_id=%d app_idx = %d",
                    p_sup_feature->mdep[i].mdep_id,app_idx);
        if ( p_sup_feature->mdep[i].mdep_id == local_mdep_id)
        {
            found = TRUE;
            *p_mdep_cfg_idx = i;
            break;
        }
    }

    BTIF_TRACE_DEBUG("%s found=%d mdep_idx=%d local_mdep_id=%d app_idx=%d ",
                      __FUNCTION__, found,i, local_mdep_id,app_idx);
    return found;
}



/*******************************************************************************
**
** Function      btif_hl_find_mcl_idx
**
** Description  Find the MCL index using BD address
**
** Returns      BOOLEAN
**
*******************************************************************************/
BOOLEAN btif_hl_find_mcl_idx(UINT8 app_idx, BD_ADDR p_bd_addr, UINT8 *p_mcl_idx){
    BOOLEAN found=FALSE;
    UINT8 i;
    btif_hl_app_cb_t  *p_acb =BTIF_HL_GET_APP_CB_PTR(app_idx);
    btif_hl_mcl_cb_t  *p_mcb;

    for (i=0; i < BTA_HL_NUM_MCLS ; i ++)
    {
        p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, i);
        if (p_mcb->in_use &&
            (!memcmp (p_mcb->bd_addr, p_bd_addr, BD_ADDR_LEN)))
        {
            found = TRUE;
            *p_mcl_idx = i;
            break;
        }
    }


    BTIF_TRACE_DEBUG("%s found=%d idx=%d",__FUNCTION__, found, i);
    return found;
}
/*******************************************************************************
**
** Function         btif_hl_init
**
** Description      HL initialization function.
**
** Returns          void
**
*******************************************************************************/
static void btif_hl_init(void){
    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
    memset(p_btif_hl_cb, 0, sizeof(btif_hl_cb_t));
    btif_hl_init_next_app_id();
    btif_hl_init_next_channel_id();
}
/*******************************************************************************
**
** Function         btif_hl_disable
**
** Description      Disable initialization function.
**
** Returns          void
**
*******************************************************************************/
static void btif_hl_disable(void){
    BTIF_TRACE_DEBUG("%s", __FUNCTION__);

    if ((p_btif_hl_cb->state != BTIF_HL_STATE_DISABLING) &&
        (p_btif_hl_cb->state != BTIF_HL_STATE_DISABLED))
    {
        btif_hl_set_state(BTIF_HL_STATE_DISABLING);
        BTA_HlDisable();
    }
}
/*******************************************************************************
**
** Function      btif_hl_is_no_active_app
**
** Description  Find whether or not  any APP is still in use
**
** Returns      BOOLEAN
**
*******************************************************************************/
static BOOLEAN btif_hl_is_no_active_app(void){
    BOOLEAN no_active_app = TRUE;
    UINT8 i;

    for (i=0; i < BTA_HL_NUM_APPS ; i ++)
    {
        if (btif_hl_cb.acb[i].in_use)
        {
            no_active_app = FALSE;
            break;
        }
    }

    BTIF_TRACE_DEBUG("%s no_active_app=%d  ", __FUNCTION__, no_active_app );
    return no_active_app;
}

/*******************************************************************************
**
** Function      btif_hl_free_app_idx
**
** Description free an application control block
**
** Returns      void
**
*******************************************************************************/
static void btif_hl_free_app_idx(UINT8 app_idx){

    if ((app_idx < BTA_HL_NUM_APPS) && btif_hl_cb.acb[app_idx].in_use )
    {
        btif_hl_cb.acb[app_idx].in_use = FALSE;
        memset (&btif_hl_cb.acb[app_idx], 0, sizeof(btif_hl_app_cb_t));
    }
}
/*******************************************************************************
**
** Function      btif_hl_set_state
**
** Description set HL state
**
** Returns      void
**
*******************************************************************************/
static void btif_hl_set_state(btif_hl_state_t state){
    BTIF_TRACE_DEBUG("btif_hl_set_state:  %d ---> %d ", p_btif_hl_cb->state, state);
    p_btif_hl_cb->state = state;
}

/*******************************************************************************
**
** Function      btif_hl_set_state
**
** Description get HL state
**
** Returns      btif_hl_state_t
**
*******************************************************************************/

static btif_hl_state_t btif_hl_get_state(void){
    BTIF_TRACE_DEBUG("btif_hl_get_state:  %d   ", p_btif_hl_cb->state);
    return p_btif_hl_cb->state;
}

/*******************************************************************************
**
** Function      btif_hl_find_data_type_idx
**
** Description  Find the index in the data type table
**
** Returns      BOOLEAN
**
*******************************************************************************/
static BOOLEAN  btif_hl_find_data_type_idx(UINT16 data_type, UINT8 *p_idx){
    BOOLEAN found = FALSE;
    UINT8 i;

    for (i=0; i< BTIF_HL_DATA_TABLE_SIZE; i++ )
    {
        if (data_type_table[i].data_type == data_type)
        {
            found = TRUE;
            *p_idx= i;
            break;
        }
    }

    BTIF_TRACE_DEBUG("%s found=%d, data_type=0x%x idx=%d", __FUNCTION__, found, data_type, i);
    return found;
}

/*******************************************************************************
**
** Function      btif_hl_get_max_tx_apdu_size
**
** Description  Find the maximum TX APDU size for the specified data type and
**              MDEP role
**
** Returns      UINT16
**
*******************************************************************************/
UINT16  btif_hl_get_max_tx_apdu_size(tBTA_HL_MDEP_ROLE mdep_role,
                                     UINT16 data_type ){
    UINT8 idx;
    UINT16 max_tx_apdu_size =0;

    if (btif_hl_find_data_type_idx(data_type, &idx))
    {
        if (mdep_role == BTA_HL_MDEP_ROLE_SOURCE)
        {
            max_tx_apdu_size = data_type_table[idx].max_tx_apdu_size;
        }
        else
        {
            max_tx_apdu_size = data_type_table[idx].max_rx_apdu_size;
        }
    }
    else
    {
        if (mdep_role == BTA_HL_MDEP_ROLE_SOURCE)
        {
            max_tx_apdu_size = BTIF_HL_DEFAULT_SRC_TX_APDU_SIZE;
        }
        else
        {
            max_tx_apdu_size = BTIF_HL_DEFAULT_SRC_RX_APDU_SIZE;
        }


    }

    BTIF_TRACE_DEBUG("%s mdep_role=%d data_type=0x%4x size=%d",
                      __FUNCTION__, mdep_role, data_type, max_tx_apdu_size);
    return max_tx_apdu_size;
}


/*******************************************************************************
**
** Function      btif_hl_get_max_rx_apdu_size
**
** Description  Find the maximum RX APDU size for the specified data type and
**              MDEP role
**
** Returns      UINT16
**
*******************************************************************************/
UINT16  btif_hl_get_max_rx_apdu_size(tBTA_HL_MDEP_ROLE mdep_role,
                                     UINT16 data_type ){
    UINT8  idx;
    UINT16 max_rx_apdu_size =0;

    if (btif_hl_find_data_type_idx(data_type, &idx))
    {
        if (mdep_role == BTA_HL_MDEP_ROLE_SOURCE)
        {
            max_rx_apdu_size = data_type_table[idx].max_rx_apdu_size;
        }
        else
        {
            max_rx_apdu_size = data_type_table[idx].max_tx_apdu_size;
        }
    }
    else
    {
        if (mdep_role == BTA_HL_MDEP_ROLE_SOURCE)
        {
            max_rx_apdu_size = BTIF_HL_DEFAULT_SRC_RX_APDU_SIZE;
        }
        else
        {
            max_rx_apdu_size = BTIF_HL_DEFAULT_SRC_TX_APDU_SIZE;
        }
    }


    BTIF_TRACE_DEBUG("%s mdep_role=%d data_type=0x%4x size=%d",
                      __FUNCTION__, mdep_role, data_type, max_rx_apdu_size);

    return max_rx_apdu_size;
}

/*******************************************************************************
**
** Function      btif_hl_if_channel_setup_pending
**
** Description
**
** Returns      BOOLEAN
**
*******************************************************************************/

static BOOLEAN btif_hl_get_bta_mdep_role(bthl_mdep_role_t mdep, tBTA_HL_MDEP_ROLE *p){
    BOOLEAN status = TRUE;
    switch (mdep)
    {
        case BTHL_MDEP_ROLE_SOURCE:
            *p = BTA_HL_MDEP_ROLE_SOURCE;
            break;
        case BTHL_MDEP_ROLE_SINK:
            *p = BTA_HL_MDEP_ROLE_SINK;
            break;
        default:
            status = FALSE;
            break;
    }

    BTIF_TRACE_DEBUG("%s status=%d bta_mdep_role=%d (%d:btif)",
                      __FUNCTION__, status, *p, mdep);
    return status;
}
/*******************************************************************************
**
** Function btif_hl_get_bta_channel_type
**
** Description convert bthl channel type to BTA DCH channel type
**
** Returns BOOLEAN
**
*******************************************************************************/

static BOOLEAN btif_hl_get_bta_channel_type(bthl_channel_type_t channel_type, tBTA_HL_DCH_CFG *p){
    BOOLEAN status = TRUE;
    switch (channel_type)
    {
        case BTHL_CHANNEL_TYPE_RELIABLE:
            *p = BTA_HL_DCH_CFG_RELIABLE;
            break;
        case BTHL_CHANNEL_TYPE_STREAMING:
            *p = BTA_HL_DCH_CFG_STREAMING;
            break;
        case BTHL_CHANNEL_TYPE_ANY:
            *p = BTA_HL_DCH_CFG_NO_PREF;
            break;
        default:
            status = FALSE;
            break;
    }
    BTIF_TRACE_DEBUG("%s status = %d BTA DCH CFG=%d (1-rel 2-strm",
                      __FUNCTION__, status, *p);
    return status;
}
/*******************************************************************************
**
** Function btif_hl_get_next_app_id
**
** Description get next applcation id
**
** Returns UINT8
**
*******************************************************************************/

static UINT8 btif_hl_get_next_app_id(){
    UINT8 next_app_id = btif_hl_cb.next_app_id;

    btif_hl_cb.next_app_id++;
    return next_app_id;
}
/*******************************************************************************
**
** Function btif_hl_get_next_channel_id
**
** Description get next channel id
**
** Returns int
**
*******************************************************************************/
static int btif_hl_get_next_channel_id(UINT8 app_id){
    UINT16 next_channel_id = btif_hl_cb.next_channel_id;
    int channel_id;
    btif_hl_cb.next_channel_id++;
    channel_id = (app_id << 16) + next_channel_id;
    BTIF_TRACE_DEBUG("%s channel_id=0x%08x, app_id=0x%02x next_channel_id=0x%04x", __FUNCTION__,
                      channel_id, app_id,  next_channel_id);
    return channel_id;
}
/*******************************************************************************
**
** Function btif_hl_get_app_id
**
** Description get the applicaiton id associated with the channel id
**
** Returns UINT8
**
*******************************************************************************/

static UINT8 btif_hl_get_app_id(int channel_id){
    UINT8 app_id =(UINT8) (channel_id >> 16);
    BTIF_TRACE_DEBUG("%s channel_id=0x%08x, app_id=0x%02x ", __FUNCTION__,channel_id, app_id);
    return app_id;
}
/*******************************************************************************
**
** Function btif_hl_init_next_app_id
**
** Description initialize the application id
**
** Returns void
**
*******************************************************************************/
static void btif_hl_init_next_app_id(void){
    btif_hl_cb.next_app_id = 1;
}
/*******************************************************************************
**
** Function btif_hl_init_next_channel_id
**
** Description initialize the channel id
**
** Returns void
**
*******************************************************************************/
static void btif_hl_init_next_channel_id(void){
    btif_hl_cb.next_channel_id = 1;
}


/*******************************************************************************
**
** Function      btif_hl_find_app_idx_using_handle
**
** Description  Find the applicaiton index using handle
**
** Returns      BOOLEAN
**
*******************************************************************************/
BOOLEAN btif_hl_find_app_idx_using_handle(tBTA_HL_APP_HANDLE app_handle,
                                          UINT8 *p_app_idx){
    BOOLEAN found=FALSE;
    UINT8 i;

    for (i=0; i < BTA_HL_NUM_APPS ; i ++)
    {
        if (btif_hl_cb.acb[i].in_use &&
            (btif_hl_cb.acb[i].app_handle == app_handle))
        {
            found = TRUE;
            *p_app_idx = i;
            break;
        }
    }

    BTIF_TRACE_EVENT("%s status=%d handle=%d app_idx=%d ",
                      __FUNCTION__, found, app_handle , i);

    return found;
}

/*******************************************************************************
**
** Function      btif_hl_find_app_idx_using_app_id
**
** Description  Find the applicaiton index using app_id
**
** Returns      BOOLEAN
**
*******************************************************************************/
BOOLEAN btif_hl_find_app_idx_using_app_id(UINT8 app_id,
                                          UINT8 *p_app_idx){
    BOOLEAN found=FALSE;
    UINT8 i;

    for (i=0; i < BTA_HL_NUM_APPS ; i ++)
    {
        if (btif_hl_cb.acb[i].in_use &&
            (btif_hl_cb.acb[i].app_id == app_id))
        {
            found = TRUE;
            *p_app_idx = i;
            break;
        }
    }

    BTIF_TRACE_EVENT("%s found=%d app_id=%d app_idx=%d ",
                      __FUNCTION__, found, app_id , i);

    return found;
}

/*******************************************************************************
**
** Function      btif_hl_find_mcl_idx_using_handle
**
** Description  Find the MCL index using handle
**
** Returns      BOOLEAN
**
*******************************************************************************/
BOOLEAN btif_hl_find_mcl_idx_using_handle( tBTA_HL_MCL_HANDLE mcl_handle,
                                           UINT8 *p_app_idx, UINT8 *p_mcl_idx){
    btif_hl_app_cb_t  *p_acb;
    BOOLEAN         found=FALSE;
    UINT8 i,j;

    for (i=0; i<BTA_HL_NUM_APPS; i++)
    {
        p_acb =BTIF_HL_GET_APP_CB_PTR(i);
        for (j=0; j < BTA_HL_NUM_MCLS ; j++)
        {
            if (p_acb->mcb[j].in_use)
                BTIF_TRACE_DEBUG("btif_hl_find_mcl_idx_using_handle:app_idx=%d,"
                "mcl_idx =%d mcl_handle=%d",i,j,p_acb->mcb[j].mcl_handle);
            if (p_acb->mcb[j].in_use &&
                (p_acb->mcb[j].mcl_handle == mcl_handle))
            {
                found = TRUE;
                *p_app_idx = i;
                *p_mcl_idx = j;
                break;
            }
        }
    }
    BTIF_TRACE_DEBUG("%s found=%d app_idx=%d mcl_idx=%d",__FUNCTION__,
                      found, i, j);
    return found;
}

/*******************************************************************************
**
** Function      btif_hl_find_mdl_idx_using_mdl_id
**
** Description  Find the mdl index using mdl_id
**
** Returns      BOOLEAN
**
*******************************************************************************/
BOOLEAN btif_hl_find_mcl_idx_using_mdl_id( UINT8 mdl_id,UINT8 mcl_handle,
                                           UINT8 *p_app_idx, UINT8 *p_mcl_idx){
    btif_hl_app_cb_t  *p_acb;
    btif_hl_mcl_cb_t  *p_mcb;
    BOOLEAN         found=FALSE;
    UINT8 i,j,x;

    for (i=0; i<BTA_HL_NUM_APPS; i++)
    {
        p_acb =BTIF_HL_GET_APP_CB_PTR(i);
        for (j=0; j < BTA_HL_NUM_MCLS ; j++)
        {
            if (p_acb->mcb[j].in_use &&
                (p_acb->mcb[j].mcl_handle == mcl_handle))
            {
                    p_mcb = &p_acb->mcb[j];
                    BTIF_TRACE_DEBUG("btif_hl_find_mcl_idx_using_mdl_id: mcl handle found j =%d",j);
                    for (x=0; x < BTA_HL_NUM_MDLS_PER_MCL ; x ++)
                    {
                        if (p_mcb->mdl[x].in_use && p_mcb->mdl[x].mdl_id == mdl_id)
                        {
                            BTIF_TRACE_DEBUG("btif_hl_find_mcl_idx_using_mdl_id:found x =%d",x);
                            found = TRUE;
                            *p_app_idx = i;
                            *p_mcl_idx = j;
                            break;
                        }
                    }
            }
        }
    }
    BTIF_TRACE_DEBUG("%s found=%d app_idx=%d mcl_idx=%d",__FUNCTION__,
                      found, i, j);
    return found;
}

/*******************************************************************************
**
** Function      btif_hl_find_mcl_idx_using_deleted_mdl_id
**
** Description  Find the app index deleted_mdl_id
**
** Returns      BOOLEAN
**
*******************************************************************************/
BOOLEAN btif_hl_find_app_idx_using_deleted_mdl_id( UINT8 mdl_id,
                                           UINT8 *p_app_idx){
    btif_hl_app_cb_t  *p_acb;
    BOOLEAN         found=FALSE;
    UINT8 i;

    for (i=0; i<BTA_HL_NUM_APPS; i++)
    {
        p_acb =BTIF_HL_GET_APP_CB_PTR(i);
        if (p_acb->delete_mdl.active) {
            BTIF_TRACE_DEBUG("btif_hl_find_app_idx_using_deleted_mdl_id: app_idx=%d,"
                              "mdl_id=%d mcl_handle=%d",i,mdl_id,p_acb->mcb[i].mcl_handle);
        }
        if (p_acb->delete_mdl.active &&
            (p_acb->delete_mdl.mdl_id == mdl_id))
        {
            found = TRUE;
            *p_app_idx = i;
            break;
        }
    }
    BTIF_TRACE_DEBUG("%s found=%d app_idx=%d",__FUNCTION__,
                      found, i);
    return found;
}

/*******************************************************************************
**
** Function      btif_hl_stop_timer_using_handle
**
** Description  clean control channel cb using handle
**
** Returns      void
**
*******************************************************************************/
static void btif_hl_stop_timer_using_handle( tBTA_HL_MCL_HANDLE mcl_handle){
    btif_hl_app_cb_t  *p_acb;
    BOOLEAN         found=FALSE;
    UINT8 i,j;

    for (i=0; i<BTA_HL_NUM_APPS; i++)
    {
        p_acb =BTIF_HL_GET_APP_CB_PTR(i);
        for (j=0; j < BTA_HL_NUM_MCLS ; j++)
        {
            if (p_acb->mcb[j].in_use &&
                (p_acb->mcb[j].mcl_handle == mcl_handle))
            {
                btif_hl_stop_cch_timer(i, j);
            }
        }
    }
}

/*******************************************************************************
**
** Function      btif_hl_find_mcl_idx_using_app_idx
**
** Description  Find the MCL index using handle
**
** Returns      BOOLEAN
**
*******************************************************************************/
BOOLEAN btif_hl_find_mcl_idx_using_app_idx( tBTA_HL_MCL_HANDLE mcl_handle,
                                           UINT8 p_app_idx, UINT8 *p_mcl_idx){
    btif_hl_app_cb_t  *p_acb;
    BOOLEAN         found=FALSE;
    UINT8 i,j;

    p_acb =BTIF_HL_GET_APP_CB_PTR(p_app_idx);
    for (j=0; j < BTA_HL_NUM_MCLS ; j++)
    {
        if (p_acb->mcb[j].in_use &&
            (p_acb->mcb[j].mcl_handle == mcl_handle))
        {
            found = TRUE;
            *p_mcl_idx = j;
            break;
        }
    }
    BTIF_TRACE_DEBUG("%s found=%dmcl_idx=%d",__FUNCTION__,
                      found, j);
    return found;
}

/*******************************************************************************
**
** Function      btif_hl_clean_mdls_using_app_idx
**
** Description  clean dch cpntrol bloack using app_idx
**
** Returns      void
**
*******************************************************************************/
void btif_hl_clean_mdls_using_app_idx( UINT8 app_idx){
    btif_hl_app_cb_t  *p_acb;
    btif_hl_mcl_cb_t  *p_mcb;
    btif_hl_mdl_cb_t  *p_dcb;
    UINT8 i,j,x,y;
    bt_bdaddr_t     bd_addr;

        p_acb =BTIF_HL_GET_APP_CB_PTR(app_idx);
        for (j=0; j < BTA_HL_NUM_MCLS ; j++)
        {
            if (p_acb->mcb[j].in_use)
            {
                    p_mcb = &p_acb->mcb[j];
                    BTIF_TRACE_DEBUG("btif_hl_find_mcl_idx_using_mdl_id: mcl handle found j =%d",j);
                    for (x=0; x < BTA_HL_NUM_MDLS_PER_MCL ; x ++)
                    {
                        if (p_mcb->mdl[x].in_use)
                        {
                            p_dcb = BTIF_HL_GET_MDL_CB_PTR(app_idx, j,x);
                            btif_hl_release_socket(app_idx,j,x);
                            for (y=0; y<6; y++)
                            {
                                bd_addr.address[y] = p_mcb->bd_addr[y];
                            }
                            BTIF_HL_CALL_CBACK(bt_hl_callbacks, channel_state_cb,  p_acb->app_id,
                                               &bd_addr, p_dcb->local_mdep_cfg_idx,
                                               p_dcb->channel_id, BTHL_CONN_STATE_DISCONNECTED, 0 );
                            btif_hl_clean_mdl_cb(p_dcb);
                            if (!btif_hl_num_dchs_in_use(p_mcb->mcl_handle))
                                    BTA_HlCchClose(p_mcb->mcl_handle);
                            BTIF_TRACE_DEBUG("remote DCH close success mdl_idx=%d", x);
                        }
                    }
            }
        }
}

/*******************************************************************************
**
** Function      btif_hl_find_app_idx
**
** Description  Find the application index using application ID
**
** Returns      BOOLEAN
**
*******************************************************************************/
BOOLEAN btif_hl_find_app_idx(UINT8 app_id, UINT8 *p_app_idx){
    BOOLEAN found=FALSE;
    UINT8 i;

    for (i=0; i < BTA_HL_NUM_APPS ; i ++)
    {

        if (btif_hl_cb.acb[i].in_use &&
            (btif_hl_cb.acb[i].app_id == app_id))
        {
            found = TRUE;
            *p_app_idx = i;
            break;
        }
    }
    BTIF_TRACE_DEBUG("%s found=%d app_idx=%d", __FUNCTION__, found, i );

    return found;
}

/*******************************************************************************
**
** Function      btif_hl_find_app_idx
**
** Description  Find the application index using application ID
**
** Returns      BOOLEAN
**
*******************************************************************************/
BOOLEAN btif_hl_find_app_idx_using_mdepId(UINT8 mdep_id, UINT8 *p_app_idx){
    BOOLEAN found=FALSE;
    UINT8 i;

    for (i=0; i < BTA_HL_NUM_APPS ; i ++)
    {
        BTIF_TRACE_DEBUG("btif_hl_find_app_idx_using_mdepId: MDEP-ID = %d",
                btif_hl_cb.acb[i].sup_feature.mdep[0].mdep_id);
        if (btif_hl_cb.acb[i].in_use &&
            (btif_hl_cb.acb[i].sup_feature.mdep[0].mdep_id == mdep_id))
        {
            found = TRUE;
            *p_app_idx = i;
            break;
        }
    }
    BTIF_TRACE_DEBUG("%s found=%d app_idx=%d", __FUNCTION__, found, i );

    return found;
}

/*******************************************************************************
**
** Function      btif_hl_find_avail_mdl_idx
**
** Description  Find a not in-use MDL index
**
** Returns      BOOLEAN
**
*******************************************************************************/
BOOLEAN btif_hl_find_avail_mdl_idx(UINT8 app_idx, UINT8 mcl_idx,
                                   UINT8 *p_mdl_idx){
    btif_hl_mcl_cb_t      *p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
    BOOLEAN found=FALSE;
    UINT8 i;

    for (i=0; i < BTA_HL_NUM_MDLS_PER_MCL ; i ++)
    {
        if (!p_mcb->mdl[i].in_use)
        {
            btif_hl_clean_mdl_cb(&p_mcb->mdl[i]);
            found = TRUE;
            *p_mdl_idx = i;
            break;
        }
    }

    BTIF_TRACE_DEBUG("%s found=%d idx=%d",__FUNCTION__, found, i);
    return found;
}

/*******************************************************************************
**
** Function      btif_hl_find_avail_mcl_idx
**
** Description  Find a not in-use MDL index
**
** Returns      BOOLEAN
**
*******************************************************************************/
BOOLEAN btif_hl_find_avail_mcl_idx(UINT8 app_idx, UINT8 *p_mcl_idx){
    BOOLEAN found=FALSE;
    UINT8 i;

    for (i=0; i < BTA_HL_NUM_MCLS ; i ++)
    {
        if (!btif_hl_cb.acb[app_idx].mcb[i].in_use)
        {
            found = TRUE;
            *p_mcl_idx = i;
            break;
        }
    }
    BTIF_TRACE_DEBUG("%s found=%d mcl_idx=%d", __FUNCTION__, found, i);
    return found;
}

/*******************************************************************************
**
** Function      btif_hl_find_avail_app_idx
**
** Description  Find a not in-use APP index
**
** Returns      BOOLEAN
**
*******************************************************************************/
static BOOLEAN btif_hl_find_avail_app_idx(UINT8 *p_idx){
    BOOLEAN found = FALSE;
    UINT8 i;

    for (i=0; i < BTA_HL_NUM_APPS ; i ++)
    {
        if (!btif_hl_cb.acb[i].in_use)
        {
            found = TRUE;
            *p_idx = i;
            break;
        }
    }

    BTIF_TRACE_DEBUG("%s found=%d app_idx=%d", __FUNCTION__, found, i);
    return found;
}


/*******************************************************************************
**
** Function         btif_hl_proc_dereg_cfm
**
** Description      Process the de-registration confirmation
**
** Returns          Nothing
**
*******************************************************************************/
static void btif_hl_proc_dereg_cfm(tBTA_HL *p_data)

{
    btif_hl_app_cb_t        *p_acb;
    UINT8                   app_idx;
    int                     app_id = 0;
    bthl_app_reg_state_t    state = BTHL_APP_REG_STATE_DEREG_SUCCESS;
    bt_status_t             status            = BT_STATUS_SUCCESS;

    BTIF_TRACE_DEBUG("%s de-reg status=%d app_handle=%d", __FUNCTION__,
                p_data->dereg_cfm.status, p_data->dereg_cfm.app_handle);

    if (btif_hl_find_app_idx_using_app_id(p_data->dereg_cfm.app_id, &app_idx))
    {
        p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
        app_id = (int) p_acb->app_id;
        if (p_data->dereg_cfm.status == BTA_HL_STATUS_OK)
        {
            btif_hl_clean_mdls_using_app_idx(app_idx);
            memset(p_acb, 0,sizeof(btif_hl_app_cb_t));
        }
        else
            state = BTHL_APP_REG_STATE_DEREG_FAILED;

        BTIF_TRACE_DEBUG("call reg state callback app_id=%d state=%d", app_id, state);
        BTIF_HL_CALL_CBACK(bt_hl_callbacks, app_reg_state_cb, app_id, state );

        if (btif_hl_is_no_active_app())
        {
            btif_hl_disable();
        }
    }
}

/*******************************************************************************
**
** Function         btif_hl_proc_reg_cfm
**
** Description      Process the registration confirmation
**
** Returns          Nothing
**
*******************************************************************************/
static void btif_hl_proc_reg_cfm(tBTA_HL *p_data){
    btif_hl_app_cb_t       *p_acb;
    UINT8                  app_idx;
    bthl_app_reg_state_t   state = BTHL_APP_REG_STATE_REG_SUCCESS;
    bt_status_t            bt_status;

    BTIF_TRACE_DEBUG("%s reg status=%d app_handle=%d", __FUNCTION__, p_data->reg_cfm.status, p_data->reg_cfm.app_handle);

    if (btif_hl_find_app_idx(p_data->reg_cfm.app_id, &app_idx))
    {
        p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
        if (p_data->reg_cfm.status == BTA_HL_STATUS_OK)
        {
            p_acb->app_handle = p_data->reg_cfm.app_handle;
        }
        else
        {
            btif_hl_free_app_idx(app_idx);
            reg_counter--;
            state = BTHL_APP_REG_STATE_REG_FAILED;
        }

        BTIF_TRACE_DEBUG("%s call reg state callback app_id=%d reg state=%d", __FUNCTION__,  p_data->reg_cfm.app_id, state);
        BTIF_HL_CALL_CBACK(bt_hl_callbacks, app_reg_state_cb, ((int) p_data->reg_cfm.app_id), state );
    }
}

/*******************************************************************************
**
** Function btif_hl_set_chan_cb_state
**
** Description set the channel callback state
**
** Returns void
**
*******************************************************************************/
void btif_hl_set_chan_cb_state(UINT8 app_idx, UINT8 mcl_idx, btif_hl_chan_cb_state_t state){
    btif_hl_pending_chan_cb_t   *p_pcb = BTIF_HL_GET_PCB_PTR(app_idx, mcl_idx);
    btif_hl_chan_cb_state_t cur_state = p_pcb->cb_state;

    if (cur_state != state)
    {
        p_pcb->cb_state = state;
        BTIF_TRACE_DEBUG("%s state %d--->%d",__FUNCTION__, cur_state, state);
    }


}
/*******************************************************************************
**
** Function btif_hl_send_destroyed_cb
**
** Description send the channel destroyed callback
**
** Returns void
**
*******************************************************************************/
void btif_hl_send_destroyed_cb(btif_hl_app_cb_t        *p_acb ){
    bt_bdaddr_t     bd_addr;
    int             app_id = (int) btif_hl_get_app_id(p_acb->delete_mdl.channel_id);

    btif_hl_copy_bda(&bd_addr, p_acb->delete_mdl.bd_addr);
    BTIF_TRACE_DEBUG("%s",__FUNCTION__);
    BTIF_TRACE_DEBUG("call channel state callback channel_id=0x%08x mdep_cfg_idx=%d, state=%d fd=%d",p_acb->delete_mdl.channel_id,
                      p_acb->delete_mdl.mdep_cfg_idx, BTHL_CONN_STATE_DESTROYED, 0);
    btif_hl_display_bt_bda(&bd_addr);

    BTIF_HL_CALL_CBACK(bt_hl_callbacks, channel_state_cb,  app_id,
                       &bd_addr, p_acb->delete_mdl.mdep_cfg_idx,
                       p_acb->delete_mdl.channel_id, BTHL_CONN_STATE_DESTROYED, 0 );
}
/*******************************************************************************
**
** Function btif_hl_send_disconnecting_cb
**
** Description send a channel disconnecting callback
**
** Returns void
**
*******************************************************************************/
void btif_hl_send_disconnecting_cb(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx){
    btif_hl_mdl_cb_t        *p_dcb = BTIF_HL_GET_MDL_CB_PTR( app_idx,  mcl_idx, mdl_idx);
    btif_hl_soc_cb_t        *p_scb = p_dcb->p_scb;
    bt_bdaddr_t             bd_addr;
    int                     app_id = (int) btif_hl_get_app_id(p_scb->channel_id);

    btif_hl_copy_bda(&bd_addr, p_scb->bd_addr);

    BTIF_TRACE_DEBUG("%s",__FUNCTION__);
    BTIF_TRACE_DEBUG("call channel state callback  channel_id=0x%08x mdep_cfg_idx=%d, state=%d fd=%d",p_scb->channel_id,
                      p_scb->mdep_cfg_idx, BTHL_CONN_STATE_DISCONNECTING, p_scb->socket_id[0]);
    btif_hl_display_bt_bda(&bd_addr);
    BTIF_HL_CALL_CBACK(bt_hl_callbacks, channel_state_cb,  app_id,
                       &bd_addr, p_scb->mdep_cfg_idx,
                       p_scb->channel_id, BTHL_CONN_STATE_DISCONNECTING, p_scb->socket_id[0] );
}
/*******************************************************************************
**
** Function btif_hl_send_setup_connecting_cb
**
** Description send a channel connecting callback
**
** Returns void
**
*******************************************************************************/
void btif_hl_send_setup_connecting_cb(UINT8 app_idx, UINT8 mcl_idx){
    btif_hl_pending_chan_cb_t   *p_pcb = BTIF_HL_GET_PCB_PTR(app_idx, mcl_idx);
    bt_bdaddr_t                 bd_addr;
    int                         app_id = (int) btif_hl_get_app_id(p_pcb->channel_id);

    btif_hl_copy_bda(&bd_addr, p_pcb->bd_addr);

    if (p_pcb->in_use && p_pcb->cb_state == BTIF_HL_CHAN_CB_STATE_CONNECTING_PENDING)
    {
        BTIF_TRACE_DEBUG("%s",__FUNCTION__);
        BTIF_TRACE_DEBUG("call channel state callback  channel_id=0x%08x mdep_cfg_idx=%d state=%d fd=%d",p_pcb->channel_id,
                          p_pcb->mdep_cfg_idx, BTHL_CONN_STATE_CONNECTING, 0);
        btif_hl_display_bt_bda(&bd_addr);

        BTIF_HL_CALL_CBACK(bt_hl_callbacks, channel_state_cb, app_id,
                           &bd_addr, p_pcb->mdep_cfg_idx,
                           p_pcb->channel_id, BTHL_CONN_STATE_CONNECTING, 0 );
        btif_hl_set_chan_cb_state(app_idx, mcl_idx, BTIF_HL_CHAN_CB_STATE_CONNECTED_PENDING);
    }
}
/*******************************************************************************
**
** Function btif_hl_send_setup_disconnected_cb
**
** Description send a channel disconnected callback
**
** Returns void
**
*******************************************************************************/
void btif_hl_send_setup_disconnected_cb(UINT8 app_idx, UINT8 mcl_idx){
    btif_hl_pending_chan_cb_t   *p_pcb = BTIF_HL_GET_PCB_PTR(app_idx, mcl_idx);
    bt_bdaddr_t                 bd_addr;
    int                         app_id = (int) btif_hl_get_app_id(p_pcb->channel_id);

    btif_hl_copy_bda(&bd_addr, p_pcb->bd_addr);

    BTIF_TRACE_DEBUG("%s p_pcb->in_use=%d",__FUNCTION__, p_pcb->in_use);
    if (p_pcb->in_use)
    {
        BTIF_TRACE_DEBUG("%p_pcb->cb_state=%d",p_pcb->cb_state);
        if (p_pcb->cb_state == BTIF_HL_CHAN_CB_STATE_CONNECTING_PENDING)
        {
            BTIF_TRACE_DEBUG("call channel state callback  channel_id=0x%08x mdep_cfg_idx=%d state=%d fd=%d",p_pcb->channel_id,
                              p_pcb->mdep_cfg_idx, BTHL_CONN_STATE_CONNECTING, 0);
            btif_hl_display_bt_bda(&bd_addr);
            BTIF_HL_CALL_CBACK(bt_hl_callbacks, channel_state_cb, app_id,
                               &bd_addr, p_pcb->mdep_cfg_idx,
                               p_pcb->channel_id, BTHL_CONN_STATE_CONNECTING, 0 );

            BTIF_TRACE_DEBUG("call channel state callback  channel_id=0x%08x mdep_cfg_idx=%d state=%d fd=%d",p_pcb->channel_id,
                              p_pcb->mdep_cfg_idx, BTHL_CONN_STATE_DISCONNECTED, 0);
            btif_hl_display_bt_bda(&bd_addr);
            BTIF_HL_CALL_CBACK(bt_hl_callbacks, channel_state_cb, app_id,
                               &bd_addr, p_pcb->mdep_cfg_idx,
                               p_pcb->channel_id, BTHL_CONN_STATE_DISCONNECTED, 0 );
        }
        else if (p_pcb->cb_state == BTIF_HL_CHAN_CB_STATE_CONNECTED_PENDING)
        {
            BTIF_TRACE_DEBUG("call channel state callback  channel_id=0x%08x mdep_cfg_idx=%d state=%d fd=%d",p_pcb->channel_id,
                              p_pcb->mdep_cfg_idx, BTHL_CONN_STATE_DISCONNECTED, 0);
            btif_hl_display_bt_bda(&bd_addr);
            BTIF_HL_CALL_CBACK(bt_hl_callbacks, channel_state_cb,  app_id,
                               &bd_addr, p_pcb->mdep_cfg_idx,
                               p_pcb->channel_id, BTHL_CONN_STATE_DISCONNECTED, 0 );
        }
        btif_hl_clean_pcb(p_pcb);
    }
}
/*******************************************************************************
**
** Function         btif_hl_proc_sdp_query_cfm
**
** Description      Process the SDP query confirmation
**
** Returns          Nothing
**
*******************************************************************************/
static BOOLEAN btif_hl_proc_sdp_query_cfm(tBTA_HL *p_data){
    btif_hl_app_cb_t                *p_acb;
    btif_hl_mcl_cb_t                *p_mcb;
    tBTA_HL_SDP                     *p_sdp;
    tBTA_HL_CCH_OPEN_PARAM          open_param;
    UINT8                           app_idx, mcl_idx, sdp_idx = 0;
    UINT8                           num_recs, i, num_mdeps, j;
    btif_hl_cch_op_t                old_cch_oper;
    BOOLEAN                         status =FALSE;
    btif_hl_pending_chan_cb_t     *p_pcb;

    BTIF_TRACE_DEBUG("%s", __FUNCTION__);

    p_sdp = p_data->sdp_query_cfm.p_sdp;
    num_recs = p_sdp->num_recs;

    BTIF_TRACE_DEBUG("num of SDP records=%d",num_recs);
    for (i=0; i<num_recs; i++)
    {
        BTIF_TRACE_DEBUG("rec_idx=%d ctrl_psm=0x%x data_psm=0x%x",
                          (i+1),p_sdp->sdp_rec[i].ctrl_psm, p_sdp->sdp_rec[i].data_psm);
        BTIF_TRACE_DEBUG("MCAP supported procedures=0x%x",p_sdp->sdp_rec[i].mcap_sup_proc);
        num_mdeps = p_sdp->sdp_rec[i].num_mdeps;
        BTIF_TRACE_DEBUG("num of mdeps =%d",num_mdeps);
        for (j=0; j< num_mdeps; j++)
        {
            BTIF_TRACE_DEBUG("mdep_idx=%d mdep_id=0x%x data_type=0x%x mdep_role=0x%x",
                              (j+1),
                              p_sdp->sdp_rec[i].mdep_cfg[j].mdep_id,
                              p_sdp->sdp_rec[i].mdep_cfg[j].data_type,
                              p_sdp->sdp_rec[i].mdep_cfg[j].mdep_role );
        }
    }

        if (btif_hl_find_app_idx_using_app_id(p_data->sdp_query_cfm.app_id, &app_idx))
        {
            p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);

            if (btif_hl_find_mcl_idx(app_idx, p_data->sdp_query_cfm.bd_addr, &mcl_idx))
            {
                p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
                if (p_mcb->cch_oper != BTIF_HL_CCH_OP_NONE)
                {
                    memcpy(&p_mcb->sdp, p_sdp, sizeof(tBTA_HL_SDP));
                    old_cch_oper = p_mcb->cch_oper;
                    p_mcb->cch_oper = BTIF_HL_CCH_OP_NONE;

                    switch (old_cch_oper)
                    {
                        case BTIF_HL_CCH_OP_MDEP_FILTERING:
                            status = btif_hl_find_sdp_idx_using_mdep_filter(app_idx,
                                                                    mcl_idx, &sdp_idx);
                            break;
                        default:
                            break;
                    }

                    if (status)
                    {
                        p_mcb->sdp_idx       = sdp_idx;
                        p_mcb->valid_sdp_idx = TRUE;
                        p_mcb->ctrl_psm      = p_mcb->sdp.sdp_rec[sdp_idx].ctrl_psm;

                        switch (old_cch_oper)
                        {
                            case BTIF_HL_CCH_OP_MDEP_FILTERING:
                                p_pcb = BTIF_HL_GET_PCB_PTR(app_idx, mcl_idx);
                                if (p_pcb->in_use)
                                {
                                    if (!p_pcb->abort_pending)
                                    {
                                        switch (p_pcb->op)
                                        {
                                            case BTIF_HL_PEND_DCH_OP_OPEN:
                                                btif_hl_send_setup_connecting_cb(app_idx, mcl_idx);
                                                break;
                                            case BTIF_HL_PEND_DCH_OP_DELETE_MDL:
                                            default:
                                                break;
                                        }
                                        open_param.ctrl_psm = p_mcb->ctrl_psm;
                                        bdcpy(open_param.bd_addr, p_mcb->bd_addr);
                                        open_param.sec_mask =
                                                (BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT);
                                        BTA_HlCchOpen(p_acb->app_id,p_acb->app_handle, &open_param);
                                    }
                                    else
                                    {
                                        BTIF_TRACE_DEBUG("channel abort pending");
                                    }
                                }
                                break;

                            case BTIF_HL_CCH_OP_DCH_OPEN:
                                status = btif_hl_proc_pending_op(app_idx,mcl_idx);
                                break;

                            default:
                                BTIF_TRACE_ERROR("Invalid CCH oper %d", old_cch_oper);
                                break;
                        }
                    }
                    else
                    {
                        BTIF_TRACE_ERROR("Can not find SDP idx discard CCH Open request");
                    }
                }
            }
        }
    return status;
}


/*******************************************************************************
**
** Function         btif_hl_proc_cch_open_ind
**
** Description      Process the CCH open indication
**
** Returns          Nothing
**
*******************************************************************************/
static void btif_hl_proc_cch_open_ind(tBTA_HL *p_data)

{
    btif_hl_mcl_cb_t         *p_mcb;
    UINT8                   app_idx, mcl_idx;
    int                     i;

    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
    for(i=0; i<BTA_HL_NUM_APPS; i++)
    {
        if (btif_hl_cb.acb[i].in_use)
        {
            if (!btif_hl_find_mcl_idx(i, p_data->cch_open_ind.bd_addr, &mcl_idx))
            {
                if (btif_hl_find_avail_mcl_idx(i, &mcl_idx))
                {
                    p_mcb = BTIF_HL_GET_MCL_CB_PTR(i, mcl_idx);
                    memset(p_mcb, 0, sizeof(btif_hl_mcl_cb_t));
                    p_mcb->in_use = TRUE;
                    p_mcb->is_connected = TRUE;
                    p_mcb->mcl_handle = p_data->cch_open_ind.mcl_handle;
                    bdcpy(p_mcb->bd_addr, p_data->cch_open_ind.bd_addr);
                    btif_hl_start_cch_timer(i, mcl_idx);
                }
            }
            else
            {
                BTIF_TRACE_ERROR("The MCL already exist for cch_open_ind");
            }
        }
    }
}

/*******************************************************************************
**
** Function         btif_hl_proc_pending_op
**
** Description      Process the pending dch operation.
**
** Returns          Nothing
**
*******************************************************************************/
BOOLEAN btif_hl_proc_pending_op(UINT8 app_idx, UINT8 mcl_idx)

{

    btif_hl_app_cb_t            *p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
    btif_hl_mcl_cb_t            *p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
    btif_hl_pending_chan_cb_t   *p_pcb;
    BOOLEAN                     status = FALSE;
    tBTA_HL_DCH_OPEN_PARAM      dch_open;
    tBTA_HL_MDL_ID              mdl_id;
    tBTA_HL_DCH_RECONNECT_PARAM reconnect_param;

    p_pcb = BTIF_HL_GET_PCB_PTR(app_idx, mcl_idx);
    if (p_pcb->in_use)
    {
        switch (p_pcb->op)
        {
            case BTIF_HL_PEND_DCH_OP_OPEN:
                if (!p_pcb->abort_pending)
                {
                    BTIF_TRACE_DEBUG("op BTIF_HL_PEND_DCH_OP_OPEN");
                    dch_open.ctrl_psm = p_mcb->ctrl_psm;
                    dch_open.local_mdep_id = p_acb->sup_feature.mdep[p_pcb->mdep_cfg_idx].mdep_id;
                    if (btif_hl_find_peer_mdep_id(p_acb->app_id, p_mcb->bd_addr,
                                                  p_acb->sup_feature.mdep[p_pcb->mdep_cfg_idx].mdep_cfg.mdep_role,
                                                  p_acb->sup_feature.mdep[p_pcb->mdep_cfg_idx].mdep_cfg.data_cfg[0].data_type, &dch_open.peer_mdep_id ))
                    {
                        dch_open.local_cfg = p_acb->channel_type[p_pcb->mdep_cfg_idx];
                        if ((p_acb->sup_feature.mdep[p_pcb->mdep_cfg_idx].mdep_cfg.mdep_role == BTA_HL_MDEP_ROLE_SOURCE)
                            && !btif_hl_is_the_first_reliable_existed(app_idx, mcl_idx))
                        {
                            dch_open.local_cfg = BTA_HL_DCH_CFG_RELIABLE;
                        }
                        dch_open.sec_mask = (BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT);
                        BTIF_TRACE_DEBUG("dch_open.local_cfg=%d  ", dch_open.local_cfg);
                        btif_hl_send_setup_connecting_cb(app_idx,mcl_idx);

                        if (!btif_hl_is_reconnect_possible(app_idx, mcl_idx, p_pcb->mdep_cfg_idx, &dch_open, &mdl_id ))
                        {
                            BTIF_TRACE_DEBUG("Issue DCH open, mcl_handle=%d",p_mcb->mcl_handle);
                            BTA_HlDchOpen(p_mcb->mcl_handle, &dch_open);
                        }
                        else
                        {
                            reconnect_param.ctrl_psm = p_mcb->ctrl_psm;
                            reconnect_param.mdl_id = mdl_id;;
                            BTIF_TRACE_DEBUG("Issue Reconnect ctrl_psm=0x%x mdl_id=0x%x",reconnect_param.ctrl_psm, reconnect_param.mdl_id);
                            BTA_HlDchReconnect(p_mcb->mcl_handle, &reconnect_param);
                        }
                        status = TRUE;
                    }
                }
                else
                {
                    btif_hl_send_setup_disconnected_cb(app_idx, mcl_idx);
                    status = TRUE;
                }
                break;
            case BTIF_HL_PEND_DCH_OP_DELETE_MDL:
                BTA_HlDeleteMdl(p_mcb->mcl_handle, p_acb->delete_mdl.mdl_id);
                status = TRUE;
                break;

            default:
                break;
        }
    }
    return status;
}

/*******************************************************************************
**
** Function         btif_hl_proc_cch_open_cfm
**
** Description      Process the CCH open confirmation
**
** Returns          Nothing
**
*******************************************************************************/
static BOOLEAN btif_hl_proc_cch_open_cfm(tBTA_HL *p_data)

{
    btif_hl_app_cb_t         *p_acb;
    btif_hl_mcl_cb_t         *p_mcb;
    UINT8                    app_idx, mcl_idx;
    BOOLEAN                  status = FALSE;
    tBTA_HL_DCH_OPEN_PARAM   dch_open;


    BTIF_TRACE_DEBUG("%s", __FUNCTION__);

    if (btif_hl_find_app_idx_using_app_id(p_data->cch_open_cfm.app_id, &app_idx))
    {
        BTIF_TRACE_DEBUG("app_idx=%d", app_idx);
        if (btif_hl_find_mcl_idx(app_idx, p_data->cch_open_cfm.bd_addr, &mcl_idx))
        {
            p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);

            p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
            BTIF_TRACE_DEBUG("mcl_idx=%d, mcl_handle=%d", mcl_idx,p_data->cch_open_cfm.mcl_handle);
            p_mcb->mcl_handle = p_data->cch_open_cfm.mcl_handle;
            p_mcb->is_connected = TRUE;
            status = btif_hl_proc_pending_op(app_idx, mcl_idx);
            if (status)
                btif_hl_start_cch_timer(app_idx, mcl_idx);
        }
    }

    return status;
}

/*******************************************************************************
**
** Function      btif_hl_clean_mcb_using_handle
**
** Description  clean control channel cb using handle
**
** Returns      void
**
*******************************************************************************/
static void btif_hl_clean_mcb_using_handle( tBTA_HL_MCL_HANDLE mcl_handle){
    btif_hl_app_cb_t  *p_acb;
    UINT8 i,j;

    for (i=0; i<BTA_HL_NUM_APPS; i++)
    {
        p_acb =BTIF_HL_GET_APP_CB_PTR(i);
        for (j=0; j < BTA_HL_NUM_MCLS ; j++)
        {
            if (p_acb->mcb[j].in_use)
                BTIF_TRACE_DEBUG("btif_hl_find_mcl_idx_using_handle: app_idx=%d,"
                    "mcl_idx =%d mcl_handle=%d",i,j,p_acb->mcb[j].mcl_handle);
            if (p_acb->mcb[j].in_use &&
                (p_acb->mcb[j].mcl_handle == mcl_handle))
            {
                btif_hl_stop_cch_timer(i, j);
                btif_hl_release_mcl_sockets(i, j);
                btif_hl_send_setup_disconnected_cb(i, j);
                btif_hl_clean_mcl_cb(i, j);
            }
        }
    }
}

/*******************************************************************************
**
** Function         btif_hl_proc_cch_close_ind
**
** Description      Process the CCH close indication
**
** Returns          Nothing
**
*******************************************************************************/
static void btif_hl_proc_cch_close_ind(tBTA_HL *p_data)

{
    UINT8                   app_idx, mcl_idx;
    BTIF_TRACE_DEBUG("%s", __FUNCTION__);

    btif_hl_clean_mcb_using_handle(p_data->cch_close_ind.mcl_handle);
}


/*******************************************************************************
**
** Function         btif_hl_proc_cch_close_cfm
**
** Description      Process the CCH close confirmation
**
** Returns          Nothing
**
*******************************************************************************/
static void btif_hl_proc_cch_close_cfm(tBTA_HL *p_data)
{
    UINT8                   app_idx, mcl_idx;
    BTIF_TRACE_DEBUG("%s", __FUNCTION__);

    btif_hl_clean_mcb_using_handle(p_data->cch_close_ind.mcl_handle);
}

/*******************************************************************************
**
** Function         btif_hl_proc_create_ind
**
** Description      Process the MDL create indication
**
** Returns          Nothing
**
*******************************************************************************/
static void btif_hl_proc_create_ind(tBTA_HL *p_data){
    btif_hl_app_cb_t         *p_acb;
    btif_hl_mcl_cb_t         *p_mcb;
    tBTA_HL_MDEP            *p_mdep;
    UINT8                   app_idx, orig_app_idx, mcl_idx, mdep_cfg_idx;
    BOOLEAN                 first_reliable_exist;
    BOOLEAN                 success = TRUE;
    tBTA_HL_DCH_CFG         rsp_cfg = BTA_HL_DCH_CFG_UNKNOWN;
    tBTA_HL_DCH_CREATE_RSP  rsp_code = BTA_HL_DCH_CREATE_RSP_CFG_REJ;
    tBTA_HL_DCH_CREATE_RSP_PARAM create_rsp_param;

    BTIF_TRACE_DEBUG("%s", __FUNCTION__);

// Find the correct app_idx based on the mdep_id;
    btif_hl_find_app_idx_using_mdepId(p_data->dch_create_ind.local_mdep_id,&orig_app_idx);
    if (btif_hl_find_mcl_idx(orig_app_idx, p_data->dch_create_ind.bd_addr, &mcl_idx))
    {
        p_acb =BTIF_HL_GET_APP_CB_PTR(orig_app_idx);
        p_mcb =BTIF_HL_GET_MCL_CB_PTR(orig_app_idx, mcl_idx);

        if (btif_hl_find_mdep_cfg_idx(orig_app_idx, p_data->dch_create_ind.local_mdep_id, &mdep_cfg_idx))
        {
            p_mdep = &(p_acb->sup_feature.mdep[mdep_cfg_idx]);
            first_reliable_exist = btif_hl_is_the_first_reliable_existed(orig_app_idx, mcl_idx);
            switch (p_mdep->mdep_cfg.mdep_role)
            {
                case BTA_HL_MDEP_ROLE_SOURCE:
                    if (p_data->dch_create_ind.cfg == BTA_HL_DCH_CFG_NO_PREF)
                    {
                        if (first_reliable_exist)
                        {
                            rsp_cfg = p_acb->channel_type[mdep_cfg_idx];
                        }
                        else
                        {
                            rsp_cfg = BTA_HL_DCH_CFG_RELIABLE;
                        }
                        rsp_code = BTA_HL_DCH_CREATE_RSP_SUCCESS;
                    }

                    break;
                case BTA_HL_MDEP_ROLE_SINK:

                    BTIF_TRACE_DEBUG("btif_hl_proc_create_ind:BTA_HL_MDEP_ROLE_SINK");
                    if ((p_data->dch_create_ind.cfg  == BTA_HL_DCH_CFG_RELIABLE) ||
                        (first_reliable_exist && (p_data->dch_create_ind.cfg  == BTA_HL_DCH_CFG_STREAMING)))
                    {
                        rsp_code = BTA_HL_DCH_CREATE_RSP_SUCCESS;
                        rsp_cfg = p_data->dch_create_ind.cfg;
                        BTIF_TRACE_DEBUG("btif_hl_proc_create_ind:BTA_HL_MDEP_ROLE_SINK cfg = %d",rsp_cfg);
                    }
                    break;
                default:
                    break;
            }
        }
    }
    else
    {
        success = FALSE;
    }

    if (success)
    {
        BTIF_TRACE_DEBUG("create response rsp_code=%d rsp_cfg=%d", rsp_code, rsp_cfg );
        create_rsp_param.local_mdep_id = p_data->dch_create_ind.local_mdep_id;
        create_rsp_param.mdl_id = p_data->dch_create_ind.mdl_id;
        create_rsp_param.rsp_code = rsp_code;
        create_rsp_param.cfg_rsp = rsp_cfg;
        BTA_HlDchCreateRsp(p_mcb->mcl_handle, &create_rsp_param);
    }
}

/*******************************************************************************
**
** Function         btif_hl_proc_dch_open_ind
**
** Description      Process the DCH open indication
**
** Returns          Nothing
**
*******************************************************************************/
static void btif_hl_proc_dch_open_ind(tBTA_HL *p_data)

{
    btif_hl_app_cb_t         *p_acb;
    btif_hl_mcl_cb_t         *p_mcb;
    btif_hl_mdl_cb_t         *p_dcb;
    UINT8                    orig_app_idx, mcl_idx, mdl_idx, mdep_cfg_idx;
    UINT8                    dc_cfg;
    BOOLEAN close_dch = FALSE;

    BTIF_TRACE_DEBUG("%s", __FUNCTION__);

    // Find the correct app_idx based on the mdep_id;
    btif_hl_find_app_idx_using_mdepId(p_data->dch_open_ind.local_mdep_id,&orig_app_idx);

    if (btif_hl_find_mcl_idx_using_app_idx(p_data->dch_open_ind.mcl_handle, orig_app_idx, &mcl_idx ))
    {
        p_acb =BTIF_HL_GET_APP_CB_PTR(orig_app_idx);
        p_mcb =BTIF_HL_GET_MCL_CB_PTR(orig_app_idx, mcl_idx);

        if (btif_hl_find_avail_mdl_idx(orig_app_idx, mcl_idx, &mdl_idx))
        {
            p_dcb = BTIF_HL_GET_MDL_CB_PTR(orig_app_idx, mcl_idx, mdl_idx);

            if (btif_hl_find_mdep_cfg_idx(orig_app_idx, p_data->dch_open_ind.local_mdep_id, &mdep_cfg_idx))
            {
                p_dcb->in_use               = TRUE;
                p_dcb->mdl_handle           =  p_data->dch_open_ind.mdl_handle;
                p_dcb->local_mdep_cfg_idx   = mdep_cfg_idx;
                p_dcb->local_mdep_id        = p_data->dch_open_ind.local_mdep_id;
                p_dcb->mdl_id               = p_data->dch_open_ind.mdl_id;
                p_dcb->dch_mode             = p_data->dch_open_ind.dch_mode;
                p_dcb->dch_mode             = p_data->dch_open_ind.dch_mode;
                p_dcb->is_the_first_reliable = p_data->dch_open_ind.first_reliable;
                p_dcb->mtu                  = p_data->dch_open_ind.mtu;

                if(btif_hl_find_channel_id_using_mdl_id(orig_app_idx,p_dcb->mdl_id , &p_dcb->channel_id))
                {
                    BTIF_TRACE_DEBUG(" app_idx=%d mcl_idx=%d mdl_idx=%d channel_id=%d",
                                        orig_app_idx, mcl_idx, mdl_idx, p_dcb->channel_id  );
                    if (!btif_hl_create_socket(orig_app_idx, mcl_idx, mdl_idx))
                    {
                        BTIF_TRACE_ERROR("Unable to create socket");
                        close_dch = TRUE;
                    }
                }
                else
                {
                    BTIF_TRACE_ERROR("Unable find channel id for mdl_id=0x%x", p_dcb->mdl_id  );
                    close_dch = TRUE;
                }
            }
            else
            {
                BTIF_TRACE_ERROR("INVALID_LOCAL_MDEP_ID mdep_id=%d",p_data->dch_open_cfm.local_mdep_id);
                close_dch = TRUE;
            }

            if (close_dch)
                btif_hl_clean_mdl_cb(p_dcb);
        }
        else
            close_dch = TRUE;
    }
    else
        close_dch = TRUE;

    if (close_dch)
        BTA_HlDchClose(p_data->dch_open_cfm.mdl_handle);
}

/*******************************************************************************
**
** Function         btif_hl_proc_dch_open_cfm
**
** Description      Process the DCH close confirmation
**
** Returns          Nothing
**
*******************************************************************************/
static BOOLEAN btif_hl_proc_dch_open_cfm(tBTA_HL *p_data)

{
    btif_hl_app_cb_t            *p_acb;
    btif_hl_mcl_cb_t            *p_mcb;
    btif_hl_mdl_cb_t            *p_dcb;
    btif_hl_pending_chan_cb_t   *p_pcb;
    UINT8                    app_idx, mcl_idx, mdl_idx, mdep_cfg_idx;
    BOOLEAN                  status = FALSE;
    BOOLEAN                  close_dch = FALSE;

    BTIF_TRACE_DEBUG("%s", __FUNCTION__);

    // Find the correct app_idx based on the mdep_id;
    btif_hl_find_app_idx_using_mdepId(p_data->dch_open_cfm.local_mdep_id,&app_idx);

    if (btif_hl_find_mcl_idx_using_app_idx(p_data->dch_open_cfm.mcl_handle, app_idx, &mcl_idx ))
    {
        p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
        p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
        p_pcb = BTIF_HL_GET_PCB_PTR(app_idx, mcl_idx);

        if (btif_hl_find_avail_mdl_idx(app_idx, mcl_idx, &mdl_idx))
        {
            p_dcb = BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);

            if (btif_hl_find_mdep_cfg_idx(app_idx, p_data->dch_open_cfm.local_mdep_id, &mdep_cfg_idx))
            {
                p_dcb->in_use               = TRUE;
                p_dcb->mdl_handle           = p_data->dch_open_cfm.mdl_handle;
                p_dcb->local_mdep_cfg_idx   = mdep_cfg_idx;
                p_dcb->local_mdep_id        = p_data->dch_open_cfm.local_mdep_id;
                p_dcb->mdl_id               = p_data->dch_open_cfm.mdl_id;
                p_dcb->dch_mode             = p_data->dch_open_cfm.dch_mode;
                p_dcb->is_the_first_reliable= p_data->dch_open_cfm.first_reliable;
                p_dcb->mtu                  = p_data->dch_open_cfm.mtu;
                p_dcb->channel_id           = p_pcb->channel_id;

                BTIF_TRACE_DEBUG("app_idx=%d mcl_idx=%d mdl_idx=%d",  app_idx, mcl_idx, mdl_idx  );
                btif_hl_send_setup_connecting_cb(app_idx, mcl_idx);
                if (btif_hl_create_socket(app_idx, mcl_idx, mdl_idx))
                {
                    status = TRUE;
                    BTIF_TRACE_DEBUG("app_idx=%d mcl_idx=%d mdl_idx=%d p_dcb->channel_id=0x%08x",
                                      app_idx, mcl_idx, mdl_idx, p_dcb->channel_id);
                    btif_hl_clean_pcb(p_pcb);
                }
                else
                {
                    BTIF_TRACE_ERROR("Unable to create socket");
                    close_dch = TRUE;
                }
            }
            else
            {
                BTIF_TRACE_ERROR("INVALID_LOCAL_MDEP_ID mdep_id=%d",p_data->dch_open_cfm.local_mdep_id);
                close_dch = TRUE;
            }

            if (close_dch)
            {
                btif_hl_clean_mdl_cb(p_dcb);
                BTA_HlDchClose(p_data->dch_open_cfm.mdl_handle);
            }
        }
    }

    return status;
}
/*******************************************************************************
**
** Function         btif_hl_proc_dch_reconnect_cfm
**
** Description      Process the DCH reconnect indication
**
** Returns          Nothing
**
*******************************************************************************/
static BOOLEAN btif_hl_proc_dch_reconnect_cfm(tBTA_HL *p_data)
{
    btif_hl_app_cb_t            *p_acb;
    btif_hl_mcl_cb_t            *p_mcb;
    btif_hl_mdl_cb_t            *p_dcb;
    btif_hl_pending_chan_cb_t   *p_pcb;
    UINT8                    app_idx, mcl_idx, mdl_idx, mdep_cfg_idx;
    BOOLEAN                  status = FALSE;
    BOOLEAN                  close_dch = FALSE;

    BTIF_TRACE_DEBUG("%s", __FUNCTION__);

    btif_hl_find_app_idx_using_mdepId(p_data->dch_reconnect_cfm.local_mdep_id,&app_idx);

    if (btif_hl_find_mcl_idx_using_app_idx(p_data->dch_reconnect_cfm.mcl_handle, app_idx, &mcl_idx ))
    {
        p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
        p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
        p_pcb = BTIF_HL_GET_PCB_PTR(app_idx, mcl_idx);

        if (btif_hl_find_avail_mdl_idx(app_idx, mcl_idx, &mdl_idx))
        {
            p_dcb = BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);

            if (btif_hl_find_mdep_cfg_idx(app_idx, p_data->dch_reconnect_cfm.local_mdep_id, &mdep_cfg_idx))
            {
                p_dcb->in_use               = TRUE;
                p_dcb->mdl_handle           = p_data->dch_reconnect_cfm.mdl_handle;
                p_dcb->local_mdep_cfg_idx   = mdep_cfg_idx;
                p_dcb->local_mdep_id        = p_data->dch_reconnect_cfm.local_mdep_id;
                p_dcb->mdl_id               = p_data->dch_reconnect_cfm.mdl_id;
                p_dcb->dch_mode             = p_data->dch_reconnect_cfm.dch_mode;
                p_dcb->is_the_first_reliable= p_data->dch_reconnect_cfm.first_reliable;
                p_dcb->mtu                  = p_data->dch_reconnect_cfm.mtu;
                p_dcb->channel_id           = p_pcb->channel_id;

                BTIF_TRACE_DEBUG("app_idx=%d mcl_idx=%d mdl_idx=%d",  app_idx, mcl_idx, mdl_idx  );
                btif_hl_send_setup_connecting_cb(app_idx, mcl_idx);
                if (btif_hl_create_socket(app_idx, mcl_idx, mdl_idx))
                {
                    status = TRUE;
                    BTIF_TRACE_DEBUG("app_idx=%d mcl_idx=%d mdl_idx=%d p_dcb->channel_id=0x%08x",
                                      app_idx, mcl_idx, mdl_idx, p_dcb->channel_id);
                    btif_hl_clean_pcb(p_pcb);
                }
                else
                {
                    BTIF_TRACE_ERROR("Unable to create socket");
                    close_dch = TRUE;
                }
            }
            else
            {
                BTIF_TRACE_ERROR("INVALID_LOCAL_MDEP_ID mdep_id=%d",p_data->dch_open_cfm.local_mdep_id);
                close_dch = TRUE;
            }

            if (close_dch)
            {
                btif_hl_clean_mdl_cb(p_dcb);
                BTA_HlDchClose(p_data->dch_reconnect_cfm.mdl_handle);
            }
        }
    }

    return status;

}
/*******************************************************************************
**
** Function         btif_hl_proc_dch_reconnect_ind
**
** Description      Process the DCH reconnect indication
**
** Returns          Nothing
**
*******************************************************************************/
static void btif_hl_proc_dch_reconnect_ind(tBTA_HL *p_data)

{
    btif_hl_app_cb_t        *p_acb;
    btif_hl_mcl_cb_t        *p_mcb;
    btif_hl_mdl_cb_t        *p_dcb;
    UINT8                   app_idx, mcl_idx, mdl_idx, mdep_cfg_idx, dc_cfg;
    BOOLEAN                 close_dch = FALSE;

    BTIF_TRACE_DEBUG("%s", __FUNCTION__);

    // Find the correct app_idx based on the mdep_id;
    btif_hl_find_app_idx_using_mdepId(p_data->dch_reconnect_ind.local_mdep_id,&app_idx);

    if (btif_hl_find_mcl_idx_using_app_idx(p_data->dch_reconnect_ind.mcl_handle, app_idx, &mcl_idx ))
    {
        p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
        BTIF_TRACE_DEBUG("btif_hl_proc_dch_reconnect_ind: app_idx = %d, mcl_idx = %d",
                                app_idx, mcl_idx);
        p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);

        if (btif_hl_find_avail_mdl_idx(app_idx, mcl_idx, &mdl_idx))
        {
            p_dcb =BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);

            if (btif_hl_find_mdep_cfg_idx(app_idx, p_data->dch_reconnect_ind.local_mdep_id, &mdep_cfg_idx))
            {
                p_dcb->in_use               = TRUE;
                p_dcb->mdl_handle           = p_data->dch_reconnect_ind.mdl_handle;
                p_dcb->local_mdep_cfg_idx   = mdep_cfg_idx;
                p_dcb->local_mdep_id        = p_data->dch_reconnect_ind.local_mdep_id;
                p_dcb->mdl_id               = p_data->dch_reconnect_ind.mdl_id;
                p_dcb->dch_mode             = p_data->dch_reconnect_ind.dch_mode;
                p_dcb->dch_mode             = p_data->dch_reconnect_ind.dch_mode;
                p_dcb->is_the_first_reliable= p_data->dch_reconnect_ind.first_reliable;
                p_dcb->mtu                  = p_data->dch_reconnect_ind.mtu;
                p_dcb->channel_id           = btif_hl_get_next_channel_id(p_acb->app_id);

                BTIF_TRACE_DEBUG(" app_idx=%d mcl_idx=%d mdl_idx=%d channel_id=%d",
                                  app_idx, mcl_idx, mdl_idx, p_dcb->channel_id  );
                if (!btif_hl_create_socket(app_idx, mcl_idx, mdl_idx))
                {
                    BTIF_TRACE_ERROR("Unable to create socket");
                    close_dch = TRUE;
                }
            }
            else
            {
                BTIF_TRACE_ERROR("INVALID_LOCAL_MDEP_ID mdep_id=%d",p_data->dch_open_cfm.local_mdep_id);
                close_dch = TRUE;
            }

            if (close_dch)
                btif_hl_clean_mdl_cb(p_dcb);
        }
        else
            close_dch = TRUE;
    }
    else
        close_dch = TRUE;

    if (close_dch)
        BTA_HlDchClose(p_data->dch_reconnect_ind.mdl_handle);

}

/*******************************************************************************
**
** Function         btif_hl_proc_dch_close_ind
**
** Description      Process the DCH close indication
**
** Returns          Nothing
**
*******************************************************************************/
static void btif_hl_proc_dch_close_ind(tBTA_HL *p_data)

{
    btif_hl_mdl_cb_t         *p_dcb;
    btif_hl_mcl_cb_t         *p_mcb;
    UINT8                   app_idx, mcl_idx, mdl_idx;

    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
    if (btif_hl_find_mdl_idx_using_handle(p_data->dch_close_ind.mdl_handle,
                                          &app_idx, &mcl_idx, &mdl_idx ))
    {
        p_dcb = BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
        btif_hl_release_socket(app_idx,mcl_idx, mdl_idx);
        btif_hl_send_setup_disconnected_cb(app_idx, mcl_idx);
        p_mcb =  BTIF_HL_GET_MCL_CB_PTR(app_idx,mcl_idx);
        btif_hl_clean_mdl_cb(p_dcb);
        if (!btif_hl_num_dchs_in_use(p_mcb->mcl_handle))
            btif_hl_start_cch_timer(app_idx, mcl_idx);
        BTIF_TRACE_DEBUG("remote DCH close success mdl_idx=%d", mdl_idx);
    }
}

/*******************************************************************************
**
** Function         btif_hl_proc_dch_close_cfm
**
** Description      Process the DCH reconnect confirmation
**
** Returns          Nothing
**
*******************************************************************************/
static void btif_hl_proc_dch_close_cfm(tBTA_HL *p_data)

{
    btif_hl_mdl_cb_t         *p_dcb;
    btif_hl_mcl_cb_t         *p_mcb;
    UINT8                   app_idx, mcl_idx, mdl_idx;

    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
    if (btif_hl_find_mdl_idx_using_handle(p_data->dch_close_cfm.mdl_handle,
                                          &app_idx, &mcl_idx, &mdl_idx ))
    {
        p_dcb = BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
        btif_hl_release_socket(app_idx,mcl_idx,mdl_idx);
        btif_hl_clean_mdl_cb(p_dcb);
        p_mcb =  BTIF_HL_GET_MCL_CB_PTR(app_idx,mcl_idx);
        if (!btif_hl_num_dchs_in_use(p_mcb->mcl_handle))
            btif_hl_start_cch_timer(app_idx, mcl_idx);
        BTIF_TRACE_DEBUG(" local DCH close success mdl_idx=%d", mdl_idx);
    }
}


/*******************************************************************************
**
** Function         btif_hl_proc_abort_ind
**
** Description      Process the abort indicaiton
**
** Returns          Nothing
**
*******************************************************************************/
static void btif_hl_proc_abort_ind(tBTA_HL_MCL_HANDLE mcl_handle){

    UINT8                   app_idx,mcl_idx;
    BTIF_TRACE_DEBUG("%s", __FUNCTION__ );
    btif_hl_app_cb_t  *p_acb;
    UINT8 i,j;

    for (i=0; i<BTA_HL_NUM_APPS; i++)
    {
        p_acb =BTIF_HL_GET_APP_CB_PTR(i);
        for (j=0; j < BTA_HL_NUM_MCLS ; j++)
        {
            if (p_acb->mcb[j].in_use)
                BTIF_TRACE_DEBUG("btif_hl_find_mcl_idx_using_handle: app_idx=%d,mcl_idx =%d mcl_handle=%d",i,j,p_acb->mcb[j].mcl_handle);
            if (p_acb->mcb[j].in_use &&
                (p_acb->mcb[j].mcl_handle == mcl_handle))
            {
                btif_hl_stop_cch_timer(i, j);
                btif_hl_send_setup_disconnected_cb(i, j);
                btif_hl_clean_mcl_cb(i, j);
            }
        }
    }
}

/*******************************************************************************
**
** Function         btif_hl_proc_abort_cfm
**
** Description      Process the abort confirmation
**
** Returns          Nothing
**
*******************************************************************************/
static void btif_hl_proc_abort_cfm(tBTA_HL_MCL_HANDLE mcl_handle){
    UINT8                   app_idx,mcl_idx;

    BTIF_TRACE_DEBUG("%s", __FUNCTION__ );
    btif_hl_app_cb_t  *p_acb;
    UINT8 i,j;

    for (i=0; i<BTA_HL_NUM_APPS; i++)
    {
        p_acb =BTIF_HL_GET_APP_CB_PTR(i);
        for (j=0; j < BTA_HL_NUM_MCLS ; j++)
        {
            if (p_acb->mcb[j].in_use)
                BTIF_TRACE_DEBUG("btif_hl_find_mcl_idx_using_handle: app_idx=%d,mcl_idx =%d mcl_handle=%d",i,j,p_acb->mcb[j].mcl_handle);
            if (p_acb->mcb[j].in_use &&
                (p_acb->mcb[j].mcl_handle == mcl_handle))
            {
                btif_hl_stop_cch_timer(i, j);
                btif_hl_send_setup_disconnected_cb(i, j);
                btif_hl_clean_mcl_cb(i, j);
            }
        }
    }

}

/*******************************************************************************
**
** Function         btif_hl_proc_send_data_cfm
**
** Description      Process the send data confirmation
**
** Returns          Nothing
**
*******************************************************************************/
static void btif_hl_proc_send_data_cfm(tBTA_HL_MDL_HANDLE mdl_handle,
                                       tBTA_HL_STATUS status){
    UINT8                   app_idx,mcl_idx, mdl_idx;
    btif_hl_mdl_cb_t         *p_dcb;
    UNUSED(status);

    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
    if (btif_hl_find_mdl_idx_using_handle(mdl_handle,
                                          &app_idx, &mcl_idx, &mdl_idx ))
    {
        p_dcb =BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
        btif_hl_free_buf((void **) &p_dcb->p_tx_pkt);
        BTIF_TRACE_DEBUG("send success free p_tx_pkt tx_size=%d", p_dcb->tx_size);
        p_dcb->tx_size = 0;
    }
}

/*******************************************************************************
**
** Function         btif_hl_proc_dch_cong_ind
**
** Description      Process the DCH congestion change indication
**
** Returns          Nothing
**
*******************************************************************************/
static void btif_hl_proc_dch_cong_ind(tBTA_HL *p_data)

{
    btif_hl_mdl_cb_t         *p_dcb;
    UINT8                   app_idx, mcl_idx, mdl_idx;

    BTIF_TRACE_DEBUG("btif_hl_proc_dch_cong_ind");


    if (btif_hl_find_mdl_idx_using_handle(p_data->dch_cong_ind.mdl_handle, &app_idx, &mcl_idx, &mdl_idx))
    {
        p_dcb =BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
        p_dcb->cong = p_data->dch_cong_ind.cong;
    }
}

/*******************************************************************************
**
** Function         btif_hl_proc_reg_request
**
** Description      Process registration request
**
** Returns          void
**
*******************************************************************************/
static void btif_hl_proc_reg_request(UINT8 app_idx, UINT8  app_id,
                                     tBTA_HL_REG_PARAM *p_reg_param,
                                     tBTA_HL_CBACK *p_cback){
    bt_status_t status= BT_STATUS_SUCCESS;
    UINT8 i;
    btif_hl_app_data_t *p_data;
    UNUSED(p_cback);

    BTIF_TRACE_DEBUG("%s app_idx=%d app_id=%d", __FUNCTION__, app_idx, app_id);

    if(reg_counter >1)
    {
        BTIF_TRACE_DEBUG("btif_hl_proc_reg_request: calling uPDATE");
        BTA_HlUpdate(app_id, p_reg_param,TRUE, btif_hl_cback);
    }
    else
        BTA_HlRegister(app_id, p_reg_param, btif_hl_cback);
}


/*******************************************************************************
**
** Function         btif_hl_proc_cb_evt
**
** Description      Process HL callback events
**
** Returns          void
**
*******************************************************************************/
static void btif_hl_proc_cb_evt(UINT16 event, char* p_param){

    btif_hl_evt_cb_t                *p_data = (btif_hl_evt_cb_t *)p_param;
    bt_bdaddr_t                     bd_addr;
    bthl_channel_state_t            state=BTHL_CONN_STATE_DISCONNECTED;
    BOOLEAN                         send_chan_cb=TRUE;
    tBTA_HL_REG_PARAM               reg_param;
    btif_hl_app_cb_t                *p_acb;
    bthl_app_reg_state_t            reg_state = BTHL_APP_REG_STATE_REG_FAILED;
    int                             app_id;
    UINT8                           preg_idx;
    bt_status_t                     bt_status;

    BTIF_TRACE_DEBUG("%s event %d", __FUNCTION__, event);
    btif_hl_display_calling_process_name();

    switch (event)
    {
        case BTIF_HL_SEND_CONNECTED_CB:
        case BTIF_HL_SEND_DISCONNECTED_CB:
            if (p_data->chan_cb.cb_state == BTIF_HL_CHAN_CB_STATE_CONNECTED_PENDING)
                state = BTHL_CONN_STATE_CONNECTED;
            else if (p_data->chan_cb.cb_state == BTIF_HL_CHAN_CB_STATE_DISCONNECTED_PENDING)
                state = BTHL_CONN_STATE_DISCONNECTED;
            else
                send_chan_cb = FALSE;

            if (send_chan_cb)
            {
                btif_hl_copy_bda(&bd_addr, p_data->chan_cb.bd_addr);
                BTIF_TRACE_DEBUG("state callbk: ch_id=0x%08x cb_state=%d state=%d  fd=%d",
                                  p_data->chan_cb.channel_id,
                                  p_data->chan_cb.cb_state,
                                  state,  p_data->chan_cb.fd);
                btif_hl_display_bt_bda(&bd_addr);
                BTIF_HL_CALL_CBACK(bt_hl_callbacks, channel_state_cb,  p_data->chan_cb.app_id,
                                   &bd_addr, p_data->chan_cb.mdep_cfg_index,
                                   p_data->chan_cb.channel_id, state, p_data->chan_cb.fd );
            }

            break;
        case BTIF_HL_REG_APP:
            p_acb  = BTIF_HL_GET_APP_CB_PTR(p_data->reg.app_idx);
            app_id = (int) p_acb->app_id;
            BTIF_TRACE_DEBUG("Rcv BTIF_HL_REG_APP app_idx=%d reg_pending=%d", p_data->reg.app_idx, p_acb->reg_pending);
            if (btif_hl_get_state() == BTIF_HL_STATE_ENABLED && p_acb->reg_pending)
            {
                BTIF_TRACE_DEBUG("Rcv BTIF_HL_REG_APP reg_counter=%d",reg_counter);
                p_acb->reg_pending = FALSE;
                reg_param.dev_type = p_acb->dev_type;
                reg_param.sec_mask = BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT;
                reg_param.p_srv_name = p_acb->srv_name;
                reg_param.p_srv_desp = p_acb->srv_desp;
                reg_param.p_provider_name = p_acb->provider_name;
                btif_hl_proc_reg_request (p_data->reg.app_idx, p_acb->app_id, &reg_param, btif_hl_cback);
            }
            else
            {
                BTIF_TRACE_DEBUG("reg request is processed state=%d reg_pending=%d", btif_hl_get_state(), p_acb->reg_pending);
            }

            break;

        case BTIF_HL_UNREG_APP:
            BTIF_TRACE_DEBUG("Rcv BTIF_HL_UNREG_APP app_idx=%d", p_data->unreg.app_idx );
            p_acb = BTIF_HL_GET_APP_CB_PTR(p_data->unreg.app_idx);
            if (btif_hl_get_state() == BTIF_HL_STATE_ENABLED)
            {
                if(reg_counter >= 1)
                    BTA_HlUpdate(p_acb->app_id,NULL,FALSE,NULL);
                else
                    BTA_HlDeregister(p_acb->app_id, p_acb->app_handle);
            }
            break;
        case BTIF_HL_UPDATE_MDL:
            BTIF_TRACE_DEBUG("Rcv BTIF_HL_UPDATE_MDL app_idx=%d", p_data->update_mdl.app_idx );
            p_acb = BTIF_HL_GET_APP_CB_PTR(p_data->update_mdl.app_idx);
            break;

        default:
            BTIF_TRACE_ERROR("Unknown event %d", event);
            break;
    }
}

/*******************************************************************************
**
** Function         btif_hl_upstreams_evt
**
** Description      Process HL events
**
** Returns          void
**
*******************************************************************************/
static void btif_hl_upstreams_evt(UINT16 event, char* p_param){
    tBTA_HL *p_data = (tBTA_HL *)p_param;
    UINT8                 app_idx, mcl_idx;
    btif_hl_app_cb_t      *p_acb;
    btif_hl_mcl_cb_t      *p_mcb = NULL;
    BD_ADDR               bd_addr;
    btif_hl_pend_dch_op_t  pending_op;
    BOOLEAN status;

    BTIF_TRACE_DEBUG("%s event %d", __FUNCTION__, event);
    btif_hl_display_calling_process_name();
    switch (event)
    {
        case BTA_HL_REGISTER_CFM_EVT:
            BTIF_TRACE_DEBUG("Rcv BTA_HL_REGISTER_CFM_EVT");
            BTIF_TRACE_DEBUG("app_id=%d app_handle=%d status=%d ",
                              p_data->reg_cfm.app_id,
                              p_data->reg_cfm.app_handle,
                              p_data->reg_cfm.status );

            btif_hl_proc_reg_cfm(p_data);
            break;
        case BTA_HL_SDP_INFO_IND_EVT:
            BTIF_TRACE_DEBUG("Rcv BTA_HL_SDP_INFO_IND_EVT");
            BTIF_TRACE_DEBUG("app_handle=%d ctrl_psm=0x%04x data_psm=0x%04x x_spec=%d mcap_sup_procs=0x%02x",
                              p_data->sdp_info_ind.app_handle,
                              p_data->sdp_info_ind.ctrl_psm,
                              p_data->sdp_info_ind.data_psm,
                              p_data->sdp_info_ind.data_x_spec,
                              p_data->sdp_info_ind.mcap_sup_procs);
            //btif_hl_proc_sdp_info_ind(p_data);
            break;

        case BTA_HL_DEREGISTER_CFM_EVT:
            BTIF_TRACE_DEBUG("Rcv BTA_HL_DEREGISTER_CFM_EVT");
            BTIF_TRACE_DEBUG("app_handle=%d status=%d ",
                              p_data->dereg_cfm.app_handle,
                              p_data->dereg_cfm.status );
            btif_hl_proc_dereg_cfm(p_data);
            break;

        case BTA_HL_SDP_QUERY_CFM_EVT:
            BTIF_TRACE_DEBUG("Rcv BTA_HL_SDP_QUERY_CFM_EVT");
            BTIF_TRACE_DEBUG("app_handle=%d app_id =%d,status =%d",
                              p_data->sdp_query_cfm.app_handle,p_data->sdp_query_cfm.app_id,
                              p_data->sdp_query_cfm.status);

            BTIF_TRACE_DEBUG("DB [%02x] [%02x] [%02x] [%02x] [%02x] [%02x]",
                              p_data->sdp_query_cfm.bd_addr[0], p_data->sdp_query_cfm.bd_addr[1],
                              p_data->sdp_query_cfm.bd_addr[2], p_data->sdp_query_cfm.bd_addr[3],
                              p_data->sdp_query_cfm.bd_addr[4], p_data->sdp_query_cfm.bd_addr[5]);

            if (p_data->sdp_query_cfm.status == BTA_HL_STATUS_OK)
                status = btif_hl_proc_sdp_query_cfm(p_data);
            else
                status = FALSE;

            if (!status)
            {
                BTIF_TRACE_DEBUG("BTA_HL_SDP_QUERY_CFM_EVT Status = %d",
                                                        p_data->sdp_query_cfm.status);
                if (btif_hl_find_app_idx_using_app_id(p_data->sdp_query_cfm.app_id, &app_idx))
                {
                    p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
                    if (btif_hl_find_mcl_idx(app_idx, p_data->sdp_query_cfm.bd_addr, &mcl_idx))
                    {
                        p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
                        if ( (p_mcb->cch_oper ==  BTIF_HL_CCH_OP_MDEP_FILTERING) ||
                             (p_mcb->cch_oper == BTIF_HL_CCH_OP_DCH_OPEN) )
                        {
                            pending_op = p_mcb->pcb.op;
                            switch (pending_op)
                            {
                                case BTIF_HL_PEND_DCH_OP_OPEN:
                                    btif_hl_send_setup_disconnected_cb(app_idx, mcl_idx);
                                    break;
                                case BTIF_HL_PEND_DCH_OP_RECONNECT:
                                case BTIF_HL_PEND_DCH_OP_DELETE_MDL:
                                default:
                                    break;
                            }
                            if (!p_mcb->is_connected)
                                btif_hl_clean_mcl_cb(app_idx, mcl_idx);
                        }
                    }
                }
            }

            break;


        case BTA_HL_CCH_OPEN_CFM_EVT:
            BTIF_TRACE_DEBUG("Rcv BTA_HL_CCH_OPEN_CFM_EVT");
            BTIF_TRACE_DEBUG("app_id=%d,app_handle=%d mcl_handle=%d status =%d",
                              p_data->cch_open_cfm.app_id,
                              p_data->cch_open_cfm.app_handle,
                              p_data->cch_open_cfm.mcl_handle,
                              p_data->cch_open_cfm.status);
            BTIF_TRACE_DEBUG("DB [%02x] [%02x] [%02x] [%02x] [%02x] [%02x]",
                              p_data->cch_open_cfm.bd_addr[0], p_data->cch_open_cfm.bd_addr[1],
                              p_data->cch_open_cfm.bd_addr[2], p_data->cch_open_cfm.bd_addr[3],
                              p_data->cch_open_cfm.bd_addr[4], p_data->cch_open_cfm.bd_addr[5]);

            if (p_data->cch_open_cfm.status == BTA_HL_STATUS_OK ||
                        p_data->cch_open_cfm.status == BTA_HL_STATUS_DUPLICATE_CCH_OPEN)
            {
                status = btif_hl_proc_cch_open_cfm(p_data);
            }
            else
            {
                status = FALSE;
            }

            if (!status)
            {
                if (btif_hl_find_app_idx_using_app_id(p_data->cch_open_cfm.app_id, &app_idx))
                {
                    p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
                    if (btif_hl_find_mcl_idx(app_idx, p_data->cch_open_cfm.bd_addr, &mcl_idx))
                    {
                        p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
                        pending_op = p_mcb->pcb.op;
                        switch (pending_op)
                        {
                            case BTIF_HL_PEND_DCH_OP_OPEN:
                                btif_hl_send_setup_disconnected_cb(app_idx, mcl_idx);
                                break;
                            case BTIF_HL_PEND_DCH_OP_RECONNECT:
                            case BTIF_HL_PEND_DCH_OP_DELETE_MDL:
                            default:
                                break;
                        }
                        btif_hl_clean_mcl_cb(app_idx, mcl_idx);
                    }
                }
            }
            break;

        case BTA_HL_DCH_OPEN_CFM_EVT:
            BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_OPEN_CFM_EVT");
            BTIF_TRACE_DEBUG("mcl_handle=%d mdl_handle=0x%x status=%d ",
                              p_data->dch_open_cfm.mcl_handle,
                              p_data->dch_open_cfm.mdl_handle,
                              p_data->dch_open_cfm.status);
            BTIF_TRACE_DEBUG("first_reliable =%d dch_mode=%d local_mdep_id=%d mdl_id=%d mtu=%d",
                              p_data->dch_open_cfm.first_reliable,
                              p_data->dch_open_cfm.dch_mode,
                              p_data->dch_open_cfm.local_mdep_id,
                              p_data->dch_open_cfm.mdl_id,
                              p_data->dch_open_cfm.mtu);
            if (p_data->dch_open_cfm.status == BTA_HL_STATUS_OK)
            {
                status = btif_hl_proc_dch_open_cfm(p_data);
            }
            else
            {
                status = FALSE;
            }

            if (!status)
            {
                if (btif_hl_find_mcl_idx_using_handle(p_data->dch_open_cfm.mcl_handle,&app_idx, &mcl_idx))
                {
                    p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
                    pending_op = p_mcb->pcb.op;
                    switch (pending_op)
                    {
                        case BTIF_HL_PEND_DCH_OP_OPEN:
                            btif_hl_send_setup_disconnected_cb(app_idx, mcl_idx);
                            break;
                        case BTIF_HL_PEND_DCH_OP_RECONNECT:
                        case BTIF_HL_PEND_DCH_OP_DELETE_MDL:
                        default:
                            break;
                    }
                }
            }
            break;


        case BTA_HL_CCH_OPEN_IND_EVT:
            BTIF_TRACE_DEBUG("Rcv BTA_HL_CCH_OPEN_IND_EVT");
            BTIF_TRACE_DEBUG("app_handle=%d mcl_handle=%d",
                              p_data->cch_open_ind.app_handle,
                              p_data->cch_open_ind.mcl_handle);
            BTIF_TRACE_DEBUG("DB [%02x] [%02x] [%02x] [%02x] [%02x] [%02x]",
                              p_data->cch_open_ind.bd_addr[0], p_data->cch_open_ind.bd_addr[1],
                              p_data->cch_open_ind.bd_addr[2], p_data->cch_open_ind.bd_addr[3],
                              p_data->cch_open_ind.bd_addr[4], p_data->cch_open_ind.bd_addr[5]);

            btif_hl_proc_cch_open_ind(p_data);
            break;

        case BTA_HL_DCH_CREATE_IND_EVT:
            BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_CREATE_IND_EVT");
            BTIF_TRACE_DEBUG("mcl_handle=%d",
                              p_data->dch_create_ind.mcl_handle );
            BTIF_TRACE_DEBUG("local_mdep_id =%d mdl_id=%d cfg=%d",
                              p_data->dch_create_ind.local_mdep_id,
                              p_data->dch_create_ind.mdl_id,
                              p_data->dch_create_ind.cfg);
            btif_hl_proc_create_ind(p_data);
            break;

        case BTA_HL_DCH_OPEN_IND_EVT:
            BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_OPEN_IND_EVT");
            BTIF_TRACE_DEBUG("mcl_handle=%d mdl_handle=0x%x",
                              p_data->dch_open_ind.mcl_handle,
                              p_data->dch_open_ind.mdl_handle );
            BTIF_TRACE_DEBUG("first_reliable =%d dch_mode=%d local_mdep_id=%d mdl_id=%d mtu=%d",
                              p_data->dch_open_ind.first_reliable,
                              p_data->dch_open_ind.dch_mode,
                              p_data->dch_open_ind.local_mdep_id,
                              p_data->dch_open_ind.mdl_id,
                              p_data->dch_open_ind.mtu);

            btif_hl_proc_dch_open_ind(p_data);
            break;

        case BTA_HL_DELETE_MDL_IND_EVT:
            BTIF_TRACE_DEBUG("Rcv BTA_HL_DELETE_MDL_IND_EVT");
            BTIF_TRACE_DEBUG("mcl_handle=%d mdl_id=0x%x",
                              p_data->delete_mdl_ind.mcl_handle,
                              p_data->delete_mdl_ind.mdl_id);
            break;

        case BTA_HL_DELETE_MDL_CFM_EVT:
            BTIF_TRACE_DEBUG("Rcv BTA_HL_DELETE_MDL_CFM_EVT");
            BTIF_TRACE_DEBUG("mcl_handle=%d mdl_id=0x%x status=%d",
                              p_data->delete_mdl_cfm.mcl_handle,
                              p_data->delete_mdl_cfm.mdl_id,
                              p_data->delete_mdl_cfm.status);

            if (btif_hl_find_app_idx_using_deleted_mdl_id( p_data->delete_mdl_cfm.mdl_id,
                                    &app_idx))
            {
                p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
                btif_hl_send_destroyed_cb(p_acb);
                btif_hl_clean_delete_mdl(&p_acb->delete_mdl);
            }
            break;

        case BTA_HL_DCH_RECONNECT_CFM_EVT:
            BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_RECONNECT_CFM_EVT");
            BTIF_TRACE_DEBUG("mcl_handle=%d mdl_handle=%d status=%d   ",
                              p_data->dch_reconnect_cfm.mcl_handle,
                              p_data->dch_reconnect_cfm.mdl_handle,
                              p_data->dch_reconnect_cfm.status);
            BTIF_TRACE_DEBUG("first_reliable =%d dch_mode=%d mdl_id=%d mtu=%d",
                              p_data->dch_reconnect_cfm.first_reliable,
                              p_data->dch_reconnect_cfm.dch_mode,
                              p_data->dch_reconnect_cfm.mdl_id,
                              p_data->dch_reconnect_cfm.mtu);


            if (p_data->dch_reconnect_cfm.status == BTA_HL_STATUS_OK)
            {
                status = btif_hl_proc_dch_reconnect_cfm(p_data);
            }
            else
            {
                status = FALSE;
            }

            if (!status)
            {
                if (btif_hl_find_mcl_idx_using_handle(p_data->dch_open_cfm.mcl_handle,&app_idx, &mcl_idx))
                {
                    p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
                    pending_op = p_mcb->pcb.op;
                    switch (pending_op)
                    {
                        case BTIF_HL_PEND_DCH_OP_OPEN:
                            btif_hl_send_setup_disconnected_cb(app_idx, mcl_idx);
                            break;
                        case BTIF_HL_PEND_DCH_OP_RECONNECT:
                        case BTIF_HL_PEND_DCH_OP_DELETE_MDL:
                        default:
                            break;
                    }
                }
            }

            break;

        case BTA_HL_CCH_CLOSE_CFM_EVT:
            BTIF_TRACE_DEBUG("Rcv BTA_HL_CCH_CLOSE_CFM_EVT");
            BTIF_TRACE_DEBUG("mcl_handle=%d status =%d",
                              p_data->cch_close_cfm.mcl_handle,
                              p_data->cch_close_cfm.status);
            if (p_data->cch_close_cfm.status == BTA_HL_STATUS_OK)
            {
                btif_hl_proc_cch_close_cfm(p_data);
            }
            break;

        case BTA_HL_CCH_CLOSE_IND_EVT:
            BTIF_TRACE_DEBUG("Rcv BTA_HL_CCH_CLOSE_IND_EVT");
            BTIF_TRACE_DEBUG("mcl_handle =%d intentional_close=%s",
                              p_data->cch_close_ind.mcl_handle,
                              (p_data->cch_close_ind.intentional?"Yes":"No"));

            btif_hl_proc_cch_close_ind(p_data);
            break;

        case BTA_HL_DCH_CLOSE_IND_EVT:
            BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_CLOSE_IND_EVT");
            BTIF_TRACE_DEBUG("mdl_handle=%d intentional_close=%s",
                              p_data->dch_close_ind.mdl_handle,
                              (p_data->dch_close_ind.intentional?"Yes":"No") );

            btif_hl_proc_dch_close_ind(p_data);
            break;

        case BTA_HL_DCH_CLOSE_CFM_EVT:
            BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_CLOSE_CFM_EVT");
            BTIF_TRACE_DEBUG("mdl_handle=%d status=%d ",
                              p_data->dch_close_cfm.mdl_handle,
                              p_data->dch_close_cfm.status);

            if (p_data->dch_close_cfm.status == BTA_HL_STATUS_OK)
            {
                btif_hl_proc_dch_close_cfm(p_data);
            }
            break;

        case BTA_HL_DCH_ECHO_TEST_CFM_EVT:
            BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_ECHO_TEST_CFM_EVT");
            BTIF_TRACE_DEBUG("mcl_handle=%d    status=%d",
                              p_data->echo_test_cfm.mcl_handle,
                              p_data->echo_test_cfm.status );
            /* not supported */
            break;


        case BTA_HL_DCH_RECONNECT_IND_EVT:
            BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_RECONNECT_IND_EVT");

            BTIF_TRACE_DEBUG("mcl_handle=%d mdl_handle=5d",
                              p_data->dch_reconnect_ind.mcl_handle,
                              p_data->dch_reconnect_ind.mdl_handle );
            BTIF_TRACE_DEBUG("first_reliable =%d dch_mode=%d mdl_id=%d mtu=%d",
                              p_data->dch_reconnect_ind.first_reliable,
                              p_data->dch_reconnect_ind.dch_mode,
                              p_data->dch_reconnect_ind.mdl_id,
                              p_data->dch_reconnect_ind.mtu);

            btif_hl_proc_dch_reconnect_ind(p_data);
            break;

        case BTA_HL_CONG_CHG_IND_EVT:
            BTIF_TRACE_DEBUG("Rcv BTA_HL_CONG_CHG_IND_EVT");
            BTIF_TRACE_DEBUG("mdl_handle=%d cong =%d",
                              p_data->dch_cong_ind.mdl_handle,
                              p_data->dch_cong_ind.cong);
            btif_hl_proc_dch_cong_ind(p_data);
            break;

        case BTA_HL_DCH_ABORT_IND_EVT:
            BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_ABORT_IND_EVT");
            BTIF_TRACE_DEBUG("mcl_handle=%d",
                              p_data->dch_abort_ind.mcl_handle );
            btif_hl_proc_abort_ind(p_data->dch_abort_ind.mcl_handle);
            break;
        case BTA_HL_DCH_ABORT_CFM_EVT:
            BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_ABORT_CFM_EVT");
            BTIF_TRACE_DEBUG("mcl_handle=%d status =%d",
                              p_data->dch_abort_cfm.mcl_handle,
                              p_data->dch_abort_cfm.status);
            if (p_data->dch_abort_cfm.status == BTA_HL_STATUS_OK)
            {
                btif_hl_proc_abort_cfm(p_data->dch_abort_ind.mcl_handle);
            }
            break;

        case BTA_HL_DCH_SEND_DATA_CFM_EVT:
            BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_SEND_DATA_CFM_EVT");
            BTIF_TRACE_DEBUG("mdl_handle=0x%x status =%d",
                              p_data->dch_send_data_cfm.mdl_handle,
                              p_data->dch_send_data_cfm.status);
            btif_hl_proc_send_data_cfm(p_data->dch_send_data_cfm.mdl_handle,
                                       p_data->dch_send_data_cfm.status);
            break;

        case BTA_HL_DCH_RCV_DATA_IND_EVT:
            BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_RCV_DATA_IND_EVT");
            BTIF_TRACE_DEBUG("mdl_handle=0x%x ",
                              p_data->dch_rcv_data_ind.mdl_handle);
            /* do nothing here */
            break;

        default:
            BTIF_TRACE_DEBUG("Unknown Event (0x%02x)...", event);
            break;
    }
}

/*******************************************************************************
**
** Function         btif_hl_cback
**
** Description      Callback function for HL events
**
** Returns          void
**
*******************************************************************************/
static void btif_hl_cback(tBTA_HL_EVT event, tBTA_HL *p_data){
    bt_status_t status;
    int param_len = 0;
    BTIF_TRACE_DEBUG("%s event %d", __FUNCTION__, event);
    btif_hl_display_calling_process_name();
    switch (event)
    {
        case BTA_HL_REGISTER_CFM_EVT:
            param_len = sizeof(tBTA_HL_REGISTER_CFM);
            break;
        case BTA_HL_SDP_INFO_IND_EVT:
            param_len = sizeof(tBTA_HL_SDP_INFO_IND);
            break;
        case BTA_HL_DEREGISTER_CFM_EVT:
            param_len = sizeof(tBTA_HL_DEREGISTER_CFM);
            break;
        case BTA_HL_SDP_QUERY_CFM_EVT:
            param_len = sizeof(tBTA_HL_SDP_QUERY_CFM);
            break;
        case BTA_HL_CCH_OPEN_CFM_EVT:
            param_len = sizeof(tBTA_HL_CCH_OPEN_CFM);
            break;
        case BTA_HL_DCH_OPEN_CFM_EVT:
            param_len = sizeof(tBTA_HL_DCH_OPEN_CFM);
            break;
        case BTA_HL_CCH_OPEN_IND_EVT:
            param_len = sizeof(tBTA_HL_CCH_OPEN_IND);
            break;
        case BTA_HL_DCH_CREATE_IND_EVT:
            param_len = sizeof(tBTA_HL_DCH_CREATE_IND);
            break;
        case BTA_HL_DCH_OPEN_IND_EVT:
            param_len = sizeof(tBTA_HL_DCH_OPEN_IND);
            break;
        case BTA_HL_DELETE_MDL_IND_EVT:
            param_len = sizeof(tBTA_HL_MDL_IND);
            break;
        case BTA_HL_DELETE_MDL_CFM_EVT:
            param_len = sizeof(tBTA_HL_MDL_CFM);
            break;
        case BTA_HL_DCH_RECONNECT_CFM_EVT:
            param_len = sizeof(tBTA_HL_DCH_OPEN_CFM);
            break;
        case BTA_HL_CCH_CLOSE_CFM_EVT:
            param_len = sizeof(tBTA_HL_MCL_CFM);
            break;
        case BTA_HL_CCH_CLOSE_IND_EVT:
            param_len = sizeof(tBTA_HL_CCH_CLOSE_IND);
            break;
        case BTA_HL_DCH_CLOSE_IND_EVT:
            param_len = sizeof(tBTA_HL_DCH_CLOSE_IND);
            break;
        case BTA_HL_DCH_CLOSE_CFM_EVT:
            param_len = sizeof(tBTA_HL_MDL_CFM);
            break;
        case BTA_HL_DCH_ECHO_TEST_CFM_EVT:
            param_len = sizeof(tBTA_HL_MCL_CFM);
            break;
        case BTA_HL_DCH_RECONNECT_IND_EVT:
            param_len = sizeof(tBTA_HL_DCH_OPEN_IND);
            break;
        case BTA_HL_CONG_CHG_IND_EVT:
            param_len = sizeof(tBTA_HL_DCH_CONG_IND);
            break;
        case BTA_HL_DCH_ABORT_IND_EVT:
            param_len = sizeof(tBTA_HL_MCL_IND);
            break;
        case BTA_HL_DCH_ABORT_CFM_EVT:
            param_len = sizeof(tBTA_HL_MCL_CFM);
            break;
        case BTA_HL_DCH_SEND_DATA_CFM_EVT:
            param_len = sizeof(tBTA_HL_MDL_CFM);
            break;
        case BTA_HL_DCH_RCV_DATA_IND_EVT:
            param_len = sizeof(tBTA_HL_MDL_IND);
            break;
        default:
            param_len = sizeof(tBTA_HL_MDL_IND);
            break;
    }
    status = btif_transfer_context(btif_hl_upstreams_evt, (uint16_t)event, (void*)p_data, param_len, NULL);

    /* catch any failed context transfers */
    ASSERTC(status == BT_STATUS_SUCCESS, "context transfer failed", status);
}

/*******************************************************************************
**
** Function         btif_hl_upstreams_ctrl_evt
**
** Description      Callback function for HL control events in the BTIF task context
**
** Returns          void
**
*******************************************************************************/
static void btif_hl_upstreams_ctrl_evt(UINT16 event, char* p_param){
    tBTA_HL_CTRL *p_data = (tBTA_HL_CTRL *) p_param;
    UINT8               i;
    tBTA_HL_REG_PARAM   reg_param;
    btif_hl_app_cb_t    *p_acb;

    BTIF_TRACE_DEBUG("%s event %d", __FUNCTION__, event);
    btif_hl_display_calling_process_name();

    switch ( event )
    {
        case BTA_HL_CTRL_ENABLE_CFM_EVT:
            BTIF_TRACE_DEBUG("Rcv BTA_HL_CTRL_ENABLE_CFM_EVT");
            BTIF_TRACE_DEBUG("status=%d", p_data->enable_cfm.status);

            if (p_data->enable_cfm.status == BTA_HL_STATUS_OK)
            {
                btif_hl_set_state(BTIF_HL_STATE_ENABLED);


                for (i=0; i < BTA_HL_NUM_APPS ; i ++)
                {
                    p_acb = BTIF_HL_GET_APP_CB_PTR(i);
                    if (p_acb->in_use && p_acb->reg_pending)
                    {
                        p_acb->reg_pending = FALSE;
                        reg_param.dev_type = p_acb->dev_type;
                        reg_param.sec_mask = BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT;
                        reg_param.p_srv_name = p_acb->srv_name;
                        reg_param.p_srv_desp = p_acb->srv_desp;
                        reg_param.p_provider_name = p_acb->provider_name;

                        BTIF_TRACE_DEBUG("Register pending app_id=%d", p_acb->app_id);
                        btif_hl_proc_reg_request (i, p_acb->app_id, &reg_param, btif_hl_cback);
                    }
                }
            }

            break;
        case BTA_HL_CTRL_DISABLE_CFM_EVT:
            BTIF_TRACE_DEBUG("Rcv BTA_HL_CTRL_DISABLE_CFM_EVT");
            BTIF_TRACE_DEBUG("status=%d",
                              p_data->disable_cfm.status);

            if (p_data->disable_cfm.status == BTA_HL_STATUS_OK)
            {
                memset(p_btif_hl_cb, 0, sizeof(btif_hl_cb_t));
                btif_hl_set_state(BTIF_HL_STATE_DISABLED);
            }

            break;
        default:
            break;
    }
}

/*******************************************************************************
**
** Function         btif_hl_ctrl_cback
**
** Description      Callback function for HL control events
**
** Returns          void
**
*******************************************************************************/
static void btif_hl_ctrl_cback(tBTA_HL_CTRL_EVT event, tBTA_HL_CTRL *p_data){
    bt_status_t status;
    int param_len = 0;

    BTIF_TRACE_DEBUG("%s event %d", __FUNCTION__, event);
    btif_hl_display_calling_process_name();

    switch ( event )
    {
        case BTA_HL_CTRL_ENABLE_CFM_EVT:
        case BTA_HL_CTRL_DISABLE_CFM_EVT:
            param_len = sizeof(tBTA_HL_CTRL_ENABLE_DISABLE);
            break;
        default:
            break;
    }

    status = btif_transfer_context(btif_hl_upstreams_ctrl_evt, (uint16_t)event, (void*)p_data, param_len, NULL);
    ASSERTC(status == BT_STATUS_SUCCESS, "context transfer failed", status);
}
/*******************************************************************************
**
** Function         connect_channel
**
** Description     connect a data channel
**
** Returns         bt_status_t
**
*******************************************************************************/
static bt_status_t connect_channel(int app_id, bt_bdaddr_t *bd_addr, int mdep_cfg_index, int *channel_id){
    UINT8                   app_idx, mcl_idx;
    btif_hl_app_cb_t        *p_acb = NULL;
    btif_hl_pending_chan_cb_t   *p_pcb = NULL;
    btif_hl_mcl_cb_t        *p_mcb=NULL;
    bt_status_t             status = BT_STATUS_SUCCESS;
    tBTA_HL_DCH_OPEN_PARAM  dch_open;
    BD_ADDR                 bda;
    UINT8 i;

    CHECK_BTHL_INIT();
    BTIF_TRACE_EVENT("%s", __FUNCTION__);
    btif_hl_display_calling_process_name();


    for (i=0; i<6; i++)
    {
        bda[i] = (UINT8) bd_addr->address[i];
    }
    if (btif_hl_find_app_idx(((UINT8)app_id), &app_idx))
    {
        p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
        if (btif_hl_find_mcl_idx(app_idx, bda , &mcl_idx))
        {
            p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
            if (p_mcb->is_connected)
            {
                dch_open.ctrl_psm = p_mcb->ctrl_psm;
                dch_open.local_mdep_id = p_acb->sup_feature.mdep[mdep_cfg_index].mdep_id;
                BTIF_TRACE_DEBUG("connect_channel: app_idx =%d, mdep_cfg_indx =%d, mdep_id =%d app_id= %d", app_idx,
                                                mdep_cfg_index, dch_open.local_mdep_id, app_id);
                if (btif_hl_find_peer_mdep_id(p_acb->app_id, p_mcb->bd_addr,
                                              p_acb->sup_feature.mdep[mdep_cfg_index].mdep_cfg.mdep_role,
                                              p_acb->sup_feature.mdep[mdep_cfg_index].mdep_cfg.data_cfg[0].data_type, &dch_open.peer_mdep_id ))
                {
                    dch_open.local_cfg = p_acb->channel_type[mdep_cfg_index];
                    if ((p_acb->sup_feature.mdep[mdep_cfg_index].mdep_cfg.mdep_role == BTA_HL_MDEP_ROLE_SOURCE)
                        && !btif_hl_is_the_first_reliable_existed(app_idx,mcl_idx))
                    {
                        dch_open.local_cfg = BTA_HL_DCH_CFG_RELIABLE;
                    }
                    dch_open.sec_mask = (BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT);

                    if( !btif_hl_dch_open(p_acb->app_id, bda, &dch_open,
                                              mdep_cfg_index, BTIF_HL_PEND_DCH_OP_OPEN, channel_id ))
                    {
                        status = BT_STATUS_FAIL;
                        BTIF_TRACE_EVENT("%s loc0 status = BT_STATUS_FAIL", __FUNCTION__);
                    }
                }
                else
                {
                    p_mcb->cch_oper = BTIF_HL_CCH_OP_MDEP_FILTERING;

                    p_pcb = BTIF_HL_GET_PCB_PTR(app_idx, mcl_idx);
                    p_pcb->in_use = TRUE;
                    p_pcb->mdep_cfg_idx = mdep_cfg_index;
                    memcpy(p_pcb->bd_addr, bda, sizeof(BD_ADDR));
                    p_pcb->op = BTIF_HL_PEND_DCH_OP_OPEN;
                    BTA_HlSdpQuery(app_id,p_acb->app_handle, bda);
                }
            }
            else
            {
                status = BT_STATUS_FAIL;
            }
        }
        else
        {
            p_acb->filter.num_elems =1;
            p_acb->filter.elem[0].data_type = p_acb->sup_feature.mdep[mdep_cfg_index].mdep_cfg.data_cfg[mdep_cfg_index].data_type;
            if (p_acb->sup_feature.mdep[mdep_cfg_index].mdep_cfg.mdep_role == BTA_HL_MDEP_ROLE_SINK)
                p_acb->filter.elem[0].peer_mdep_role = BTA_HL_MDEP_ROLE_SOURCE;
            else
                p_acb->filter.elem[0].peer_mdep_role = BTA_HL_MDEP_ROLE_SINK;

            if ( !btif_hl_cch_open(p_acb->app_id, bda, 0, mdep_cfg_index,
                                   BTIF_HL_PEND_DCH_OP_OPEN,
                                   channel_id))
            {
                status = BT_STATUS_FAIL;
            }
        }
    }
    else
    {
        status = BT_STATUS_FAIL;
    }

    BTIF_TRACE_DEBUG("%s status=%d channel_id=0x%08x", __FUNCTION__, status, *channel_id);

    return status;
}
/*******************************************************************************
**
** Function         destroy_channel
**
** Description      destroy a data channel
**
** Returns         bt_status_t
**
*******************************************************************************/
static bt_status_t destroy_channel(int channel_id){
    UINT8 app_idx, mcl_idx, mdl_idx, mdl_cfg_idx, app_id, mdep_cfg_idx;
    bt_status_t status = BT_STATUS_SUCCESS;
    btif_hl_mdl_cfg_t     *p_mdl;
    btif_hl_mcl_cb_t     *p_mcb;
    btif_hl_mdl_cb_t     *p_dcb;
    btif_hl_app_cb_t     *p_acb;

    CHECK_BTHL_INIT();
    BTIF_TRACE_EVENT("%s channel_id=0x%08x", __FUNCTION__, channel_id);
    btif_hl_display_calling_process_name();


    if (btif_hl_if_channel_setup_pending(channel_id, &app_idx, &mcl_idx))
    {
        btif_hl_dch_abort(app_idx, mcl_idx);
    }
    else
    {
        if (btif_hl_find_mdl_cfg_idx_using_channel_id(channel_id, &app_idx, &mdl_cfg_idx))
 //       if(btif_hl_find_mdl_idx_using_channel_id(channel_id, &app_idx,&mcl_idx, &mdl_idx))
        {
            p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
            if (!p_acb->delete_mdl.active)
            {
                p_mdl =BTIF_HL_GET_MDL_CFG_PTR(app_idx, mdl_cfg_idx);
                p_acb->delete_mdl.active = TRUE;
                p_acb->delete_mdl.mdl_id = p_mdl->base.mdl_id;
                p_acb->delete_mdl.channel_id = channel_id;
                p_acb->delete_mdl.mdep_cfg_idx = p_mdl->extra.mdep_cfg_idx;
                memcpy(p_acb->delete_mdl.bd_addr, p_mdl->base.peer_bd_addr,sizeof(BD_ADDR));

                if (btif_hl_find_mcl_idx(app_idx, p_mdl->base.peer_bd_addr, &mcl_idx))
                {
                    p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
                    if (p_mcb->is_connected)
                    {
                        BTIF_TRACE_DEBUG("calling BTA_HlDeleteMdl mdl_id=%d",p_acb->delete_mdl.mdl_id );
                        BTA_HlDeleteMdl(p_mcb->mcl_handle, p_acb->delete_mdl.mdl_id);
                    }
                    else
                    {
                        status = BT_STATUS_FAIL;
                    }
                }
                else
                {
                    BTIF_TRACE_DEBUG("btif_hl_delete_mdl calling btif_hl_cch_open"  );
                    mdep_cfg_idx = p_mdl->extra.mdep_cfg_idx;
                    p_acb->filter.num_elems =1;
                    p_acb->filter.elem[0].data_type = p_acb->sup_feature.mdep[mdep_cfg_idx].mdep_cfg.data_cfg[mdep_cfg_idx].data_type;
                    if (p_acb->sup_feature.mdep[mdep_cfg_idx].mdep_cfg.mdep_role == BTA_HL_MDEP_ROLE_SINK)
                        p_acb->filter.elem[0].peer_mdep_role = BTA_HL_MDEP_ROLE_SOURCE;
                    else
                        p_acb->filter.elem[0].peer_mdep_role = BTA_HL_MDEP_ROLE_SINK;
                    if (btif_hl_cch_open(p_acb->app_id, p_acb->delete_mdl.bd_addr, 0,
                                         mdep_cfg_idx,
                                         BTIF_HL_PEND_DCH_OP_DELETE_MDL, NULL))
                    {
                        status = BT_STATUS_FAIL;
                    }
                }

                if (  status == BT_STATUS_FAIL)
                {
                    /* fail for now  */
                    btif_hl_clean_delete_mdl(&p_acb->delete_mdl);
                }
            }
            else
            {
                status = BT_STATUS_BUSY;
            }
        }
        else
        {
            status = BT_STATUS_FAIL;
        }

    }
    return status;
}
/*******************************************************************************
**
** Function         unregister_application
**
** Description     unregister an HDP application
**
** Returns         bt_status_t
**
*******************************************************************************/
static bt_status_t unregister_application(int app_id){
    btif_hl_app_cb_t    *p_acb;
    UINT8               app_idx;
    int                 len;
    bt_status_t         status = BT_STATUS_SUCCESS;
    btif_hl_evt_cb_t    evt_param;

    CHECK_BTHL_INIT();
    BTIF_TRACE_EVENT("%s app_id=%d", __FUNCTION__, app_id);
    btif_hl_display_calling_process_name();

    if (btif_hl_find_app_idx(((UINT8)app_id), &app_idx))
    {
        evt_param.unreg.app_idx = app_idx;
        p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
        reg_counter --;
        len = sizeof(btif_hl_unreg_t);
        status = btif_transfer_context (btif_hl_proc_cb_evt, BTIF_HL_UNREG_APP,
                                        (char*) &evt_param, len, NULL);
        ASSERTC(status == BT_STATUS_SUCCESS, "context transfer failed", status);
    }
    else
    {
        status  = BT_STATUS_FAIL;
    }

    BTIF_TRACE_DEBUG("de-reg return status=%d", status);
    return status;
}
/*******************************************************************************
**
** Function         register_application
**
** Description     register an HDP application
**
** Returns         bt_status_t
**
*******************************************************************************/
static bt_status_t register_application(bthl_reg_param_t *p_reg_param, int *app_id){
    btif_hl_app_cb_t            *p_acb;
    tBTA_HL_SUP_FEATURE         *p_sup;
    tBTA_HL_MDEP_CFG            *p_cfg;
    tBTA_HL_MDEP_DATA_TYPE_CFG  *p_data;
    UINT8                       app_idx=0, i=0, pending_reg_idx=0;
    bthl_mdep_cfg_t             *p_mdep_cfg;
    bt_status_t                 status = BT_STATUS_SUCCESS;
    btif_hl_evt_cb_t            evt_param;
    int                         len;

    CHECK_BTHL_INIT();
    BTIF_TRACE_EVENT("%s", __FUNCTION__);
    btif_hl_display_calling_process_name();

    if (btif_hl_get_state() == BTIF_HL_STATE_DISABLED)
    {
        btif_hl_init();
        btif_hl_set_state(BTIF_HL_STATE_ENABLING);
        BTA_HlEnable(btif_hl_ctrl_cback);
    }

    if (!btif_hl_find_avail_app_idx(&app_idx))
    {
        BTIF_TRACE_ERROR("Unable to allocate a new application control block");
        return BT_STATUS_FAIL;
    }

    p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
    p_acb->in_use = TRUE;


    p_acb->app_id = btif_hl_get_next_app_id();

    if (p_reg_param->application_name != NULL )
        strncpy(p_acb->application_name, p_reg_param->application_name, BTIF_HL_APPLICATION_NAME_LEN);

    if (p_reg_param->provider_name != NULL )
        strncpy(p_acb->provider_name, p_reg_param->provider_name, BTA_PROVIDER_NAME_LEN);

    if (p_reg_param->srv_name != NULL )
        strncpy(p_acb->srv_name, p_reg_param->srv_name, BTA_SERVICE_NAME_LEN);

    if (p_reg_param->srv_desp != NULL )
        strncpy(p_acb->srv_desp, p_reg_param->srv_desp, BTA_SERVICE_DESP_LEN);

    p_sup = &p_acb->sup_feature;
    p_sup->advertize_source_sdp = TRUE;
    p_sup->echo_cfg.max_rx_apdu_size = BTIF_HL_ECHO_MAX_TX_RX_APDU_SIZE;
    p_sup->echo_cfg.max_tx_apdu_size = BTIF_HL_ECHO_MAX_TX_RX_APDU_SIZE;
    p_sup->num_of_mdeps = p_reg_param->number_of_mdeps;

    for (i=0, p_mdep_cfg = p_reg_param->mdep_cfg ; i<  p_sup->num_of_mdeps; i++, p_mdep_cfg++  )
    {
        p_cfg = &p_sup->mdep[i].mdep_cfg;
        p_cfg->num_of_mdep_data_types = 1;
        p_data  = &p_cfg->data_cfg[0];

        if ( !btif_hl_get_bta_mdep_role(p_mdep_cfg->mdep_role, &(p_cfg->mdep_role)))
        {
            BTIF_TRACE_ERROR("Invalid mdep_role=%d", p_mdep_cfg->mdep_role);
            status = BT_STATUS_FAIL;
            break;
        }
        else
        {
            if (p_cfg->mdep_role == BTA_HL_MDEP_ROLE_SINK )
                p_sup->app_role_mask |= BTA_HL_MDEP_ROLE_MASK_SINK;
            else
                p_sup->app_role_mask |=  BTA_HL_MDEP_ROLE_MASK_SOURCE;

            if ( (p_sup->app_role_mask & BTA_HL_MDEP_ROLE_MASK_SINK) &&
                 (p_sup->app_role_mask & BTA_HL_MDEP_ROLE_MASK_SINK) )
            {
                p_acb->dev_type = BTA_HL_DEVICE_TYPE_DUAL;
            }
            else if ( p_sup->app_role_mask & BTA_HL_MDEP_ROLE_MASK_SINK )
                p_acb->dev_type = BTA_HL_DEVICE_TYPE_SINK;
            else

                p_acb->dev_type = BTA_HL_DEVICE_TYPE_SOURCE;

            p_data->data_type = (UINT16) p_mdep_cfg->data_type;
            p_data->max_rx_apdu_size = btif_hl_get_max_rx_apdu_size(p_cfg->mdep_role, p_data->data_type);
            p_data->max_tx_apdu_size = btif_hl_get_max_tx_apdu_size(p_cfg->mdep_role, p_data->data_type);

            if (p_mdep_cfg->mdep_description != NULL )
                strncpy(p_data->desp, p_mdep_cfg->mdep_description, BTA_SERVICE_DESP_LEN);

            if ( !btif_hl_get_bta_channel_type(p_mdep_cfg->channel_type, &(p_acb->channel_type[i])))
            {
                BTIF_TRACE_ERROR("Invalid channel_type=%d", p_mdep_cfg->channel_type);
                status = BT_STATUS_FAIL;
                break;
            }
        }
    }

    if (status == BT_STATUS_SUCCESS)
    {
        *app_id = (int) p_acb->app_id;
        evt_param.reg.app_idx = app_idx;
        len = sizeof(btif_hl_reg_t);
        p_acb->reg_pending = TRUE;
        reg_counter++;
        BTIF_TRACE_DEBUG("calling btif_transfer_context status=%d app_id=%d", status, *app_id);
        status = btif_transfer_context (btif_hl_proc_cb_evt, BTIF_HL_REG_APP,
                                        (char*) &evt_param, len, NULL);
        ASSERTC(status == BT_STATUS_SUCCESS, "context transfer failed", status);

    }
    else
    {
        btif_hl_free_app_idx(app_idx);
    }

    BTIF_TRACE_DEBUG("register_application status=%d app_id=%d", status, *app_id);
    return status;
}

/*******************************************************************************
**
** Function      btif_hl_save_mdl_cfg
**
** Description  Save the MDL configuration
**
** Returns      BOOLEAN
**
*******************************************************************************/
BOOLEAN  btif_hl_save_mdl_cfg(UINT8 mdep_id, UINT8 item_idx,
                              tBTA_HL_MDL_CFG *p_mdl_cfg){
    btif_hl_mdl_cfg_t   *p_mdl=NULL;
    BOOLEAN             success = FALSE;
    btif_hl_app_cb_t    *p_acb;
    btif_hl_mcl_cb_t    *p_mcb;
    UINT8               app_idx, mcl_idx, mdl_idx, len;
    bt_status_t         bt_status;
    btif_hl_evt_cb_t    evt_param;
    int                 *p_channel_id;

    BTIF_TRACE_DEBUG("%s mdep_id=%d item_idx=%d, local_mdep_id=%d mdl_id=0x%x dch_mode=%d",
                      __FUNCTION__, mdep_id, item_idx, p_mdl_cfg->local_mdep_id,
                      p_mdl_cfg->mdl_id, p_mdl_cfg->dch_mode );

    if(btif_hl_find_app_idx_using_mdepId(mdep_id,&app_idx))
    {
        p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
        p_mdl = BTIF_HL_GET_MDL_CFG_PTR(app_idx, item_idx);
        p_channel_id = BTIF_HL_GET_MDL_CFG_CHANNEL_ID_PTR(app_idx, item_idx);
        if (p_mdl)
        {
            memcpy(&p_mdl->base, p_mdl_cfg, sizeof(tBTA_HL_MDL_CFG));
            if (btif_hl_find_mcl_idx(app_idx, p_mdl->base.peer_bd_addr , &mcl_idx))
            {
                p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
                if (p_mcb->pcb.in_use)
                    *p_channel_id = p_mcb->pcb.channel_id;
                else
                    *p_channel_id = btif_hl_get_next_channel_id(p_acb->app_id);
                p_mdl->extra.mdep_cfg_idx = p_mcb->pcb.mdep_cfg_idx;
                p_mdl->extra.data_type = p_acb->sup_feature.mdep[p_mcb->pcb.mdep_cfg_idx].mdep_cfg.data_cfg[0].data_type;

                if (!btif_hl_find_peer_mdep_id(p_acb->app_id, p_mcb->bd_addr,
                                               p_acb->sup_feature.mdep[p_mcb->pcb.mdep_cfg_idx].mdep_cfg.mdep_role,
                                               p_acb->sup_feature.mdep[p_mcb->pcb.mdep_cfg_idx].mdep_cfg.data_cfg[0].data_type,
                                               &p_mdl->extra.peer_mdep_id))
                {
                    p_mdl->extra.peer_mdep_id = BTA_HL_INVALID_MDEP_ID;
                }
                BTIF_TRACE_DEBUG("%s app_idx=%d item_idx=%d mld_id=0x%x",
                                  __FUNCTION__, app_idx, item_idx, p_mdl->base.mdl_id);
                evt_param.update_mdl.app_idx = app_idx;
                len = sizeof(btif_hl_update_mdl_t);
                BTIF_TRACE_DEBUG("send BTIF_HL_UPDATE_MDL event app_idx=%d  ",app_idx);
                if ((bt_status = btif_transfer_context (btif_hl_proc_cb_evt, BTIF_HL_UPDATE_MDL,
                                                        (char*) &evt_param, len, NULL)) == BT_STATUS_SUCCESS)
                {
                    success = TRUE;
                }
                ASSERTC(bt_status == BT_STATUS_SUCCESS, "context transfer failed", bt_status);
            }
        }
    }
    BTIF_TRACE_DEBUG("%s success=%d  ",__FUNCTION__, success );

    return success;
}

/*******************************************************************************
**
** Function      btif_hl_delete_mdl_cfg
**
** Description  Delete the MDL configuration
**
** Returns      BOOLEAN
**
*******************************************************************************/
BOOLEAN  btif_hl_delete_mdl_cfg(UINT8 mdep_id, UINT8 item_idx){
    btif_hl_mdl_cfg_t     *p_mdl=NULL;
    BOOLEAN             success = FALSE;
    btif_hl_app_cb_t      *p_acb;
    UINT8               app_idx, len;
    bt_status_t         bt_status;
    btif_hl_evt_cb_t    evt_param;

    if(btif_hl_find_app_idx_using_mdepId(mdep_id,&app_idx))
    {

        p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);

        p_mdl = BTIF_HL_GET_MDL_CFG_PTR(app_idx, item_idx);
        if (p_mdl)
        {
            memset(p_mdl, 0, sizeof(btif_hl_mdl_cfg_t));
            evt_param.update_mdl.app_idx = app_idx;
            len = sizeof(btif_hl_update_mdl_t);
            BTIF_TRACE_DEBUG("send BTIF_HL_UPDATE_MDL event app_idx=%d  ",app_idx);
            if ((bt_status = btif_transfer_context (btif_hl_proc_cb_evt, BTIF_HL_UPDATE_MDL,
                                                    (char*) &evt_param, len, NULL)) == BT_STATUS_SUCCESS)
            {
                success = TRUE;
            }
            ASSERTC(bt_status == BT_STATUS_SUCCESS, "context transfer failed", bt_status);
        }
    }

    BTIF_TRACE_DEBUG("%s success=%d  ",__FUNCTION__, success );
    return success;
}

/*******************************************************************************
**
** Function         init
**
** Description     initializes the hl interface
**
** Returns         bt_status_t
**
*******************************************************************************/
static bt_status_t init( bthl_callbacks_t* callbacks ){
    bt_status_t status = BT_STATUS_SUCCESS;

    BTIF_TRACE_EVENT("%s", __FUNCTION__);
    btif_hl_display_calling_process_name();
    bt_hl_callbacks_cb = *callbacks;
    bt_hl_callbacks = &bt_hl_callbacks_cb;
    btif_hl_soc_thread_init();
    reg_counter = 0;
    return status;
}
/*******************************************************************************
**
** Function         cleanup
**
** Description      Closes the HL interface
**
** Returns          void
**
*******************************************************************************/
static void  cleanup( void ){
    BTIF_TRACE_EVENT("%s", __FUNCTION__);
    btif_hl_display_calling_process_name();
    if (bt_hl_callbacks)
    {
        btif_disable_service(BTA_HDP_SERVICE_ID);
        bt_hl_callbacks = NULL;
        reg_counter = 0;
    }

    btif_hl_disable();
    btif_hl_close_select_thread();
}

static const bthl_interface_t bthlInterface = {
    sizeof(bthl_interface_t),
    init,
    register_application,
    unregister_application,
    connect_channel,
    destroy_channel,
    cleanup,
};


/*******************************************************************************
**
** Function         btif_hl_get_interface
**
** Description      Get the hl callback interface
**
** Returns          bthf_interface_t
**
*******************************************************************************/
const bthl_interface_t *btif_hl_get_interface(){
    BTIF_TRACE_EVENT("%s", __FUNCTION__);
    return &bthlInterface;
}

/*******************************************************************************
**
** Function btif_hl_update_maxfd
**
** Description Update the max fd if the input fd is greater than the current max fd
**
** Returns int
**
*******************************************************************************/
int btif_hl_update_maxfd( int max_org_s){
    btif_hl_soc_cb_t      *p_scb = NULL;
    int maxfd=0;

    BTIF_TRACE_DEBUG("btif_hl_update_maxfd max_org_s= %d", max_org_s);

    maxfd = max_org_s;
    if (!GKI_queue_is_empty(&soc_queue))
    {
        p_scb = (btif_hl_soc_cb_t *)GKI_getfirst((void *)&soc_queue);
        if (maxfd < p_scb->max_s)
        {
            maxfd = p_scb->max_s;
            BTIF_TRACE_DEBUG("btif_hl_update_maxfd 1 maxfd=%d", maxfd);
        }
        while (p_scb != NULL)
        {
            if (maxfd < p_scb->max_s)
            {
                maxfd = p_scb->max_s;
                BTIF_TRACE_DEBUG("btif_hl_update_maxfd 2 maxfd=%d", maxfd);
            }
            p_scb = (btif_hl_soc_cb_t *)GKI_getnext((void *)p_scb );
        }
    }

    BTIF_TRACE_DEBUG("btif_hl_update_maxfd final *p_max_s=%d", maxfd);
    return maxfd;
}
/*******************************************************************************
**
** Function btif_hl_get_socket_state
**
** Description get socket state
**
** Returns btif_hl_soc_state_t
**
*******************************************************************************/
btif_hl_soc_state_t btif_hl_get_socket_state(btif_hl_soc_cb_t *p_scb){
    BTIF_TRACE_DEBUG("btif_hl_get_socket_state state=%d", p_scb->state);
    return p_scb->state;
}
/*******************************************************************************
**
** Function btif_hl_set_socket_state
**
** Description set socket state
**
** Returns void
**
*******************************************************************************/
void btif_hl_set_socket_state(btif_hl_soc_cb_t *p_scb, btif_hl_soc_state_t new_state){
    BTIF_TRACE_DEBUG("btif_hl_set_socket_state %d---->%d", p_scb->state, new_state);
    p_scb->state = new_state;
}
/*******************************************************************************
**
** Function btif_hl_release_mcl_sockets
**
** Description Release all sockets on the MCL
**
** Returns void
**
*******************************************************************************/
void btif_hl_release_mcl_sockets(UINT8 app_idx, UINT8 mcl_idx){
    btif_hl_soc_cb_t    *p_scb = NULL;
    UINT8               i;
    btif_hl_mdl_cb_t    *p_dcb;
    BOOLEAN             found= FALSE;
    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
    for (i=0; i < BTA_HL_NUM_MDLS_PER_MCL ; i ++)
    {
        p_dcb = BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, i);
        if (p_dcb && p_dcb->in_use && p_dcb->p_scb)
        {
            BTIF_TRACE_DEBUG("found socket for app_idx=%d mcl_id=%d, mdl_idx=%d", app_idx, mcl_idx, i);
            btif_hl_set_socket_state (p_dcb->p_scb, BTIF_HL_SOC_STATE_W4_REL);
            p_dcb->p_scb = NULL;
            found = TRUE;
        }
    }
    if (found)
        btif_hl_select_close_connected();
}
/*******************************************************************************
**
** Function btif_hl_release_socket
**
** Description release a specified socket
**
** Returns void
**
*******************************************************************************/
void btif_hl_release_socket(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx){
    btif_hl_soc_cb_t       *p_scb = NULL;
    btif_hl_mdl_cb_t      *p_dcb = BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);

    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
    BTIF_TRACE_DEBUG("app_idx=%d mcl_idx=%d mdl_idx=%d",  app_idx, mcl_idx, mdl_idx  );

    if (p_dcb && p_dcb->p_scb)
    {
        p_scb = p_dcb->p_scb;
        btif_hl_set_socket_state(p_scb,  BTIF_HL_SOC_STATE_W4_REL);
        p_dcb->p_scb = NULL;
        btif_hl_select_close_connected();
    }
}
/*******************************************************************************
**
** Function btif_hl_create_socket
**
** Description create a socket
**
** Returns BOOLEAN
**
*******************************************************************************/
BOOLEAN btif_hl_create_socket(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx){
    btif_hl_mcl_cb_t      *p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
    btif_hl_mdl_cb_t      *p_dcb = BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
    btif_hl_soc_cb_t      *p_scb = NULL;
    UINT8                 soc_idx;
    BOOLEAN               status = FALSE;

    BTIF_TRACE_DEBUG("%s", __FUNCTION__);

    if (p_dcb && ((p_scb = (btif_hl_soc_cb_t *)GKI_getbuf((UINT16)sizeof(btif_hl_soc_cb_t)))!=NULL))
    {
        if (socketpair(AF_UNIX, SOCK_STREAM, 0, p_scb->socket_id) >= 0)
        {
            BTIF_TRACE_DEBUG("socket id[0]=%d id[1]=%d",p_scb->socket_id[0], p_scb->socket_id[1] );
            p_dcb->p_scb = p_scb;
            p_scb->app_idx = app_idx;
            p_scb->mcl_idx = mcl_idx;
            p_scb->mdl_idx = mdl_idx;
            p_scb->channel_id = p_dcb->channel_id;
            p_scb->mdep_cfg_idx = p_dcb->local_mdep_cfg_idx;
            memcpy(p_scb->bd_addr, p_mcb->bd_addr,sizeof(BD_ADDR));
            btif_hl_set_socket_state(p_scb,  BTIF_HL_SOC_STATE_W4_ADD);
            p_scb->max_s = p_scb->socket_id[1];
            GKI_enqueue(&soc_queue, (void *) p_scb);
            btif_hl_select_wakeup();
            status = TRUE;
        }
        else
        {

            btif_hl_free_buf((void **)&p_scb);
        }
    }

    BTIF_TRACE_DEBUG("%s status=%d", __FUNCTION__, status);
    return status;
}
/*******************************************************************************
**
** Function btif_hl_add_socket_to_set
**
** Description Add a socket
**
** Returns void
**
*******************************************************************************/
void btif_hl_add_socket_to_set( fd_set *p_org_set){
    btif_hl_soc_cb_t                *p_scb = NULL;
    btif_hl_mdl_cb_t                *p_dcb = NULL;
    btif_hl_mcl_cb_t                *p_mcb = NULL;
    btif_hl_app_cb_t                *p_acb = NULL;
    btif_hl_evt_cb_t                evt_param;
    bt_status_t                     status;
    int                             len;

    BTIF_TRACE_DEBUG("entering %s",__FUNCTION__);

    if (!GKI_queue_is_empty(&soc_queue))
    {
        p_scb = (btif_hl_soc_cb_t *)GKI_getfirst((void *)&soc_queue);
        BTIF_TRACE_DEBUG("btif_hl_add_socket_to_set first p_scb=0x%x", p_scb);
        while (p_scb != NULL)
        {
            if (btif_hl_get_socket_state(p_scb) == BTIF_HL_SOC_STATE_W4_ADD)
            {
                btif_hl_set_socket_state(p_scb,   BTIF_HL_SOC_STATE_W4_READ);
                FD_SET(p_scb->socket_id[1], p_org_set);
                BTIF_TRACE_DEBUG("found and set socket_id=%d is_set=%d", p_scb->socket_id[1], FD_ISSET(p_scb->socket_id[1], p_org_set));
                p_mcb = BTIF_HL_GET_MCL_CB_PTR(p_scb->app_idx, p_scb->mcl_idx);
                p_dcb = BTIF_HL_GET_MDL_CB_PTR(p_scb->app_idx, p_scb->mcl_idx, p_scb->mdl_idx);
                p_acb = BTIF_HL_GET_APP_CB_PTR(p_scb->app_idx);
                if (p_mcb && p_dcb)
                {
                    btif_hl_stop_timer_using_handle(p_mcb->mcl_handle);
                    evt_param.chan_cb.app_id = p_acb->app_id;
                    memcpy(evt_param.chan_cb.bd_addr, p_mcb->bd_addr, sizeof(BD_ADDR));
                    evt_param.chan_cb.channel_id = p_dcb->channel_id;
                    evt_param.chan_cb.fd = p_scb->socket_id[0];
                    evt_param.chan_cb.mdep_cfg_index = (int ) p_dcb->local_mdep_cfg_idx;
                    evt_param.chan_cb.cb_state = BTIF_HL_CHAN_CB_STATE_CONNECTED_PENDING;
                    len = sizeof(btif_hl_send_chan_state_cb_t);
                    status = btif_transfer_context (btif_hl_proc_cb_evt, BTIF_HL_SEND_CONNECTED_CB,
                                                    (char*) &evt_param, len, NULL);
                    ASSERTC(status == BT_STATUS_SUCCESS, "context transfer failed", status);
                }
            }
            p_scb = (btif_hl_soc_cb_t *)GKI_getnext((void *)p_scb );
            BTIF_TRACE_DEBUG("next p_scb=0x%x", p_scb);
        }
    }

    BTIF_TRACE_DEBUG("leaving %s",__FUNCTION__);
}
/*******************************************************************************
**
** Function btif_hl_close_socket
**
** Description close a socket
**
** Returns void
**
*******************************************************************************/
void btif_hl_close_socket( fd_set *p_org_set){
    btif_hl_soc_cb_t                *p_scb = NULL;
    BOOLEAN                         element_removed = FALSE;
    btif_hl_mdl_cb_t                *p_dcb = NULL ;
    btif_hl_app_cb_t                *p_acb = NULL ;
    btif_hl_evt_cb_t                evt_param;
    int                             len;
    int                             app_idx;
    bt_status_t                     status;

    BTIF_TRACE_DEBUG("entering %s",__FUNCTION__);
    if (!GKI_queue_is_empty(&soc_queue))
    {
        p_scb = (btif_hl_soc_cb_t *)GKI_getfirst((void *)&soc_queue);
        while (p_scb != NULL)
        {
            if (btif_hl_get_socket_state(p_scb) == BTIF_HL_SOC_STATE_W4_REL)
            {
                BTIF_TRACE_DEBUG("app_idx=%d mcl_id=%d, mdl_idx=%d",
                                  p_scb->app_idx, p_scb->mcl_idx, p_scb->mdl_idx);
                btif_hl_set_socket_state(p_scb,   BTIF_HL_SOC_STATE_IDLE);
                if (p_scb->socket_id[1] != -1)
                {
                    FD_CLR(p_scb->socket_id[1] , p_org_set);
                    shutdown(p_scb->socket_id[1], SHUT_RDWR);
                    close(p_scb->socket_id[1]);

                    evt_param.chan_cb.app_id = (int) btif_hl_get_app_id(p_scb->channel_id);
                    memcpy(evt_param.chan_cb.bd_addr, p_scb->bd_addr, sizeof(BD_ADDR));
                    evt_param.chan_cb.channel_id = p_scb->channel_id;
                    evt_param.chan_cb.fd = p_scb->socket_id[0];
                    evt_param.chan_cb.mdep_cfg_index = (int ) p_scb->mdep_cfg_idx;
                    evt_param.chan_cb.cb_state = BTIF_HL_CHAN_CB_STATE_DISCONNECTED_PENDING;
                    len = sizeof(btif_hl_send_chan_state_cb_t);
                    status = btif_transfer_context (btif_hl_proc_cb_evt, BTIF_HL_SEND_DISCONNECTED_CB,
                                                    (char*) &evt_param, len, NULL);
                    ASSERTC(status == BT_STATUS_SUCCESS, "context transfer failed", status);


                }
            }
            p_scb = (btif_hl_soc_cb_t *)GKI_getnext((void *)p_scb );
            BTIF_TRACE_DEBUG("while loop next p_scb=0x%x", p_scb);
        }

        p_scb = (btif_hl_soc_cb_t *)GKI_getfirst((void *)&soc_queue);
        while (p_scb != NULL)
        {
            if (btif_hl_get_socket_state(p_scb) == BTIF_HL_SOC_STATE_IDLE)
            {
                p_dcb = BTIF_HL_GET_MDL_CB_PTR(p_scb->app_idx, p_scb->mcl_idx, p_scb->mdl_idx);
                BTIF_TRACE_DEBUG("idle socket app_idx=%d mcl_id=%d, mdl_idx=%d p_dcb->in_use=%d",
                                  p_scb->app_idx, p_scb->mcl_idx, p_scb->mdl_idx, p_dcb->in_use);
                GKI_remove_from_queue((void *)&soc_queue, p_scb);
                btif_hl_free_buf((void **)&p_scb);
                p_dcb->p_scb = NULL;
                element_removed = TRUE;
            }
            BTIF_TRACE_DEBUG("element_removed=%d p_scb=0x%x", element_removed, p_scb);
            if (element_removed)
            {
                element_removed = FALSE;
                p_scb = (btif_hl_soc_cb_t *)GKI_getfirst((void *)&soc_queue);
            }
            else
                p_scb = (btif_hl_soc_cb_t *)GKI_getnext((void *)p_scb );

            BTIF_TRACE_DEBUG("while loop p_scb=0x%x", p_scb);
        }
    }
    BTIF_TRACE_DEBUG("leaving %s",__FUNCTION__);
}
/*******************************************************************************
**
** Function btif_hl_select_wakeup_callback
**
** Description Select wakup callback to add or close a socket
**
** Returns void
**
*******************************************************************************/

void btif_hl_select_wakeup_callback( fd_set *p_org_set ,  int wakeup_signal){
    BTIF_TRACE_DEBUG("entering %s wakeup_signal=0x%04x",__FUNCTION__, wakeup_signal);

    if (wakeup_signal == btif_hl_signal_select_wakeup )
    {
        btif_hl_add_socket_to_set(p_org_set);
    }
    else if (wakeup_signal == btif_hl_signal_select_close_connected)
    {
        btif_hl_close_socket(p_org_set);
    }
    BTIF_TRACE_DEBUG("leaving %s",__FUNCTION__);
}

/*******************************************************************************
**
** Function btif_hl_select_monitor_callback
**
** Description Select monitor callback to check pending socket actions
**
** Returns void
**
*******************************************************************************/
void btif_hl_select_monitor_callback( fd_set *p_cur_set , fd_set *p_org_set){
    btif_hl_soc_cb_t      *p_scb = NULL;
    btif_hl_mdl_cb_t      *p_dcb = NULL;
    int r;
    UNUSED(p_org_set);

    BTIF_TRACE_DEBUG("entering %s",__FUNCTION__);

    if (!GKI_queue_is_empty(&soc_queue))
    {
        p_scb = (btif_hl_soc_cb_t *)GKI_getfirst((void *)&soc_queue);
        BTIF_TRACE_DEBUG(" GKI queue is not empty ");
        while (p_scb != NULL)
        {
            if (btif_hl_get_socket_state(p_scb) == BTIF_HL_SOC_STATE_W4_READ)
            {
                if (FD_ISSET(p_scb->socket_id[1], p_cur_set))
                {
                    BTIF_TRACE_DEBUG("read data");
                    BTIF_TRACE_DEBUG("state= BTIF_HL_SOC_STATE_W4_READ");
                    p_dcb = BTIF_HL_GET_MDL_CB_PTR(p_scb->app_idx, p_scb->mcl_idx, p_scb->mdl_idx);
                    if (p_dcb->p_tx_pkt)
                    {
                        BTIF_TRACE_ERROR("Rcv new pkt but the last pkt is still not been sent tx_size=%d", p_dcb->tx_size);
                        btif_hl_free_buf((void **) &p_dcb->p_tx_pkt);
                    }
                    p_dcb->p_tx_pkt =  btif_hl_get_buf (p_dcb->mtu);
                    if (p_dcb )
                    {
                        //do
                        // {
                        //     r = recv(p_scb->socket_id[1], p_dcb->p_tx_pkt, p_dcb->mtu , MSG_DONTWAIT));
                        // } while (r == SOCKET_ERROR && errno == EINTR);

                        if ((r = (int)recv(p_scb->socket_id[1], p_dcb->p_tx_pkt, p_dcb->mtu , MSG_DONTWAIT)) > 0)
                        {
                            BTIF_TRACE_DEBUG("btif_hl_select_monitor_callback send data r =%d", r);
                            p_dcb->tx_size = r;
                            BTIF_TRACE_DEBUG("btif_hl_select_monitor_callback send data tx_size=%d", p_dcb->tx_size );
                            BTA_HlSendData(p_dcb->mdl_handle, p_dcb->tx_size  );
                        }

                        if (r <= 0 )
                        {
                            BTIF_TRACE_DEBUG("btif_hl_select_monitor_callback  receive failed r=%d",r);
                            BTA_HlDchClose(p_dcb->mdl_handle );
                        }
                    }
                }
            }
            p_scb = (btif_hl_soc_cb_t *)GKI_getnext((void *)p_scb );
        }
    }
    else
    {
        BTIF_TRACE_DEBUG("btif_hl_select_monitor_queue is empty");
    }
    BTIF_TRACE_DEBUG("leaving %s",__FUNCTION__);
}
/*******************************************************************************
**
** Function btif_hl_select_wakeup_init
**
** Description select loop wakup init
**
** Returns int
**
*******************************************************************************/
static inline int btif_hl_select_wakeup_init(fd_set* set){
    BTIF_TRACE_DEBUG0("btif_hl_select_wakeup_init");
    if (signal_fds[0] == -1 && socketpair(AF_UNIX, SOCK_STREAM, 0, signal_fds) < 0)
    {
        BTIF_TRACE_ERROR("socketpair failed: %s", strerror(errno));
        return -1;
    }

    BTIF_TRACE_DEBUG("btif_hl_select_wakeup_init signal_fds[0]=%d signal_fds[1]=%d",signal_fds[0], signal_fds[1] );
    FD_SET(signal_fds[0], set);

    return signal_fds[0];
}

/*******************************************************************************
**
** Function btif_hl_select_wakeup
**
** Description send a signal to wakupo the select loop
**
** Returns int
**
*******************************************************************************/
static inline int btif_hl_select_wakeup(void){
    char sig_on = btif_hl_signal_select_wakeup;
    BTIF_TRACE_DEBUG("btif_hl_select_wakeup");
    return send(signal_fds[1], &sig_on, sizeof(sig_on), 0);
}

/*******************************************************************************
**
** Function btif_hl_select_close_connected
**
** Description send a signal to close a socket
**
** Returns int
**
*******************************************************************************/
static inline int btif_hl_select_close_connected(void){
    char sig_on = btif_hl_signal_select_close_connected;
    BTIF_TRACE_DEBUG("btif_hl_select_close_connected");
    return send(signal_fds[1], &sig_on, sizeof(sig_on), 0);
}

/*******************************************************************************
**
** Function btif_hl_close_select_thread
**
** Description send signal to close the thread and then close all signal FDs
**
** Returns int
**
*******************************************************************************/
static inline int btif_hl_close_select_thread(void)
{
    int result = 0;
    char sig_on = btif_hl_signal_select_exit;
    BTIF_TRACE_DEBUG("btif_hl_signal_select_exit");
    result = send(signal_fds[1], &sig_on, sizeof(sig_on), 0);
    if (btif_is_enabled())
    {
        /* Wait for the select_thread_id to exit if BT is still enabled
        and only this profile getting  cleaned up*/
        if (select_thread_id != -1) {
            pthread_join(select_thread_id, NULL);
            select_thread_id = -1;
        }
    }
    return result;
}

/*******************************************************************************
**
** Function btif_hl_select_wake_reset
**
** Description clear the received signal for the select loop
**
** Returns int
**
*******************************************************************************/
static inline int btif_hl_select_wake_reset(void){
    char sig_recv = 0;

    BTIF_TRACE_DEBUG("btif_hl_select_wake_reset");
    recv(signal_fds[0], &sig_recv, sizeof(sig_recv), MSG_WAITALL);
    return(int)sig_recv;
}
/*******************************************************************************
**
** Function btif_hl_select_wake_signaled
**
** Description check whether a fd is set or not
**
** Returns int
**
*******************************************************************************/
static inline int btif_hl_select_wake_signaled(fd_set* set){
    BTIF_TRACE_DEBUG("btif_hl_select_wake_signaled");
    return FD_ISSET(signal_fds[0], set);
}
/*******************************************************************************
**
** Function btif_hl_thread_cleanup
**
** Description  shut down and clean up the select loop
**
** Returns void
**
*******************************************************************************/
static void btif_hl_thread_cleanup(){
    if (listen_s != -1)
        close(listen_s);
    if (connected_s != -1)
    {
        shutdown(connected_s, SHUT_RDWR);
        close(connected_s);
    }
    listen_s = connected_s = -1;
    BTIF_TRACE_DEBUG("hl thread cleanup");
}
/*******************************************************************************
**
** Function btif_hl_select_thread
**
** Description the select loop
**
** Returns void
**
*******************************************************************************/
static void *btif_hl_select_thread(void *arg){
    fd_set org_set, curr_set;
    int r, max_curr_s, max_org_s;
    UNUSED(arg);

    BTIF_TRACE_DEBUG("entered btif_hl_select_thread");
    FD_ZERO(&org_set);
    max_org_s = btif_hl_select_wakeup_init(&org_set);
    BTIF_TRACE_DEBUG("max_s=%d ", max_org_s);

    for (;;)
    {
        r = 0;
        BTIF_TRACE_DEBUG("set curr_set = org_set ");
        curr_set = org_set;
        max_curr_s = max_org_s;
        int ret = select((max_curr_s + 1), &curr_set, NULL, NULL, NULL);
        BTIF_TRACE_DEBUG("select unblocked ret=%d", ret);
        if (ret == -1)
        {
            BTIF_TRACE_DEBUG("select() ret -1, exit the thread");
            btif_hl_thread_cleanup();
            select_thread_id = -1;
            return 0;
        }
        else if (ret)
        {
            BTIF_TRACE_DEBUG("btif_hl_select_wake_signaled, signal ret=%d", ret);
            if (btif_hl_select_wake_signaled(&curr_set))
            {
                r = btif_hl_select_wake_reset();
                BTIF_TRACE_DEBUG("btif_hl_select_wake_signaled, signal:%d", r);
                if (r == btif_hl_signal_select_wakeup || r == btif_hl_signal_select_close_connected )
                {
                    btif_hl_select_wakeup_callback(&org_set, r);
                }
                else if( r == btif_hl_signal_select_exit)
                {
                    btif_hl_thread_cleanup();
                    BTIF_TRACE_DEBUG("Exit hl_select_thread for btif_hl_signal_select_exit");
                    return 0;
                }
            }

            btif_hl_select_monitor_callback(&curr_set, &org_set);
            max_org_s = btif_hl_update_maxfd(max_org_s);
        }
        else
            BTIF_TRACE_DEBUG("no data, select ret: %d\n", ret);
    }
    BTIF_TRACE_DEBUG("leaving hl_select_thread");
    return 0;
}

/*******************************************************************************
**
** Function create_thread
**
** Description creat a select loop
**
** Returns pthread_t
**
*******************************************************************************/
static inline pthread_t create_thread(void *(*start_routine)(void *), void * arg){
    BTIF_TRACE_DEBUG("create_thread: entered");
    pthread_attr_t thread_attr;

    pthread_attr_init(&thread_attr);
    pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_JOINABLE);
    pthread_t thread_id = -1;
    if ( pthread_create(&thread_id, &thread_attr, start_routine, arg)!=0 )
    {
        BTIF_TRACE_ERROR("pthread_create : %s", strerror(errno));
        return -1;
    }
    BTIF_TRACE_DEBUG("create_thread: thread created successfully");
    return thread_id;
}

/*******************************************************************************
**
** Function         btif_hl_soc_thread_init
**
** Description      HL select loop init function.
**
** Returns          void
**
*******************************************************************************/
void btif_hl_soc_thread_init(void){
    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
    GKI_init_q(&soc_queue);
    select_thread_id = create_thread(btif_hl_select_thread, NULL);
}
/*******************************************************************************
**
** Function btif_hl_load_mdl_config
**
** Description load the MDL configuation from the application control block
**
** Returns BOOLEAN
**
*******************************************************************************/
BOOLEAN btif_hl_load_mdl_config (UINT8 app_id, UINT8 buffer_size,
                                 tBTA_HL_MDL_CFG *p_mdl_buf ){
    UINT8 app_idx;
    BOOLEAN result = FALSE;
    btif_hl_app_cb_t          *p_acb;
    tBTA_HL_MDL_CFG *p;
    int i;
    BTIF_TRACE_DEBUG("%s", __FUNCTION__);

    if (btif_hl_find_app_idx(app_id, &app_idx))
    {
        p_acb  = BTIF_HL_GET_APP_CB_PTR(app_idx);
        for (i=0, p=p_mdl_buf; i<buffer_size; i++, p++)
        {
            memcpy(p, &p_acb->mdl_cfg[i].base, sizeof(tBTA_HL_MDL_CFG));
        }
        result = TRUE;
    }

    BTIF_TRACE_DEBUG("result=%d", result);
    return result;
}
