blob: 8e5a4a7f9f04955f70ae0adb2afe0e41ccd5e732 [file] [log] [blame]
The Android Open Source Project5738f832012-12-12 16:00:35 -08001/******************************************************************************
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 implements utility functions for the HeaLth device profile
22 * (HL).
23 *
24 ******************************************************************************/
25
26#include <stdio.h>
27#include <string.h>
28
29#include "bt_target.h"
30#if defined(HL_INCLUDED) && (HL_INCLUDED == TRUE)
31
32
Pavlin Radoslavov258c2532015-09-27 20:59:05 -070033#include "bt_common.h"
The Android Open Source Project5738f832012-12-12 16:00:35 -080034#include "utl.h"
The Android Open Source Project5738f832012-12-12 16:00:35 -080035#include "bta_hl_int.h"
36#include "bta_hl_co.h"
37#include "mca_defs.h"
38#include "mca_api.h"
39
40
41/*******************************************************************************
42**
43** Function bta_hl_set_ctrl_psm_for_dch
44**
45** Description This function set the control PSM for the DCH setup
46**
47** Returns BOOLEAN - TRUE - control PSM setting is successful
48*******************************************************************************/
49BOOLEAN bta_hl_set_ctrl_psm_for_dch(UINT8 app_idx, UINT8 mcl_idx,
50 UINT8 mdl_idx, UINT16 ctrl_psm)
51{
52 tBTA_HL_MCL_CB *p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
53 BOOLEAN success = TRUE, update_ctrl_psm = FALSE;
Mike J. Chen5cd8bff2014-01-31 18:16:59 -080054 UNUSED(mdl_idx);
The Android Open Source Project5738f832012-12-12 16:00:35 -080055
56 if (p_mcb->sdp.num_recs)
57 {
58 if (p_mcb->ctrl_psm != ctrl_psm)
59 {
60 /* can not use a different ctrl PSM than the current one*/
61 success = FALSE;
62 }
63 }
64 else
65 {
66 /* No SDP info control i.e. channel was opened by the peer */
67 update_ctrl_psm = TRUE;
68 }
69
70 if (success && update_ctrl_psm)
71 {
72 p_mcb->ctrl_psm = ctrl_psm;
73 }
74
75
76#if BTA_HL_DEBUG == TRUE
77 if (!success)
78 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -070079 APPL_TRACE_DEBUG("bta_hl_set_ctrl_psm_for_dch num_recs=%d success=%d update_ctrl_psm=%d ctrl_psm=0x%x ",
The Android Open Source Project5738f832012-12-12 16:00:35 -080080 p_mcb->sdp.num_recs, success, update_ctrl_psm, ctrl_psm );
81 }
82#endif
83
84 return success;
85}
86
87
88/*******************************************************************************
89**
90** Function bta_hl_find_sdp_idx_using_ctrl_psm
91**
92** Description
93**
Pavlin Radoslavov70ae7de2015-09-23 14:49:24 -070094** Returns TRUE if found
The Android Open Source Project5738f832012-12-12 16:00:35 -080095**
96*******************************************************************************/
97BOOLEAN bta_hl_find_sdp_idx_using_ctrl_psm(tBTA_HL_SDP *p_sdp,
98 UINT16 ctrl_psm,
99 UINT8 *p_sdp_idx)
100{
101 BOOLEAN found=FALSE;
102 tBTA_HL_SDP_REC *p_rec;
103 UINT8 i;
104
105 if (ctrl_psm != 0)
106 {
107 for (i=0; i<p_sdp->num_recs; i++)
108 {
109 p_rec = &p_sdp->sdp_rec[i];
110 if (p_rec->ctrl_psm == ctrl_psm)
111 {
112 *p_sdp_idx = i;
113 found = TRUE;
114 break;
115 }
116 }
117 }
118 else
119 {
120 *p_sdp_idx = 0;
121 found = TRUE;
122 }
123
124#if BTA_HL_DEBUG == TRUE
125 if (!found)
126 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700127 APPL_TRACE_DEBUG("bta_hl_find_sdp_idx_using_ctrl_psm found=%d sdp_idx=%d ctrl_psm=0x%x ",
The Android Open Source Project5738f832012-12-12 16:00:35 -0800128 found, *p_sdp_idx, ctrl_psm );
129 }
130#endif
131 return found;
132}
133
134/*******************************************************************************
135**
Pavlin Radoslavov1d5b8592015-09-23 10:08:20 -0700136** Function bta_hl_set_user_tx_buf_size
The Android Open Source Project5738f832012-12-12 16:00:35 -0800137**
Pavlin Radoslavov1d5b8592015-09-23 10:08:20 -0700138** Description This function sets the user tx buffer size
The Android Open Source Project5738f832012-12-12 16:00:35 -0800139**
Pavlin Radoslavov1d5b8592015-09-23 10:08:20 -0700140** Returns UINT16 buf_size
The Android Open Source Project5738f832012-12-12 16:00:35 -0800141**
142*******************************************************************************/
143
Pavlin Radoslavov1d5b8592015-09-23 10:08:20 -0700144UINT16 bta_hl_set_user_tx_buf_size(UINT16 max_tx_size)
The Android Open Source Project5738f832012-12-12 16:00:35 -0800145{
Pavlin Radoslavov70ae7de2015-09-23 14:49:24 -0700146 if (max_tx_size > BT_DEFAULT_BUFFER_SIZE)
Pavlin Radoslavov1d5b8592015-09-23 10:08:20 -0700147 return BTA_HL_LRG_DATA_BUF_SIZE;
148 return L2CAP_INVALID_ERM_BUF_SIZE;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800149}
150
151/*******************************************************************************
152**
Pavlin Radoslavov1d5b8592015-09-23 10:08:20 -0700153** Function bta_hl_set_user_rx_buf_size
The Android Open Source Project5738f832012-12-12 16:00:35 -0800154**
Pavlin Radoslavov1d5b8592015-09-23 10:08:20 -0700155** Description This function sets the user rx buffer size
The Android Open Source Project5738f832012-12-12 16:00:35 -0800156**
Pavlin Radoslavov1d5b8592015-09-23 10:08:20 -0700157** Returns UINT16 buf_size
The Android Open Source Project5738f832012-12-12 16:00:35 -0800158**
159*******************************************************************************/
160
Pavlin Radoslavov1d5b8592015-09-23 10:08:20 -0700161UINT16 bta_hl_set_user_rx_buf_size(UINT16 mtu)
The Android Open Source Project5738f832012-12-12 16:00:35 -0800162{
Pavlin Radoslavov70ae7de2015-09-23 14:49:24 -0700163 if (mtu > BT_DEFAULT_BUFFER_SIZE)
Pavlin Radoslavov1d5b8592015-09-23 10:08:20 -0700164 return BTA_HL_LRG_DATA_BUF_SIZE;
165 return L2CAP_INVALID_ERM_BUF_SIZE;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800166}
167
168
169
170/*******************************************************************************
171**
172** Function bta_hl_set_tx_win_size
173**
174** Description This function sets the tx window size
175**
176** Returns UINT8 tx_win_size
177**
178*******************************************************************************/
179UINT8 bta_hl_set_tx_win_size(UINT16 mtu, UINT16 mps)
180{
181 UINT8 tx_win_size;
182
183 if (mtu <= mps)
184 {
185 tx_win_size =1;
186 }
187 else
188 {
189 if (mps > 0)
190 {
191 tx_win_size = (mtu/mps)+1;
192 }
193 else
194 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700195 APPL_TRACE_ERROR("The MPS is zero");
The Android Open Source Project5738f832012-12-12 16:00:35 -0800196 tx_win_size = 10;
197 }
198 }
199
200#if BTA_HL_DEBUG == TRUE
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700201 APPL_TRACE_DEBUG("bta_hl_set_tx_win_size win_size=%d mtu=%d mps=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -0800202 tx_win_size, mtu, mps);
203#endif
204 return tx_win_size;
205}
206
207/*******************************************************************************
208**
209** Function bta_hl_set_mps
210**
211** Description This function sets the MPS
212**
213** Returns UINT16 MPS
214**
215*******************************************************************************/
216UINT16 bta_hl_set_mps(UINT16 mtu)
217{
218 UINT16 mps;
219 if (mtu > BTA_HL_L2C_MPS)
220 {
221 mps = BTA_HL_L2C_MPS;
222 }
223 else
224 {
225 mps = mtu;
226 }
227#if BTA_HL_DEBUG == TRUE
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700228 APPL_TRACE_DEBUG("bta_hl_set_mps mps=%d mtu=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -0800229 mps, mtu);
230#endif
231 return mps;
232}
233
234
235/*******************************************************************************
236**
237** Function bta_hl_clean_mdl_cb
238**
239** Description This function clean up the specified MDL control block
240**
241** Returns void
242**
243*******************************************************************************/
244void bta_hl_clean_mdl_cb(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx)
245{
246 tBTA_HL_MDL_CB *p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
247#if BTA_HL_DEBUG == TRUE
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700248 APPL_TRACE_DEBUG("bta_hl_clean_mdl_cb app_idx=%d mcl_idx=%d mdl_idx=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -0800249 app_idx, mcl_idx, mdl_idx);
250#endif
Pavlin Radoslavovcceb4302016-02-05 13:54:43 -0800251 osi_free_and_reset((void **)&p_dcb->p_tx_pkt);
252 osi_free_and_reset((void **)&p_dcb->p_rx_pkt);
253 osi_free_and_reset((void **)&p_dcb->p_echo_tx_pkt);
254 osi_free_and_reset((void **)&p_dcb->p_echo_rx_pkt);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800255
256 memset((void *)p_dcb, 0 , sizeof(tBTA_HL_MDL_CB));
257}
258
259
260/*******************************************************************************
261**
262** Function bta_hl_get_buf
263**
264** Description This function allocate a buffer based on the specified data size
265**
266** Returns BT_HDR *.
267**
268*******************************************************************************/
Jacob Lee4d7575b2015-09-11 14:06:48 +0800269BT_HDR * bta_hl_get_buf(UINT16 data_size, BOOLEAN fcs_use)
The Android Open Source Project5738f832012-12-12 16:00:35 -0800270{
Pavlin Radoslavov717a4a92016-02-06 08:36:06 -0800271 size_t size = data_size + L2CAP_MIN_OFFSET + BT_HDR_SIZE;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800272
Jacob Lee4d7575b2015-09-11 14:06:48 +0800273 if (fcs_use)
Jacob Lee4d7575b2015-09-11 14:06:48 +0800274 size += L2CAP_FCS_LEN;
Jacob Lee4d7575b2015-09-11 14:06:48 +0800275
Pavlin Radoslavov717a4a92016-02-06 08:36:06 -0800276 BT_HDR *p_new = (BT_HDR *)osi_malloc(size);
277 p_new->len = data_size;
278 p_new->offset = L2CAP_MIN_OFFSET;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800279
280 return p_new;
281}
282
283/*******************************************************************************
284**
285** Function bta_hl_find_service_in_db
286**
287** Description This function check the specified service class(es) can be find in
288** the received SDP database
289**
290** Returns BOOLEAN TRUE - found
291** FALSE - not found
292**
293*******************************************************************************/
294BOOLEAN bta_hl_find_service_in_db( UINT8 app_idx, UINT8 mcl_idx,
295 UINT16 service_uuid,
296 tSDP_DISC_REC **pp_rec )
297{
298 tBTA_HL_MCL_CB *p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
299 BOOLEAN found = TRUE;
300
301 switch (service_uuid)
302 {
303 case UUID_SERVCLASS_HDP_SINK:
304 case UUID_SERVCLASS_HDP_SOURCE:
305 if ((*pp_rec = SDP_FindServiceInDb(p_mcb->p_db, service_uuid,
306 *pp_rec)) == NULL)
307 {
308 found = FALSE;
309 }
310 break;
311 default:
312 if (((*pp_rec = bta_hl_find_sink_or_src_srv_class_in_db(p_mcb->p_db,
313 *pp_rec)) == NULL))
314 {
315 found = FALSE;
316 }
317 break;
318 }
319 return found;
320}
321
322/*******************************************************************************
323**
324** Function bta_hl_get_service_uuids
325**
326**
327** Description This function finds the service class(es) for both CCH and DCH oeprations
328**
329** Returns UINT16 - service_id
330** if service_uuid = 0xFFFF then it means service uuid
331** can be either Sink or Source
332**
333*******************************************************************************/
334UINT16 bta_hl_get_service_uuids(UINT8 sdp_oper, UINT8 app_idx, UINT8 mcl_idx,
335 UINT8 mdl_idx )
336{
337 tBTA_HL_MDL_CB *p_dcb;
338 UINT16 service_uuid = 0xFFFF; /* both Sink and Source */
339
340 switch (sdp_oper)
341 {
342
343 case BTA_HL_SDP_OP_DCH_OPEN_INIT:
344 case BTA_HL_SDP_OP_DCH_RECONNECT_INIT:
345 p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
346 if (p_dcb->local_mdep_id != BTA_HL_ECHO_TEST_MDEP_ID)
347 {
348 if (p_dcb->peer_mdep_role == BTA_HL_MDEP_ROLE_SINK)
349 {
350 service_uuid = UUID_SERVCLASS_HDP_SINK;
351 }
352 else
353 {
354 service_uuid = UUID_SERVCLASS_HDP_SOURCE;
355 }
356 }
357 break;
358 case BTA_HL_SDP_OP_CCH_INIT:
359 default:
360 /* use default that is both Sink and Source */
361 break;
362 }
363#if BTA_HL_DEBUG == TRUE
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700364 APPL_TRACE_DEBUG("bta_hl_get_service_uuids service_uuid=0x%x",service_uuid );
The Android Open Source Project5738f832012-12-12 16:00:35 -0800365#endif
366 return service_uuid;
367}
368
369/*******************************************************************************
370**
371** Function bta_hl_find_echo_cfg_rsp
372**
373**
374** Description This function finds the configuration response for the echo test
375**
376** Returns BOOLEAN - TRUE found
377** FALSE not found
378**
379*******************************************************************************/
380BOOLEAN bta_hl_find_echo_cfg_rsp(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdep_idx, UINT8 cfg,
381 UINT8 *p_cfg_rsp)
382{
383 tBTA_HL_APP_CB *p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
384 tBTA_HL_MDEP *p_mdep= &p_acb->sup_feature.mdep[mdep_idx];
385 BOOLEAN status =TRUE;
386
387 if (p_mdep->mdep_id == BTA_HL_ECHO_TEST_MDEP_ID)
388 {
389 if ((cfg == BTA_HL_DCH_CFG_RELIABLE) || (cfg == BTA_HL_DCH_CFG_STREAMING))
390 {
391 *p_cfg_rsp = cfg;
392 }
393 else if (cfg == BTA_HL_DCH_CFG_NO_PREF )
394 {
395 *p_cfg_rsp = BTA_HL_DEFAULT_ECHO_TEST_SRC_DCH_CFG;
396 }
397 else
398 {
399 status = FALSE;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700400 APPL_TRACE_ERROR("Inavlid echo cfg value");
The Android Open Source Project5738f832012-12-12 16:00:35 -0800401 }
402 return status;
403 }
404
405#if BTA_HL_DEBUG == TRUE
406 if (!status)
407 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700408 APPL_TRACE_DEBUG("bta_hl_find_echo_cfg_rsp status=failed app_idx=%d mcl_idx=%d mdep_idx=%d cfg=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -0800409 app_idx, mcl_idx, mdep_idx, cfg);
410 }
411#endif
412
413 return status;
414}
415
416/*******************************************************************************
417**
418** Function bta_hl_validate_dch_cfg
419**
420** Description This function validate the DCH configuration
421**
422** Returns BOOLEAN - TRUE cfg is valid
423** FALSE not valid
424**
425*******************************************************************************/
426BOOLEAN bta_hl_validate_cfg(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx,
427 UINT8 cfg)
428{
429 tBTA_HL_MDL_CB *p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
430 BOOLEAN is_valid =FALSE;
431
432
433 if (!bta_hl_is_the_first_reliable_existed(app_idx, mcl_idx) &&
434 (cfg != BTA_HL_DCH_CFG_RELIABLE))
435 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700436 APPL_TRACE_ERROR("the first DCH should be a reliable channel");
The Android Open Source Project5738f832012-12-12 16:00:35 -0800437 return is_valid;
438 }
439
440 switch (p_dcb->local_cfg)
441 {
442 case BTA_HL_DCH_CFG_NO_PREF:
443
444 if ((cfg == BTA_HL_DCH_CFG_RELIABLE) || (cfg == BTA_HL_DCH_CFG_STREAMING))
445 {
446 is_valid = TRUE;
447 }
448 break;
449 case BTA_HL_DCH_CFG_RELIABLE:
450 case BTA_HL_DCH_CFG_STREAMING:
451 if (p_dcb->local_cfg == cfg )
452 {
453 is_valid = TRUE;
454 }
455 break;
456 default:
457 break;
458 }
459
460#if BTA_HL_DEBUG == TRUE
461 if (!is_valid)
462 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700463 APPL_TRACE_DEBUG("bta_hl_validate_dch_open_cfg is_valid=%d, cfg=%d", is_valid, cfg );
The Android Open Source Project5738f832012-12-12 16:00:35 -0800464 }
465#endif
466 return is_valid;
467}
468
469/*******************************************************************************
470**
471** Function bta_hl_find_cch_cb_indexes
472**
473** Description This function finds the indexes needed for the CCH state machine
474**
475** Returns BOOLEAN - TRUE found
476** FALSE not found
477**
478*******************************************************************************/
479BOOLEAN bta_hl_find_cch_cb_indexes(tBTA_HL_DATA *p_msg,
480 UINT8 *p_app_idx,
481 UINT8 *p_mcl_idx)
482{
483 BOOLEAN found = FALSE;
484 tBTA_HL_MCL_CB *p_mcb;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800485 UINT8 app_idx = 0, mcl_idx = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800486
487 switch (p_msg->hdr.event)
488 {
489 case BTA_HL_CCH_SDP_OK_EVT:
490 case BTA_HL_CCH_SDP_FAIL_EVT:
491 app_idx = p_msg->cch_sdp.app_idx;
492 mcl_idx = p_msg->cch_sdp.mcl_idx;
493 found = TRUE;
494 break;
495
496 case BTA_HL_MCA_CONNECT_IND_EVT:
497
498 if (bta_hl_find_app_idx_using_handle(p_msg->mca_evt.app_handle, &app_idx))
499 {
500 if (bta_hl_find_mcl_idx(app_idx, p_msg->mca_evt.mca_data.connect_ind.bd_addr, &mcl_idx))
501 {
502 /* local initiated */
503 found = TRUE;
504 }
505 else if (!bta_hl_find_mcl_idx_using_handle(p_msg->mca_evt.mcl_handle, &app_idx, &mcl_idx)&&
506 bta_hl_find_avail_mcl_idx(app_idx, &mcl_idx))
507 {
508 /* remote initiated */
509 p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
510 p_mcb->in_use = TRUE;
511 p_mcb->cch_oper = BTA_HL_CCH_OP_REMOTE_OPEN;
512 found = TRUE;
513 }
514 }
515 break;
516
517 case BTA_HL_MCA_DISCONNECT_IND_EVT:
518
519 if (bta_hl_find_mcl_idx_using_handle(p_msg->mca_evt.mcl_handle, &app_idx, &mcl_idx))
520 {
521 found = TRUE;
522 }
523 else if (bta_hl_find_app_idx_using_handle(p_msg->mca_evt.app_handle, &app_idx) &&
524 bta_hl_find_mcl_idx(app_idx, p_msg->mca_evt.mca_data.disconnect_ind.bd_addr, &mcl_idx))
525 {
526 found = TRUE;
527 }
528
529 if (found)
530 {
531 p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800532 if ((p_mcb->cch_oper != BTA_HL_CCH_OP_LOCAL_CLOSE) && (p_mcb->cch_oper != BTA_HL_CCH_OP_LOCAL_OPEN) )
The Android Open Source Project5738f832012-12-12 16:00:35 -0800533 {
534 p_mcb->cch_oper = BTA_HL_CCH_OP_REMOTE_CLOSE;
535 }
536 }
537 break;
538
539 case BTA_HL_MCA_RSP_TOUT_IND_EVT:
540
541 if (bta_hl_find_mcl_idx_using_handle(p_msg->mca_evt.mcl_handle, &app_idx, &mcl_idx))
542 {
543 found = TRUE;
544 }
545
546 if (found)
547 {
548 p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800549 if ((p_mcb->cch_oper != BTA_HL_CCH_OP_REMOTE_CLOSE) && (p_mcb->cch_oper != BTA_HL_CCH_OP_LOCAL_OPEN))
The Android Open Source Project5738f832012-12-12 16:00:35 -0800550 {
551 p_mcb->cch_oper = BTA_HL_CCH_OP_LOCAL_CLOSE;
552 }
553 }
554 break;
555 default:
556 break;
557 }
558
559
560 if (found)
561 {
562 *p_app_idx = app_idx;
563 *p_mcl_idx = mcl_idx;
564 }
565
566#if BTA_HL_DEBUG == TRUE
567 if (!found)
568 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700569 APPL_TRACE_DEBUG("bta_hl_find_cch_cb_indexes event=%s found=%d app_idx=%d mcl_idx=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -0800570 bta_hl_evt_code(p_msg->hdr.event), found, app_idx, mcl_idx);
571 }
572#endif
573
574 return found;
575}
576
577/*******************************************************************************
578**
579** Function bta_hl_find_dch_cb_indexes
580**
581** Description This function finds the indexes needed for the DCH state machine
582**
583** Returns BOOLEAN - TRUE found
584** FALSE not found
585**
586*******************************************************************************/
587BOOLEAN bta_hl_find_dch_cb_indexes(tBTA_HL_DATA *p_msg,
588 UINT8 *p_app_idx,
589 UINT8 *p_mcl_idx,
590 UINT8 *p_mdl_idx)
591{
592 BOOLEAN found = FALSE;
593 tBTA_HL_MCL_CB *p_mcb;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800594 UINT8 app_idx = 0, mcl_idx = 0, mdl_idx = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800595
596 switch (p_msg->hdr.event)
597 {
598 case BTA_HL_MCA_CREATE_CFM_EVT:
599 if (bta_hl_find_mcl_idx_using_handle(p_msg->mca_evt.mcl_handle, &app_idx, &mcl_idx) &&
600 bta_hl_find_mdl_idx( app_idx, mcl_idx, p_msg->mca_evt.mca_data.create_cfm.mdl_id, &mdl_idx))
601 {
602 found = TRUE;
603 }
604 break;
605
606 case BTA_HL_MCA_CREATE_IND_EVT:
607 case BTA_HL_MCA_RECONNECT_IND_EVT:
608 if (bta_hl_find_mcl_idx_using_handle(p_msg->mca_evt.mcl_handle, &app_idx, &mcl_idx) &&
609 bta_hl_find_avail_mdl_idx( app_idx, mcl_idx, &mdl_idx))
610 {
611 found = TRUE;
612 }
613 break;
614
615 case BTA_HL_MCA_OPEN_CFM_EVT:
616 if (bta_hl_find_mcl_idx_using_handle(p_msg->mca_evt.mcl_handle, &app_idx, &mcl_idx) &&
617 bta_hl_find_mdl_idx( app_idx, mcl_idx, p_msg->mca_evt.mca_data.open_cfm.mdl_id, &mdl_idx))
618 {
619 found = TRUE;
620 }
621 break;
622
623 case BTA_HL_MCA_OPEN_IND_EVT:
624 if (bta_hl_find_mcl_idx_using_handle(p_msg->mca_evt.mcl_handle, &app_idx, &mcl_idx) &&
625 bta_hl_find_mdl_idx( app_idx, mcl_idx, p_msg->mca_evt.mca_data.open_ind.mdl_id, &mdl_idx))
626 {
627 found = TRUE;
628 }
629 break;
630
631 case BTA_HL_MCA_CLOSE_CFM_EVT:
632
633 if (bta_hl_find_mdl_idx_using_handle((tBTA_HL_MDL_HANDLE)p_msg->mca_evt.mca_data.close_cfm.mdl,
634 &app_idx, &mcl_idx, &mdl_idx))
635 {
636 found = TRUE;
637 }
638 break;
639 case BTA_HL_MCA_CLOSE_IND_EVT:
640
641 if (bta_hl_find_mdl_idx_using_handle((tBTA_HL_MDL_HANDLE)p_msg->mca_evt.mca_data.close_ind.mdl,
642 &app_idx, &mcl_idx, &mdl_idx))
643 {
644 found = TRUE;
645 }
646 break;
647 case BTA_HL_API_SEND_DATA_EVT:
648
649 if (bta_hl_find_mdl_idx_using_handle(p_msg->api_send_data.mdl_handle,
650 &app_idx, &mcl_idx, &mdl_idx ))
651 {
652 found = TRUE;
653 }
654
655 break;
656
657 case BTA_HL_MCA_CONG_CHG_EVT:
658
659 if (bta_hl_find_mdl_idx_using_handle((tBTA_HL_MDL_HANDLE)p_msg->mca_evt.mca_data.cong_chg.mdl,
660 &app_idx, &mcl_idx, &mdl_idx ))
661 {
662 found = TRUE;
663 }
664
665 break;
666
667 case BTA_HL_MCA_RCV_DATA_EVT:
668 app_idx = p_msg->mca_rcv_data_evt.app_idx;
669 mcl_idx = p_msg->mca_rcv_data_evt.mcl_idx;
670 mdl_idx = p_msg->mca_rcv_data_evt.mdl_idx;
671 found = TRUE;
672 break;
673 case BTA_HL_DCH_RECONNECT_EVT:
674 case BTA_HL_DCH_OPEN_EVT:
675 case BTA_HL_DCH_ECHO_TEST_EVT:
676 case BTA_HL_DCH_SDP_FAIL_EVT:
677 app_idx = p_msg->dch_sdp.app_idx;
678 mcl_idx = p_msg->dch_sdp.mcl_idx;
679 mdl_idx = p_msg->dch_sdp.mdl_idx;
680 found = TRUE;
681 break;
682 case BTA_HL_MCA_RECONNECT_CFM_EVT:
683 if (bta_hl_find_mcl_idx_using_handle(p_msg->mca_evt.mcl_handle, &app_idx, &mcl_idx) &&
684 bta_hl_find_mdl_idx( app_idx, mcl_idx, p_msg->mca_evt.mca_data.reconnect_cfm.mdl_id, &mdl_idx))
685 {
686 found = TRUE;
687 }
688 break;
689
690
691 case BTA_HL_API_DCH_CREATE_RSP_EVT:
692 if (bta_hl_find_mcl_idx_using_handle(p_msg->api_dch_create_rsp.mcl_handle, &app_idx, &mcl_idx)&&
693 bta_hl_find_mdl_idx( app_idx, mcl_idx,p_msg->api_dch_create_rsp.mdl_id, &mdl_idx))
694 {
695 found = TRUE;
696 }
697 break;
698 case BTA_HL_MCA_ABORT_IND_EVT:
699 if (bta_hl_find_mcl_idx_using_handle(p_msg->mca_evt.mcl_handle, &app_idx, &mcl_idx) &&
700 bta_hl_find_mdl_idx( app_idx, mcl_idx,p_msg->mca_evt.mca_data.abort_ind.mdl_id, &mdl_idx))
701 {
702 found = TRUE;
703 }
704 break;
705 case BTA_HL_MCA_ABORT_CFM_EVT:
706 if (bta_hl_find_mcl_idx_using_handle(p_msg->mca_evt.mcl_handle, &app_idx, &mcl_idx) &&
707 bta_hl_find_mdl_idx( app_idx, mcl_idx, p_msg->mca_evt.mca_data.abort_cfm.mdl_id, &mdl_idx))
708 {
709 found = TRUE;
710 }
711 break;
712 case BTA_HL_CI_GET_TX_DATA_EVT:
713 case BTA_HL_CI_PUT_RX_DATA_EVT:
714 if (bta_hl_find_mdl_idx_using_handle(p_msg->ci_get_put_data.mdl_handle, &app_idx, &mcl_idx, &mdl_idx))
715 {
716 found = TRUE;
717 }
718 break;
719 case BTA_HL_CI_GET_ECHO_DATA_EVT:
720 case BTA_HL_CI_PUT_ECHO_DATA_EVT:
721 if (bta_hl_find_mcl_idx_using_handle(p_msg->ci_get_put_echo_data.mcl_handle, &app_idx, &mcl_idx))
722 {
723 p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
724 mdl_idx = p_mcb->echo_mdl_idx;
725 found = TRUE;
726 }
727 break;
728
729 default:
730 break;
731
732 }
733
734 if (found)
735 {
736 *p_app_idx = app_idx;
737 *p_mcl_idx = mcl_idx;
738 *p_mdl_idx = mdl_idx;
739 }
740#if BTA_HL_DEBUG == TRUE
741 if (!found)
742 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700743 APPL_TRACE_DEBUG("bta_hl_find_dch_cb_indexes event=%s found=%d app_idx=%d mcl_idx=%d mdl_idx=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -0800744 bta_hl_evt_code(p_msg->hdr.event), found, *p_app_idx, *p_mcl_idx, *p_mdl_idx );
745 }
746#endif
747
748 return found;
749}
750
751/*******************************************************************************
752**
753** Function bta_hl_allocate_mdl_id
754**
755** Description This function allocates a MDL ID
756**
757** Returns UINT16 - MDL ID
758**
759*******************************************************************************/
760UINT16 bta_hl_allocate_mdl_id(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx )
761{
762 UINT16 mdl_id=0;
763 tBTA_HL_MCL_CB *p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
764 BOOLEAN duplicate_id;
765 UINT8 i, mdl_cfg_idx;
766
767 do
768 {
769 duplicate_id = FALSE;
770 mdl_id = ((mdl_id+1) & 0xFEFF);
771 /* check mdl_ids that are used for the current conenctions */
772 for (i=0; i< BTA_HL_NUM_MDLS_PER_MCL; i++)
773 {
774 if (p_mcb->mdl[i].in_use &&
775 (i != mdl_idx) &&
776 (p_mcb->mdl[i].mdl_id == mdl_id) )
777 {
778 duplicate_id = TRUE;
779 break;
780 }
781 }
782
783 if (duplicate_id)
784 {
785 /* start from the beginning to get another MDL value*/
786 continue;
787 }
788 else
789 {
790 /* check mdl_ids that are stored in the persistent memory */
791 if (bta_hl_find_mdl_cfg_idx(app_idx,mcl_idx, mdl_id, &mdl_cfg_idx))
792 {
793 duplicate_id = TRUE;
794 }
795 else
796 {
797 /* found a new MDL value */
798 break;
799 }
800 }
801
802 }while (TRUE);
803
804#if BTA_HL_DEBUG == TRUE
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700805 APPL_TRACE_DEBUG("bta_hl_allocate_mdl OK mdl_id=%d", mdl_id);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800806#endif
807 return mdl_id;
808}
809/*******************************************************************************
810**
811** Function bta_hl_find_mdl_idx
812**
813** Description This function finds the MDL index based on mdl_id
814**
815** Returns BOOLEAN TRUE-found
816**
817*******************************************************************************/
818BOOLEAN bta_hl_find_mdl_idx(UINT8 app_idx, UINT8 mcl_idx, UINT16 mdl_id,
819 UINT8 *p_mdl_idx)
820{
821 tBTA_HL_MCL_CB *p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
822 BOOLEAN found=FALSE;
823 UINT8 i;
824
825 for (i=0; i < BTA_HL_NUM_MDLS_PER_MCL ; i ++)
826 {
827 if (p_mcb->mdl[i].in_use &&
828 (mdl_id !=0) &&
829 (p_mcb->mdl[i].mdl_id== mdl_id))
830 {
831 found = TRUE;
832 *p_mdl_idx = i;
833 break;
834 }
835 }
836
837#if BTA_HL_DEBUG == TRUE
838 if (!found)
839 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700840 APPL_TRACE_DEBUG("bta_hl_find_mdl_idx found=%d mdl_id=%d mdl_idx=%d ",
The Android Open Source Project5738f832012-12-12 16:00:35 -0800841 found, mdl_id, i);
842 }
843#endif
844
845 return found;
846}
847
848/*******************************************************************************
849**
850** Function bta_hl_find_an_active_mdl_idx
851**
852** Description This function finds an active MDL
853**
854** Returns BOOLEAN TRUE-found
855**
856*******************************************************************************/
857BOOLEAN bta_hl_find_an_active_mdl_idx(UINT8 app_idx, UINT8 mcl_idx,
858 UINT8 *p_mdl_idx)
859{
860 tBTA_HL_MCL_CB *p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
861 BOOLEAN found=FALSE;
862 UINT8 i;
863
864 for (i=0; i < BTA_HL_NUM_MDLS_PER_MCL ; i ++)
865 {
866 if (p_mcb->mdl[i].in_use &&
867 (p_mcb->mdl[i].dch_state == BTA_HL_DCH_OPEN_ST))
868 {
869 found = TRUE;
870 *p_mdl_idx = i;
871 break;
872 }
873 }
874
875#if BTA_HL_DEBUG == TRUE
876 if (found)
877 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700878 APPL_TRACE_DEBUG("bta_hl_find_an_opened_mdl_idx found=%d app_idx=%d mcl_idx=%d mdl_idx=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -0800879 found, app_idx, mcl_idx, i);
880 }
881#endif
882
883 return found;
884}
885
886/*******************************************************************************
887**
888** Function bta_hl_find_dch_setup_mdl_idx
889**
890** Description This function finds a MDL which in the DCH setup state
891**
892** Returns BOOLEAN TRUE-found
893**
894*******************************************************************************/
895BOOLEAN bta_hl_find_dch_setup_mdl_idx(UINT8 app_idx, UINT8 mcl_idx,
896 UINT8 *p_mdl_idx)
897{
898 tBTA_HL_MCL_CB *p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
899 BOOLEAN found=FALSE;
900 UINT8 i;
901
902 for (i=0; i < BTA_HL_NUM_MDLS_PER_MCL ; i ++)
903 {
904 if (p_mcb->mdl[i].in_use &&
905 (p_mcb->mdl[i].dch_state == BTA_HL_DCH_OPENING_ST))
906 {
907 found = TRUE;
908 *p_mdl_idx = i;
909 break;
910 }
911 }
912
913#if BTA_HL_DEBUG == TRUE
914 if (found)
915 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700916 APPL_TRACE_DEBUG("bta_hl_find_dch_setup_mdl_idx found=%d app_idx=%d mcl_idx=%d mdl_idx=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -0800917 found, app_idx, mcl_idx, i);
918 }
919#endif
920
921 return found;
922}
923
924/*******************************************************************************
925**
926** Function bta_hl_find_an_in_use_mcl_idx
927**
928** Description This function finds an in-use MCL control block index
929**
930** Returns BOOLEAN TRUE-found
931**
932*******************************************************************************/
933BOOLEAN bta_hl_find_an_in_use_mcl_idx(UINT8 app_idx,
934 UINT8 *p_mcl_idx)
935{
936 tBTA_HL_MCL_CB *p_mcb;
937 BOOLEAN found=FALSE;
938 UINT8 i;
939
940 for (i=0; i < BTA_HL_NUM_MCLS ; i ++)
941 {
942 p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, i);
943 if (p_mcb->in_use &&
944 (p_mcb->cch_state != BTA_HL_CCH_IDLE_ST))
945 {
946 found = TRUE;
947 *p_mcl_idx = i;
948 break;
949 }
950 }
951
952#if BTA_HL_DEBUG == TRUE
953 if (found)
954 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700955 APPL_TRACE_DEBUG("bta_hl_find_an_in_use_mcl_idx found=%d app_idx=%d mcl_idx=%d ",
The Android Open Source Project5738f832012-12-12 16:00:35 -0800956 found, app_idx, i);
957 }
958#endif
959
960 return found;
961}
962
963
964/*******************************************************************************
965**
966** Function bta_hl_find_an_in_use_app_idx
967**
968** Description This function finds an in-use application control block index
969**
970** Returns BOOLEAN TRUE-found
971**
972*******************************************************************************/
973BOOLEAN bta_hl_find_an_in_use_app_idx(UINT8 *p_app_idx)
974{
975 tBTA_HL_APP_CB *p_acb ;
976 BOOLEAN found=FALSE;
977 UINT8 i;
978
979 for (i=0; i < BTA_HL_NUM_APPS ; i ++)
980 {
981 p_acb = BTA_HL_GET_APP_CB_PTR(i);
982 if (p_acb->in_use)
983 {
984 found = TRUE;
985 *p_app_idx = i;
986 break;
987 }
988 }
989
990#if BTA_HL_DEBUG == TRUE
991 if (found)
992 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700993 APPL_TRACE_DEBUG("bta_hl_find_an_in_use_app_idx found=%d app_idx=%d ",
The Android Open Source Project5738f832012-12-12 16:00:35 -0800994 found, i);
995 }
996#endif
997
998 return found;
999}
1000/*******************************************************************************
1001**
1002** Function bta_hl_find_app_idx
1003**
1004** Description This function finds the application control block index based on
1005** the application ID
1006**
1007** Returns BOOLEAN TRUE-found
1008**
1009*******************************************************************************/
1010BOOLEAN bta_hl_find_app_idx(UINT8 app_id, UINT8 *p_app_idx)
1011{
1012 BOOLEAN found=FALSE;
1013 UINT8 i;
1014
1015 for (i=0; i < BTA_HL_NUM_APPS ; i ++)
1016 {
1017 if (bta_hl_cb.acb[i].in_use &&
1018 (bta_hl_cb.acb[i].app_id == app_id))
1019 {
1020 found = TRUE;
1021 *p_app_idx = i;
1022 break;
1023 }
1024 }
1025
1026#if BTA_HL_DEBUG == TRUE
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001027 APPL_TRACE_DEBUG("bta_hl_find_app_idx found=%d app_id=%d idx=%d ",
The Android Open Source Project5738f832012-12-12 16:00:35 -08001028 found, app_id, i);
1029#endif
1030
1031 return found;
1032}
1033
1034
1035/*******************************************************************************
1036**
1037** Function bta_hl_find_app_idx_using_handle
1038**
1039** Description This function finds the application control block index based on
1040** the application handle
1041**
1042** Returns BOOLEAN TRUE-found
1043**
1044*******************************************************************************/
1045BOOLEAN bta_hl_find_app_idx_using_handle(tBTA_HL_APP_HANDLE app_handle,
1046 UINT8 *p_app_idx)
1047{
1048 BOOLEAN found=FALSE;
1049 UINT8 i;
1050
1051 for (i=0; i < BTA_HL_NUM_APPS ; i ++)
1052 {
1053 if (bta_hl_cb.acb[i].in_use &&
1054 (bta_hl_cb.acb[i].app_handle == app_handle))
1055 {
1056 found = TRUE;
1057 *p_app_idx = i;
1058 break;
1059 }
1060 }
1061
1062#if BTA_HL_DEBUG == TRUE
1063 if (!found)
1064 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001065 APPL_TRACE_DEBUG("bta_hl_find_app_idx_using_mca_handle status=%d handle=%d app_idx=%d ",
The Android Open Source Project5738f832012-12-12 16:00:35 -08001066 found, app_handle , i);
1067 }
1068#endif
1069
1070 return found;
1071}
1072
1073
1074/*******************************************************************************
1075**
1076** Function bta_hl_find_mcl_idx_using_handle
1077**
1078** Description This function finds the MCL control block index based on
1079** the MCL handle
1080**
1081** Returns BOOLEAN TRUE-found
1082**
1083*******************************************************************************/
1084BOOLEAN bta_hl_find_mcl_idx_using_handle( tBTA_HL_MCL_HANDLE mcl_handle,
1085 UINT8 *p_app_idx, UINT8 *p_mcl_idx)
1086{
1087 tBTA_HL_APP_CB *p_acb;
1088 BOOLEAN found=FALSE;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001089 UINT8 i = 0,j = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001090
1091 for (i=0; i<BTA_HL_NUM_APPS; i++)
1092 {
1093 p_acb = BTA_HL_GET_APP_CB_PTR(i);
1094 if (p_acb->in_use)
1095 {
1096 for (j=0; j < BTA_HL_NUM_MCLS ; j++)
1097 {
1098 if ( p_acb->mcb[j].mcl_handle == mcl_handle )
1099 {
1100 found = TRUE;
1101 *p_app_idx = i;
1102 *p_mcl_idx = j;
1103 break;
1104 }
1105 }
1106 }
1107 }
1108
1109#if BTA_HL_DEBUG == TRUE
1110 if (!found)
1111 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001112 APPL_TRACE_DEBUG("bta_hl_find_mcl_idx_using_handle found=%d app_idx=%d mcl_idx=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08001113 found, i, j);
1114 }
1115#endif
1116 return found;
1117}
1118
1119/*******************************************************************************
1120**
1121** Function bta_hl_find_mcl_idx
1122**
1123** Description This function finds the MCL control block index based on
1124** the peer BD address
1125**
1126** Returns BOOLEAN TRUE-found
1127**
1128*******************************************************************************/
1129BOOLEAN bta_hl_find_mcl_idx(UINT8 app_idx, BD_ADDR p_bd_addr, UINT8 *p_mcl_idx)
1130{
1131 BOOLEAN found=FALSE;
1132 UINT8 i;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001133
1134 for (i=0; i < BTA_HL_NUM_MCLS ; i ++)
1135 {
The Android Open Source Project5738f832012-12-12 16:00:35 -08001136 if (bta_hl_cb.acb[app_idx].mcb[i].in_use &&
1137 (!memcmp (bta_hl_cb.acb[app_idx].mcb[i].bd_addr, p_bd_addr, BD_ADDR_LEN)))
1138 {
1139 found = TRUE;
1140 *p_mcl_idx = i;
1141 break;
1142 }
1143 }
1144
1145#if BTA_HL_DEBUG == TRUE
1146 if (!found)
1147 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001148 APPL_TRACE_DEBUG("bta_hl_find_mcl_idx found=%d idx=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08001149 found, i);
1150 }
1151#endif
1152 return found;
1153}
1154
1155
1156
1157/*******************************************************************************
1158**
1159** Function bta_hl_find_mdl_idx_using_handle
1160**
1161** Description This function finds the MDL control block index based on
1162** the MDL handle
1163**
1164** Returns BOOLEAN TRUE-found
1165**
1166*******************************************************************************/
1167BOOLEAN bta_hl_find_mdl_idx_using_handle(tBTA_HL_MDL_HANDLE mdl_handle,
1168 UINT8 *p_app_idx,UINT8 *p_mcl_idx,
1169 UINT8 *p_mdl_idx)
1170{
1171 tBTA_HL_APP_CB *p_acb;
1172 tBTA_HL_MCL_CB *p_mcb;
1173 tBTA_HL_MDL_CB *p_dcb;
1174 BOOLEAN found=FALSE;
1175 UINT8 i,j,k;
1176
1177 for (i=0; i < BTA_HL_NUM_APPS ; i ++)
1178 {
1179 p_acb = BTA_HL_GET_APP_CB_PTR(i);
1180 if (p_acb->in_use)
1181 {
1182 for (j=0; j< BTA_HL_NUM_MCLS; j++)
1183 {
1184 p_mcb = BTA_HL_GET_MCL_CB_PTR(i,j);
1185 if (p_mcb->in_use)
1186 {
1187 for (k=0; k< BTA_HL_NUM_MDLS_PER_MCL; k++)
1188 {
1189 p_dcb = BTA_HL_GET_MDL_CB_PTR(i,j,k);
1190 if (p_dcb->in_use)
1191 {
1192 if (p_dcb->mdl_handle == mdl_handle)
1193 {
1194 found = TRUE;
1195 *p_app_idx = i;
1196 *p_mcl_idx =j;
1197 *p_mdl_idx = k;
1198 break;
1199 }
1200 }
1201 }
1202 }
1203 }
1204 }
1205 }
1206
1207
1208#if BTA_HL_DEBUG == TRUE
1209 if (!found)
1210 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001211 APPL_TRACE_DEBUG("bta_hl_find_mdl_idx_using_handle found=%d mdl_handle=%d ",
The Android Open Source Project5738f832012-12-12 16:00:35 -08001212 found, mdl_handle);
1213 }
1214#endif
1215 return found;
1216}
1217/*******************************************************************************
1218**
1219** Function bta_hl_is_the_first_reliable_existed
1220**
1221** Description This function checks whether the first reliable DCH channel
1222** has been setup on the MCL or not
1223**
1224** Returns BOOLEAN - TRUE exist
1225** FALSE does not exist
1226**
1227*******************************************************************************/
1228BOOLEAN bta_hl_is_the_first_reliable_existed(UINT8 app_idx, UINT8 mcl_idx )
1229{
1230 tBTA_HL_MCL_CB *p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
1231 BOOLEAN is_existed =FALSE;
1232 UINT8 i ;
1233
1234 for (i=0; i< BTA_HL_NUM_MDLS_PER_MCL; i++)
1235 {
1236 if (p_mcb->mdl[i].in_use && p_mcb->mdl[i].is_the_first_reliable)
1237 {
1238 is_existed = TRUE;
1239 break;
1240 }
1241 }
1242
1243#if BTA_HL_DEBUG == TRUE
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001244 APPL_TRACE_DEBUG("bta_hl_is_the_first_reliable_existed is_existed=%d ",is_existed );
The Android Open Source Project5738f832012-12-12 16:00:35 -08001245#endif
1246 return is_existed;
1247}
1248
1249/*******************************************************************************
1250**
1251** Function bta_hl_find_non_active_mdl_cfg
1252**
1253** Description This function finds a valid MDL configiration index and this
1254** MDL ID is not active
1255**
1256** Returns BOOLEAN - TRUE found
1257** FALSE not found
1258**
1259*******************************************************************************/
1260BOOLEAN bta_hl_find_non_active_mdl_cfg(UINT8 app_idx, UINT8 start_mdl_cfg_idx,
1261 UINT8 *p_mdl_cfg_idx)
1262{
1263
1264 tBTA_HL_MCL_CB *p_mcb;
1265 tBTA_HL_MDL_CB *p_dcb;
1266 tBTA_HL_MDL_CFG *p_mdl;
1267 BOOLEAN mdl_in_use;
1268 BOOLEAN found = FALSE;
1269 UINT8 i,j,k;
1270
1271 for (i = start_mdl_cfg_idx; i< BTA_HL_NUM_MDL_CFGS; i++)
1272 {
1273 mdl_in_use = FALSE;
1274 p_mdl = BTA_HL_GET_MDL_CFG_PTR(app_idx, i);
1275 for (j=0; j< BTA_HL_NUM_MCLS; j++)
1276 {
1277 p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, j);
1278 if (p_mcb->in_use &&
1279 !memcmp(p_mdl->peer_bd_addr,p_mcb->bd_addr,BD_ADDR_LEN))
1280 {
1281
1282 for (k=0; k<BTA_HL_NUM_MDLS_PER_MCL; k++)
1283 {
1284 p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, j, k);
1285
1286 if (p_dcb->in_use && p_mdl->mdl_id == p_dcb->mdl_id)
1287 {
1288 mdl_in_use = TRUE;
1289 break;
1290 }
1291 }
1292 }
1293
1294 if (mdl_in_use)
1295 {
1296 break;
1297 }
1298 }
1299
1300 if (!mdl_in_use)
1301 {
1302 *p_mdl_cfg_idx = i;
1303 found = TRUE;
1304 break;
1305 }
1306 }
1307
1308 return found;
1309}
1310
1311/*******************************************************************************
1312**
1313** Function bta_hl_find_mdl_cfg_idx
1314**
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08001315** Description This function finds an available MDL configuration index
The Android Open Source Project5738f832012-12-12 16:00:35 -08001316**
1317** Returns BOOLEAN - TRUE found
1318** FALSE not found
1319**
1320*******************************************************************************/
1321BOOLEAN bta_hl_find_avail_mdl_cfg_idx(UINT8 app_idx, UINT8 mcl_idx,
1322 UINT8 *p_mdl_cfg_idx)
1323{
1324 tBTA_HL_MDL_CFG *p_mdl, *p_mdl1, *p_mdl2;
1325 UINT8 i;
1326 BOOLEAN found=FALSE;
1327 UINT8 first_mdl_cfg_idx, second_mdl_cfg_idx, older_mdl_cfg_idx;
1328 BOOLEAN done;
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08001329 UNUSED(mcl_idx);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001330
1331 for (i=0; i< BTA_HL_NUM_MDL_CFGS; i++)
1332 {
1333 p_mdl = BTA_HL_GET_MDL_CFG_PTR(app_idx, i);
1334 if (!p_mdl->active )
1335 {
1336 /* found an unused space to store mdl cfg*/
1337 found=TRUE;
1338 *p_mdl_cfg_idx =i;
1339 break;
1340 }
1341 }
1342
1343 if (!found)
1344 {
1345 /* all available mdl cfg spaces are in use so we need to find the mdl cfg which is
1346 not currently in use and has the the oldest time stamp to remove*/
1347
1348 found = TRUE;
1349 if (bta_hl_find_non_active_mdl_cfg(app_idx,0, &first_mdl_cfg_idx))
1350 {
1351 if (bta_hl_find_non_active_mdl_cfg(app_idx,(UINT8) (first_mdl_cfg_idx+1), &second_mdl_cfg_idx))
1352 {
1353 done = FALSE;
1354 while (!done)
1355 {
1356 p_mdl1 = BTA_HL_GET_MDL_CFG_PTR(app_idx, first_mdl_cfg_idx);
1357 p_mdl2 = BTA_HL_GET_MDL_CFG_PTR(app_idx, second_mdl_cfg_idx);
1358
1359 if (p_mdl1->time < p_mdl2->time)
1360 {
1361 older_mdl_cfg_idx = first_mdl_cfg_idx;
1362 }
1363 else
1364 {
1365 older_mdl_cfg_idx = second_mdl_cfg_idx;
1366 }
1367
1368 if (bta_hl_find_non_active_mdl_cfg(app_idx,(UINT8) (second_mdl_cfg_idx+1), &second_mdl_cfg_idx))
1369 {
1370 first_mdl_cfg_idx = older_mdl_cfg_idx;
1371 }
1372 else
1373 {
1374 done = TRUE;
1375 }
1376 }
1377
1378 *p_mdl_cfg_idx = older_mdl_cfg_idx;
1379
1380 }
1381 else
1382 {
1383 *p_mdl_cfg_idx = first_mdl_cfg_idx;
1384 }
1385
1386 }
1387 else
1388 {
1389 found = FALSE;
1390 }
1391 }
1392
1393#if BTA_HL_DEBUG == TRUE
1394 if (!found)
1395 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001396 APPL_TRACE_DEBUG("bta_hl_find_avail_mdl_cfg_idx found=%d mdl_cfg_idx=%d ",found, *p_mdl_cfg_idx );
The Android Open Source Project5738f832012-12-12 16:00:35 -08001397 }
1398#endif
1399
1400 return found;
1401
1402
1403}
1404
1405/*******************************************************************************
1406**
1407** Function bta_hl_find_mdl_cfg_idx
1408**
1409** Description This function finds the MDL configuration index based on
1410** the MDL ID
1411**
1412** Returns BOOLEAN - TRUE found
1413** FALSE not found
1414**
1415*******************************************************************************/
1416BOOLEAN bta_hl_find_mdl_cfg_idx(UINT8 app_idx, UINT8 mcl_idx,
1417 tBTA_HL_MDL_ID mdl_id, UINT8 *p_mdl_cfg_idx)
1418{
1419 tBTA_HL_MCL_CB *p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
1420 tBTA_HL_MDL_CFG *p_mdl;
1421 UINT8 i ;
1422 BOOLEAN found=FALSE;
Matthew Xiebea41312014-05-09 01:04:04 -07001423
1424 *p_mdl_cfg_idx = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001425 for (i=0; i< BTA_HL_NUM_MDL_CFGS; i++)
1426 {
1427 p_mdl = BTA_HL_GET_MDL_CFG_PTR(app_idx, i);
Priti Agheraf8f30c22013-04-02 15:31:19 -07001428 if(p_mdl->active)
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001429 APPL_TRACE_DEBUG("bta_hl_find_mdl_cfg_idx: mdl_id =%d, p_mdl->mdl_id=%d",mdl_id,
Priti Agheraf8f30c22013-04-02 15:31:19 -07001430 p_mdl->mdl_id);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001431 if (p_mdl->active &&
1432 (!memcmp (p_mcb->bd_addr, p_mdl->peer_bd_addr, BD_ADDR_LEN))&&
1433 (p_mdl->mdl_id == mdl_id))
1434 {
1435 found=TRUE;
1436 *p_mdl_cfg_idx =i;
1437 break;
1438 }
1439 }
1440
1441#if BTA_HL_DEBUG == TRUE
1442 if (!found)
1443 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001444 APPL_TRACE_DEBUG("bta_hl_find_mdl_cfg_idx found=%d mdl_cfg_idx=%d ",found, i );
The Android Open Source Project5738f832012-12-12 16:00:35 -08001445 }
1446#endif
1447
1448 return found;
1449
1450
1451}
1452
1453
1454/*******************************************************************************
1455**
1456** Function bta_hl_get_cur_time
1457**
1458** Description This function get the cuurent time value
1459**
1460** Returns BOOLEAN - TRUE found
1461** FALSE not found
1462**
1463*******************************************************************************/
1464BOOLEAN bta_hl_get_cur_time(UINT8 app_idx, UINT8 *p_cur_time)
1465{
1466 tBTA_HL_MDL_CFG *p_mdl;
1467 UINT8 i, j, time_latest, time;
1468 BOOLEAN found=FALSE, result=TRUE;
1469
1470 for (i=0; i< BTA_HL_NUM_MDL_CFGS; i++)
1471 {
1472 p_mdl = BTA_HL_GET_MDL_CFG_PTR(app_idx, i);
1473 if (p_mdl->active)
1474 {
1475 found=TRUE;
1476 time_latest = p_mdl->time;
1477 for (j=(i+1); j< BTA_HL_NUM_MDL_CFGS; j++ )
1478 {
1479 p_mdl = BTA_HL_GET_MDL_CFG_PTR(app_idx, j);
1480 if (p_mdl->active)
1481 {
1482 time = p_mdl->time;
1483 if (time > time_latest)
1484 {
1485 time_latest = time;
1486 }
1487 }
1488 }
1489 break;
1490 }
1491 }
1492
1493
1494 if (found)
1495 {
1496 if (time_latest < BTA_HL_MAX_TIME)
1497 {
1498 *p_cur_time = time_latest+1;
1499 }
1500 else
1501 {
1502 /* need to wrap around */
1503 result = FALSE;
1504 }
1505 }
1506 else
1507 {
1508 *p_cur_time = BTA_HL_MIN_TIME;
1509 }
1510
1511#if BTA_HL_DEBUG == TRUE
1512 if (!result)
1513 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001514 APPL_TRACE_DEBUG("bta_hl_get_cur_time result=%s cur_time=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08001515 (result?"OK":"FAIL"), *p_cur_time);
1516 }
1517#endif
1518
1519 return result;
1520}
1521
1522/*******************************************************************************
1523**
1524** Function bta_hl_sort_cfg_time_idx
1525**
1526** Description This function sort the mdl configuration idx stored in array a
1527** based on decending time value
1528**
1529** Returns BOOLEAN - TRUE found
1530** FALSE not found
1531**
1532*******************************************************************************/
1533void bta_hl_sort_cfg_time_idx(UINT8 app_idx, UINT8 *a, UINT8 n)
1534{
1535 tBTA_HL_APP_CB *p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
1536 UINT8 temp_time, temp_idx;
1537 INT16 i, j;
1538 for (i = 1; i < n; ++i)
1539 {
1540 temp_idx = a[i];
1541 temp_time = p_acb->mdl_cfg[temp_idx].time;
1542 j = i - 1;
1543 while ((j >= 0) && (temp_time < p_acb->mdl_cfg[a[j]].time))
1544 {
1545 a[j + 1] = a[j];
1546 --j;
1547 }
1548 a[j + 1] = temp_idx;
1549 }
1550}
1551
1552/*******************************************************************************
1553**
1554** Function bta_hl_compact_mdl_cfg_time
1555**
1556** Description This function finds the MDL configuration index based on
1557** the MDL ID
1558**
1559** Returns BOOLEAN - TRUE found
1560** FALSE not found
1561**
1562*******************************************************************************/
Priti Agheraf8f30c22013-04-02 15:31:19 -07001563void bta_hl_compact_mdl_cfg_time(UINT8 app_idx, UINT8 mdep_id)
The Android Open Source Project5738f832012-12-12 16:00:35 -08001564{
The Android Open Source Project5738f832012-12-12 16:00:35 -08001565 tBTA_HL_MDL_CFG *p_mdl;
1566 UINT8 i, time_min, cnt=0;
1567 UINT8 s_arr[BTA_HL_NUM_MDL_CFGS];
1568
1569
1570 for (i=0; i< BTA_HL_NUM_MDL_CFGS; i++)
1571 {
1572 p_mdl = BTA_HL_GET_MDL_CFG_PTR(app_idx, i);
1573 if (p_mdl->active )
1574 {
1575 s_arr[cnt]= i;
1576 cnt++;
1577 }
1578 }
1579
1580
1581
1582#if BTA_HL_DEBUG == TRUE
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001583 APPL_TRACE_DEBUG("bta_hl_compact_mdl_cfg_time cnt=%d ",cnt );
The Android Open Source Project5738f832012-12-12 16:00:35 -08001584#endif
1585
1586
1587 if (cnt)
1588 {
1589 bta_hl_sort_cfg_time_idx(app_idx, s_arr, cnt);
1590 time_min = BTA_HL_MIN_TIME;
1591 for (i=0;i<cnt; i++)
1592 {
1593 p_mdl = BTA_HL_GET_MDL_CFG_PTR(app_idx, s_arr[i]);
1594 p_mdl->time = time_min + i;
Priti Agheraf8f30c22013-04-02 15:31:19 -07001595 bta_hl_co_save_mdl(mdep_id, s_arr[i], p_mdl);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001596 }
1597 }
1598
1599
1600}
1601
1602
1603
1604/*******************************************************************************
1605**
1606** Function bta_hl_is_mdl_exsit_in_mcl
1607**
1608** Description This function checks whether the MDL ID
1609** has already existed in teh MCL or not
1610**
1611** Returns BOOLEAN - TRUE exist
1612** FALSE does not exist
1613**
1614*******************************************************************************/
1615BOOLEAN bta_hl_is_mdl_exsit_in_mcl(UINT8 app_idx, BD_ADDR bd_addr,
1616 tBTA_HL_MDL_ID mdl_id)
1617{
1618 tBTA_HL_MDL_CFG *p_mdl;
1619 BOOLEAN found = FALSE;
1620 UINT8 i;
1621
1622 for (i = 0; i< BTA_HL_NUM_MDL_CFGS; i++)
1623 {
1624 p_mdl = BTA_HL_GET_MDL_CFG_PTR(app_idx, i);
1625 if (p_mdl->active &&
1626 !memcmp(p_mdl->peer_bd_addr, bd_addr,BD_ADDR_LEN))
1627 {
1628 if (mdl_id != BTA_HL_DELETE_ALL_MDL_IDS)
1629 {
1630 if (p_mdl->mdl_id == mdl_id)
1631 {
1632 found = TRUE;
1633 break;
1634 }
1635 }
1636 else
1637 {
1638 found = TRUE;
1639 break;
1640 }
1641 }
1642 }
1643
1644 return found;
1645}
1646
1647/*******************************************************************************
1648**
1649** Function bta_hl_delete_mdl_cfg
1650**
1651** Description This function delete the specified MDL ID
1652**
1653** Returns BOOLEAN - TRUE Success
1654** FALSE Failed
1655**
1656*******************************************************************************/
1657BOOLEAN bta_hl_delete_mdl_cfg(UINT8 app_idx, BD_ADDR bd_addr,
1658 tBTA_HL_MDL_ID mdl_id)
1659{
1660 tBTA_HL_MDL_CFG *p_mdl;
1661 BOOLEAN success = FALSE;
1662 UINT8 i;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001663
1664 for (i = 0; i< BTA_HL_NUM_MDL_CFGS; i++)
1665 {
1666 p_mdl = BTA_HL_GET_MDL_CFG_PTR(app_idx, i);
1667 if (p_mdl->active &&
1668 !memcmp(p_mdl->peer_bd_addr, bd_addr,BD_ADDR_LEN))
1669 {
1670 if (mdl_id != BTA_HL_DELETE_ALL_MDL_IDS)
1671 {
1672 if (p_mdl->mdl_id == mdl_id)
1673 {
Priti Agheraf8f30c22013-04-02 15:31:19 -07001674 bta_hl_co_delete_mdl(p_mdl->local_mdep_id, i);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001675 memset(p_mdl, 0, sizeof(tBTA_HL_MDL_CFG));
1676 success = TRUE;
1677 break;
1678 }
1679 }
1680 else
1681 {
Priti Agheraf8f30c22013-04-02 15:31:19 -07001682 bta_hl_co_delete_mdl(p_mdl->local_mdep_id, i);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001683 memset(p_mdl, 0, sizeof(tBTA_HL_MDL_CFG));
1684 success = TRUE;
1685 }
1686 }
1687 }
1688
1689 return success;
1690}
1691
1692
1693/*******************************************************************************
1694**
1695** Function bta_hl_is_mdl_value_valid
1696**
1697**
1698** Description This function checks the specified MDL ID is in valid range or not
1699**
1700** Returns BOOLEAN - TRUE Success
1701** FALSE Failed
1702**
1703** note: mdl_id range 0x0000 reserved,
1704** 0x0001-oxFEFF dynamic range,
1705** 0xFF00-0xFFFE reserved,
1706** 0xFFFF indicates all MDLs (for delete operation only)
1707**
1708*******************************************************************************/
1709BOOLEAN bta_hl_is_mdl_value_valid(tBTA_HL_MDL_ID mdl_id)
1710{
1711 BOOLEAN status = TRUE;
1712
1713 if (mdl_id != BTA_HL_DELETE_ALL_MDL_IDS)
1714 {
1715 if (mdl_id != 0)
1716 {
1717 if (mdl_id > BTA_HL_MAX_MDL_VAL )
1718 {
1719 status = FALSE;
1720 }
1721 }
1722 else
1723 {
1724 status = FALSE;
1725 }
1726 }
1727
1728 return status;
1729}
1730
1731/*******************************************************************************
1732**
1733** Function bta_hl_find_mdep_cfg_idx
1734**
1735** Description This function finds the MDEP configuration index based
1736** on the local MDEP ID
1737**
1738** Returns BOOLEAN - TRUE found
1739** FALSE not found
1740**
1741*******************************************************************************/
1742BOOLEAN bta_hl_find_mdep_cfg_idx(UINT8 app_idx, tBTA_HL_MDEP_ID local_mdep_id,
1743 UINT8 *p_mdep_cfg_idx)
1744{
1745 tBTA_HL_APP_CB *p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
1746 tBTA_HL_SUP_FEATURE *p_sup_feature= &p_acb->sup_feature;
1747 BOOLEAN found =FALSE;
1748 UINT8 i;
1749
1750 for (i=0; i< p_sup_feature->num_of_mdeps; i++)
1751 {
1752 if ( p_sup_feature->mdep[i].mdep_id == local_mdep_id)
1753 {
1754 found = TRUE;
1755 *p_mdep_cfg_idx = i;
1756 break;
1757 }
1758 }
1759
1760#if BTA_HL_DEBUG == TRUE
1761 if (!found)
1762 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001763 APPL_TRACE_DEBUG("bta_hl_find_mdep_cfg_idx found=%d mdep_idx=%d local_mdep_id=%d ",
The Android Open Source Project5738f832012-12-12 16:00:35 -08001764 found,i, local_mdep_id );
1765 }
1766#endif
1767 return found;
1768}
1769
1770
1771/*******************************************************************************
1772**
1773** Function bta_hl_find_rxtx_apdu_size
1774**
1775** Description This function finds the maximum APDU rx and tx sizes based on
1776** the MDEP configuration data
1777**
1778** Returns void
1779**
1780*******************************************************************************/
1781void bta_hl_find_rxtx_apdu_size(UINT8 app_idx, UINT8 mdep_cfg_idx,
1782 UINT16 *p_rx_apu_size,
1783 UINT16 *p_tx_apu_size)
1784{
1785 tBTA_HL_APP_CB *p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
1786 tBTA_HL_MDEP_CFG *p_mdep_cfg;
1787 UINT8 i;
1788 UINT16 max_rx_apdu_size=0, max_tx_apdu_size=0;
1789
1790 p_mdep_cfg = &p_acb->sup_feature.mdep[mdep_cfg_idx].mdep_cfg;
1791
1792
1793 for (i=0; i< p_mdep_cfg->num_of_mdep_data_types ; i++)
1794 {
1795
1796 if (max_rx_apdu_size < p_mdep_cfg->data_cfg[i].max_rx_apdu_size)
1797 {
1798 max_rx_apdu_size = p_mdep_cfg->data_cfg[i].max_rx_apdu_size;
1799 }
1800
1801 if (max_tx_apdu_size < p_mdep_cfg->data_cfg[i].max_tx_apdu_size)
1802 {
1803 max_tx_apdu_size = p_mdep_cfg->data_cfg[i].max_tx_apdu_size;
1804 }
1805 }
1806
1807
1808 *p_rx_apu_size = max_rx_apdu_size;
1809 *p_tx_apu_size = max_tx_apdu_size;
1810
1811#if BTA_HL_DEBUG == TRUE
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001812 APPL_TRACE_DEBUG("bta_hl_find_rxtx_apdu_size max_rx_apdu_size=%d max_tx_apdu_size=%d ",
The Android Open Source Project5738f832012-12-12 16:00:35 -08001813 max_rx_apdu_size, max_tx_apdu_size );
1814#endif
1815
1816
1817}
1818
1819/*******************************************************************************
1820**
1821** Function bta_hl_validate_peer_cfg
1822**
1823** Description This function validates the peer DCH configuration
1824**
1825** Returns BOOLEAN - TRUE validation is successful
1826** FALSE validation failed
1827**
1828*******************************************************************************/
1829BOOLEAN bta_hl_validate_peer_cfg(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx,
1830 tBTA_HL_MDEP_ID peer_mdep_id,
1831 tBTA_HL_MDEP_ROLE peer_mdep_role,
1832 UINT8 sdp_idx)
1833{
1834 tBTA_HL_MCL_CB *p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
1835 tBTA_HL_MDL_CB *p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
1836 tBTA_HL_SDP_REC *p_rec;
1837 BOOLEAN peer_found =FALSE;
1838 UINT8 i;
1839
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001840 APPL_TRACE_DEBUG("bta_hl_validate_peer_cfg sdp_idx=%d app_idx %d", sdp_idx, app_idx);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001841
1842
1843 if (p_dcb->local_mdep_id == BTA_HL_ECHO_TEST_MDEP_ID)
1844 {
1845 return TRUE;
1846 }
1847
1848 p_rec = &p_mcb->sdp.sdp_rec[sdp_idx];
1849 for (i=0; i< p_rec->num_mdeps; i++)
1850 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001851 APPL_TRACE_DEBUG("mdep_id %d peer_mdep_id %d",p_rec->mdep_cfg[i].mdep_id , peer_mdep_id);
1852 APPL_TRACE_DEBUG("mdep_role %d peer_mdep_role %d",p_rec->mdep_cfg[i].mdep_role,
Priti Agheraf8f30c22013-04-02 15:31:19 -07001853 peer_mdep_role)
The Android Open Source Project5738f832012-12-12 16:00:35 -08001854 if ( (p_rec->mdep_cfg[i].mdep_id == peer_mdep_id) &&
1855 (p_rec->mdep_cfg[i].mdep_role == peer_mdep_role))
1856 {
1857 peer_found = TRUE;
1858
1859 break;
1860 }
1861 }
1862
The Android Open Source Project5738f832012-12-12 16:00:35 -08001863#if BTA_HL_DEBUG == TRUE
1864 if (!peer_found)
1865 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001866 APPL_TRACE_DEBUG("bta_hl_validate_peer_cfg failed num_mdeps=%d",p_rec->num_mdeps);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001867 }
1868#endif
1869 return peer_found;
1870}
1871
The Android Open Source Project5738f832012-12-12 16:00:35 -08001872/*******************************************************************************
1873**
1874** Function bta_hl_chk_local_cfg
1875**
1876** Description This function check whether the local DCH configuration is OK or not
1877**
1878** Returns tBTA_HL_STATUS - OK - local DCH configuration is OK
1879** NO_FIRST_RELIABLE - the streaming DCH configuration
1880** is not OK and it needs to use
1881** reliable DCH configuration
1882**
1883*******************************************************************************/
1884tBTA_HL_STATUS bta_hl_chk_local_cfg(UINT8 app_idx, UINT8 mcl_idx,
1885 UINT8 mdep_cfg_idx,
1886 tBTA_HL_DCH_CFG local_cfg)
1887{
1888 tBTA_HL_APP_CB *p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
1889 tBTA_HL_STATUS status = BTA_HL_STATUS_OK;
1890
1891 if ( mdep_cfg_idx &&
1892 (p_acb->sup_feature.mdep[mdep_cfg_idx].mdep_cfg.mdep_role == BTA_HL_MDEP_ROLE_SOURCE) &&
1893 (!bta_hl_is_the_first_reliable_existed(app_idx, mcl_idx)) &&
1894 (local_cfg != BTA_HL_DCH_CFG_RELIABLE))
1895 {
1896 status = BTA_HL_STATUS_NO_FIRST_RELIABLE;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001897 APPL_TRACE_ERROR("BTA_HL_STATUS_INVALID_DCH_CFG");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001898 }
1899
1900 return status;
1901}
1902
1903
1904/*******************************************************************************
1905**
1906** Function bta_hl_validate_reconnect_params
1907**
1908** Description This function validates the reconnect parameters
1909**
1910** Returns BOOLEAN - TRUE validation is successful
1911** FALSE validation failed
1912*******************************************************************************/
1913BOOLEAN bta_hl_validate_reconnect_params(UINT8 app_idx, UINT8 mcl_idx,
1914 tBTA_HL_API_DCH_RECONNECT *p_reconnect,
1915 UINT8 *p_mdep_cfg_idx, UINT8 *p_mdl_cfg_idx)
1916{
1917 tBTA_HL_APP_CB *p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
1918 tBTA_HL_SUP_FEATURE *p_sup_feature = &p_acb->sup_feature;
1919 UINT8 num_mdeps;
1920 UINT8 mdl_cfg_idx;
1921 BOOLEAN local_mdep_id_found =FALSE;
1922 BOOLEAN mdl_cfg_found =FALSE;
1923 BOOLEAN status=FALSE;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001924 UINT8 i, in_use_mdl_idx = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001925
1926#if BTA_HL_DEBUG == TRUE
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001927 APPL_TRACE_DEBUG("bta_hl_validate_reconnect_params mdl_id=%d app_idx=%d", p_reconnect->mdl_id, app_idx);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001928#endif
1929 if (bta_hl_find_mdl_cfg_idx(app_idx, mcl_idx, p_reconnect->mdl_id, &mdl_cfg_idx))
1930 {
1931 mdl_cfg_found = TRUE;
1932 }
1933
1934#if BTA_HL_DEBUG == TRUE
1935 if (!mdl_cfg_found)
1936 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001937 APPL_TRACE_DEBUG("mdl_cfg_found not found");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001938 }
1939#endif
1940
1941
1942 if (mdl_cfg_found)
1943 {
1944 num_mdeps = p_sup_feature->num_of_mdeps;
1945 for (i=0; i< num_mdeps ; i++)
1946 {
1947 if ( p_sup_feature->mdep[i].mdep_id == p_acb->mdl_cfg[mdl_cfg_idx].local_mdep_id)
1948 {
1949 local_mdep_id_found = TRUE;
1950 *p_mdep_cfg_idx =i;
1951 *p_mdl_cfg_idx = mdl_cfg_idx;
1952 break;
1953 }
1954 }
1955 }
1956
1957#if BTA_HL_DEBUG == TRUE
1958 if (!local_mdep_id_found)
1959 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001960 APPL_TRACE_DEBUG("local_mdep_id not found");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001961 }
1962#endif
1963
1964
1965 if (local_mdep_id_found)
1966 {
1967 if (!bta_hl_find_mdl_idx(app_idx,mcl_idx, p_reconnect->mdl_id, &in_use_mdl_idx))
1968 {
1969 status= TRUE;
1970 }
1971 else
1972 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001973 APPL_TRACE_ERROR("mdl_id=%d is curreltly in use",p_reconnect->mdl_id);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001974 }
1975 }
1976
1977#if BTA_HL_DEBUG == TRUE
1978 if (!status)
1979 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001980 APPL_TRACE_DEBUG("Reconnect validation failed local_mdep_id found=%d mdl_cfg_idx found=%d in_use_mdl_idx=%d ",
The Android Open Source Project5738f832012-12-12 16:00:35 -08001981 local_mdep_id_found, mdl_cfg_found, in_use_mdl_idx);
1982 }
1983#endif
1984 return status;
1985}
1986
1987/*******************************************************************************
1988**
1989** Function bta_hl_find_avail_mcl_idx
1990**
1991** Returns BOOLEAN - TRUE found
1992** FALSE not found
1993**
1994*******************************************************************************/
1995BOOLEAN bta_hl_find_avail_mcl_idx(UINT8 app_idx, UINT8 *p_mcl_idx)
1996{
1997 BOOLEAN found=FALSE;
1998 UINT8 i;
1999
2000 for (i=0; i < BTA_HL_NUM_MCLS ; i ++)
2001 {
2002 if (!bta_hl_cb.acb[app_idx].mcb[i].in_use)
2003 {
2004 found = TRUE;
2005 *p_mcl_idx = i;
2006 break;
2007 }
2008 }
2009
2010#if BTA_HL_DEBUG == TRUE
2011 if (!found)
2012 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002013 APPL_TRACE_DEBUG("bta_hl_find_avail_mcl_idx found=%d idx=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08002014 found, i);
2015 }
2016#endif
2017 return found;
2018}
2019
2020
2021
2022/*******************************************************************************
2023**
2024** Function bta_hl_find_avail_mdl_idx
2025**
2026** Description This function finds an available MDL control block index
2027**
2028** Returns BOOLEAN - TRUE found
2029** FALSE not found
2030**
2031*******************************************************************************/
2032BOOLEAN bta_hl_find_avail_mdl_idx(UINT8 app_idx, UINT8 mcl_idx,
2033 UINT8 *p_mdl_idx)
2034{
2035 tBTA_HL_MCL_CB *p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
2036 BOOLEAN found=FALSE;
2037 UINT8 i;
2038
2039 for (i=0; i < BTA_HL_NUM_MDLS_PER_MCL ; i ++)
2040 {
2041 if (!p_mcb->mdl[i].in_use)
2042 {
2043 memset((void *)&p_mcb->mdl[i],0, sizeof(tBTA_HL_MDL_CB));
2044 found = TRUE;
2045 *p_mdl_idx = i;
2046 break;
2047 }
2048 }
2049
2050#if BTA_HL_DEBUG == TRUE
2051 if (!found)
2052 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002053 APPL_TRACE_DEBUG("bta_hl_find_avail_mdl_idx found=%d idx=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08002054 found, i);
2055 }
2056#endif
2057 return found;
2058}
2059
2060/*******************************************************************************
2061**
2062** Function bta_hl_is_a_duplicate_id
2063**
2064** Description This function finds the application has been used or not
2065**
2066** Returns BOOLEAN - TRUE the app_id is a duplicate ID
2067** FALSE not a duplicate ID
2068*******************************************************************************/
2069BOOLEAN bta_hl_is_a_duplicate_id(UINT8 app_id)
2070{
2071 BOOLEAN is_duplicate=FALSE;
2072 UINT8 i;
2073
2074 for (i=0; i < BTA_HL_NUM_APPS ; i ++)
2075 {
2076 if (bta_hl_cb.acb[i].in_use &&
2077 (bta_hl_cb.acb[i].app_id == app_id))
2078 {
2079 is_duplicate = TRUE;
2080
2081 break;
2082 }
2083 }
2084
2085#if BTA_HL_DEBUG == TRUE
2086 if (is_duplicate)
2087 {
2088
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002089 APPL_TRACE_DEBUG("bta_hl_is_a_duplicate_id app_id=%d is_duplicate=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08002090 app_id, is_duplicate);
2091 }
2092#endif
2093
2094 return is_duplicate;
2095}
2096
2097
2098/*******************************************************************************
2099**
2100** Function bta_hl_find_avail_app_idx
2101**
2102** Description This function finds an available application control block index
2103**
2104** Returns BOOLEAN - TRUE found
2105** FALSE not found
2106**
2107*******************************************************************************/
2108BOOLEAN bta_hl_find_avail_app_idx(UINT8 *p_idx)
2109{
2110 BOOLEAN found=FALSE;
2111 UINT8 i;
2112
2113 for (i=0; i < BTA_HL_NUM_APPS ; i ++)
2114 {
2115 if (!bta_hl_cb.acb[i].in_use)
2116 {
2117 found = TRUE;
2118 *p_idx = i;
2119 break;
2120 }
2121 }
2122
2123#if BTA_HL_DEBUG == TRUE
2124 if (!found)
2125 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002126 APPL_TRACE_DEBUG("bta_hl_find_avail_app_idx found=%d app_idx=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08002127 found, i);
2128 }
2129#endif
2130 return found;
2131}
2132
2133/*******************************************************************************
2134**
Priti Agheraf8f30c22013-04-02 15:31:19 -07002135** Function bta_hl_app_update
2136**
2137** Description This function registers an HDP application MCAP and DP
2138**
2139** Returns tBTA_HL_STATUS -registration status
2140**
2141*******************************************************************************/
2142tBTA_HL_STATUS bta_hl_app_update(UINT8 app_id, BOOLEAN is_register)
2143{
2144 tBTA_HL_STATUS status = BTA_HL_STATUS_OK;
2145 tBTA_HL_APP_CB *p_acb = BTA_HL_GET_APP_CB_PTR(0);
2146 tMCA_CS mca_cs;
2147 UINT8 i, mdep_idx, num_of_mdeps;
2148 UINT8 mdep_counter = 0;
2149
2150
2151#if BTA_HL_DEBUG == TRUE
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002152 APPL_TRACE_DEBUG("bta_hl_app_update app_id=%d", app_id);
Priti Agheraf8f30c22013-04-02 15:31:19 -07002153#endif
2154
2155 if (is_register)
2156 {
2157 if ((status == BTA_HL_STATUS_OK) &&
2158 bta_hl_co_get_num_of_mdep(app_id, &num_of_mdeps))
2159 {
2160 for (i=0; i < num_of_mdeps; i++)
2161 {
2162 mca_cs.type = MCA_TDEP_DATA;
2163 mca_cs.max_mdl = BTA_HL_NUM_MDLS_PER_MDEP;
2164 mca_cs.p_data_cback = bta_hl_mcap_data_cback;
2165 /* Find the first available mdep index, and create a MDL Endpoint */
2166 // make a function later if needed
2167 for (mdep_idx = 1; mdep_idx < BTA_HL_NUM_MDEPS; mdep_idx++)
2168 {
2169 if ( p_acb->sup_feature.mdep[mdep_idx].mdep_id == 0)
2170 {
2171 break; /* We found an available index */
2172 }
2173 else
2174 {
2175 mdep_counter++;
2176 }
2177 }
2178 /* If no available MDEPs, return error */
2179 if (mdep_idx == BTA_HL_NUM_MDEPS)
2180 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002181 APPL_TRACE_ERROR("bta_hl_app_update: Out of MDEP IDs");
Priti Agheraf8f30c22013-04-02 15:31:19 -07002182 status = BTA_HL_STATUS_MCAP_REG_FAIL;
2183 break;
2184 }
2185 if (MCA_CreateDep((tMCA_HANDLE)p_acb->app_handle,
2186 &(p_acb->sup_feature.mdep[mdep_idx].mdep_id), &mca_cs) == MCA_SUCCESS)
2187 {
2188 if (bta_hl_co_get_mdep_config(app_id,
2189 mdep_idx,
2190 mdep_counter,
2191 p_acb->sup_feature.mdep[mdep_idx].mdep_id,
2192 &p_acb->sup_feature.mdep[mdep_idx].mdep_cfg))
2193 {
2194 p_acb->sup_feature.mdep[mdep_idx].ori_app_id = app_id;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002195 APPL_TRACE_DEBUG("mdep idx %d id %d ori_app_id %d num data type %d",mdep_idx,
Priti Agheraf8f30c22013-04-02 15:31:19 -07002196 p_acb->sup_feature.mdep[mdep_idx].mdep_id,
2197 p_acb->sup_feature.mdep[mdep_idx].ori_app_id,
2198 p_acb->sup_feature.mdep[mdep_idx].mdep_cfg.num_of_mdep_data_types);
2199 if (p_acb->sup_feature.mdep[mdep_idx].mdep_cfg.mdep_role ==
2200 BTA_HL_MDEP_ROLE_SOURCE)
2201 {
2202 p_acb->sup_feature.app_role_mask |= BTA_HL_MDEP_ROLE_MASK_SOURCE;
2203 }
2204 else if (p_acb->sup_feature.mdep[mdep_idx].mdep_cfg.mdep_role ==
2205 BTA_HL_MDEP_ROLE_SINK)
2206 {
2207 p_acb->sup_feature.app_role_mask |= BTA_HL_MDEP_ROLE_MASK_SINK;
2208 }
2209 else
2210 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002211 APPL_TRACE_ERROR("bta_hl_app_registration: Invalid Role %d",
Priti Agheraf8f30c22013-04-02 15:31:19 -07002212 p_acb->sup_feature.mdep[mdep_idx].mdep_cfg.mdep_role);
2213 status = BTA_HL_STATUS_MDEP_CO_FAIL;
2214 break;
2215 }
2216 }
2217 else
2218 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002219 APPL_TRACE_ERROR("bta_hl_app_registration: Cfg callout failed");
Priti Agheraf8f30c22013-04-02 15:31:19 -07002220 status = BTA_HL_STATUS_MDEP_CO_FAIL;
2221 break;
2222 }
2223 }
2224 else
2225 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002226 APPL_TRACE_ERROR("bta_hl_app_registration: MCA_CreateDep failed");
Priti Agheraf8f30c22013-04-02 15:31:19 -07002227 status = BTA_HL_STATUS_MCAP_REG_FAIL;
2228 break;
2229 }
2230
2231 }
2232 p_acb->sup_feature.num_of_mdeps += num_of_mdeps;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002233 APPL_TRACE_DEBUG("num_of_mdeps %d", p_acb->sup_feature.num_of_mdeps);
Priti Agheraf8f30c22013-04-02 15:31:19 -07002234
2235 if ((status == BTA_HL_STATUS_OK) &&
2236 (p_acb->sup_feature.app_role_mask == BTA_HL_MDEP_ROLE_MASK_SOURCE))
2237 {
2238 p_acb->sup_feature.advertize_source_sdp =
2239 bta_hl_co_advrtise_source_sdp(app_id);
2240 }
2241
2242 if ((status == BTA_HL_STATUS_OK)&&
2243 (!bta_hl_co_get_echo_config(app_id, &p_acb->sup_feature.echo_cfg)))
2244 {
2245 status = BTA_HL_STATUS_ECHO_CO_FAIL;
2246 }
2247
2248 if ((status == BTA_HL_STATUS_OK)&&
2249 (!bta_hl_co_load_mdl_config(app_id, BTA_HL_NUM_MDL_CFGS, &p_acb->mdl_cfg[0])))
2250 {
2251 status = BTA_HL_STATUS_MDL_CFG_CO_FAIL;
2252 }
2253 }
2254 else
2255 {
2256 status = BTA_HL_STATUS_MDEP_CO_FAIL;
2257 }
2258 }
2259 else
2260 {
2261 for (i=1; i<BTA_HL_NUM_MDEPS; i++)
2262 {
2263 if (p_acb->sup_feature.mdep[i].ori_app_id == app_id)
2264 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002265 APPL_TRACE_DEBUG("Found index %", i);
Priti Agheraf8f30c22013-04-02 15:31:19 -07002266
2267
2268 if (MCA_DeleteDep((tMCA_HANDLE)p_acb->app_handle,
2269 (p_acb->sup_feature.mdep[i].mdep_id)) != MCA_SUCCESS)
2270 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002271 APPL_TRACE_ERROR("Error deregistering");
Priti Agheraf8f30c22013-04-02 15:31:19 -07002272 status = BTA_HL_STATUS_MCAP_REG_FAIL;
2273 return status;
2274 }
2275 memset(&p_acb->sup_feature.mdep[i], 0, sizeof(tBTA_HL_MDEP));
2276 }
2277 }
2278
2279
2280 }
2281
2282 if (status == BTA_HL_STATUS_OK)
2283 {
2284 /* Register/Update MDEP(s) in SDP Record */
2285 status = bta_hl_sdp_update(app_id);
2286 }
2287 /* else do cleanup */
2288
2289
2290 return status;
2291}
2292
2293
2294/*******************************************************************************
2295**
The Android Open Source Project5738f832012-12-12 16:00:35 -08002296** Function bta_hl_app_registration
2297**
2298** Description This function registers an HDP application MCAP and DP
2299**
2300** Returns tBTA_HL_STATUS -registration status
2301**
2302*******************************************************************************/
2303tBTA_HL_STATUS bta_hl_app_registration(UINT8 app_idx)
2304{
2305 tBTA_HL_STATUS status = BTA_HL_STATUS_OK;
2306 tBTA_HL_APP_CB *p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
2307 tMCA_REG reg;
2308 tMCA_CS mca_cs;
2309 UINT8 i, num_of_mdeps;
Priti Agheraf8f30c22013-04-02 15:31:19 -07002310 UINT8 mdep_counter = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002311
2312#if BTA_HL_DEBUG == TRUE
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002313 APPL_TRACE_DEBUG("bta_hl_app_registration app_idx=%d", app_idx);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002314#endif
2315
2316 reg.ctrl_psm = p_acb->ctrl_psm;
2317 reg.data_psm = p_acb->data_psm;
2318 reg.sec_mask = p_acb->sec_mask;
2319 reg.rsp_tout = BTA_HL_MCAP_RSP_TOUT;
2320
2321 if ( (p_acb->app_handle = (tBTA_HL_APP_HANDLE) MCA_Register(&reg, bta_hl_mcap_ctrl_cback))!=0)
2322 {
2323 mca_cs.type = MCA_TDEP_ECHO;
2324 mca_cs.max_mdl = BTA_HL_NUM_MDLS_PER_MDEP;
2325 mca_cs.p_data_cback = bta_hl_mcap_data_cback;
2326
2327 if (MCA_CreateDep((tMCA_HANDLE)p_acb->app_handle,
2328 &(p_acb->sup_feature.mdep[0].mdep_id),
2329 &mca_cs) == MCA_SUCCESS)
2330 {
2331 if (p_acb->sup_feature.mdep[0].mdep_id != BTA_HL_ECHO_TEST_MDEP_ID)
2332 {
2333 status = BTA_HL_STATUS_MCAP_REG_FAIL;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002334 APPL_TRACE_ERROR("BAD MDEP ID for echo test mdep_id=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08002335 p_acb->sup_feature.mdep[0].mdep_id );
2336 }
2337 }
2338 else
2339 {
2340 status = BTA_HL_STATUS_MCAP_REG_FAIL;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002341 APPL_TRACE_ERROR("MCA_CreateDep for echo test(mdep_id=0) failed");
The Android Open Source Project5738f832012-12-12 16:00:35 -08002342 }
2343
2344
2345 if ((status == BTA_HL_STATUS_OK) &&
2346 bta_hl_co_get_num_of_mdep(p_acb->app_id, &num_of_mdeps))
2347 {
2348 p_acb->sup_feature.num_of_mdeps = num_of_mdeps+1;
2349
2350 for (i=1; i<p_acb->sup_feature.num_of_mdeps; i++)
2351 {
2352 mca_cs.type = MCA_TDEP_DATA;
2353 mca_cs.max_mdl = BTA_HL_NUM_MDLS_PER_MDEP;
2354 mca_cs.p_data_cback = bta_hl_mcap_data_cback;
2355
2356 if (MCA_CreateDep((tMCA_HANDLE)p_acb->app_handle,
2357 &(p_acb->sup_feature.mdep[i].mdep_id), &mca_cs) == MCA_SUCCESS)
2358 {
2359 if (bta_hl_co_get_mdep_config(p_acb->app_id,
Priti Agheraf8f30c22013-04-02 15:31:19 -07002360 i,mdep_counter,
The Android Open Source Project5738f832012-12-12 16:00:35 -08002361 p_acb->sup_feature.mdep[i].mdep_id,
2362 &p_acb->sup_feature.mdep[i].mdep_cfg))
2363 {
2364 if (p_acb->sup_feature.mdep[i].mdep_cfg.mdep_role == BTA_HL_MDEP_ROLE_SOURCE)
2365 {
2366 p_acb->sup_feature.app_role_mask |= BTA_HL_MDEP_ROLE_MASK_SOURCE;
2367 }
2368 else if (p_acb->sup_feature.mdep[i].mdep_cfg.mdep_role == BTA_HL_MDEP_ROLE_SINK)
2369 {
2370 p_acb->sup_feature.app_role_mask |= BTA_HL_MDEP_ROLE_MASK_SINK;
2371 }
2372 else
2373 {
2374 status = BTA_HL_STATUS_MDEP_CO_FAIL;
2375 break;
2376 }
Priti Agheraf8f30c22013-04-02 15:31:19 -07002377 p_acb->sup_feature.mdep[i].ori_app_id = p_acb->app_id;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002378 APPL_TRACE_DEBUG("index %d ori_app_id %d", i,
Priti Agheraf8f30c22013-04-02 15:31:19 -07002379 p_acb->sup_feature.mdep[i].ori_app_id);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002380 }
2381 else
2382 {
2383 status = BTA_HL_STATUS_MDEP_CO_FAIL;
2384 break;
2385 }
2386 }
2387 else
2388 {
2389 status = BTA_HL_STATUS_MCAP_REG_FAIL;
2390 break;
2391 }
2392 }
2393
2394
2395
2396 if ((status == BTA_HL_STATUS_OK) &&
2397 (p_acb->sup_feature.app_role_mask == BTA_HL_MDEP_ROLE_MASK_SOURCE))
2398 {
2399 /* this is a source only applciation */
2400 p_acb->sup_feature.advertize_source_sdp =
2401 bta_hl_co_advrtise_source_sdp(p_acb->app_id);
2402 }
2403
2404 if ((status == BTA_HL_STATUS_OK)&&
2405 (!bta_hl_co_get_echo_config(p_acb->app_id, &p_acb->sup_feature.echo_cfg)))
2406 {
2407 status = BTA_HL_STATUS_ECHO_CO_FAIL;
2408 }
2409
2410 if ((status == BTA_HL_STATUS_OK)&&
2411 (!bta_hl_co_load_mdl_config(p_acb->app_id, BTA_HL_NUM_MDL_CFGS, &p_acb->mdl_cfg[0])))
2412 {
2413 status = BTA_HL_STATUS_MDL_CFG_CO_FAIL;
2414 }
2415 }
2416 else
2417 {
2418 status = BTA_HL_STATUS_MDEP_CO_FAIL;
2419 }
2420 }
2421 else
2422 {
2423 status = BTA_HL_STATUS_MCAP_REG_FAIL;
2424 }
2425
2426 if (status == BTA_HL_STATUS_OK)
2427 {
2428 status = bta_hl_sdp_register(app_idx);
2429 }
2430
2431 return status;
2432}
2433
2434
2435/*******************************************************************************
2436**
2437** Function bta_hl_discard_data
2438**
2439** Description This function discard an HDP event
2440**
2441** Returns void
2442**
2443*******************************************************************************/
2444void bta_hl_discard_data(UINT16 event, tBTA_HL_DATA *p_data)
2445{
2446
2447#if BTA_HL_DEBUG == TRUE
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002448 APPL_TRACE_ERROR("BTA HL Discard event=%s",bta_hl_evt_code(event));
The Android Open Source Project5738f832012-12-12 16:00:35 -08002449
2450#endif
2451
2452 switch (event)
2453 {
2454 case BTA_HL_API_SEND_DATA_EVT:
2455 break;
2456
2457 case BTA_HL_MCA_RCV_DATA_EVT:
Pavlin Radoslavovcceb4302016-02-05 13:54:43 -08002458 osi_free_and_reset((void **)&p_data->mca_rcv_data_evt.p_pkt);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002459 break;
2460
2461 default:
2462 /*Nothing to free*/
2463 break;
2464 }
2465}
2466
2467/*******************************************************************************
2468**
2469** Function bta_hl_save_mdl_cfg
2470**
2471** Description This function saves the MDL configuration
2472**
2473** Returns void
2474**
2475*******************************************************************************/
2476void bta_hl_save_mdl_cfg(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx )
2477{
2478 tBTA_HL_APP_CB *p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
2479 tBTA_HL_MCL_CB *p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
2480 tBTA_HL_MDL_CB *p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
2481 UINT8 mdl_cfg_idx;
2482 tBTA_HL_MDL_ID mdl_id;
2483 BOOLEAN found=TRUE;
2484 tBTA_HL_MDL_CFG mdl_cfg;
2485 tBTA_HL_MDEP *p_mdep_cfg;
2486 tBTA_HL_L2CAP_CFG_INFO l2cap_cfg;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002487 UINT8 time_val = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002488 mdl_id = p_dcb->mdl_id;
2489 if (!bta_hl_find_mdl_cfg_idx(app_idx, mcl_idx, mdl_id, &mdl_cfg_idx))
2490 {
2491 if (!bta_hl_find_avail_mdl_cfg_idx(app_idx, mcl_idx, &mdl_cfg_idx))
2492 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002493 APPL_TRACE_ERROR("No space to save the MDL config");
The Android Open Source Project5738f832012-12-12 16:00:35 -08002494 found= FALSE; /*no space available*/
2495 }
2496 }
2497
2498 if (found)
2499 {
2500 bta_hl_get_l2cap_cfg(p_dcb->mdl_handle, &l2cap_cfg);
2501 if (!bta_hl_get_cur_time(app_idx, &time_val ))
2502 {
Priti Agheraf8f30c22013-04-02 15:31:19 -07002503 bta_hl_compact_mdl_cfg_time(app_idx,p_dcb->local_mdep_id);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002504 bta_hl_get_cur_time(app_idx, &time_val);
2505 }
2506 mdl_cfg.active = TRUE;
2507 mdl_cfg.time = time_val;
2508 mdl_cfg.mdl_id = p_dcb->mdl_id;
2509 mdl_cfg.dch_mode = p_dcb->dch_mode;
2510 mdl_cfg.mtu = l2cap_cfg.mtu;
2511 mdl_cfg.fcs = l2cap_cfg.fcs;
2512
2513 bdcpy(mdl_cfg.peer_bd_addr, p_mcb->bd_addr);
2514 mdl_cfg.local_mdep_id= p_dcb->local_mdep_id;
2515 p_mdep_cfg = &p_acb->sup_feature.mdep[p_dcb->local_mdep_cfg_idx];
2516 mdl_cfg.local_mdep_role= p_mdep_cfg->mdep_cfg.mdep_role;
2517 memcpy(&p_acb->mdl_cfg[mdl_cfg_idx], &mdl_cfg, sizeof(tBTA_HL_MDL_CFG));
Priti Agheraf8f30c22013-04-02 15:31:19 -07002518 bta_hl_co_save_mdl(mdl_cfg.local_mdep_id, mdl_cfg_idx, &mdl_cfg);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002519 }
2520
2521#if BTA_HL_DEBUG == TRUE
2522 if (found)
2523 {
2524 if (p_dcb->mtu != l2cap_cfg.mtu)
2525 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002526 APPL_TRACE_WARNING("MCAP and L2CAP peer mtu size out of sync from MCAP mtu=%d from l2cap mtu=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08002527 p_dcb->mtu, l2cap_cfg.mtu);
2528 }
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002529 APPL_TRACE_DEBUG("bta_hl_save_mdl_cfg saved=%d", found);
2530 APPL_TRACE_DEBUG("Saved. L2cap cfg mdl_id=%d mtu=%d fcs=%d dch_mode=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08002531 mdl_cfg.mdl_id, mdl_cfg.mtu, mdl_cfg.fcs, mdl_cfg.dch_mode);
2532 }
2533#endif
2534
2535
2536
2537}
2538
2539/*******************************************************************************
2540**
2541** Function bta_hl_set_dch_chan_cfg
2542**
2543** Description This function setups the L2CAP DCH channel configuration
2544**
2545** Returns void
2546*******************************************************************************/
2547void bta_hl_set_dch_chan_cfg(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx,tBTA_HL_DATA *p_data)
2548{
2549 tBTA_HL_APP_CB *p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
2550 tBTA_HL_MDL_CB *p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
2551 UINT8 l2cap_mode = L2CAP_FCR_ERTM_MODE;
2552 tBTA_HL_SUP_FEATURE *p_sup_feature= &p_acb->sup_feature;
2553 UINT8 local_mdep_cfg_idx = p_dcb->local_mdep_cfg_idx;
2554
2555 switch (p_dcb->dch_oper)
2556 {
2557 case BTA_HL_DCH_OP_LOCAL_RECONNECT:
2558 case BTA_HL_DCH_OP_REMOTE_RECONNECT:
2559 if (p_dcb->dch_mode == BTA_HL_DCH_MODE_STREAMING)
2560 l2cap_mode = L2CAP_FCR_STREAM_MODE;
2561 break;
2562 case BTA_HL_DCH_OP_LOCAL_OPEN:
2563 if (p_data->mca_evt.mca_data.create_cfm.cfg == BTA_HL_DCH_CFG_STREAMING)
2564 l2cap_mode = L2CAP_FCR_STREAM_MODE;
2565 break;
2566 case BTA_HL_DCH_OP_REMOTE_OPEN:
2567 if (p_dcb->local_cfg == BTA_HL_DCH_CFG_STREAMING )
2568 l2cap_mode = L2CAP_FCR_STREAM_MODE;
2569 break;
2570 default:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002571 APPL_TRACE_ERROR("Invalid dch oper=%d for set dch chan cfg", p_dcb->dch_oper);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002572 break;
2573 }
2574 p_dcb->chnl_cfg.fcr_opt.mode = l2cap_mode;
2575 p_dcb->chnl_cfg.fcr_opt.mps = bta_hl_set_mps(p_dcb->max_rx_apdu_size);
2576 p_dcb->chnl_cfg.fcr_opt.tx_win_sz = bta_hl_set_tx_win_size(p_dcb->max_rx_apdu_size,
2577 p_dcb->chnl_cfg.fcr_opt.mps);
2578 p_dcb->chnl_cfg.fcr_opt.max_transmit= BTA_HL_L2C_MAX_TRANSMIT;
2579 p_dcb->chnl_cfg.fcr_opt.rtrans_tout = BTA_HL_L2C_RTRANS_TOUT;
2580 p_dcb->chnl_cfg.fcr_opt.mon_tout = BTA_HL_L2C_MON_TOUT;
2581
Pavlin Radoslavov1d5b8592015-09-23 10:08:20 -07002582 p_dcb->chnl_cfg.user_rx_buf_size = bta_hl_set_user_rx_buf_size(p_dcb->max_rx_apdu_size);
2583 p_dcb->chnl_cfg.user_tx_buf_size = bta_hl_set_user_tx_buf_size(p_dcb->max_tx_apdu_size);
2584 p_dcb->chnl_cfg.fcr_rx_buf_size = L2CAP_INVALID_ERM_BUF_SIZE;
2585 p_dcb->chnl_cfg.fcr_tx_buf_size = L2CAP_INVALID_ERM_BUF_SIZE;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002586 p_dcb->chnl_cfg.data_mtu = p_dcb->max_rx_apdu_size;
2587
2588 p_dcb->chnl_cfg.fcs = BTA_HL_MCA_NO_FCS;
2589 if (local_mdep_cfg_idx != BTA_HL_ECHO_TEST_MDEP_CFG_IDX)
2590 {
2591 if (p_sup_feature->mdep[local_mdep_cfg_idx].mdep_cfg.mdep_role ==
2592 BTA_HL_MDEP_ROLE_SOURCE)
2593 {
2594 p_dcb->chnl_cfg.fcs = BTA_HL_DEFAULT_SOURCE_FCS;
2595 }
2596 }
2597 else
2598 {
2599 p_dcb->chnl_cfg.fcs = BTA_HL_MCA_USE_FCS;
2600 }
2601
2602#if BTA_HL_DEBUG == TRUE
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002603 APPL_TRACE_DEBUG("L2CAP Params l2cap_mode[3-ERTM 4-STREAM]=%d", l2cap_mode);
2604 APPL_TRACE_DEBUG("Use FCS =%s mtu=%d", ((p_dcb->chnl_cfg.fcs & 1)?"YES":"NO"),
The Android Open Source Project5738f832012-12-12 16:00:35 -08002605 p_dcb->chnl_cfg.data_mtu);
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002606 APPL_TRACE_DEBUG("tx_win_sz=%d, max_transmit=%d, rtrans_tout=%d, mon_tout=%d, mps=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08002607 p_dcb->chnl_cfg.fcr_opt.tx_win_sz,
2608 p_dcb->chnl_cfg.fcr_opt.max_transmit,
2609 p_dcb->chnl_cfg.fcr_opt.rtrans_tout,
2610 p_dcb->chnl_cfg.fcr_opt.mon_tout,
2611 p_dcb->chnl_cfg.fcr_opt.mps);
2612
Pavlin Radoslavov1d5b8592015-09-23 10:08:20 -07002613 APPL_TRACE_DEBUG("USER rx_buf_size=%d, tx_buf_size=%d, FCR rx_buf_size=%d, tx_buf_size=%d",
2614 p_dcb->chnl_cfg.user_rx_buf_size,
2615 p_dcb->chnl_cfg.user_tx_buf_size,
2616 p_dcb->chnl_cfg.fcr_rx_buf_size,
2617 p_dcb->chnl_cfg.fcr_tx_buf_size);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002618
2619#endif
2620
2621
2622
2623
2624
2625
2626
2627
2628}
2629
2630/*******************************************************************************
2631**
2632** Function bta_hl_get_l2cap_cfg
2633**
2634** Description This function get the current L2CAP channel configuration
2635**
2636** Returns BOOLEAN - TRUE - operation is successful
2637*******************************************************************************/
2638BOOLEAN bta_hl_get_l2cap_cfg(tBTA_HL_MDL_HANDLE mdl_hnd, tBTA_HL_L2CAP_CFG_INFO *p_cfg)
2639{
2640 BOOLEAN success = FALSE;
2641 UINT16 lcid;
2642 tL2CAP_CFG_INFO *p_our_cfg;
2643 tL2CAP_CH_CFG_BITS our_cfg_bits;
2644 tL2CAP_CFG_INFO *p_peer_cfg;
2645 tL2CAP_CH_CFG_BITS peer_cfg_bits;
2646
2647 lcid = MCA_GetL2CapChannel((tMCA_DL) mdl_hnd);
2648 if ( lcid &&
2649 L2CA_GetCurrentConfig(lcid, &p_our_cfg, &our_cfg_bits, &p_peer_cfg,
2650 &peer_cfg_bits))
2651 {
2652 p_cfg->fcs = BTA_HL_MCA_NO_FCS;
2653 if (our_cfg_bits & L2CAP_CH_CFG_MASK_FCS)
2654 {
2655 p_cfg->fcs |= p_our_cfg->fcs;
2656 }
2657 else
2658 {
2659 p_cfg->fcs = BTA_HL_MCA_USE_FCS;
2660 }
2661
2662 if (p_cfg->fcs != BTA_HL_MCA_USE_FCS )
2663 {
2664 if (peer_cfg_bits & L2CAP_CH_CFG_MASK_FCS)
2665 {
2666 p_cfg->fcs |= p_peer_cfg->fcs;
2667 }
2668 else
2669 {
2670 p_cfg->fcs = BTA_HL_MCA_USE_FCS;
2671 }
2672 }
2673
2674 p_cfg->mtu =0;
2675 if (peer_cfg_bits & L2CAP_CH_CFG_MASK_MTU)
2676 {
2677 p_cfg->mtu = p_peer_cfg->mtu;
2678 }
2679 else
2680 {
2681 p_cfg->mtu = L2CAP_DEFAULT_MTU;
2682 }
2683 success = TRUE;
2684 }
Matthew Xiebea41312014-05-09 01:04:04 -07002685 else
2686 {
2687 p_cfg->mtu = L2CAP_DEFAULT_MTU;
2688 p_cfg->fcs = BTA_HL_L2C_NO_FCS;
2689 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08002690
2691#if BTA_HL_DEBUG == TRUE
2692 if (!success)
2693 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002694 APPL_TRACE_DEBUG("bta_hl_get_l2cap_cfg success=%d mdl=%d lcid=%d", success, mdl_hnd, lcid);
2695 APPL_TRACE_DEBUG("l2cap mtu=%d fcs=%d", p_cfg->mtu, p_cfg->fcs);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002696 }
2697#endif
2698
2699 return success;
2700}
2701
2702/*******************************************************************************
2703**
2704** Function bta_hl_validate_chan_cfg
2705**
2706** Description This function validates the L2CAP channel configuration
2707**
2708** Returns BOOLEAN - TRUE - validation is successful
2709*******************************************************************************/
2710BOOLEAN bta_hl_validate_chan_cfg(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx)
2711{
2712 tBTA_HL_APP_CB *p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
2713 tBTA_HL_MDL_CB *p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
2714 BOOLEAN success = FALSE;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002715 UINT8 mdl_cfg_idx = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002716 tBTA_HL_L2CAP_CFG_INFO l2cap_cfg;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002717 BOOLEAN get_l2cap_result, get_mdl_result;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002718
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002719 get_l2cap_result = bta_hl_get_l2cap_cfg(p_dcb->mdl_handle, &l2cap_cfg);
2720 get_mdl_result = bta_hl_find_mdl_cfg_idx(app_idx, mcl_idx, p_dcb->mdl_id, &mdl_cfg_idx);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002721
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002722 if (get_l2cap_result && get_mdl_result)
The Android Open Source Project5738f832012-12-12 16:00:35 -08002723 {
2724 if ((p_acb->mdl_cfg[mdl_cfg_idx].mtu <= l2cap_cfg.mtu) &&
2725 (p_acb->mdl_cfg[mdl_cfg_idx].fcs == l2cap_cfg.fcs) &&
2726 (p_acb->mdl_cfg[mdl_cfg_idx].dch_mode == p_dcb->dch_mode))
2727 {
2728 success = TRUE;
2729 }
2730 }
2731
2732
2733#if BTA_HL_DEBUG == TRUE
2734
2735 if (p_dcb->mtu != l2cap_cfg.mtu)
2736 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002737 APPL_TRACE_WARNING("MCAP and L2CAP peer mtu size out of sync from MCAP mtu=%d from l2cap mtu=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08002738 p_dcb->mtu, l2cap_cfg.mtu);
2739 }
2740
2741 if (!success)
2742 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002743 APPL_TRACE_DEBUG("bta_hl_validate_chan_cfg success=%d app_idx=%d mcl_idx=%d mdl_idx=%d",success, app_idx, mcl_idx, mdl_idx);
2744 APPL_TRACE_DEBUG("Cur. L2cap cfg mtu=%d fcs=%d dch_mode=%d", l2cap_cfg.mtu, l2cap_cfg.fcs, p_dcb->dch_mode);
2745 APPL_TRACE_DEBUG("From saved: L2cap cfg mtu=%d fcs=%d dch_mode=%d", p_acb->mdl_cfg[mdl_cfg_idx].mtu,
The Android Open Source Project5738f832012-12-12 16:00:35 -08002746 p_acb->mdl_cfg[mdl_cfg_idx].fcs , p_acb->mdl_cfg[mdl_cfg_idx].dch_mode);
2747 }
2748#endif
2749
2750 return success;
2751}
2752
2753
2754/*******************************************************************************
2755**
2756** Function bta_hl_is_cong_on
2757**
2758** Description This function checks whether the congestion condition is on or not
2759**
2760** Returns BOOLEAN - TRUE DCH is congested
2761** FALSE not congested
2762**
2763*******************************************************************************/
2764BOOLEAN bta_hl_is_cong_on(UINT8 app_id, BD_ADDR bd_addr, tBTA_HL_MDL_ID mdl_id)
2765
2766{
2767 tBTA_HL_MDL_CB *p_dcb;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002768 UINT8 app_idx = 0, mcl_idx, mdl_idx;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002769 BOOLEAN cong_status = TRUE;
2770
2771 if (bta_hl_find_app_idx(app_id, &app_idx))
2772 {
2773 if (bta_hl_find_mcl_idx(app_idx, bd_addr, &mcl_idx ))
2774 {
2775 if (bta_hl_find_mdl_idx(app_idx, mcl_idx, mdl_id, &mdl_idx ))
2776 {
2777 p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
2778 cong_status = p_dcb->cong;
2779 }
2780 }
2781 }
2782
2783 return cong_status;
2784}
2785
2786/*******************************************************************************
2787**
2788** Function bta_hl_check_cch_close
2789**
2790** Description This function checks whether there is a pending CCH close request
2791** or not
2792**
2793** Returns void
2794*******************************************************************************/
2795void bta_hl_check_cch_close(UINT8 app_idx, UINT8 mcl_idx, tBTA_HL_DATA *p_data, BOOLEAN check_dch_setup )
2796{
2797 tBTA_HL_MCL_CB *p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
2798 tBTA_HL_MDL_CB *p_dcb;
2799 UINT8 mdl_idx;
2800
2801#if (BTA_HL_DEBUG == TRUE)
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002802 APPL_TRACE_DEBUG("bta_hl_check_cch_close cch_close_dch_oper=%d",p_mcb->cch_close_dch_oper );
The Android Open Source Project5738f832012-12-12 16:00:35 -08002803#endif
2804
2805 if (p_mcb->cch_oper == BTA_HL_CCH_OP_LOCAL_CLOSE)
2806 {
2807 if (check_dch_setup && bta_hl_find_dch_setup_mdl_idx(app_idx, mcl_idx, &mdl_idx))
2808 {
2809 p_dcb = BTA_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
2810 if (!p_mcb->rsp_tout)
2811 {
2812 p_mcb->cch_close_dch_oper = BTA_HL_CCH_CLOSE_OP_DCH_ABORT;
2813
2814 if (!p_dcb->abort_oper)
2815 {
2816 p_dcb->abort_oper |= BTA_HL_ABORT_CCH_CLOSE_MASK;
2817 bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_ABORT_EVT, p_data);
2818 }
2819 }
2820 else
2821 {
2822 p_mcb->cch_close_dch_oper = BTA_HL_CCH_CLOSE_OP_DCH_CLOSE;
2823 bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_CMPL_EVT, p_data);
2824 }
2825 }
2826 else if (bta_hl_find_an_active_mdl_idx(app_idx, mcl_idx,&mdl_idx))
2827 {
2828 p_mcb->cch_close_dch_oper = BTA_HL_CCH_CLOSE_OP_DCH_CLOSE;
2829 bta_hl_dch_sm_execute(app_idx, mcl_idx, mdl_idx, BTA_HL_DCH_CLOSE_EVT, p_data);
2830 }
2831 else
2832 {
2833 p_mcb->cch_close_dch_oper = BTA_HL_CCH_CLOSE_OP_DCH_NONE;
2834 bta_hl_cch_sm_execute(app_idx, mcl_idx, BTA_HL_CCH_CLOSE_EVT, p_data);
2835 }
2836 }
2837}
2838
2839/*******************************************************************************
2840**
2841** Function bta_hl_clean_app
2842**
2843** Description Cleans up the HDP application resources and control block
2844**
2845** Returns void
2846**
2847*******************************************************************************/
2848void bta_hl_clean_app(UINT8 app_idx)
2849{
2850 tBTA_HL_APP_CB *p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
2851 int i, num_act_apps=0;
2852
2853#if BTA_HL_DEBUG == TRUE
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002854 APPL_TRACE_DEBUG("bta_hl_clean_app");
The Android Open Source Project5738f832012-12-12 16:00:35 -08002855#endif
2856 MCA_Deregister((tMCA_HANDLE)p_acb->app_handle);
2857
2858 if (p_acb->sdp_handle) SDP_DeleteRecord(p_acb->sdp_handle);
2859
2860 memset((void *) p_acb, 0, sizeof(tBTA_HL_APP_CB));
2861
2862 /* check any application is still active */
2863 for (i=0; i < BTA_HL_NUM_APPS ; i ++)
2864 {
2865 p_acb = BTA_HL_GET_APP_CB_PTR(i);
2866 if (p_acb->in_use) num_act_apps++;
2867 }
2868
2869 if (!num_act_apps)
2870 {
2871 bta_sys_remove_uuid(UUID_SERVCLASS_HDP_PROFILE);
2872 }
2873}
2874
2875/*******************************************************************************
2876**
2877** Function bta_hl_check_deregistration
2878**
2879** Description This function checks whether there is a pending deregistration
2880** request or not
2881**
2882** Returns void
2883*******************************************************************************/
2884void bta_hl_check_deregistration(UINT8 app_idx, tBTA_HL_DATA *p_data )
2885{
2886 tBTA_HL_APP_CB *p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
2887 tBTA_HL_MCL_CB *p_mcb;
2888 UINT8 mcl_idx;
2889 tBTA_HL evt_data;
2890
2891#if (BTA_HL_DEBUG == TRUE)
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002892 APPL_TRACE_DEBUG("bta_hl_check_deregistration");
The Android Open Source Project5738f832012-12-12 16:00:35 -08002893#endif
2894
2895 if (p_acb->deregistering)
2896 {
2897 if (bta_hl_find_an_in_use_mcl_idx(app_idx, &mcl_idx))
2898 {
2899 p_mcb = BTA_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
2900 if (p_mcb->cch_oper != BTA_HL_CCH_OP_LOCAL_CLOSE)
2901 {
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002902 if (p_mcb->cch_state == BTA_HL_CCH_OPENING_ST)
2903 p_mcb->force_close_local_cch_opening = TRUE;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002904 p_mcb->cch_oper = BTA_HL_CCH_OP_LOCAL_CLOSE;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002905 APPL_TRACE_DEBUG("p_mcb->force_close_local_cch_opening=%d", p_mcb->force_close_local_cch_opening );
The Android Open Source Project5738f832012-12-12 16:00:35 -08002906 bta_hl_check_cch_close(app_idx,mcl_idx,p_data, TRUE);
2907 }
2908 }
2909 else
2910 {
2911 /* all cchs are closed */
2912 evt_data.dereg_cfm.app_handle = p_acb->app_handle;
Priti Agheraf8f30c22013-04-02 15:31:19 -07002913 evt_data.dereg_cfm.app_id = p_data->api_dereg.app_id;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002914 evt_data.dereg_cfm.status = BTA_HL_STATUS_OK;
2915 p_acb->p_cback(BTA_HL_DEREGISTER_CFM_EVT, (tBTA_HL *) &evt_data );
2916 bta_hl_clean_app(app_idx);
2917 bta_hl_check_disable(p_data);
2918 }
2919 }
2920}
2921
2922
2923/*******************************************************************************
2924**
2925** Function bta_hl_check_disable
2926**
2927** Description This function checks whether there is a pending disable
2928** request or not
2929**
2930** Returns void
2931**
2932*******************************************************************************/
2933void bta_hl_check_disable(tBTA_HL_DATA *p_data )
2934{
2935 tBTA_HL_CB *p_cb= &bta_hl_cb;
2936 tBTA_HL_APP_CB *p_acb;
2937 UINT8 app_idx;
2938 tBTA_HL_CTRL evt_data;
2939
2940#if (BTA_HL_DEBUG == TRUE)
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002941 APPL_TRACE_DEBUG("bta_hl_check_disable");
The Android Open Source Project5738f832012-12-12 16:00:35 -08002942#endif
2943
2944 if (bta_hl_cb.disabling)
2945 {
2946 if (bta_hl_find_an_in_use_app_idx(&app_idx))
2947 {
2948 p_acb = BTA_HL_GET_APP_CB_PTR(app_idx);
2949 if (!p_acb->deregistering)
2950 {
2951 p_acb->deregistering = TRUE;
2952 bta_hl_check_deregistration(app_idx, p_data);
2953 }
2954 }
2955 else
2956 {
2957 /* all apps are deregistered */
2958 bta_sys_deregister(BTA_ID_HL);
2959 evt_data.disable_cfm.status = BTA_HL_STATUS_OK;
2960 if (p_cb->p_ctrl_cback) p_cb->p_ctrl_cback(BTA_HL_CTRL_DISABLE_CFM_EVT, (tBTA_HL_CTRL *) &evt_data);
2961 memset((void *) p_cb, 0, sizeof(tBTA_HL_CB));
2962 }
2963 }
2964}
2965
2966/*******************************************************************************
2967**
2968** Function bta_hl_build_abort_cfm
2969**
2970** Description This function builds the abort confirmation event data
2971**
2972** Returns None
2973**
2974*******************************************************************************/
2975void bta_hl_build_abort_cfm(tBTA_HL *p_evt_data,
2976 tBTA_HL_APP_HANDLE app_handle,
2977 tBTA_HL_MCL_HANDLE mcl_handle,
2978 tBTA_HL_STATUS status)
2979{
2980 p_evt_data->dch_abort_cfm.status = status;
2981 p_evt_data->dch_abort_cfm.mcl_handle = mcl_handle;
2982 p_evt_data->dch_abort_cfm.app_handle = app_handle;
2983}
2984
2985/*******************************************************************************
2986**
2987** Function bta_hl_build_abort_ind
2988**
2989** Description This function builds the abort indication event data
2990**
2991** Returns None
2992**
2993*******************************************************************************/
2994void bta_hl_build_abort_ind(tBTA_HL *p_evt_data,
2995 tBTA_HL_APP_HANDLE app_handle,
2996 tBTA_HL_MCL_HANDLE mcl_handle)
2997{
2998 p_evt_data->dch_abort_ind.mcl_handle = mcl_handle;
2999 p_evt_data->dch_abort_ind.app_handle = app_handle;
3000}
3001/*******************************************************************************
3002**
3003** Function bta_hl_build_close_cfm
3004**
3005** Description This function builds the close confirmation event data
3006**
3007** Returns None
3008**
3009*******************************************************************************/
3010void bta_hl_build_dch_close_cfm(tBTA_HL *p_evt_data,
3011 tBTA_HL_APP_HANDLE app_handle,
3012 tBTA_HL_MCL_HANDLE mcl_handle,
3013 tBTA_HL_MDL_HANDLE mdl_handle,
3014 tBTA_HL_STATUS status)
3015{
3016 p_evt_data->dch_close_cfm.status = status;
3017 p_evt_data->dch_close_cfm.mdl_handle = mdl_handle;
3018 p_evt_data->dch_close_cfm.mcl_handle = mcl_handle;
3019 p_evt_data->dch_close_cfm.app_handle = app_handle;
3020}
3021
3022/*******************************************************************************
3023**
3024** Function bta_hl_build_dch_close_ind
3025**
3026** Description This function builds the close indication event data
3027**
3028** Returns None
3029**
3030*******************************************************************************/
3031void bta_hl_build_dch_close_ind(tBTA_HL *p_evt_data,
3032 tBTA_HL_APP_HANDLE app_handle,
3033 tBTA_HL_MCL_HANDLE mcl_handle,
3034 tBTA_HL_MDL_HANDLE mdl_handle,
3035 BOOLEAN intentional)
3036{
3037 p_evt_data->dch_close_ind.mdl_handle = mdl_handle;
3038 p_evt_data->dch_close_ind.mcl_handle = mcl_handle;
3039 p_evt_data->dch_close_ind.app_handle = app_handle;
3040 p_evt_data->dch_close_ind.intentional = intentional;
3041}
3042
3043/*******************************************************************************
3044**
3045** Function bta_hl_build_send_data_cfm
3046**
3047** Description This function builds the send data confirmation event data
3048**
3049** Returns None
3050**
3051*******************************************************************************/
3052void bta_hl_build_send_data_cfm(tBTA_HL *p_evt_data,
3053 tBTA_HL_APP_HANDLE app_handle,
3054 tBTA_HL_MCL_HANDLE mcl_handle,
3055 tBTA_HL_MDL_HANDLE mdl_handle,
3056 tBTA_HL_STATUS status )
3057{
3058
3059 p_evt_data->dch_send_data_cfm.mdl_handle = mdl_handle;
3060 p_evt_data->dch_send_data_cfm.mcl_handle = mcl_handle;
3061 p_evt_data->dch_send_data_cfm.app_handle = app_handle;
3062 p_evt_data->dch_send_data_cfm.status = status;
3063}
3064
3065/*******************************************************************************
3066**
3067** Function bta_hl_build_rcv_data_ind
3068**
3069** Description This function builds the received data indication event data
3070**
3071** Returns None
3072**
3073*******************************************************************************/
3074void bta_hl_build_rcv_data_ind(tBTA_HL *p_evt_data,
3075 tBTA_HL_APP_HANDLE app_handle,
3076 tBTA_HL_MCL_HANDLE mcl_handle,
3077 tBTA_HL_MDL_HANDLE mdl_handle)
3078{
3079 p_evt_data->dch_rcv_data_ind.mdl_handle = mdl_handle;
3080 p_evt_data->dch_rcv_data_ind.mcl_handle = mcl_handle;
3081 p_evt_data->dch_rcv_data_ind.app_handle = app_handle;
3082}
3083
3084
3085/*******************************************************************************
3086**
3087** Function bta_hl_build_cch_open_cfm
3088**
3089** Description This function builds the CCH open confirmation event data
3090**
3091** Returns None
3092**
3093*******************************************************************************/
3094void bta_hl_build_cch_open_cfm(tBTA_HL *p_evt_data,
Priti Agheraf8f30c22013-04-02 15:31:19 -07003095 UINT8 app_id,
The Android Open Source Project5738f832012-12-12 16:00:35 -08003096 tBTA_HL_APP_HANDLE app_handle,
3097 tBTA_HL_MCL_HANDLE mcl_handle,
3098 BD_ADDR bd_addr,
3099 tBTA_HL_STATUS status )
3100{
Priti Agheraf8f30c22013-04-02 15:31:19 -07003101 p_evt_data->cch_open_cfm.app_id = app_id;
The Android Open Source Project5738f832012-12-12 16:00:35 -08003102 p_evt_data->cch_open_cfm.app_handle = app_handle;
3103 p_evt_data->cch_open_cfm.mcl_handle = mcl_handle;
3104 bdcpy(p_evt_data->cch_open_cfm.bd_addr, bd_addr);
3105 p_evt_data->cch_open_cfm.status = status;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003106 APPL_TRACE_DEBUG("bta_hl_build_cch_open_cfm: status=%d",status);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003107}
3108
3109/*******************************************************************************
3110**
3111** Function bta_hl_build_cch_open_ind
3112**
3113** Description This function builds the CCH open indication event data
3114**
3115** Returns None
3116**
3117*******************************************************************************/
3118void bta_hl_build_cch_open_ind(tBTA_HL *p_evt_data, tBTA_HL_APP_HANDLE app_handle,
3119 tBTA_HL_MCL_HANDLE mcl_handle,
3120 BD_ADDR bd_addr )
3121{
3122
3123 p_evt_data->cch_open_ind.app_handle = app_handle;
3124 p_evt_data->cch_open_ind.mcl_handle = mcl_handle;
3125 bdcpy(p_evt_data->cch_open_ind.bd_addr, bd_addr);
3126}
3127
3128/*******************************************************************************
3129**
3130** Function bta_hl_build_cch_close_cfm
3131**
3132** Description This function builds the CCH close confirmation event data
3133**
3134** Returns None
3135**
3136*******************************************************************************/
3137void bta_hl_build_cch_close_cfm(tBTA_HL *p_evt_data,
3138 tBTA_HL_APP_HANDLE app_handle,
3139 tBTA_HL_MCL_HANDLE mcl_handle,
3140 tBTA_HL_STATUS status )
3141{
3142 p_evt_data->cch_close_cfm.mcl_handle = mcl_handle;
3143 p_evt_data->cch_close_cfm.app_handle = app_handle;
3144 p_evt_data->cch_close_cfm.status = status;
3145}
3146
3147
3148/*******************************************************************************
3149**
3150** Function bta_hl_build_cch_close_ind
3151**
3152** Description This function builds the CCH colse indication event data
3153**
3154** Returns None
3155**
3156*******************************************************************************/
3157void bta_hl_build_cch_close_ind(tBTA_HL *p_evt_data,
3158 tBTA_HL_APP_HANDLE app_handle,
3159 tBTA_HL_MCL_HANDLE mcl_handle,
3160 BOOLEAN intentional)
3161{
3162 p_evt_data->cch_close_ind.mcl_handle = mcl_handle;
3163 p_evt_data->cch_close_ind.app_handle = app_handle;
3164 p_evt_data->cch_close_ind.intentional = intentional;
3165}
3166
3167/*******************************************************************************
3168**
3169** Function bta_hl_build_dch_open_cfm
3170**
3171** Description This function builds the DCH open confirmation event data
3172**
3173** Returns None
3174**
3175*******************************************************************************/
3176void bta_hl_build_dch_open_cfm(tBTA_HL *p_evt_data,
3177 tBTA_HL_APP_HANDLE app_handle,
3178 tBTA_HL_MCL_HANDLE mcl_handle,
3179 tBTA_HL_MDL_HANDLE mdl_handle,
3180 tBTA_HL_MDEP_ID local_mdep_id,
3181 tBTA_HL_MDL_ID mdl_id,
3182 tBTA_HL_DCH_MODE dch_mode,
3183 BOOLEAN first_reliable,
3184 UINT16 mtu,
3185 tBTA_HL_STATUS status)
3186
3187{
3188 p_evt_data->dch_open_cfm.mdl_handle = mdl_handle;
3189 p_evt_data->dch_open_cfm.mcl_handle = mcl_handle;
3190 p_evt_data->dch_open_cfm.app_handle = app_handle;
3191 p_evt_data->dch_open_cfm.local_mdep_id = local_mdep_id;
3192 p_evt_data->dch_open_cfm.mdl_id = mdl_id;
3193 p_evt_data->dch_open_cfm.dch_mode = dch_mode;
3194 p_evt_data->dch_open_cfm.first_reliable = first_reliable;
3195 p_evt_data->dch_open_cfm.mtu = mtu;
3196 p_evt_data->dch_open_cfm.status = status;
3197}
3198
3199
3200/*******************************************************************************
3201**
3202** Function bta_hl_build_sdp_query_cfm
3203**
3204** Description This function builds the SDP query indication event data
3205**
3206** Returns None
3207**
3208*******************************************************************************/
3209void bta_hl_build_sdp_query_cfm(tBTA_HL *p_evt_data,
Priti Agheraf8f30c22013-04-02 15:31:19 -07003210 UINT8 app_id,
The Android Open Source Project5738f832012-12-12 16:00:35 -08003211 tBTA_HL_APP_HANDLE app_handle,
3212 BD_ADDR bd_addr,
3213 tBTA_HL_SDP *p_sdp,
3214 tBTA_HL_STATUS status)
3215
3216{
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003217 APPL_TRACE_DEBUG("bta_hl_build_sdp_query_cfm: app_id = %d, app_handle=%d",
Priti Agheraf8f30c22013-04-02 15:31:19 -07003218 app_id,app_handle);
3219 p_evt_data->sdp_query_cfm.app_id = app_id;
The Android Open Source Project5738f832012-12-12 16:00:35 -08003220 p_evt_data->sdp_query_cfm.app_handle = app_handle;
3221 bdcpy(p_evt_data->sdp_query_cfm.bd_addr, bd_addr);
3222 p_evt_data->sdp_query_cfm.p_sdp = p_sdp;
3223 p_evt_data->sdp_query_cfm.status = status;
3224}
3225
3226
3227/*******************************************************************************
3228**
3229** Function bta_hl_build_delete_mdl_cfm
3230**
3231** Description This function builds the delete MDL confirmation event data
3232**
3233** Returns None
3234**
3235*******************************************************************************/
3236void bta_hl_build_delete_mdl_cfm(tBTA_HL *p_evt_data,
3237 tBTA_HL_APP_HANDLE app_handle,
3238 tBTA_HL_MCL_HANDLE mcl_handle,
3239 tBTA_HL_MDL_ID mdl_id,
3240 tBTA_HL_STATUS status)
3241
3242{
3243 p_evt_data->delete_mdl_cfm.mcl_handle = mcl_handle;
3244 p_evt_data->delete_mdl_cfm.app_handle = app_handle;
3245 p_evt_data->delete_mdl_cfm.mdl_id = mdl_id;
3246 p_evt_data->delete_mdl_cfm.status = status;
3247}
3248
3249/*******************************************************************************
3250**
3251** Function bta_hl_build_echo_test_cfm
3252**
3253** Description This function builds the echo test confirmation event data
3254**
3255** Returns None
3256**
3257*******************************************************************************/
3258void bta_hl_build_echo_test_cfm(tBTA_HL *p_evt_data,
3259 tBTA_HL_APP_HANDLE app_handle,
3260 tBTA_HL_MCL_HANDLE mcl_handle,
3261 tBTA_HL_STATUS status )
3262{
3263 p_evt_data->echo_test_cfm.mcl_handle = mcl_handle;
3264 p_evt_data->echo_test_cfm.app_handle = app_handle;
3265 p_evt_data->echo_test_cfm.status = status;
3266}
3267
3268
3269/*****************************************************************************
3270** Debug Functions
3271*****************************************************************************/
3272#if (BTA_HL_DEBUG == TRUE)
3273
3274/*******************************************************************************
3275**
3276** Function bta_hl_status_code
3277**
3278** Description get the status string pointer
3279**
3280** Returns char * - status string pointer
3281**
3282*******************************************************************************/
3283char *bta_hl_status_code(tBTA_HL_STATUS status)
3284{
3285 switch (status)
3286 {
3287 case BTA_HL_STATUS_OK:
3288 return "BTA_HL_STATUS_OK";
3289 case BTA_HL_STATUS_FAIL:
3290 return "BTA_HL_STATUS_FAIL";
3291 case BTA_HL_STATUS_ABORTED:
3292 return "BTA_HL_STATUS_ABORTED";
3293 case BTA_HL_STATUS_NO_RESOURCE:
3294 return "BTA_HL_STATUS_NO_RESOURCE";
3295 case BTA_HL_STATUS_LAST_ITEM:
3296 return "BTA_HL_STATUS_LAST_ITEM";
3297 case BTA_HL_STATUS_DUPLICATE_APP_ID:
3298 return "BTA_HL_STATUS_DUPLICATE_APP_ID";
3299 case BTA_HL_STATUS_INVALID_APP_HANDLE:
3300 return "BTA_HL_STATUS_INVALID_APP_HANDLE";
3301 case BTA_HL_STATUS_INVALID_MCL_HANDLE:
3302 return "BTA_HL_STATUS_INVALID_MCL_HANDLE";
3303 case BTA_HL_STATUS_MCAP_REG_FAIL:
3304 return "BTA_HL_STATUS_MCAP_REG_FAIL";
3305 case BTA_HL_STATUS_MDEP_CO_FAIL:
3306 return "BTA_HL_STATUS_MDEP_CO_FAIL";
3307 case BTA_HL_STATUS_ECHO_CO_FAIL:
3308 return "BTA_HL_STATUS_ECHO_CO_FAIL";
3309 case BTA_HL_STATUS_MDL_CFG_CO_FAIL:
3310 return "BTA_HL_STATUS_MDL_CFG_CO_FAIL";
3311 case BTA_HL_STATUS_SDP_NO_RESOURCE:
3312 return "BTA_HL_STATUS_SDP_NO_RESOURCE";
3313 case BTA_HL_STATUS_SDP_FAIL:
3314 return "BTA_HL_STATUS_SDP_FAIL";
3315 case BTA_HL_STATUS_NO_CCH:
3316 return "BTA_HL_STATUS_NO_CCH";
3317 case BTA_HL_STATUS_NO_MCL:
3318 return "BTA_HL_STATUS_NO_MCL";
3319
3320 case BTA_HL_STATUS_NO_FIRST_RELIABLE:
3321 return "BTA_HL_STATUS_NO_FIRST_RELIABLE";
3322 case BTA_HL_STATUS_INVALID_DCH_CFG:
3323 return "BTA_HL_STATUS_INVALID_DCH_CFG";
3324 case BTA_HL_STATUS_INVALID_BD_ADDR:
3325 return "BTA_HL_STATUS_INVALID_BD_ADDR";
3326 case BTA_HL_STATUS_INVALID_RECONNECT_CFG:
3327 return "BTA_HL_STATUS_INVALID_RECONNECT_CFG";
3328 case BTA_HL_STATUS_ECHO_TEST_BUSY:
3329 return "BTA_HL_STATUS_ECHO_TEST_BUSY";
3330 case BTA_HL_STATUS_INVALID_LOCAL_MDEP_ID:
3331 return "BTA_HL_STATUS_INVALID_LOCAL_MDEP_ID";
3332 case BTA_HL_STATUS_INVALID_MDL_ID:
3333 return "BTA_HL_STATUS_INVALID_MDL_ID";
3334 case BTA_HL_STATUS_NO_MDL_ID_FOUND:
3335 return "BTA_HL_STATUS_NO_MDL_ID_FOUND";
3336 case BTA_HL_STATUS_DCH_BUSY:
3337 return "BTA_HL_STATUS_DCH_BUSY";
3338 default:
3339 return "Unknown status code";
3340 }
3341}
3342/*******************************************************************************
3343**
3344** Function bta_hl_evt_code
3345**
3346** Description Maps HL event code to the corresponding event string
3347**
3348** Returns string pointer for the associated event name
3349**
3350*******************************************************************************/
3351char *bta_hl_evt_code(tBTA_HL_INT_EVT evt_code)
3352{
3353 switch (evt_code)
3354 {
3355 case BTA_HL_CCH_OPEN_EVT:
3356 return "BTA_HL_CCH_OPEN_EVT";
3357 case BTA_HL_CCH_SDP_OK_EVT:
3358 return "BTA_HL_CCH_SDP_OK_EVT";
3359 case BTA_HL_CCH_SDP_FAIL_EVT:
3360 return "BTA_HL_CCH_SDP_FAIL_EVT";
3361 case BTA_HL_MCA_CONNECT_IND_EVT:
3362 return "BTA_HL_MCA_CONNECT_IND_EVT";
3363 case BTA_HL_MCA_DISCONNECT_IND_EVT:
3364 return "BTA_HL_MCA_DISCONNECT_IND_EVT";
3365
3366 case BTA_HL_CCH_CLOSE_EVT:
3367 return "BTA_HL_CCH_CLOSE_EVT";
3368 case BTA_HL_CCH_CLOSE_CMPL_EVT:
3369 return "BTA_HL_CCH_CLOSE_CMPL_EVT";
3370 case BTA_HL_DCH_OPEN_EVT:
3371 return "BTA_HL_DCH_OPEN_EVT";
3372 case BTA_HL_MCA_CREATE_IND_EVT:
3373 return "BTA_HL_MCA_CREATE_IND_EVT";
3374 case BTA_HL_MCA_CREATE_CFM_EVT:
3375 return "BTA_HL_MCA_CREATE_CFM_EVT";
3376 case BTA_HL_MCA_OPEN_IND_EVT:
3377 return "BTA_HL_MCA_OPEN_IND_EVT";
3378 case BTA_HL_MCA_OPEN_CFM_EVT:
3379 return "BTA_HL_MCA_OPEN_CFM_EVT";
3380 case BTA_HL_DCH_CLOSE_EVT:
3381 return "BTA_HL_DCH_CLOSE_EVT";
3382 case BTA_HL_MCA_CLOSE_IND_EVT:
3383 return "BTA_HL_MCA_CLOSE_IND_EVT";
3384 case BTA_HL_MCA_CLOSE_CFM_EVT:
3385 return "BTA_HL_MCA_CLOSE_CFM_EVT";
3386 case BTA_HL_API_SEND_DATA_EVT:
3387 return "BTA_HL_API_SEND_DATA_EVT";
3388 case BTA_HL_MCA_RCV_DATA_EVT:
3389 return "BTA_HL_MCA_RCV_DATA_EVT";
3390 case BTA_HL_DCH_CLOSE_CMPL_EVT:
3391 return "BTA_HL_DCH_CLOSE_CMPL_EVT";
3392
3393 case BTA_HL_API_ENABLE_EVT:
3394 return "BTA_HL_API_ENABLE_EVT";
3395 case BTA_HL_API_DISABLE_EVT:
3396 return "BTA_HL_API_DISABLE_EVT";
Priti Agheraf8f30c22013-04-02 15:31:19 -07003397 case BTA_HL_API_UPDATE_EVT:
3398 return "BTA_HL_API_UPDATE_EVT";
The Android Open Source Project5738f832012-12-12 16:00:35 -08003399 case BTA_HL_API_REGISTER_EVT:
3400 return "BTA_HL_API_REGISTER_EVT";
3401 case BTA_HL_API_DEREGISTER_EVT:
3402 return "BTA_HL_API_DEREGISTER_EVT";
3403
3404 case BTA_HL_API_CCH_OPEN_EVT:
3405 return "BTA_HL_API_CCH_OPEN_EVT";
3406
3407 case BTA_HL_API_CCH_CLOSE_EVT:
3408 return "BTA_HL_API_CCH_CLOSE_EVT";
3409 case BTA_HL_API_DCH_OPEN_EVT:
3410 return "BTA_HL_API_DCH_OPEN_EVT";
3411
3412 case BTA_HL_API_DCH_RECONNECT_EVT:
3413 return "BTA_HL_API_DCH_RECONNECT_EVT";
3414 case BTA_HL_API_DCH_CLOSE_EVT:
3415 return "BTA_HL_API_DCH_CLOSE_EVT";
3416 case BTA_HL_API_DELETE_MDL_EVT:
3417 return "BTA_HL_API_DELETE_MDL_EVT";
3418 case BTA_HL_API_DCH_ABORT_EVT:
3419 return "BTA_HL_API_DCH_ABORT_EVT";
3420
3421 case BTA_HL_DCH_RECONNECT_EVT:
3422 return "BTA_HL_DCH_RECONNECT_EVT";
3423 case BTA_HL_DCH_SDP_INIT_EVT:
3424 return "BTA_HL_DCH_SDP_INIT_EVT";
3425 case BTA_HL_DCH_SDP_FAIL_EVT:
3426 return "BTA_HL_DCH_SDP_FAIL_EVT";
3427 case BTA_HL_API_DCH_ECHO_TEST_EVT:
3428 return "BTA_HL_API_DCH_ECHO_TEST_EVT";
3429 case BTA_HL_DCH_CLOSE_ECHO_TEST_EVT:
3430 return "BTA_HL_DCH_CLOSE_ECHO_TEST_EVT";
3431 case BTA_HL_MCA_RECONNECT_IND_EVT:
3432 return "BTA_HL_MCA_RECONNECT_IND_EVT";
3433 case BTA_HL_MCA_RECONNECT_CFM_EVT:
3434 return "BTA_HL_MCA_RECONNECT_CFM_EVT";
3435 case BTA_HL_API_DCH_CREATE_RSP_EVT:
3436 return "BTA_HL_API_DCH_CREATE_RSP_EVT";
3437 case BTA_HL_DCH_ABORT_EVT:
3438 return "BTA_HL_DCH_ABORT_EVT";
3439 case BTA_HL_MCA_ABORT_IND_EVT:
3440 return "BTA_HL_MCA_ABORT_IND_EVT";
3441 case BTA_HL_MCA_ABORT_CFM_EVT:
3442 return "BTA_HL_MCA_ABORT_CFM_EVT";
3443 case BTA_HL_MCA_DELETE_IND_EVT:
3444 return "BTA_HL_MCA_DELETE_IND_EVT";
3445 case BTA_HL_MCA_DELETE_CFM_EVT:
3446 return "BTA_HL_MCA_DELETE_CFM_EVT";
3447 case BTA_HL_MCA_CONG_CHG_EVT:
3448 return "BTA_HL_MCA_CONG_CHG_EVT";
3449 case BTA_HL_CI_GET_TX_DATA_EVT:
3450 return "BTA_HL_CI_GET_TX_DATA_EVT";
3451 case BTA_HL_CI_PUT_RX_DATA_EVT:
3452 return "BTA_HL_CI_PUT_RX_DATA_EVT";
3453 case BTA_HL_CI_GET_ECHO_DATA_EVT:
3454 return "BTA_HL_CI_GET_ECHO_DATA_EVT";
3455 case BTA_HL_DCH_ECHO_TEST_EVT:
3456 return "BTA_HL_DCH_ECHO_TEST_EVT";
3457 case BTA_HL_CI_PUT_ECHO_DATA_EVT:
3458 return "BTA_HL_CI_PUT_ECHO_DATA_EVT";
3459 case BTA_HL_API_SDP_QUERY_EVT:
3460 return "BTA_HL_API_SDP_QUERY_EVT";
3461 case BTA_HL_SDP_QUERY_OK_EVT:
3462 return "BTA_HL_SDP_QUERY_OK_EVT";
3463 case BTA_HL_SDP_QUERY_FAIL_EVT:
3464 return "BTA_HL_SDP_QUERY_FAIL_EVT";
3465 case BTA_HL_MCA_RSP_TOUT_IND_EVT:
3466 return "BTA_HL_MCA_RSP_TOUT_IND_EVT";
3467
3468 default:
3469 return "Unknown HL event code";
3470 }
3471}
3472
3473#endif /* Debug Functions */
3474#endif // HL_INCLUDED
3475
3476
3477
3478
3479
3480
3481
3482