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 "bt_common.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)
46 static char *bta_hl_mcap_evt_code(UINT8 evt_code);
47 static char *bta_hl_dch_oper_code(tBTA_HL_DCH_OPER oper_code);
48 static char *bta_hl_cback_evt_code(UINT8 evt_code);
49 #endif
50 static void bta_hl_sdp_cback(UINT8 sdp_op, UINT8 app_idx, UINT8 mcl_idx,
51                              UINT8 mdl_idx, UINT16 status);
52 static void bta_hl_sdp_cback0(UINT16 status);
53 static void bta_hl_sdp_cback1(UINT16 status);
54 static void bta_hl_sdp_cback2(UINT16 status);
55 static void bta_hl_sdp_cback3(UINT16 status);
56 static void bta_hl_sdp_cback4(UINT16 status);
57 static void bta_hl_sdp_cback5(UINT16 status);
58 static void bta_hl_sdp_cback6(UINT16 status);
59 
60 
61 static 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 *******************************************************************************/
bta_hl_dch_mca_cong_change(UINT8 app_idx,UINT8 mcl_idx,UINT8 mdl_idx,tBTA_HL_DATA * p_data)83 void 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 *******************************************************************************/
bta_hl_dch_echo_test(UINT8 app_idx,UINT8 mcl_idx,UINT8 mdl_idx,tBTA_HL_DATA * p_data)117 void 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 *******************************************************************************/
bta_hl_dch_sdp_init(UINT8 app_idx,UINT8 mcl_idx,UINT8 mdl_idx,tBTA_HL_DATA * p_data)147 void 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 *******************************************************************************/
bta_hl_dch_close_echo_test(UINT8 app_idx,UINT8 mcl_idx,UINT8 mdl_idx,tBTA_HL_DATA * p_data)193 void 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 *******************************************************************************/
bta_hl_dch_mca_rcv_data(UINT8 app_idx,UINT8 mcl_idx,UINT8 mdl_idx,tBTA_HL_DATA * p_data)232 void 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                     osi_free_and_reset((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 *******************************************************************************/
bta_hl_dch_ci_put_echo_data(UINT8 app_idx,UINT8 mcl_idx,UINT8 mdl_idx,tBTA_HL_DATA * p_data)298 void 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     osi_free_and_reset((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 *******************************************************************************/
bta_hl_dch_ci_get_echo_data(UINT8 app_idx,UINT8 mcl_idx,UINT8 mdl_idx,tBTA_HL_DATA * p_data)327 void 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 *******************************************************************************/
bta_hl_dch_ci_put_rx_data(UINT8 app_idx,UINT8 mcl_idx,UINT8 mdl_idx,tBTA_HL_DATA * p_data)369 void 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     osi_free_and_reset((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 *******************************************************************************/
bta_hl_dch_ci_get_tx_data(UINT8 app_idx,UINT8 mcl_idx,UINT8 mdl_idx,tBTA_HL_DATA * p_data)410 void 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         osi_free_and_reset((void **)&p_dcb->p_tx_pkt);
461 
462     bta_hl_build_send_data_cfm(&evt_data,
463                                p_acb->app_handle,
464                                p_mcb->mcl_handle,
465                                p_dcb->mdl_handle,
466                                status);
467     p_acb->p_cback(BTA_HL_DCH_SEND_DATA_CFM_EVT,(tBTA_HL *) &evt_data );
468 
469     if (close_dch)
470     {
471         bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_EVT, p_data);
472     }
473 }
474 
475 
476 /*******************************************************************************
477 **
478 ** Function         bta_hl_dch_send_data
479 **
480 ** Description      Action routine for processing api send data request
481 **
482 ** Returns          void
483 **
484 *******************************************************************************/
bta_hl_dch_send_data(UINT8 app_idx,UINT8 mcl_idx,UINT8 mdl_idx,tBTA_HL_DATA * p_data)485 void bta_hl_dch_send_data(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx,
486                           tBTA_HL_DATA *p_data)
487 {
488     tBTA_HL_APP_CB      *p_acb  = BTA_HL_GET_APP_CB_PTR(app_idx);
489     tBTA_HL_MCL_CB      *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
490     tBTA_HL_MDL_CB      *p_dcb  = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
491     tBTA_HL             evt_data;
492     BOOLEAN             success = TRUE;
493 
494 #if (BTA_HL_DEBUG == TRUE)
495     APPL_TRACE_DEBUG("bta_hl_dch_send_data");
496 #endif
497 
498     if (!(p_dcb->cout_oper & BTA_HL_CO_GET_TX_DATA_MASK))
499     {
500         // p_dcb->chnl_cfg.fcs may be BTA_HL_MCA_USE_FCS (0x11) or BTA_HL_MCA_NO_FCS (0x10) or BTA_HL_DEFAULT_SOURCE_FCS (1)
501         BOOLEAN fcs_use = (BOOLEAN) (p_dcb->chnl_cfg.fcs & BTA_HL_MCA_FCS_USE_MASK);
502         if ((p_dcb->p_tx_pkt = bta_hl_get_buf(p_data->api_send_data.pkt_size, fcs_use)) != 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 *******************************************************************************/
bta_hl_dch_close_cmpl(UINT8 app_idx,UINT8 mcl_idx,UINT8 mdl_idx,tBTA_HL_DATA * p_data)541 void 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 *******************************************************************************/
bta_hl_dch_mca_close_ind(UINT8 app_idx,UINT8 mcl_idx,UINT8 mdl_idx,tBTA_HL_DATA * p_data)734 void 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 *******************************************************************************/
bta_hl_dch_mca_close_cfm(UINT8 app_idx,UINT8 mcl_idx,UINT8 mdl_idx,tBTA_HL_DATA * p_data)777 void 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 *******************************************************************************/
bta_hl_dch_mca_close(UINT8 app_idx,UINT8 mcl_idx,UINT8 mdl_idx,tBTA_HL_DATA * p_data)824 void 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 *******************************************************************************/
bta_hl_dch_mca_open_ind(UINT8 app_idx,UINT8 mcl_idx,UINT8 mdl_idx,tBTA_HL_DATA * p_data)875 void 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 *******************************************************************************/
bta_hl_dch_mca_open_cfm(UINT8 app_idx,UINT8 mcl_idx,UINT8 mdl_idx,tBTA_HL_DATA * p_data)982 void 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 *******************************************************************************/
bta_hl_dch_mca_abort_ind(UINT8 app_idx,UINT8 mcl_idx,UINT8 mdl_idx,tBTA_HL_DATA * p_data)1103 void 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 *******************************************************************************/
bta_hl_dch_mca_abort_cfm(UINT8 app_idx,UINT8 mcl_idx,UINT8 mdl_idx,tBTA_HL_DATA * p_data)1126 void 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 *******************************************************************************/
bta_hl_dch_mca_abort(UINT8 app_idx,UINT8 mcl_idx,UINT8 mdl_idx,tBTA_HL_DATA * p_data)1171 void 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 *******************************************************************************/
bta_hl_dch_mca_reconnect_ind(UINT8 app_idx,UINT8 mcl_idx,UINT8 mdl_idx,tBTA_HL_DATA * p_data)1232 void 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 *******************************************************************************/
bta_hl_dch_mca_reconnect_cfm(UINT8 app_idx,UINT8 mcl_idx,UINT8 mdl_idx,tBTA_HL_DATA * p_data)1306 void 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 *******************************************************************************/
bta_hl_dch_mca_reconnect(UINT8 app_idx,UINT8 mcl_idx,UINT8 mdl_idx,tBTA_HL_DATA * p_data)1355 void 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 *******************************************************************************/
bta_hl_dch_create_rsp(UINT8 app_idx,UINT8 mcl_idx,UINT8 mdl_idx,tBTA_HL_DATA * p_data)1394 void 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 *******************************************************************************/
bta_hl_dch_mca_create_ind(UINT8 app_idx,UINT8 mcl_idx,UINT8 mdl_idx,tBTA_HL_DATA * p_data)1439 void 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 *******************************************************************************/
bta_hl_dch_mca_create_cfm(UINT8 app_idx,UINT8 mcl_idx,UINT8 mdl_idx,tBTA_HL_DATA * p_data)1545 void 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 *******************************************************************************/
bta_hl_dch_mca_create(UINT8 app_idx,UINT8 mcl_idx,UINT8 mdl_idx,tBTA_HL_DATA * p_data)1609 void 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 *******************************************************************************/
bta_hl_dch_sdp_fail(UINT8 app_idx,UINT8 mcl_idx,UINT8 mdl_idx,tBTA_HL_DATA * p_data)1657 void 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 ******************************************************************************/
bta_hl_sdp_cback(UINT8 sdp_oper,UINT8 app_idx,UINT8 mcl_idx,UINT8 mdl_idx,UINT16 status)1681 static 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                             strlcpy(p_hdp_rec->mdep_cfg[i].mdep_desp,
1797                                     sup_feature.list_elem[i].p_mdep_desp,
1798                                     BTA_HL_MDEP_DESP_LEN);
1799                         }
1800                         else
1801                         {
1802                             APPL_TRACE_ERROR("bta_hl_sdp_cback Incorrect Mdep[%d] Description (Null ptr)", i);
1803                         }
1804                     }
1805 
1806                     sdp_parsing_ok = TRUE;
1807                 }
1808                 else
1809                 {
1810                     APPL_TRACE_WARNING("HDP supported feature list fill failed");
1811                     break;
1812                 }
1813             }
1814             else
1815             {
1816                 APPL_TRACE_WARNING("HDP supported feature list not found");
1817                 break;
1818             }
1819 #if BTA_HL_DEBUG == TRUE
1820             APPL_TRACE_DEBUG("record=%d ctrl_psm=%0x data_psm=%x",
1821                               rec_cnt+1,
1822                               p_hdp_rec->ctrl_psm,
1823                               p_hdp_rec->data_psm );
1824             APPL_TRACE_DEBUG("srv_name=[%s]",(p_hdp_rec->srv_name[0] != '\0')? p_hdp_rec->srv_name:"NULL");
1825             APPL_TRACE_DEBUG("srv_desp=[%s]",(p_hdp_rec->srv_desp[0] != '\0')? p_hdp_rec->srv_desp:"NULL");
1826             for (i=0; i<sup_feature.num_elems; i++)
1827             {
1828                 APPL_TRACE_DEBUG("index=0x%02x mdep_id=0x%04x data type=0x%04x mdep role=%s(0x%02x)",
1829                                   (i+1),
1830                                   p_hdp_rec->mdep_cfg[i].mdep_id,
1831                                   p_hdp_rec->mdep_cfg[i].data_type,
1832                                   (p_hdp_rec->mdep_cfg[i].mdep_role == BTA_HL_MDEP_ROLE_SOURCE)?"Src":"Snk",
1833                                   p_hdp_rec->mdep_cfg[i].mdep_role);
1834             }
1835             APPL_TRACE_DEBUG("provider_name=[%s]",(p_hdp_rec->provider_name[0] != '\0')? p_hdp_rec->provider_name:"NULL");
1836             APPL_TRACE_DEBUG("found MCAP sup procedure=%d",
1837                               p_cb->sdp.sdp_rec[rec_cnt].mcap_sup_proc );
1838 #endif
1839             rec_cnt++;
1840             if (rec_cnt >= BTA_HL_NUM_SDP_RECS)
1841             {
1842                 APPL_TRACE_WARNING("No more spaces for SDP recs max_rec_cnt=%d", BTA_HL_NUM_SDP_RECS);
1843                 break;
1844             }
1845 
1846 
1847         } while (TRUE);
1848     }
1849 
1850     osi_free_and_reset((void **)&p_cb->p_db);
1851 
1852     if ( (status == SDP_SUCCESS || status == SDP_DB_FULL) &&
1853          p_cb->sdp.num_recs  &&
1854          sdp_parsing_ok)
1855     {
1856         result = TRUE;
1857     }
1858     else
1859     {
1860         APPL_TRACE_WARNING("SDP Failed sdp_status=%d num_recs=%d sdp_parsing_ok=%d ",
1861                             status, p_cb->sdp.num_recs,sdp_parsing_ok );
1862     }
1863 
1864 
1865     p_cb->sdp_oper = BTA_HL_SDP_OP_NONE;
1866 
1867     switch (sdp_oper )
1868     {
1869         case BTA_HL_SDP_OP_CCH_INIT:
1870         case BTA_HL_SDP_OP_SDP_QUERY_NEW:
1871         case BTA_HL_SDP_OP_SDP_QUERY_CURRENT:
1872 
1873             /* send result in event back to BTA */
1874             p_cch_buf = (tBTA_HL_CCH_SDP *)osi_malloc(sizeof(tBTA_HL_CCH_SDP));
1875             if (result) {
1876                 if (sdp_oper == BTA_HL_SDP_OP_CCH_INIT) {
1877                     event = BTA_HL_CCH_SDP_OK_EVT;
1878                     if (p_cb->close_pending)
1879                         event = BTA_HL_CCH_SDP_FAIL_EVT;
1880                 } else {
1881                     event = BTA_HL_SDP_QUERY_OK_EVT;
1882                 }
1883             } else {
1884                 if (sdp_oper == BTA_HL_SDP_OP_CCH_INIT)
1885                     event = BTA_HL_CCH_SDP_FAIL_EVT;
1886                 else
1887                     event = BTA_HL_SDP_QUERY_FAIL_EVT;
1888             }
1889             p_cch_buf->hdr.event = event;
1890 
1891             p_cch_buf->app_idx = app_idx;
1892             p_cch_buf->mcl_idx = mcl_idx;
1893             p_cch_buf->release_mcl_cb = FALSE;
1894             if (sdp_oper == BTA_HL_SDP_OP_SDP_QUERY_NEW)
1895                 p_cch_buf->release_mcl_cb = TRUE;
1896 
1897             bta_sys_sendmsg(p_cch_buf);
1898             break;
1899         case BTA_HL_SDP_OP_DCH_OPEN_INIT:
1900         case BTA_HL_SDP_OP_DCH_RECONNECT_INIT:
1901             p_dch_buf = (tBTA_HL_DCH_SDP *)osi_malloc(sizeof(tBTA_HL_DCH_SDP));
1902             p_dch_buf->hdr.event = BTA_HL_DCH_SDP_FAIL_EVT;
1903             p_dch_buf->app_idx = app_idx;
1904             p_dch_buf->mcl_idx = mcl_idx;
1905             p_dch_buf->mdl_idx = mdl_idx;
1906             p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
1907             if (p_dcb->abort_oper & BTA_HL_ABORT_PENDING_MASK) {
1908                 p_dcb->abort_oper &= ~BTA_HL_ABORT_PENDING_MASK;
1909                 result = FALSE;
1910             }
1911             if (result) {
1912                 if (sdp_oper == BTA_HL_SDP_OP_DCH_OPEN_INIT) {
1913                     if (p_dcb->local_mdep_id == BTA_HL_ECHO_TEST_MDEP_ID) {
1914                         p_dch_buf->hdr.event = BTA_HL_DCH_ECHO_TEST_EVT;
1915                     } else {
1916                         p_dch_buf->hdr.event = BTA_HL_DCH_OPEN_EVT;
1917                     }
1918                 } else {
1919                     p_dch_buf->hdr.event = BTA_HL_DCH_RECONNECT_EVT;
1920                 }
1921             }
1922             bta_sys_sendmsg(p_dch_buf);
1923             break;
1924         default:
1925             break;
1926     }
1927 }
1928 
1929 
1930 /******************************************************************************
1931 **
1932 ** Function         bta_hl_sdp_cback0
1933 **
1934 ** Description      This is the SDP callback function used by index = 0
1935 **
1936 ** Returns          void.
1937 **
1938 ******************************************************************************/
bta_hl_sdp_cback0(UINT16 status)1939 static void bta_hl_sdp_cback0(UINT16 status)
1940 {
1941     bta_hl_sdp_cback(bta_hl_cb.scb[0].sdp_oper,
1942                      bta_hl_cb.scb[0].app_idx,
1943                      bta_hl_cb.scb[0].mcl_idx,
1944                      bta_hl_cb.scb[0].mdl_idx,
1945                      status);
1946     bta_hl_deallocate_spd_cback(0);
1947 }
1948 
1949 /******************************************************************************
1950 **
1951 ** Function         bta_hl_sdp_cback1
1952 **
1953 ** Description      This is the SDP callback function used by index = 1
1954 **
1955 ** Parameters       status  - status of the SDP callabck
1956 **
1957 ** Returns          void.
1958 **
1959 ******************************************************************************/
bta_hl_sdp_cback1(UINT16 status)1960 static void bta_hl_sdp_cback1(UINT16 status)
1961 {
1962     bta_hl_sdp_cback(bta_hl_cb.scb[1].sdp_oper,
1963                      bta_hl_cb.scb[1].app_idx,
1964                      bta_hl_cb.scb[1].mcl_idx,
1965                      bta_hl_cb.scb[1].mdl_idx,
1966                      status);
1967     bta_hl_deallocate_spd_cback(1);
1968 }
1969 
1970 /******************************************************************************
1971 **
1972 ** Function         bta_hl_sdp_cback2
1973 **
1974 ** Description      This is the SDP callback function used by index = 2
1975 **
1976 ** Returns          void.
1977 **
1978 ******************************************************************************/
bta_hl_sdp_cback2(UINT16 status)1979 static void bta_hl_sdp_cback2(UINT16 status)
1980 {
1981     bta_hl_sdp_cback(bta_hl_cb.scb[2].sdp_oper,
1982                      bta_hl_cb.scb[2].app_idx,
1983                      bta_hl_cb.scb[2].mcl_idx,
1984                      bta_hl_cb.scb[2].mdl_idx,
1985                      status);
1986     bta_hl_deallocate_spd_cback(2);
1987 }
1988 
1989 /******************************************************************************
1990 **
1991 ** Function         bta_hl_sdp_cback3
1992 **
1993 ** Description      This is the SDP callback function used by index = 3
1994 **
1995 ** Returns          void.
1996 **
1997 ******************************************************************************/
bta_hl_sdp_cback3(UINT16 status)1998 static void bta_hl_sdp_cback3(UINT16 status)
1999 {
2000     bta_hl_sdp_cback(bta_hl_cb.scb[3].sdp_oper,
2001                      bta_hl_cb.scb[3].app_idx,
2002                      bta_hl_cb.scb[3].mcl_idx,
2003                      bta_hl_cb.scb[3].mdl_idx,
2004                      status);
2005     bta_hl_deallocate_spd_cback(3);
2006 }
2007 
2008 /******************************************************************************
2009 **
2010 ** Function         bta_hl_sdp_cback4
2011 **
2012 ** Description      This is the SDP callback function used by index = 4
2013 **
2014 ** Parameters       status  - status of the SDP callabck
2015 **
2016 ** Returns          void.
2017 **
2018 ******************************************************************************/
bta_hl_sdp_cback4(UINT16 status)2019 static void bta_hl_sdp_cback4(UINT16 status)
2020 {
2021     bta_hl_sdp_cback(bta_hl_cb.scb[4].sdp_oper,
2022                      bta_hl_cb.scb[4].app_idx,
2023                      bta_hl_cb.scb[4].mcl_idx,
2024                      bta_hl_cb.scb[4].mdl_idx,
2025                      status);
2026     bta_hl_deallocate_spd_cback(4);
2027 }
2028 
2029 /******************************************************************************
2030 **
2031 ** Function         bta_hl_sdp_cback5
2032 **
2033 ** Description      This is the SDP callback function used by index = 5
2034 **
2035 ** Parameters       status  - status of the SDP callabck
2036 **
2037 ** Returns          void.
2038 **
2039 ******************************************************************************/
bta_hl_sdp_cback5(UINT16 status)2040 static void bta_hl_sdp_cback5(UINT16 status)
2041 {
2042     bta_hl_sdp_cback(bta_hl_cb.scb[5].sdp_oper,
2043                      bta_hl_cb.scb[5].app_idx,
2044                      bta_hl_cb.scb[5].mcl_idx,
2045                      bta_hl_cb.scb[5].mdl_idx,
2046                      status);
2047     bta_hl_deallocate_spd_cback(5);
2048 }
2049 
2050 /******************************************************************************
2051 **
2052 ** Function         bta_hl_sdp_cback6
2053 **
2054 ** Description      This is the SDP callback function used by index = 6
2055 **
2056 ** Returns          void.
2057 **
2058 ******************************************************************************/
bta_hl_sdp_cback6(UINT16 status)2059 static void bta_hl_sdp_cback6(UINT16 status)
2060 {
2061     bta_hl_sdp_cback(bta_hl_cb.scb[6].sdp_oper,
2062                      bta_hl_cb.scb[6].app_idx,
2063                      bta_hl_cb.scb[6].mcl_idx,
2064                      bta_hl_cb.scb[6].mdl_idx,
2065                      status);
2066     bta_hl_deallocate_spd_cback(6);
2067 }
2068 
2069 
2070 /*******************************************************************************
2071 **
2072 ** Function      bta_hl_deallocate_spd_cback
2073 **
2074 ** Description   Deallocate a SDP control block
2075 **
2076 ** Returns      BOOLEAN - TRUE found
2077 **                        FALSE not found
2078 **
2079 *******************************************************************************/
bta_hl_deallocate_spd_cback(UINT8 sdp_cback_idx)2080 void bta_hl_deallocate_spd_cback(UINT8 sdp_cback_idx)
2081 {
2082     tBTA_HL_SDP_CB *p_spd_cb = &bta_hl_cb.scb[sdp_cback_idx];
2083 
2084     memset(p_spd_cb, 0, sizeof(tBTA_HL_SDP_CB));
2085 
2086 #if BTA_HL_DEBUG == TRUE
2087     APPL_TRACE_DEBUG("bta_hl_deallocate_spd_cback index=%d", sdp_cback_idx);
2088 #endif
2089 
2090 
2091 }
2092 
2093 /*******************************************************************************
2094 **
2095 ** Function      bta_hl_allocate_spd_cback
2096 **
2097 ** Description   Finds a not in used SDP control block index
2098 **
2099 **
2100 ** Returns      BOOLEAN - TRUE found
2101 **                        FALSE not found
2102 **
2103 *******************************************************************************/
bta_hl_allocate_spd_cback(tBTA_HL_SDP_OPER sdp_oper,UINT8 app_idx,UINT8 mcl_idx,UINT8 mdl_idx,UINT8 * p_sdp_cback_idx)2104 tSDP_DISC_CMPL_CB *bta_hl_allocate_spd_cback(tBTA_HL_SDP_OPER sdp_oper, UINT8 app_idx, UINT8 mcl_idx,
2105                                              UINT8 mdl_idx,
2106                                              UINT8 *p_sdp_cback_idx)
2107 {
2108     UINT8 i;
2109     tSDP_DISC_CMPL_CB *p_cbcak=NULL;
2110 
2111 
2112     for (i=0; i < BTA_HL_NUM_SDP_CBACKS ; i ++)
2113     {
2114         if (!bta_hl_cb.scb[i].in_use)
2115         {
2116             p_cbcak = bta_hl_sdp_cback_arr[i];
2117             bta_hl_cb.scb[i].in_use = TRUE;
2118             bta_hl_cb.scb[i].sdp_oper = sdp_oper;
2119             bta_hl_cb.scb[i].app_idx = app_idx;
2120             bta_hl_cb.scb[i].mcl_idx = mcl_idx;
2121             bta_hl_cb.scb[i].mdl_idx = mdl_idx;
2122             *p_sdp_cback_idx = i;
2123             break;
2124         }
2125     }
2126 
2127     if (i == BTA_HL_NUM_SDP_CBACKS)
2128     {
2129         APPL_TRACE_WARNING("No scb is available to allocate")
2130     }
2131     else
2132     {
2133 #if BTA_HL_DEBUG == TRUE
2134     APPL_TRACE_DEBUG("bta_hl_allocate_spd_cback cback_idx=%d ",i );
2135     APPL_TRACE_DEBUG("sdp_oper=%d, app_idx=%d, mcl_idx=%d,  mdl_idx=%d",
2136                       bta_hl_cb.scb[i].sdp_oper,
2137                       bta_hl_cb.scb[i].app_idx,
2138                       bta_hl_cb.scb[i].mcl_idx,
2139                       bta_hl_cb.scb[i].mdl_idx );
2140 #endif
2141     }
2142     return p_cbcak;
2143 }
2144 
2145 
2146 /*******************************************************************************
2147 **
2148 ** Function         bta_hl_init_sdp
2149 **
2150 ** Description      Action routine for processing the SDP initiattion request
2151 **
2152 ** Returns          void
2153 **
2154 *******************************************************************************/
bta_hl_init_sdp(tBTA_HL_SDP_OPER sdp_oper,UINT8 app_idx,UINT8 mcl_idx,UINT8 mdl_idx)2155 tBTA_HL_STATUS bta_hl_init_sdp(tBTA_HL_SDP_OPER sdp_oper, UINT8 app_idx, UINT8 mcl_idx,
2156                                UINT8 mdl_idx)
2157 {
2158     tBTA_HL_MCL_CB      *p_cb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
2159     tSDP_UUID           uuid_list;
2160     UINT16              attr_list[BTA_HL_NUM_SRCH_ATTR];
2161     UINT16              num_attrs = BTA_HL_NUM_SRCH_ATTR;
2162     tBTA_HL_STATUS      status;
2163     UINT8               sdp_cback_idx;
2164 #if BTA_HL_DEBUG == TRUE
2165     APPL_TRACE_DEBUG("bta_hl_init_sdp sdp_oper=%d app_idx=%d mcl_idx=%d, mdl_idx=%d",
2166                       sdp_oper, app_idx, mcl_idx, mdl_idx);
2167 #endif
2168     if ((p_cb->sdp_cback = bta_hl_allocate_spd_cback(sdp_oper, app_idx, mcl_idx, mdl_idx, &sdp_cback_idx)) != NULL)
2169     {
2170         if (p_cb->p_db == NULL)
2171             (p_cb->p_db = (tSDP_DISCOVERY_DB *)osi_malloc(BTA_HL_DISC_SIZE));
2172         attr_list[0] = ATTR_ID_SERVICE_CLASS_ID_LIST;
2173         attr_list[1] = ATTR_ID_PROTOCOL_DESC_LIST;
2174         attr_list[2] = ATTR_ID_BT_PROFILE_DESC_LIST;
2175         attr_list[3] = ATTR_ID_ADDITION_PROTO_DESC_LISTS;
2176         attr_list[4] = ATTR_ID_SERVICE_NAME;
2177         attr_list[5] = ATTR_ID_SERVICE_DESCRIPTION;
2178         attr_list[6] = ATTR_ID_PROVIDER_NAME;
2179         attr_list[7] = ATTR_ID_HDP_SUP_FEAT_LIST;
2180         attr_list[8] = ATTR_ID_HDP_DATA_EXCH_SPEC;
2181         attr_list[9] = ATTR_ID_HDP_MCAP_SUP_PROC;
2182 
2183         uuid_list.len = LEN_UUID_16;
2184         uuid_list.uu.uuid16 = UUID_SERVCLASS_HDP_PROFILE;
2185         SDP_InitDiscoveryDb(p_cb->p_db, BTA_HL_DISC_SIZE, 1, &uuid_list, num_attrs, attr_list);
2186 
2187         if (!SDP_ServiceSearchAttributeRequest(p_cb->bd_addr, p_cb->p_db, p_cb->sdp_cback))
2188         {
2189             status = BTA_HL_STATUS_FAIL;
2190         } else {
2191             status = BTA_HL_STATUS_OK;
2192         }
2193     } else {
2194         status = BTA_HL_STATUS_SDP_NO_RESOURCE;
2195     }
2196 
2197     if (status != BTA_HL_STATUS_OK) {
2198         osi_free_and_reset((void **)&p_cb->p_db);
2199         if (status != BTA_HL_STATUS_SDP_NO_RESOURCE)
2200             bta_hl_deallocate_spd_cback(sdp_cback_idx);
2201     }
2202 
2203     return status;
2204 }
2205 
2206 /*******************************************************************************
2207 **
2208 ** Function         bta_hl_cch_sdp_init
2209 **
2210 ** Description      Action routine for processing the CCH SDP init event
2211 **
2212 ** Returns          void
2213 **
2214 *******************************************************************************/
bta_hl_cch_sdp_init(UINT8 app_idx,UINT8 mcl_idx,tBTA_HL_DATA * p_data)2215 void bta_hl_cch_sdp_init(UINT8 app_idx, UINT8 mcl_idx,  tBTA_HL_DATA *p_data)
2216 {
2217     tBTA_HL_MCL_CB      *p_cb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
2218 #if BTA_HL_DEBUG == TRUE
2219     APPL_TRACE_DEBUG("bta_hl_cch_init_sdp");
2220 #endif
2221     if ( p_cb->sdp_oper == BTA_HL_SDP_OP_NONE)
2222     {
2223         p_cb->app_id = p_data->api_cch_open.app_id;
2224         p_cb->sdp_oper = BTA_HL_SDP_OP_CCH_INIT;
2225 
2226         if (bta_hl_init_sdp( p_cb->sdp_oper, app_idx, mcl_idx, 0xFF) != BTA_HL_STATUS_OK)
2227         {
2228             p_cb->sdp_oper = BTA_HL_SDP_OP_NONE;
2229             bta_hl_cch_sm_execute(app_idx, mcl_idx, BTA_HL_CCH_SDP_FAIL_EVT, p_data);
2230         }
2231     }
2232     else
2233     {
2234         APPL_TRACE_ERROR("SDP in use");
2235         bta_hl_cch_sm_execute(app_idx, mcl_idx, BTA_HL_CCH_SDP_FAIL_EVT, p_data);
2236     }
2237 }
2238 
2239 /*******************************************************************************
2240 **
2241 ** Function         bta_hl_cch_mca_open
2242 **
2243 ** Description      Action routine for processing the CCH open request
2244 **
2245 ** Returns          void
2246 **
2247 *******************************************************************************/
bta_hl_cch_mca_open(UINT8 app_idx,UINT8 mcl_idx,tBTA_HL_DATA * p_data)2248 void bta_hl_cch_mca_open(UINT8 app_idx, UINT8 mcl_idx,  tBTA_HL_DATA *p_data)
2249 {
2250     tBTA_HL_APP_CB      *p_acb  = BTA_HL_GET_APP_CB_PTR(app_idx);
2251     tBTA_HL_MCL_CB      *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
2252     UINT8               sdp_idx;
2253 
2254 #if BTA_HL_DEBUG == TRUE
2255     APPL_TRACE_DEBUG("bta_hl_cch_mca_open");
2256 #endif
2257 
2258     if (bta_hl_find_sdp_idx_using_ctrl_psm(&p_mcb->sdp, p_mcb->req_ctrl_psm, &sdp_idx))
2259     {
2260         p_mcb->ctrl_psm = p_mcb->sdp.sdp_rec[sdp_idx].ctrl_psm;
2261         p_mcb->data_psm = p_mcb->sdp.sdp_rec[sdp_idx].data_psm;
2262         if ( MCA_ConnectReq((tMCA_HANDLE) p_acb->app_handle,
2263                             p_mcb->bd_addr,
2264                             p_mcb->ctrl_psm ,
2265                             p_mcb->sec_mask) != MCA_SUCCESS)
2266         {
2267 
2268             bta_hl_cch_sm_execute(app_idx, mcl_idx, BTA_HL_CCH_CLOSE_CMPL_EVT, p_data);
2269         }
2270     }
2271     else
2272     {
2273         bta_hl_cch_sm_execute(app_idx, mcl_idx, BTA_HL_CCH_CLOSE_CMPL_EVT, p_data);
2274     }
2275 }
2276 
2277 /*******************************************************************************
2278 **
2279 ** Function         bta_hl_cch_mca_close
2280 **
2281 ** Description      Action routine for processing the CCH close request
2282 **
2283 ** Returns          void
2284 **
2285 *******************************************************************************/
bta_hl_cch_mca_close(UINT8 app_idx,UINT8 mcl_idx,tBTA_HL_DATA * p_data)2286 void bta_hl_cch_mca_close(UINT8 app_idx, UINT8 mcl_idx,  tBTA_HL_DATA *p_data)
2287 {
2288     tBTA_HL_MCL_CB      *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
2289 
2290 #if BTA_HL_DEBUG == TRUE
2291     APPL_TRACE_DEBUG("bta_hl_cch_mca_close mcl_handle=%d", p_mcb->mcl_handle);
2292 #endif
2293     if (p_mcb->sdp_oper != BTA_HL_SDP_OP_CCH_INIT)
2294     {
2295         if(p_mcb->mcl_handle)
2296         {
2297             if ( MCA_DisconnectReq((tMCA_HANDLE) p_mcb->mcl_handle) != MCA_SUCCESS)
2298             {
2299                 bta_hl_cch_sm_execute(app_idx, mcl_idx, BTA_HL_CCH_CLOSE_CMPL_EVT, p_data);
2300             }
2301         }
2302         else
2303         {
2304             p_mcb->close_pending = TRUE;
2305             APPL_TRACE_DEBUG("No valid mcl_handle to stop the CCH setup now so wait until CCH is up then close it" );
2306         }
2307     }
2308     else
2309     {
2310         p_mcb->close_pending = TRUE;
2311         APPL_TRACE_DEBUG("can not stop the CCH setup becasue SDP is in progress so wait until it is done" );
2312     }
2313 }
2314 
2315 /*******************************************************************************
2316 **
2317 ** Function         bta_hl_cch_close_cmpl
2318 **
2319 ** Description      Action routine for processing the CCH close complete event
2320 **
2321 ** Returns          void
2322 **
2323 *******************************************************************************/
bta_hl_cch_close_cmpl(UINT8 app_idx,UINT8 mcl_idx,tBTA_HL_DATA * p_data)2324 void bta_hl_cch_close_cmpl(UINT8 app_idx, UINT8 mcl_idx,  tBTA_HL_DATA *p_data)
2325 {
2326     tBTA_HL_APP_CB      *p_acb  = BTA_HL_GET_APP_CB_PTR(app_idx);
2327     tBTA_HL_MCL_CB      *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
2328 
2329     tBTA_HL             evt_data;
2330     tBTA_HL_EVT         event;
2331     BOOLEAN             send_evt=TRUE;
2332 #if BTA_HL_DEBUG == TRUE
2333     APPL_TRACE_DEBUG("bta_hl_cch_close_cmpl");
2334 #endif
2335     bta_sys_conn_close(BTA_ID_HL, p_acb->app_id, p_mcb->bd_addr);
2336 
2337     if (p_mcb->cch_oper == BTA_HL_CCH_OP_LOCAL_CLOSE && p_mcb->force_close_local_cch_opening)
2338     {
2339        p_mcb->cch_oper = BTA_HL_CCH_OP_LOCAL_OPEN;
2340        APPL_TRACE_DEBUG("change cch_oper from BTA_HL_CCH_OP_LOCAL_CLOSE to BTA_HL_CCH_OP_LOCAL_OPEN");
2341     }
2342 
2343     switch (p_mcb->cch_oper)
2344     {
2345         case BTA_HL_CCH_OP_LOCAL_OPEN:
2346             bta_hl_build_cch_open_cfm(&evt_data,p_mcb->app_id,p_acb->app_handle,
2347                                       p_mcb->mcl_handle,
2348                                       p_mcb->bd_addr,
2349                                       BTA_HL_STATUS_FAIL);
2350             event = BTA_HL_CCH_OPEN_CFM_EVT;
2351             break;
2352         case BTA_HL_CCH_OP_LOCAL_CLOSE:
2353             bta_hl_build_cch_close_cfm(&evt_data,  p_acb->app_handle,
2354                                        p_mcb->mcl_handle,
2355                                        BTA_HL_STATUS_OK);
2356             event = BTA_HL_CCH_CLOSE_CFM_EVT;
2357             break;
2358         case BTA_HL_CCH_OP_REMOTE_CLOSE:
2359             bta_hl_build_cch_close_ind(&evt_data,
2360                                        p_acb->app_handle,
2361                                        p_mcb->mcl_handle,
2362                                        p_mcb->intentional_close);
2363             event = BTA_HL_CCH_CLOSE_IND_EVT;
2364             break;
2365         default:
2366             send_evt=FALSE;
2367             break;
2368     }
2369 
2370 
2371     memset(p_mcb, 0 ,sizeof(tBTA_HL_MCL_CB));
2372 
2373     if (send_evt)p_acb->p_cback(event,(tBTA_HL *) &evt_data );
2374 
2375     bta_hl_check_deregistration(app_idx, p_data);
2376 }
2377 
2378 /*******************************************************************************
2379 **
2380 ** Function         bta_hl_cch_mca_disconnect
2381 **
2382 ** Description      Action routine for processing the CCH disconnect indication
2383 **
2384 ** Returns          void
2385 **
2386 *******************************************************************************/
bta_hl_cch_mca_disconnect(UINT8 app_idx,UINT8 mcl_idx,tBTA_HL_DATA * p_data)2387 void bta_hl_cch_mca_disconnect(UINT8 app_idx, UINT8 mcl_idx,  tBTA_HL_DATA *p_data)
2388 {
2389 
2390     tBTA_HL_MCL_CB      *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
2391     tBTA_HL_MDL_CB      *p_dcb;
2392     UINT8              i;
2393 #if BTA_HL_DEBUG == TRUE
2394     APPL_TRACE_DEBUG("bta_hl_cch_mca_disconnect");
2395 #endif
2396 
2397     p_mcb->intentional_close = FALSE;
2398     if (p_data->mca_evt.mca_data.disconnect_ind.reason == L2CAP_DISC_OK)
2399     {
2400         p_mcb->intentional_close = TRUE;
2401     }
2402 
2403     for (i=0; i< BTA_HL_NUM_MDLS_PER_MCL; i++)
2404     {
2405         p_dcb= BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, i);
2406         if (p_dcb->in_use && (p_dcb->dch_state != BTA_HL_DCH_IDLE_ST))
2407         {
2408             if (p_mcb->cch_oper == BTA_HL_CCH_OP_LOCAL_CLOSE )
2409             {
2410                 bta_hl_dch_sm_execute(app_idx, mcl_idx, i, BTA_HL_DCH_CLOSE_CMPL_EVT, p_data);
2411             }
2412             else
2413             {
2414                 bta_hl_dch_sm_execute(app_idx, mcl_idx, i, BTA_HL_MCA_CLOSE_IND_EVT, p_data);
2415             }
2416         }
2417     }
2418     bta_hl_cch_sm_execute(app_idx, mcl_idx, BTA_HL_CCH_CLOSE_CMPL_EVT, p_data);
2419 }
2420 
2421 /*******************************************************************************
2422 **
2423 ** Function         bta_hl_cch_mca_disc_open
2424 **
2425 ** Description      Action routine for disconnect the just opened Control channel
2426 **
2427 ** Returns          void
2428 **
2429 *******************************************************************************/
bta_hl_cch_mca_disc_open(UINT8 app_idx,UINT8 mcl_idx,tBTA_HL_DATA * p_data)2430 void bta_hl_cch_mca_disc_open(UINT8 app_idx, UINT8 mcl_idx,  tBTA_HL_DATA *p_data)
2431 {
2432     tBTA_HL_MCL_CB      *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
2433 
2434 #if BTA_HL_DEBUG == TRUE
2435     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 );
2436 #endif
2437 
2438     p_mcb->close_pending = FALSE;
2439     p_mcb->mcl_handle = p_data->mca_evt.mcl_handle;
2440     bta_hl_cch_mca_close(app_idx, mcl_idx, p_data);
2441 }
2442 
2443 /*******************************************************************************
2444 **
2445 ** Function         bta_hl_cch_mca_rsp_tout
2446 **
2447 ** Description      Action routine for processing the MCAP response timeout
2448 **
2449 ** Returns          void
2450 **
2451 *******************************************************************************/
bta_hl_cch_mca_rsp_tout(UINT8 app_idx,UINT8 mcl_idx,tBTA_HL_DATA * p_data)2452 void bta_hl_cch_mca_rsp_tout(UINT8 app_idx, UINT8 mcl_idx,  tBTA_HL_DATA *p_data)
2453 {
2454 
2455     tBTA_HL_MCL_CB      *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
2456 #if BTA_HL_DEBUG == TRUE
2457     APPL_TRACE_DEBUG("bta_hl_cch_mca_rsp_tout");
2458 #endif
2459 
2460     p_mcb->rsp_tout = TRUE;
2461 
2462     bta_hl_check_cch_close(app_idx,mcl_idx,p_data,TRUE);
2463 }
2464 
2465 /*******************************************************************************
2466 **
2467 ** Function         bta_hl_cch_mca_connect
2468 **
2469 ** Description      Action routine for processing the CCH connect indication
2470 **
2471 ** Returns          void
2472 **
2473 *******************************************************************************/
bta_hl_cch_mca_connect(UINT8 app_idx,UINT8 mcl_idx,tBTA_HL_DATA * p_data)2474 void bta_hl_cch_mca_connect(UINT8 app_idx, UINT8 mcl_idx,  tBTA_HL_DATA *p_data)
2475 {
2476     tBTA_HL_APP_CB      *p_acb  = BTA_HL_GET_APP_CB_PTR(app_idx);
2477     tBTA_HL_MCL_CB      *p_mcb  = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
2478     tBTA_HL             evt_data;
2479     tBTA_HL_EVT         event;
2480     BOOLEAN             send_event=TRUE;
2481 
2482 #if BTA_HL_DEBUG == TRUE
2483     APPL_TRACE_DEBUG("bta_hl_cch_mca_connect mcl_handle=%d ", p_data->mca_evt.mcl_handle);
2484 #endif
2485 
2486     p_mcb->mcl_handle = p_data->mca_evt.mcl_handle;
2487     bdcpy(p_mcb->bd_addr, p_data->mca_evt.mca_data.connect_ind.bd_addr);
2488     p_mcb->cch_mtu = p_data->mca_evt.mca_data.connect_ind.mtu;
2489 
2490     bta_sys_conn_open(BTA_ID_HL, p_acb->app_id, p_mcb->bd_addr);
2491     switch (p_mcb->cch_oper)
2492     {
2493         case BTA_HL_CCH_OP_LOCAL_OPEN:
2494             bta_hl_build_cch_open_cfm(&evt_data, p_mcb->app_id,p_acb->app_handle,
2495                                       p_mcb->mcl_handle,
2496                                       p_mcb->bd_addr,
2497                                       BTA_HL_STATUS_OK);
2498             event = BTA_HL_CCH_OPEN_CFM_EVT;
2499             break;
2500         case BTA_HL_CCH_OP_REMOTE_OPEN:
2501             bta_hl_build_cch_open_ind(&evt_data, p_acb->app_handle,
2502                                       p_mcb->mcl_handle,
2503                                       p_mcb->bd_addr);
2504             event = BTA_HL_CCH_OPEN_IND_EVT;
2505             break;
2506         default:
2507             send_event = FALSE;
2508             break;
2509     }
2510 
2511     p_mcb->cch_oper = BTA_HL_CCH_OP_NONE;
2512     if (send_event) p_acb->p_cback(event,(tBTA_HL *) &evt_data );
2513 }
2514 
2515 /*******************************************************************************
2516 **
2517 ** Function         bta_hl_mcap_ctrl_cback
2518 **
2519 ** Description      MCAP control callback function for HL.
2520 **
2521 ** Returns          void
2522 **
2523 *******************************************************************************/
bta_hl_mcap_ctrl_cback(tMCA_HANDLE handle,tMCA_CL mcl,UINT8 event,tMCA_CTRL * p_data)2524 void bta_hl_mcap_ctrl_cback (tMCA_HANDLE handle, tMCA_CL mcl, UINT8 event,
2525                              tMCA_CTRL *p_data)
2526 {
2527     BOOLEAN send_event=TRUE;
2528     UINT16 mca_event;
2529 
2530 #if (BTA_HL_DEBUG == TRUE)
2531 #if (BT_TRACE_VERBOSE == TRUE)
2532     APPL_TRACE_EVENT("bta_hl_mcap_ctrl_cback event[%s]",bta_hl_mcap_evt_code(event));
2533 #else
2534     APPL_TRACE_EVENT("bta_hl_mcap_ctrl_cback event[0x%02x]", event);
2535 #endif
2536 #endif
2537 
2538     switch (event)
2539     {
2540 
2541         case MCA_CREATE_IND_EVT:
2542             mca_event = (UINT16) BTA_HL_MCA_CREATE_IND_EVT;
2543             break;
2544         case MCA_CREATE_CFM_EVT:
2545             mca_event = (UINT16) BTA_HL_MCA_CREATE_CFM_EVT;
2546             break;
2547         case MCA_RECONNECT_IND_EVT:
2548             mca_event = (UINT16) BTA_HL_MCA_RECONNECT_IND_EVT;
2549             break;
2550         case MCA_RECONNECT_CFM_EVT:
2551             mca_event = (UINT16) BTA_HL_MCA_RECONNECT_CFM_EVT;
2552             break;
2553         case MCA_ABORT_IND_EVT:
2554             mca_event = (UINT16) BTA_HL_MCA_ABORT_IND_EVT;
2555             break;
2556         case MCA_ABORT_CFM_EVT:
2557             mca_event = (UINT16) BTA_HL_MCA_ABORT_CFM_EVT;
2558             break;
2559         case MCA_DELETE_IND_EVT:
2560             mca_event = (UINT16) BTA_HL_MCA_DELETE_IND_EVT;
2561             break;
2562         case MCA_DELETE_CFM_EVT:
2563             mca_event = (UINT16) BTA_HL_MCA_DELETE_CFM_EVT;
2564             break;
2565         case MCA_CONNECT_IND_EVT:
2566             mca_event = (UINT16) BTA_HL_MCA_CONNECT_IND_EVT;
2567             break;
2568         case MCA_DISCONNECT_IND_EVT:
2569             mca_event = (UINT16) BTA_HL_MCA_DISCONNECT_IND_EVT;
2570             break;
2571         case MCA_OPEN_IND_EVT:
2572             mca_event = (UINT16) BTA_HL_MCA_OPEN_IND_EVT;
2573             break;
2574         case MCA_OPEN_CFM_EVT:
2575             mca_event = (UINT16) BTA_HL_MCA_OPEN_CFM_EVT;
2576             break;
2577         case MCA_CLOSE_IND_EVT:
2578             mca_event = (UINT16) BTA_HL_MCA_CLOSE_IND_EVT;
2579             break;
2580         case MCA_CLOSE_CFM_EVT:
2581             mca_event = (UINT16) BTA_HL_MCA_CLOSE_CFM_EVT;
2582             break;
2583         case MCA_CONG_CHG_EVT:
2584             mca_event = (UINT16) BTA_HL_MCA_CONG_CHG_EVT;
2585             break;
2586         case MCA_RSP_TOUT_IND_EVT:
2587             mca_event = (UINT16) BTA_HL_MCA_RSP_TOUT_IND_EVT;
2588             break;
2589         case MCA_ERROR_RSP_EVT:
2590 
2591         default:
2592             send_event=FALSE;
2593             break;
2594     }
2595 
2596     if (send_event) {
2597         tBTA_HL_MCA_EVT * p_msg =
2598             (tBTA_HL_MCA_EVT *)osi_malloc(sizeof(tBTA_HL_MCA_EVT));
2599         p_msg->hdr.event = mca_event;
2600         p_msg->app_handle = (tBTA_HL_APP_HANDLE) handle;
2601         p_msg->mcl_handle = (tBTA_HL_MCL_HANDLE) mcl;
2602         memcpy(&p_msg->mca_data, p_data, sizeof(tMCA_CTRL));
2603         bta_sys_sendmsg(p_msg);
2604     }
2605 }
2606 
2607 /*******************************************************************************
2608 **
2609 ** Function         bta_hl_mcap_data_cback
2610 **
2611 ** Description      MCAP data callback function for HL.
2612 **
2613 ** Returns          void
2614 **
2615 *******************************************************************************/
bta_hl_mcap_data_cback(tMCA_DL mdl,BT_HDR * p_pkt)2616 void bta_hl_mcap_data_cback (tMCA_DL mdl, BT_HDR *p_pkt)
2617 {
2618     UINT8 app_idx, mcl_idx, mdl_idx;
2619     if (bta_hl_find_mdl_idx_using_handle ((tBTA_HL_MDL_HANDLE)mdl, &app_idx, &mcl_idx, &mdl_idx))
2620     {
2621         tBTA_HL_MCA_RCV_DATA_EVT *p_msg =
2622             (tBTA_HL_MCA_RCV_DATA_EVT *)osi_malloc(sizeof(tBTA_HL_MCA_RCV_DATA_EVT));
2623         p_msg->hdr.event = BTA_HL_MCA_RCV_DATA_EVT;
2624         p_msg->app_idx = app_idx;
2625         p_msg->mcl_idx = mcl_idx;
2626         p_msg->mdl_idx = mdl_idx;
2627         p_msg->p_pkt = p_pkt;
2628         bta_sys_sendmsg(p_msg);
2629     }
2630 }
2631 
2632 /*****************************************************************************
2633 **  Debug Functions
2634 *****************************************************************************/
2635 #if (BTA_HL_DEBUG == TRUE && BT_TRACE_VERBOSE == TRUE)
2636 
2637 /*******************************************************************************
2638 **
2639 ** Function         bta_hl_mcap_evt_code
2640 **
2641 ** Description      get the MCAP event string pointer
2642 **
2643 ** Returns          char * - event string pointer
2644 **
2645 *******************************************************************************/
bta_hl_mcap_evt_code(UINT8 evt_code)2646 static char *bta_hl_mcap_evt_code(UINT8 evt_code)
2647 {
2648 
2649     switch (evt_code)
2650     {
2651 
2652         case MCA_ERROR_RSP_EVT:
2653             return "MCA_ERROR_RSP_EVT";
2654         case MCA_CREATE_IND_EVT:
2655             return "MCA_CREATE_IND_EVT";
2656         case MCA_CREATE_CFM_EVT:
2657             return "MCA_CREATE_CFM_EVT";
2658         case MCA_RECONNECT_IND_EVT:
2659             return "MCA_RECONNECT_IND_EVT";
2660         case MCA_RECONNECT_CFM_EVT:
2661             return "MCA_RECONNECT_CFM_EVT";
2662         case MCA_ABORT_IND_EVT:
2663             return "MCA_ABORT_IND_EVT";
2664         case MCA_ABORT_CFM_EVT:
2665             return "MCA_ABORT_CFM_EVT";
2666         case MCA_DELETE_IND_EVT:
2667             return "MCA_DELETE_IND_EVT";
2668         case MCA_DELETE_CFM_EVT:
2669             return "MCA_DELETE_CFM_EVT";
2670 
2671         case MCA_CONNECT_IND_EVT:
2672             return "MCA_CONNECT_IND_EVT";
2673         case MCA_DISCONNECT_IND_EVT:
2674             return "MCA_DISCONNECT_IND_EVT";
2675         case MCA_OPEN_IND_EVT:
2676             return "MCA_OPEN_IND_EVT";
2677         case MCA_OPEN_CFM_EVT:
2678             return "MCA_OPEN_CFM_EVT";
2679         case MCA_CLOSE_IND_EVT:
2680             return "MCA_CLOSE_IND_EVT";
2681         case MCA_CLOSE_CFM_EVT:
2682             return "MCA_CLOSE_CFM_EVT";
2683         case MCA_CONG_CHG_EVT:
2684             return "MCA_CONG_CHG_EVT";
2685         case MCA_RSP_TOUT_IND_EVT:
2686             return "MCA_RSP_TOUT_IND_EVT";
2687         default:
2688             return "Unknown MCAP event code";
2689     }
2690 }
2691 
2692 
2693 /*******************************************************************************
2694 **
2695 ** Function         bta_hl_cback_evt_code
2696 **
2697 ** Description      get the HDP event string pointer
2698 **
2699 ** Returns          char * - event string pointer
2700 **
2701 *******************************************************************************/
bta_hl_cback_evt_code(UINT8 evt_code)2702 static char *bta_hl_cback_evt_code(UINT8 evt_code)
2703 {
2704 
2705     switch (evt_code)
2706     {
2707 
2708         case BTA_HL_CCH_OPEN_IND_EVT:
2709             return "BTA_HL_CCH_OPEN_IND_EVT";
2710         case BTA_HL_CCH_OPEN_CFM_EVT:
2711             return "BTA_HL_CCH_OPEN_CFM_EVT";
2712         case BTA_HL_CCH_CLOSE_IND_EVT:
2713             return "BTA_HL_CCH_CLOSE_IND_EVT";
2714         case     BTA_HL_CCH_CLOSE_CFM_EVT:
2715             return "BTA_HL_CCH_CLOSE_CFM_EVT";
2716         case BTA_HL_DCH_OPEN_IND_EVT:
2717             return "BTA_HL_DCH_OPEN_IND_EVT";
2718         case BTA_HL_DCH_OPEN_CFM_EVT:
2719             return "BTA_HL_DCH_OPEN_CFM_EVT";
2720         case BTA_HL_DCH_CLOSE_IND_EVT:
2721             return "BTA_HL_DCH_CLOSE_IND_EVT";
2722         case BTA_HL_DCH_CLOSE_CFM_EVT:
2723             return "BTA_HL_DCH_CLOSE_CFM_EVT";
2724         case BTA_HL_DCH_RCV_DATA_IND_EVT:
2725             return "BTA_HL_DCH_RCV_DATA_IND_EVT";
2726         case BTA_HL_REGISTER_CFM_EVT:
2727             return "BTA_HL_REGISTER_CFM_EVT";
2728         case BTA_HL_DEREGISTER_CFM_EVT:
2729             return "BTA_HL_DEREGISTER_CFM_EVT";
2730         case BTA_HL_DCH_RECONNECT_CFM_EVT:
2731             return "BTA_HL_DCH_RECONNECT_CFM_EVT";
2732         case BTA_HL_DCH_RECONNECT_IND_EVT:
2733             return "BTA_HL_DCH_RECONNECT_IND_EVT";
2734         case BTA_HL_DCH_ECHO_TEST_CFM_EVT:
2735             return "BTA_HL_DCH_ECHO_TEST_CFM_EVT";
2736         case BTA_HL_SDP_QUERY_CFM_EVT:
2737             return "BTA_HL_SDP_QUERY_CFM_EVT";
2738         case BTA_HL_CONG_CHG_IND_EVT:
2739             return "BTA_HL_CONG_CHG_IND_EVT";
2740         case BTA_HL_DCH_CREATE_IND_EVT:
2741             return "BTA_HL_DCH_CREATE_IND_EVT";
2742         case BTA_HL_DELETE_MDL_IND_EVT:
2743             return "BTA_HL_DELETE_MDL_IND_EVT";
2744         case BTA_HL_DELETE_MDL_CFM_EVT:
2745             return "BTA_HL_DELETE_MDL_CFM_EVT";
2746         case BTA_HL_DCH_ABORT_IND_EVT:
2747             return "BTA_HL_DCH_ABORT_IND_EVT";
2748         case BTA_HL_DCH_ABORT_CFM_EVT:
2749             return "BTA_HL_DCH_ABORT_CFM_EVT";
2750         default:
2751             return "Unknown HDP event code";
2752     }
2753 }
2754 
2755 
2756 
2757 /*******************************************************************************
2758 **
2759 ** Function         bta_hl_dch_oper_code
2760 **
2761 ** Description      Get the DCH operation string
2762 **
2763 ** Returns          char * - DCH operation string pointer
2764 **
2765 *******************************************************************************/
bta_hl_dch_oper_code(tBTA_HL_DCH_OPER oper_code)2766 static char *bta_hl_dch_oper_code(tBTA_HL_DCH_OPER oper_code)
2767 {
2768 
2769     switch (oper_code)
2770     {
2771         case BTA_HL_DCH_OP_NONE:
2772             return "BTA_HL_DCH_OP_NONE";
2773         case BTA_HL_DCH_OP_REMOTE_CREATE:
2774             return "BTA_HL_DCH_OP_REMOTE_CREATE";
2775         case BTA_HL_DCH_OP_LOCAL_OPEN:
2776             return "BTA_HL_DCH_OP_LOCAL_OPEN";
2777         case BTA_HL_DCH_OP_REMOTE_OPEN:
2778             return "BTA_HL_DCH_OP_REMOTE_OPEN";
2779         case BTA_HL_DCH_OP_LOCAL_CLOSE:
2780             return "BTA_HL_DCH_OP_LOCAL_CLOSE";
2781         case BTA_HL_DCH_OP_REMOTE_CLOSE:
2782             return "BTA_HL_DCH_OP_REMOTE_CLOSE";
2783         case BTA_HL_DCH_OP_LOCAL_DELETE:
2784             return "BTA_HL_DCH_OP_LOCAL_DELETE";
2785         case BTA_HL_DCH_OP_REMOTE_DELETE:
2786             return "BTA_HL_DCH_OP_REMOTE_DELETE";
2787         case BTA_HL_DCH_OP_LOCAL_RECONNECT:
2788             return "BTA_HL_DCH_OP_LOCAL_RECONNECT";
2789         case BTA_HL_DCH_OP_REMOTE_RECONNECT:
2790             return "BTA_HL_DCH_OP_REMOTE_RECONNECT";
2791         case BTA_HL_DCH_OP_LOCAL_CLOSE_ECHO_TEST:
2792             return "BTA_HL_DCH_OP_LOCAL_CLOSE_ECHO_TEST";
2793         case BTA_HL_DCH_OP_LOCAL_CLOSE_RECONNECT:
2794             return "BTA_HL_DCH_OP_LOCAL_CLOSE_RECONNECT";
2795         default:
2796             return "Unknown DCH oper code";
2797     }
2798 }
2799 
2800 
2801 #endif  /* Debug Functions */
2802 #endif /* HL_INCLUDED */
2803