/******************************************************************************
 *
 *  Copyright 1998-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.
 *
 ******************************************************************************/

/******************************************************************************
 *
 *  This file contains the HeaLth device profile main functions and state
 *  machine.
 *
 ******************************************************************************/
#include <string.h>

#include "bt_target.h"
#if (HL_INCLUDED == TRUE)

#include "bt_common.h"
#include "bta_hl_api.h"
#include "bta_hl_int.h"
#include "l2c_api.h"
#include "mca_defs.h"
#include "osi/include/osi.h"
#include "utl.h"

#if (BTA_HL_DEBUG == TRUE)
static const char* bta_hl_cch_state_code(tBTA_HL_CCH_STATE state_code);
static const char* bta_hl_dch_state_code(tBTA_HL_DCH_STATE state_code);
#endif

extern uint16_t L2CA_AllocateRandomPsm(void);
extern uint16_t L2CA_AllocatePsm(void);
/*****************************************************************************
 * DCH State Table
 ****************************************************************************/
/*****************************************************************************
 * Constants and types
 ****************************************************************************/
/* state machine action enumeration list for DCH */
/* The order of this enumeration must be the same as bta_hl_dch_act_tbl[] */
enum {
  BTA_HL_DCH_MCA_CREATE,
  BTA_HL_DCH_MCA_CREATE_CFM,
  BTA_HL_DCH_MCA_CREATE_IND,
  BTA_HL_DCH_MCA_OPEN_CFM,
  BTA_HL_DCH_MCA_OPEN_IND,
  BTA_HL_DCH_MCA_CLOSE,
  BTA_HL_DCH_MCA_CLOSE_CFM,
  BTA_HL_DCH_MCA_CLOSE_IND,
  BTA_HL_DCH_CLOSE_CMPL,
  BTA_HL_DCH_MCA_RCV_DATA,

  BTA_HL_DCH_SDP_INIT,
  BTA_HL_DCH_MCA_RECONNECT,
  BTA_HL_DCH_MCA_RECONNECT_IND,
  BTA_HL_DCH_MCA_RECONNECT_CFM,
  BTA_HL_DCH_CLOSE_ECHO_TEST,
  BTA_HL_DCH_CREATE_RSP,
  BTA_HL_DCH_MCA_ABORT,
  BTA_HL_DCH_MCA_ABORT_IND,
  BTA_HL_DCH_MCA_ABORT_CFM,
  BTA_HL_DCH_MCA_CONG_CHANGE,

  BTA_HL_DCH_SDP_FAIL,
  BTA_HL_DCH_SEND_DATA,
  BTA_HL_DCH_CI_GET_TX_DATA,
  BTA_HL_DCH_CI_PUT_RX_DATA,
  BTA_HL_DCH_CI_GET_ECHO_DATA,
  BTA_HL_DCH_ECHO_TEST,
  BTA_HL_DCH_CI_PUT_ECHO_DATA,
  BTA_HL_DCH_IGNORE
};

typedef void (*tBTA_HL_DCH_ACTION)(uint8_t app_idx, uint8_t mcl_idx,
                                   uint8_t mdl_idx, tBTA_HL_DATA* p_data);

static const tBTA_HL_DCH_ACTION bta_hl_dch_action[] = {
    bta_hl_dch_mca_create,        bta_hl_dch_mca_create_cfm,
    bta_hl_dch_mca_create_ind,    bta_hl_dch_mca_open_cfm,
    bta_hl_dch_mca_open_ind,      bta_hl_dch_mca_close,
    bta_hl_dch_mca_close_cfm,     bta_hl_dch_mca_close_ind,
    bta_hl_dch_close_cmpl,        bta_hl_dch_mca_rcv_data,

    bta_hl_dch_sdp_init,          bta_hl_dch_mca_reconnect,
    bta_hl_dch_mca_reconnect_ind, bta_hl_dch_mca_reconnect_cfm,
    bta_hl_dch_close_echo_test,   bta_hl_dch_create_rsp,
    bta_hl_dch_mca_abort,         bta_hl_dch_mca_abort_ind,
    bta_hl_dch_mca_abort_cfm,     bta_hl_dch_mca_cong_change,

    bta_hl_dch_sdp_fail,          bta_hl_dch_send_data,
    bta_hl_dch_ci_get_tx_data,    bta_hl_dch_ci_put_rx_data,
    bta_hl_dch_ci_get_echo_data,  bta_hl_dch_echo_test,
    bta_hl_dch_ci_put_echo_data,
};

/* state table information */
#define BTA_HL_DCH_ACTIONS 1    /* number of actions */
#define BTA_HL_DCH_ACTION_COL 0 /* position of action */
#define BTA_HL_DCH_NEXT_STATE 1 /* position of next state */
#define BTA_HL_DCH_NUM_COLS 2   /* number of columns in state tables */

/* state table for idle state */
static const uint8_t bta_hl_dch_st_idle[][BTA_HL_DCH_NUM_COLS] = {
    /* Event                                Action 1                    Next
       state */
    /* BTA_HL_DCH_SDP_INIT_EVT   */ {BTA_HL_DCH_SDP_INIT,
                                     BTA_HL_DCH_OPENING_ST},
    /* BTA_HL_DCH_OPEN_EVT       */ {BTA_HL_DCH_MCA_CREATE,
                                     BTA_HL_DCH_OPENING_ST},
    /* BTA_HL_MCA_CREATE_IND_EVT */ {BTA_HL_DCH_MCA_CREATE_IND,
                                     BTA_HL_DCH_OPENING_ST},
    /* BTA_HL_MCA_CREATE_CFM_EVT */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_IDLE_ST},
    /* BTA_HL_MCA_OPEN_IND_EVT   */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_IDLE_ST},

    /* BTA_HL_MCA_OPEN_CFM_EVT   */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_IDLE_ST},
    /* BTA_HL_DCH_CLOSE_EVT      */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_IDLE_ST},
    /* BTA_HL_MCA_CLOSE_IND_EVT  */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_IDLE_ST},
    /* BTA_HL_MCA_CLOSE_CFM_EVT  */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_IDLE_ST},
    /* BTA_HL_API_SEND_DATA_EVT  */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_IDLE_ST},

    /* BTA_HL_MCA_RCV_DATA_EVT   */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_IDLE_ST},
    /* BTA_HL_DCH_CLOSE_CMPL_EVT */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_IDLE_ST},
    /* BTA_HL_DCH_RECONNECT_EVT  */ {BTA_HL_DCH_MCA_RECONNECT,
                                     BTA_HL_DCH_OPENING_ST},
    /* BTA_HL_DCH_SDP_FAIL_EVT   */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_IDLE_ST},
    /* BTA_HL_MCA_RECONNECT_IND_EVT*/ {BTA_HL_DCH_MCA_RECONNECT_IND,
                                       BTA_HL_DCH_OPENING_ST},

    /* BTA_HL_MCA_RECONNECT_CFM_EVT*/ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_IDLE_ST},
    /* BTA_HL_DCH_CLOSE_ECHO_TEST_EVT*/ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_IDLE_ST},
    /* BTA_HL_API_DCH_CREATE_RSP_EVT */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_IDLE_ST},
    /* BTA_HL_DCH_ABORT_EVT */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_IDLE_ST},
    /* BTA_HL_MCA_ABORT_IND_EVT */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_IDLE_ST},

    /* BTA_HL_MCA_ABORT_CFM_EVT */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_IDLE_ST},
    /* BTA_HL_MCA_CONG_CHG_EVT */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_IDLE_ST},
    /* BTA_HL_CI_GET_TX_DATA_EVT  */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_IDLE_ST},
    /* BTA_HL_CI_PUT_RX_DATA_EVT  */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_IDLE_ST},
    /* BTA_HL_CI_GET_ECHO_DATA_EVT  */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_IDLE_ST},
    /* BTA_HL_DCH_ECHO_TEST_EVT  */ {BTA_HL_DCH_ECHO_TEST,
                                     BTA_HL_DCH_OPENING_ST},
    /* BTA_HL_CI_PUT_ECHO_DATA_EVT  */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_IDLE_ST}};

/* state table for opening state */
static const uint8_t bta_hl_dch_st_opening[][BTA_HL_DCH_NUM_COLS] = {
    /* Event                                Action 1                    Next
       state */
    /* BTA_HL_DCH_SDP_INIT_EVT   */ {BTA_HL_DCH_SDP_INIT,
                                     BTA_HL_DCH_OPENING_ST},
    /* BTA_HL_DCH_OPEN_EVT       */ {BTA_HL_DCH_MCA_CREATE,
                                     BTA_HL_DCH_OPENING_ST},
    /* BTA_HL_MCA_CREATE_IND_EVT */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_OPENING_ST},
    /* BTA_HL_MCA_CREATE_CFM_EVT */ {BTA_HL_DCH_MCA_CREATE_CFM,
                                     BTA_HL_DCH_OPENING_ST},
    /* BTA_HL_MCA_OPEN_IND_EVT   */ {BTA_HL_DCH_MCA_OPEN_IND,
                                     BTA_HL_DCH_OPEN_ST},
    /* BTA_HL_MCA_OPEN_CFM_EVT   */ {BTA_HL_DCH_MCA_OPEN_CFM,
                                     BTA_HL_DCH_OPEN_ST},
    /* BTA_HL_DCH_CLOSE_EVT      */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_OPENING_ST},
    /* BTA_HL_MCA_CLOSE_IND_EVT  */ {BTA_HL_DCH_MCA_CLOSE_IND,
                                     BTA_HL_DCH_CLOSING_ST},
    /* BTA_HL_MCA_CLOSE_CFM_EVT  */ {BTA_HL_DCH_MCA_CLOSE_CFM,
                                     BTA_HL_DCH_CLOSING_ST},
    /* BTA_HL_API_SEND_DATA_EVT  */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_OPEN_ST},

    /* BTA_HL_MCA_RCV_DATA_EVT   */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_OPEN_ST},
    /* BTA_HL_DCH_CLOSE_CMPL_EVT */ {BTA_HL_DCH_CLOSE_CMPL, BTA_HL_DCH_IDLE_ST},
    /* BTA_HL_DCH_RECONNECT_EVT  */ {BTA_HL_DCH_MCA_RECONNECT,
                                     BTA_HL_DCH_OPENING_ST},
    /* BTA_HL_DCH_SDP_FAIL_EVT   */ {BTA_HL_DCH_SDP_FAIL,
                                     BTA_HL_DCH_CLOSING_ST},
    /* BTA_HL_MCA_RECONNECT_IND_EVT*/ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_IDLE_ST},
    /* BTA_HL_MCA_RECONNECT_CFM_EVT*/ {BTA_HL_DCH_MCA_RECONNECT_CFM,
                                       BTA_HL_DCH_OPENING_ST},
    /* BTA_HL_DCH_CLOSE_ECHO_TEST_EVT*/ {BTA_HL_DCH_IGNORE,
                                         BTA_HL_DCH_OPENING_ST},
    /* BTA_HL_API_DCH_CREATE_RSP_EVT */ {BTA_HL_DCH_CREATE_RSP,
                                         BTA_HL_DCH_OPENING_ST},
    /* BTA_HL_DCH_ABORT_EVT */ {BTA_HL_DCH_MCA_ABORT, BTA_HL_DCH_OPENING_ST},
    /* BTA_HL_MCA_ABORT_IND_EVT */ {BTA_HL_DCH_MCA_ABORT_IND,
                                    BTA_HL_DCH_OPENING_ST},

    /* BTA_HL_MCA_ABORT_CFM_EVT */ {BTA_HL_DCH_MCA_ABORT_CFM,
                                    BTA_HL_DCH_OPENING_ST},
    /* BTA_HL_MCA_CONG_CHG_EVT */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_OPENING_ST},
    /* BTA_HL_CI_GET_TX_DATA_EVT  */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_OPENING_ST},
    /* BTA_HL_CI_PUT_RX_DATA_EVT  */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_OPENING_ST},
    /* BTA_HL_CI_GET_ECHO_DATA_EVT  */ {BTA_HL_DCH_CI_GET_ECHO_DATA,
                                        BTA_HL_DCH_OPENING_ST},
    /* BTA_HL_DCH_ECHO_TEST_EVT  */ {BTA_HL_DCH_ECHO_TEST,
                                     BTA_HL_DCH_OPENING_ST},
    /* BTA_HL_CI_PUT_ECHO_DATA_EVT  */ {BTA_HL_DCH_IGNORE,
                                        BTA_HL_DCH_OPENING_ST}};

