/******************************************************************************
 *
 *  Copyright (C) 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 is the private file for the message access equipment (MSE)
 *  subsystem.
 *
 ******************************************************************************/
#ifndef BTA_HL_INT_H
#define BTA_HL_INT_H

#include "bt_target.h"
#include "bta_hl_api.h"
#include "bta_hl_co.h"
#include "bta_sys.h"
#include "l2cdefs.h"

typedef uint16_t(tBTA_HL_ALLOCATE_PSM)(void);

/*****************************************************************************
 *  Constants and data types
 ****************************************************************************/

#ifndef BTA_HL_DISC_SIZE
#define BTA_HL_DISC_SIZE 1600
#endif
#define BTA_HL_NUM_SRCH_ATTR 10
#define BTA_HL_MIN_SDP_MDEP_LEN 7

/* L2CAP defualt parameters */
#define BTA_HL_L2C_TX_WIN_SIZE 10
#define BTA_HL_L2C_MAX_TRANSMIT 32
#define BTA_HL_L2C_RTRANS_TOUT 2000
#define BTA_HL_L2C_MON_TOUT 12000
#define BTA_HL_L2C_MPS 1017

/* L2CAP FCS setting*/
#define BTA_HL_MCA_USE_FCS MCA_FCS_USE
#define BTA_HL_MCA_NO_FCS MCA_FCS_BYPASS
#define BTA_HL_L2C_USE_FCS 1
#define BTA_HL_L2C_NO_FCS 0
#define BTA_HL_DEFAULT_SOURCE_FCS BTA_HL_L2C_USE_FCS
#define BTA_HL_MCA_FCS_USE_MASK MCA_FCS_USE_MASK

/* SDP Operations */
#define BTA_HL_SDP_OP_NONE 0
#define BTA_HL_SDP_OP_CCH_INIT 1
#define BTA_HL_SDP_OP_DCH_OPEN_INIT 2
#define BTA_HL_SDP_OP_DCH_RECONNECT_INIT 3
#define BTA_HL_SDP_OP_SDP_QUERY_NEW 4
#define BTA_HL_SDP_OP_SDP_QUERY_CURRENT 5

typedef uint8_t tBTA_HL_SDP_OPER;

/* CCH Operations */
#define BTA_HL_CCH_OP_NONE 0
#define BTA_HL_CCH_OP_LOCAL_OPEN 1
#define BTA_HL_CCH_OP_REMOTE_OPEN 2
#define BTA_HL_CCH_OP_LOCAL_CLOSE 3
#define BTA_HL_CCH_OP_REMOTE_CLOSE 4

typedef uint8_t tBTA_HL_CCH_OPER;

/* Pending DCH close operations when closing a CCH */
#define BTA_HL_CCH_CLOSE_OP_DCH_NONE 0
#define BTA_HL_CCH_CLOSE_OP_DCH_ABORT 1
#define BTA_HL_CCH_CLOSE_OP_DCH_CLOSE 2
typedef uint8_t tBTA_HL_CCH_CLOSE_DCH_OPER;

/* DCH Operations */
#define BTA_HL_DCH_OP_NONE 0
#define BTA_HL_DCH_OP_REMOTE_CREATE 1
#define BTA_HL_DCH_OP_LOCAL_OPEN 2
#define BTA_HL_DCH_OP_REMOTE_OPEN 3
#define BTA_HL_DCH_OP_LOCAL_CLOSE 4
#define BTA_HL_DCH_OP_REMOTE_CLOSE 5
#define BTA_HL_DCH_OP_LOCAL_DELETE 6
#define BTA_HL_DCH_OP_REMOTE_DELETE 7
#define BTA_HL_DCH_OP_LOCAL_RECONNECT 8
#define BTA_HL_DCH_OP_REMOTE_RECONNECT 9
#define BTA_HL_DCH_OP_LOCAL_CLOSE_ECHO_TEST 10
#define BTA_HL_DCH_OP_LOCAL_CLOSE_RECONNECT 11

typedef uint8_t tBTA_HL_DCH_OPER;

/* Echo test Operations */
#define BTA_HL_ECHO_OP_NONE 0
#define BTA_HL_ECHO_OP_CI_GET_ECHO_DATA 1
#define BTA_HL_ECHO_OP_SDP_INIT 2
#define BTA_HL_ECHO_OP_MDL_CREATE_CFM 3
#define BTA_HL_ECHO_OP_DCH_OPEN_CFM 4
#define BTA_HL_ECHO_OP_LOOP_BACK 5
#define BTA_HL_ECHO_OP_CI_PUT_ECHO_DATA 6
#define BTA_HL_ECHO_OP_DCH_CLOSE_CFM 7
#define BTA_HL_ECHO_OP_OPEN_IND 8
#define BTA_HL_ECHO_OP_ECHO_PKT 9

typedef uint8_t tBTA_HL_ECHO_OPER;

/* abort status mask for abort_oper */

#define BTA_HL_ABORT_NONE_MASK 0x00
#define BTA_HL_ABORT_PENDING_MASK 0x01
#define BTA_HL_ABORT_LOCAL_MASK 0x10
#define BTA_HL_ABORT_REMOTE_MASK 0x20
#define BTA_HL_ABORT_CCH_CLOSE_MASK 0x40

/* call out mask for cout_oper */
#define BTA_HL_CO_NONE_MASK 0x00
#define BTA_HL_CO_GET_TX_DATA_MASK 0x01
#define BTA_HL_CO_PUT_RX_DATA_MASK 0x02
#define BTA_HL_CO_GET_ECHO_DATA_MASK 0x04
#define BTA_HL_CO_PUT_ECHO_DATA_MASK 0x08

typedef struct {
  uint16_t mtu;
  uint8_t fcs; /* '0' No FCS, otherwise '1' */
} tBTA_HL_L2CAP_CFG_INFO;

