1/******************************************************************************
2 *
3 *  Copyright (C) 1998-2012 Broadcom Corporation
4 *
5 *  Licensed under the Apache License, Version 2.0 (the "License");
6 *  you may not use this file except in compliance with the License.
7 *  You may obtain a copy of the License at:
8 *
9 *  http://www.apache.org/licenses/LICENSE-2.0
10 *
11 *  Unless required by applicable law or agreed to in writing, software
12 *  distributed under the License is distributed on an "AS IS" BASIS,
13 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *  See the License for the specific language governing permissions and
15 *  limitations under the License.
16 *
17 ******************************************************************************/
18
19/******************************************************************************
20 *
21 *  This file contains the HeaLth device profile main functions and state
22 *  machine.
23 *
24 ******************************************************************************/
25#include <string.h>
26
27#include "bt_target.h"
28#if defined(HL_INCLUDED) && (HL_INCLUDED == TRUE)
29
30
31
32#include "bta_hl_api.h"
33#include "bta_hl_int.h"
34#include "gki.h"
35#include "utl.h"
36#include "bd.h"
37#include "l2c_api.h"
38#include "mca_defs.h"
39
40
41#if (BTA_HL_DEBUG == TRUE) && (BT_USE_TRACES == TRUE)
42static char *bta_hl_cch_state_code(tBTA_HL_CCH_STATE state_code);
43static char *bta_hl_dch_state_code(tBTA_HL_DCH_STATE state_code);
44#endif
45
46extern UINT16 L2CA_AllocateRandomPsm(void);
47extern UINT16 L2CA_AllocatePsm(void);
48/*****************************************************************************
49** DCH State Table
50*****************************************************************************/
51/*****************************************************************************
52** Constants and types
53*****************************************************************************/
54/* state machine action enumeration list for DCH */
55/* The order of this enumeration must be the same as bta_hl_dch_act_tbl[] */
56enum
57{
58    BTA_HL_DCH_MCA_CREATE,
59    BTA_HL_DCH_MCA_CREATE_CFM,
60    BTA_HL_DCH_MCA_CREATE_IND,
61    BTA_HL_DCH_MCA_OPEN_CFM,
62    BTA_HL_DCH_MCA_OPEN_IND,
63    BTA_HL_DCH_MCA_CLOSE,
64    BTA_HL_DCH_MCA_CLOSE_CFM,
65    BTA_HL_DCH_MCA_CLOSE_IND,
66    BTA_HL_DCH_CLOSE_CMPL,
67    BTA_HL_DCH_MCA_RCV_DATA,
68
69    BTA_HL_DCH_SDP_INIT,
70    BTA_HL_DCH_MCA_RECONNECT,
71    BTA_HL_DCH_MCA_RECONNECT_IND,
72    BTA_HL_DCH_MCA_RECONNECT_CFM,
73    BTA_HL_DCH_CLOSE_ECHO_TEST,
74    BTA_HL_DCH_CREATE_RSP,
75    BTA_HL_DCH_MCA_ABORT,
76    BTA_HL_DCH_MCA_ABORT_IND,
77    BTA_HL_DCH_MCA_ABORT_CFM,
78    BTA_HL_DCH_MCA_CONG_CHANGE,
79
80    BTA_HL_DCH_SDP_FAIL,
81    BTA_HL_DCH_SEND_DATA,
82    BTA_HL_DCH_CI_GET_TX_DATA,
83    BTA_HL_DCH_CI_PUT_RX_DATA,
84    BTA_HL_DCH_CI_GET_ECHO_DATA,
85    BTA_HL_DCH_ECHO_TEST,
86    BTA_HL_DCH_CI_PUT_ECHO_DATA,
87    BTA_HL_DCH_IGNORE
88};
89
90typedef void (*tBTA_HL_DCH_ACTION)(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx, tBTA_HL_DATA *p_data);
91
92static const tBTA_HL_DCH_ACTION bta_hl_dch_action[] =
93{
94    bta_hl_dch_mca_create,
95    bta_hl_dch_mca_create_cfm,
96    bta_hl_dch_mca_create_ind,
97    bta_hl_dch_mca_open_cfm,
98    bta_hl_dch_mca_open_ind,
99    bta_hl_dch_mca_close,
100    bta_hl_dch_mca_close_cfm,
101    bta_hl_dch_mca_close_ind,
102    bta_hl_dch_close_cmpl,
103    bta_hl_dch_mca_rcv_data,
104
105    bta_hl_dch_sdp_init,
106    bta_hl_dch_mca_reconnect,
107    bta_hl_dch_mca_reconnect_ind,
108    bta_hl_dch_mca_reconnect_cfm,
109    bta_hl_dch_close_echo_test,
110    bta_hl_dch_create_rsp,
111    bta_hl_dch_mca_abort,
112    bta_hl_dch_mca_abort_ind,
113    bta_hl_dch_mca_abort_cfm,
114    bta_hl_dch_mca_cong_change,
115
116    bta_hl_dch_sdp_fail,
117    bta_hl_dch_send_data,
118    bta_hl_dch_ci_get_tx_data,
119    bta_hl_dch_ci_put_rx_data,
120    bta_hl_dch_ci_get_echo_data,
121    bta_hl_dch_echo_test,
122    bta_hl_dch_ci_put_echo_data,
123};
124
125
126/* state table information */
127#define BTA_HL_DCH_ACTIONS             1       /* number of actions */
128#define BTA_HL_DCH_ACTION_COL          0       /* position of action */
129#define BTA_HL_DCH_NEXT_STATE          1       /* position of next state */
130#define BTA_HL_DCH_NUM_COLS            2       /* number of columns in state tables */
131
132/* state table for idle state */
133static const UINT8 bta_hl_dch_st_idle[][BTA_HL_DCH_NUM_COLS] =
134{
135/* Event                                Action 1                    Next state */
136/* BTA_HL_DCH_SDP_INIT_EVT   */     {BTA_HL_DCH_SDP_INIT,           BTA_HL_DCH_OPENING_ST},
137/* BTA_HL_DCH_OPEN_EVT       */     {BTA_HL_DCH_MCA_CREATE,         BTA_HL_DCH_OPENING_ST},
138/* BTA_HL_MCA_CREATE_IND_EVT */     {BTA_HL_DCH_MCA_CREATE_IND,     BTA_HL_DCH_OPENING_ST},
139/* BTA_HL_MCA_CREATE_CFM_EVT */     {BTA_HL_DCH_IGNORE,             BTA_HL_DCH_IDLE_ST},
140/* BTA_HL_MCA_OPEN_IND_EVT   */     {BTA_HL_DCH_IGNORE,             BTA_HL_DCH_IDLE_ST},
141
142/* BTA_HL_MCA_OPEN_CFM_EVT   */     {BTA_HL_DCH_IGNORE,             BTA_HL_DCH_IDLE_ST},
143/* BTA_HL_DCH_CLOSE_EVT      */     {BTA_HL_DCH_IGNORE,             BTA_HL_DCH_IDLE_ST},
144/* BTA_HL_MCA_CLOSE_IND_EVT  */     {BTA_HL_DCH_IGNORE,             BTA_HL_DCH_IDLE_ST},
145/* BTA_HL_MCA_CLOSE_CFM_EVT  */     {BTA_HL_DCH_IGNORE,             BTA_HL_DCH_IDLE_ST},
146/* BTA_HL_API_SEND_DATA_EVT  */     {BTA_HL_DCH_IGNORE,             BTA_HL_DCH_IDLE_ST},
147
148/* BTA_HL_MCA_RCV_DATA_EVT   */     {BTA_HL_DCH_IGNORE,             BTA_HL_DCH_IDLE_ST},
149/* BTA_HL_DCH_CLOSE_CMPL_EVT */     {BTA_HL_DCH_IGNORE,             BTA_HL_DCH_IDLE_ST},
150/* BTA_HL_DCH_RECONNECT_EVT  */     {BTA_HL_DCH_MCA_RECONNECT,      BTA_HL_DCH_OPENING_ST},
151/* BTA_HL_DCH_SDP_FAIL_EVT   */     {BTA_HL_DCH_IGNORE,             BTA_HL_DCH_IDLE_ST},
152/* BTA_HL_MCA_RECONNECT_IND_EVT*/   {BTA_HL_DCH_MCA_RECONNECT_IND,  BTA_HL_DCH_OPENING_ST},
153
154/* BTA_HL_MCA_RECONNECT_CFM_EVT*/   {BTA_HL_DCH_IGNORE,             BTA_HL_DCH_IDLE_ST},
155/* BTA_HL_DCH_CLOSE_ECHO_TEST_EVT*/ {BTA_HL_DCH_IGNORE,             BTA_HL_DCH_IDLE_ST},
156/* BTA_HL_API_DCH_CREATE_RSP_EVT */ {BTA_HL_DCH_IGNORE,             BTA_HL_DCH_IDLE_ST},
157/* BTA_HL_DCH_ABORT_EVT */          {BTA_HL_DCH_IGNORE,             BTA_HL_DCH_IDLE_ST},
158/* BTA_HL_MCA_ABORT_IND_EVT */      {BTA_HL_DCH_IGNORE,             BTA_HL_DCH_IDLE_ST},
159
160/* BTA_HL_MCA_ABORT_CFM_EVT */      {BTA_HL_DCH_IGNORE,             BTA_HL_DCH_IDLE_ST},
161/* BTA_HL_MCA_CONG_CHG_EVT */       {BTA_HL_DCH_IGNORE,             BTA_HL_DCH_IDLE_ST},
162/* BTA_HL_CI_GET_TX_DATA_EVT  */    {BTA_HL_DCH_IGNORE,             BTA_HL_DCH_IDLE_ST},
163/* BTA_HL_CI_PUT_RX_DATA_EVT  */    {BTA_HL_DCH_IGNORE,             BTA_HL_DCH_IDLE_ST},
164/* BTA_HL_CI_GET_ECHO_DATA_EVT  */  {BTA_HL_DCH_IGNORE,             BTA_HL_DCH_IDLE_ST},
165/* BTA_HL_DCH_ECHO_TEST_EVT  */     {BTA_HL_DCH_ECHO_TEST,          BTA_HL_DCH_OPENING_ST},
166/* BTA_HL_CI_PUT_ECHO_DATA_EVT  */  {BTA_HL_DCH_IGNORE,             BTA_HL_DCH_IDLE_ST}
167};
168
169/* state table for opening state */
170static const UINT8 bta_hl_dch_st_opening[][BTA_HL_DCH_NUM_COLS] =
171{
172/* Event                                Action 1                    Next state */
173/* BTA_HL_DCH_SDP_INIT_EVT   */   {BTA_HL_DCH_SDP_INIT,             BTA_HL_DCH_OPENING_ST},
174/* BTA_HL_DCH_OPEN_EVT       */   {BTA_HL_DCH_MCA_CREATE,           BTA_HL_DCH_OPENING_ST},
175/* BTA_HL_MCA_CREATE_IND_EVT */   {BTA_HL_DCH_IGNORE,               BTA_HL_DCH_OPENING_ST},
176/* BTA_HL_MCA_CREATE_CFM_EVT */   {BTA_HL_DCH_MCA_CREATE_CFM,       BTA_HL_DCH_OPENING_ST},
177/* BTA_HL_MCA_OPEN_IND_EVT   */   {BTA_HL_DCH_MCA_OPEN_IND,         BTA_HL_DCH_OPEN_ST},
178/* BTA_HL_MCA_OPEN_CFM_EVT   */   {BTA_HL_DCH_MCA_OPEN_CFM,         BTA_HL_DCH_OPEN_ST},
179/* BTA_HL_DCH_CLOSE_EVT      */   {BTA_HL_DCH_IGNORE,               BTA_HL_DCH_OPENING_ST},
180/* BTA_HL_MCA_CLOSE_IND_EVT  */   {BTA_HL_DCH_MCA_CLOSE_IND,        BTA_HL_DCH_CLOSING_ST},
181/* BTA_HL_MCA_CLOSE_CFM_EVT  */   {BTA_HL_DCH_MCA_CLOSE_CFM,        BTA_HL_DCH_CLOSING_ST},
182/* BTA_HL_API_SEND_DATA_EVT  */   {BTA_HL_DCH_IGNORE,               BTA_HL_DCH_OPEN_ST},
183
184/* BTA_HL_MCA_RCV_DATA_EVT   */   {BTA_HL_DCH_IGNORE,               BTA_HL_DCH_OPEN_ST},
185/* BTA_HL_DCH_CLOSE_CMPL_EVT */   {BTA_HL_DCH_CLOSE_CMPL,           BTA_HL_DCH_IDLE_ST},
186/* BTA_HL_DCH_RECONNECT_EVT  */   {BTA_HL_DCH_MCA_RECONNECT,        BTA_HL_DCH_OPENING_ST},
187/* BTA_HL_DCH_SDP_FAIL_EVT   */   {BTA_HL_DCH_SDP_FAIL,             BTA_HL_DCH_CLOSING_ST},
188/* BTA_HL_MCA_RECONNECT_IND_EVT*/ {BTA_HL_DCH_IGNORE,               BTA_HL_DCH_IDLE_ST},
189/* BTA_HL_MCA_RECONNECT_CFM_EVT*/ {BTA_HL_DCH_MCA_RECONNECT_CFM,    BTA_HL_DCH_OPENING_ST},
190/* BTA_HL_DCH_CLOSE_ECHO_TEST_EVT*/ {BTA_HL_DCH_IGNORE,             BTA_HL_DCH_OPENING_ST},
191/* BTA_HL_API_DCH_CREATE_RSP_EVT */ {BTA_HL_DCH_CREATE_RSP,         BTA_HL_DCH_OPENING_ST},
192/* BTA_HL_DCH_ABORT_EVT */          {BTA_HL_DCH_MCA_ABORT,          BTA_HL_DCH_OPENING_ST},
193/* BTA_HL_MCA_ABORT_IND_EVT */      {BTA_HL_DCH_MCA_ABORT_IND,      BTA_HL_DCH_OPENING_ST},
194
195/* BTA_HL_MCA_ABORT_CFM_EVT */      {BTA_HL_DCH_MCA_ABORT_CFM,      BTA_HL_DCH_OPENING_ST},
196/* BTA_HL_MCA_CONG_CHG_EVT */       {BTA_HL_DCH_IGNORE,             BTA_HL_DCH_OPENING_ST},
197/* BTA_HL_CI_GET_TX_DATA_EVT  */    {BTA_HL_DCH_IGNORE,             BTA_HL_DCH_OPENING_ST},
198/* BTA_HL_CI_PUT_RX_DATA_EVT  */    {BTA_HL_DCH_IGNORE,             BTA_HL_DCH_OPENING_ST},
199/* BTA_HL_CI_GET_ECHO_DATA_EVT  */  {BTA_HL_DCH_CI_GET_ECHO_DATA,   BTA_HL_DCH_OPENING_ST},
200/* BTA_HL_DCH_ECHO_TEST_EVT  */     {BTA_HL_DCH_ECHO_TEST,          BTA_HL_DCH_OPENING_ST},
201/* BTA_HL_CI_PUT_ECHO_DATA_EVT  */  {BTA_HL_DCH_IGNORE,             BTA_HL_DCH_OPENING_ST}
202};
203
204/* state table for open state */
205static const UINT8 bta_hl_dch_st_open[][BTA_HL_DCH_NUM_COLS] =
206{
207/* Event                                Action 1                  Next state */
208/* BTA_HL_DCH_SDP_INIT_EVT   */     {BTA_HL_DCH_IGNORE,           BTA_HL_DCH_OPEN_ST},
209/* BTA_HL_DCH_OPEN_EVT       */     {BTA_HL_DCH_IGNORE,           BTA_HL_DCH_OPEN_ST},
210/* BTA_HL_MCA_CREATE_IND_EVT */     {BTA_HL_DCH_IGNORE,           BTA_HL_DCH_OPEN_ST},
211/* BTA_HL_MCA_CREATE_CFM_EVT */     {BTA_HL_DCH_IGNORE,           BTA_HL_DCH_OPEN_ST},
212/* BTA_HL_MCA_OPEN_IND_EVT   */     {BTA_HL_DCH_IGNORE,           BTA_HL_DCH_OPEN_ST},
213/* BTA_HL_MCA_OPEN_CFM_EVT   */     {BTA_HL_DCH_IGNORE,           BTA_HL_DCH_OPEN_ST},
214/* BTA_HL_DCH_CLOSE_EVT      */     {BTA_HL_DCH_MCA_CLOSE,        BTA_HL_DCH_CLOSING_ST},
215/* BTA_HL_MCA_CLOSE_IND_EVT  */     {BTA_HL_DCH_MCA_CLOSE_IND,    BTA_HL_DCH_CLOSING_ST},
216/* BTA_HL_MCA_CLOSE_CFM_EVT  */     {BTA_HL_DCH_MCA_CLOSE_CFM,    BTA_HL_DCH_CLOSING_ST},
217/* BTA_HL_API_SEND_DATA_EVT  */     {BTA_HL_DCH_SEND_DATA,        BTA_HL_DCH_OPEN_ST},
218
219/* BTA_HL_MCA_RCV_DATA_EVT   */     {BTA_HL_DCH_MCA_RCV_DATA,     BTA_HL_DCH_OPEN_ST},
220/* BTA_HL_DCH_CLOSE_CMPL_EVT */     {BTA_HL_DCH_CLOSE_CMPL,       BTA_HL_DCH_IDLE_ST},
221/* BTA_HL_DCH_RECONNECT_EVT  */     {BTA_HL_DCH_IGNORE,           BTA_HL_DCH_OPEN_ST},
222/* BTA_HL_DCH_SDP_FAIL_EVT   */     {BTA_HL_DCH_IGNORE,           BTA_HL_DCH_OPEN_ST},
223/* BTA_HL_MCA_RECONNECT_IND_EVT*/   {BTA_HL_DCH_IGNORE,           BTA_HL_DCH_OPEN_ST},
224/* BTA_HL_MCA_RECONNECT_CFM_EVT*/   {BTA_HL_DCH_IGNORE,           BTA_HL_DCH_OPEN_ST},
225/* BTA_HL_DCH_CLOSE_ECHO_TEST_EVT*/ {BTA_HL_DCH_CLOSE_ECHO_TEST,  BTA_HL_DCH_CLOSING_ST},
226/* BTA_HL_API_DCH_CREATE_RSP_EVT */ {BTA_HL_DCH_IGNORE,           BTA_HL_DCH_OPEN_ST},
227/* BTA_HL_DCH_ABORT_EVT */          {BTA_HL_DCH_IGNORE,           BTA_HL_DCH_OPEN_ST},
228/* BTA_HL_MCA_ABORT_IND_EVT */      {BTA_HL_DCH_IGNORE,           BTA_HL_DCH_OPEN_ST},
229
230/* BTA_HL_DCH_ABORT_CFM_EVT */      {BTA_HL_DCH_IGNORE,           BTA_HL_DCH_OPEN_ST},
231/* BTA_HL_MCA_CONG_CHG_EVT */       {BTA_HL_DCH_MCA_CONG_CHANGE,  BTA_HL_DCH_OPEN_ST},
232/* BTA_HL_CI_GET_TX_DATA_EVT  */    {BTA_HL_DCH_CI_GET_TX_DATA,   BTA_HL_DCH_OPEN_ST},
233/* BTA_HL_CI_PUT_RX_DATA_EVT  */    {BTA_HL_DCH_CI_PUT_RX_DATA,   BTA_HL_DCH_OPEN_ST},
234/* BTA_HL_CI_GET_ECHO_DATA_EVT  */  {BTA_HL_DCH_CI_GET_ECHO_DATA, BTA_HL_DCH_OPEN_ST},
235/* BTA_HL_DCH_ECHO_TEST_EVT  */     {BTA_HL_DCH_IGNORE,           BTA_HL_DCH_OPEN_ST},
236/* BTA_HL_CI_PUT_ECHO_DATA_EVT  */  {BTA_HL_DCH_CI_PUT_ECHO_DATA, BTA_HL_DCH_OPEN_ST}
237};
238
239
240/* state table for closing state */
241static const UINT8 bta_hl_dch_st_closing[][BTA_HL_DCH_NUM_COLS] =
242{
243/* Event                                Action 1                  Next state */
244/* BTA_HL_DCH_SDP_INIT_EVT   */     {BTA_HL_DCH_IGNORE,           BTA_HL_DCH_CLOSING_ST},
245/* BTA_HL_DCH_OPEN_EVT       */     {BTA_HL_DCH_IGNORE,           BTA_HL_DCH_CLOSING_ST},
246/* BTA_HL_MCA_CREATE_IND_EVT */     {BTA_HL_DCH_IGNORE,           BTA_HL_DCH_CLOSING_ST},
247/* BTA_HL_MCA_CREATE_CFM_EVT */     {BTA_HL_DCH_IGNORE,           BTA_HL_DCH_CLOSING_ST},
248/* BTA_HL_MCA_OPEN_IND_EVT   */     {BTA_HL_DCH_IGNORE,           BTA_HL_DCH_CLOSING_ST},
249/* BTA_HL_MCA_OPEN_CFM_EVT   */     {BTA_HL_DCH_IGNORE,           BTA_HL_DCH_CLOSING_ST},
250/* BTA_HL_DCH_CLOSE_EVT      */     {BTA_HL_DCH_MCA_CLOSE,        BTA_HL_DCH_CLOSING_ST},
251/* BTA_HL_MCA_CLOSE_IND_EVT  */     {BTA_HL_DCH_IGNORE,           BTA_HL_DCH_CLOSING_ST},
252/* BTA_HL_MCA_CLOSE_CFM_EVT  */     {BTA_HL_DCH_MCA_CLOSE_CFM,    BTA_HL_DCH_CLOSING_ST},
253/* BTA_HL_API_SEND_DATA_EVT  */     {BTA_HL_DCH_IGNORE,           BTA_HL_DCH_CLOSING_ST},
254
255/* BTA_HL_MCA_RCV_DATA_EVT   */     {BTA_HL_DCH_IGNORE,           BTA_HL_DCH_CLOSING_ST},
256/* BTA_HL_DCH_CLOSE_CMPL_EVT */     {BTA_HL_DCH_CLOSE_CMPL,       BTA_HL_DCH_IDLE_ST},
257/* BTA_HL_DCH_RECONNECT_EVT  */     {BTA_HL_DCH_IGNORE,           BTA_HL_DCH_CLOSING_ST},
258/* BTA_HL_DCH_SDP_FAIL_EVT   */     {BTA_HL_DCH_IGNORE,           BTA_HL_DCH_CLOSING_ST},
259/* BTA_HL_MCA_RECONNECT_IND_EVT*/   {BTA_HL_DCH_IGNORE,           BTA_HL_DCH_CLOSING_ST},
260/* BTA_HL_MCA_RECONNECT_CFM_EVT*/   {BTA_HL_DCH_IGNORE,           BTA_HL_DCH_CLOSING_ST},
261/* BTA_HL_DCH_CLOSE_ECHO_TEST_EVT*/ {BTA_HL_DCH_IGNORE,           BTA_HL_DCH_CLOSING_ST},
262/* BTA_HL_API_DCH_CREATE_RSP_EVT */ {BTA_HL_DCH_IGNORE,           BTA_HL_DCH_CLOSING_ST},
263/* BTA_HL_DCH_ABORT_EVT */          {BTA_HL_DCH_IGNORE,           BTA_HL_DCH_CLOSING_ST},
264/* BTA_HL_MCA_ABORT_IND_EVT */      {BTA_HL_DCH_IGNORE,           BTA_HL_DCH_CLOSING_ST},
265
266/* BTA_HL_DCH_ABORT_CFM_EVT */      {BTA_HL_DCH_IGNORE,           BTA_HL_DCH_CLOSING_ST},
267/* BTA_HL_MCA_CONG_CHG_EVT */       {BTA_HL_DCH_IGNORE,           BTA_HL_DCH_CLOSING_ST},
268/* BTA_HL_CI_GET_TX_DATA_EVT  */    {BTA_HL_DCH_CI_GET_TX_DATA,   BTA_HL_DCH_CLOSING_ST},
269/* BTA_HL_CI_PUT_RX_DATA_EVT  */    {BTA_HL_DCH_CI_PUT_RX_DATA,   BTA_HL_DCH_CLOSING_ST},
270/* BTA_HL_CI_GET_ECHO_DATA_EVT  */  {BTA_HL_DCH_CI_GET_ECHO_DATA, BTA_HL_DCH_CLOSING_ST},
271/* BTA_HL_DCH_ECHO_TEST_EVT  */     {BTA_HL_DCH_IGNORE,           BTA_HL_DCH_CLOSING_ST},
272/* BTA_HL_CI_PUT_ECHO_DATA_EVT  */  {BTA_HL_DCH_CI_PUT_ECHO_DATA, BTA_HL_DCH_CLOSING_ST}
273};
274
275/* type for state table */
276typedef const UINT8 (*tBTA_HL_DCH_ST_TBL)[BTA_HL_DCH_NUM_COLS];
277
278/* state table */
279const tBTA_HL_DCH_ST_TBL bta_hl_dch_st_tbl[] =
280{
281    bta_hl_dch_st_idle,
282    bta_hl_dch_st_opening,
283    bta_hl_dch_st_open,
284    bta_hl_dch_st_closing
285};
286
287/*****************************************************************************
288** CCH State Table
289*****************************************************************************/
290/*****************************************************************************
291** Constants and types
292*****************************************************************************/
293/* state machine action enumeration list for CCH */
294enum
295{
296    BTA_HL_CCH_SDP_INIT,
297    BTA_HL_CCH_MCA_OPEN,
298    BTA_HL_CCH_MCA_CLOSE,
299    BTA_HL_CCH_CLOSE_CMPL,
300    BTA_HL_CCH_MCA_CONNECT,
301    BTA_HL_CCH_MCA_DISCONNECT,
302    BTA_HL_CCH_MCA_RSP_TOUT,
303    BTA_HL_CCH_MCA_DISC_OPEN,
304    BTA_HL_CCH_IGNORE
305};
306
307/* type for action functions */
308typedef void (*tBTA_HL_CCH_ACTION)(UINT8 app_idx, UINT8 mcl_idx, tBTA_HL_DATA *p_data);
309
310/* action function list for MAS */
311const tBTA_HL_CCH_ACTION bta_hl_cch_action[] =
312{
313    bta_hl_cch_sdp_init,
314    bta_hl_cch_mca_open,
315    bta_hl_cch_mca_close,
316    bta_hl_cch_close_cmpl,
317    bta_hl_cch_mca_connect,
318    bta_hl_cch_mca_disconnect,
319    bta_hl_cch_mca_rsp_tout,
320    bta_hl_cch_mca_disc_open
321};
322
323
324/* state table information */
325#define BTA_HL_CCH_ACTIONS             1       /* number of actions */
326#define BTA_HL_CCH_NEXT_STATE          1       /* position of next state */
327#define BTA_HL_CCH_NUM_COLS            2       /* number of columns in state tables */
328
329
330/* state table for MAS idle state */
331static const UINT8 bta_hl_cch_st_idle[][BTA_HL_CCH_NUM_COLS] =
332{
333/* Event                          Action 1                  Next state */
334/* BTA_HL_CCH_OPEN_EVT           */ {BTA_HL_CCH_SDP_INIT,       BTA_HL_CCH_OPENING_ST},
335/* BTA_HL_CCH_SDP_OK_EVT         */ {BTA_HL_CCH_IGNORE,         BTA_HL_CCH_IDLE_ST},
336/* BTA_HL_CCH_SDP_FAIL_EVT       */ {BTA_HL_CCH_IGNORE,         BTA_HL_CCH_IDLE_ST},
337/* BTA_HL_MCA_CONNECT_IND_EVT    */ {BTA_HL_CCH_MCA_CONNECT,    BTA_HL_CCH_OPEN_ST},
338/* BTA_HL_MCA_DISCONNECT_IND_EVT */ {BTA_HL_CCH_IGNORE,         BTA_HL_CCH_IDLE_ST},
339/* BTA_HL_CCH_CLOSE_EVT          */ {BTA_HL_CCH_IGNORE,         BTA_HL_CCH_IDLE_ST},
340/* BTA_HL_CCH_CLOSE_CMPL_EVT     */ {BTA_HL_CCH_IGNORE,         BTA_HL_CCH_IDLE_ST},
341/* BTA_HL_CCH_CLOSE_CMPL_EVT     */ {BTA_HL_CCH_IGNORE,         BTA_HL_CCH_IDLE_ST}
342};
343
344/* state table for obex/rfcomm connection state */
345static const UINT8 bta_hl_cch_st_opening[][BTA_HL_CCH_NUM_COLS] =
346{
347/* Event                          Action 1               Next state */
348/* BTA_HL_CCH_OPEN_EVT           */ {BTA_HL_CCH_IGNORE,         BTA_HL_CCH_OPENING_ST},
349/* BTA_HL_CCH_SDP_OK_EVT         */ {BTA_HL_CCH_MCA_OPEN,       BTA_HL_CCH_OPENING_ST},
350/* BTA_HL_CCH_SDP_FAIL_EVT       */ {BTA_HL_CCH_CLOSE_CMPL,     BTA_HL_CCH_IDLE_ST},
351/* BTA_HL_MCA_CONNECT_IND_EVT    */ {BTA_HL_CCH_MCA_CONNECT,    BTA_HL_CCH_OPEN_ST},
352/* BTA_HL_MCA_DISCONNECT_IND_EVT */ {BTA_HL_CCH_MCA_DISCONNECT, BTA_HL_CCH_CLOSING_ST},
353/* BTA_HL_CCH_CLOSE_EVT          */ {BTA_HL_CCH_MCA_CLOSE,      BTA_HL_CCH_CLOSING_ST},
354/* BTA_HL_CCH_CLOSE_CMPL_EVT     */ {BTA_HL_CCH_CLOSE_CMPL,     BTA_HL_CCH_IDLE_ST},
355/* BTA_HL_MCA_RSP_TOUT_IND_EVT   */ {BTA_HL_CCH_MCA_RSP_TOUT,   BTA_HL_CCH_CLOSING_ST}
356};
357
358/* state table for open state */
359static const UINT8 bta_hl_cch_st_open[][BTA_HL_CCH_NUM_COLS] =
360{
361/* Event                          Action 1                  Next state */
362/* BTA_HL_CCH_OPEN_EVT           */ {BTA_HL_CCH_IGNORE,         BTA_HL_CCH_OPEN_ST},
363/* BTA_HL_CCH_SDP_OK_EVT         */ {BTA_HL_CCH_IGNORE,         BTA_HL_CCH_OPEN_ST},
364/* BTA_HL_CCH_SDP_FAIL_EVT       */ {BTA_HL_CCH_IGNORE,         BTA_HL_CCH_OPEN_ST},
365/* BTA_HL_MCA_CONNECT_IND_EVT    */ {BTA_HL_CCH_IGNORE,         BTA_HL_CCH_OPEN_ST},
366/* BTA_HL_MCA_DISCONNECT_IND_EVT */ {BTA_HL_CCH_MCA_DISCONNECT, BTA_HL_CCH_CLOSING_ST},
367/* BTA_HL_CCH_CLOSE_EVT          */ {BTA_HL_CCH_MCA_CLOSE,      BTA_HL_CCH_CLOSING_ST},
368/* BTA_HL_CCH_CLOSE_CMPL_EVT     */ {BTA_HL_CCH_IGNORE,         BTA_HL_CCH_OPEN_ST},
369/* BTA_HL_MCA_RSP_TOUT_IND_EVT   */ {BTA_HL_CCH_MCA_RSP_TOUT,   BTA_HL_CCH_CLOSING_ST}
370};
371
372/* state table for closing state */
373static const UINT8 bta_hl_cch_st_closing[][BTA_HL_CCH_NUM_COLS] =
374{
375/* Event                          Action 1                  Next state */
376/* BTA_HL_CCH_OPEN_EVT           */ {BTA_HL_CCH_IGNORE,         BTA_HL_CCH_CLOSING_ST},
377/* BTA_HL_CCH_SDP_OK_EVT         */ {BTA_HL_CCH_CLOSE_CMPL,     BTA_HL_CCH_IDLE_ST},
378/* BTA_HL_CCH_SDP_FAIL_EVT       */ {BTA_HL_CCH_CLOSE_CMPL,     BTA_HL_CCH_IDLE_ST},
379/* BTA_HL_MCA_CONNECT_IND_EVT    */ {BTA_HL_CCH_MCA_DISC_OPEN,  BTA_HL_CCH_CLOSING_ST},
380/* BTA_HL_MCA_DISCONNECT_IND_EVT */ {BTA_HL_CCH_MCA_DISCONNECT, BTA_HL_CCH_CLOSING_ST},
381/* BTA_HL_CCH_CLOSE_EVT          */ {BTA_HL_CCH_MCA_CLOSE,      BTA_HL_CCH_CLOSING_ST},
382/* BTA_HL_CCH_CLOSE_CMPL_EVT     */ {BTA_HL_CCH_CLOSE_CMPL,     BTA_HL_CCH_IDLE_ST},
383/* BTA_HL_MCA_RSP_TOUT_IND_EVT   */ {BTA_HL_CCH_IGNORE,         BTA_HL_CCH_CLOSING_ST}
384};
385
386/* type for state table CCH */
387typedef const UINT8 (*tBTA_HL_CCH_ST_TBL)[BTA_HL_CCH_NUM_COLS];
388
389/* MAS state table */
390const tBTA_HL_CCH_ST_TBL bta_hl_cch_st_tbl[] =
391{
392    bta_hl_cch_st_idle,
393    bta_hl_cch_st_opening,
394    bta_hl_cch_st_open,
395    bta_hl_cch_st_closing
396};
397
398
399/*****************************************************************************
400** Global data
401*****************************************************************************/
402
403/* HL control block */
404#if BTA_DYNAMIC_MEMORY == FALSE
405tBTA_HL_CB  bta_hl_cb;
406#endif
407
408
409/*******************************************************************************
410**
411** Function         bta_hl_cch_sm_execute
412**
413** Description      State machine event handling function for CCH
414**
415** Returns          void
416**
417*******************************************************************************/
418void bta_hl_cch_sm_execute(UINT8 app_idx, UINT8 mcl_idx,
419                           UINT16 event, tBTA_HL_DATA *p_data)
420{
421    tBTA_HL_CCH_ST_TBL  state_table;
422    UINT8               action;
423    int                 i;
424    tBTA_HL_MCL_CB      *p_cb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
425
426#if (BTA_HL_DEBUG == TRUE) && (BT_USE_TRACES == TRUE)
427    tBTA_HL_CCH_STATE in_state = p_cb->cch_state;
428    UINT16             cur_evt = event;
429    APPL_TRACE_DEBUG3("HDP CCH Event Handler: State 0x%02x [%s], Event [%s]", in_state,
430                      bta_hl_cch_state_code(in_state),
431                      bta_hl_evt_code(cur_evt));
432#endif
433
434    /* look up the state table for the current state */
435    state_table = bta_hl_cch_st_tbl[p_cb->cch_state];
436
437    event &= 0x00FF;
438
439    /* set next state */
440    p_cb->cch_state = state_table[event][BTA_HL_CCH_NEXT_STATE];
441
442    for (i = 0; i < BTA_HL_CCH_ACTIONS; i++)
443    {
444        if ((action = state_table[event][i]) != BTA_HL_CCH_IGNORE)
445        {
446            (*bta_hl_cch_action[action])(app_idx, mcl_idx, p_data);
447        }
448        else
449        {
450            /* discard HDP data */
451            bta_hl_discard_data(p_data->hdr.event, p_data);
452            break;
453        }
454    }
455#if (BTA_HL_DEBUG == TRUE) && (BT_USE_TRACES == TRUE)
456    if (in_state != p_cb->cch_state)
457    {
458        APPL_TRACE_DEBUG3("HL CCH State Change: [%s] -> [%s] after [%s]",
459                          bta_hl_cch_state_code(in_state),
460                          bta_hl_cch_state_code(p_cb->cch_state),
461                          bta_hl_evt_code(cur_evt));
462    }
463#endif
464
465}
466
467/*******************************************************************************
468**
469** Function         bta_hl_dch_sm_execute
470**
471** Description      State machine event handling function for DCH
472**
473** Returns          void
474**
475*******************************************************************************/
476void bta_hl_dch_sm_execute(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx,
477                           UINT16 event, tBTA_HL_DATA *p_data)
478{
479    tBTA_HL_DCH_ST_TBL  state_table;
480    UINT8               action;
481    int                 i;
482    tBTA_HL_MDL_CB      *p_cb  = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
483
484#if (BTA_HL_DEBUG == TRUE) && (BT_USE_TRACES == TRUE)
485    tBTA_HL_DCH_STATE in_state = p_cb->dch_state;
486    UINT16             cur_evt = event;
487    APPL_TRACE_DEBUG3("HDP DCH Event Handler: State 0x%02x [%s], Event [%s]", in_state,
488                      bta_hl_dch_state_code(in_state),
489                      bta_hl_evt_code(cur_evt));
490#endif
491
492    /* look up the state table for the current state */
493    state_table = bta_hl_dch_st_tbl[p_cb->dch_state];
494    event -= BTA_HL_DCH_EVT_MIN;
495
496    /* set next state */
497    p_cb->dch_state = state_table[event][BTA_HL_DCH_NEXT_STATE];
498
499    for (i = 0; i < BTA_HL_DCH_ACTIONS; i++)
500    {
501        if ((action = state_table[event][i]) != BTA_HL_DCH_IGNORE)
502        {
503            (*bta_hl_dch_action[action])(app_idx, mcl_idx, mdl_idx, p_data);
504        }
505        else
506        {
507            /* discard mas data */
508            bta_hl_discard_data(p_data->hdr.event, p_data);
509            break;
510        }
511    }
512
513
514#if (BTA_HL_DEBUG == TRUE) && (BT_USE_TRACES == TRUE)
515    if (in_state != p_cb->dch_state)
516    {
517        APPL_TRACE_DEBUG3("HL DCH State Change: [%s] -> [%s] after [%s]",
518                          bta_hl_dch_state_code(in_state),
519                          bta_hl_dch_state_code(p_cb->dch_state),
520                          bta_hl_evt_code(cur_evt));
521    }
522#endif
523}
524/*******************************************************************************
525**
526** Function         bta_hl_api_enable
527**
528** Description      Process the API enable request to enable the HL subsystem
529**
530** Returns          void
531**
532*******************************************************************************/
533static void bta_hl_api_enable(tBTA_HL_CB *p_cb, tBTA_HL_DATA *p_data)
534{
535    tBTA_HL_CTRL    evt_data;
536
537    /* If already enabled then reject this request */
538    if (p_cb->enable)
539    {
540        APPL_TRACE_ERROR0("HL is already enabled");
541        evt_data.enable_cfm.status = BTA_HL_STATUS_FAIL;
542        if (p_data->api_enable.p_cback)
543            p_data->api_enable.p_cback(BTA_HL_CTRL_ENABLE_CFM_EVT, (tBTA_HL_CTRL *) &evt_data);
544        return;
545    }
546
547    /* Done with checking. now perform the enable oepration*/
548    /* initialize control block */
549    memset(p_cb, 0, sizeof(tBTA_HL_CB));
550    p_cb->enable = TRUE;
551    p_cb->p_ctrl_cback = p_data->api_enable.p_cback;
552    evt_data.enable_cfm.status = BTA_HL_STATUS_OK;
553    if (p_data->api_enable.p_cback)
554        p_data->api_enable.p_cback(BTA_HL_CTRL_ENABLE_CFM_EVT, (tBTA_HL_CTRL *) &evt_data);
555
556}
557/*******************************************************************************
558**
559** Function         bta_hl_api_disable
560**
561** Description      Process the API disable request to disable the HL subsystem
562**
563** Returns          void
564**
565*******************************************************************************/
566static void bta_hl_api_disable(tBTA_HL_CB *p_cb, tBTA_HL_DATA *p_data)
567{
568    tBTA_HL_CTRL    evt_data;
569    tBTA_HL_STATUS  status = BTA_HL_STATUS_OK;
570
571    if (p_cb->enable)
572    {
573        p_cb->disabling = TRUE;
574        bta_hl_check_disable(p_data);
575    }
576    else
577    {
578        status = BTA_HL_STATUS_FAIL;
579        evt_data.disable_cfm.status = status;
580        if (p_cb->p_ctrl_cback) p_cb->p_ctrl_cback(BTA_HL_CTRL_DISABLE_CFM_EVT, (tBTA_HL_CTRL *) &evt_data);
581    }
582
583
584#if BTA_HL_DEBUG == TRUE
585    if (status != BTA_HL_STATUS_OK)
586    {
587        APPL_TRACE_DEBUG1("bta_hl_api_disable status =%s", bta_hl_status_code(status));
588    }
589#endif
590
591}
592
593/*******************************************************************************
594**
595** Function         bta_hl_api_update
596**
597** Description      Process the API registration request to register an HDP applciation
598**
599** Returns          void
600**
601*******************************************************************************/
602static void bta_hl_api_update(tBTA_HL_CB *p_cb, tBTA_HL_DATA *p_data)
603{
604    tBTA_HL         evt_data;
605    tBTA_HL_APP_CB  *p_acb = BTA_HL_GET_APP_CB_PTR(0);
606    tBTA_HL_STATUS  status = BTA_HL_STATUS_FAIL;
607
608
609    APPL_TRACE_DEBUG0("bta_hl_api_update");
610    if (p_cb->enable)
611    {
612
613        status = bta_hl_app_update(p_data->api_update.app_id, p_data->api_update.is_register);
614        if (!p_data->api_update.is_register)
615        {
616            APPL_TRACE_DEBUG0("Deregister");
617            memset(&evt_data, 0, sizeof(tBTA_HL));
618            evt_data.dereg_cfm.status = status;
619            evt_data.dereg_cfm.app_id = p_data->api_update.app_id;
620            if (status == BTA_HL_STATUS_OK)
621                evt_data.dereg_cfm.app_handle = p_acb->app_handle;
622            if (p_acb->p_cback)
623            {
624                p_acb->p_cback(BTA_HL_DEREGISTER_CFM_EVT, (tBTA_HL *) &evt_data);
625            }
626            return ;
627        }
628
629    }
630
631    if (status != BTA_HL_STATUS_OK)
632    {
633        if ((status != BTA_HL_STATUS_DUPLICATE_APP_ID) &&
634            (status != BTA_HL_STATUS_NO_RESOURCE))
635        {
636            if (p_acb)
637                memset(p_acb, 0, sizeof(tBTA_HL_APP_CB));
638        }
639    }
640#if BTA_HL_DEBUG == TRUE
641    if (status != BTA_HL_STATUS_OK)
642    {
643        APPL_TRACE_DEBUG1("bta_hl_api_register status =%s", bta_hl_status_code(status));
644    }
645#endif
646
647    memset(&evt_data, 0, sizeof(tBTA_HL));
648    evt_data.reg_cfm.status = status;
649    evt_data.reg_cfm.app_id = p_data->api_update.app_id;
650    if (status == BTA_HL_STATUS_OK)
651        evt_data.reg_cfm.app_handle = p_acb->app_handle;
652    if (p_data->api_reg.p_cback)
653    {
654        p_data->api_reg.p_cback(BTA_HL_REGISTER_CFM_EVT, (tBTA_HL *) &evt_data);
655    }
656
657    if (status == BTA_HL_STATUS_OK)
658    {
659        evt_data.sdp_info_ind.app_handle = p_acb->app_handle;
660        evt_data.sdp_info_ind.ctrl_psm = p_acb->ctrl_psm;
661        evt_data.sdp_info_ind.data_psm = p_acb->data_psm;
662        evt_data.sdp_info_ind.data_x_spec = BTA_HL_SDP_IEEE_11073_20601;
663        evt_data.sdp_info_ind.mcap_sup_procs = BTA_HL_MCAP_SUP_PROC_MASK ;
664
665        if (p_data->api_reg.p_cback)
666        {
667            p_data->api_reg.p_cback(BTA_HL_SDP_INFO_IND_EVT, (tBTA_HL *) &evt_data);
668        }
669    }
670}
671
672/*******************************************************************************
673**
674** Function         bta_hl_api_register
675**
676** Description      Process the API registration request to register an HDP applciation
677**
678** Returns          void
679**
680*******************************************************************************/
681static void bta_hl_api_register(tBTA_HL_CB *p_cb, tBTA_HL_DATA *p_data)
682{
683    tBTA_HL         evt_data;
684    UINT8           app_idx;
685    tBTA_HL_APP_CB  *p_acb = NULL;
686    tBTA_HL_STATUS  status = BTA_HL_STATUS_FAIL;
687
688
689    if (p_cb->enable)
690    {
691        if (!bta_hl_is_a_duplicate_id(p_data->api_reg.app_id))
692        {
693            if (bta_hl_find_avail_app_idx(&app_idx))
694            {
695                p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
696                p_acb->in_use = TRUE;
697                p_acb->app_id = p_data->api_reg.app_id;
698                p_acb->p_cback = p_data->api_reg.p_cback;
699                p_acb->sec_mask = p_data->api_reg.sec_mask;
700                p_acb->dev_type = p_data->api_reg.dev_type;
701                BCM_STRNCPY_S(p_acb->srv_name, sizeof(p_acb->srv_name), p_data->api_reg.srv_name, BTA_SERVICE_NAME_LEN);
702                BCM_STRNCPY_S(p_acb->srv_desp, sizeof(p_acb->srv_desp), p_data->api_reg.srv_desp, BTA_SERVICE_DESP_LEN);
703                BCM_STRNCPY_S(p_acb->provider_name, sizeof(p_acb->provider_name), p_data->api_reg.provider_name, BTA_PROVIDER_NAME_LEN);
704                bta_hl_cb.p_alloc_psm = L2CA_AllocatePSM;
705                p_acb->ctrl_psm = bta_hl_cb.p_alloc_psm();
706                p_acb->data_psm = bta_hl_cb.p_alloc_psm();
707                p_acb->p_mcap_cback = bta_hl_mcap_ctrl_cback;
708                status = bta_hl_app_registration(app_idx);
709            }
710            else
711            {
712                status = BTA_HL_STATUS_NO_RESOURCE;
713            }
714        }
715        else
716        {
717            status = BTA_HL_STATUS_DUPLICATE_APP_ID;
718        }
719    }
720
721    if (status != BTA_HL_STATUS_OK)
722    {
723        if ((status != BTA_HL_STATUS_DUPLICATE_APP_ID) &&
724            (status != BTA_HL_STATUS_NO_RESOURCE))
725        {
726            if (p_acb)
727                memset(p_acb, 0, sizeof(tBTA_HL_APP_CB));
728        }
729    }
730#if BTA_HL_DEBUG == TRUE
731    if (status != BTA_HL_STATUS_OK)
732    {
733        APPL_TRACE_DEBUG1("bta_hl_api_register status =%s", bta_hl_status_code(status));
734    }
735#endif
736
737    memset(&evt_data, 0, sizeof(tBTA_HL));
738    evt_data.reg_cfm.status = status;
739    evt_data.reg_cfm.app_id = p_data->api_reg.app_id;
740    if (status == BTA_HL_STATUS_OK)
741        evt_data.reg_cfm.app_handle = p_acb->app_handle;
742    if (p_data->api_reg.p_cback)
743    {
744        p_data->api_reg.p_cback(BTA_HL_REGISTER_CFM_EVT, (tBTA_HL *) &evt_data);
745    }
746
747    if (status == BTA_HL_STATUS_OK)
748    {
749        evt_data.sdp_info_ind.app_handle = p_acb->app_handle;
750        evt_data.sdp_info_ind.ctrl_psm = p_acb->ctrl_psm;
751        evt_data.sdp_info_ind.data_psm = p_acb->data_psm;
752        evt_data.sdp_info_ind.data_x_spec = BTA_HL_SDP_IEEE_11073_20601;
753        evt_data.sdp_info_ind.mcap_sup_procs = BTA_HL_MCAP_SUP_PROC_MASK ;
754
755        if (p_data->api_reg.p_cback)
756        {
757            p_data->api_reg.p_cback(BTA_HL_SDP_INFO_IND_EVT, (tBTA_HL *) &evt_data);
758        }
759    }
760}
761
762/*******************************************************************************
763**
764** Function         bta_hl_api_deregister
765**
766** Description      Process the API de-registration request
767**
768** Returns          void
769**
770*******************************************************************************/
771static void bta_hl_api_deregister(tBTA_HL_CB *p_cb, tBTA_HL_DATA *p_data)
772{
773
774    UINT8           app_idx;
775    tBTA_HL_APP_CB  *p_acb;
776
777    if (bta_hl_find_app_idx_using_handle(p_data->api_dereg.app_handle, &app_idx))
778    {
779        p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
780        p_acb->deregistering= TRUE;
781        bta_hl_check_deregistration(app_idx,p_data);
782    }
783    else
784    {
785        APPL_TRACE_ERROR1("Invalid app_handle=%d", p_data->api_dereg.app_handle);
786    }
787}
788
789/*******************************************************************************
790**
791** Function         bta_hl_api_cch_open
792**
793** Description      Process the API CCH open request
794**
795** Returns          void
796**
797*******************************************************************************/
798static void bta_hl_api_cch_open(tBTA_HL_CB *p_cb, tBTA_HL_DATA *p_data)
799{
800    tBTA_HL         evt_data;
801    tBTA_HL_STATUS  status = BTA_HL_STATUS_OK;
802    UINT8           app_idx, mcl_idx;
803    tBTA_HL_APP_CB  *p_acb;
804    tBTA_HL_MCL_CB  *p_mcb;
805
806    if (bta_hl_find_app_idx_using_handle(p_data->api_cch_open.app_handle, &app_idx))
807    {
808
809        if (!bta_hl_find_mcl_idx(app_idx, p_data->api_cch_open.bd_addr, &mcl_idx))
810        {
811            if (bta_hl_find_avail_mcl_idx(app_idx, &mcl_idx))
812            {
813                p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
814                p_mcb->in_use = TRUE;
815                p_mcb->req_ctrl_psm = p_data->api_cch_open.ctrl_psm;
816                p_mcb->sec_mask = p_data->api_cch_open.sec_mask;
817                bdcpy(p_mcb->bd_addr, p_data->api_cch_open.bd_addr);
818                p_mcb->cch_oper = BTA_HL_CCH_OP_LOCAL_OPEN;
819            }
820            else
821            {
822                status = BTA_HL_STATUS_NO_RESOURCE;
823            }
824        }
825        else
826        {
827            /* Only one MCL per BD_ADDR */
828            status = BTA_HL_STATUS_DUPLICATE_CCH_OPEN;
829            APPL_TRACE_DEBUG1("bta_hl_api_cch_open: CCH already open: status =%d",status)
830            p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
831            p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
832            if (p_acb->p_cback)
833            {
834                bta_hl_build_cch_open_cfm(&evt_data, p_data->api_cch_open.app_id,
835                                          p_data->api_cch_open.app_handle,
836                                          p_mcb->mcl_handle,
837                                          p_data->api_cch_open.bd_addr,
838                                          status);
839                p_acb->p_cback(BTA_HL_CCH_OPEN_CFM_EVT,(tBTA_HL *) &evt_data );
840            }
841            else
842            {
843                APPL_TRACE_ERROR0("bta_hl_api_cch_open Null Callback");
844            }
845            return;
846        }
847    }
848    else
849    {
850        status = BTA_HL_STATUS_INVALID_APP_HANDLE;
851    }
852#if BTA_HL_DEBUG == TRUE
853    if (status != BTA_HL_STATUS_OK)
854    {
855        APPL_TRACE_DEBUG1("bta_hl_api_cch_open status =%s", bta_hl_status_code(status));
856    }
857#endif
858    switch (status)
859    {
860        case BTA_HL_STATUS_OK:
861            bta_hl_cch_sm_execute(app_idx, mcl_idx, BTA_HL_CCH_OPEN_EVT, p_data);
862            break;
863        case BTA_HL_STATUS_NO_RESOURCE:
864        case BTA_HL_STATUS_FAIL:
865
866            p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
867            if (p_acb->p_cback)
868            {
869                bta_hl_build_cch_open_cfm(&evt_data, p_data->api_cch_open.app_id,
870                                          p_data->api_cch_open.app_handle,
871                                          0,
872                                          p_data->api_cch_open.bd_addr,
873                                          status);
874                p_acb->p_cback(BTA_HL_CCH_OPEN_CFM_EVT,(tBTA_HL *) &evt_data );
875            }
876            else
877            {
878                APPL_TRACE_ERROR0("bta_hl_api_cch_open Null Callback");
879            }
880            break;
881        default:
882            APPL_TRACE_ERROR1("status code=%d", status);
883            break;
884    }
885}
886
887/*******************************************************************************
888**
889** Function         bta_hl_api_cch_close
890**
891** Description      Process the API CCH close request
892**
893** Returns          void
894**
895*******************************************************************************/
896static void bta_hl_api_cch_close(tBTA_HL_CB *p_cb, tBTA_HL_DATA *p_data)
897{
898    tBTA_HL         evt_data;
899    tBTA_HL_STATUS  status = BTA_HL_STATUS_OK;
900    UINT8           app_idx, mcl_idx;
901    tBTA_HL_APP_CB  *p_acb;
902    tBTA_HL_MCL_CB  *p_mcb;
903
904    if (bta_hl_find_mcl_idx_using_handle(p_data->api_cch_close.mcl_handle, &app_idx,  &mcl_idx))
905    {
906        p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
907        p_mcb->cch_oper = BTA_HL_CCH_OP_LOCAL_CLOSE;
908    }
909    else
910    {
911        status = BTA_HL_STATUS_INVALID_MCL_HANDLE;
912    }
913#if BTA_HL_DEBUG == TRUE
914    if (status != BTA_HL_STATUS_OK)
915    {
916        APPL_TRACE_DEBUG1("bta_hl_api_cch_close status =%s", bta_hl_status_code(status));
917    }
918#endif
919    switch (status)
920    {
921        case BTA_HL_STATUS_OK:
922            bta_hl_check_cch_close(app_idx, mcl_idx, p_data, TRUE);
923            break;
924
925        case BTA_HL_STATUS_INVALID_MCL_HANDLE:
926            p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
927            if (p_acb->p_cback)
928            {
929                bta_hl_build_cch_close_cfm(&evt_data,
930                                       p_acb->app_handle,
931                                       p_data->api_cch_close.mcl_handle,
932                                       status);
933                p_acb->p_cback(BTA_HL_CCH_CLOSE_CFM_EVT,(tBTA_HL *) &evt_data );
934            }
935            else
936            {
937                APPL_TRACE_ERROR0("bta_hl_api_cch_close Null Callback");
938            }
939            break;
940
941        default:
942            APPL_TRACE_ERROR1("status code=%d", status);
943            break;
944
945    }
946
947}
948
949/*******************************************************************************
950**
951** Function         bta_hl_api_dch_open
952**
953** Description      Process the API DCH open request
954**
955** Returns          void
956**
957*******************************************************************************/
958static void bta_hl_api_dch_open(tBTA_HL_CB *p_cb, tBTA_HL_DATA *p_data)
959{
960    tBTA_HL                     evt_data;
961    tBTA_HL_STATUS              status = BTA_HL_STATUS_OK;
962    UINT8                       app_idx, mcl_idx, mdl_idx;
963    tBTA_HL_APP_CB              *p_acb;
964    tBTA_HL_MCL_CB              *p_mcb;
965    tBTA_HL_MDL_CB              *p_dcb;
966    tBTA_HL_MDEP_CFG            *p_mdep_cfg;
967    UINT8                       mdep_cfg_idx;
968
969    if (bta_hl_find_mcl_idx_using_handle(p_data->api_dch_open.mcl_handle, &app_idx, &mcl_idx))
970    {
971        p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
972        p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
973
974        APPL_TRACE_DEBUG4("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);
975        if (p_mcb->cch_state == BTA_HL_CCH_OPEN_ST)
976        {
977            if (bta_hl_find_avail_mdl_idx(app_idx, mcl_idx, &mdl_idx))
978            {
979                p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
980
981                if (bta_hl_find_mdep_cfg_idx(app_idx, p_data->api_dch_open.local_mdep_id, &mdep_cfg_idx))
982                {
983                    if ( mdep_cfg_idx &&
984                         (p_acb->sup_feature.mdep[mdep_cfg_idx].mdep_cfg.mdep_role == BTA_HL_MDEP_ROLE_SINK))
985                    {
986                        p_data->api_dch_open.local_cfg = BTA_HL_DCH_CFG_NO_PREF;
987                    }
988
989                    if ((status = bta_hl_chk_local_cfg(app_idx,mcl_idx,mdep_cfg_idx,p_data->api_dch_open.local_cfg))
990                        == BTA_HL_STATUS_OK)
991                    {
992
993                        if (p_data->api_dch_open.local_mdep_id != BTA_HL_ECHO_TEST_MDEP_ID)
994                        {
995                            if (bta_hl_set_ctrl_psm_for_dch(app_idx, mcl_idx, mdl_idx, p_data->api_dch_open.ctrl_psm))
996                            {
997                                p_mdep_cfg = BTA_HL_GET_MDEP_CFG_PTR(app_idx, mdep_cfg_idx);
998                                p_dcb->in_use                   = TRUE;
999                                p_dcb->dch_oper                 = BTA_HL_DCH_OP_LOCAL_OPEN;
1000                                p_dcb->sec_mask                 = p_data->api_dch_open.sec_mask;
1001                                p_dcb->local_mdep_id            = p_data->api_dch_open.local_mdep_id;
1002                                p_dcb->peer_mdep_id             = p_data->api_dch_open.peer_mdep_id;
1003
1004                                if (p_mdep_cfg->mdep_role == BTA_HL_MDEP_ROLE_SINK)
1005                                {
1006                                    p_dcb->peer_mdep_role = BTA_HL_MDEP_ROLE_SOURCE;
1007                                }
1008                                else
1009                                {
1010                                    p_dcb->peer_mdep_role = BTA_HL_MDEP_ROLE_SINK;
1011                                }
1012
1013                                p_dcb->local_mdep_cfg_idx   = mdep_cfg_idx;
1014                                p_dcb->local_cfg            = p_data->api_dch_open.local_cfg;
1015
1016                                bta_hl_find_rxtx_apdu_size(app_idx, mdep_cfg_idx,
1017                                                           &p_dcb->max_rx_apdu_size,
1018                                                           &p_dcb->max_tx_apdu_size);
1019                                p_dcb->mdl_id               = bta_hl_allocate_mdl_id(app_idx,mcl_idx,mdl_idx);
1020                                p_dcb->mdl_cfg_idx_included = FALSE;
1021                            }
1022                            else
1023                            {
1024                                status =  BTA_HL_STATUS_INVALID_CTRL_PSM;
1025                            }
1026
1027                        }
1028                        else
1029                        {
1030                            status =  BTA_HL_STATUS_INVALID_LOCAL_MDEP_ID;
1031                        }
1032                    }
1033                }
1034                else
1035                {
1036                    status =  BTA_HL_STATUS_INVALID_LOCAL_MDEP_ID;
1037                }
1038            }
1039            else
1040            {
1041                status = BTA_HL_STATUS_NO_RESOURCE;
1042            }
1043        }
1044        else
1045        {
1046            status =  BTA_HL_STATUS_NO_CCH;
1047        }
1048    }
1049    else
1050    {
1051        status = BTA_HL_STATUS_INVALID_MCL_HANDLE;
1052    }
1053
1054#if BTA_HL_DEBUG == TRUE
1055    if (status != BTA_HL_STATUS_OK)
1056    {
1057        APPL_TRACE_DEBUG1("bta_hl_api_dch_open status =%s", bta_hl_status_code(status));
1058    }
1059#endif
1060    switch (status)
1061    {
1062        case BTA_HL_STATUS_OK:
1063            if (p_mcb->sdp.num_recs)
1064            {
1065                bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_OPEN_EVT, p_data);
1066            }
1067            else
1068            {
1069                bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_SDP_INIT_EVT, p_data);
1070            }
1071            break;
1072        case BTA_HL_STATUS_INVALID_DCH_CFG:
1073        case BTA_HL_STATUS_NO_FIRST_RELIABLE:
1074        case BTA_HL_STATUS_NO_CCH:
1075        case BTA_HL_STATUS_NO_RESOURCE:
1076        case BTA_HL_STATUS_FAIL:
1077        case BTA_HL_STATUS_INVALID_LOCAL_MDEP_ID:
1078        case BTA_HL_STATUS_INVALID_CTRL_PSM:
1079            p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
1080            if (p_acb->p_cback)
1081            {
1082                bta_hl_build_dch_open_cfm(&evt_data,
1083                                          p_acb->app_handle,
1084                                          p_data->api_dch_open.mcl_handle,
1085                                          BTA_HL_INVALID_MDL_HANDLE,
1086                                          0,0,0,0,0, status);
1087                p_acb->p_cback(BTA_HL_DCH_OPEN_CFM_EVT,(tBTA_HL *) &evt_data );
1088            }
1089            else
1090            {
1091                APPL_TRACE_ERROR0("bta_hl_api_dch_open Null Callback");
1092            }
1093
1094            break;
1095        default:
1096            APPL_TRACE_ERROR1("Status code=%d", status);
1097            break;
1098
1099    }
1100
1101}
1102/*******************************************************************************
1103**
1104** Function         bta_hl_api_dch_close
1105**
1106** Description      Process the API DCH close request
1107**
1108** Returns          void
1109**
1110*******************************************************************************/
1111static void bta_hl_api_dch_close(tBTA_HL_CB *p_cb, tBTA_HL_DATA *p_data)
1112{
1113    tBTA_HL         evt_data;
1114    tBTA_HL_STATUS  status = BTA_HL_STATUS_OK;
1115    UINT8           app_idx, mcl_idx, mdl_idx;
1116    tBTA_HL_APP_CB  *p_acb;
1117    tBTA_HL_MCL_CB  *p_mcb;
1118    tBTA_HL_MDL_CB  *p_dcb;
1119
1120
1121    if (bta_hl_find_mdl_idx_using_handle(p_data->api_dch_close.mdl_handle, &app_idx, &mcl_idx, &mdl_idx ))
1122    {
1123        p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
1124        if (p_dcb->dch_state != BTA_HL_DCH_OPEN_ST)
1125        {
1126            status =  BTA_HL_STATUS_FAIL;
1127        }
1128    }
1129    else
1130    {
1131        status = BTA_HL_STATUS_INVALID_MDL_HANDLE;
1132    }
1133
1134#if BTA_HL_DEBUG == TRUE
1135    if (status != BTA_HL_STATUS_OK)
1136    {
1137        APPL_TRACE_DEBUG1("bta_hl_api_dch_close status =%s", bta_hl_status_code(status));
1138    }
1139#endif
1140
1141    switch (status)
1142    {
1143        case BTA_HL_STATUS_OK:
1144            bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_EVT, p_data);
1145            break;
1146        case BTA_HL_STATUS_FAIL:
1147            p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
1148            if (p_acb->p_cback)
1149            {
1150                p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
1151                bta_hl_build_dch_close_cfm(&evt_data,
1152                                           p_acb->app_handle,
1153                                           p_mcb->mcl_handle,
1154                                           p_data->api_dch_close.mdl_handle,
1155                                           status);
1156
1157                p_acb->p_cback(BTA_HL_DCH_CLOSE_CFM_EVT,(tBTA_HL *) &evt_data );
1158            }
1159            else
1160            {
1161                APPL_TRACE_ERROR0("bta_hl_api_dch_close Null Callback");
1162            }
1163            break;
1164        default:
1165            APPL_TRACE_ERROR1("Status code=%d", status);
1166            break;
1167    }
1168}
1169
1170
1171/*******************************************************************************
1172**
1173** Function         bta_hl_api_dch_reconnect
1174**
1175** Description      Process the API DCH reconnect request
1176**
1177** Returns          void
1178**
1179*******************************************************************************/
1180static void bta_hl_api_dch_reconnect(tBTA_HL_CB *p_cb, tBTA_HL_DATA *p_data)
1181{
1182    tBTA_HL         evt_data;
1183    tBTA_HL_STATUS  status = BTA_HL_STATUS_OK;
1184    UINT8           app_idx, mcl_idx, mdl_idx;
1185    tBTA_HL_APP_CB  *p_acb;
1186    tBTA_HL_MCL_CB  *p_mcb;
1187    tBTA_HL_MDL_CB  *p_dcb;
1188    UINT8           mdep_cfg_idx;
1189    UINT8           mdl_cfg_idx;
1190    tBTA_HL_MDEP_CFG            *p_mdep_cfg;
1191
1192    if (bta_hl_find_mcl_idx_using_handle(p_data->api_dch_reconnect.mcl_handle, &app_idx, &mcl_idx))
1193    {
1194        p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
1195        p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
1196        if (p_mcb->cch_state == BTA_HL_CCH_OPEN_ST)
1197        {
1198            if (bta_hl_find_avail_mdl_idx(app_idx, mcl_idx, &mdl_idx))
1199            {
1200                p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
1201                if (bta_hl_validate_reconnect_params(app_idx, mcl_idx,  &(p_data->api_dch_reconnect),
1202                                                     &mdep_cfg_idx, &mdl_cfg_idx ))
1203                {
1204                    if (!bta_hl_is_the_first_reliable_existed(app_idx, mcl_idx) &&
1205                        (p_acb->mdl_cfg[mdl_cfg_idx].dch_mode != BTA_HL_DCH_MODE_RELIABLE))
1206                    {
1207                        status =  BTA_HL_STATUS_NO_FIRST_RELIABLE;
1208                    }
1209                    else
1210                    {
1211                        if (bta_hl_set_ctrl_psm_for_dch(app_idx, mcl_idx, mdl_idx, p_data->api_dch_open.ctrl_psm))
1212                        {
1213                            p_dcb->in_use                   = TRUE;
1214                            p_dcb->dch_oper                 = BTA_HL_DCH_OP_LOCAL_RECONNECT;
1215                            p_dcb->sec_mask                 = (BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT);
1216                            p_dcb->local_mdep_id            = p_acb->mdl_cfg[mdl_cfg_idx].local_mdep_id;
1217                            p_dcb->local_mdep_cfg_idx       = mdep_cfg_idx;
1218                            p_dcb->local_cfg                = BTA_HL_DCH_CFG_UNKNOWN;
1219                            p_dcb->mdl_id                   = p_data->api_dch_reconnect.mdl_id;
1220                            p_dcb->mdl_cfg_idx_included     = TRUE;
1221                            p_dcb->mdl_cfg_idx              = mdl_cfg_idx;
1222                            p_dcb->dch_mode                 = p_acb->mdl_cfg[mdl_cfg_idx].dch_mode;
1223
1224                           p_mdep_cfg = BTA_HL_GET_MDEP_CFG_PTR(app_idx, mdep_cfg_idx);
1225
1226                            if (p_mdep_cfg->mdep_role == BTA_HL_MDEP_ROLE_SINK)
1227                            {
1228                                p_dcb->peer_mdep_role = BTA_HL_MDEP_ROLE_SOURCE;
1229                                  APPL_TRACE_DEBUG0("peer mdep role = SOURCE ");
1230							}
1231                            else
1232                            {
1233                                p_dcb->peer_mdep_role = BTA_HL_MDEP_ROLE_SINK;
1234                                APPL_TRACE_DEBUG0("peer mdep role = SINK ");
1235                            }
1236
1237                            bta_hl_find_rxtx_apdu_size(app_idx, mdep_cfg_idx,
1238                                                       &p_dcb->max_rx_apdu_size,
1239                                                       &p_dcb->max_tx_apdu_size);
1240                        }
1241                        else
1242                        {
1243                            status =  BTA_HL_STATUS_INVALID_CTRL_PSM;
1244                        }
1245                    }
1246                }
1247                else
1248                {
1249                    status =  BTA_HL_STATUS_INVALID_RECONNECT_CFG;
1250                }
1251            }
1252            else
1253            {
1254                status = BTA_HL_STATUS_NO_RESOURCE;
1255            }
1256        }
1257        else
1258        {
1259            status =  BTA_HL_STATUS_NO_CCH;
1260        }
1261    }
1262    else
1263    {
1264        status = BTA_HL_STATUS_INVALID_MCL_HANDLE;
1265    }
1266
1267#if BTA_HL_DEBUG == TRUE
1268    if (status != BTA_HL_STATUS_OK)
1269    {
1270        APPL_TRACE_DEBUG1("bta_hl_api_dch_reconnect status=%s", bta_hl_status_code(status));
1271    }
1272#endif
1273
1274    switch (status)
1275    {
1276        case BTA_HL_STATUS_OK:
1277            if (p_mcb->sdp.num_recs)
1278            {
1279                bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_RECONNECT_EVT, p_data);
1280            }
1281            else
1282            {
1283                bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_SDP_INIT_EVT, p_data);
1284            }
1285            break;
1286        case BTA_HL_STATUS_INVALID_RECONNECT_CFG:
1287        case BTA_HL_STATUS_NO_FIRST_RELIABLE:
1288        case BTA_HL_STATUS_NO_CCH:
1289        case BTA_HL_STATUS_NO_RESOURCE:
1290            p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
1291            if (p_acb->p_cback)
1292            {
1293                bta_hl_build_dch_open_cfm(&evt_data,
1294                                          p_acb->app_handle,
1295                                          p_data->api_dch_reconnect.mcl_handle,
1296                                          BTA_HL_INVALID_MDL_HANDLE,
1297                                          0,p_data->api_dch_reconnect.mdl_id,0,0,0, status);
1298                p_acb->p_cback(BTA_HL_DCH_RECONNECT_CFM_EVT,(tBTA_HL *) &evt_data );
1299            }
1300            else
1301            {
1302                APPL_TRACE_ERROR0("bta_hl_api_dch_reconnect Null Callback");
1303            }
1304            break;
1305        default:
1306            APPL_TRACE_ERROR1("Status code=%d", status);
1307            break;
1308    }
1309}
1310
1311/*******************************************************************************
1312**
1313** Function         bta_hl_api_dch_echo_test
1314**
1315** Description      Process the API Echo test request
1316**
1317** Returns          void
1318**
1319*******************************************************************************/
1320static void bta_hl_api_dch_echo_test(tBTA_HL_CB *p_cb, tBTA_HL_DATA *p_data)
1321{
1322    tBTA_HL             evt_data;
1323    tBTA_HL_STATUS      status = BTA_HL_STATUS_OK;
1324    UINT8               app_idx, mcl_idx, mdl_idx;
1325    tBTA_HL_APP_CB      *p_acb;
1326    tBTA_HL_MCL_CB      *p_mcb;
1327    tBTA_HL_MDL_CB      *p_dcb;
1328    tBTA_HL_ECHO_CFG    *p_echo_cfg;
1329
1330
1331    if (bta_hl_find_mcl_idx_using_handle(p_data->api_dch_echo_test.mcl_handle, &app_idx,  &mcl_idx))
1332    {
1333        p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
1334        p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
1335        if (p_mcb->cch_state == BTA_HL_CCH_OPEN_ST)
1336        {
1337            if (!p_mcb->echo_test )
1338            {
1339                if (bta_hl_find_avail_mdl_idx(app_idx, mcl_idx, &mdl_idx))
1340                {
1341                    p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
1342
1343                    if ((p_data->api_dch_echo_test.local_cfg == BTA_HL_DCH_CFG_RELIABLE) ||
1344                        (p_data->api_dch_echo_test.local_cfg == BTA_HL_DCH_CFG_STREAMING))
1345                    {
1346                        if ((p_dcb->p_echo_tx_pkt = bta_hl_get_buf(p_data->api_dch_echo_test.pkt_size)) != NULL )
1347                        {
1348                            if (bta_hl_set_ctrl_psm_for_dch(app_idx, mcl_idx, mdl_idx, p_data->api_dch_open.ctrl_psm))
1349                            {
1350                                p_dcb->in_use                   = TRUE;
1351                                p_dcb->dch_oper                 = BTA_HL_DCH_OP_LOCAL_OPEN;
1352                                p_dcb->sec_mask                 = (BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT);
1353                                p_dcb->local_mdep_cfg_idx       = BTA_HL_ECHO_TEST_MDEP_CFG_IDX;
1354                                p_dcb->local_cfg                = p_data->api_dch_echo_test.local_cfg;
1355                                p_dcb->local_mdep_id            = BTA_HL_ECHO_TEST_MDEP_ID;
1356                                p_dcb->peer_mdep_id             = BTA_HL_ECHO_TEST_MDEP_ID;
1357                                p_dcb->mdl_id                   = bta_hl_allocate_mdl_id(app_idx,mcl_idx,mdl_idx);
1358                                p_dcb->mdl_cfg_idx_included     = FALSE;
1359                                p_echo_cfg                      = BTA_HL_GET_ECHO_CFG_PTR(app_idx);
1360                                p_dcb->max_rx_apdu_size         = p_echo_cfg->max_rx_apdu_size;
1361                                p_dcb->max_tx_apdu_size         = p_echo_cfg->max_tx_apdu_size;
1362                                p_mcb->echo_test                = TRUE;
1363                                p_mcb->echo_mdl_idx             = mdl_idx;
1364                            }
1365                            else
1366                            {
1367                                status =  BTA_HL_STATUS_INVALID_CTRL_PSM;
1368                            }
1369                        }
1370                        else
1371                        {
1372                            status = BTA_HL_STATUS_NO_RESOURCE;
1373                        }
1374                    }
1375                    else
1376                    {
1377                        status = BTA_HL_STATUS_INVALID_DCH_CFG;
1378                    }
1379                }
1380                else
1381                {
1382                    status = BTA_HL_STATUS_NO_RESOURCE;
1383                }
1384            }
1385            else
1386            {
1387                status = BTA_HL_STATUS_ECHO_TEST_BUSY;
1388            }
1389        }
1390        else
1391        {
1392            status =  BTA_HL_STATUS_NO_CCH;
1393        }
1394    }
1395    else
1396    {
1397        status = BTA_HL_STATUS_NO_MCL;
1398    }
1399
1400#if BTA_HL_DEBUG == TRUE
1401    if (status != BTA_HL_STATUS_OK)
1402    {
1403        APPL_TRACE_DEBUG1("bta_hl_api_dch_echo_test status=%s", bta_hl_status_code(status));
1404    }
1405#endif
1406
1407    switch (status)
1408    {
1409        case BTA_HL_STATUS_OK:
1410            if (p_mcb->sdp.num_recs)
1411            {
1412                bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_ECHO_TEST_EVT, p_data);
1413            }
1414            else
1415            {
1416                bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_SDP_INIT_EVT, p_data);
1417            }
1418            break;
1419        case BTA_HL_STATUS_ECHO_TEST_BUSY:
1420        case BTA_HL_STATUS_NO_RESOURCE:
1421        case BTA_HL_STATUS_INVALID_DCH_CFG:
1422            p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
1423            if (p_acb->p_cback)
1424            {
1425                bta_hl_build_echo_test_cfm(&evt_data,
1426                                           p_acb->app_handle,
1427                                           p_mcb->mcl_handle,
1428                                           status);
1429                p_acb->p_cback(BTA_HL_DCH_ECHO_TEST_CFM_EVT,(tBTA_HL *) &evt_data );
1430            }
1431            else
1432            {
1433                APPL_TRACE_ERROR0("bta_hl_api_dch_echo_test Null Callback");
1434            }
1435            break;
1436
1437        default:
1438            APPL_TRACE_ERROR1("Status code=%s", status);
1439            break;
1440    }
1441}
1442
1443
1444/*******************************************************************************
1445**
1446** Function         bta_hl_api_sdp_query
1447**
1448** Description      Process the API SDP query request
1449**
1450** Returns          void
1451**
1452*******************************************************************************/
1453static void bta_hl_api_sdp_query(tBTA_HL_CB *p_cb, tBTA_HL_DATA *p_data)
1454{
1455    tBTA_HL         evt_data;
1456    tBTA_HL_STATUS  status = BTA_HL_STATUS_OK;
1457    UINT8           app_idx, mcl_idx;
1458    tBTA_HL_APP_CB  *p_acb;
1459    tBTA_HL_MCL_CB  *p_mcb;
1460
1461
1462    if (bta_hl_find_app_idx_using_handle(p_data->api_sdp_query.app_handle, &app_idx))
1463    {
1464        if (!bta_hl_find_mcl_idx(app_idx, p_data->api_sdp_query.bd_addr, &mcl_idx))
1465        {
1466            if (bta_hl_find_avail_mcl_idx(app_idx, &mcl_idx))
1467            {
1468                p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
1469                p_mcb->in_use = TRUE;
1470                bdcpy(p_mcb->bd_addr, p_data->api_sdp_query.bd_addr);
1471                APPL_TRACE_DEBUG3("bta_hl_api_sdp_query p_mcb->app_id %d app_idx %d mcl_idx %d", p_mcb->app_id, app_idx, mcl_idx);
1472                p_mcb->app_id = p_data->api_sdp_query.app_id;
1473                p_mcb->sdp_oper  = BTA_HL_SDP_OP_SDP_QUERY_NEW ;
1474            }
1475            else
1476            {
1477                status = BTA_HL_STATUS_NO_RESOURCE;
1478            }
1479        }
1480        else
1481        {
1482            p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
1483            p_mcb->app_id = p_data->api_sdp_query.app_id;
1484            if (p_mcb->sdp_oper != BTA_HL_SDP_OP_NONE)
1485            {
1486                status = BTA_HL_STATUS_SDP_NO_RESOURCE;
1487            }
1488            else
1489            {
1490                p_mcb->sdp_oper  = BTA_HL_SDP_OP_SDP_QUERY_CURRENT;
1491            }
1492        }
1493    }
1494    else
1495    {
1496        status = BTA_HL_STATUS_INVALID_APP_HANDLE;
1497    }
1498
1499    if (status == BTA_HL_STATUS_OK)
1500    {
1501        status = bta_hl_init_sdp( p_mcb->sdp_oper, app_idx, mcl_idx, 0xFF);
1502        if ( (status != BTA_HL_STATUS_OK) &&
1503             (p_mcb->sdp_oper == BTA_HL_SDP_OP_SDP_QUERY_NEW) )
1504        {
1505            memset(p_mcb, 0 ,sizeof(tBTA_HL_MCL_CB));
1506        }
1507    }
1508#if BTA_HL_DEBUG == TRUE
1509    if (status != BTA_HL_STATUS_OK)
1510    {
1511        APPL_TRACE_DEBUG1("bta_hl_api_sdp_query status=%s", bta_hl_status_code(status));
1512    }
1513#endif
1514    switch (status)
1515    {
1516        case BTA_HL_STATUS_NO_RESOURCE:
1517        case BTA_HL_STATUS_FAIL:
1518        case BTA_HL_STATUS_SDP_NO_RESOURCE:
1519            p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
1520            if (p_acb->p_cback)
1521            {
1522                bta_hl_build_sdp_query_cfm(&evt_data,
1523                                           p_data->api_sdp_query.app_id,
1524                                           p_data->api_sdp_query.app_handle,
1525                                           p_data->api_sdp_query.bd_addr,
1526                                           NULL,
1527                                           status);
1528                p_acb->p_cback(BTA_HL_SDP_QUERY_CFM_EVT,(tBTA_HL *) &evt_data );
1529            }
1530            else
1531            {
1532                APPL_TRACE_ERROR0("bta_hl_api_sdp_query Null Callback");
1533            }
1534            break;
1535        case BTA_HL_STATUS_OK:
1536            break;
1537        default:
1538            APPL_TRACE_ERROR1("Status code=%d", status);
1539            break;
1540    }
1541}
1542
1543
1544
1545
1546/*******************************************************************************
1547**
1548** Function         bta_hl_sdp_query_results
1549**
1550** Description      Process the SDP query results
1551**
1552** Returns          void
1553**
1554*******************************************************************************/
1555static void bta_hl_sdp_query_results(tBTA_HL_CB *p_cb, tBTA_HL_DATA *p_data)
1556{
1557    tBTA_HL             evt_data;
1558    tBTA_HL_STATUS      status = BTA_HL_STATUS_OK;
1559    UINT8               app_idx = p_data->cch_sdp.app_idx;
1560    UINT8               mcl_idx = p_data->cch_sdp.mcl_idx;
1561    tBTA_HL_APP_CB      *p_acb = BTA_HL_GET_APP_CB_PTR( app_idx);
1562    tBTA_HL_MCL_CB      *p_mcb =  BTA_HL_GET_MCL_CB_PTR( app_idx,  mcl_idx);
1563    tBTA_HL_SDP         *p_sdp=NULL;
1564    tBTA_HL_SDP_OPER    sdp_oper;
1565    UINT16              event;
1566    BOOLEAN             release_sdp_buf=FALSE;
1567
1568    event = p_data->hdr.event;
1569    sdp_oper = p_mcb->sdp_oper;
1570
1571    if ( event == BTA_HL_SDP_QUERY_OK_EVT)
1572    {
1573        if ((p_sdp = (tBTA_HL_SDP *)GKI_getbuf((UINT16)(sizeof(tBTA_HL_SDP)))) != NULL)
1574        {
1575            memcpy(p_sdp, &p_mcb->sdp, sizeof(tBTA_HL_SDP));
1576            release_sdp_buf = TRUE;
1577        }
1578        else
1579        {
1580            status = BTA_HL_STATUS_SDP_NO_RESOURCE;
1581        }
1582    }
1583    else
1584    {
1585        status = BTA_HL_STATUS_SDP_FAIL;
1586    }
1587
1588#if BTA_HL_DEBUG == TRUE
1589    if (status != BTA_HL_STATUS_OK)
1590    {
1591        APPL_TRACE_DEBUG1("bta_hl_sdp_query_results status=%s", bta_hl_status_code(status));
1592    }
1593#endif
1594
1595    APPL_TRACE_DEBUG3("bta_hl_sdp_query_results p_mcb->app_id %d app_idx %d mcl_idx %d", p_mcb->app_id, app_idx, mcl_idx);
1596    bta_hl_build_sdp_query_cfm(&evt_data,p_mcb->app_id, p_acb->app_handle,
1597                               p_mcb->bd_addr,p_sdp,status);
1598    p_acb->p_cback(BTA_HL_SDP_QUERY_CFM_EVT,(tBTA_HL *) &evt_data );
1599
1600    if (release_sdp_buf)
1601    {
1602        utl_freebuf((void **) &p_sdp);
1603    }
1604
1605    if (p_data->cch_sdp.release_mcl_cb)
1606    {
1607        memset(p_mcb, 0 ,sizeof(tBTA_HL_MCL_CB));
1608    }
1609    else
1610    {
1611        if (p_mcb->close_pending)
1612        {
1613            bta_hl_check_cch_close(app_idx,mcl_idx,p_data, TRUE);
1614        }
1615
1616        if (!p_mcb->ctrl_psm)
1617        {
1618            /* this is a control channel acceptor do not store the sdp records*/
1619            memset(&p_mcb->sdp, 0, sizeof(tBTA_HL_SDP));
1620        }
1621    }
1622}
1623
1624
1625/*******************************************************************************
1626**
1627** Function         bta_hl_api_delete_mdl
1628**
1629** Description      Process the API DELETE MDL request
1630**
1631** Returns          void
1632**
1633*******************************************************************************/
1634static void bta_hl_api_delete_mdl(tBTA_HL_CB *p_cb, tBTA_HL_DATA *p_data)
1635{
1636    tBTA_HL         evt_data;
1637    tBTA_HL_STATUS  status = BTA_HL_STATUS_OK;
1638    UINT8           app_idx, mcl_idx;
1639    tBTA_HL_APP_CB  *p_acb;
1640    tBTA_HL_MCL_CB  *p_mcb;
1641
1642    if (bta_hl_find_mcl_idx_using_handle(p_data->api_delete_mdl.mcl_handle, &app_idx, &mcl_idx ))
1643    {
1644        if (bta_hl_is_mdl_value_valid(p_data->api_delete_mdl.mdl_id))
1645        {
1646            p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
1647            if (bta_hl_is_mdl_exsit_in_mcl(app_idx,
1648                                           p_mcb->bd_addr,
1649                                           p_data->api_delete_mdl.mdl_id))
1650            {
1651
1652
1653                p_mcb->delete_mdl.mcl_handle =  p_data->api_delete_mdl.mcl_handle;
1654                p_mcb->delete_mdl.mdl_id = p_data->api_delete_mdl.mdl_id;
1655                p_mcb->delete_mdl.delete_req_pending = TRUE;
1656
1657                if (MCA_Delete((tMCA_CL) p_mcb->mcl_handle,
1658                               p_data->api_delete_mdl.mdl_id)!= MCA_SUCCESS)
1659                {
1660                    status = BTA_HL_STATUS_FAIL;
1661                    memset(&p_mcb->delete_mdl, 0, sizeof(tBTA_HL_DELETE_MDL));
1662                }
1663            }
1664            else
1665            {
1666                status = BTA_HL_STATUS_NO_MDL_ID_FOUND;
1667            }
1668        }
1669        else
1670        {
1671            status = BTA_HL_STATUS_INVALID_MDL_ID;
1672        }
1673    }
1674    else
1675    {
1676        status = BTA_HL_STATUS_INVALID_MCL_HANDLE;
1677    }
1678
1679#if BTA_HL_DEBUG == TRUE
1680    if (status != BTA_HL_STATUS_OK)
1681    {
1682        APPL_TRACE_DEBUG1("bta_hl_api_delete_mdl status=%s", bta_hl_status_code(status));
1683    }
1684#endif
1685    switch (status)
1686    {
1687        case BTA_HL_STATUS_OK:
1688            break;
1689        case BTA_HL_STATUS_FAIL:
1690        case BTA_HL_STATUS_NO_MDL_ID_FOUND:
1691        case BTA_HL_STATUS_INVALID_MDL_ID:
1692            p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
1693            if (p_acb->p_cback)
1694            {
1695                bta_hl_build_delete_mdl_cfm(&evt_data,
1696                                            p_acb->app_handle,
1697                                            p_data->api_delete_mdl.mcl_handle,
1698                                            p_data->api_delete_mdl.mdl_id,
1699                                            status);
1700                p_acb->p_cback(BTA_HL_DELETE_MDL_CFM_EVT,(tBTA_HL *) &evt_data );
1701            }
1702            else
1703            {
1704                APPL_TRACE_ERROR0("bta_hl_api_delete_mdl Null Callback");
1705            }
1706            break;
1707        default:
1708            APPL_TRACE_ERROR1("status code =%d", status);
1709            break;
1710    }
1711}
1712
1713/*******************************************************************************
1714**
1715** Function         bta_hl_mca_delete_mdl_cfm
1716**
1717** Description      Process the DELETE MDL confirmation event
1718**
1719** Returns          void
1720**
1721*******************************************************************************/
1722static void bta_hl_mca_delete_mdl_cfm(tBTA_HL_CB *p_cb, tBTA_HL_DATA *p_data)
1723{
1724    tBTA_HL         evt_data;
1725    tBTA_HL_STATUS  status = BTA_HL_STATUS_OK;
1726    UINT8           app_idx, mcl_idx;
1727    tMCA_RSP_EVT    *p_delete_cfm = &p_data->mca_evt.mca_data.delete_cfm;
1728    tBTA_HL_MCL_CB  *p_mcb;
1729    BOOLEAN         send_cfm_evt = TRUE;
1730    tBTA_HL_APP_CB  *p_acb;
1731
1732    if (bta_hl_find_mcl_idx_using_handle(p_data->mca_evt.mcl_handle, &app_idx, &mcl_idx))
1733    {
1734        p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
1735        if ( p_mcb->delete_mdl.delete_req_pending)
1736        {
1737            if (p_delete_cfm->rsp_code == MCA_RSP_SUCCESS   )
1738            {
1739
1740                if (!bta_hl_delete_mdl_cfg(app_idx,
1741                                           p_mcb->bd_addr ,
1742                                           p_delete_cfm->mdl_id))
1743                {
1744                    status = BTA_HL_STATUS_FAIL;
1745                }
1746            }
1747            else
1748            {
1749                status = BTA_HL_STATUS_FAIL;
1750            }
1751
1752            memset(&p_mcb->delete_mdl, 0, sizeof(tBTA_HL_DELETE_MDL));
1753        }
1754        else
1755        {
1756            send_cfm_evt = FALSE;
1757        }
1758    }
1759    else
1760    {
1761        send_cfm_evt = FALSE;
1762    }
1763
1764#if BTA_HL_DEBUG == TRUE
1765    if (status != BTA_HL_STATUS_OK)
1766    {
1767        APPL_TRACE_DEBUG1("bta_hl_api_delete_mdl status=%s", bta_hl_status_code(status));
1768    }
1769#endif
1770
1771    if (send_cfm_evt)
1772    {
1773        p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
1774        if (p_acb->p_cback)
1775        {
1776            bta_hl_build_delete_mdl_cfm(&evt_data,
1777                                        p_acb->app_handle,
1778                                        p_mcb->mcl_handle,
1779                                        p_delete_cfm->mdl_id,
1780                                        status);
1781
1782            p_acb->p_cback(BTA_HL_DELETE_MDL_CFM_EVT,(tBTA_HL *) &evt_data );
1783        }
1784        else
1785        {
1786            APPL_TRACE_ERROR0("bta_hl_mca_delete_mdl_cfm Null Callback");
1787
1788        }
1789    }
1790}
1791
1792/*******************************************************************************
1793**
1794** Function         bta_hl_mca_delete_mdl_ind
1795**
1796** Description      Process the DELETE MDL indication event
1797**
1798** Returns          void
1799**
1800*******************************************************************************/
1801static void bta_hl_mca_delete_mdl_ind(tBTA_HL_CB *p_cb, tBTA_HL_DATA *p_data)
1802{
1803    tBTA_HL         evt_data;
1804    UINT8           app_idx, mcl_idx, mdl_idx;
1805    tMCA_EVT_HDR    *p_delete_ind = &p_data->mca_evt.mca_data.delete_ind;
1806    tBTA_HL_MCL_CB  *p_mcb;
1807    tBTA_HL_MDL_CB  *p_dcb;
1808    BOOLEAN         send_ind_evt = TRUE;
1809    tBTA_HL_APP_CB  *p_acb;
1810
1811    if (bta_hl_find_mcl_idx_using_handle(p_data->mca_evt.mcl_handle, &app_idx, &mcl_idx) )
1812    {
1813        p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
1814
1815        if (bta_hl_find_mdl_idx(app_idx, mcl_idx, p_delete_ind->mdl_id, &mdl_idx ))
1816        {
1817            p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
1818            p_dcb->dch_oper = BTA_HL_DCH_OP_REMOTE_DELETE;
1819        }
1820        if (bta_hl_delete_mdl_cfg(app_idx,
1821                                  p_mcb->bd_addr ,
1822                                  p_delete_ind->mdl_id))
1823        {
1824            send_ind_evt = TRUE;
1825        }
1826    }
1827
1828#if BTA_HL_DEBUG == TRUE
1829    if (!send_ind_evt)
1830    {
1831        APPL_TRACE_DEBUG1("bta_hl_mca_delete_mdl_ind is_send_ind_evt =%d", send_ind_evt);
1832    }
1833#endif
1834
1835    if (send_ind_evt)
1836    {
1837        p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
1838        if (p_acb->p_cback)
1839        {
1840            evt_data.delete_mdl_ind.mcl_handle = p_mcb->mcl_handle;
1841            evt_data.delete_mdl_ind.app_handle = p_acb->app_handle;
1842            evt_data.delete_mdl_ind.mdl_id = p_delete_ind->mdl_id;
1843            p_acb->p_cback(BTA_HL_DELETE_MDL_IND_EVT,(tBTA_HL *) &evt_data );
1844        }
1845        else
1846        {
1847            APPL_TRACE_ERROR0("bta_hl_mca_delete_mdl_ind Null Callback");
1848        }
1849    }
1850}
1851
1852
1853
1854/*******************************************************************************
1855**
1856** Function         bta_hl_api_dch_abort
1857**
1858** Description      Process the API DCH abort request
1859**
1860** Returns          void
1861**
1862*******************************************************************************/
1863static void bta_hl_api_dch_abort(tBTA_HL_CB *p_cb, tBTA_HL_DATA *p_data)
1864{
1865
1866    tBTA_HL_STATUS  status = BTA_HL_STATUS_OK;
1867    UINT8           app_idx, mcl_idx, mdl_idx;
1868    tBTA_HL_APP_CB  *p_acb;
1869    tBTA_HL_MCL_CB  *p_mcb;
1870    tBTA_HL_MDL_CB  *p_dcb;
1871    tBTA_HL         evt_data;
1872
1873
1874    if (bta_hl_find_mcl_idx_using_handle(p_data->api_dch_abort.mcl_handle, &app_idx, &mcl_idx ))
1875    {
1876
1877        if (!bta_hl_find_dch_setup_mdl_idx(app_idx, mcl_idx, &mdl_idx ))
1878        {
1879            status = BTA_HL_STATUS_NO_MDL_ID_FOUND;
1880        }
1881        else
1882        {
1883            p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
1884            if (p_dcb->abort_oper)
1885            {
1886                /* abort already in progress*/
1887                status = BTA_HL_STATUS_FAIL;
1888            }
1889            else
1890            {
1891                p_dcb->abort_oper = BTA_HL_ABORT_LOCAL_MASK;
1892            }
1893        }
1894    }
1895    else
1896    {
1897        status = BTA_HL_STATUS_INVALID_MCL_HANDLE;
1898    }
1899
1900
1901#if BTA_HL_DEBUG == TRUE
1902    if (status != BTA_HL_STATUS_OK)
1903    {
1904        APPL_TRACE_DEBUG1("bta_hl_api_dch_abort status=%s", bta_hl_status_code(status));
1905    }
1906#endif
1907    switch (status)
1908    {
1909        case BTA_HL_STATUS_OK:
1910
1911            bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_ABORT_EVT, p_data);
1912            break;
1913        case BTA_HL_STATUS_NO_MDL_ID_FOUND:
1914        case BTA_HL_STATUS_FAIL:
1915
1916            p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
1917            if (p_acb->p_cback)
1918            {
1919                p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
1920                bta_hl_build_abort_cfm(&evt_data,
1921
1922
1923
1924                                       p_acb->app_handle,
1925                                       p_mcb->mcl_handle,
1926                                       BTA_HL_STATUS_FAIL);
1927                p_acb->p_cback(BTA_HL_DCH_ABORT_CFM_EVT,(tBTA_HL *) &evt_data);
1928            }
1929            else
1930            {
1931                APPL_TRACE_ERROR0("bta_hl_api_dch_abort Null Callback");
1932            }
1933            break;
1934        default:
1935            APPL_TRACE_ERROR1("Status code=%d", status);
1936            break;
1937    }
1938}
1939
1940/*******************************************************************************
1941**
1942** Function         bta_hl_hdl_event
1943**
1944** Description      HL main event handling function.
1945**
1946** Returns          void
1947**
1948*******************************************************************************/
1949BOOLEAN bta_hl_hdl_event(BT_HDR *p_msg)
1950{
1951    UINT8 app_idx, mcl_idx, mdl_idx;
1952    BOOLEAN success = TRUE;
1953
1954#if BTA_HL_DEBUG == TRUE
1955    APPL_TRACE_DEBUG1("BTA HL Event Handler: Event [%s]",
1956                      bta_hl_evt_code(p_msg->event));
1957#endif
1958
1959    switch (p_msg->event)
1960    {
1961        case BTA_HL_API_ENABLE_EVT:
1962            bta_hl_api_enable(&bta_hl_cb, (tBTA_HL_DATA *) p_msg);
1963            break;
1964        case BTA_HL_API_DISABLE_EVT:
1965            bta_hl_api_disable(&bta_hl_cb, (tBTA_HL_DATA *) p_msg);
1966            break;
1967        case BTA_HL_API_UPDATE_EVT:
1968            bta_hl_api_update(&bta_hl_cb, (tBTA_HL_DATA *) p_msg);
1969            break;
1970        case BTA_HL_API_REGISTER_EVT:
1971            bta_hl_api_register(&bta_hl_cb, (tBTA_HL_DATA *) p_msg);
1972            break;
1973        case BTA_HL_API_DEREGISTER_EVT:
1974            bta_hl_api_deregister(&bta_hl_cb, (tBTA_HL_DATA *) p_msg);
1975            break;
1976        case BTA_HL_API_CCH_OPEN_EVT:
1977            bta_hl_api_cch_open(&bta_hl_cb, (tBTA_HL_DATA *) p_msg);
1978            break;
1979        case BTA_HL_API_CCH_CLOSE_EVT:
1980            bta_hl_api_cch_close(&bta_hl_cb, (tBTA_HL_DATA *) p_msg);
1981            break;
1982        case BTA_HL_API_DCH_OPEN_EVT:
1983            bta_hl_api_dch_open(&bta_hl_cb, (tBTA_HL_DATA *) p_msg);
1984            break;
1985        case BTA_HL_API_DCH_CLOSE_EVT:
1986            bta_hl_api_dch_close(&bta_hl_cb, (tBTA_HL_DATA *) p_msg);
1987            break;
1988        case BTA_HL_API_DELETE_MDL_EVT:
1989            bta_hl_api_delete_mdl(&bta_hl_cb, (tBTA_HL_DATA *) p_msg);
1990            break;
1991        case BTA_HL_API_DCH_RECONNECT_EVT:
1992            bta_hl_api_dch_reconnect(&bta_hl_cb, (tBTA_HL_DATA *) p_msg);
1993            break;
1994
1995        case BTA_HL_API_DCH_ECHO_TEST_EVT:
1996            bta_hl_api_dch_echo_test(&bta_hl_cb, (tBTA_HL_DATA *) p_msg);
1997            break;
1998
1999        case BTA_HL_API_SDP_QUERY_EVT:
2000            bta_hl_api_sdp_query(&bta_hl_cb, (tBTA_HL_DATA *) p_msg);
2001            break;
2002
2003        case BTA_HL_MCA_DELETE_CFM_EVT:
2004            bta_hl_mca_delete_mdl_cfm(&bta_hl_cb, (tBTA_HL_DATA *) p_msg);
2005            break;
2006
2007        case BTA_HL_MCA_DELETE_IND_EVT:
2008            bta_hl_mca_delete_mdl_ind(&bta_hl_cb, (tBTA_HL_DATA *) p_msg);
2009            break;
2010
2011        case BTA_HL_SDP_QUERY_OK_EVT:
2012        case BTA_HL_SDP_QUERY_FAIL_EVT:
2013            bta_hl_sdp_query_results(&bta_hl_cb, (tBTA_HL_DATA *) p_msg);
2014            break;
2015        case BTA_HL_API_DCH_ABORT_EVT:
2016            bta_hl_api_dch_abort(&bta_hl_cb, (tBTA_HL_DATA *) p_msg);
2017            break;
2018
2019
2020        default:
2021            if (p_msg->event < BTA_HL_DCH_EVT_MIN)
2022            {
2023                if (bta_hl_find_cch_cb_indexes((tBTA_HL_DATA *) p_msg, &app_idx, &mcl_idx))
2024                {
2025                    bta_hl_cch_sm_execute( app_idx,
2026                                           mcl_idx,
2027                                           p_msg->event, (tBTA_HL_DATA *) p_msg);
2028                }
2029                else
2030                {
2031#if BTA_HL_DEBUG == TRUE
2032                    APPL_TRACE_ERROR1("unable to find control block indexes for CCH: [event=%s]",
2033                                      bta_hl_evt_code(p_msg->event));
2034#else
2035                    APPL_TRACE_ERROR1("unable to find control block indexes for CCH: [event=%d]", p_msg->event);
2036#endif
2037                    success = FALSE;
2038                }
2039            }
2040            else
2041            {
2042                if (bta_hl_find_dch_cb_indexes((tBTA_HL_DATA *) p_msg, &app_idx, &mcl_idx, &mdl_idx))
2043                {
2044                    bta_hl_dch_sm_execute( app_idx,
2045                                           mcl_idx,
2046                                           mdl_idx,
2047                                           p_msg->event, (tBTA_HL_DATA *) p_msg);
2048                }
2049                else
2050                {
2051
2052#if BTA_HL_DEBUG == TRUE
2053                    APPL_TRACE_ERROR1("unable to find control block indexes for DCH : [event=%s]",
2054                                      bta_hl_evt_code(p_msg->event));
2055#else
2056                    APPL_TRACE_ERROR1("unable to find control block indexes for DCH: [event=%d]", p_msg->event);
2057#endif
2058                    success = FALSE;
2059                }
2060            }
2061
2062            break;
2063    }
2064
2065    return(success);
2066}
2067
2068
2069/*****************************************************************************
2070**  Debug Functions
2071*****************************************************************************/
2072#if (BTA_HL_DEBUG == TRUE) && (BT_USE_TRACES == TRUE)
2073
2074/*******************************************************************************
2075**
2076** Function         bta_hl_cch_state_code
2077**
2078** Description      Map CCH state code to the corresponding state string
2079**
2080** Returns          string pointer for the associated state name
2081**
2082*******************************************************************************/
2083static char *bta_hl_cch_state_code(tBTA_HL_CCH_STATE state_code)
2084{
2085    switch (state_code)
2086    {
2087        case BTA_HL_CCH_IDLE_ST:
2088            return "BTA_HL_CCH_IDLE_ST";
2089        case BTA_HL_CCH_OPENING_ST:
2090            return "BTA_HL_CCH_OPENING_ST";
2091        case BTA_HL_CCH_OPEN_ST:
2092            return "BTA_HL_CCH_OPEN_ST";
2093        case BTA_HL_CCH_CLOSING_ST:
2094            return "BTA_HL_CCH_CLOSING_ST";
2095        default:
2096            return "Unknown CCH state code";
2097    }
2098}
2099
2100/*******************************************************************************
2101**
2102** Function         bta_hl_dch_state_code
2103**
2104** Description      Map DCH state code to the corresponding state string
2105**
2106** Returns          string pointer for the associated state name
2107**
2108*******************************************************************************/
2109static char *bta_hl_dch_state_code(tBTA_HL_DCH_STATE state_code)
2110{
2111    switch (state_code)
2112    {
2113        case BTA_HL_DCH_IDLE_ST:
2114            return "BTA_HL_DCH_IDLE_ST";
2115        case BTA_HL_DCH_OPENING_ST:
2116            return "BTA_HL_DCH_OPENING_ST";
2117        case BTA_HL_DCH_OPEN_ST:
2118            return "BTA_HL_DCH_OPEN_ST";
2119        case BTA_HL_DCH_CLOSING_ST:
2120            return "BTA_HL_DCH_CLOSING_ST";
2121        default:
2122            return "Unknown DCH state code";
2123    }
2124}
2125#endif  /* Debug Functions */
2126#endif /* HL_INCLUDED */
2127