/* state table for open state */
static const uint8_t bta_hl_dch_st_open[][BTA_HL_DCH_NUM_COLS] = {
    /* Event                                Action 1                  Next
       state */
    /* BTA_HL_DCH_SDP_INIT_EVT   */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_OPEN_ST},
    /* BTA_HL_DCH_OPEN_EVT       */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_OPEN_ST},
    /* BTA_HL_MCA_CREATE_IND_EVT */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_OPEN_ST},
    /* BTA_HL_MCA_CREATE_CFM_EVT */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_OPEN_ST},
    /* BTA_HL_MCA_OPEN_IND_EVT   */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_OPEN_ST},
    /* BTA_HL_MCA_OPEN_CFM_EVT   */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_OPEN_ST},
    /* BTA_HL_DCH_CLOSE_EVT      */ {BTA_HL_DCH_MCA_CLOSE,
                                     BTA_HL_DCH_CLOSING_ST},
    /* BTA_HL_MCA_CLOSE_IND_EVT  */ {BTA_HL_DCH_MCA_CLOSE_IND,
                                     BTA_HL_DCH_CLOSING_ST},
    /* BTA_HL_MCA_CLOSE_CFM_EVT  */ {BTA_HL_DCH_MCA_CLOSE_CFM,
                                     BTA_HL_DCH_CLOSING_ST},
    /* BTA_HL_API_SEND_DATA_EVT  */ {BTA_HL_DCH_SEND_DATA, BTA_HL_DCH_OPEN_ST},

    /* BTA_HL_MCA_RCV_DATA_EVT   */ {BTA_HL_DCH_MCA_RCV_DATA,
                                     BTA_HL_DCH_OPEN_ST},
    /* BTA_HL_DCH_CLOSE_CMPL_EVT */ {BTA_HL_DCH_CLOSE_CMPL, BTA_HL_DCH_IDLE_ST},
    /* BTA_HL_DCH_RECONNECT_EVT  */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_OPEN_ST},
    /* BTA_HL_DCH_SDP_FAIL_EVT   */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_OPEN_ST},
    /* BTA_HL_MCA_RECONNECT_IND_EVT*/ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_OPEN_ST},
    /* BTA_HL_MCA_RECONNECT_CFM_EVT*/ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_OPEN_ST},
    /* BTA_HL_DCH_CLOSE_ECHO_TEST_EVT*/ {BTA_HL_DCH_CLOSE_ECHO_TEST,
                                         BTA_HL_DCH_CLOSING_ST},
    /* BTA_HL_API_DCH_CREATE_RSP_EVT */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_OPEN_ST},
    /* BTA_HL_DCH_ABORT_EVT */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_OPEN_ST},
    /* BTA_HL_MCA_ABORT_IND_EVT */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_OPEN_ST},

    /* BTA_HL_DCH_ABORT_CFM_EVT */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_OPEN_ST},
    /* BTA_HL_MCA_CONG_CHG_EVT */ {BTA_HL_DCH_MCA_CONG_CHANGE,
                                   BTA_HL_DCH_OPEN_ST},
    /* BTA_HL_CI_GET_TX_DATA_EVT  */ {BTA_HL_DCH_CI_GET_TX_DATA,
                                      BTA_HL_DCH_OPEN_ST},
    /* BTA_HL_CI_PUT_RX_DATA_EVT  */ {BTA_HL_DCH_CI_PUT_RX_DATA,
                                      BTA_HL_DCH_OPEN_ST},
    /* BTA_HL_CI_GET_ECHO_DATA_EVT  */ {BTA_HL_DCH_CI_GET_ECHO_DATA,
                                        BTA_HL_DCH_OPEN_ST},
    /* BTA_HL_DCH_ECHO_TEST_EVT  */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_OPEN_ST},
    /* BTA_HL_CI_PUT_ECHO_DATA_EVT  */ {BTA_HL_DCH_CI_PUT_ECHO_DATA,
                                        BTA_HL_DCH_OPEN_ST}};

/* state table for closing state */
static const uint8_t bta_hl_dch_st_closing[][BTA_HL_DCH_NUM_COLS] = {
    /* Event                                Action 1 Next state */
    /* BTA_HL_DCH_SDP_INIT_EVT   */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_CLOSING_ST},
    /* BTA_HL_DCH_OPEN_EVT       */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_CLOSING_ST},
    /* BTA_HL_MCA_CREATE_IND_EVT */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_CLOSING_ST},
    /* BTA_HL_MCA_CREATE_CFM_EVT */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_CLOSING_ST},
    /* BTA_HL_MCA_OPEN_IND_EVT   */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_CLOSING_ST},
    /* BTA_HL_MCA_OPEN_CFM_EVT   */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_CLOSING_ST},
    /* BTA_HL_DCH_CLOSE_EVT      */ {BTA_HL_DCH_MCA_CLOSE,
                                     BTA_HL_DCH_CLOSING_ST},
    /* BTA_HL_MCA_CLOSE_IND_EVT  */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_CLOSING_ST},
    /* BTA_HL_MCA_CLOSE_CFM_EVT  */ {BTA_HL_DCH_MCA_CLOSE_CFM,
                                     BTA_HL_DCH_CLOSING_ST},
    /* BTA_HL_API_SEND_DATA_EVT  */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_CLOSING_ST},

    /* BTA_HL_MCA_RCV_DATA_EVT   */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_CLOSING_ST},
    /* BTA_HL_DCH_CLOSE_CMPL_EVT */ {BTA_HL_DCH_CLOSE_CMPL, BTA_HL_DCH_IDLE_ST},
    /* BTA_HL_DCH_RECONNECT_EVT  */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_CLOSING_ST},
    /* BTA_HL_DCH_SDP_FAIL_EVT   */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_CLOSING_ST},
    /* BTA_HL_MCA_RECONNECT_IND_EVT*/ {BTA_HL_DCH_IGNORE,
                                       BTA_HL_DCH_CLOSING_ST},
    /* BTA_HL_MCA_RECONNECT_CFM_EVT*/ {BTA_HL_DCH_IGNORE,
                                       BTA_HL_DCH_CLOSING_ST},
    /* BTA_HL_DCH_CLOSE_ECHO_TEST_EVT*/ {BTA_HL_DCH_IGNORE,
                                         BTA_HL_DCH_CLOSING_ST},
    /* BTA_HL_API_DCH_CREATE_RSP_EVT */ {BTA_HL_DCH_IGNORE,
                                         BTA_HL_DCH_CLOSING_ST},
    /* BTA_HL_DCH_ABORT_EVT */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_CLOSING_ST},
    /* BTA_HL_MCA_ABORT_IND_EVT */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_CLOSING_ST},

    /* BTA_HL_DCH_ABORT_CFM_EVT */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_CLOSING_ST},
    /* BTA_HL_MCA_CONG_CHG_EVT */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_CLOSING_ST},
    /* BTA_HL_CI_GET_TX_DATA_EVT  */ {BTA_HL_DCH_CI_GET_TX_DATA,
                                      BTA_HL_DCH_CLOSING_ST},
    /* BTA_HL_CI_PUT_RX_DATA_EVT  */ {BTA_HL_DCH_CI_PUT_RX_DATA,
                                      BTA_HL_DCH_CLOSING_ST},
    /* BTA_HL_CI_GET_ECHO_DATA_EVT  */ {BTA_HL_DCH_CI_GET_ECHO_DATA,
                                        BTA_HL_DCH_CLOSING_ST},
    /* BTA_HL_DCH_ECHO_TEST_EVT  */ {BTA_HL_DCH_IGNORE, BTA_HL_DCH_CLOSING_ST},
    /* BTA_HL_CI_PUT_ECHO_DATA_EVT  */ {BTA_HL_DCH_CI_PUT_ECHO_DATA,
                                        BTA_HL_DCH_CLOSING_ST}};

/* type for state table */
typedef const uint8_t (*tBTA_HL_DCH_ST_TBL)[BTA_HL_DCH_NUM_COLS];

/* state table */
const tBTA_HL_DCH_ST_TBL bta_hl_dch_st_tbl[] = {
    bta_hl_dch_st_idle, bta_hl_dch_st_opening, bta_hl_dch_st_open,
    bta_hl_dch_st_closing};

/*****************************************************************************
 * CCH State Table
 ****************************************************************************/
/*****************************************************************************
 * Constants and types
 ****************************************************************************/
/* state machine action enumeration list for CCH */
enum {
  BTA_HL_CCH_SDP_INIT,
  BTA_HL_CCH_MCA_OPEN,
  BTA_HL_CCH_MCA_CLOSE,
  BTA_HL_CCH_CLOSE_CMPL,
  BTA_HL_CCH_MCA_CONNECT,
  BTA_HL_CCH_MCA_DISCONNECT,
  BTA_HL_CCH_MCA_RSP_TOUT,
  BTA_HL_CCH_MCA_DISC_OPEN,
  BTA_HL_CCH_IGNORE
};

/* type for action functions */
typedef void (*tBTA_HL_CCH_ACTION)(uint8_t app_idx, uint8_t mcl_idx,
                                   tBTA_HL_DATA* p_data);

/* action function list for MAS */
const tBTA_HL_CCH_ACTION bta_hl_cch_action[] = {
    bta_hl_cch_sdp_init,     bta_hl_cch_mca_open,     bta_hl_cch_mca_close,
    bta_hl_cch_close_cmpl,   bta_hl_cch_mca_connect,  bta_hl_cch_mca_disconnect,
    bta_hl_cch_mca_rsp_tout, bta_hl_cch_mca_disc_open};

/* state table information */
#define BTA_HL_CCH_ACTIONS 1    /* number of actions */
#define BTA_HL_CCH_NEXT_STATE 1 /* position of next state */
#define BTA_HL_CCH_NUM_COLS 2   /* number of columns in state tables */