/* State Machine Events */
enum {
  /* these events are handled by the state machine */
  BTA_HL_CCH_OPEN_EVT = BTA_SYS_EVT_START(BTA_ID_HL),
  BTA_HL_CCH_SDP_OK_EVT,
  BTA_HL_CCH_SDP_FAIL_EVT,
  BTA_HL_MCA_CONNECT_IND_EVT,
  BTA_HL_MCA_DISCONNECT_IND_EVT,
  BTA_HL_CCH_CLOSE_EVT,
  BTA_HL_CCH_CLOSE_CMPL_EVT,
  BTA_HL_MCA_RSP_TOUT_IND_EVT,
  /* DCH EVENT */
  BTA_HL_DCH_SDP_INIT_EVT,
  BTA_HL_DCH_OPEN_EVT,
  BTA_HL_MCA_CREATE_IND_EVT,
  BTA_HL_MCA_CREATE_CFM_EVT,
  BTA_HL_MCA_OPEN_IND_EVT,

  BTA_HL_MCA_OPEN_CFM_EVT,
  BTA_HL_DCH_CLOSE_EVT,
  BTA_HL_MCA_CLOSE_IND_EVT,
  BTA_HL_MCA_CLOSE_CFM_EVT,
  BTA_HL_API_SEND_DATA_EVT,

  BTA_HL_MCA_RCV_DATA_EVT,
  BTA_HL_DCH_CLOSE_CMPL_EVT,
  BTA_HL_DCH_RECONNECT_EVT,
  BTA_HL_DCH_SDP_FAIL_EVT,
  BTA_HL_MCA_RECONNECT_IND_EVT,

  BTA_HL_MCA_RECONNECT_CFM_EVT,
  BTA_HL_DCH_CLOSE_ECHO_TEST_EVT,
  BTA_HL_API_DCH_CREATE_RSP_EVT,
  BTA_HL_DCH_ABORT_EVT,
  BTA_HL_MCA_ABORT_IND_EVT,

  BTA_HL_MCA_ABORT_CFM_EVT,
  BTA_HL_MCA_CONG_CHG_EVT,
  BTA_HL_CI_GET_TX_DATA_EVT,
  BTA_HL_CI_PUT_RX_DATA_EVT,
  BTA_HL_CI_GET_ECHO_DATA_EVT,
  BTA_HL_DCH_ECHO_TEST_EVT,
  BTA_HL_CI_PUT_ECHO_DATA_EVT,

  /* these events are handled outside the state machine */
  BTA_HL_API_ENABLE_EVT,
  BTA_HL_API_DISABLE_EVT,
  BTA_HL_API_UPDATE_EVT,
  BTA_HL_API_REGISTER_EVT,
  BTA_HL_API_DEREGISTER_EVT,
  BTA_HL_API_CCH_OPEN_EVT,
  BTA_HL_API_CCH_CLOSE_EVT,
  BTA_HL_API_DCH_OPEN_EVT,
  BTA_HL_API_DCH_RECONNECT_EVT,
  BTA_HL_API_DCH_CLOSE_EVT,
  BTA_HL_API_DELETE_MDL_EVT,
  BTA_HL_API_DCH_ABORT_EVT,

  BTA_HL_API_DCH_ECHO_TEST_EVT,
  BTA_HL_API_SDP_QUERY_EVT,
  BTA_HL_SDP_QUERY_OK_EVT,
  BTA_HL_SDP_QUERY_FAIL_EVT,
  BTA_HL_MCA_DELETE_IND_EVT,
  BTA_HL_MCA_DELETE_CFM_EVT
};
typedef uint16_t tBTA_HL_INT_EVT;

#define BTA_HL_DCH_EVT_MIN BTA_HL_DCH_SDP_INIT_EVT
#define BTA_HL_DCH_EVT_MAX 0xFFFF

/* state machine states */
enum {
  BTA_HL_CCH_IDLE_ST = 0, /* Idle  */
  BTA_HL_CCH_OPENING_ST,  /* Opening a connection*/
  BTA_HL_CCH_OPEN_ST,     /* Connection is open */
  BTA_HL_CCH_CLOSING_ST   /* Closing is in progress */
};
typedef uint8_t tBTA_HL_CCH_STATE;

enum {
  BTA_HL_DCH_IDLE_ST = 0, /* Idle  */
  BTA_HL_DCH_OPENING_ST,  /* Opening a connection*/
  BTA_HL_DCH_OPEN_ST,     /* Connection is open */
  BTA_HL_DCH_CLOSING_ST   /* Closing is in progress */
};
typedef uint8_t tBTA_HL_DCH_STATE;

typedef struct {
  BT_HDR hdr;
  tBTA_HL_CTRL_CBACK* p_cback; /* pointer to control callback function */
} tBTA_HL_API_ENABLE;

typedef struct {
  BT_HDR hdr;
  uint8_t app_id;
  bool is_register; /* Update HL application due to register or deregister */
  tBTA_HL_CBACK* p_cback;       /* pointer to application callback function */
  tBTA_HL_DEVICE_TYPE dev_type; /* sink, source or dual roles */
  tBTA_SEC sec_mask;            /* security mask for accepting conenction*/
  char srv_name[BTA_SERVICE_NAME_LEN +
                1]; /* service name to be used in the SDP; null terminated*/
  char srv_desp[BTA_SERVICE_DESP_LEN + 1]; /* service description to be used in
                                              the SDP; null terminated */
  char provider_name[BTA_PROVIDER_NAME_LEN + 1]; /* provide name to be used in
                                                    the SDP; null terminated */

} tBTA_HL_API_UPDATE;

typedef struct {
  BT_HDR hdr;
  uint8_t app_id;
  tBTA_HL_CBACK* p_cback;       /* pointer to application callback function */
  tBTA_HL_DEVICE_TYPE dev_type; /* sink, source or dual roles */
  tBTA_SEC sec_mask;            /* security mask for accepting conenction*/
  char srv_name[BTA_SERVICE_NAME_LEN +
                1]; /* service name to be used in the SDP; null terminated*/
  char srv_desp[BTA_SERVICE_DESP_LEN + 1]; /* service description to be used in
                                              the SDP; null terminated */
  char provider_name[BTA_PROVIDER_NAME_LEN + 1]; /* provide name to be used in
                                                    the SDP; null terminated */
} tBTA_HL_API_REGISTER;

