1/******************************************************************************
2 *
3 *  Copyright (C) 2003-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 (HL) action functions for
22 *  the state machine.
23 *
24 ******************************************************************************/
25
26#include <string.h>
27
28#include "bt_target.h"
29#if defined(HL_INCLUDED) && (HL_INCLUDED == TRUE)
30
31#include "gki.h"
32#include "sdp_api.h"
33#include "bta_sys.h"
34#include "port_api.h"
35#include "sdp_api.h"
36#include "bta_hl_api.h"
37#include "bta_hl_int.h"
38#include "utl.h"
39#include "mca_defs.h"
40#include "mca_api.h"
41
42/*****************************************************************************
43**  Local Function prototypes
44*****************************************************************************/
45#if (BTA_HL_DEBUG == TRUE && BT_TRACE_VERBOSE == TRUE)
46static char *bta_hl_mcap_evt_code(UINT8 evt_code);
47static char *bta_hl_dch_oper_code(tBTA_HL_DCH_OPER oper_code);
48static char *bta_hl_cback_evt_code(UINT8 evt_code);
49#endif
50static void bta_hl_sdp_cback(UINT8 sdp_op, UINT8 app_idx, UINT8 mcl_idx,
51                             UINT8 mdl_idx, UINT16 status);
52static void bta_hl_sdp_cback0(UINT16 status);
53static void bta_hl_sdp_cback1(UINT16 status);
54static void bta_hl_sdp_cback2(UINT16 status);
55static void bta_hl_sdp_cback3(UINT16 status);
56static void bta_hl_sdp_cback4(UINT16 status);
57static void bta_hl_sdp_cback5(UINT16 status);
58static void bta_hl_sdp_cback6(UINT16 status);
59
60
61static tSDP_DISC_CMPL_CB * const bta_hl_sdp_cback_arr[] =
62{
63    bta_hl_sdp_cback0,
64    bta_hl_sdp_cback1,
65    bta_hl_sdp_cback2,
66    bta_hl_sdp_cback3,
67    bta_hl_sdp_cback4,
68    bta_hl_sdp_cback5,
69    bta_hl_sdp_cback6
70};
71
72
73
74/*******************************************************************************
75**
76** Function         bta_hl_dch_mca_cong_change
77**
78** Description      Action routine for processing congestion change notification
79**
80** Returns          void
81**
82*******************************************************************************/
83void bta_hl_dch_mca_cong_change(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx,
84                                tBTA_HL_DATA *p_data)
85{
86    tBTA_HL_APP_CB      *p_acb  = BTA_HL_GET_APP_CB_PTR(app_idx);
87    tBTA_HL_MCL_CB      *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
88    tBTA_HL_MDL_CB      *p_dcb  = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
89    tMCA_CONG_CHG       *p_cong_chg = &p_data->mca_evt.mca_data.cong_chg;
90    tBTA_HL             evt_data;
91
92#if (BTA_HL_DEBUG == TRUE)
93    APPL_TRACE_DEBUG("bta_hl_dch_mca_cong_change mdl_id=%d cong=%d",
94                      p_cong_chg->mdl_id,
95                      p_cong_chg->cong);
96#endif
97    evt_data.dch_cong_ind.cong          =
98    p_dcb->cong                         = p_cong_chg->cong;
99    evt_data.dch_cong_ind.mdl_handle    = p_dcb->mdl_handle;
100    evt_data.dch_cong_ind.mcl_handle    = p_mcb->mcl_handle;
101    evt_data.dch_cong_ind.app_handle    = p_acb->app_handle;
102
103    p_acb->p_cback(BTA_HL_CONG_CHG_IND_EVT ,(tBTA_HL *) &evt_data );
104}
105
106
107
108/*******************************************************************************
109**
110** Function         bta_hl_dch_echo_test
111**
112** Description      Action routine for processing echo test request
113**
114** Returns          void
115**
116*******************************************************************************/
117void bta_hl_dch_echo_test(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx,
118                          tBTA_HL_DATA *p_data)
119{
120    tBTA_HL_APP_CB      *p_acb  = BTA_HL_GET_APP_CB_PTR(app_idx);
121    tBTA_HL_MCL_CB      *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
122    tBTA_HL_MDL_CB      *p_dcb  = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
123    UNUSED(p_data);
124
125#if (BTA_HL_DEBUG == TRUE)
126    APPL_TRACE_DEBUG("bta_hl_dch_echo_test");
127#endif
128
129    p_dcb->echo_oper = BTA_HL_ECHO_OP_CI_GET_ECHO_DATA;
130    p_dcb->cout_oper |= BTA_HL_CO_GET_ECHO_DATA_MASK;
131
132    bta_hl_co_get_echo_data(p_acb->app_id, p_mcb->mcl_handle,
133                            p_dcb->p_echo_tx_pkt->len,
134                            BTA_HL_GET_BUF_PTR(p_dcb->p_echo_tx_pkt),
135                            BTA_HL_CI_GET_ECHO_DATA_EVT);
136
137}
138/*******************************************************************************
139**
140** Function         bta_hl_dch_sdp_init
141**
142** Description      Action routine for processing DCH SDP initiation
143**
144** Returns          void
145**
146*******************************************************************************/
147void bta_hl_dch_sdp_init(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx,
148                         tBTA_HL_DATA *p_data)
149{
150    tBTA_HL_MCL_CB      *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
151    tBTA_HL_MDL_CB      *p_dcb  = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
152
153#if (BTA_HL_DEBUG == TRUE)
154    APPL_TRACE_DEBUG("bta_hl_dch_sdp_init");
155#endif
156    if ( p_mcb->sdp_oper == BTA_HL_SDP_OP_NONE)
157    {
158        p_mcb->sdp_mdl_idx = mdl_idx;
159        if (p_dcb->dch_oper == BTA_HL_DCH_OP_LOCAL_OPEN )
160        {
161            p_mcb->sdp_oper = BTA_HL_SDP_OP_DCH_OPEN_INIT;
162
163        }
164        else
165        {
166            p_mcb->sdp_oper = BTA_HL_SDP_OP_DCH_RECONNECT_INIT;
167        }
168
169        if (bta_hl_init_sdp(p_mcb->sdp_oper, app_idx, mcl_idx, mdl_idx) != BTA_HL_STATUS_OK)
170        {
171            APPL_TRACE_ERROR("SDP INIT failed");
172            p_mcb->sdp_oper = BTA_HL_SDP_OP_NONE;
173            bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_SDP_FAIL_EVT, p_data);
174        }
175    }
176    else
177    {
178        APPL_TRACE_ERROR("SDP in use");
179        bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_SDP_FAIL_EVT, p_data);
180    }
181}
182
183
184/*******************************************************************************
185**
186** Function         bta_hl_dch_close_echo_test
187**
188** Description      Action routine for processing the closing of echo test
189**
190** Returns          void
191**
192*******************************************************************************/
193void bta_hl_dch_close_echo_test(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx,
194                                tBTA_HL_DATA *p_data)
195{
196    tBTA_HL_MDL_CB          *p_dcb  = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
197
198#if (BTA_HL_DEBUG == TRUE)
199    APPL_TRACE_DEBUG("bta_hl_dch_close_echo_test");
200#endif
201
202    switch (p_dcb->echo_oper)
203    {
204        case BTA_HL_ECHO_OP_DCH_CLOSE_CFM:
205        case BTA_HL_ECHO_OP_OPEN_IND:
206        case BTA_HL_ECHO_OP_ECHO_PKT:
207            p_dcb->dch_oper = BTA_HL_DCH_OP_LOCAL_CLOSE_ECHO_TEST;
208            break;
209        case BTA_HL_ECHO_OP_MDL_CREATE_CFM:
210        case BTA_HL_ECHO_OP_DCH_OPEN_CFM:
211        case BTA_HL_ECHO_OP_LOOP_BACK:
212        default:
213            break;
214    }
215
216    if (MCA_CloseReq((tMCA_DL) p_dcb->mdl_handle)!= MCA_SUCCESS)
217    {
218        bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_CMPL_EVT, p_data);
219    }
220}
221
222
223/*******************************************************************************
224**
225** Function         bta_hl_dch_mca_rcv_data
226**
227** Description      Action routine for processing the received data
228**
229** Returns          void
230**
231*******************************************************************************/
232void bta_hl_dch_mca_rcv_data(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx,
233                             tBTA_HL_DATA *p_data)
234{
235    tBTA_HL_APP_CB      *p_acb  = BTA_HL_GET_APP_CB_PTR(app_idx);
236    tBTA_HL_MCL_CB      *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
237    tBTA_HL_MDL_CB      *p_dcb  = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
238
239#if (BTA_HL_DEBUG == TRUE)
240    APPL_TRACE_DEBUG("bta_hl_dch_mca_rcv_data");
241#endif
242
243    if (p_dcb->local_mdep_id == BTA_HL_ECHO_TEST_MDEP_ID)
244    {
245        switch ( p_dcb->echo_oper)
246        {
247            case  BTA_HL_ECHO_OP_ECHO_PKT:
248
249                if (MCA_WriteReq((tMCA_DL) p_dcb->mdl_handle, p_data->mca_rcv_data_evt.p_pkt) != MCA_SUCCESS)
250                {
251                    utl_freebuf((void **) &p_data->mca_rcv_data_evt.p_pkt);
252                    bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_ECHO_TEST_EVT, p_data);
253                }
254                break;
255            case BTA_HL_ECHO_OP_LOOP_BACK:
256
257                p_dcb->p_echo_rx_pkt = p_data->mca_rcv_data_evt.p_pkt;
258                p_dcb->echo_oper = BTA_HL_ECHO_OP_CI_PUT_ECHO_DATA;
259                p_dcb->cout_oper |= BTA_HL_CO_PUT_ECHO_DATA_MASK;
260                p_dcb->ci_put_echo_data_status = BTA_HL_STATUS_FAIL;
261
262                bta_hl_co_put_echo_data(p_acb->app_id, p_mcb->mcl_handle,
263                                        p_dcb->p_echo_rx_pkt->len,
264                                        BTA_HL_GET_BUF_PTR(p_dcb->p_echo_rx_pkt),
265                                        BTA_HL_CI_PUT_ECHO_DATA_EVT);
266                break;
267            default:
268                APPL_TRACE_ERROR("Unknonw echo_oper=%d",p_dcb->echo_oper);
269                break;
270        }
271
272    }
273    else
274    {
275        p_dcb->cout_oper |= BTA_HL_CO_PUT_RX_DATA_MASK;
276        p_dcb->p_rx_pkt = p_data->mca_rcv_data_evt.p_pkt;
277
278        bta_hl_co_put_rx_data(p_acb->app_id, p_dcb->mdl_handle,
279                              p_dcb->p_rx_pkt->len,
280                              BTA_HL_GET_BUF_PTR(p_dcb->p_rx_pkt),
281                              BTA_HL_CI_PUT_RX_DATA_EVT);
282
283
284    }
285}
286
287
288/*******************************************************************************
289**
290** Function         bta_hl_dch_ci_put_echo_data
291**
292** Description      Action routine for processing the call-in of the
293**                  put echo data event
294**
295** Returns          void
296**
297*******************************************************************************/
298void bta_hl_dch_ci_put_echo_data(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx,
299                                 tBTA_HL_DATA *p_data)
300{
301    tBTA_HL_MDL_CB      *p_dcb  = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
302
303#if (BTA_HL_DEBUG == TRUE)
304    APPL_TRACE_DEBUG("bta_hl_dch_ci_put_echo_data");
305#endif
306
307    p_dcb->cout_oper &= ~BTA_HL_CO_PUT_ECHO_DATA_MASK;
308    utl_freebuf((void **) &p_dcb->p_echo_rx_pkt);
309    p_dcb->ci_put_echo_data_status = p_data->ci_get_put_echo_data.status;
310
311    p_dcb->echo_oper = BTA_HL_ECHO_OP_DCH_CLOSE_CFM;
312    bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_ECHO_TEST_EVT, p_data);
313}
314
315
316
317/*******************************************************************************
318**
319** Function         bta_hl_dch_ci_get_echo_data
320**
321** Description      Action routine for processing the call-in of the
322**                  get echo data event
323**
324** Returns          void
325**
326*******************************************************************************/
327void bta_hl_dch_ci_get_echo_data(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx,
328                                 tBTA_HL_DATA *p_data)
329{
330    tBTA_HL_MDL_CB      *p_dcb  = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
331    tBTA_HL_STATUS      status;
332
333#if (BTA_HL_DEBUG == TRUE)
334    APPL_TRACE_DEBUG("bta_hl_dch_ci_get_echo_data");
335#endif
336
337    p_dcb->cout_oper &= ~BTA_HL_CO_GET_ECHO_DATA_MASK;
338
339    if (!p_dcb->abort_oper)
340    {
341        status = p_data->ci_get_put_echo_data.status;
342        if (status == BTA_HL_STATUS_OK)
343        {
344            p_dcb->echo_oper = BTA_HL_ECHO_OP_MDL_CREATE_CFM;
345            bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_OPEN_EVT, p_data);
346        }
347        else
348        {
349            bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_CMPL_EVT, p_data);
350        }
351    }
352    else
353    {
354        bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_CMPL_EVT, p_data);
355    }
356
357}
358
359/*******************************************************************************
360**
361** Function         bta_hl_dch_ci_put_rx_data
362**
363** Description      Action routine for processing the call-in of the
364**                  put rx data event
365**
366** Returns          void
367**
368*******************************************************************************/
369void bta_hl_dch_ci_put_rx_data(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx,
370                               tBTA_HL_DATA *p_data)
371{
372    tBTA_HL_APP_CB      *p_acb  = BTA_HL_GET_APP_CB_PTR(app_idx);
373    tBTA_HL_MCL_CB      *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
374    tBTA_HL_MDL_CB      *p_dcb  = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
375    tBTA_HL             evt_data;
376
377#if (BTA_HL_DEBUG == TRUE)
378    APPL_TRACE_DEBUG("bta_hl_dch_ci_put_rx_data");
379#endif
380
381    p_dcb->cout_oper &= ~BTA_HL_CO_PUT_RX_DATA_MASK;
382    utl_freebuf((void **) &p_dcb->p_rx_pkt);
383    bta_hl_build_rcv_data_ind(&evt_data,
384                              p_acb->app_handle,
385                              p_mcb->mcl_handle,
386                              p_dcb->mdl_handle);
387    p_acb->p_cback(BTA_HL_DCH_RCV_DATA_IND_EVT,(tBTA_HL *) &evt_data );
388    if (p_dcb->close_pending)
389    {
390        if (!p_dcb->cout_oper)
391        {
392            bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_EVT, p_data);
393        }
394
395    }
396}
397
398
399
400/*******************************************************************************
401**
402** Function         bta_hl_dch_ci_get_tx_data
403**
404** Description      Action routine for processing the call-in of the
405**                  get tx data event
406**
407** Returns          void
408**
409*******************************************************************************/
410void bta_hl_dch_ci_get_tx_data(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx,
411                               tBTA_HL_DATA *p_data)
412{
413    tBTA_HL_APP_CB      *p_acb  = BTA_HL_GET_APP_CB_PTR(app_idx);
414    tBTA_HL_MCL_CB      *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
415    tBTA_HL_MDL_CB      *p_dcb  = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
416    tMCA_RESULT         result;
417    tBTA_HL_STATUS      status = BTA_HL_STATUS_OK;
418    BOOLEAN             free_buf = FALSE;
419    BOOLEAN             close_dch = FALSE;
420    tBTA_HL             evt_data;
421
422
423#if (BTA_HL_DEBUG == TRUE)
424    APPL_TRACE_DEBUG("bta_hl_dch_ci_get_tx_data");
425#endif
426
427    p_dcb->cout_oper &= ~BTA_HL_CO_GET_TX_DATA_MASK;
428
429    if (p_dcb->close_pending)
430    {
431        status = BTA_HL_STATUS_FAIL;
432        free_buf = TRUE;
433
434        if (!p_dcb->cout_oper)
435        {
436            close_dch = TRUE;
437        }
438    }
439    else
440    {
441        if ((result = MCA_WriteReq((tMCA_DL) p_dcb->mdl_handle, p_dcb->p_tx_pkt)) != MCA_SUCCESS)
442        {
443            if (result == MCA_BUSY)
444            {
445                status = BTA_HL_STATUS_DCH_BUSY;
446            }
447            else
448            {
449                status = BTA_HL_STATUS_FAIL;
450            }
451            free_buf = TRUE;
452        }
453        else
454        {
455            p_dcb->p_tx_pkt = NULL;
456        }
457    }
458
459    if (free_buf)
460    {
461        utl_freebuf((void **) &p_dcb->p_tx_pkt);
462    }
463
464    bta_hl_build_send_data_cfm(&evt_data,
465                               p_acb->app_handle,
466                               p_mcb->mcl_handle,
467                               p_dcb->mdl_handle,
468                               status);
469    p_acb->p_cback(BTA_HL_DCH_SEND_DATA_CFM_EVT,(tBTA_HL *) &evt_data );
470
471    if (close_dch)
472    {
473        bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_EVT, p_data);
474    }
475}
476
477
478/*******************************************************************************
479**
480** Function         bta_hl_dch_send_data
481**
482** Description      Action routine for processing api send data request
483**
484** Returns          void
485**
486*******************************************************************************/
487void bta_hl_dch_send_data(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx,
488                          tBTA_HL_DATA *p_data)
489{
490    tBTA_HL_APP_CB      *p_acb  = BTA_HL_GET_APP_CB_PTR(app_idx);
491    tBTA_HL_MCL_CB      *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
492    tBTA_HL_MDL_CB      *p_dcb  = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
493    tBTA_HL             evt_data;
494    BOOLEAN             success = TRUE;
495
496#if (BTA_HL_DEBUG == TRUE)
497    APPL_TRACE_DEBUG("bta_hl_dch_send_data");
498#endif
499
500    if (!(p_dcb->cout_oper & BTA_HL_CO_GET_TX_DATA_MASK))
501    {
502        if ((p_dcb->p_tx_pkt = bta_hl_get_buf(p_data->api_send_data.pkt_size)) != NULL)
503        {
504            bta_hl_co_get_tx_data( p_acb->app_id,
505                                   p_dcb->mdl_handle,
506                                   p_data->api_send_data.pkt_size,
507                                   BTA_HL_GET_BUF_PTR(p_dcb->p_tx_pkt),
508                                   BTA_HL_CI_GET_TX_DATA_EVT);
509            p_dcb->cout_oper |= BTA_HL_CO_GET_TX_DATA_MASK;
510        }
511        else
512        {
513            success = FALSE;
514        }
515    }
516    else
517    {
518        success = FALSE;
519    }
520
521    if (!success)
522    {
523        bta_hl_build_send_data_cfm(&evt_data,
524                                   p_acb->app_handle,
525                                   p_mcb->mcl_handle,
526                                   p_dcb->mdl_handle,
527                                   BTA_HL_STATUS_FAIL);
528        p_acb->p_cback(BTA_HL_DCH_SEND_DATA_CFM_EVT,(tBTA_HL *) &evt_data );
529    }
530}
531
532/*******************************************************************************
533**
534** Function         bta_hl_dch_close_cmpl
535**
536** Description      Action routine for processing the close complete event
537**
538** Returns          void
539**
540*******************************************************************************/
541void bta_hl_dch_close_cmpl(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx,
542                           tBTA_HL_DATA *p_data)
543{
544    tBTA_HL_APP_CB      *p_acb  = BTA_HL_GET_APP_CB_PTR(app_idx);
545    tBTA_HL_MCL_CB      *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
546    tBTA_HL_MDL_CB      *p_dcb  = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
547    tBTA_HL             evt_data;
548    tBTA_HL_EVT         event = 0;
549    BOOLEAN             send_evt=TRUE;
550    tBTA_HL_STATUS      status;
551
552#if (BTA_HL_DEBUG == TRUE)
553#if (BT_TRACE_VERBOSE == TRUE)
554    APPL_TRACE_DEBUG("bta_hl_dch_close_cmpl dch oper=%s", bta_hl_dch_oper_code(p_dcb->dch_oper));
555#else
556    APPL_TRACE_DEBUG("bta_hl_dch_close_cmpl dch oper=%d", p_dcb->dch_oper);
557#endif
558#endif
559
560    switch (p_dcb->dch_oper)
561    {
562        case BTA_HL_DCH_OP_LOCAL_OPEN:
563        case BTA_HL_DCH_OP_LOCAL_RECONNECT:
564
565            if (p_dcb->abort_oper & BTA_HL_ABORT_LOCAL_MASK)
566            {
567                bta_hl_build_abort_cfm(&evt_data,
568                                       p_acb->app_handle,
569                                       p_mcb->mcl_handle,
570                                       BTA_HL_STATUS_OK);
571                event = BTA_HL_DCH_ABORT_CFM_EVT;
572            }
573            else if (p_dcb->abort_oper & BTA_HL_ABORT_REMOTE_MASK )
574            {
575                bta_hl_build_abort_ind(&evt_data,
576                                       p_acb->app_handle,
577                                       p_mcb->mcl_handle);
578                event = BTA_HL_DCH_ABORT_IND_EVT;
579            }
580            else
581            {
582                bta_hl_build_dch_open_cfm(&evt_data,
583                                          p_acb->app_handle,
584                                          p_mcb->mcl_handle,
585                                          BTA_HL_INVALID_MDL_HANDLE,
586                                          0,0,0,0,0, BTA_HL_STATUS_FAIL);
587                event = BTA_HL_DCH_OPEN_CFM_EVT;
588                if (p_dcb->dch_oper == BTA_HL_DCH_OP_LOCAL_RECONNECT)
589                {
590                    event = BTA_HL_DCH_RECONNECT_CFM_EVT;
591                }
592            }
593            break;
594
595        case BTA_HL_DCH_OP_LOCAL_CLOSE:
596        case BTA_HL_DCH_OP_REMOTE_DELETE:
597        case BTA_HL_DCH_OP_LOCAL_CLOSE_RECONNECT:
598        case BTA_HL_DCH_OP_NONE:
599
600            bta_hl_build_dch_close_cfm(&evt_data,
601                                       p_acb->app_handle,
602                                       p_mcb->mcl_handle,
603                                       p_dcb->mdl_handle,
604                                       BTA_HL_STATUS_OK);
605            event = BTA_HL_DCH_CLOSE_CFM_EVT;
606            break;
607
608        case BTA_HL_DCH_OP_REMOTE_CLOSE:
609            bta_hl_build_dch_close_ind(&evt_data,
610                                       p_acb->app_handle,
611                                       p_mcb->mcl_handle,
612                                       p_dcb->mdl_handle,
613                                       p_dcb->intentional_close);
614            event = BTA_HL_DCH_CLOSE_IND_EVT;
615            break;
616
617        case BTA_HL_DCH_OP_REMOTE_OPEN:
618
619            if (p_dcb->abort_oper & BTA_HL_ABORT_LOCAL_MASK)
620            {
621                bta_hl_build_abort_cfm(&evt_data,
622                                       p_acb->app_handle,
623                                       p_mcb->mcl_handle,
624                                       BTA_HL_STATUS_OK);
625                event = BTA_HL_DCH_ABORT_CFM_EVT;
626            }
627            else if (p_dcb->abort_oper & BTA_HL_ABORT_REMOTE_MASK )
628            {
629                bta_hl_build_abort_ind(&evt_data,
630                                       p_acb->app_handle,
631                                       p_mcb->mcl_handle);
632                event = BTA_HL_DCH_ABORT_IND_EVT;
633            }
634            else
635            {
636                bta_hl_build_dch_close_ind(&evt_data,
637                                           p_acb->app_handle,
638                                           p_mcb->mcl_handle,
639                                           p_dcb->mdl_handle,
640                                           p_dcb->intentional_close);
641                event = BTA_HL_DCH_CLOSE_IND_EVT;
642            }
643            break;
644
645        case BTA_HL_DCH_OP_LOCAL_CLOSE_ECHO_TEST:
646            /* this is normal echo test close */
647        case BTA_HL_DCH_OP_REMOTE_CREATE:
648        case BTA_HL_DCH_OP_REMOTE_RECONNECT:
649            send_evt=FALSE;
650            break;
651
652        default:
653#if (BTA_HL_DEBUG == TRUE)
654#if (BT_TRACE_VERBOSE == TRUE)
655            APPL_TRACE_ERROR("DCH operation not found oper=%s", bta_hl_dch_oper_code(p_dcb->dch_oper));
656#else
657            APPL_TRACE_ERROR("DCH operation not found oper=%d", p_dcb->dch_oper);
658#endif
659#endif
660            send_evt=FALSE;
661            break;
662    }
663
664    if ( p_dcb->local_mdep_id == BTA_HL_ECHO_TEST_MDEP_ID )
665    {
666        p_mcb->echo_test = FALSE;
667        send_evt=FALSE;
668
669        if ( p_dcb->dch_oper != BTA_HL_DCH_OP_LOCAL_CLOSE_ECHO_TEST)
670        {
671            switch (p_dcb->echo_oper)
672            {
673                case BTA_HL_ECHO_OP_CI_GET_ECHO_DATA:
674                case BTA_HL_ECHO_OP_SDP_INIT:
675                case BTA_HL_ECHO_OP_MDL_CREATE_CFM:
676                case BTA_HL_ECHO_OP_DCH_OPEN_CFM:
677                case BTA_HL_ECHO_OP_LOOP_BACK:
678
679                    status = BTA_HL_STATUS_FAIL;
680                    send_evt = TRUE;
681                    break;
682                case BTA_HL_ECHO_OP_OPEN_IND:
683                case BTA_HL_ECHO_OP_ECHO_PKT:
684                    break;
685                default:
686                    APPL_TRACE_ERROR("Invalid echo_oper=%d", p_dcb->echo_oper);
687                    break;
688            }
689        }
690        else
691        {
692            status = p_dcb->ci_put_echo_data_status;
693            send_evt = TRUE;
694        }
695
696        if (send_evt)
697        {
698            bta_hl_build_echo_test_cfm(&evt_data,
699                                       p_acb->app_handle,
700                                       p_mcb->mcl_handle,
701                                       status);
702            event = BTA_HL_DCH_ECHO_TEST_CFM_EVT;
703        }
704    }
705
706    bta_hl_clean_mdl_cb(app_idx, mcl_idx, mdl_idx);
707
708    if (send_evt)
709    {
710        if (p_acb->p_cback)
711        {
712#if (BTA_HL_DEBUG == TRUE)
713#if (BT_TRACE_VERBOSE == TRUE)
714            APPL_TRACE_DEBUG("Send Event: %s",  bta_hl_cback_evt_code(event));
715#else
716            APPL_TRACE_DEBUG("Send Event: 0x%02x", event);
717#endif
718#endif
719            p_acb->p_cback(event,(tBTA_HL *) &evt_data );
720        }
721    }
722    /* check cch close is in progress or not */
723    bta_hl_check_cch_close(app_idx, mcl_idx, p_data, FALSE);
724}
725/*******************************************************************************
726**
727** Function         bta_hl_dch_mca_close_ind
728**
729** Description      Action routine for processing the close indication
730**
731** Returns          void
732**
733*******************************************************************************/
734void bta_hl_dch_mca_close_ind(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx,
735                              tBTA_HL_DATA *p_data)
736{
737    tBTA_HL_MDL_CB      *p_dcb  = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
738
739#if (BTA_HL_DEBUG == TRUE)
740#if (BT_TRACE_VERBOSE == TRUE)
741    APPL_TRACE_DEBUG("bta_hl_dch_mca_close_ind dch oper=%s", bta_hl_dch_oper_code(p_dcb->dch_oper));
742#else
743    APPL_TRACE_DEBUG("bta_hl_dch_mca_close_ind dch oper=%d", p_dcb->dch_oper);
744#endif
745#endif
746
747    p_dcb->intentional_close = FALSE;
748    if (p_data->mca_evt.mca_data.close_ind.reason == L2CAP_DISC_OK)
749    {
750        p_dcb->intentional_close = TRUE;
751    }
752
753    if (!p_dcb->cout_oper)
754    {
755        if ((p_dcb->dch_oper != BTA_HL_DCH_OP_REMOTE_OPEN) &&
756            (p_dcb->dch_oper != BTA_HL_DCH_OP_REMOTE_RECONNECT))
757        {
758            p_dcb->dch_oper = BTA_HL_DCH_OP_REMOTE_CLOSE;
759        }
760        bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_CMPL_EVT, p_data);
761    }
762    else
763    {
764        p_dcb->close_pending = TRUE;
765    }
766}
767
768/*******************************************************************************
769**
770** Function         bta_hl_dch_mca_close_cfm
771**
772** Description      Action routine for processing the close confirmation
773**
774** Returns          void
775**
776*******************************************************************************/
777void bta_hl_dch_mca_close_cfm(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx,
778                              tBTA_HL_DATA *p_data)
779{
780    tBTA_HL_MDL_CB      *p_dcb  = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
781
782
783#if (BTA_HL_DEBUG == TRUE)
784#if (BT_TRACE_VERBOSE == TRUE)
785    APPL_TRACE_DEBUG("bta_hl_dch_mca_close_cfm dch_oper=%s", bta_hl_dch_oper_code(p_dcb->dch_oper) );
786#else
787    APPL_TRACE_DEBUG("bta_hl_dch_mca_close_cfm dch_oper=%d", p_dcb->dch_oper);
788#endif
789#endif
790
791    switch (p_dcb->dch_oper)
792    {
793        case BTA_HL_DCH_OP_LOCAL_CLOSE:
794        case BTA_HL_DCH_OP_LOCAL_OPEN:
795        case BTA_HL_DCH_OP_LOCAL_RECONNECT:
796        case BTA_HL_DCH_OP_LOCAL_CLOSE_ECHO_TEST:
797        case BTA_HL_DCH_OP_REMOTE_DELETE:
798        case BTA_HL_DCH_OP_LOCAL_CLOSE_RECONNECT:
799        case BTA_HL_DCH_OP_NONE:
800            bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_CMPL_EVT, p_data);
801            break;
802        default:
803#if (BTA_HL_DEBUG == TRUE)
804#if (BT_TRACE_VERBOSE == TRUE)
805            APPL_TRACE_ERROR("Invalid dch_oper=%s for close cfm", bta_hl_dch_oper_code(p_dcb->dch_oper) );
806#else
807            APPL_TRACE_ERROR("Invalid dch_oper=%d for close cfm", p_dcb->dch_oper);
808#endif
809#endif
810            break;
811    }
812
813}
814
815/*******************************************************************************
816**
817** Function         bta_hl_dch_mca_close
818**
819** Description      Action routine for processing the DCH close request
820**
821** Returns          void
822**
823*******************************************************************************/
824void bta_hl_dch_mca_close(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx,
825                          tBTA_HL_DATA *p_data)
826{
827    tBTA_HL_APP_CB          *p_acb  = BTA_HL_GET_APP_CB_PTR(app_idx);
828    tBTA_HL_MCL_CB          *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
829    tBTA_HL_MDL_CB          *p_dcb  = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
830    tBTA_HL_STATUS          status = BTA_HL_STATUS_OK;
831    tBTA_HL                 evt_data;
832
833#if (BTA_HL_DEBUG == TRUE)
834    APPL_TRACE_DEBUG("bta_hl_dch_mca_close");
835#endif
836    if (!p_dcb->cout_oper)
837    {
838        p_dcb->close_pending = FALSE;
839        if (MCA_CloseReq((tMCA_DL)p_dcb->mdl_handle)== MCA_SUCCESS)
840        {
841            p_dcb->dch_oper = BTA_HL_DCH_OP_LOCAL_CLOSE;
842        }
843        else
844        {
845            status = BTA_HL_STATUS_FAIL;
846        }
847
848        if ((status != BTA_HL_STATUS_OK) &&
849            (p_mcb->cch_close_dch_oper != BTA_HL_CCH_CLOSE_OP_DCH_CLOSE))
850        {
851            bta_hl_build_dch_close_cfm(&evt_data,
852                                       p_acb->app_handle,
853                                       p_mcb->mcl_handle,
854                                       p_data->api_dch_close.mdl_handle,
855                                       status);
856            p_acb->p_cback(BTA_HL_DCH_CLOSE_CFM_EVT,(tBTA_HL *) &evt_data );
857        }
858    }
859    else
860    {
861        p_dcb->close_pending = TRUE;
862    }
863}
864
865
866/*******************************************************************************
867**
868** Function         bta_hl_dch_mca_open_ind
869**
870** Description      Action routine for processing the open indication
871**
872** Returns          void
873**
874*******************************************************************************/
875void bta_hl_dch_mca_open_ind(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx,
876                             tBTA_HL_DATA *p_data)
877{
878    tBTA_HL_APP_CB      *p_acb  = BTA_HL_GET_APP_CB_PTR(app_idx);
879    tBTA_HL_MCL_CB      *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
880    tBTA_HL_MDL_CB      *p_dcb  = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
881    tMCA_DL_OPEN        *p_open_ind = &p_data->mca_evt.mca_data.open_ind;
882    tBTA_HL             evt_data;
883    tBTA_HL_EVT         event;
884    UINT8               old_dch_oper = BTA_HL_DCH_OP_NONE;
885    BOOLEAN             send_event = FALSE;
886
887
888#if (BTA_HL_DEBUG == TRUE)
889    APPL_TRACE_DEBUG("bta_hl_dch_mca_open_ind");
890#endif
891    if ((p_dcb->dch_oper == BTA_HL_DCH_OP_REMOTE_OPEN) ||
892        (p_dcb->dch_oper == BTA_HL_DCH_OP_REMOTE_RECONNECT)    )
893    {
894        p_dcb->mdl_handle = (tBTA_HL_MDL_HANDLE) p_open_ind->mdl;
895        p_dcb->mtu        = p_open_ind->mtu;
896
897        evt_data.dch_open_ind.mdl_handle = p_dcb->mdl_handle;
898        evt_data.dch_open_ind.mcl_handle = p_mcb->mcl_handle;
899        evt_data.dch_open_ind.app_handle = p_acb->app_handle;
900
901        evt_data.dch_open_ind.local_mdep_id = p_dcb->local_mdep_id;
902        evt_data.dch_open_ind.mdl_id = p_dcb->mdl_id;
903        evt_data.dch_open_ind.mtu = p_dcb->mtu;
904
905        if ( p_dcb->chnl_cfg.fcr_opt.mode == L2CAP_FCR_ERTM_MODE )
906        {
907            evt_data.dch_open_ind.dch_mode = BTA_HL_DCH_MODE_RELIABLE;
908            if (!bta_hl_is_the_first_reliable_existed(app_idx, mcl_idx))
909            {
910                p_dcb->is_the_first_reliable = TRUE;
911            }
912        }
913        else
914        {
915            evt_data.dch_open_ind.dch_mode = BTA_HL_DCH_MODE_STREAMING;
916        }
917        evt_data.dch_open_ind.first_reliable = p_dcb->is_the_first_reliable ;
918
919        old_dch_oper = p_dcb->dch_oper;
920        p_dcb->dch_oper = BTA_HL_DCH_OP_NONE;
921
922
923    }
924
925    switch (old_dch_oper)
926    {
927        case BTA_HL_DCH_OP_REMOTE_OPEN:
928
929            p_dcb->dch_mode = evt_data.dch_open_ind.dch_mode;
930            if (p_dcb->local_mdep_id != BTA_HL_ECHO_TEST_MDEP_ID)
931            {
932                bta_hl_save_mdl_cfg(app_idx, mcl_idx,mdl_idx);
933                event= BTA_HL_DCH_OPEN_IND_EVT;
934                send_event= TRUE;
935            }
936            else
937            {
938                p_dcb->echo_oper = BTA_HL_ECHO_OP_ECHO_PKT;
939            }
940
941            break;
942
943        case BTA_HL_DCH_OP_REMOTE_RECONNECT:
944
945            if (bta_hl_validate_chan_cfg(app_idx, mcl_idx, mdl_idx))
946            {
947                bta_hl_save_mdl_cfg(app_idx, mcl_idx,mdl_idx);
948                event= BTA_HL_DCH_RECONNECT_IND_EVT;
949                send_event= TRUE;
950            }
951            else
952            {
953                if (MCA_CloseReq((tMCA_DL) p_dcb->mdl_handle) == MCA_SUCCESS)
954                {
955                    p_dcb->dch_oper = BTA_HL_DCH_OP_LOCAL_CLOSE_RECONNECT;
956                }
957                else
958                {
959                    APPL_TRACE_ERROR("Unabel to close DCH for reconnect cfg mismatch");
960                }
961            }
962            break;
963        default:
964            break;
965    }
966
967    if (send_event)
968    {
969        p_acb->p_cback(event ,(tBTA_HL *) &evt_data );
970    }
971}
972
973/*******************************************************************************
974**
975** Function         bta_hl_dch_mca_open_cfm
976**
977** Description      Action routine for processing the open confirmation
978**
979** Returns          void
980**
981*******************************************************************************/
982void bta_hl_dch_mca_open_cfm(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx,
983                             tBTA_HL_DATA *p_data)
984{
985    tBTA_HL_APP_CB      *p_acb  = BTA_HL_GET_APP_CB_PTR(app_idx);
986    tBTA_HL_MCL_CB      *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
987    tBTA_HL_MDL_CB      *p_dcb  = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
988    tMCA_DL_OPEN        *p_open_cfm = &p_data->mca_evt.mca_data.open_cfm;
989    tBTA_HL             evt_data;
990    tBTA_HL_EVT         event;
991    UINT8               old_dch_oper = BTA_HL_DCH_OP_NONE;
992    tBTA_HL_DCH_MODE    dch_mode = BTA_HL_DCH_MODE_STREAMING;
993    BOOLEAN             send_event = FALSE;
994
995
996#if (BTA_HL_DEBUG == TRUE)
997    APPL_TRACE_DEBUG("bta_hl_dch_mca_open_cfm");
998#endif
999    if ((p_dcb->dch_oper == BTA_HL_DCH_OP_LOCAL_OPEN) ||
1000        (p_dcb->dch_oper == BTA_HL_DCH_OP_LOCAL_RECONNECT))
1001    {
1002        p_dcb->mdl_handle = (tBTA_HL_MDL_HANDLE) p_open_cfm->mdl;
1003        p_dcb->mtu        = p_open_cfm->mtu;
1004
1005        /*todo verify dch_mode, mtu and fcs for reconnect */
1006        if ( p_dcb->chnl_cfg.fcr_opt.mode == L2CAP_FCR_ERTM_MODE )
1007        {
1008            dch_mode = BTA_HL_DCH_MODE_RELIABLE;
1009        }
1010
1011        if (p_dcb->local_mdep_id != BTA_HL_ECHO_TEST_MDEP_ID)
1012        {
1013            if (dch_mode == BTA_HL_DCH_MODE_RELIABLE )
1014            {
1015                if (!bta_hl_is_the_first_reliable_existed(app_idx, mcl_idx))
1016                {
1017                    p_dcb->is_the_first_reliable = TRUE;
1018                }
1019            }
1020        }
1021
1022        bta_hl_build_dch_open_cfm(&evt_data, p_acb->app_handle,
1023                                  p_mcb->mcl_handle,
1024                                  p_dcb->mdl_handle,
1025                                  p_dcb->local_mdep_id,
1026                                  p_dcb->mdl_id, dch_mode,
1027                                  p_dcb->is_the_first_reliable,
1028                                  p_dcb->mtu,
1029                                  BTA_HL_STATUS_OK);
1030
1031        old_dch_oper = p_dcb->dch_oper;
1032        p_dcb->dch_oper = BTA_HL_DCH_OP_NONE;
1033    }
1034    else
1035    {
1036        APPL_TRACE_ERROR("Error dch oper =%d",  p_dcb->dch_oper);
1037        return;
1038    }
1039
1040    switch (old_dch_oper)
1041    {
1042        case BTA_HL_DCH_OP_LOCAL_OPEN:
1043
1044            p_dcb->dch_mode = dch_mode;
1045            if (p_dcb->local_mdep_id != BTA_HL_ECHO_TEST_MDEP_ID)
1046            {
1047                bta_hl_save_mdl_cfg(app_idx, mcl_idx, mdl_idx);
1048                event= BTA_HL_DCH_OPEN_CFM_EVT;
1049                send_event= TRUE;
1050            }
1051            else
1052            {
1053                p_dcb->echo_oper = BTA_HL_ECHO_OP_LOOP_BACK;
1054                if (MCA_WriteReq((tMCA_DL) p_dcb->mdl_handle, p_dcb->p_echo_tx_pkt)!= MCA_SUCCESS)
1055                {
1056                    bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_ECHO_TEST_EVT, p_data);
1057                }
1058                else
1059                {
1060                    p_dcb->p_echo_tx_pkt = NULL;
1061                }
1062            }
1063            break;
1064
1065        case BTA_HL_DCH_OP_LOCAL_RECONNECT:
1066
1067            if (bta_hl_validate_chan_cfg(app_idx, mcl_idx, mdl_idx))
1068            {
1069                bta_hl_save_mdl_cfg(app_idx, mcl_idx,mdl_idx);
1070                event= BTA_HL_DCH_RECONNECT_CFM_EVT;
1071                send_event= TRUE;
1072            }
1073            else
1074            {
1075                if (MCA_CloseReq((tMCA_DL) p_dcb->mdl_handle) == MCA_SUCCESS)
1076                {
1077                    p_dcb->dch_oper = BTA_HL_DCH_OP_LOCAL_CLOSE_RECONNECT;
1078                }
1079                else
1080                {
1081                    APPL_TRACE_ERROR("Unabel to close DCH for reconnect cfg mismatch");
1082                }
1083            }
1084            break;
1085        default:
1086            break;
1087    }
1088
1089    if (send_event)
1090        p_acb->p_cback(event ,(tBTA_HL *) &evt_data );
1091}
1092
1093
1094/*******************************************************************************
1095**
1096** Function         bta_hl_dch_mca_abort_ind
1097**
1098** Description      Action routine for processing the abort indication
1099**
1100** Returns          void
1101**
1102*******************************************************************************/
1103void bta_hl_dch_mca_abort_ind(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx,
1104                              tBTA_HL_DATA *p_data)
1105{
1106    tBTA_HL_MDL_CB      *p_dcb  = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
1107
1108
1109#if (BTA_HL_DEBUG == TRUE)
1110    APPL_TRACE_DEBUG("bta_hl_dch_mca_abort_ind");
1111#endif
1112
1113    p_dcb->abort_oper |= BTA_HL_ABORT_REMOTE_MASK;
1114    bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_CMPL_EVT, p_data);
1115}
1116
1117/*******************************************************************************
1118**
1119** Function         bta_hl_dch_mca_abort_cfm
1120**
1121** Description      Action routine for processing the abort confirmation
1122**
1123** Returns          void
1124**
1125*******************************************************************************/
1126void bta_hl_dch_mca_abort_cfm(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx,
1127                              tBTA_HL_DATA *p_data)
1128{
1129    tBTA_HL_APP_CB      *p_acb  = BTA_HL_GET_APP_CB_PTR(app_idx);
1130    tBTA_HL_MCL_CB      *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
1131    tBTA_HL_MDL_CB      *p_dcb  = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
1132    tBTA_HL             evt_data;
1133
1134#if (BTA_HL_DEBUG == TRUE)
1135    APPL_TRACE_DEBUG("bta_hl_dch_mca_abort_cfm");
1136#endif
1137
1138    if (p_dcb->abort_oper)
1139    {
1140        if (p_data->mca_evt.mca_data.abort_cfm.rsp_code != MCA_RSP_SUCCESS )
1141        {
1142            if (p_dcb->abort_oper & BTA_HL_ABORT_LOCAL_MASK)
1143            {
1144                bta_hl_build_abort_cfm(&evt_data,
1145                                       p_acb->app_handle,
1146                                       p_mcb->mcl_handle,
1147                                       BTA_HL_STATUS_FAIL);
1148                p_acb->p_cback(BTA_HL_DCH_ABORT_CFM_EVT ,(tBTA_HL *) &evt_data );
1149            }
1150        }
1151        else
1152        {
1153            bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_CMPL_EVT, p_data);
1154        }
1155    }
1156    else
1157    {
1158        APPL_TRACE_ERROR("Not expecting Abort CFM ");
1159    }
1160}
1161
1162/*******************************************************************************
1163**
1164** Function         bta_hl_dch_mca_abort
1165**
1166** Description      Action routine for processing the abort request
1167**
1168** Returns          void
1169**
1170*******************************************************************************/
1171void bta_hl_dch_mca_abort(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx,
1172                          tBTA_HL_DATA *p_data)
1173{
1174    tBTA_HL_APP_CB          *p_acb  = BTA_HL_GET_APP_CB_PTR(app_idx);
1175    tBTA_HL_MCL_CB          *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
1176    tBTA_HL_MDL_CB          *p_dcb  = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
1177    tMCA_RESULT             mca_result;
1178    tBTA_HL                 evt_data;
1179
1180    if (((p_mcb->sdp_oper == BTA_HL_SDP_OP_DCH_OPEN_INIT) ||
1181         (p_mcb->sdp_oper == BTA_HL_SDP_OP_DCH_RECONNECT_INIT)) &&
1182        (p_mcb->sdp_mdl_idx == mdl_idx) )
1183    {
1184        p_dcb->abort_oper |= BTA_HL_ABORT_PENDING_MASK;
1185        return;
1186    }
1187    else if (p_dcb->echo_oper == BTA_HL_ECHO_OP_CI_GET_ECHO_DATA)
1188    {
1189        p_dcb->abort_oper |= BTA_HL_ABORT_PENDING_MASK;
1190        return;
1191    }
1192
1193    p_dcb->abort_oper &= ~BTA_HL_ABORT_PENDING_MASK;
1194
1195    if ((mca_result = MCA_Abort((tMCA_CL) p_mcb->mcl_handle))!= MCA_SUCCESS)
1196    {
1197        if (mca_result == MCA_NO_RESOURCES)
1198        {
1199            p_dcb->abort_oper |= BTA_HL_ABORT_PENDING_MASK;
1200        }
1201        else
1202        {
1203            if (p_dcb->abort_oper & BTA_HL_ABORT_LOCAL_MASK)
1204            {
1205                bta_hl_build_abort_cfm(&evt_data,
1206                                       p_acb->app_handle,
1207                                       p_mcb->mcl_handle,
1208                                       BTA_HL_STATUS_FAIL);
1209                p_acb->p_cback(BTA_HL_DCH_ABORT_CFM_EVT ,(tBTA_HL *) &evt_data );
1210            }
1211            bta_hl_check_cch_close(app_idx, mcl_idx, p_data, FALSE);
1212        }
1213
1214
1215    }
1216
1217#if (BTA_HL_DEBUG == TRUE)
1218    APPL_TRACE_DEBUG("bta_hl_dch_mca_abort abort_oper=0x%x", p_dcb->abort_oper);
1219#endif
1220
1221}
1222
1223/*******************************************************************************
1224**
1225** Function         bta_hl_dch_mca_reconnect_ind
1226**
1227** Description      Action routine for processing the reconnect indication
1228**
1229** Returns          void
1230**
1231*******************************************************************************/
1232void bta_hl_dch_mca_reconnect_ind(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx,
1233                                  tBTA_HL_DATA *p_data)
1234{
1235    tBTA_HL_MCL_CB      *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
1236    tBTA_HL_MDL_CB      *p_dcb  = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
1237    tBTA_HL_MDL_CFG     *p_mdl_cfg;
1238    tMCA_EVT_HDR        *p_reconnect_ind = &p_data->mca_evt.mca_data.reconnect_ind;
1239    UINT8               mdl_cfg_idx, in_use_mdl_idx, mdep_cfg_idx;
1240    UINT8               rsp_code = MCA_RSP_SUCCESS;
1241
1242
1243#if (BTA_HL_DEBUG == TRUE)
1244    APPL_TRACE_DEBUG("bta_hl_dch_mca_reconnect_ind mdl_id=%d", p_reconnect_ind->mdl_id);
1245#endif
1246
1247    if (bta_hl_find_mdl_cfg_idx(app_idx, mcl_idx, p_reconnect_ind->mdl_id, &mdl_cfg_idx))
1248    {
1249        if (!bta_hl_find_mdl_idx(app_idx,mcl_idx,p_reconnect_ind->mdl_id, &in_use_mdl_idx) )
1250        {
1251            p_mdl_cfg =  BTA_HL_GET_MDL_CFG_PTR(app_idx, mdl_cfg_idx);
1252
1253            if (bta_hl_find_mdep_cfg_idx(app_idx, p_mdl_cfg->local_mdep_id, &mdep_cfg_idx))
1254            {
1255                p_dcb->in_use               = TRUE;
1256                p_dcb->dch_oper             = BTA_HL_DCH_OP_REMOTE_RECONNECT;
1257                p_dcb->sec_mask             = (BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT);
1258                p_dcb->peer_mdep_id             = 0xFF;
1259                p_dcb->local_mdep_id        = p_mdl_cfg->local_mdep_id  ;
1260                p_dcb->local_mdep_cfg_idx   = mdep_cfg_idx;
1261                p_dcb->local_cfg            = BTA_HL_DCH_CFG_UNKNOWN;
1262                p_dcb->mdl_id               = p_reconnect_ind->mdl_id;
1263                p_dcb->mdl_cfg_idx_included = TRUE;
1264                p_dcb->mdl_cfg_idx          = mdl_cfg_idx;
1265                p_dcb->dch_mode             = p_mdl_cfg->dch_mode;
1266                bta_hl_find_rxtx_apdu_size(app_idx, mdep_cfg_idx,
1267                                           &p_dcb->max_rx_apdu_size,
1268                                           &p_dcb->max_tx_apdu_size);
1269                bta_hl_set_dch_chan_cfg(app_idx, mcl_idx, mdl_idx, p_data);
1270            }
1271            else
1272            {
1273                rsp_code = MCA_RSP_BAD_MDL;
1274            }
1275        }
1276        else
1277        {
1278            rsp_code = MCA_RSP_BAD_MDL;
1279        }
1280    }
1281    else
1282    {
1283        rsp_code = MCA_RSP_BAD_MDL;
1284    }
1285
1286    if (MCA_ReconnectMdlRsp((tMCA_CL) p_mcb->mcl_handle,
1287                            p_dcb->local_mdep_id,
1288                            p_dcb->mdl_id,
1289                            rsp_code,
1290                            &p_dcb->chnl_cfg)!= MCA_SUCCESS)
1291    {
1292        MCA_Abort((tMCA_CL) p_mcb->mcl_handle);
1293        bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_CMPL_EVT, p_data);
1294    }
1295}
1296
1297/*******************************************************************************
1298**
1299** Function         bta_hl_dch_mca_reconnect_cfm
1300**
1301** Description      Action routine for processing the reconenct confirmation
1302**
1303** Returns          void
1304**
1305*******************************************************************************/
1306void bta_hl_dch_mca_reconnect_cfm(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx,
1307                                  tBTA_HL_DATA *p_data)
1308{
1309    tBTA_HL_MCL_CB      *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
1310    tBTA_HL_MDL_CB      *p_dcb  = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
1311    tMCA_RSP_EVT        *p_reconnect_cfm = &p_data->mca_evt.mca_data.reconnect_cfm;
1312
1313
1314#if (BTA_HL_DEBUG == TRUE)
1315    APPL_TRACE_DEBUG("bta_hl_dch_mca_reconnect_cfm");
1316#endif
1317    if (p_dcb->abort_oper & BTA_HL_ABORT_PENDING_MASK)
1318    {
1319        p_dcb->abort_oper &= ~BTA_HL_ABORT_PENDING_MASK;
1320        bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_ABORT_EVT, p_data);
1321        return;
1322    }
1323
1324
1325    if (p_dcb->dch_oper == BTA_HL_DCH_OP_LOCAL_RECONNECT)
1326    {
1327        if (p_reconnect_cfm->rsp_code == MCA_RSP_SUCCESS)
1328        {
1329
1330            bta_hl_set_dch_chan_cfg(app_idx, mcl_idx, mdl_idx, p_data);
1331
1332            if (MCA_DataChnlCfg((tMCA_CL) p_mcb->mcl_handle, &p_dcb->chnl_cfg)!= MCA_SUCCESS)
1333            {
1334                /* should be able to abort so no checking of the return code */
1335                MCA_Abort((tMCA_CL) p_mcb->mcl_handle);
1336                bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_CMPL_EVT, p_data);
1337            }
1338        }
1339        else
1340        {
1341            bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_CMPL_EVT, p_data);
1342        }
1343    }
1344}
1345
1346/*******************************************************************************
1347**
1348** Function         bta_hl_dch_mca_reconnect
1349**
1350** Description      Action routine for processing the reconnect request
1351**
1352** Returns          void
1353**
1354*******************************************************************************/
1355void bta_hl_dch_mca_reconnect(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx,
1356                              tBTA_HL_DATA *p_data)
1357{
1358    tBTA_HL_MCL_CB      *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
1359    tBTA_HL_MDL_CB      *p_dcb  = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
1360    tMCA_CHNL_CFG       *p_chnl_cfg=NULL;
1361    UINT8               sdp_idx;
1362
1363#if (BTA_HL_DEBUG == TRUE)
1364    APPL_TRACE_DEBUG("bta_hl_dch_mca_reconnect");
1365#endif
1366    if (bta_hl_find_sdp_idx_using_ctrl_psm(&p_mcb->sdp, p_mcb->ctrl_psm, &sdp_idx))
1367    {
1368        p_mcb->data_psm = p_mcb->sdp.sdp_rec[sdp_idx].data_psm;
1369        if ( MCA_ReconnectMdl((tMCA_CL) p_mcb->mcl_handle,
1370                              p_dcb->local_mdep_id,
1371                              p_mcb->data_psm,
1372                              p_dcb->mdl_id,
1373                              p_chnl_cfg ) != MCA_SUCCESS)
1374        {
1375            bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_CMPL_EVT, p_data);
1376        }
1377    }
1378    else
1379    {
1380        bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_CMPL_EVT, p_data);
1381    }
1382}
1383
1384
1385/*******************************************************************************
1386**
1387** Function         bta_hl_dch_create_rsp
1388**
1389** Description      Action routine for processing BTA_HL_API_DCH_CREATE_RSP_EVT
1390**
1391** Returns          void
1392**
1393*******************************************************************************/
1394void bta_hl_dch_create_rsp(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx,
1395                           tBTA_HL_DATA *p_data)
1396{
1397    tBTA_HL_MCL_CB              *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
1398    tBTA_HL_MDL_CB              *p_dcb  = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
1399    tBTA_HL_API_DCH_CREATE_RSP  *p_create_rsp = &p_data->api_dch_create_rsp;
1400    UINT8                       mca_rsp_code = MCA_RSP_SUCCESS;
1401
1402#if (BTA_HL_DEBUG == TRUE)
1403    APPL_TRACE_DEBUG("bta_hl_dch_create_rsp");
1404#endif
1405    if (p_create_rsp->rsp_code == BTA_HL_DCH_CREATE_RSP_SUCCESS)
1406    {
1407        p_dcb->dch_oper             = BTA_HL_DCH_OP_REMOTE_OPEN;
1408        p_dcb->local_cfg            = p_create_rsp->cfg_rsp;
1409
1410
1411
1412        bta_hl_set_dch_chan_cfg(app_idx, mcl_idx, mdl_idx, p_data);
1413    }
1414    else
1415    {
1416        mca_rsp_code = MCA_RSP_CFG_REJ;
1417    }
1418
1419    if (MCA_CreateMdlRsp((tMCA_CL) p_mcb->mcl_handle,
1420                         p_dcb->local_mdep_id,
1421                         p_dcb->mdl_id,
1422                         p_dcb->local_cfg,
1423                         mca_rsp_code,
1424                         &p_dcb->chnl_cfg)!= MCA_SUCCESS)
1425    {
1426        bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_CMPL_EVT, p_data);
1427    }
1428}
1429
1430/*******************************************************************************
1431**
1432** Function         bta_hl_dch_mca_create_ind
1433**
1434** Description      Action routine for processing
1435**
1436** Returns          void
1437**
1438*******************************************************************************/
1439void bta_hl_dch_mca_create_ind(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx,
1440                               tBTA_HL_DATA *p_data)
1441{
1442    tBTA_HL_APP_CB      *p_acb  = BTA_HL_GET_APP_CB_PTR(app_idx);
1443    tBTA_HL_MCL_CB      *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
1444    tBTA_HL_MDL_CB      *p_dcb  = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
1445    tMCA_CREATE_IND     *p_create_ind = &p_data->mca_evt.mca_data.create_ind;
1446    UINT8               mdep_cfg_idx;
1447    UINT8               cfg_rsp;
1448    UINT8               rsp_code = MCA_RSP_SUCCESS;
1449    BOOLEAN             send_create_ind_evt = FALSE;
1450    tBTA_HL             evt_data;
1451    tBTA_HL_ECHO_CFG    *p_echo_cfg;
1452
1453#if (BTA_HL_DEBUG == TRUE)
1454    APPL_TRACE_DEBUG("bta_hl_dch_mca_create_ind");
1455#endif
1456
1457    if (bta_hl_find_mdep_cfg_idx(app_idx, p_create_ind->dep_id, &mdep_cfg_idx))
1458    {
1459        if (p_create_ind->dep_id == BTA_HL_ECHO_TEST_MDEP_ID )
1460        {
1461            if (bta_hl_find_echo_cfg_rsp(app_idx, mcl_idx, mdep_cfg_idx,p_create_ind->cfg, &cfg_rsp ))
1462            {
1463                p_dcb->in_use               = TRUE;
1464                p_dcb->dch_oper             = BTA_HL_DCH_OP_REMOTE_OPEN;
1465                p_dcb->local_mdep_id        = p_create_ind->dep_id  ;
1466                p_dcb->local_mdep_cfg_idx   = mdep_cfg_idx;
1467                p_dcb->local_cfg            = cfg_rsp;
1468                p_dcb->remote_cfg           = p_create_ind->cfg ;
1469                p_dcb->mdl_id               = p_create_ind->mdl_id;
1470                p_dcb->mdl_cfg_idx_included = FALSE;
1471                p_echo_cfg                      = BTA_HL_GET_ECHO_CFG_PTR(app_idx);
1472                p_dcb->max_rx_apdu_size         = p_echo_cfg->max_rx_apdu_size;
1473                p_dcb->max_tx_apdu_size         = p_echo_cfg->max_tx_apdu_size;
1474
1475                bta_hl_set_dch_chan_cfg(app_idx, mcl_idx, mdl_idx, p_data);
1476            }
1477            else
1478            {
1479                rsp_code = MCA_RSP_CFG_REJ;
1480            }
1481        }
1482        else
1483
1484        {
1485            p_dcb->in_use               = TRUE;
1486            p_dcb->dch_oper             = BTA_HL_DCH_OP_REMOTE_CREATE;
1487            p_dcb->local_mdep_id        = p_create_ind->dep_id  ;
1488            p_dcb->local_mdep_cfg_idx   = mdep_cfg_idx;
1489            p_dcb->local_cfg            = BTA_HL_DCH_CFG_UNKNOWN;
1490            p_dcb->remote_cfg           = p_create_ind->cfg;
1491            p_dcb->mdl_id               = p_create_ind->mdl_id;
1492            p_dcb->mdl_cfg_idx_included = FALSE;
1493            bta_hl_find_rxtx_apdu_size(app_idx, mdep_cfg_idx,
1494                                       &p_dcb->max_rx_apdu_size,
1495                                       &p_dcb->max_tx_apdu_size);
1496            send_create_ind_evt = TRUE;
1497        }
1498    }
1499    else
1500    {
1501        rsp_code = MCA_RSP_BAD_MDEP;
1502    }
1503
1504    if (send_create_ind_evt)
1505    {
1506        evt_data.dch_create_ind.mcl_handle =  p_mcb->mcl_handle;
1507        evt_data.dch_create_ind.app_handle =  p_acb->app_handle;
1508        evt_data.dch_create_ind.local_mdep_id = p_dcb->local_mdep_id;
1509        evt_data.dch_create_ind.mdl_id = p_dcb->mdl_id;
1510        evt_data.dch_create_ind.cfg = p_dcb->remote_cfg;
1511        bdcpy(evt_data.dch_create_ind.bd_addr, p_mcb->bd_addr);
1512        p_acb->p_cback(BTA_HL_DCH_CREATE_IND_EVT,(tBTA_HL *) &evt_data );
1513    }
1514    else
1515    {
1516        if (MCA_CreateMdlRsp((tMCA_CL) p_mcb->mcl_handle,
1517                             p_dcb->local_mdep_id,
1518                             p_dcb->mdl_id,
1519                             p_dcb->local_cfg,
1520                             rsp_code,
1521                             &p_dcb->chnl_cfg)!= MCA_SUCCESS)
1522        {
1523            bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_CMPL_EVT, p_data);
1524        }
1525        else
1526        {
1527            if (p_dcb->local_mdep_id == BTA_HL_ECHO_TEST_MDEP_ID)
1528            {
1529                p_mcb->echo_test = TRUE;
1530                p_dcb->echo_oper = BTA_HL_ECHO_OP_OPEN_IND;
1531            }
1532        }
1533    }
1534}
1535
1536/*******************************************************************************
1537**
1538** Function         bta_hl_dch_mca_create_cfm
1539**
1540** Description      Action routine for processing
1541**
1542** Returns          void
1543**
1544*******************************************************************************/
1545void bta_hl_dch_mca_create_cfm(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx,
1546                               tBTA_HL_DATA *p_data)
1547{
1548    tBTA_HL_MCL_CB      *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
1549    tBTA_HL_MDL_CB      *p_dcb  = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
1550    tMCA_CREATE_CFM     *p_create_cfm = &p_data->mca_evt.mca_data.create_cfm;
1551
1552#if (BTA_HL_DEBUG == TRUE)
1553    APPL_TRACE_DEBUG("bta_hl_dch_mca_create_cfm");
1554#endif
1555
1556    if (p_dcb->abort_oper & BTA_HL_ABORT_PENDING_MASK)
1557    {
1558        p_dcb->abort_oper &= ~BTA_HL_ABORT_PENDING_MASK;
1559        bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_ABORT_EVT, p_data);
1560        return;
1561    }
1562
1563    if (p_dcb->dch_oper == BTA_HL_DCH_OP_LOCAL_OPEN)
1564    {
1565        if (p_create_cfm->rsp_code == MCA_RSP_SUCCESS)
1566        {
1567            if (bta_hl_validate_cfg(app_idx, mcl_idx, mdl_idx, p_create_cfm->cfg ))
1568            {
1569                bta_hl_set_dch_chan_cfg(app_idx, mcl_idx, mdl_idx, p_data);
1570
1571                if (MCA_DataChnlCfg((tMCA_CL) p_mcb->mcl_handle, &p_dcb->chnl_cfg)!= MCA_SUCCESS)
1572                {
1573                    /* this should not happen */
1574                    APPL_TRACE_ERROR("Unable to create data channel");
1575                    MCA_Abort((tMCA_CL) p_mcb->mcl_handle);
1576                    bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_CMPL_EVT, p_data);
1577                }
1578                else
1579                {
1580                    if (p_dcb->local_mdep_id == BTA_HL_ECHO_TEST_MDEP_ID)
1581                    {
1582                        p_dcb->echo_oper = BTA_HL_ECHO_OP_DCH_OPEN_CFM;
1583                    }
1584                }
1585            }
1586            else
1587            {
1588                MCA_Abort((tMCA_CL) p_mcb->mcl_handle);
1589                bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_CMPL_EVT, p_data);
1590            }
1591        }
1592        else
1593        {
1594            APPL_TRACE_ERROR("MCA Create- failed");
1595            bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_CMPL_EVT, p_data);
1596        }
1597    }
1598}
1599
1600/*******************************************************************************
1601**
1602** Function         bta_hl_dch_mca_create
1603**
1604** Description      Action routine for processing the MDL create request
1605**
1606** Returns          void
1607**
1608*******************************************************************************/
1609void bta_hl_dch_mca_create(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx,
1610                           tBTA_HL_DATA *p_data)
1611{
1612    tBTA_HL_MCL_CB      *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
1613    tBTA_HL_MDL_CB      *p_dcb  = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
1614    tMCA_RESULT         result;
1615    UINT8               sdp_idx;
1616
1617#if BTA_HL_DEBUG == TRUE
1618    APPL_TRACE_DEBUG("bta_hl_dch_mca_create");
1619#endif
1620
1621    if (bta_hl_find_sdp_idx_using_ctrl_psm(&p_mcb->sdp, p_mcb->ctrl_psm, &sdp_idx) &&
1622        bta_hl_validate_peer_cfg(app_idx, mcl_idx, mdl_idx,
1623                                 p_dcb->peer_mdep_id,
1624                                 p_dcb->peer_mdep_role,
1625                                 sdp_idx))
1626    {
1627
1628        p_mcb->data_psm = p_mcb->sdp.sdp_rec[sdp_idx].data_psm;
1629        if ( (result = MCA_CreateMdl((tMCA_CL) p_mcb->mcl_handle,
1630                                     p_dcb->local_mdep_id,
1631                                     p_mcb->data_psm,
1632                                     p_dcb->mdl_id,
1633                                     p_dcb->peer_mdep_id,
1634                                     p_dcb->local_cfg,
1635                                     NULL )) != MCA_SUCCESS)
1636        {
1637            APPL_TRACE_ERROR("MCA_CreateMdl FAIL mca_result=%d", result);
1638            bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_CMPL_EVT, p_data);
1639        }
1640    }
1641    else
1642    {
1643        APPL_TRACE_ERROR("MCA Create- SDP idx or peer MDEP cfg not found");
1644        bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_CMPL_EVT, p_data);
1645    }
1646}
1647
1648/*******************************************************************************
1649**
1650** Function         bta_hl_dch_sdp_fail
1651**
1652** Description      Action routine for processing the SDP failed event
1653**
1654** Returns          void
1655**
1656*******************************************************************************/
1657void bta_hl_dch_sdp_fail(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx,
1658                         tBTA_HL_DATA *p_data)
1659{
1660
1661#if (BTA_HL_DEBUG == TRUE)
1662    APPL_TRACE_DEBUG("bta_hl_dch_sdp_fail");
1663#endif
1664    bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_CMPL_EVT, p_data);
1665}
1666
1667/******************************************************************************
1668**
1669** Function         bta_hl_sdp_cback
1670**
1671** Description      This is the SDP callback function used by HL.
1672**                  This function will be executed by SDP when the service
1673**                  search is completed.  If the search is successful, it
1674**                  finds the first record in the database that matches the
1675**                  UUID of the search.  Then retrieves the scn from the
1676**                  record.
1677**
1678** Returns          void.
1679**
1680******************************************************************************/
1681static void bta_hl_sdp_cback(UINT8 sdp_oper, UINT8 app_idx, UINT8 mcl_idx,
1682                             UINT8 mdl_idx, UINT16 status)
1683{
1684    tBTA_HL_MCL_CB                  *p_cb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
1685    tBTA_HL_SDP_REC                 *p_hdp_rec;
1686    tBTA_HL_CCH_SDP                 *p_cch_buf;
1687    tBTA_HL_DCH_SDP                 *p_dch_buf;
1688    tSDP_DISC_REC                   *p_rec = NULL;
1689    tSDP_PROTOCOL_ELEM              pe;
1690    tSDP_DISC_ATTR                  *p_attr;
1691    UINT8                           i, rec_cnt;
1692    tBTA_HL_SUP_FEATURE_LIST_ELEM   sup_feature;
1693    BOOLEAN                         sdp_parsing_ok =FALSE, result=FALSE;
1694    UINT16                          event;
1695    tBTA_HL_MDL_CB                  *p_dcb;
1696    UINT16                          service_uuid;
1697    UINT16                          name_len;
1698
1699#if BTA_HL_DEBUG == TRUE
1700    APPL_TRACE_DEBUG("bta_hl_sdp_cback status:%d sdp_oper=%d app_idx=%d, mcl_idx=%d,   mdl_idx=%d",
1701                      status, sdp_oper, app_idx, mcl_idx, mdl_idx);
1702#endif
1703
1704    rec_cnt = 0;
1705    service_uuid = bta_hl_get_service_uuids(sdp_oper, app_idx, mcl_idx, mdl_idx);
1706
1707    if (status == SDP_SUCCESS || status == SDP_DB_FULL)
1708    {
1709        memset(&p_cb->sdp,0, sizeof(tBTA_HL_SDP));
1710        do
1711        {
1712            if (bta_hl_find_service_in_db(app_idx, mcl_idx, service_uuid, &p_rec))
1713            {
1714                p_hdp_rec = &p_cb->sdp.sdp_rec[rec_cnt];
1715                p_cb->sdp.num_recs = rec_cnt+1;
1716            }
1717            else
1718            {
1719                break;
1720            }
1721
1722            if (SDP_FindProtocolListElemInRec(p_rec, UUID_PROTOCOL_L2CAP, &pe))
1723            {
1724                p_hdp_rec->ctrl_psm  = (UINT16) pe.params[0];
1725            }
1726            else
1727            {
1728                APPL_TRACE_WARNING("Control PSM not found");
1729                break;
1730            }
1731            if (SDP_FindAddProtoListsElemInRec(p_rec, UUID_PROTOCOL_L2CAP, &pe))
1732            {
1733                p_hdp_rec->data_psm = (UINT16) pe.params[0];
1734            }
1735            else
1736            {
1737                APPL_TRACE_WARNING("Data PSM not found");
1738                break;
1739            }
1740
1741            p_hdp_rec->srv_name[0]= '\0';
1742            if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_NAME)) != NULL)
1743            {
1744                if (SDP_DISC_ATTR_LEN(p_attr->attr_len_type) < BT_MAX_SERVICE_NAME_LEN)
1745                    name_len = (UINT16)SDP_DISC_ATTR_LEN(p_attr->attr_len_type);
1746                else
1747                    name_len = BT_MAX_SERVICE_NAME_LEN;
1748                memcpy(p_hdp_rec->srv_name, p_attr->attr_value.v.array, name_len);
1749            }
1750
1751            p_hdp_rec->srv_desp[0]= '\0';
1752            if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_DESCRIPTION)) != NULL)
1753            {
1754                if (SDP_DISC_ATTR_LEN(p_attr->attr_len_type) < BT_MAX_SERVICE_NAME_LEN)
1755                    name_len = (UINT16)SDP_DISC_ATTR_LEN(p_attr->attr_len_type);
1756                else
1757                    name_len = BT_MAX_SERVICE_NAME_LEN;
1758                memcpy(p_hdp_rec->srv_desp, p_attr->attr_value.v.array, name_len);
1759            }
1760
1761
1762            p_hdp_rec->provider_name[0]= '\0';
1763            if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_PROVIDER_NAME)) != NULL)
1764            {
1765                if (SDP_DISC_ATTR_LEN(p_attr->attr_len_type) < BT_MAX_SERVICE_NAME_LEN)
1766                    name_len = (UINT16)SDP_DISC_ATTR_LEN(p_attr->attr_len_type);
1767                else
1768                    name_len = BT_MAX_SERVICE_NAME_LEN;
1769                memcpy(p_hdp_rec->provider_name, p_attr->attr_value.v.array, name_len);
1770            }
1771
1772            if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_HDP_MCAP_SUP_PROC))!=NULL)
1773            {
1774                p_hdp_rec->mcap_sup_proc = p_attr->attr_value.v.u8;
1775            }
1776            else
1777            {
1778                APPL_TRACE_WARNING("MCAP SUP PROC not found");
1779                break;
1780            }
1781
1782            if ((p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_HDP_SUP_FEAT_LIST ))!=NULL)
1783            {
1784                if (bta_hl_fill_sup_feature_list (p_attr, &sup_feature))
1785                {
1786                    p_hdp_rec->num_mdeps = (UINT8) sup_feature.num_elems;
1787                    APPL_TRACE_WARNING("bta_hl_sdp_cback num_mdeps %d",sup_feature.num_elems);
1788                    for (i=0; i<sup_feature.num_elems; i++)
1789                    {
1790                        p_hdp_rec->mdep_cfg[i].data_type = sup_feature.list_elem[i].data_type;
1791                        p_hdp_rec->mdep_cfg[i].mdep_id = sup_feature.list_elem[i].mdep_id;
1792                        p_hdp_rec->mdep_cfg[i].mdep_role = sup_feature.list_elem[i].mdep_role;
1793                        /* Check MDEP Description pointer to prevent crash due to null pointer */
1794                        if (sup_feature.list_elem[i].p_mdep_desp != NULL)
1795                        {
1796                            BCM_STRNCPY_S(p_hdp_rec->mdep_cfg[i].mdep_desp,
1797                                    sizeof(p_hdp_rec->mdep_cfg[i].mdep_desp),
1798                                    sup_feature.list_elem[i].p_mdep_desp,
1799                                    BTA_HL_MDEP_DESP_LEN);
1800                        }
1801                        else
1802                        {
1803                            APPL_TRACE_ERROR("bta_hl_sdp_cback Incorrect Mdep[%d] Description (Null ptr)", i);
1804                        }
1805                    }
1806
1807                    sdp_parsing_ok = TRUE;
1808                }
1809                else
1810                {
1811                    APPL_TRACE_WARNING("HDP supported feature list fill failed");
1812                    break;
1813                }
1814            }
1815            else
1816            {
1817                APPL_TRACE_WARNING("HDP supported feature list not found");
1818                break;
1819            }
1820#if BTA_HL_DEBUG == TRUE
1821            APPL_TRACE_DEBUG("record=%d ctrl_psm=%0x data_psm=%x",
1822                              rec_cnt+1,
1823                              p_hdp_rec->ctrl_psm,
1824                              p_hdp_rec->data_psm );
1825            APPL_TRACE_DEBUG("srv_name=[%s]",(p_hdp_rec->srv_name[0] != '\0')? p_hdp_rec->srv_name:"NULL");
1826            APPL_TRACE_DEBUG("srv_desp=[%s]",(p_hdp_rec->srv_desp[0] != '\0')? p_hdp_rec->srv_desp:"NULL");
1827            for (i=0; i<sup_feature.num_elems; i++)
1828            {
1829                APPL_TRACE_DEBUG("index=0x%02x mdep_id=0x%04x data type=0x%04x mdep role=%s(0x%02x)",
1830                                  (i+1),
1831                                  p_hdp_rec->mdep_cfg[i].mdep_id,
1832                                  p_hdp_rec->mdep_cfg[i].data_type,
1833                                  (p_hdp_rec->mdep_cfg[i].mdep_role == BTA_HL_MDEP_ROLE_SOURCE)?"Src":"Snk",
1834                                  p_hdp_rec->mdep_cfg[i].mdep_role);
1835            }
1836            APPL_TRACE_DEBUG("provider_name=[%s]",(p_hdp_rec->provider_name[0] != '\0')? p_hdp_rec->provider_name:"NULL");
1837            APPL_TRACE_DEBUG("found MCAP sup procedure=%d",
1838                              p_cb->sdp.sdp_rec[rec_cnt].mcap_sup_proc );
1839#endif
1840            rec_cnt++;
1841            if (rec_cnt >= BTA_HL_NUM_SDP_RECS)
1842            {
1843                APPL_TRACE_WARNING("No more spaces for SDP recs max_rec_cnt=%d", BTA_HL_NUM_SDP_RECS);
1844                break;
1845            }
1846
1847
1848        } while (TRUE);
1849    }
1850
1851
1852    utl_freebuf((void **)&p_cb->p_db);
1853
1854    if ( (status == SDP_SUCCESS || status == SDP_DB_FULL) &&
1855         p_cb->sdp.num_recs  &&
1856         sdp_parsing_ok)
1857    {
1858        result = TRUE;
1859    }
1860    else
1861    {
1862        APPL_TRACE_WARNING("SDP Failed sdp_status=%d num_recs=%d sdp_parsing_ok=%d ",
1863                            status, p_cb->sdp.num_recs,sdp_parsing_ok );
1864    }
1865
1866
1867    p_cb->sdp_oper = BTA_HL_SDP_OP_NONE;
1868
1869    switch (sdp_oper )
1870    {
1871        case BTA_HL_SDP_OP_CCH_INIT:
1872        case BTA_HL_SDP_OP_SDP_QUERY_NEW:
1873        case BTA_HL_SDP_OP_SDP_QUERY_CURRENT:
1874
1875            /* send result in event back to BTA */
1876            if ((p_cch_buf = (tBTA_HL_CCH_SDP *) GKI_getbuf(sizeof(tBTA_HL_CCH_SDP))) != NULL)
1877            {
1878                if (result)
1879                {
1880                    if (sdp_oper == BTA_HL_SDP_OP_CCH_INIT)
1881                    {
1882                        event = BTA_HL_CCH_SDP_OK_EVT;
1883                        if (p_cb->close_pending)
1884                        {
1885                            event = BTA_HL_CCH_SDP_FAIL_EVT;
1886                        }
1887                    }
1888                    else
1889                    {
1890                        event = BTA_HL_SDP_QUERY_OK_EVT;
1891                    }
1892                }
1893                else
1894                {
1895                    if (sdp_oper == BTA_HL_SDP_OP_CCH_INIT)
1896                    {
1897                        event = BTA_HL_CCH_SDP_FAIL_EVT;
1898                    }
1899                    else
1900                    {
1901                        event = BTA_HL_SDP_QUERY_FAIL_EVT;
1902                    }
1903                }
1904                p_cch_buf->hdr.event = event;
1905
1906                p_cch_buf->app_idx = app_idx;
1907                p_cch_buf->mcl_idx = mcl_idx;
1908                p_cch_buf->release_mcl_cb = FALSE;
1909                if (sdp_oper == BTA_HL_SDP_OP_SDP_QUERY_NEW)
1910                {
1911                    p_cch_buf->release_mcl_cb = TRUE;
1912                }
1913
1914                bta_sys_sendmsg(p_cch_buf);
1915            }
1916            break;
1917        case BTA_HL_SDP_OP_DCH_OPEN_INIT:
1918        case BTA_HL_SDP_OP_DCH_RECONNECT_INIT:
1919            if ((p_dch_buf = (tBTA_HL_DCH_SDP *) GKI_getbuf(sizeof(tBTA_HL_DCH_SDP))) != NULL)
1920            {
1921                p_dch_buf->hdr.event = BTA_HL_DCH_SDP_FAIL_EVT;
1922                p_dch_buf->app_idx = app_idx;
1923                p_dch_buf->mcl_idx = mcl_idx;
1924                p_dch_buf->mdl_idx = mdl_idx;
1925                p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
1926                if (p_dcb->abort_oper & BTA_HL_ABORT_PENDING_MASK)
1927                {
1928                    p_dcb->abort_oper &= ~BTA_HL_ABORT_PENDING_MASK;
1929                    result = FALSE;
1930                }
1931                if (result)
1932                {
1933                    if (sdp_oper == BTA_HL_SDP_OP_DCH_OPEN_INIT)
1934                    {
1935                        if (p_dcb->local_mdep_id == BTA_HL_ECHO_TEST_MDEP_ID )
1936                        {
1937                            p_dch_buf->hdr.event = BTA_HL_DCH_ECHO_TEST_EVT;
1938                        }
1939                        else
1940                        {
1941                            p_dch_buf->hdr.event = BTA_HL_DCH_OPEN_EVT;
1942                        }
1943                    }
1944                    else
1945                    {
1946                        p_dch_buf->hdr.event = BTA_HL_DCH_RECONNECT_EVT;
1947                    }
1948                }
1949                bta_sys_sendmsg(p_dch_buf);
1950            }
1951            break;
1952        default:
1953            break;
1954    }
1955}
1956
1957
1958/******************************************************************************
1959**
1960** Function         bta_hl_sdp_cback0
1961**
1962** Description      This is the SDP callback function used by index = 0
1963**
1964** Returns          void.
1965**
1966******************************************************************************/
1967static void bta_hl_sdp_cback0(UINT16 status)
1968{
1969    bta_hl_sdp_cback(bta_hl_cb.scb[0].sdp_oper,
1970                     bta_hl_cb.scb[0].app_idx,
1971                     bta_hl_cb.scb[0].mcl_idx,
1972                     bta_hl_cb.scb[0].mdl_idx,
1973                     status);
1974    bta_hl_deallocate_spd_cback(0);
1975}
1976
1977/******************************************************************************
1978**
1979** Function         bta_hl_sdp_cback1
1980**
1981** Description      This is the SDP callback function used by index = 1
1982**
1983** Parameters       status  - status of the SDP callabck
1984**
1985** Returns          void.
1986**
1987******************************************************************************/
1988static void bta_hl_sdp_cback1(UINT16 status)
1989{
1990    bta_hl_sdp_cback(bta_hl_cb.scb[1].sdp_oper,
1991                     bta_hl_cb.scb[1].app_idx,
1992                     bta_hl_cb.scb[1].mcl_idx,
1993                     bta_hl_cb.scb[1].mdl_idx,
1994                     status);
1995    bta_hl_deallocate_spd_cback(1);
1996}
1997
1998/******************************************************************************
1999**
2000** Function         bta_hl_sdp_cback2
2001**
2002** Description      This is the SDP callback function used by index = 2
2003**
2004** Returns          void.
2005**
2006******************************************************************************/
2007static void bta_hl_sdp_cback2(UINT16 status)
2008{
2009    bta_hl_sdp_cback(bta_hl_cb.scb[2].sdp_oper,
2010                     bta_hl_cb.scb[2].app_idx,
2011                     bta_hl_cb.scb[2].mcl_idx,
2012                     bta_hl_cb.scb[2].mdl_idx,
2013                     status);
2014    bta_hl_deallocate_spd_cback(2);
2015}
2016
2017/******************************************************************************
2018**
2019** Function         bta_hl_sdp_cback3
2020**
2021** Description      This is the SDP callback function used by index = 3
2022**
2023** Returns          void.
2024**
2025******************************************************************************/
2026static void bta_hl_sdp_cback3(UINT16 status)
2027{
2028    bta_hl_sdp_cback(bta_hl_cb.scb[3].sdp_oper,
2029                     bta_hl_cb.scb[3].app_idx,
2030                     bta_hl_cb.scb[3].mcl_idx,
2031                     bta_hl_cb.scb[3].mdl_idx,
2032                     status);
2033    bta_hl_deallocate_spd_cback(3);
2034}
2035
2036/******************************************************************************
2037**
2038** Function         bta_hl_sdp_cback4
2039**
2040** Description      This is the SDP callback function used by index = 4
2041**
2042** Parameters       status  - status of the SDP callabck
2043**
2044** Returns          void.
2045**
2046******************************************************************************/
2047static void bta_hl_sdp_cback4(UINT16 status)
2048{
2049    bta_hl_sdp_cback(bta_hl_cb.scb[4].sdp_oper,
2050                     bta_hl_cb.scb[4].app_idx,
2051                     bta_hl_cb.scb[4].mcl_idx,
2052                     bta_hl_cb.scb[4].mdl_idx,
2053                     status);
2054    bta_hl_deallocate_spd_cback(4);
2055}
2056
2057/******************************************************************************
2058**
2059** Function         bta_hl_sdp_cback5
2060**
2061** Description      This is the SDP callback function used by index = 5
2062**
2063** Parameters       status  - status of the SDP callabck
2064**
2065** Returns          void.
2066**
2067******************************************************************************/
2068static void bta_hl_sdp_cback5(UINT16 status)
2069{
2070    bta_hl_sdp_cback(bta_hl_cb.scb[5].sdp_oper,
2071                     bta_hl_cb.scb[5].app_idx,
2072                     bta_hl_cb.scb[5].mcl_idx,
2073                     bta_hl_cb.scb[5].mdl_idx,
2074                     status);
2075    bta_hl_deallocate_spd_cback(5);
2076}
2077
2078/******************************************************************************
2079**
2080** Function         bta_hl_sdp_cback6
2081**
2082** Description      This is the SDP callback function used by index = 6
2083**
2084** Returns          void.
2085**
2086******************************************************************************/
2087static void bta_hl_sdp_cback6(UINT16 status)
2088{
2089    bta_hl_sdp_cback(bta_hl_cb.scb[6].sdp_oper,
2090                     bta_hl_cb.scb[6].app_idx,
2091                     bta_hl_cb.scb[6].mcl_idx,
2092                     bta_hl_cb.scb[6].mdl_idx,
2093                     status);
2094    bta_hl_deallocate_spd_cback(6);
2095}
2096
2097
2098/*******************************************************************************
2099**
2100** Function      bta_hl_deallocate_spd_cback
2101**
2102** Description   Deallocate a SDP control block
2103**
2104** Returns      BOOLEAN - TRUE found
2105**                        FALSE not found
2106**
2107*******************************************************************************/
2108void bta_hl_deallocate_spd_cback(UINT8 sdp_cback_idx)
2109{
2110    tBTA_HL_SDP_CB *p_spd_cb = &bta_hl_cb.scb[sdp_cback_idx];
2111
2112    memset(p_spd_cb, 0, sizeof(tBTA_HL_SDP_CB));
2113
2114#if BTA_HL_DEBUG == TRUE
2115    APPL_TRACE_DEBUG("bta_hl_deallocate_spd_cback index=%d", sdp_cback_idx);
2116#endif
2117
2118
2119}
2120
2121/*******************************************************************************
2122**
2123** Function      bta_hl_allocate_spd_cback
2124**
2125** Description   Finds a not in used SDP control block index
2126**
2127**
2128** Returns      BOOLEAN - TRUE found
2129**                        FALSE not found
2130**
2131*******************************************************************************/
2132tSDP_DISC_CMPL_CB *bta_hl_allocate_spd_cback(tBTA_HL_SDP_OPER sdp_oper, UINT8 app_idx, UINT8 mcl_idx,
2133                                             UINT8 mdl_idx,
2134                                             UINT8 *p_sdp_cback_idx)
2135{
2136    UINT8 i;
2137    tSDP_DISC_CMPL_CB *p_cbcak=NULL;
2138
2139
2140    for (i=0; i < BTA_HL_NUM_SDP_CBACKS ; i ++)
2141    {
2142        if (!bta_hl_cb.scb[i].in_use)
2143        {
2144            p_cbcak = bta_hl_sdp_cback_arr[i];
2145            bta_hl_cb.scb[i].in_use = TRUE;
2146            bta_hl_cb.scb[i].sdp_oper = sdp_oper;
2147            bta_hl_cb.scb[i].app_idx = app_idx;
2148            bta_hl_cb.scb[i].mcl_idx = mcl_idx;
2149            bta_hl_cb.scb[i].mdl_idx = mdl_idx;
2150            *p_sdp_cback_idx = i;
2151            break;
2152        }
2153    }
2154
2155    if (i == BTA_HL_NUM_SDP_CBACKS)
2156    {
2157        APPL_TRACE_WARNING("No scb is available to allocate")
2158    }
2159    else
2160    {
2161#if BTA_HL_DEBUG == TRUE
2162    APPL_TRACE_DEBUG("bta_hl_allocate_spd_cback cback_idx=%d ",i );
2163    APPL_TRACE_DEBUG("sdp_oper=%d, app_idx=%d, mcl_idx=%d,  mdl_idx=%d",
2164                      bta_hl_cb.scb[i].sdp_oper,
2165                      bta_hl_cb.scb[i].app_idx,
2166                      bta_hl_cb.scb[i].mcl_idx,
2167                      bta_hl_cb.scb[i].mdl_idx );
2168#endif
2169    }
2170    return p_cbcak;
2171}
2172
2173
2174/*******************************************************************************
2175**
2176** Function         bta_hl_init_sdp
2177**
2178** Description      Action routine for processing the SDP initiattion request
2179**
2180** Returns          void
2181**
2182*******************************************************************************/
2183tBTA_HL_STATUS bta_hl_init_sdp(tBTA_HL_SDP_OPER sdp_oper, UINT8 app_idx, UINT8 mcl_idx,
2184                               UINT8 mdl_idx)
2185{
2186    tBTA_HL_MCL_CB      *p_cb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
2187    tSDP_UUID           uuid_list;
2188    UINT16              attr_list[BTA_HL_NUM_SRCH_ATTR];
2189    UINT16              num_attrs = BTA_HL_NUM_SRCH_ATTR;
2190    tBTA_HL_STATUS      status;
2191    UINT8               sdp_cback_idx;
2192#if BTA_HL_DEBUG == TRUE
2193    APPL_TRACE_DEBUG("bta_hl_init_sdp sdp_oper=%d app_idx=%d mcl_idx=%d, mdl_idx=%d",
2194                      sdp_oper, app_idx, mcl_idx, mdl_idx);
2195#endif
2196    if ((p_cb->sdp_cback = bta_hl_allocate_spd_cback(sdp_oper, app_idx, mcl_idx, mdl_idx, &sdp_cback_idx)) != NULL)
2197    {
2198        if ( p_cb->p_db ||
2199             (!p_cb->p_db &&
2200              (p_cb->p_db = (tSDP_DISCOVERY_DB *) GKI_getbuf(BTA_HL_DISC_SIZE)) != NULL))
2201        {
2202            attr_list[0] = ATTR_ID_SERVICE_CLASS_ID_LIST;
2203            attr_list[1] = ATTR_ID_PROTOCOL_DESC_LIST;
2204            attr_list[2] = ATTR_ID_BT_PROFILE_DESC_LIST;
2205            attr_list[3] = ATTR_ID_ADDITION_PROTO_DESC_LISTS;
2206            attr_list[4] = ATTR_ID_SERVICE_NAME;
2207            attr_list[5] = ATTR_ID_SERVICE_DESCRIPTION;
2208            attr_list[6] = ATTR_ID_PROVIDER_NAME;
2209            attr_list[7] = ATTR_ID_HDP_SUP_FEAT_LIST;
2210            attr_list[8] = ATTR_ID_HDP_DATA_EXCH_SPEC;
2211            attr_list[9] = ATTR_ID_HDP_MCAP_SUP_PROC;
2212
2213
2214            uuid_list.len = LEN_UUID_16;
2215            uuid_list.uu.uuid16 = UUID_SERVCLASS_HDP_PROFILE;
2216            SDP_InitDiscoveryDb(p_cb->p_db, BTA_HL_DISC_SIZE, 1, &uuid_list, num_attrs, attr_list);
2217
2218            if (!SDP_ServiceSearchAttributeRequest(p_cb->bd_addr, p_cb->p_db, p_cb->sdp_cback))
2219            {
2220                status = BTA_HL_STATUS_FAIL;
2221            }
2222            else
2223            {
2224                status = BTA_HL_STATUS_OK;
2225            }
2226        }
2227        else    /* No services available */
2228        {
2229            status = BTA_HL_STATUS_NO_RESOURCE;
2230        }
2231    }
2232    else
2233    {
2234        status = BTA_HL_STATUS_SDP_NO_RESOURCE;
2235    }
2236
2237    if (status != BTA_HL_STATUS_OK)
2238    {
2239        utl_freebuf((void **)&p_cb->p_db);
2240        if (status != BTA_HL_STATUS_SDP_NO_RESOURCE )
2241        {
2242            bta_hl_deallocate_spd_cback(sdp_cback_idx);
2243        }
2244    }
2245
2246    return status;
2247}
2248
2249/*******************************************************************************
2250**
2251** Function         bta_hl_cch_sdp_init
2252**
2253** Description      Action routine for processing the CCH SDP init event
2254**
2255** Returns          void
2256**
2257*******************************************************************************/
2258void bta_hl_cch_sdp_init(UINT8 app_idx, UINT8 mcl_idx,  tBTA_HL_DATA *p_data)
2259{
2260    tBTA_HL_MCL_CB      *p_cb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
2261#if BTA_HL_DEBUG == TRUE
2262    APPL_TRACE_DEBUG("bta_hl_cch_init_sdp");
2263#endif
2264    if ( p_cb->sdp_oper == BTA_HL_SDP_OP_NONE)
2265    {
2266        p_cb->app_id = p_data->api_cch_open.app_id;
2267        p_cb->sdp_oper = BTA_HL_SDP_OP_CCH_INIT;
2268
2269        if (bta_hl_init_sdp( p_cb->sdp_oper, app_idx, mcl_idx, 0xFF) != BTA_HL_STATUS_OK)
2270        {
2271            p_cb->sdp_oper = BTA_HL_SDP_OP_NONE;
2272            bta_hl_cch_sm_execute(app_idx, mcl_idx, BTA_HL_CCH_SDP_FAIL_EVT, p_data);
2273        }
2274    }
2275    else
2276    {
2277        APPL_TRACE_ERROR("SDP in use");
2278        bta_hl_cch_sm_execute(app_idx, mcl_idx, BTA_HL_CCH_SDP_FAIL_EVT, p_data);
2279    }
2280}
2281
2282/*******************************************************************************
2283**
2284** Function         bta_hl_cch_mca_open
2285**
2286** Description      Action routine for processing the CCH open request
2287**
2288** Returns          void
2289**
2290*******************************************************************************/
2291void bta_hl_cch_mca_open(UINT8 app_idx, UINT8 mcl_idx,  tBTA_HL_DATA *p_data)
2292{
2293    tBTA_HL_APP_CB      *p_acb  = BTA_HL_GET_APP_CB_PTR(app_idx);
2294    tBTA_HL_MCL_CB      *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
2295    UINT8               sdp_idx;
2296
2297#if BTA_HL_DEBUG == TRUE
2298    APPL_TRACE_DEBUG("bta_hl_cch_mca_open");
2299#endif
2300
2301    if (bta_hl_find_sdp_idx_using_ctrl_psm(&p_mcb->sdp, p_mcb->req_ctrl_psm, &sdp_idx))
2302    {
2303        p_mcb->ctrl_psm = p_mcb->sdp.sdp_rec[sdp_idx].ctrl_psm;
2304        p_mcb->data_psm = p_mcb->sdp.sdp_rec[sdp_idx].data_psm;
2305        if ( MCA_ConnectReq((tMCA_HANDLE) p_acb->app_handle,
2306                            p_mcb->bd_addr,
2307                            p_mcb->ctrl_psm ,
2308                            p_mcb->sec_mask) != MCA_SUCCESS)
2309        {
2310
2311            bta_hl_cch_sm_execute(app_idx, mcl_idx, BTA_HL_CCH_CLOSE_CMPL_EVT, p_data);
2312        }
2313    }
2314    else
2315    {
2316        bta_hl_cch_sm_execute(app_idx, mcl_idx, BTA_HL_CCH_CLOSE_CMPL_EVT, p_data);
2317    }
2318}
2319
2320/*******************************************************************************
2321**
2322** Function         bta_hl_cch_mca_close
2323**
2324** Description      Action routine for processing the CCH close request
2325**
2326** Returns          void
2327**
2328*******************************************************************************/
2329void bta_hl_cch_mca_close(UINT8 app_idx, UINT8 mcl_idx,  tBTA_HL_DATA *p_data)
2330{
2331    tBTA_HL_MCL_CB      *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
2332
2333#if BTA_HL_DEBUG == TRUE
2334    APPL_TRACE_DEBUG("bta_hl_cch_mca_close mcl_handle=%d", p_mcb->mcl_handle);
2335#endif
2336    if (p_mcb->sdp_oper != BTA_HL_SDP_OP_CCH_INIT)
2337    {
2338        if(p_mcb->mcl_handle)
2339        {
2340            if ( MCA_DisconnectReq((tMCA_HANDLE) p_mcb->mcl_handle) != MCA_SUCCESS)
2341            {
2342                bta_hl_cch_sm_execute(app_idx, mcl_idx, BTA_HL_CCH_CLOSE_CMPL_EVT, p_data);
2343            }
2344        }
2345        else
2346        {
2347            p_mcb->close_pending = TRUE;
2348            APPL_TRACE_DEBUG("No valid mcl_handle to stop the CCH setup now so wait until CCH is up then close it" );
2349        }
2350    }
2351    else
2352    {
2353        p_mcb->close_pending = TRUE;
2354        APPL_TRACE_DEBUG("can not stop the CCH setup becasue SDP is in progress so wait until it is done" );
2355    }
2356}
2357
2358/*******************************************************************************
2359**
2360** Function         bta_hl_cch_close_cmpl
2361**
2362** Description      Action routine for processing the CCH close complete event
2363**
2364** Returns          void
2365**
2366*******************************************************************************/
2367void bta_hl_cch_close_cmpl(UINT8 app_idx, UINT8 mcl_idx,  tBTA_HL_DATA *p_data)
2368{
2369    tBTA_HL_APP_CB      *p_acb  = BTA_HL_GET_APP_CB_PTR(app_idx);
2370    tBTA_HL_MCL_CB      *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
2371
2372    tBTA_HL             evt_data;
2373    tBTA_HL_EVT         event;
2374    BOOLEAN             send_evt=TRUE;
2375#if BTA_HL_DEBUG == TRUE
2376    APPL_TRACE_DEBUG("bta_hl_cch_close_cmpl");
2377#endif
2378    bta_sys_conn_close(BTA_ID_HL, p_acb->app_id, p_mcb->bd_addr);
2379
2380    if (p_mcb->cch_oper == BTA_HL_CCH_OP_LOCAL_CLOSE && p_mcb->force_close_local_cch_opening)
2381    {
2382       p_mcb->cch_oper = BTA_HL_CCH_OP_LOCAL_OPEN;
2383       APPL_TRACE_DEBUG("change cch_oper from BTA_HL_CCH_OP_LOCAL_CLOSE to BTA_HL_CCH_OP_LOCAL_OPEN");
2384    }
2385
2386    switch (p_mcb->cch_oper)
2387    {
2388        case BTA_HL_CCH_OP_LOCAL_OPEN:
2389            bta_hl_build_cch_open_cfm(&evt_data,p_mcb->app_id,p_acb->app_handle,
2390                                      p_mcb->mcl_handle,
2391                                      p_mcb->bd_addr,
2392                                      BTA_HL_STATUS_FAIL);
2393            event = BTA_HL_CCH_OPEN_CFM_EVT;
2394            break;
2395        case BTA_HL_CCH_OP_LOCAL_CLOSE:
2396            bta_hl_build_cch_close_cfm(&evt_data,  p_acb->app_handle,
2397                                       p_mcb->mcl_handle,
2398                                       BTA_HL_STATUS_OK);
2399            event = BTA_HL_CCH_CLOSE_CFM_EVT;
2400            break;
2401        case BTA_HL_CCH_OP_REMOTE_CLOSE:
2402            bta_hl_build_cch_close_ind(&evt_data,
2403                                       p_acb->app_handle,
2404                                       p_mcb->mcl_handle,
2405                                       p_mcb->intentional_close);
2406            event = BTA_HL_CCH_CLOSE_IND_EVT;
2407            break;
2408        default:
2409            send_evt=FALSE;
2410            break;
2411    }
2412
2413
2414    memset(p_mcb, 0 ,sizeof(tBTA_HL_MCL_CB));
2415
2416    if (send_evt)p_acb->p_cback(event,(tBTA_HL *) &evt_data );
2417
2418    bta_hl_check_deregistration(app_idx, p_data);
2419}
2420
2421/*******************************************************************************
2422**
2423** Function         bta_hl_cch_mca_disconnect
2424**
2425** Description      Action routine for processing the CCH disconnect indication
2426**
2427** Returns          void
2428**
2429*******************************************************************************/
2430void bta_hl_cch_mca_disconnect(UINT8 app_idx, UINT8 mcl_idx,  tBTA_HL_DATA *p_data)
2431{
2432
2433    tBTA_HL_MCL_CB      *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
2434    tBTA_HL_MDL_CB      *p_dcb;
2435    UINT8              i;
2436#if BTA_HL_DEBUG == TRUE
2437    APPL_TRACE_DEBUG("bta_hl_cch_mca_disconnect");
2438#endif
2439
2440    p_mcb->intentional_close = FALSE;
2441    if (p_data->mca_evt.mca_data.disconnect_ind.reason == L2CAP_DISC_OK)
2442    {
2443        p_mcb->intentional_close = TRUE;
2444    }
2445
2446    for (i=0; i< BTA_HL_NUM_MDLS_PER_MCL; i++)
2447    {
2448        p_dcb= BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, i);
2449        if (p_dcb->in_use && (p_dcb->dch_state != BTA_HL_DCH_IDLE_ST))
2450        {
2451            if (p_mcb->cch_oper == BTA_HL_CCH_OP_LOCAL_CLOSE )
2452            {
2453                bta_hl_dch_sm_execute(app_idx, mcl_idx, i, BTA_HL_DCH_CLOSE_CMPL_EVT, p_data);
2454            }
2455            else
2456            {
2457                bta_hl_dch_sm_execute(app_idx, mcl_idx, i, BTA_HL_MCA_CLOSE_IND_EVT, p_data);
2458            }
2459        }
2460    }
2461    bta_hl_cch_sm_execute(app_idx, mcl_idx, BTA_HL_CCH_CLOSE_CMPL_EVT, p_data);
2462}
2463
2464/*******************************************************************************
2465**
2466** Function         bta_hl_cch_mca_disc_open
2467**
2468** Description      Action routine for disconnect the just opened Control channel
2469**
2470** Returns          void
2471**
2472*******************************************************************************/
2473void bta_hl_cch_mca_disc_open(UINT8 app_idx, UINT8 mcl_idx,  tBTA_HL_DATA *p_data)
2474{
2475    tBTA_HL_MCL_CB      *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
2476
2477#if BTA_HL_DEBUG == TRUE
2478    APPL_TRACE_DEBUG("bta_hl_cch_mca_disc_open mcl_handle=0x%x close_pending=%d", p_data->mca_evt.mcl_handle, p_mcb->close_pending );
2479#endif
2480
2481    p_mcb->close_pending = FALSE;
2482    p_mcb->mcl_handle = p_data->mca_evt.mcl_handle;
2483    bta_hl_cch_mca_close(app_idx, mcl_idx, p_data);
2484}
2485
2486/*******************************************************************************
2487**
2488** Function         bta_hl_cch_mca_rsp_tout
2489**
2490** Description      Action routine for processing the MCAP response timeout
2491**
2492** Returns          void
2493**
2494*******************************************************************************/
2495void bta_hl_cch_mca_rsp_tout(UINT8 app_idx, UINT8 mcl_idx,  tBTA_HL_DATA *p_data)
2496{
2497
2498    tBTA_HL_MCL_CB      *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
2499#if BTA_HL_DEBUG == TRUE
2500    APPL_TRACE_DEBUG("bta_hl_cch_mca_rsp_tout");
2501#endif
2502
2503    p_mcb->rsp_tout = TRUE;
2504
2505    bta_hl_check_cch_close(app_idx,mcl_idx,p_data,TRUE);
2506}
2507
2508/*******************************************************************************
2509**
2510** Function         bta_hl_cch_mca_connect
2511**
2512** Description      Action routine for processing the CCH connect indication
2513**
2514** Returns          void
2515**
2516*******************************************************************************/
2517void bta_hl_cch_mca_connect(UINT8 app_idx, UINT8 mcl_idx,  tBTA_HL_DATA *p_data)
2518{
2519    tBTA_HL_APP_CB      *p_acb  = BTA_HL_GET_APP_CB_PTR(app_idx);
2520    tBTA_HL_MCL_CB      *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
2521    tBTA_HL             evt_data;
2522    tBTA_HL_EVT         event;
2523    BOOLEAN             send_event=TRUE;
2524
2525#if BTA_HL_DEBUG == TRUE
2526    APPL_TRACE_DEBUG("bta_hl_cch_mca_connect mcl_handle=%d ", p_data->mca_evt.mcl_handle);
2527#endif
2528
2529    p_mcb->mcl_handle = p_data->mca_evt.mcl_handle;
2530    bdcpy(p_mcb->bd_addr, p_data->mca_evt.mca_data.connect_ind.bd_addr);
2531    p_mcb->cch_mtu = p_data->mca_evt.mca_data.connect_ind.mtu;
2532
2533    bta_sys_conn_open(BTA_ID_HL, p_acb->app_id, p_mcb->bd_addr);
2534    switch (p_mcb->cch_oper)
2535    {
2536        case BTA_HL_CCH_OP_LOCAL_OPEN:
2537            bta_hl_build_cch_open_cfm(&evt_data, p_mcb->app_id,p_acb->app_handle,
2538                                      p_mcb->mcl_handle,
2539                                      p_mcb->bd_addr,
2540                                      BTA_HL_STATUS_OK);
2541            event = BTA_HL_CCH_OPEN_CFM_EVT;
2542            break;
2543        case BTA_HL_CCH_OP_REMOTE_OPEN:
2544            bta_hl_build_cch_open_ind(&evt_data, p_acb->app_handle,
2545                                      p_mcb->mcl_handle,
2546                                      p_mcb->bd_addr);
2547            event = BTA_HL_CCH_OPEN_IND_EVT;
2548            break;
2549        default:
2550            send_event = FALSE;
2551            break;
2552    }
2553
2554    p_mcb->cch_oper = BTA_HL_CCH_OP_NONE;
2555    if (send_event) p_acb->p_cback(event,(tBTA_HL *) &evt_data );
2556}
2557
2558/*******************************************************************************
2559**
2560** Function         bta_hl_mcap_ctrl_cback
2561**
2562** Description      MCAP control callback function for HL.
2563**
2564** Returns          void
2565**
2566*******************************************************************************/
2567void bta_hl_mcap_ctrl_cback (tMCA_HANDLE handle, tMCA_CL mcl, UINT8 event,
2568                             tMCA_CTRL *p_data)
2569{
2570    tBTA_HL_MCA_EVT * p_msg;
2571    BOOLEAN send_event=TRUE;
2572    UINT16 mca_event;
2573
2574#if (BTA_HL_DEBUG == TRUE)
2575#if (BT_TRACE_VERBOSE == TRUE)
2576    APPL_TRACE_EVENT("bta_hl_mcap_ctrl_cback event[%s]",bta_hl_mcap_evt_code(event));
2577#else
2578    APPL_TRACE_EVENT("bta_hl_mcap_ctrl_cback event[0x%02x]", event);
2579#endif
2580#endif
2581
2582    switch (event)
2583    {
2584
2585        case MCA_CREATE_IND_EVT:
2586            mca_event = (UINT16) BTA_HL_MCA_CREATE_IND_EVT;
2587            break;
2588        case MCA_CREATE_CFM_EVT:
2589            mca_event = (UINT16) BTA_HL_MCA_CREATE_CFM_EVT;
2590            break;
2591        case MCA_RECONNECT_IND_EVT:
2592            mca_event = (UINT16) BTA_HL_MCA_RECONNECT_IND_EVT;
2593            break;
2594        case MCA_RECONNECT_CFM_EVT:
2595            mca_event = (UINT16) BTA_HL_MCA_RECONNECT_CFM_EVT;
2596            break;
2597        case MCA_ABORT_IND_EVT:
2598            mca_event = (UINT16) BTA_HL_MCA_ABORT_IND_EVT;
2599            break;
2600        case MCA_ABORT_CFM_EVT:
2601            mca_event = (UINT16) BTA_HL_MCA_ABORT_CFM_EVT;
2602            break;
2603        case MCA_DELETE_IND_EVT:
2604            mca_event = (UINT16) BTA_HL_MCA_DELETE_IND_EVT;
2605            break;
2606        case MCA_DELETE_CFM_EVT:
2607            mca_event = (UINT16) BTA_HL_MCA_DELETE_CFM_EVT;
2608            break;
2609        case MCA_CONNECT_IND_EVT:
2610            mca_event = (UINT16) BTA_HL_MCA_CONNECT_IND_EVT;
2611            break;
2612        case MCA_DISCONNECT_IND_EVT:
2613            mca_event = (UINT16) BTA_HL_MCA_DISCONNECT_IND_EVT;
2614            break;
2615        case MCA_OPEN_IND_EVT:
2616            mca_event = (UINT16) BTA_HL_MCA_OPEN_IND_EVT;
2617            break;
2618        case MCA_OPEN_CFM_EVT:
2619            mca_event = (UINT16) BTA_HL_MCA_OPEN_CFM_EVT;
2620            break;
2621        case MCA_CLOSE_IND_EVT:
2622            mca_event = (UINT16) BTA_HL_MCA_CLOSE_IND_EVT;
2623            break;
2624        case MCA_CLOSE_CFM_EVT:
2625            mca_event = (UINT16) BTA_HL_MCA_CLOSE_CFM_EVT;
2626            break;
2627        case MCA_CONG_CHG_EVT:
2628            mca_event = (UINT16) BTA_HL_MCA_CONG_CHG_EVT;
2629            break;
2630        case MCA_RSP_TOUT_IND_EVT:
2631            mca_event = (UINT16) BTA_HL_MCA_RSP_TOUT_IND_EVT;
2632            break;
2633        case MCA_ERROR_RSP_EVT:
2634
2635        default:
2636            send_event=FALSE;
2637            break;
2638    }
2639
2640    if (send_event && ((p_msg = (tBTA_HL_MCA_EVT *)GKI_getbuf(sizeof(tBTA_HL_MCA_EVT))) != NULL))
2641    {
2642        p_msg->hdr.event = mca_event;
2643        p_msg->app_handle = (tBTA_HL_APP_HANDLE) handle;
2644        p_msg->mcl_handle = (tBTA_HL_MCL_HANDLE) mcl;
2645        memcpy (&p_msg->mca_data, p_data, sizeof(tMCA_CTRL));
2646        bta_sys_sendmsg(p_msg);
2647    }
2648}
2649
2650/*******************************************************************************
2651**
2652** Function         bta_hl_mcap_data_cback
2653**
2654** Description      MCAP data callback function for HL.
2655**
2656** Returns          void
2657**
2658*******************************************************************************/
2659void bta_hl_mcap_data_cback (tMCA_DL mdl, BT_HDR *p_pkt)
2660{
2661    tBTA_HL_MCA_RCV_DATA_EVT *p_msg;
2662
2663    UINT8 app_idx, mcl_idx, mdl_idx;
2664    if (bta_hl_find_mdl_idx_using_handle ((tBTA_HL_MDL_HANDLE)mdl, &app_idx, &mcl_idx, &mdl_idx))
2665    {
2666        if ((p_msg = (tBTA_HL_MCA_RCV_DATA_EVT *)GKI_getbuf(sizeof(tBTA_HL_MCA_RCV_DATA_EVT))) != NULL)
2667        {
2668            p_msg->hdr.event = BTA_HL_MCA_RCV_DATA_EVT;
2669            p_msg->app_idx = app_idx;
2670            p_msg->mcl_idx = mcl_idx;
2671            p_msg->mdl_idx = mdl_idx;
2672            p_msg->p_pkt = p_pkt;
2673            bta_sys_sendmsg(p_msg);
2674        }
2675    }
2676}
2677/*****************************************************************************
2678**  Debug Functions
2679*****************************************************************************/
2680#if (BTA_HL_DEBUG == TRUE && BT_TRACE_VERBOSE == TRUE)
2681
2682/*******************************************************************************
2683**
2684** Function         bta_hl_mcap_evt_code
2685**
2686** Description      get the MCAP event string pointer
2687**
2688** Returns          char * - event string pointer
2689**
2690*******************************************************************************/
2691static char *bta_hl_mcap_evt_code(UINT8 evt_code)
2692{
2693
2694    switch (evt_code)
2695    {
2696
2697        case MCA_ERROR_RSP_EVT:
2698            return "MCA_ERROR_RSP_EVT";
2699        case MCA_CREATE_IND_EVT:
2700            return "MCA_CREATE_IND_EVT";
2701        case MCA_CREATE_CFM_EVT:
2702            return "MCA_CREATE_CFM_EVT";
2703        case MCA_RECONNECT_IND_EVT:
2704            return "MCA_RECONNECT_IND_EVT";
2705        case MCA_RECONNECT_CFM_EVT:
2706            return "MCA_RECONNECT_CFM_EVT";
2707        case MCA_ABORT_IND_EVT:
2708            return "MCA_ABORT_IND_EVT";
2709        case MCA_ABORT_CFM_EVT:
2710            return "MCA_ABORT_CFM_EVT";
2711        case MCA_DELETE_IND_EVT:
2712            return "MCA_DELETE_IND_EVT";
2713        case MCA_DELETE_CFM_EVT:
2714            return "MCA_DELETE_CFM_EVT";
2715
2716        case MCA_CONNECT_IND_EVT:
2717            return "MCA_CONNECT_IND_EVT";
2718        case MCA_DISCONNECT_IND_EVT:
2719            return "MCA_DISCONNECT_IND_EVT";
2720        case MCA_OPEN_IND_EVT:
2721            return "MCA_OPEN_IND_EVT";
2722        case MCA_OPEN_CFM_EVT:
2723            return "MCA_OPEN_CFM_EVT";
2724        case MCA_CLOSE_IND_EVT:
2725            return "MCA_CLOSE_IND_EVT";
2726        case MCA_CLOSE_CFM_EVT:
2727            return "MCA_CLOSE_CFM_EVT";
2728        case MCA_CONG_CHG_EVT:
2729            return "MCA_CONG_CHG_EVT";
2730        case MCA_RSP_TOUT_IND_EVT:
2731            return "MCA_RSP_TOUT_IND_EVT";
2732        default:
2733            return "Unknown MCAP event code";
2734    }
2735}
2736
2737
2738/*******************************************************************************
2739**
2740** Function         bta_hl_cback_evt_code
2741**
2742** Description      get the HDP event string pointer
2743**
2744** Returns          char * - event string pointer
2745**
2746*******************************************************************************/
2747static char *bta_hl_cback_evt_code(UINT8 evt_code)
2748{
2749
2750    switch (evt_code)
2751    {
2752
2753        case BTA_HL_CCH_OPEN_IND_EVT:
2754            return "BTA_HL_CCH_OPEN_IND_EVT";
2755        case BTA_HL_CCH_OPEN_CFM_EVT:
2756            return "BTA_HL_CCH_OPEN_CFM_EVT";
2757        case BTA_HL_CCH_CLOSE_IND_EVT:
2758            return "BTA_HL_CCH_CLOSE_IND_EVT";
2759        case     BTA_HL_CCH_CLOSE_CFM_EVT:
2760            return "BTA_HL_CCH_CLOSE_CFM_EVT";
2761        case BTA_HL_DCH_OPEN_IND_EVT:
2762            return "BTA_HL_DCH_OPEN_IND_EVT";
2763        case BTA_HL_DCH_OPEN_CFM_EVT:
2764            return "BTA_HL_DCH_OPEN_CFM_EVT";
2765        case BTA_HL_DCH_CLOSE_IND_EVT:
2766            return "BTA_HL_DCH_CLOSE_IND_EVT";
2767        case BTA_HL_DCH_CLOSE_CFM_EVT:
2768            return "BTA_HL_DCH_CLOSE_CFM_EVT";
2769        case BTA_HL_DCH_RCV_DATA_IND_EVT:
2770            return "BTA_HL_DCH_RCV_DATA_IND_EVT";
2771        case BTA_HL_REGISTER_CFM_EVT:
2772            return "BTA_HL_REGISTER_CFM_EVT";
2773        case BTA_HL_DEREGISTER_CFM_EVT:
2774            return "BTA_HL_DEREGISTER_CFM_EVT";
2775        case BTA_HL_DCH_RECONNECT_CFM_EVT:
2776            return "BTA_HL_DCH_RECONNECT_CFM_EVT";
2777        case BTA_HL_DCH_RECONNECT_IND_EVT:
2778            return "BTA_HL_DCH_RECONNECT_IND_EVT";
2779        case BTA_HL_DCH_ECHO_TEST_CFM_EVT:
2780            return "BTA_HL_DCH_ECHO_TEST_CFM_EVT";
2781        case BTA_HL_SDP_QUERY_CFM_EVT:
2782            return "BTA_HL_SDP_QUERY_CFM_EVT";
2783        case BTA_HL_CONG_CHG_IND_EVT:
2784            return "BTA_HL_CONG_CHG_IND_EVT";
2785        case BTA_HL_DCH_CREATE_IND_EVT:
2786            return "BTA_HL_DCH_CREATE_IND_EVT";
2787        case BTA_HL_DELETE_MDL_IND_EVT:
2788            return "BTA_HL_DELETE_MDL_IND_EVT";
2789        case BTA_HL_DELETE_MDL_CFM_EVT:
2790            return "BTA_HL_DELETE_MDL_CFM_EVT";
2791        case BTA_HL_DCH_ABORT_IND_EVT:
2792            return "BTA_HL_DCH_ABORT_IND_EVT";
2793        case BTA_HL_DCH_ABORT_CFM_EVT:
2794            return "BTA_HL_DCH_ABORT_CFM_EVT";
2795        default:
2796            return "Unknown HDP event code";
2797    }
2798}
2799
2800
2801
2802/*******************************************************************************
2803**
2804** Function         bta_hl_dch_oper_code
2805**
2806** Description      Get the DCH operation string
2807**
2808** Returns          char * - DCH operation string pointer
2809**
2810*******************************************************************************/
2811static char *bta_hl_dch_oper_code(tBTA_HL_DCH_OPER oper_code)
2812{
2813
2814    switch (oper_code)
2815    {
2816        case BTA_HL_DCH_OP_NONE:
2817            return "BTA_HL_DCH_OP_NONE";
2818        case BTA_HL_DCH_OP_REMOTE_CREATE:
2819            return "BTA_HL_DCH_OP_REMOTE_CREATE";
2820        case BTA_HL_DCH_OP_LOCAL_OPEN:
2821            return "BTA_HL_DCH_OP_LOCAL_OPEN";
2822        case BTA_HL_DCH_OP_REMOTE_OPEN:
2823            return "BTA_HL_DCH_OP_REMOTE_OPEN";
2824        case BTA_HL_DCH_OP_LOCAL_CLOSE:
2825            return "BTA_HL_DCH_OP_LOCAL_CLOSE";
2826        case BTA_HL_DCH_OP_REMOTE_CLOSE:
2827            return "BTA_HL_DCH_OP_REMOTE_CLOSE";
2828        case BTA_HL_DCH_OP_LOCAL_DELETE:
2829            return "BTA_HL_DCH_OP_LOCAL_DELETE";
2830        case BTA_HL_DCH_OP_REMOTE_DELETE:
2831            return "BTA_HL_DCH_OP_REMOTE_DELETE";
2832        case BTA_HL_DCH_OP_LOCAL_RECONNECT:
2833            return "BTA_HL_DCH_OP_LOCAL_RECONNECT";
2834        case BTA_HL_DCH_OP_REMOTE_RECONNECT:
2835            return "BTA_HL_DCH_OP_REMOTE_RECONNECT";
2836        case BTA_HL_DCH_OP_LOCAL_CLOSE_ECHO_TEST:
2837            return "BTA_HL_DCH_OP_LOCAL_CLOSE_ECHO_TEST";
2838        case BTA_HL_DCH_OP_LOCAL_CLOSE_RECONNECT:
2839            return "BTA_HL_DCH_OP_LOCAL_CLOSE_RECONNECT";
2840        default:
2841            return "Unknown DCH oper code";
2842    }
2843}
2844
2845
2846#endif  /* Debug Functions */
2847#endif /* HL_INCLUDED */
2848