/* state table for MAS idle state */
static const uint8_t bta_hl_cch_st_idle[][BTA_HL_CCH_NUM_COLS] = {
    /* Event                          Action 1                  Next state */
    /* BTA_HL_CCH_OPEN_EVT           */ {BTA_HL_CCH_SDP_INIT,
                                         BTA_HL_CCH_OPENING_ST},
    /* BTA_HL_CCH_SDP_OK_EVT         */ {BTA_HL_CCH_IGNORE, BTA_HL_CCH_IDLE_ST},
    /* BTA_HL_CCH_SDP_FAIL_EVT       */ {BTA_HL_CCH_IGNORE, BTA_HL_CCH_IDLE_ST},
    /* BTA_HL_MCA_CONNECT_IND_EVT    */ {BTA_HL_CCH_MCA_CONNECT,
                                         BTA_HL_CCH_OPEN_ST},
    /* BTA_HL_MCA_DISCONNECT_IND_EVT */ {BTA_HL_CCH_IGNORE, BTA_HL_CCH_IDLE_ST},
    /* BTA_HL_CCH_CLOSE_EVT          */ {BTA_HL_CCH_IGNORE, BTA_HL_CCH_IDLE_ST},
    /* BTA_HL_CCH_CLOSE_CMPL_EVT     */ {BTA_HL_CCH_IGNORE, BTA_HL_CCH_IDLE_ST},
    /* BTA_HL_CCH_CLOSE_CMPL_EVT     */ {BTA_HL_CCH_IGNORE,
                                         BTA_HL_CCH_IDLE_ST}};

/* state table for obex/rfcomm connection state */
static const uint8_t bta_hl_cch_st_opening[][BTA_HL_CCH_NUM_COLS] = {
    /* Event                          Action 1               Next state */
    /* BTA_HL_CCH_OPEN_EVT           */ {BTA_HL_CCH_IGNORE,
                                         BTA_HL_CCH_OPENING_ST},
    /* BTA_HL_CCH_SDP_OK_EVT         */ {BTA_HL_CCH_MCA_OPEN,
                                         BTA_HL_CCH_OPENING_ST},
    /* BTA_HL_CCH_SDP_FAIL_EVT       */ {BTA_HL_CCH_CLOSE_CMPL,
                                         BTA_HL_CCH_IDLE_ST},
    /* BTA_HL_MCA_CONNECT_IND_EVT    */ {BTA_HL_CCH_MCA_CONNECT,
                                         BTA_HL_CCH_OPEN_ST},
    /* BTA_HL_MCA_DISCONNECT_IND_EVT */ {BTA_HL_CCH_MCA_DISCONNECT,
                                         BTA_HL_CCH_CLOSING_ST},
    /* BTA_HL_CCH_CLOSE_EVT          */ {BTA_HL_CCH_MCA_CLOSE,
                                         BTA_HL_CCH_CLOSING_ST},
    /* BTA_HL_CCH_CLOSE_CMPL_EVT     */ {BTA_HL_CCH_CLOSE_CMPL,
                                         BTA_HL_CCH_IDLE_ST},
    /* BTA_HL_MCA_RSP_TOUT_IND_EVT   */ {BTA_HL_CCH_MCA_RSP_TOUT,
                                         BTA_HL_CCH_CLOSING_ST}};

/* state table for open state */
static const uint8_t bta_hl_cch_st_open[][BTA_HL_CCH_NUM_COLS] = {
    /* Event                          Action 1                  Next state */
    /* BTA_HL_CCH_OPEN_EVT           */ {BTA_HL_CCH_IGNORE, BTA_HL_CCH_OPEN_ST},
    /* BTA_HL_CCH_SDP_OK_EVT         */ {BTA_HL_CCH_IGNORE, BTA_HL_CCH_OPEN_ST},
    /* BTA_HL_CCH_SDP_FAIL_EVT       */ {BTA_HL_CCH_IGNORE, BTA_HL_CCH_OPEN_ST},
    /* BTA_HL_MCA_CONNECT_IND_EVT    */ {BTA_HL_CCH_IGNORE, BTA_HL_CCH_OPEN_ST},
    /* BTA_HL_MCA_DISCONNECT_IND_EVT */ {BTA_HL_CCH_MCA_DISCONNECT,
                                         BTA_HL_CCH_CLOSING_ST},
    /* BTA_HL_CCH_CLOSE_EVT          */ {BTA_HL_CCH_MCA_CLOSE,
                                         BTA_HL_CCH_CLOSING_ST},
    /* BTA_HL_CCH_CLOSE_CMPL_EVT     */ {BTA_HL_CCH_IGNORE, BTA_HL_CCH_OPEN_ST},
    /* BTA_HL_MCA_RSP_TOUT_IND_EVT   */ {BTA_HL_CCH_MCA_RSP_TOUT,
                                         BTA_HL_CCH_CLOSING_ST}};

/* state table for closing state */
static const uint8_t bta_hl_cch_st_closing[][BTA_HL_CCH_NUM_COLS] = {
    /* Event                          Action 1                  Next state */
    /* BTA_HL_CCH_OPEN_EVT           */ {BTA_HL_CCH_IGNORE,
                                         BTA_HL_CCH_CLOSING_ST},
    /* BTA_HL_CCH_SDP_OK_EVT         */ {BTA_HL_CCH_CLOSE_CMPL,
                                         BTA_HL_CCH_IDLE_ST},
    /* BTA_HL_CCH_SDP_FAIL_EVT       */ {BTA_HL_CCH_CLOSE_CMPL,
                                         BTA_HL_CCH_IDLE_ST},
    /* BTA_HL_MCA_CONNECT_IND_EVT    */ {BTA_HL_CCH_MCA_DISC_OPEN,
                                         BTA_HL_CCH_CLOSING_ST},
    /* BTA_HL_MCA_DISCONNECT_IND_EVT */ {BTA_HL_CCH_MCA_DISCONNECT,
                                         BTA_HL_CCH_CLOSING_ST},
    /* BTA_HL_CCH_CLOSE_EVT          */ {BTA_HL_CCH_MCA_CLOSE,
                                         BTA_HL_CCH_CLOSING_ST},
    /* BTA_HL_CCH_CLOSE_CMPL_EVT     */ {BTA_HL_CCH_CLOSE_CMPL,
                                         BTA_HL_CCH_IDLE_ST},
    /* BTA_HL_MCA_RSP_TOUT_IND_EVT   */ {BTA_HL_CCH_IGNORE,
                                         BTA_HL_CCH_CLOSING_ST}};

/* type for state table CCH */
typedef const uint8_t (*tBTA_HL_CCH_ST_TBL)[BTA_HL_CCH_NUM_COLS];

/* MAS state table */
const tBTA_HL_CCH_ST_TBL bta_hl_cch_st_tbl[] = {
    bta_hl_cch_st_idle, bta_hl_cch_st_opening, bta_hl_cch_st_open,
    bta_hl_cch_st_closing};

/*****************************************************************************
 * Global data
 ****************************************************************************/

/* HL control block */
tBTA_HL_CB bta_hl_cb;

/*******************************************************************************
 *
 * Function         bta_hl_cch_sm_execute
 *
 * Description      State machine event handling function for CCH
 *
 * Returns          void
 *
 ******************************************************************************/
void bta_hl_cch_sm_execute(uint8_t app_idx, uint8_t mcl_idx, uint16_t event,
                           tBTA_HL_DATA* p_data) {
  tBTA_HL_CCH_ST_TBL state_table;
  uint8_t action;
  int i;
  tBTA_HL_MCL_CB* p_cb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);

#if (BTA_HL_DEBUG == TRUE)
  tBTA_HL_CCH_STATE in_state = p_cb->cch_state;
  uint16_t cur_evt = event;
  APPL_TRACE_DEBUG("HDP CCH Event Handler: State 0x%02x [%s], Event [%s]",
                   in_state, bta_hl_cch_state_code(in_state),
                   bta_hl_evt_code(cur_evt));
#endif

  /* look up the state table for the current state */
  state_table = bta_hl_cch_st_tbl[p_cb->cch_state];

  event &= 0x00FF;

  /* set next state */
  p_cb->cch_state = state_table[event][BTA_HL_CCH_NEXT_STATE];

  for (i = 0; i < BTA_HL_CCH_ACTIONS; i++) {
    action = state_table[event][i];
    if (action != BTA_HL_CCH_IGNORE) {
      (*bta_hl_cch_action[action])(app_idx, mcl_idx, p_data);
    } else {
      /* discard HDP data */
      bta_hl_discard_data(p_data->hdr.event, p_data);
      break;
    }
  }
#if (BTA_HL_DEBUG == TRUE)
  if (in_state != p_cb->cch_state) {
    APPL_TRACE_DEBUG("HL CCH State Change: [%s] -> [%s] after [%s]",
                     bta_hl_cch_state_code(in_state),
                     bta_hl_cch_state_code(p_cb->cch_state),
                     bta_hl_evt_code(cur_evt));
  }
#endif
}

/*******************************************************************************
 *
 * Function         bta_hl_dch_sm_execute
 *
 * Description      State machine event handling function for DCH
 *
 * Returns          void
 *
 ******************************************************************************/
void bta_hl_dch_sm_execute(uint8_t app_idx, uint8_t mcl_idx, uint8_t mdl_idx,
                           uint16_t event, tBTA_HL_DATA* p_data) {
  tBTA_HL_DCH_ST_TBL state_table;
  uint8_t action;
  int i;
  tBTA_HL_MDL_CB* p_cb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);

#if (BTA_HL_DEBUG == TRUE)
  tBTA_HL_DCH_STATE in_state = p_cb->dch_state;
  uint16_t cur_evt = event;
  APPL_TRACE_DEBUG("HDP DCH Event Handler: State 0x%02x [%s], Event [%s]",
                   in_state, bta_hl_dch_state_code(in_state),
                   bta_hl_evt_code(cur_evt));
#endif

  /* look up the state table for the current state */
  state_table = bta_hl_dch_st_tbl[p_cb->dch_state];
  event -= BTA_HL_DCH_EVT_MIN;

  /* set next state */
  p_cb->dch_state = state_table[event][BTA_HL_DCH_NEXT_STATE];

  for (i = 0; i < BTA_HL_DCH_ACTIONS; i++) {
    action = state_table[event][i];
    if (action != BTA_HL_DCH_IGNORE) {
      (*bta_hl_dch_action[action])(app_idx, mcl_idx, mdl_idx, p_data);
    } else {
      /* discard mas data */
      bta_hl_discard_data(p_data->hdr.event, p_data);
      break;
    }
  }

#if (BTA_HL_DEBUG == TRUE)
  if (in_state != p_cb->dch_state) {
    APPL_TRACE_DEBUG("HL DCH State Change: [%s] -> [%s] after [%s]",
                     bta_hl_dch_state_code(in_state),
                     bta_hl_dch_state_code(p_cb->dch_state),
                     bta_hl_evt_code(cur_evt));
  }
#endif
}
/*******************************************************************************
 *
 * Function         bta_hl_api_enable
 *
 * Description      Process the API enable request to enable the HL subsystem
 *
 * Returns          void
 *
 ******************************************************************************/