typedef struct {
  BT_HDR hdr;
  uint8_t app_id;
  tBTA_HL_CBACK* p_cback; /* pointer to application callback function */
  tBTA_HL_APP_HANDLE app_handle;
} tBTA_HL_API_DEREGISTER;

typedef struct {
  BT_HDR hdr;
  uint8_t app_id;
  tBTA_HL_APP_HANDLE app_handle;
  uint16_t ctrl_psm;
  BD_ADDR bd_addr;   /* Address of peer device */
  tBTA_SEC sec_mask; /* security mask for initiating connection*/
} tBTA_HL_API_CCH_OPEN;

typedef struct {
  BT_HDR hdr;
  tBTA_HL_MCL_HANDLE mcl_handle;
} tBTA_HL_API_CCH_CLOSE;

typedef struct {
  BT_HDR hdr;
  tBTA_HL_MCL_HANDLE mcl_handle;
  uint16_t ctrl_psm;
  tBTA_HL_MDEP_ID local_mdep_id; /* local MDEP ID */
  tBTA_HL_MDEP_ID peer_mdep_id;  /* peer mdep id */
  tBTA_HL_DCH_CFG local_cfg;
  tBTA_SEC sec_mask; /* security mask for initiating connection*/
} tBTA_HL_API_DCH_OPEN;

typedef struct {
  BT_HDR hdr;

  tBTA_HL_MCL_HANDLE mcl_handle;
  uint16_t ctrl_psm;
  tBTA_HL_MDL_ID mdl_id;
} tBTA_HL_API_DCH_RECONNECT;

typedef struct {
  BT_HDR hdr;
  tBTA_HL_MDL_HANDLE mdl_handle;
} tBTA_HL_API_DCH_CLOSE;

typedef struct {
  BT_HDR hdr;
  tBTA_HL_MCL_HANDLE mcl_handle;
  tBTA_HL_MDL_ID mdl_id;
} tBTA_HL_API_DELETE_MDL;

typedef struct {
  BT_HDR hdr;
  tBTA_HL_MCL_HANDLE mcl_handle;
} tBTA_HL_API_DCH_ABORT;

typedef struct {
  BT_HDR hdr;
  tBTA_HL_MDL_HANDLE mdl_handle;
  uint16_t pkt_size;
} tBTA_HL_API_SEND_DATA;

typedef struct {
  BT_HDR hdr;
  tBTA_HL_MCL_HANDLE mcl_handle;
  uint16_t ctrl_psm;
  uint16_t pkt_size;
  tBTA_HL_DCH_CFG local_cfg;
} tBTA_HL_API_DCH_ECHO_TEST;

typedef struct {
  BT_HDR hdr;
  uint8_t app_idx;
  uint8_t mcl_idx;
  bool release_mcl_cb;
} tBTA_HL_CCH_SDP;

/* MCA callback event parameters. */
typedef struct {
  BT_HDR hdr;
  tBTA_HL_APP_HANDLE app_handle;
  tBTA_HL_MCL_HANDLE mcl_handle;
  tMCA_CTRL mca_data;
} tBTA_HL_MCA_EVT;

/* MCA callback event parameters. */
typedef struct {
  BT_HDR hdr;
  uint8_t app_idx;
  uint8_t mcl_idx;
  uint8_t mdl_idx;
  BT_HDR* p_pkt;
} tBTA_HL_MCA_RCV_DATA_EVT;

typedef struct {
  BT_HDR hdr;
  uint8_t app_idx;
  uint8_t mcl_idx;
  uint8_t mdl_idx;
} tBTA_HL_DCH_SDP;

typedef struct {
  BT_HDR hdr;
  tBTA_HL_APP_HANDLE app_handle;
  uint8_t app_id;
  BD_ADDR bd_addr; /* Address of peer device */
} tBTA_HL_API_SDP_QUERY;

typedef struct {
  BT_HDR hdr;
  tBTA_HL_MCL_HANDLE mcl_handle;
  tBTA_HL_MDL_ID mdl_id;
  tBTA_HL_MDEP_ID local_mdep_id;
  tBTA_HL_DCH_CREATE_RSP rsp_code;
  tBTA_HL_DCH_CFG cfg_rsp;
} tBTA_HL_API_DCH_CREATE_RSP;

typedef struct {
  BT_HDR hdr;
  tBTA_HL_MDL_HANDLE mdl_handle;
  tBTA_HL_STATUS status;
} tBTA_HL_CI_GET_PUT_DATA;

typedef struct {
  BT_HDR hdr;
  tBTA_HL_MCL_HANDLE mcl_handle;
  tBTA_HL_STATUS status;
} tBTA_HL_CI_ECHO_DATA;

/* union of all state machine event data types */
typedef union {
  BT_HDR hdr;
  tBTA_HL_API_ENABLE api_enable; /* data for BTA_MSE_API_ENABLE_EVT */
  tBTA_HL_API_UPDATE api_update;
  tBTA_HL_API_REGISTER api_reg;
  tBTA_HL_API_DEREGISTER api_dereg;
  tBTA_HL_API_CCH_OPEN api_cch_open;
  tBTA_HL_API_CCH_CLOSE api_cch_close;
  tBTA_HL_API_DCH_CREATE_RSP api_dch_create_rsp;
  tBTA_HL_API_DCH_OPEN api_dch_open;
  tBTA_HL_API_DCH_RECONNECT api_dch_reconnect;
  tBTA_HL_API_DCH_CLOSE api_dch_close;
  tBTA_HL_API_DELETE_MDL api_delete_mdl;
  tBTA_HL_API_DCH_ABORT api_dch_abort;
  tBTA_HL_API_SEND_DATA api_send_data;
  tBTA_HL_API_DCH_ECHO_TEST api_dch_echo_test;
  tBTA_HL_API_SDP_QUERY api_sdp_query;

  tBTA_HL_CCH_SDP cch_sdp;
  tBTA_HL_MCA_EVT mca_evt;
  tBTA_HL_MCA_RCV_DATA_EVT mca_rcv_data_evt;
  tBTA_HL_DCH_SDP dch_sdp; /* for DCH_OPEN_EVT and DCH_RECONNECT_EVT */
  tBTA_HL_CI_GET_PUT_DATA ci_get_put_data;
  tBTA_HL_CI_ECHO_DATA ci_get_put_echo_data;
} tBTA_HL_DATA;

