/******************************************************************************
 *
 *  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,
                sizeof(p_acb->srv_name));
        strlcpy(p_acb->srv_desp, p_data->api_reg.srv_desp,
                sizeof(p_acb->srv_desp));
        strlcpy(p_acb->provider_name, p_data->api_reg.provider_name,
                sizeof(p_acb->provider_name));
        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;

  event = p_data->hdr.event;

  if (event == BTA_HL_SDP_QUERY_OK_EVT) {
    // this is freed in btif_hl_proc_sdp_query_cfm
    p_sdp = (tBTA_HL_SDP*)osi_malloc(sizeof(tBTA_HL_SDP));
    memcpy(p_sdp, &p_mcb->sdp, sizeof(tBTA_HL_SDP));
  } 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 (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 */