static void bta_hl_api_enable(tBTA_HL_CB* p_cb, tBTA_HL_DATA* p_data) {
  tBTA_HL_CTRL evt_data;

  /* If already enabled then reject this request */
  if (p_cb->enable) {
    APPL_TRACE_ERROR("HL is already enabled");
    evt_data.enable_cfm.status = BTA_HL_STATUS_FAIL;
    if (p_data->api_enable.p_cback)
      p_data->api_enable.p_cback(BTA_HL_CTRL_ENABLE_CFM_EVT,
                                 (tBTA_HL_CTRL*)&evt_data);
    return;
  }

  /* Done with checking. now perform the enable oepration*/
  /* initialize control block */
  memset(p_cb, 0, sizeof(tBTA_HL_CB));
  p_cb->enable = true;
  p_cb->p_ctrl_cback = p_data->api_enable.p_cback;
  evt_data.enable_cfm.status = BTA_HL_STATUS_OK;
  if (p_data->api_enable.p_cback)
    p_data->api_enable.p_cback(BTA_HL_CTRL_ENABLE_CFM_EVT,
                               (tBTA_HL_CTRL*)&evt_data);
}
/*******************************************************************************
 *
 * Function         bta_hl_api_disable
 *
 * Description      Process the API disable request to disable the HL subsystem
 *
 * Returns          void
 *
 ******************************************************************************/
static void bta_hl_api_disable(tBTA_HL_CB* p_cb, tBTA_HL_DATA* p_data) {
  tBTA_HL_CTRL evt_data;
  tBTA_HL_STATUS status = BTA_HL_STATUS_OK;

  if (p_cb->enable) {
    p_cb->disabling = true;
    bta_hl_check_disable(p_data);
  } else {
    status = BTA_HL_STATUS_FAIL;
    evt_data.disable_cfm.status = status;
    if (p_cb->p_ctrl_cback)
      p_cb->p_ctrl_cback(BTA_HL_CTRL_DISABLE_CFM_EVT, (tBTA_HL_CTRL*)&evt_data);
  }

#if (BTA_HL_DEBUG == TRUE)
  if (status != BTA_HL_STATUS_OK) {
    APPL_TRACE_DEBUG("bta_hl_api_disable status =%s",
                     bta_hl_status_code(status));
  }
#endif
}

/*******************************************************************************
 *
 * Function         bta_hl_api_update
 *
 * Description      Process the API registration request to register an HDP
 *                  application
 *
 * Returns          void
 *
 ******************************************************************************/
static void bta_hl_api_update(tBTA_HL_CB* p_cb, tBTA_HL_DATA* p_data) {
  tBTA_HL evt_data;
  tBTA_HL_APP_CB* p_acb = BTA_HL_GET_APP_CB_PTR(0);
  tBTA_HL_STATUS status = BTA_HL_STATUS_FAIL;

  APPL_TRACE_DEBUG("bta_hl_api_update");
  if (p_cb->enable) {
    status = bta_hl_app_update(p_data->api_update.app_id,
                               p_data->api_update.is_register);
    if (!p_data->api_update.is_register) {
      APPL_TRACE_DEBUG("Deregister");
      memset(&evt_data, 0, sizeof(tBTA_HL));
      evt_data.dereg_cfm.status = status;
      evt_data.dereg_cfm.app_id = p_data->api_update.app_id;
      if (status == BTA_HL_STATUS_OK)
        evt_data.dereg_cfm.app_handle = p_acb->app_handle;
      if (p_acb->p_cback) {
        p_acb->p_cback(BTA_HL_DEREGISTER_CFM_EVT, (tBTA_HL*)&evt_data);
      }
      return;
    }
  }

  if (status != BTA_HL_STATUS_OK) {
    if ((status != BTA_HL_STATUS_DUPLICATE_APP_ID) &&
        (status != BTA_HL_STATUS_NO_RESOURCE)) {
      if (p_acb) memset(p_acb, 0, sizeof(tBTA_HL_APP_CB));
    }
  }
#if (BTA_HL_DEBUG == TRUE)
  if (status != BTA_HL_STATUS_OK) {
    APPL_TRACE_DEBUG("bta_hl_api_register status =%s",
                     bta_hl_status_code(status));
  }
#endif

  memset(&evt_data, 0, sizeof(tBTA_HL));
  evt_data.reg_cfm.status = status;
  evt_data.reg_cfm.app_id = p_data->api_update.app_id;
  if (status == BTA_HL_STATUS_OK)
    evt_data.reg_cfm.app_handle = p_acb->app_handle;
  if (p_data->api_reg.p_cback) {
    p_data->api_reg.p_cback(BTA_HL_REGISTER_CFM_EVT, (tBTA_HL*)&evt_data);
  }

  if (status == BTA_HL_STATUS_OK) {
    evt_data.sdp_info_ind.app_handle = p_acb->app_handle;
    evt_data.sdp_info_ind.ctrl_psm = p_acb->ctrl_psm;
    evt_data.sdp_info_ind.data_psm = p_acb->data_psm;
    evt_data.sdp_info_ind.data_x_spec = BTA_HL_SDP_IEEE_11073_20601;
    evt_data.sdp_info_ind.mcap_sup_procs = BTA_HL_MCAP_SUP_PROC_MASK;

    if (p_data->api_reg.p_cback) {
      p_data->api_reg.p_cback(BTA_HL_SDP_INFO_IND_EVT, (tBTA_HL*)&evt_data);
    }
  }
}

/*******************************************************************************
 *
 * Function         bta_hl_api_register
 *
 * Description      Process the API registration request to register an HDP
 *                  application
 *
 * Returns          void
 *
 ******************************************************************************/
static void bta_hl_api_register(tBTA_HL_CB* p_cb, tBTA_HL_DATA* p_data) {
  tBTA_HL evt_data;
  uint8_t app_idx;
  tBTA_HL_APP_CB* p_acb = NULL;
  tBTA_HL_STATUS status = BTA_HL_STATUS_FAIL;

  if (p_cb->enable) {
    if (!bta_hl_is_a_duplicate_id(p_data->api_reg.app_id)) {
      if (bta_hl_find_avail_app_idx(&app_idx)) {
        p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
        p_acb->in_use = true;
        p_acb->app_id = p_data->api_reg.app_id;
        p_acb->p_cback = p_data->api_reg.p_cback;
        p_acb->sec_mask = p_data->api_reg.sec_mask;
        p_acb->dev_type = p_data->api_reg.dev_type;
        strlcpy(p_acb->srv_name, p_data->api_reg.srv_name,
                BTA_SERVICE_NAME_LEN);
        strlcpy(p_acb->srv_desp, p_data->api_reg.srv_desp,
                BTA_SERVICE_DESP_LEN);
        strlcpy(p_acb->provider_name, p_data->api_reg.provider_name,
                BTA_PROVIDER_NAME_LEN);
        bta_hl_cb.p_alloc_psm = L2CA_AllocatePSM;
        p_acb->ctrl_psm = bta_hl_cb.p_alloc_psm();
        p_acb->data_psm = bta_hl_cb.p_alloc_psm();
        p_acb->p_mcap_cback = bta_hl_mcap_ctrl_cback;
        status = bta_hl_app_registration(app_idx);
      } else {
        status = BTA_HL_STATUS_NO_RESOURCE;
      }
    } else {
      status = BTA_HL_STATUS_DUPLICATE_APP_ID;
    }
  }

  if (status != BTA_HL_STATUS_OK) {
    if ((status != BTA_HL_STATUS_DUPLICATE_APP_ID) &&
        (status != BTA_HL_STATUS_NO_RESOURCE)) {
      if (p_acb) memset(p_acb, 0, sizeof(tBTA_HL_APP_CB));
    }
  }
#if (BTA_HL_DEBUG == TRUE)
  if (status != BTA_HL_STATUS_OK) {
    APPL_TRACE_DEBUG("bta_hl_api_register status =%s",
                     bta_hl_status_code(status));
  }
#endif

  memset(&evt_data, 0, sizeof(tBTA_HL));
  evt_data.reg_cfm.status = status;
  evt_data.reg_cfm.app_id = p_data->api_reg.app_id;
  if (status == BTA_HL_STATUS_OK)
    evt_data.reg_cfm.app_handle = p_acb->app_handle;
  if (p_data->api_reg.p_cback) {
    p_data->api_reg.p_cback(BTA_HL_REGISTER_CFM_EVT, (tBTA_HL*)&evt_data);
  }

  if (status == BTA_HL_STATUS_OK) {
    evt_data.sdp_info_ind.app_handle = p_acb->app_handle;
    evt_data.sdp_info_ind.ctrl_psm = p_acb->ctrl_psm;
    evt_data.sdp_info_ind.data_psm = p_acb->data_psm;
    evt_data.sdp_info_ind.data_x_spec = BTA_HL_SDP_IEEE_11073_20601;
    evt_data.sdp_info_ind.mcap_sup_procs = BTA_HL_MCAP_SUP_PROC_MASK;

    if (p_data->api_reg.p_cback) {
      p_data->api_reg.p_cback(BTA_HL_SDP_INFO_IND_EVT, (tBTA_HL*)&evt_data);
    }
  }
}

/*******************************************************************************
 *
 * Function         bta_hl_api_deregister
 *
 * Description      Process the API de-registration request
 *
 * Returns          void
 *
 ******************************************************************************/
static void bta_hl_api_deregister(UNUSED_ATTR tBTA_HL_CB* p_cb,
                                  tBTA_HL_DATA* p_data) {
  uint8_t app_idx;
  tBTA_HL_APP_CB* p_acb;

  if (bta_hl_find_app_idx_using_handle(p_data->api_dereg.app_handle,
                                       &app_idx)) {
    p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
    p_acb->deregistering = true;
    bta_hl_check_deregistration(app_idx, p_data);
  } else {
    APPL_TRACE_ERROR("Invalid app_handle=%d", p_data->api_dereg.app_handle);
  }
}

/*******************************************************************************
 *
 * Function         bta_hl_api_cch_open
 *
 * Description      Process the API CCH open request
 *
 * Returns          void
 *
 ******************************************************************************/
static void bta_hl_api_cch_open(UNUSED_ATTR tBTA_HL_CB* p_cb,
                                tBTA_HL_DATA* p_data) {
  tBTA_HL evt_data;
  tBTA_HL_STATUS status = BTA_HL_STATUS_OK;
  uint8_t app_idx, mcl_idx;
  tBTA_HL_APP_CB* p_acb;
  tBTA_HL_MCL_CB* p_mcb;

  if (bta_hl_find_app_idx_using_handle(p_data->api_cch_open.app_handle,
                                       &app_idx)) {
    if (!bta_hl_find_mcl_idx(app_idx, p_data->api_cch_open.bd_addr, &mcl_idx)) {
      if (bta_hl_find_avail_mcl_idx(app_idx, &mcl_idx)) {
        p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
        p_mcb->in_use = true;
        p_mcb->req_ctrl_psm = p_data->api_cch_open.ctrl_psm;
        p_mcb->sec_mask = p_data->api_cch_open.sec_mask;
        p_mcb->bd_addr = p_data->api_cch_open.bd_addr;
        p_mcb->cch_oper = BTA_HL_CCH_OP_LOCAL_OPEN;
      } else {
        status = BTA_HL_STATUS_NO_RESOURCE;
      }
    } else {
      /* Only one MCL per BD_ADDR */
      status = BTA_HL_STATUS_DUPLICATE_CCH_OPEN;
      APPL_TRACE_DEBUG("bta_hl_api_cch_open: CCH already open: status =%d",
                       status)
      p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
      p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
      if (p_acb->p_cback) {
        bta_hl_build_cch_open_cfm(&evt_data, p_data->api_cch_open.app_id,
                                  p_data->api_cch_open.app_handle,
                                  p_mcb->mcl_handle,
                                  p_data->api_cch_open.bd_addr, status);
        p_acb->p_cback(BTA_HL_CCH_OPEN_CFM_EVT, (tBTA_HL*)&evt_data);
      } else {
        APPL_TRACE_ERROR("bta_hl_api_cch_open Null Callback");
      }
      return;
    }
  } else {
    status = BTA_HL_STATUS_INVALID_APP_HANDLE;
  }
#if (BTA_HL_DEBUG == TRUE)
  if (status != BTA_HL_STATUS_OK) {
    APPL_TRACE_DEBUG("bta_hl_api_cch_open status =%s",
                     bta_hl_status_code(status));
  }
#endif
  switch (status) {
    case BTA_HL_STATUS_OK:
      bta_hl_cch_sm_execute(app_idx, mcl_idx, BTA_HL_CCH_OPEN_EVT, p_data);
      break;
    case BTA_HL_STATUS_NO_RESOURCE:
    case BTA_HL_STATUS_FAIL:

      p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
      if (p_acb->p_cback) {
        bta_hl_build_cch_open_cfm(&evt_data, p_data->api_cch_open.app_id,
                                  p_data->api_cch_open.app_handle, 0,
                                  p_data->api_cch_open.bd_addr, status);
        p_acb->p_cback(BTA_HL_CCH_OPEN_CFM_EVT, (tBTA_HL*)&evt_data);
      } else {
        APPL_TRACE_ERROR("bta_hl_api_cch_open Null Callback");
      }
      break;
    default:
      APPL_TRACE_ERROR("status code=%d", status);
      break;
  }
}