typedef struct {
  bool in_use;
  uint16_t mdl_id;
  tBTA_HL_MDL_HANDLE mdl_handle;
  tBTA_HL_DCH_OPER dch_oper;
  bool intentional_close;
  tBTA_HL_DCH_STATE dch_state;
  uint8_t abort_oper;
  uint16_t req_data_psm;
  uint16_t max_rx_apdu_size;
  uint16_t max_tx_apdu_size;
  BT_HDR* p_tx_pkt;
  BT_HDR* p_rx_pkt;
  tBTA_HL_MDEP_ID local_mdep_id;
  uint8_t local_mdep_cfg_idx;
  tBTA_HL_DCH_CFG local_cfg;
  tBTA_HL_DCH_CFG remote_cfg;
  tBTA_HL_MDEP_ID peer_mdep_id;
  uint16_t peer_data_type;
  tBTA_HL_MDEP_ROLE peer_mdep_role;
  tBTA_HL_DCH_MODE dch_mode;
  tBTA_SEC sec_mask;
  bool is_the_first_reliable;
  bool delete_mdl;
  uint16_t mtu;
  tMCA_CHNL_CFG chnl_cfg;
  bool mdl_cfg_idx_included;
  uint8_t mdl_cfg_idx;
  uint8_t echo_oper;
  bool cong;
  bool close_pending;
  uint8_t cout_oper;
  BT_HDR* p_echo_tx_pkt;
  BT_HDR* p_echo_rx_pkt;
  tBTA_HL_STATUS ci_put_echo_data_status;
} tBTA_HL_MDL_CB;

typedef struct {
  tBTA_HL_MDL_CB mdl[BTA_HL_NUM_MDLS_PER_MCL];
  tBTA_HL_DELETE_MDL delete_mdl;
  bool in_use;
  tBTA_HL_CCH_STATE cch_state;
  uint16_t req_ctrl_psm;
  uint16_t ctrl_psm;
  uint16_t data_psm;
  BD_ADDR bd_addr;
  uint16_t cch_mtu;
  uint16_t sec_mask;
  tBTA_HL_MCL_HANDLE mcl_handle;
  tSDP_DISCOVERY_DB* p_db; /* pointer to discovery database */
  tSDP_DISC_CMPL_CB* sdp_cback;
  tBTA_HL_SDP_OPER sdp_oper;
  bool close_pending;
  uint8_t sdp_mdl_idx;
  tBTA_HL_SDP sdp;
  uint8_t cch_oper;
  uint8_t force_close_local_cch_opening;
  bool intentional_close;
  bool rsp_tout;
  uint8_t timer_oper;
  bool echo_test;
  uint8_t echo_mdl_idx;
  uint8_t cch_close_dch_oper;
  uint8_t app_id;
} tBTA_HL_MCL_CB;

typedef struct {
  tBTA_HL_MCL_CB mcb[BTA_HL_NUM_MCLS]; /* application Control Blocks */
  tBTA_HL_CBACK* p_cback; /* pointer to control callback function */
  bool in_use;            /* this CB is in use*/
  bool deregistering;
  uint8_t app_id;
  uint32_t sdp_handle; /* SDP record handle */
  tBTA_HL_SUP_FEATURE sup_feature;
  tBTA_HL_MDL_CFG mdl_cfg[BTA_HL_NUM_MDL_CFGS];
  tBTA_HL_DEVICE_TYPE dev_type;
  tBTA_HL_APP_HANDLE app_handle;
  uint16_t ctrl_psm; /* L2CAP PSM for the MCAP control channel */
  uint16_t data_psm; /* L2CAP PSM for the MCAP data channel */
  uint16_t sec_mask; /* Security mask for BTM_SetSecurityLevel() */

  char srv_name[BTA_SERVICE_NAME_LEN +
                1]; /* service name to be used in the SDP; null terminated*/
  char srv_desp[BTA_SERVICE_DESP_LEN + 1]; /* service description to be used in
                                              the SDP; null terminated */
  char provider_name[BTA_PROVIDER_NAME_LEN + 1]; /* provide name to be used in
                                                    the SDP; null terminated */

  tMCA_CTRL_CBACK* p_mcap_cback; /* pointer to MCAP callback function */
  tMCA_DATA_CBACK* p_data_cback;
} tBTA_HL_APP_CB;

typedef struct {
  bool in_use;
  tBTA_HL_SDP_OPER sdp_oper;
  uint8_t app_idx;
  uint8_t mcl_idx;
  uint8_t mdl_idx;
} tBTA_HL_SDP_CB;

typedef struct {
  bool in_use;
  uint8_t app_idx;
  uint8_t mcl_idx;
} tBTA_HL_TIMER_CB;

typedef struct {
  tBTA_HL_APP_CB acb[BTA_HL_NUM_APPS]; /* HL Control Blocks */
  tBTA_HL_CTRL_CBACK* p_ctrl_cback; /* pointer to control callback function */
  bool enable;
  bool disabling;

  tBTA_HL_SDP_CB scb[BTA_HL_NUM_SDP_CBACKS];
  tBTA_HL_TIMER_CB tcb[BTA_HL_NUM_TIMERS];
  bool enable_random_psm;
  tBTA_HL_ALLOCATE_PSM* p_alloc_psm;
} tBTA_HL_CB;

/******************************************************************************
 *  Configuration Definitions
 ******************************************************************************/
/* Configuration structure */

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