/*******************************************************************************
 *
 * Function         bta_hl_api_cch_close
 *
 * Description      Process the API CCH close request
 *
 * Returns          void
 *
 ******************************************************************************/
static void bta_hl_api_cch_close(UNUSED_ATTR tBTA_HL_CB* p_cb,
                                 tBTA_HL_DATA* p_data) {
  tBTA_HL evt_data;
  tBTA_HL_STATUS status = BTA_HL_STATUS_OK;
  uint8_t app_idx, mcl_idx;
  tBTA_HL_APP_CB* p_acb;
  tBTA_HL_MCL_CB* p_mcb;

  if (bta_hl_find_mcl_idx_using_handle(p_data->api_cch_close.mcl_handle,
                                       &app_idx, &mcl_idx)) {
    p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
    p_mcb->cch_oper = BTA_HL_CCH_OP_LOCAL_CLOSE;
  } else {
    status = BTA_HL_STATUS_INVALID_MCL_HANDLE;
  }
#if (BTA_HL_DEBUG == TRUE)
  if (status != BTA_HL_STATUS_OK) {
    APPL_TRACE_DEBUG("bta_hl_api_cch_close status =%s",
                     bta_hl_status_code(status));
  }
#endif
  switch (status) {
    case BTA_HL_STATUS_OK:
      bta_hl_check_cch_close(app_idx, mcl_idx, p_data, true);
      break;

    case BTA_HL_STATUS_INVALID_MCL_HANDLE:
      p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
      if (p_acb->p_cback) {
        bta_hl_build_cch_close_cfm(&evt_data, p_acb->app_handle,
                                   p_data->api_cch_close.mcl_handle, status);
        p_acb->p_cback(BTA_HL_CCH_CLOSE_CFM_EVT, (tBTA_HL*)&evt_data);
      } else {
        APPL_TRACE_ERROR("bta_hl_api_cch_close Null Callback");
      }
      break;
    default:
      APPL_TRACE_ERROR("status code=%d", status);
      break;
  }
}

/*******************************************************************************
 *
 * Function         bta_hl_api_dch_open
 *
 * Description      Process the API DCH open request
 *
 * Returns          void
 *
 ******************************************************************************/
static void bta_hl_api_dch_open(UNUSED_ATTR tBTA_HL_CB* p_cb,
                                tBTA_HL_DATA* p_data) {
  tBTA_HL evt_data;
  tBTA_HL_STATUS status = BTA_HL_STATUS_OK;
  uint8_t app_idx, mcl_idx, mdl_idx;
  tBTA_HL_APP_CB* p_acb;
  tBTA_HL_MCL_CB* p_mcb = NULL;
  tBTA_HL_MDL_CB* p_dcb;
  tBTA_HL_MDEP_CFG* p_mdep_cfg;
  uint8_t mdep_cfg_idx;

  if (bta_hl_find_mcl_idx_using_handle(p_data->api_dch_open.mcl_handle,
                                       &app_idx, &mcl_idx)) {
    p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
    p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);

    APPL_TRACE_DEBUG(
        "bta_hl_api_dch_open: app_ix=%d, mcl_idx=%d, cch_state=%d, "
        "mcl_handle=%d",
        app_idx, mcl_idx, p_mcb->cch_state, p_data->api_dch_open.mcl_handle);
    if (p_mcb->cch_state == BTA_HL_CCH_OPEN_ST) {
      if (bta_hl_find_avail_mdl_idx(app_idx, mcl_idx, &mdl_idx)) {
        p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);

        if (bta_hl_find_mdep_cfg_idx(
                app_idx, p_data->api_dch_open.local_mdep_id, &mdep_cfg_idx)) {
          if (mdep_cfg_idx &&
              (p_acb->sup_feature.mdep[mdep_cfg_idx].mdep_cfg.mdep_role ==
               BTA_HL_MDEP_ROLE_SINK)) {
            p_data->api_dch_open.local_cfg = BTA_HL_DCH_CFG_NO_PREF;
          }

          status = bta_hl_chk_local_cfg(app_idx, mcl_idx, mdep_cfg_idx,
                                        p_data->api_dch_open.local_cfg);
          if (status == BTA_HL_STATUS_OK) {
            if (p_data->api_dch_open.local_mdep_id !=
                BTA_HL_ECHO_TEST_MDEP_ID) {
              if (bta_hl_set_ctrl_psm_for_dch(app_idx, mcl_idx, mdl_idx,
                                              p_data->api_dch_open.ctrl_psm)) {
                p_mdep_cfg = BTA_HL_GET_MDEP_CFG_PTR(app_idx, mdep_cfg_idx);
                p_dcb->in_use = true;
                p_dcb->dch_oper = BTA_HL_DCH_OP_LOCAL_OPEN;
                p_dcb->sec_mask = p_data->api_dch_open.sec_mask;
                p_dcb->local_mdep_id = p_data->api_dch_open.local_mdep_id;
                p_dcb->peer_mdep_id = p_data->api_dch_open.peer_mdep_id;

                if (p_mdep_cfg->mdep_role == BTA_HL_MDEP_ROLE_SINK) {
                  p_dcb->peer_mdep_role = BTA_HL_MDEP_ROLE_SOURCE;
                } else {
                  p_dcb->peer_mdep_role = BTA_HL_MDEP_ROLE_SINK;
                }

                p_dcb->local_mdep_cfg_idx = mdep_cfg_idx;
                p_dcb->local_cfg = p_data->api_dch_open.local_cfg;

                bta_hl_find_rxtx_apdu_size(app_idx, mdep_cfg_idx,
                                           &p_dcb->max_rx_apdu_size,
                                           &p_dcb->max_tx_apdu_size);
                p_dcb->mdl_id =
                    bta_hl_allocate_mdl_id(app_idx, mcl_idx, mdl_idx);
                p_dcb->mdl_cfg_idx_included = false;
              } else {
                status = BTA_HL_STATUS_INVALID_CTRL_PSM;
              }

            } else {
              status = BTA_HL_STATUS_INVALID_LOCAL_MDEP_ID;
            }
          }
        } else {
          status = BTA_HL_STATUS_INVALID_LOCAL_MDEP_ID;
        }
      } else {
        status = BTA_HL_STATUS_NO_RESOURCE;
      }
    } else {
      status = BTA_HL_STATUS_NO_CCH;
    }
  } else {
    status = BTA_HL_STATUS_INVALID_MCL_HANDLE;
  }

#if (BTA_HL_DEBUG == TRUE)
  if (status != BTA_HL_STATUS_OK) {
    APPL_TRACE_DEBUG("bta_hl_api_dch_open status =%s",
                     bta_hl_status_code(status));
  }
#endif
  switch (status) {
    case BTA_HL_STATUS_OK:
      if (p_mcb->sdp.num_recs) {
        bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_OPEN_EVT,
                              p_data);
      } else {
        bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx,
                              BTA_HL_DCH_SDP_INIT_EVT, p_data);
      }
      break;
    case BTA_HL_STATUS_INVALID_DCH_CFG:
    case BTA_HL_STATUS_NO_FIRST_RELIABLE:
    case BTA_HL_STATUS_NO_CCH:
    case BTA_HL_STATUS_NO_RESOURCE:
    case BTA_HL_STATUS_FAIL:
    case BTA_HL_STATUS_INVALID_LOCAL_MDEP_ID:
    case BTA_HL_STATUS_INVALID_CTRL_PSM:
      p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
      if (p_acb->p_cback) {
        bta_hl_build_dch_open_cfm(
            &evt_data, p_acb->app_handle, p_data->api_dch_open.mcl_handle,
            BTA_HL_INVALID_MDL_HANDLE, 0, 0, 0, 0, 0, status);
        p_acb->p_cback(BTA_HL_DCH_OPEN_CFM_EVT, (tBTA_HL*)&evt_data);
      } else {
        APPL_TRACE_ERROR("bta_hl_api_dch_open Null Callback");
      }

      break;
    default:
      APPL_TRACE_ERROR("Status code=%d", status);
      break;
  }
}
/*******************************************************************************
 *
 * Function         bta_hl_api_dch_close
 *
 * Description      Process the API DCH close request
 *
 * Returns          void
 *
 ******************************************************************************/
static void bta_hl_api_dch_close(UNUSED_ATTR tBTA_HL_CB* p_cb,
                                 tBTA_HL_DATA* p_data) {
  tBTA_HL evt_data;
  tBTA_HL_STATUS status = BTA_HL_STATUS_OK;
  uint8_t app_idx, mcl_idx, mdl_idx;
  tBTA_HL_APP_CB* p_acb;
  tBTA_HL_MCL_CB* p_mcb;
  tBTA_HL_MDL_CB* p_dcb;

  if (bta_hl_find_mdl_idx_using_handle(p_data->api_dch_close.mdl_handle,
                                       &app_idx, &mcl_idx, &mdl_idx)) {
    p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
    if (p_dcb->dch_state != BTA_HL_DCH_OPEN_ST) {
      status = BTA_HL_STATUS_FAIL;
    }
  } else {
    status = BTA_HL_STATUS_INVALID_MDL_HANDLE;
  }

#if (BTA_HL_DEBUG == TRUE)
  if (status != BTA_HL_STATUS_OK) {
    APPL_TRACE_DEBUG("bta_hl_api_dch_close status =%s",
                     bta_hl_status_code(status));
  }
#endif

  switch (status) {
    case BTA_HL_STATUS_OK:
      bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_EVT,
                            p_data);
      break;
    case BTA_HL_STATUS_FAIL:
      p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
      if (p_acb->p_cback) {
        p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
        bta_hl_build_dch_close_cfm(&evt_data, p_acb->app_handle,
                                   p_mcb->mcl_handle,
                                   p_data->api_dch_close.mdl_handle, status);

        p_acb->p_cback(BTA_HL_DCH_CLOSE_CFM_EVT, (tBTA_HL*)&evt_data);
      } else {
        APPL_TRACE_ERROR("bta_hl_api_dch_close Null Callback");
      }
      break;
    default:
      APPL_TRACE_ERROR("Status code=%d", status);
      break;
  }
}