/* HL control block */
extern tBTA_HL_CB bta_hl_cb;

#define BTA_HL_GET_CB_PTR() &(bta_hl_cb)
#define BTA_HL_GET_APP_CB_PTR(app_idx) &(bta_hl_cb.acb[(app_idx)])
#define BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx) \
  &(bta_hl_cb.acb[(app_idx)].mcb[(mcl_idx)])
#define BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx) \
  &(bta_hl_cb.acb[(app_idx)].mcb[(mcl_idx)].mdl[(mdl_idx)])
#define BTA_HL_GET_MDL_CFG_PTR(app_idx, item_idx) \
  &(bta_hl_cb.acb[(app_idx)].mdl_cfg[(item_idx)])
#define BTA_HL_GET_ECHO_CFG_PTR(app_idx) \
  &(bta_hl_cb.acb[(app_idx)].sup_feature.echo_cfg)
#define BTA_HL_GET_MDEP_CFG_PTR(app_idx, mdep_cfg_idx) \
  &(bta_hl_cb.acb[(app_idx)].sup_feature.mdep[(mdep_cfg_idx)].mdep_cfg)
#define BTA_HL_GET_DATA_CFG_PTR(app_idx, mdep_cfg_idx, data_cfg_idx) \
  &(bta_hl_cb.acb[(app_idx)]                                         \
        .sup_feature.mdep[(mdep_cfg_idx)]                            \
        .mdep_cfg.data_cfg[(data_cfg_idx)])
#define BTA_HL_GET_BUF_PTR(p_pkt) \
  ((uint8_t*)((uint8_t*)((p_pkt) + 1) + (p_pkt)->offset))

/*****************************************************************************
 *  Function prototypes
 ****************************************************************************/
/* main */
extern bool bta_hl_hdl_event(BT_HDR* p_msg);
/* sdp */
extern bool bta_hl_fill_sup_feature_list(const tSDP_DISC_ATTR* p_attr,
                                         tBTA_HL_SUP_FEATURE_LIST_ELEM* p_list);
extern tBTA_HL_STATUS bta_hl_sdp_update(uint8_t app_id);
extern tBTA_HL_STATUS bta_hl_sdp_register(uint8_t app_idx);
extern tSDP_DISC_REC* bta_hl_find_sink_or_src_srv_class_in_db(
    const tSDP_DISCOVERY_DB* p_db, const tSDP_DISC_REC* p_start_rec);

/* action routines */
extern void bta_hl_dch_ci_get_tx_data(uint8_t app_idx, uint8_t mcl_idx,
                                      uint8_t mdl_idx, tBTA_HL_DATA* p_data);
extern void bta_hl_dch_ci_put_rx_data(uint8_t app_idx, uint8_t mcl_idx,
                                      uint8_t mdl_idx, tBTA_HL_DATA* p_data);
extern void bta_hl_dch_ci_get_echo_data(uint8_t app_idx, uint8_t mcl_idx,
                                        uint8_t mdl_idx, tBTA_HL_DATA* p_data);

extern void bta_hl_dch_echo_test(uint8_t app_idx, uint8_t mcl_idx,
                                 uint8_t mdl_idx, tBTA_HL_DATA* p_data);
extern void bta_hl_dch_ci_put_echo_data(uint8_t app_idx, uint8_t mcl_idx,
                                        uint8_t mdl_idx, tBTA_HL_DATA* p_data);
extern void bta_hl_dch_send_data(uint8_t app_idx, uint8_t mcl_idx,
                                 uint8_t mdl_idx, tBTA_HL_DATA* p_data);
extern void bta_hl_dch_sdp_fail(uint8_t app_idx, uint8_t mcl_idx,
                                uint8_t mdl_idx, tBTA_HL_DATA* p_data);
extern void bta_hl_dch_mca_cong_change(uint8_t app_idx, uint8_t mcl_idx,
                                       uint8_t mdl_idx, tBTA_HL_DATA* p_data);
extern void bta_hl_dch_mca_reconnect_ind(uint8_t app_idx, uint8_t mcl_idx,
                                         uint8_t mdl_idx, tBTA_HL_DATA* p_data);
extern void bta_hl_dch_mca_reconnect_cfm(uint8_t app_idx, uint8_t mcl_idx,
                                         uint8_t mdl_idx, tBTA_HL_DATA* p_data);
extern void bta_hl_dch_mca_reconnect(uint8_t app_idx, uint8_t mcl_idx,
                                     uint8_t mdl_idx, tBTA_HL_DATA* p_data);
extern void bta_hl_dch_sdp_init(uint8_t app_idx, uint8_t mcl_idx,
                                uint8_t mdl_idx, tBTA_HL_DATA* p_data);
extern void bta_hl_dch_close_echo_test(uint8_t app_idx, uint8_t mcl_idx,
                                       uint8_t mdl_idx, tBTA_HL_DATA* p_data);
extern void bta_hl_dch_create_rsp(uint8_t app_idx, uint8_t mcl_idx,
                                  uint8_t mdl_idx, tBTA_HL_DATA* p_data);
extern void bta_hl_dch_mca_rcv_data(uint8_t app_idx, uint8_t mcl_idx,
                                    uint8_t mdl_idx, tBTA_HL_DATA* p_data);
extern void bta_hl_dch_close_cmpl(uint8_t app_idx, uint8_t mcl_idx,
                                  uint8_t mdl_idx, tBTA_HL_DATA* p_data);
extern void bta_hl_dch_mca_close_cfm(uint8_t app_idx, uint8_t mcl_idx,
                                     uint8_t mdl_idx, tBTA_HL_DATA* p_data);
extern void bta_hl_dch_mca_close_ind(uint8_t app_idx, uint8_t mcl_idx,
                                     uint8_t mdl_idx, tBTA_HL_DATA* p_data);
extern void bta_hl_dch_mca_close(uint8_t app_idx, uint8_t mcl_idx,
                                 uint8_t mdl_idx, tBTA_HL_DATA* p_data);
extern void bta_hl_dch_mca_delete_ind(uint8_t app_idx, uint8_t mcl_idx,
                                      uint8_t mdl_idx, tBTA_HL_DATA* p_data);

extern void bta_hl_dch_mca_delete_cfm(uint8_t app_idx, uint8_t mcl_idx,
                                      uint8_t mdl_idx, tBTA_HL_DATA* p_data);
extern void bta_hl_dch_mca_delete(uint8_t app_idx, uint8_t mcl_idx,
                                  uint8_t mdl_idx, tBTA_HL_DATA* p_data);
extern void bta_hl_dch_mca_abort_ind(uint8_t app_idx, uint8_t mcl_idx,
                                     uint8_t mdl_idx, tBTA_HL_DATA* p_data);
extern void bta_hl_dch_mca_abort_cfm(uint8_t app_idx, uint8_t mcl_idx,
                                     uint8_t mdl_idx, tBTA_HL_DATA* p_data);
extern void bta_hl_dch_mca_abort(uint8_t app_idx, uint8_t mcl_idx,
                                 uint8_t mdl_idx, tBTA_HL_DATA* p_data);
extern void bta_hl_dch_mca_open_ind(uint8_t app_idx, uint8_t mcl_idx,
                                    uint8_t mdl_idx, tBTA_HL_DATA* p_data);
extern void bta_hl_dch_mca_open_cfm(uint8_t app_idx, uint8_t mcl_idx,
                                    uint8_t mdl_idx, tBTA_HL_DATA* p_data);
extern void bta_hl_dch_mca_create_ind(uint8_t app_idx, uint8_t mcl_idx,
                                      uint8_t mdl_idx, tBTA_HL_DATA* p_data);
extern void bta_hl_dch_mca_create_cfm(uint8_t app_idx, uint8_t mcl_idx,
                                      uint8_t mdl_idx, tBTA_HL_DATA* p_data);
extern void bta_hl_dch_mca_create(uint8_t app_idx, uint8_t mcl_idx,
                                  uint8_t mdl_idx, tBTA_HL_DATA* p_data);
extern void bta_hl_deallocate_spd_cback(uint8_t sdp_cback_idx);
extern tSDP_DISC_CMPL_CB* bta_hl_allocate_spd_cback(tBTA_HL_SDP_OPER sdp_oper,
                                                    uint8_t app_idx,
                                                    uint8_t mcl_idx,
                                                    uint8_t mdl_idx,
                                                    uint8_t* p_sdp_cback_idx);
extern tBTA_HL_STATUS bta_hl_init_sdp(tBTA_HL_SDP_OPER sdp_oper,
                                      uint8_t app_idx, uint8_t mcl_idx,
                                      uint8_t mdl_idx);
extern void bta_hl_cch_sdp_init(uint8_t app_idx, uint8_t mcl_idx,
                                tBTA_HL_DATA* p_data);
extern void bta_hl_cch_mca_open(uint8_t app_idx, uint8_t mcl_idx,
                                tBTA_HL_DATA* p_data);
extern void bta_hl_cch_mca_close(uint8_t app_idx, uint8_t mcl_idx,
                                 tBTA_HL_DATA* p_data);
extern void bta_hl_cch_close_cmpl(uint8_t app_idx, uint8_t mcl_idx,
                                  tBTA_HL_DATA* p_data);
extern void bta_hl_cch_mca_disconnect(uint8_t app_idx, uint8_t mcl_idx,
                                      tBTA_HL_DATA* p_data);
extern void bta_hl_cch_mca_disc_open(uint8_t app_idx, uint8_t mcl_idx,
                                     tBTA_HL_DATA* p_data);
extern void bta_hl_cch_mca_rsp_tout(uint8_t app_idx, uint8_t mcl_idx,
                                    tBTA_HL_DATA* p_data);
extern void bta_hl_cch_mca_connect(uint8_t app_idx, uint8_t mcl_idx,
                                   tBTA_HL_DATA* p_data);

/* State machine drivers  */
extern void bta_hl_cch_sm_execute(uint8_t inst_idx, uint8_t mcl_idx,
                                  uint16_t event, tBTA_HL_DATA* p_data);
extern void bta_hl_dch_sm_execute(uint8_t inst_idx, uint8_t mcl_idx,
                                  uint8_t mdl_idx, uint16_t event,
                                  tBTA_HL_DATA* p_data);
/* MCAP callback functions  */
extern void bta_hl_mcap_ctrl_cback(tMCA_HANDLE handle, tMCA_CL mcl,
                                   uint8_t event, tMCA_CTRL* p_data);

extern void bta_hl_mcap_data_cback(tMCA_DL mdl, BT_HDR* p_pkt);

/* utility functions  */
extern bool bta_hl_set_ctrl_psm_for_dch(uint8_t app_idx, uint8_t mcl_idx,
                                        uint8_t mdl_idx, uint16_t ctrl_psm);
extern bool bta_hl_find_sdp_idx_using_ctrl_psm(tBTA_HL_SDP* p_sdp,
                                               uint16_t ctrl_psm,
                                               uint8_t* p_sdp_idx);
extern uint16_t bta_hl_set_user_tx_buf_size(uint16_t max_tx_size);
extern uint16_t bta_hl_set_user_rx_buf_size(uint16_t mtu);
extern uint8_t bta_hl_set_tx_win_size(uint16_t mtu, uint16_t mps);
extern uint16_t bta_hl_set_mps(uint16_t mtu);
extern void bta_hl_clean_mdl_cb(uint8_t app_idx, uint8_t mcl_idx,
                                uint8_t mdl_idx);
extern BT_HDR* bta_hl_get_buf(uint16_t data_size, bool fcs_use);
extern bool bta_hl_find_service_in_db(uint8_t app_idx, uint8_t mcl_idx,
                                      uint16_t service_uuid,
                                      tSDP_DISC_REC** pp_rec);
extern uint16_t bta_hl_get_service_uuids(uint8_t sdp_oper, uint8_t app_idx,
                                         uint8_t mcl_idx, uint8_t mdl_idx);