/*******************************************************************************
 *
 * Function         bta_hl_api_dch_reconnect
 *
 * Description      Process the API DCH reconnect request
 *
 * Returns          void
 *
 ******************************************************************************/
static void bta_hl_api_dch_reconnect(UNUSED_ATTR tBTA_HL_CB* p_cb,
                                     tBTA_HL_DATA* p_data) {
  tBTA_HL evt_data;
  tBTA_HL_STATUS status = BTA_HL_STATUS_OK;
  uint8_t app_idx, mcl_idx, mdl_idx;
  tBTA_HL_APP_CB* p_acb;
  tBTA_HL_MCL_CB* p_mcb = NULL;
  tBTA_HL_MDL_CB* p_dcb;
  uint8_t mdep_cfg_idx;
  uint8_t mdl_cfg_idx;
  tBTA_HL_MDEP_CFG* p_mdep_cfg;

  if (bta_hl_find_mcl_idx_using_handle(p_data->api_dch_reconnect.mcl_handle,
                                       &app_idx, &mcl_idx)) {
    p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
    p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
    if (p_mcb->cch_state == BTA_HL_CCH_OPEN_ST) {
      if (bta_hl_find_avail_mdl_idx(app_idx, mcl_idx, &mdl_idx)) {
        p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
        if (bta_hl_validate_reconnect_params(app_idx, mcl_idx,
                                             &(p_data->api_dch_reconnect),
                                             &mdep_cfg_idx, &mdl_cfg_idx)) {
          if (!bta_hl_is_the_first_reliable_existed(app_idx, mcl_idx) &&
              (p_acb->mdl_cfg[mdl_cfg_idx].dch_mode !=
               BTA_HL_DCH_MODE_RELIABLE)) {
            status = BTA_HL_STATUS_NO_FIRST_RELIABLE;
          } else {
            if (bta_hl_set_ctrl_psm_for_dch(app_idx, mcl_idx, mdl_idx,
                                            p_data->api_dch_open.ctrl_psm)) {
              p_dcb->in_use = true;
              p_dcb->dch_oper = BTA_HL_DCH_OP_LOCAL_RECONNECT;
              p_dcb->sec_mask = (BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT);
              p_dcb->local_mdep_id = p_acb->mdl_cfg[mdl_cfg_idx].local_mdep_id;
              p_dcb->local_mdep_cfg_idx = mdep_cfg_idx;
              p_dcb->local_cfg = BTA_HL_DCH_CFG_UNKNOWN;
              p_dcb->mdl_id = p_data->api_dch_reconnect.mdl_id;
              p_dcb->mdl_cfg_idx_included = true;
              p_dcb->mdl_cfg_idx = mdl_cfg_idx;
              p_dcb->dch_mode = p_acb->mdl_cfg[mdl_cfg_idx].dch_mode;

              p_mdep_cfg = BTA_HL_GET_MDEP_CFG_PTR(app_idx, mdep_cfg_idx);

              if (p_mdep_cfg->mdep_role == BTA_HL_MDEP_ROLE_SINK) {
                p_dcb->peer_mdep_role = BTA_HL_MDEP_ROLE_SOURCE;
                APPL_TRACE_DEBUG("peer mdep role = SOURCE ");
              } else {
                p_dcb->peer_mdep_role = BTA_HL_MDEP_ROLE_SINK;
                APPL_TRACE_DEBUG("peer mdep role = SINK ");
              }

              bta_hl_find_rxtx_apdu_size(app_idx, mdep_cfg_idx,
                                         &p_dcb->max_rx_apdu_size,
                                         &p_dcb->max_tx_apdu_size);
            } else {
              status = BTA_HL_STATUS_INVALID_CTRL_PSM;
            }
          }
        } else {
          status = BTA_HL_STATUS_INVALID_RECONNECT_CFG;
        }
      } else {
        status = BTA_HL_STATUS_NO_RESOURCE;
      }
    } else {
      status = BTA_HL_STATUS_NO_CCH;
    }
  } else {
    status = BTA_HL_STATUS_INVALID_MCL_HANDLE;
  }

#if (BTA_HL_DEBUG == TRUE)
  if (status != BTA_HL_STATUS_OK) {
    APPL_TRACE_DEBUG("bta_hl_api_dch_reconnect status=%s",
                     bta_hl_status_code(status));
  }
#endif

  switch (status) {
    case BTA_HL_STATUS_OK:
      if (p_mcb->sdp.num_recs) {
        bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx,
                              BTA_HL_DCH_RECONNECT_EVT, p_data);
      } else {
        bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx,
                              BTA_HL_DCH_SDP_INIT_EVT, p_data);
      }
      break;
    case BTA_HL_STATUS_INVALID_RECONNECT_CFG:
    case BTA_HL_STATUS_NO_FIRST_RELIABLE:
    case BTA_HL_STATUS_NO_CCH:
    case BTA_HL_STATUS_NO_RESOURCE:
      p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
      if (p_acb->p_cback) {
        bta_hl_build_dch_open_cfm(
            &evt_data, p_acb->app_handle, p_data->api_dch_reconnect.mcl_handle,
            BTA_HL_INVALID_MDL_HANDLE, 0, p_data->api_dch_reconnect.mdl_id, 0,
            0, 0, status);
        p_acb->p_cback(BTA_HL_DCH_RECONNECT_CFM_EVT, (tBTA_HL*)&evt_data);
      } else {
        APPL_TRACE_ERROR("bta_hl_api_dch_reconnect Null Callback");
      }
      break;
    default:
      APPL_TRACE_ERROR("Status code=%d", status);
      break;
  }
}

/*******************************************************************************
 *
 * Function         bta_hl_api_dch_echo_test
 *
 * Description      Process the API Echo test request
 *
 * Returns          void
 *
 ******************************************************************************/
static void bta_hl_api_dch_echo_test(UNUSED_ATTR tBTA_HL_CB* p_cb,
                                     tBTA_HL_DATA* p_data) {
  tBTA_HL evt_data;
  tBTA_HL_STATUS status = BTA_HL_STATUS_OK;
  uint8_t app_idx, mcl_idx, mdl_idx;
  tBTA_HL_APP_CB* p_acb;
  tBTA_HL_MCL_CB* p_mcb = NULL;
  tBTA_HL_MDL_CB* p_dcb;
  tBTA_HL_ECHO_CFG* p_echo_cfg;

  if (bta_hl_find_mcl_idx_using_handle(p_data->api_dch_echo_test.mcl_handle,
                                       &app_idx, &mcl_idx)) {
    p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
    p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
    if (p_mcb->cch_state == BTA_HL_CCH_OPEN_ST) {
      if (!p_mcb->echo_test) {
        if (bta_hl_find_avail_mdl_idx(app_idx, mcl_idx, &mdl_idx)) {
          p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);

          if ((p_data->api_dch_echo_test.local_cfg ==
               BTA_HL_DCH_CFG_RELIABLE) ||
              (p_data->api_dch_echo_test.local_cfg ==
               BTA_HL_DCH_CFG_STREAMING)) {
            bool fcs_use =
                (bool)(p_dcb->chnl_cfg.fcs & BTA_HL_MCA_FCS_USE_MASK);
            p_dcb->p_echo_tx_pkt =
                bta_hl_get_buf(p_data->api_dch_echo_test.pkt_size, fcs_use);
            if (p_dcb->p_echo_tx_pkt != NULL) {
              if (bta_hl_set_ctrl_psm_for_dch(app_idx, mcl_idx, mdl_idx,
                                              p_data->api_dch_open.ctrl_psm)) {
                p_dcb->in_use = true;
                p_dcb->dch_oper = BTA_HL_DCH_OP_LOCAL_OPEN;
                p_dcb->sec_mask = (BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT);
                p_dcb->local_mdep_cfg_idx = BTA_HL_ECHO_TEST_MDEP_CFG_IDX;
                p_dcb->local_cfg = p_data->api_dch_echo_test.local_cfg;
                p_dcb->local_mdep_id = BTA_HL_ECHO_TEST_MDEP_ID;
                p_dcb->peer_mdep_id = BTA_HL_ECHO_TEST_MDEP_ID;
                p_dcb->mdl_id =
                    bta_hl_allocate_mdl_id(app_idx, mcl_idx, mdl_idx);
                p_dcb->mdl_cfg_idx_included = false;
                p_echo_cfg = BTA_HL_GET_ECHO_CFG_PTR(app_idx);
                p_dcb->max_rx_apdu_size = p_echo_cfg->max_rx_apdu_size;
                p_dcb->max_tx_apdu_size = p_echo_cfg->max_tx_apdu_size;
                p_mcb->echo_test = true;
                p_mcb->echo_mdl_idx = mdl_idx;
              } else {
                status = BTA_HL_STATUS_INVALID_CTRL_PSM;
              }
            } else {
              status = BTA_HL_STATUS_NO_RESOURCE;
            }
          } else {
            status = BTA_HL_STATUS_INVALID_DCH_CFG;
          }
        } else {
          status = BTA_HL_STATUS_NO_RESOURCE;
        }
      } else {
        status = BTA_HL_STATUS_ECHO_TEST_BUSY;
      }
    } else {
      status = BTA_HL_STATUS_NO_CCH;
    }
  } else {
    status = BTA_HL_STATUS_NO_MCL;
  }

#if (BTA_HL_DEBUG == TRUE)
  if (status != BTA_HL_STATUS_OK) {
    APPL_TRACE_DEBUG("bta_hl_api_dch_echo_test status=%s",
                     bta_hl_status_code(status));
  }
#endif

  switch (status) {
    case BTA_HL_STATUS_OK:
      if (p_mcb->sdp.num_recs) {
        bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx,
                              BTA_HL_DCH_ECHO_TEST_EVT, p_data);
      } else {
        bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx,
                              BTA_HL_DCH_SDP_INIT_EVT, p_data);
      }
      break;
    case BTA_HL_STATUS_ECHO_TEST_BUSY:
    case BTA_HL_STATUS_NO_RESOURCE:
    case BTA_HL_STATUS_INVALID_DCH_CFG:
      p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
      if (p_acb->p_cback) {
        bta_hl_build_echo_test_cfm(&evt_data, p_acb->app_handle,
                                   p_mcb->mcl_handle, status);
        p_acb->p_cback(BTA_HL_DCH_ECHO_TEST_CFM_EVT, (tBTA_HL*)&evt_data);
      } else {
        APPL_TRACE_ERROR("bta_hl_api_dch_echo_test Null Callback");
      }
      break;

    default:
      APPL_TRACE_ERROR("Status code=%s", status);
      break;
  }
}

/*******************************************************************************
 *
 * Function         bta_hl_api_sdp_query
 *
 * Description      Process the API SDP query request
 *
 * Returns          void
 *
 ******************************************************************************/
static void bta_hl_api_sdp_query(UNUSED_ATTR tBTA_HL_CB* p_cb,
                                 tBTA_HL_DATA* p_data) {
  tBTA_HL evt_data;
  tBTA_HL_STATUS status = BTA_HL_STATUS_OK;
  uint8_t app_idx, mcl_idx;
  tBTA_HL_APP_CB* p_acb;
  tBTA_HL_MCL_CB* p_mcb;

  if (bta_hl_find_app_idx_using_handle(p_data->api_sdp_query.app_handle,
                                       &app_idx)) {
    if (!bta_hl_find_mcl_idx(app_idx, p_data->api_sdp_query.bd_addr,
                             &mcl_idx)) {
      if (bta_hl_find_avail_mcl_idx(app_idx, &mcl_idx)) {
        p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
        p_mcb->in_use = true;
        p_mcb->bd_addr = p_data->api_sdp_query.bd_addr;
        APPL_TRACE_DEBUG(
            "bta_hl_api_sdp_query p_mcb->app_id %d app_idx %d mcl_idx %d",
            p_mcb->app_id, app_idx, mcl_idx);
        p_mcb->app_id = p_data->api_sdp_query.app_id;
        p_mcb->sdp_oper = BTA_HL_SDP_OP_SDP_QUERY_NEW;
      } else {
        status = BTA_HL_STATUS_NO_RESOURCE;
      }
    } else {
      p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
      p_mcb->app_id = p_data->api_sdp_query.app_id;
      if (p_mcb->sdp_oper != BTA_HL_SDP_OP_NONE) {
        status = BTA_HL_STATUS_SDP_NO_RESOURCE;
      } else {
        p_mcb->sdp_oper = BTA_HL_SDP_OP_SDP_QUERY_CURRENT;
      }
    }
  } else {
    status = BTA_HL_STATUS_INVALID_APP_HANDLE;
  }

  if (status == BTA_HL_STATUS_OK) {
    status = bta_hl_init_sdp(p_mcb->sdp_oper, app_idx, mcl_idx, 0xFF);
    if ((status != BTA_HL_STATUS_OK) &&
        (p_mcb->sdp_oper == BTA_HL_SDP_OP_SDP_QUERY_NEW)) {
      memset(p_mcb, 0, sizeof(tBTA_HL_MCL_CB));
    }
  }
#if (BTA_HL_DEBUG == TRUE)
  if (status != BTA_HL_STATUS_OK) {
    APPL_TRACE_DEBUG("bta_hl_api_sdp_query status=%s",
                     bta_hl_status_code(status));
  }
#endif
  switch (status) {
    case BTA_HL_STATUS_NO_RESOURCE:
    case BTA_HL_STATUS_FAIL:
    case BTA_HL_STATUS_SDP_NO_RESOURCE:
      p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
      if (p_acb->p_cback) {
        bta_hl_build_sdp_query_cfm(&evt_data, p_data->api_sdp_query.app_id,
                                   p_data->api_sdp_query.app_handle,
                                   p_data->api_sdp_query.bd_addr, NULL, status);
        p_acb->p_cback(BTA_HL_SDP_QUERY_CFM_EVT, (tBTA_HL*)&evt_data);
      } else {
        APPL_TRACE_ERROR("bta_hl_api_sdp_query Null Callback");
      }
      break;
    case BTA_HL_STATUS_OK:
      break;
    default:
      APPL_TRACE_ERROR("Status code=%d", status);
      break;
  }
}

/*******************************************************************************
 *
 * Function         bta_hl_sdp_query_results
 *
 * Description      Process the SDP query results
 *
 * Returns          void
 *
 ******************************************************************************/
static void bta_hl_sdp_query_results(UNUSED_ATTR tBTA_HL_CB* p_cb,
                                     tBTA_HL_DATA* p_data) {
  tBTA_HL evt_data;
  tBTA_HL_STATUS status = BTA_HL_STATUS_OK;
  uint8_t app_idx = p_data->cch_sdp.app_idx;
  uint8_t mcl_idx = p_data->cch_sdp.mcl_idx;
  tBTA_HL_APP_CB* p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
  tBTA_HL_MCL_CB* p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
  tBTA_HL_SDP* p_sdp = NULL;
  uint16_t event;
  bool release_sdp_buf = false;

  event = p_data->hdr.event;

  if (event == BTA_HL_SDP_QUERY_OK_EVT) {
    p_sdp = (tBTA_HL_SDP*)osi_malloc(sizeof(tBTA_HL_SDP));
    memcpy(p_sdp, &p_mcb->sdp, sizeof(tBTA_HL_SDP));
    release_sdp_buf = true;
  } else {
    status = BTA_HL_STATUS_SDP_FAIL;
  }

#if (BTA_HL_DEBUG == TRUE)
  if (status != BTA_HL_STATUS_OK) {
    APPL_TRACE_DEBUG("bta_hl_sdp_query_results status=%s",
                     bta_hl_status_code(status));
  }
#endif

  APPL_TRACE_DEBUG(
      "bta_hl_sdp_query_results p_mcb->app_id %d app_idx %d mcl_idx %d",
      p_mcb->app_id, app_idx, mcl_idx);
  bta_hl_build_sdp_query_cfm(&evt_data, p_mcb->app_id, p_acb->app_handle,
                             p_mcb->bd_addr, p_sdp, status);
  p_acb->p_cback(BTA_HL_SDP_QUERY_CFM_EVT, (tBTA_HL*)&evt_data);

  if (release_sdp_buf) osi_free_and_reset((void**)&p_sdp);

  if (p_data->cch_sdp.release_mcl_cb) {
    memset(p_mcb, 0, sizeof(tBTA_HL_MCL_CB));
  } else {
    if (p_mcb->close_pending)
      bta_hl_check_cch_close(app_idx, mcl_idx, p_data, true);

    if (!p_mcb->ctrl_psm) {
      /* Control channel acceptor: do not store the SDP records */
      memset(&p_mcb->sdp, 0, sizeof(tBTA_HL_SDP));
    }
  }
}

/*******************************************************************************
 *
 * Function         bta_hl_api_delete_mdl
 *
 * Description      Process the API DELETE MDL request
 *
 * Returns          void
 *
 ******************************************************************************/
static void bta_hl_api_delete_mdl(UNUSED_ATTR tBTA_HL_CB* p_cb,
                                  tBTA_HL_DATA* p_data) {
  tBTA_HL evt_data;
  tBTA_HL_STATUS status = BTA_HL_STATUS_OK;
  uint8_t app_idx, mcl_idx;
  tBTA_HL_APP_CB* p_acb;
  tBTA_HL_MCL_CB* p_mcb;

  if (bta_hl_find_mcl_idx_using_handle(p_data->api_delete_mdl.mcl_handle,
                                       &app_idx, &mcl_idx)) {
    if (bta_hl_is_mdl_value_valid(p_data->api_delete_mdl.mdl_id)) {
      p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
      if (bta_hl_is_mdl_exsit_in_mcl(app_idx, p_mcb->bd_addr,
                                     p_data->api_delete_mdl.mdl_id)) {
        p_mcb->delete_mdl.mcl_handle = p_data->api_delete_mdl.mcl_handle;
        p_mcb->delete_mdl.mdl_id = p_data->api_delete_mdl.mdl_id;
        p_mcb->delete_mdl.delete_req_pending = true;

        if (MCA_Delete((tMCA_CL)p_mcb->mcl_handle,
                       p_data->api_delete_mdl.mdl_id) != MCA_SUCCESS) {
          status = BTA_HL_STATUS_FAIL;
          memset(&p_mcb->delete_mdl, 0, sizeof(tBTA_HL_DELETE_MDL));
        }
      } else {
        status = BTA_HL_STATUS_NO_MDL_ID_FOUND;
      }
    } else {
      status = BTA_HL_STATUS_INVALID_MDL_ID;
    }
  } else {
    status = BTA_HL_STATUS_INVALID_MCL_HANDLE;
  }

#if (BTA_HL_DEBUG == TRUE)
  if (status != BTA_HL_STATUS_OK) {
    APPL_TRACE_DEBUG("bta_hl_api_delete_mdl status=%s",
                     bta_hl_status_code(status));
  }
#endif
  switch (status) {
    case BTA_HL_STATUS_OK:
      break;
    case BTA_HL_STATUS_FAIL:
    case BTA_HL_STATUS_NO_MDL_ID_FOUND:
    case BTA_HL_STATUS_INVALID_MDL_ID:
      p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
      if (p_acb->p_cback) {
        bta_hl_build_delete_mdl_cfm(&evt_data, p_acb->app_handle,
                                    p_data->api_delete_mdl.mcl_handle,
                                    p_data->api_delete_mdl.mdl_id, status);
        p_acb->p_cback(BTA_HL_DELETE_MDL_CFM_EVT, (tBTA_HL*)&evt_data);
      } else {
        APPL_TRACE_ERROR("bta_hl_api_delete_mdl Null Callback");
      }
      break;
    default:
      APPL_TRACE_ERROR("status code =%d", status);
      break;
  }
}

/*******************************************************************************
 *
 * Function         bta_hl_mca_delete_mdl_cfm
 *
 * Description      Process the DELETE MDL confirmation event
 *
 * Returns          void
 *
 ******************************************************************************/
static void bta_hl_mca_delete_mdl_cfm(UNUSED_ATTR tBTA_HL_CB* p_cb,
                                      tBTA_HL_DATA* p_data) {
  tBTA_HL evt_data;
  tBTA_HL_STATUS status = BTA_HL_STATUS_OK;
  uint8_t app_idx, mcl_idx;
  tMCA_RSP_EVT* p_delete_cfm = &p_data->mca_evt.mca_data.delete_cfm;
  tBTA_HL_MCL_CB* p_mcb;
  bool send_cfm_evt = true;
  tBTA_HL_APP_CB* p_acb;

  if (bta_hl_find_mcl_idx_using_handle(p_data->mca_evt.mcl_handle, &app_idx,
                                       &mcl_idx)) {
    p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
    if (p_mcb->delete_mdl.delete_req_pending) {
      if (p_delete_cfm->rsp_code == MCA_RSP_SUCCESS) {
        if (!bta_hl_delete_mdl_cfg(app_idx, p_mcb->bd_addr,
                                   p_delete_cfm->mdl_id)) {
          status = BTA_HL_STATUS_FAIL;
        }
      } else {
        status = BTA_HL_STATUS_FAIL;
      }

      memset(&p_mcb->delete_mdl, 0, sizeof(tBTA_HL_DELETE_MDL));
    } else {
      send_cfm_evt = false;
    }
  } else {
    send_cfm_evt = false;
  }

#if (BTA_HL_DEBUG == TRUE)
  if (status != BTA_HL_STATUS_OK) {
    APPL_TRACE_DEBUG("bta_hl_api_delete_mdl status=%s",
                     bta_hl_status_code(status));
  }
#endif

  if (send_cfm_evt) {
    p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
    if (p_acb->p_cback) {
      bta_hl_build_delete_mdl_cfm(&evt_data, p_acb->app_handle,
                                  p_mcb->mcl_handle, p_delete_cfm->mdl_id,
                                  status);

      p_acb->p_cback(BTA_HL_DELETE_MDL_CFM_EVT, (tBTA_HL*)&evt_data);
    } else {
      APPL_TRACE_ERROR("bta_hl_mca_delete_mdl_cfm Null Callback");
    }
  }
}

/*******************************************************************************
 *
 * Function         bta_hl_mca_delete_mdl_ind
 *
 * Description      Process the DELETE MDL indication event
 *
 * Returns          void
 *
 ******************************************************************************/