extern bool bta_hl_find_echo_cfg_rsp(uint8_t app_idx, uint8_t mcl_idx,
                                     uint8_t mdep_idx, uint8_t cfg,
                                     uint8_t* p_cfg_rsp);
extern bool bta_hl_validate_cfg(uint8_t app_idx, uint8_t mcl_idx,
                                uint8_t mdl_idx, uint8_t cfg);
extern bool bta_hl_find_cch_cb_indexes(tBTA_HL_DATA* p_msg, uint8_t* p_app_idx,
                                       uint8_t* p_mcl_idx);
extern bool bta_hl_find_dch_cb_indexes(tBTA_HL_DATA* p_msg, uint8_t* p_app_idx,
                                       uint8_t* p_mcl_idx, uint8_t* p_mdl_idx);
extern uint16_t bta_hl_allocate_mdl_id(uint8_t app_idx, uint8_t mcl_idx,
                                       uint8_t mdl_idx);
extern bool bta_hl_find_mdl_idx_using_handle(tBTA_HL_MDL_HANDLE mdl_handle,
                                             uint8_t* p_app_idx,
                                             uint8_t* p_mcl_idx,
                                             uint8_t* p_mdl_idx);
extern bool bta_hl_find_mdl_idx(uint8_t app_idx, uint8_t mcl_idx,
                                uint16_t mdl_id, uint8_t* p_mdl_idx);
extern bool bta_hl_find_an_active_mdl_idx(uint8_t app_idx, uint8_t mcl_idx,
                                          uint8_t* p_mdl_idx);
extern bool bta_hl_find_dch_setup_mdl_idx(uint8_t app_idx, uint8_t mcl_idx,
                                          uint8_t* p_mdl_idx);
extern bool bta_hl_find_an_in_use_mcl_idx(uint8_t app_idx, uint8_t* p_mcl_idx);
extern bool bta_hl_find_an_in_use_app_idx(uint8_t* p_app_idx);
extern bool bta_hl_find_app_idx(uint8_t app_id, uint8_t* p_app_idx);
extern bool bta_hl_find_app_idx_using_handle(tBTA_HL_APP_HANDLE app_handle,
                                             uint8_t* p_app_idx);
extern bool bta_hl_find_mcl_idx_using_handle(tBTA_HL_MCL_HANDLE mcl_handle,
                                             uint8_t* p_app_idx,
                                             uint8_t* p_mcl_idx);
extern bool bta_hl_find_mcl_idx(uint8_t app_idx, BD_ADDR p_bd_addr,
                                uint8_t* p_mcl_idx);
extern bool bta_hl_is_the_first_reliable_existed(uint8_t app_idx,
                                                 uint8_t mcl_idx);
extern bool bta_hl_find_non_active_mdl_cfg(uint8_t app_idx,
                                           uint8_t start_mdl_cfg_idx,
                                           uint8_t* p_mdl_cfg_idx);
extern bool bta_hl_find_avail_mdl_cfg_idx(uint8_t app_idx, uint8_t mcl_idx,
                                          uint8_t* p_mdl_cfg_idx);
extern bool bta_hl_find_mdl_cfg_idx(uint8_t app_idx, uint8_t mcl_idx,
                                    tBTA_HL_MDL_ID mdl_id,
                                    uint8_t* p_mdl_cfg_idx);
extern bool bta_hl_get_cur_time(uint8_t app_idx, uint8_t* p_cur_time);
extern void bta_hl_sort_cfg_time_idx(uint8_t app_idx, uint8_t* a, uint8_t n);
extern void bta_hl_compact_mdl_cfg_time(uint8_t app_idx, uint8_t mdep_id);
extern bool bta_hl_is_mdl_exsit_in_mcl(uint8_t app_idx, BD_ADDR bd_addr,
                                       tBTA_HL_MDL_ID mdl_id);
extern bool bta_hl_delete_mdl_cfg(uint8_t app_idx, BD_ADDR bd_addr,
                                  tBTA_HL_MDL_ID mdl_id);
extern bool bta_hl_is_mdl_value_valid(tBTA_HL_MDL_ID mdl_id);
extern bool bta_hl_find_mdep_cfg_idx(uint8_t app_idx,
                                     tBTA_HL_MDEP_ID local_mdep_id,
                                     uint8_t* p_mdep_cfg_idx);
extern void bta_hl_find_rxtx_apdu_size(uint8_t app_idx, uint8_t mdep_cfg_idx,
                                       uint16_t* p_rx_apu_size,
                                       uint16_t* p_tx_apu_size);
extern bool bta_hl_validate_peer_cfg(uint8_t app_idx, uint8_t mcl_idx,
                                     uint8_t mdl_idx,
                                     tBTA_HL_MDEP_ID peer_mdep_id,
                                     tBTA_HL_MDEP_ROLE peer_mdep_role,
                                     uint8_t sdp_idx);
extern tBTA_HL_STATUS bta_hl_chk_local_cfg(uint8_t app_idx, uint8_t mcl_idx,
                                           uint8_t mdep_cfg_idx,
                                           tBTA_HL_DCH_CFG local_cfg);

extern bool bta_hl_validate_reconnect_params(
    uint8_t app_idx, uint8_t mcl_idx, tBTA_HL_API_DCH_RECONNECT* p_reconnect,
    uint8_t* p_mdep_cfg_idx, uint8_t* p_mdl_cfg_idx);
extern bool bta_hl_find_avail_mcl_idx(uint8_t app_idx, uint8_t* p_mcl_idx);
extern bool bta_hl_find_avail_mdl_idx(uint8_t app_idx, uint8_t mcl_idx,
                                      uint8_t* p_mdl_idx);