static void bta_hl_mca_delete_mdl_ind(UNUSED_ATTR tBTA_HL_CB* p_cb,
                                      tBTA_HL_DATA* p_data) {
  tBTA_HL evt_data;
  uint8_t app_idx, mcl_idx, mdl_idx;
  tMCA_EVT_HDR* p_delete_ind = &p_data->mca_evt.mca_data.delete_ind;
  tBTA_HL_MCL_CB* p_mcb;
  tBTA_HL_MDL_CB* p_dcb;
  bool send_ind_evt = false;
  tBTA_HL_APP_CB* p_acb;

  if (bta_hl_find_mcl_idx_using_handle(p_data->mca_evt.mcl_handle, &app_idx,
                                       &mcl_idx)) {
    p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);

    if (bta_hl_find_mdl_idx(app_idx, mcl_idx, p_delete_ind->mdl_id, &mdl_idx)) {
      p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
      p_dcb->dch_oper = BTA_HL_DCH_OP_REMOTE_DELETE;
    }
    if (bta_hl_delete_mdl_cfg(app_idx, p_mcb->bd_addr, p_delete_ind->mdl_id)) {
      send_ind_evt = true;
    }
  }

#if (BTA_HL_DEBUG == TRUE)
  if (!send_ind_evt) {
    APPL_TRACE_DEBUG("bta_hl_mca_delete_mdl_ind is_send_ind_evt =%d",
                     send_ind_evt);
  }
#endif

  if (send_ind_evt) {
    p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
    if (p_acb->p_cback) {
      evt_data.delete_mdl_ind.mcl_handle = p_mcb->mcl_handle;
      evt_data.delete_mdl_ind.app_handle = p_acb->app_handle;
      evt_data.delete_mdl_ind.mdl_id = p_delete_ind->mdl_id;
      p_acb->p_cback(BTA_HL_DELETE_MDL_IND_EVT, (tBTA_HL*)&evt_data);
    } else {
      APPL_TRACE_ERROR("bta_hl_mca_delete_mdl_ind Null Callback");
    }
  }
}

/*******************************************************************************
 *
 * Function         bta_hl_api_dch_abort
 *
 * Description      Process the API DCH abort request
 *
 * Returns          void
 *
 ******************************************************************************/
static void bta_hl_api_dch_abort(UNUSED_ATTR tBTA_HL_CB* p_cb,
                                 tBTA_HL_DATA* p_data) {
  tBTA_HL_STATUS status = BTA_HL_STATUS_OK;
  uint8_t app_idx, mcl_idx, mdl_idx;
  tBTA_HL_APP_CB* p_acb;
  tBTA_HL_MCL_CB* p_mcb;
  tBTA_HL_MDL_CB* p_dcb;
  tBTA_HL evt_data;

  if (bta_hl_find_mcl_idx_using_handle(p_data->api_dch_abort.mcl_handle,
                                       &app_idx, &mcl_idx)) {
    if (!bta_hl_find_dch_setup_mdl_idx(app_idx, mcl_idx, &mdl_idx)) {
      status = BTA_HL_STATUS_NO_MDL_ID_FOUND;
    } else {
      p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
      if (p_dcb->abort_oper) {
        /* abort already in progress*/
        status = BTA_HL_STATUS_FAIL;
      } else {
        p_dcb->abort_oper = BTA_HL_ABORT_LOCAL_MASK;
      }
    }
  } else {
    status = BTA_HL_STATUS_INVALID_MCL_HANDLE;
  }

#if (BTA_HL_DEBUG == TRUE)
  if (status != BTA_HL_STATUS_OK) {
    APPL_TRACE_DEBUG("bta_hl_api_dch_abort status=%s",
                     bta_hl_status_code(status));
  }
#endif
  switch (status) {
    case BTA_HL_STATUS_OK:

      bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_ABORT_EVT,
                            p_data);
      break;
    case BTA_HL_STATUS_NO_MDL_ID_FOUND:
    case BTA_HL_STATUS_FAIL:

      p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
      if (p_acb->p_cback) {
        p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
        bta_hl_build_abort_cfm(&evt_data,

                               p_acb->app_handle, p_mcb->mcl_handle,
                               BTA_HL_STATUS_FAIL);
        p_acb->p_cback(BTA_HL_DCH_ABORT_CFM_EVT, (tBTA_HL*)&evt_data);
      } else {
        APPL_TRACE_ERROR("bta_hl_api_dch_abort Null Callback");
      }
      break;
    default:
      APPL_TRACE_ERROR("Status code=%d", status);
      break;
  }
}

/*******************************************************************************
 *
 * Function         bta_hl_hdl_event
 *
 * Description      HL main event handling function.
 *
 * Returns          void
 *
 ******************************************************************************/
bool bta_hl_hdl_event(BT_HDR* p_msg) {
  uint8_t app_idx, mcl_idx, mdl_idx;
  bool success = true;

#if (BTA_HL_DEBUG == TRUE)
  APPL_TRACE_DEBUG("BTA HL Event Handler: Event [%s]",
                   bta_hl_evt_code(p_msg->event));
#endif

  switch (p_msg->event) {
    case BTA_HL_API_ENABLE_EVT:
      bta_hl_api_enable(&bta_hl_cb, (tBTA_HL_DATA*)p_msg);
      break;
    case BTA_HL_API_DISABLE_EVT:
      bta_hl_api_disable(&bta_hl_cb, (tBTA_HL_DATA*)p_msg);
      break;
    case BTA_HL_API_UPDATE_EVT:
      bta_hl_api_update(&bta_hl_cb, (tBTA_HL_DATA*)p_msg);
      break;
    case BTA_HL_API_REGISTER_EVT:
      bta_hl_api_register(&bta_hl_cb, (tBTA_HL_DATA*)p_msg);
      break;
    case BTA_HL_API_DEREGISTER_EVT:
      bta_hl_api_deregister(&bta_hl_cb, (tBTA_HL_DATA*)p_msg);
      break;
    case BTA_HL_API_CCH_OPEN_EVT:
      bta_hl_api_cch_open(&bta_hl_cb, (tBTA_HL_DATA*)p_msg);
      break;
    case BTA_HL_API_CCH_CLOSE_EVT:
      bta_hl_api_cch_close(&bta_hl_cb, (tBTA_HL_DATA*)p_msg);
      break;
    case BTA_HL_API_DCH_OPEN_EVT:
      bta_hl_api_dch_open(&bta_hl_cb, (tBTA_HL_DATA*)p_msg);
      break;
    case BTA_HL_API_DCH_CLOSE_EVT:
      bta_hl_api_dch_close(&bta_hl_cb, (tBTA_HL_DATA*)p_msg);
      break;
    case BTA_HL_API_DELETE_MDL_EVT:
      bta_hl_api_delete_mdl(&bta_hl_cb, (tBTA_HL_DATA*)p_msg);
      break;
    case BTA_HL_API_DCH_RECONNECT_EVT:
      bta_hl_api_dch_reconnect(&bta_hl_cb, (tBTA_HL_DATA*)p_msg);
      break;

    case BTA_HL_API_DCH_ECHO_TEST_EVT:
      bta_hl_api_dch_echo_test(&bta_hl_cb, (tBTA_HL_DATA*)p_msg);
      break;

    case BTA_HL_API_SDP_QUERY_EVT:
      bta_hl_api_sdp_query(&bta_hl_cb, (tBTA_HL_DATA*)p_msg);
      break;

    case BTA_HL_MCA_DELETE_CFM_EVT:
      bta_hl_mca_delete_mdl_cfm(&bta_hl_cb, (tBTA_HL_DATA*)p_msg);
      break;

    case BTA_HL_MCA_DELETE_IND_EVT:
      bta_hl_mca_delete_mdl_ind(&bta_hl_cb, (tBTA_HL_DATA*)p_msg);
      break;

    case BTA_HL_SDP_QUERY_OK_EVT:
    case BTA_HL_SDP_QUERY_FAIL_EVT:
      bta_hl_sdp_query_results(&bta_hl_cb, (tBTA_HL_DATA*)p_msg);
      break;
    case BTA_HL_API_DCH_ABORT_EVT:
      bta_hl_api_dch_abort(&bta_hl_cb, (tBTA_HL_DATA*)p_msg);
      break;

    default:
      if (p_msg->event < BTA_HL_DCH_EVT_MIN) {
        if (bta_hl_find_cch_cb_indexes((tBTA_HL_DATA*)p_msg, &app_idx,
                                       &mcl_idx)) {
          bta_hl_cch_sm_execute(app_idx, mcl_idx, p_msg->event,
                                (tBTA_HL_DATA*)p_msg);
        } else {
#if (BTA_HL_DEBUG == TRUE)
          APPL_TRACE_ERROR(
              "unable to find control block indexes for CCH: [event=%s]",
              bta_hl_evt_code(p_msg->event));
#else
          APPL_TRACE_ERROR(
              "unable to find control block indexes for CCH: [event=%d]",
              p_msg->event);
#endif
          success = false;
        }
      } else {
        if (bta_hl_find_dch_cb_indexes((tBTA_HL_DATA*)p_msg, &app_idx, &mcl_idx,
                                       &mdl_idx)) {
          bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, p_msg->event,
                                (tBTA_HL_DATA*)p_msg);
        } else {
#if (BTA_HL_DEBUG == TRUE)
          APPL_TRACE_ERROR(
              "unable to find control block indexes for DCH : [event=%s]",
              bta_hl_evt_code(p_msg->event));
#else
          APPL_TRACE_ERROR(
              "unable to find control block indexes for DCH: [event=%d]",
              p_msg->event);
#endif
          success = false;
        }
      }

      break;
  }

  return (success);
}

/*****************************************************************************
 *  Debug Functions
 ****************************************************************************/
#if (BTA_HL_DEBUG == TRUE)

/*******************************************************************************
 *
 * Function         bta_hl_cch_state_code
 *
 * Description      Map CCH state code to the corresponding state string
 *
 * Returns          string pointer for the associated state name
 *
 ******************************************************************************/
static const char* bta_hl_cch_state_code(tBTA_HL_CCH_STATE state_code) {
  switch (state_code) {
    case BTA_HL_CCH_IDLE_ST:
      return "BTA_HL_CCH_IDLE_ST";
    case BTA_HL_CCH_OPENING_ST:
      return "BTA_HL_CCH_OPENING_ST";
    case BTA_HL_CCH_OPEN_ST:
      return "BTA_HL_CCH_OPEN_ST";
    case BTA_HL_CCH_CLOSING_ST:
      return "BTA_HL_CCH_CLOSING_ST";
    default:
      return "Unknown CCH state code";
  }
}

/*******************************************************************************
 *
 * Function         bta_hl_dch_state_code
 *
 * Description      Map DCH state code to the corresponding state string
 *
 * Returns          string pointer for the associated state name
 *
 ******************************************************************************/
static const char* bta_hl_dch_state_code(tBTA_HL_DCH_STATE state_code) {
  switch (state_code) {
    case BTA_HL_DCH_IDLE_ST:
      return "BTA_HL_DCH_IDLE_ST";
    case BTA_HL_DCH_OPENING_ST:
      return "BTA_HL_DCH_OPENING_ST";
    case BTA_HL_DCH_OPEN_ST:
      return "BTA_HL_DCH_OPEN_ST";
    case BTA_HL_DCH_CLOSING_ST:
      return "BTA_HL_DCH_CLOSING_ST";
    default:
      return "Unknown DCH state code";
  }
}
#endif /* Debug Functions */
#endif /* HL_INCLUDED */