extern bool bta_hl_is_a_duplicate_id(uint8_t app_id);
extern bool bta_hl_find_avail_app_idx(uint8_t* p_idx);
extern tBTA_HL_STATUS bta_hl_app_update(uint8_t app_id, bool is_register);
extern tBTA_HL_STATUS bta_hl_app_registration(uint8_t app_idx);
extern void bta_hl_discard_data(uint16_t event, tBTA_HL_DATA* p_data);
extern void bta_hl_save_mdl_cfg(uint8_t app_idx, uint8_t mcl_idx,
                                uint8_t mdl_idx);
extern void bta_hl_set_dch_chan_cfg(uint8_t app_idx, uint8_t mcl_idx,
                                    uint8_t mdl_idx, tBTA_HL_DATA* p_data);
extern bool bta_hl_get_l2cap_cfg(tBTA_HL_MDL_HANDLE mdl_hnd,
                                 tBTA_HL_L2CAP_CFG_INFO* p_cfg);
extern bool bta_hl_validate_chan_cfg(uint8_t app_idx, uint8_t mcl_idx,
                                     uint8_t mdl_idx);
extern bool bta_hl_is_cong_on(uint8_t app_id, BD_ADDR bd_addr,
                              tBTA_HL_MDL_ID mdl_id);
extern void bta_hl_check_cch_close(uint8_t app_idx, uint8_t mcl_idx,
                                   tBTA_HL_DATA* p_data, bool check_dch_setup);
extern void bta_hl_clean_app(uint8_t app_idx);
extern void bta_hl_check_deregistration(uint8_t app_idx, tBTA_HL_DATA* p_data);
extern void bta_hl_check_disable(tBTA_HL_DATA* p_data);
extern void bta_hl_build_abort_ind(tBTA_HL* p_evt_data,
                                   tBTA_HL_APP_HANDLE app_handle,
                                   tBTA_HL_MCL_HANDLE mcl_handle);
extern void bta_hl_build_abort_cfm(tBTA_HL* p_evt_data,
                                   tBTA_HL_APP_HANDLE app_handle,
                                   tBTA_HL_MCL_HANDLE mcl_handle,
                                   tBTA_HL_STATUS status);
extern void bta_hl_build_dch_close_cfm(tBTA_HL* p_evt_data,
                                       tBTA_HL_APP_HANDLE app_handle,
                                       tBTA_HL_MCL_HANDLE mcl_handle,
                                       tBTA_HL_MDL_HANDLE mdl_handle,
                                       tBTA_HL_STATUS status);
extern void bta_hl_build_dch_close_ind(tBTA_HL* p_evt_data,
                                       tBTA_HL_APP_HANDLE app_handle,
                                       tBTA_HL_MCL_HANDLE mcl_handle,
                                       tBTA_HL_MDL_HANDLE mdl_handle,
                                       bool intentional);
extern void bta_hl_build_send_data_cfm(tBTA_HL* p_evt_data,
                                       tBTA_HL_APP_HANDLE app_handle,
                                       tBTA_HL_MCL_HANDLE mcl_handle,
                                       tBTA_HL_MDL_HANDLE mdl_handle,
                                       tBTA_HL_STATUS status);
extern void bta_hl_build_rcv_data_ind(tBTA_HL* p_evt_data,
                                      tBTA_HL_APP_HANDLE app_handle,
                                      tBTA_HL_MCL_HANDLE mcl_handle,
                                      tBTA_HL_MDL_HANDLE mdl_handle);
extern void bta_hl_build_cch_open_cfm(tBTA_HL* p_evt_data, uint8_t app_id,
                                      tBTA_HL_APP_HANDLE app_handle,
                                      tBTA_HL_MCL_HANDLE mcl_handle,
                                      BD_ADDR bd_addr, tBTA_HL_STATUS status);
extern void bta_hl_build_cch_open_ind(tBTA_HL* p_evt_data,
                                      tBTA_HL_APP_HANDLE app_handle,
                                      tBTA_HL_MCL_HANDLE mcl_handle,
                                      BD_ADDR bd_addr);
extern void bta_hl_build_cch_close_cfm(tBTA_HL* p_evt_data,
                                       tBTA_HL_APP_HANDLE app_handle,
                                       tBTA_HL_MCL_HANDLE mcl_handle,
                                       tBTA_HL_STATUS status);
extern void bta_hl_build_cch_close_ind(tBTA_HL* p_evt_data,
                                       tBTA_HL_APP_HANDLE app_handle,
                                       tBTA_HL_MCL_HANDLE mcl_handle,
                                       bool intentional);

extern void bta_hl_build_dch_open_cfm(
    tBTA_HL* p_evt_data, tBTA_HL_APP_HANDLE app_handle,
    tBTA_HL_MCL_HANDLE mcl_handle, tBTA_HL_MDL_HANDLE mdl_handle,
    tBTA_HL_MDEP_ID local_mdep_id, tBTA_HL_MDL_ID mdl_id,
    tBTA_HL_DCH_MODE dch_mode, bool first_reliable, uint16_t mtu,
    tBTA_HL_STATUS status);

extern void bta_hl_build_delete_mdl_cfm(tBTA_HL* p_evt_data,
                                        tBTA_HL_APP_HANDLE app_handle,
                                        tBTA_HL_MCL_HANDLE mcl_handle,
                                        tBTA_HL_MDL_ID mdl_id,
                                        tBTA_HL_STATUS status);
extern void bta_hl_build_echo_test_cfm(tBTA_HL* p_evt_data,
                                       tBTA_HL_APP_HANDLE app_handle,
                                       tBTA_HL_MCL_HANDLE mcl_handle,
                                       tBTA_HL_STATUS status);
extern void bta_hl_build_sdp_query_cfm(tBTA_HL* p_evt_data, uint8_t app_id,
                                       tBTA_HL_APP_HANDLE app_handle,
                                       BD_ADDR bd_addr, tBTA_HL_SDP* p_sdp,
                                       tBTA_HL_STATUS status);

#if (BTA_HL_DEBUG == TRUE)
extern const char* bta_hl_status_code(tBTA_HL_STATUS status);
extern const char* bta_hl_evt_code(tBTA_HL_INT_EVT evt_code);
#endif

#endif /* BTA_MSE_INT_H */
