blob: e828bf65cfe06b6ba5b65f30cdff569cb6c8c5ce [file] [log] [blame]
The Android Open Source Project5738f832012-12-12 16:00:35 -08001/******************************************************************************
2 *
3 * Copyright (C) 2009-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 * Filename: btif_hl.c
22 *
23 * Description: Health Device Profile Bluetooth Interface
24 *
25 *
26 ***********************************************************************************/
27#define LOG_TAG "BTIF_HL"
28
29#include <stdio.h>
30#include <stdlib.h>
31#include <errno.h>
32#include <string.h>
33#include <sys/types.h>
34#include <sys/socket.h>
35#include <sys/un.h>
36#include <time.h>
37#include <fcntl.h>
38#include <unistd.h>
39#include <pthread.h>
40#include <signal.h>
41#include <ctype.h>
42#include <sys/select.h>
43#include <sys/poll.h>
44#include <cutils/sockets.h>
45#include <cutils/log.h>
46
47#include <hardware/bluetooth.h>
48#include <hardware/bt_hl.h>
49
50#include "btif_common.h"
51#include "btif_util.h"
52#include "gki.h"
53#include "bd.h"
54#include "bta_api.h"
55#include "bta_hl_api.h"
56#include "mca_api.h"
57#include "btif_hl.h"
58#include "btif_storage.h"
59#include "btu.h"
60
Priti Agheraf8f30c22013-04-02 15:31:19 -070061#define MAX_DATATYPE_SUPPORTED 8
62
The Android Open Source Project5738f832012-12-12 16:00:35 -080063extern int btif_hl_update_maxfd( int max_org_s);
64extern void btif_hl_select_monitor_callback( fd_set *p_cur_set, fd_set *p_org_set );
65extern void btif_hl_select_wakeup_callback( fd_set *p_org_set , int wakeup_signal );
66extern int btif_hl_update_maxfd( int max_org_s);
67extern void btif_hl_select_monitor_callback( fd_set *p_cur_set, fd_set *p_org_set );
68extern void btif_hl_select_wakeup_callback( fd_set *p_org_set , int wakeup_signal );
69extern void btif_hl_soc_thread_init(void);
70extern void btif_hl_release_mcl_sockets(UINT8 app_idx, UINT8 mcl_idx);
71extern BOOLEAN btif_hl_create_socket(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx);
72extern void btif_hl_release_socket(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx);
73
74btif_hl_cb_t btif_hl_cb;
75btif_hl_cb_t *p_btif_hl_cb = &btif_hl_cb;
Priti Agheraf8f30c22013-04-02 15:31:19 -070076
The Android Open Source Project5738f832012-12-12 16:00:35 -080077/************************************************************************************
78** Static variables
79************************************************************************************/
80static bthl_callbacks_t bt_hl_callbacks_cb;
81static bthl_callbacks_t *bt_hl_callbacks=NULL;
82
83/* signal socketpair to wake up select loop */
84
85const int btif_hl_signal_select_wakeup = 1;
86const int btif_hl_signal_select_exit = 2;
87const int btif_hl_signal_select_close_connected = 3;
88
89static int listen_s = -1;
90static int connected_s = -1;
91static int select_thread_id = -1;
git-zhenye.broadcom.combf0ce822014-06-19 17:28:53 -070092static int signal_fds[2] = { -1, -1 };
The Android Open Source Project5738f832012-12-12 16:00:35 -080093static BUFFER_Q soc_queue;
Priti Agheraf8f30c22013-04-02 15:31:19 -070094static int reg_counter;
The Android Open Source Project5738f832012-12-12 16:00:35 -080095
96static inline int btif_hl_select_wakeup(void);
The Android Open Source Project5738f832012-12-12 16:00:35 -080097static inline int btif_hl_select_close_connected(void);
98static inline int btif_hl_close_select_thread(void);
99static UINT8 btif_hl_get_next_app_id(void);
100static int btif_hl_get_next_channel_id(UINT8 app_id);
101static void btif_hl_init_next_app_id(void);
102static void btif_hl_init_next_channel_id(void);
103static void btif_hl_ctrl_cback(tBTA_HL_CTRL_EVT event, tBTA_HL_CTRL *p_data);
104static void btif_hl_set_state(btif_hl_state_t state);
105static btif_hl_state_t btif_hl_get_state(void);
106static void btif_hl_cback(tBTA_HL_EVT event, tBTA_HL *p_data);
107static void btif_hl_proc_cb_evt(UINT16 event, char* p_param);
108
109#define CHECK_CALL_CBACK(P_CB, P_CBACK, ...)\
110 if (P_CB && P_CB->P_CBACK) { \
111 P_CB->P_CBACK(__VA_ARGS__); \
112 } \
113 else { \
114 ASSERTC(0, "Callback is NULL", 0); \
115 }
116
117
118#define BTIF_HL_CALL_CBACK(P_CB, P_CBACK, ...)\
119 if((p_btif_hl_cb->state != BTIF_HL_STATE_DISABLING) &&\
120 (p_btif_hl_cb->state != BTIF_HL_STATE_DISABLED)) \
121 { \
122 if (P_CB && P_CB->P_CBACK) { \
123 P_CB->P_CBACK(__VA_ARGS__); \
124 } \
125 else { \
126 ASSERTC(0, "Callback is NULL", 0); \
127 } \
128 }
129
130
131#define CHECK_BTHL_INIT() if (bt_hl_callbacks == NULL)\
132 {\
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700133 BTIF_TRACE_WARNING("BTHL: %s: BTHL not initialized", __FUNCTION__);\
The Android Open Source Project5738f832012-12-12 16:00:35 -0800134 return BT_STATUS_NOT_READY;\
135 }\
136 else\
137 {\
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700138 BTIF_TRACE_EVENT("BTHL: %s", __FUNCTION__);\
The Android Open Source Project5738f832012-12-12 16:00:35 -0800139 }
140
141
142static const btif_hl_data_type_cfg_t data_type_table[] = {
143 /* Data Specilization Ntx Nrx (from Bluetooth SIG's HDP whitepaper)*/
144 {BTIF_HL_DATA_TYPE_PULSE_OXIMETER, 9216, 256},
145 {BTIF_HL_DATA_TYPE_BLOOD_PRESSURE_MON, 896, 224},
146 {BTIF_HL_DATA_TYPE_BODY_THERMOMETER, 896, 224},
147 {BTIF_HL_DATA_TYPE_BODY_WEIGHT_SCALE, 896, 224},
148 {BTIF_HL_DATA_TYPE_GLUCOSE_METER, 896, 224},
Priti Agherac8a9f432013-05-22 13:25:58 -0700149 {BTIF_HL_DATA_TYPE_STEP_COUNTER, 6624, 224},
150 {BTIF_HL_DATA_TYPE_BCA, 7730, 1230},
151 {BTIF_HL_DATA_TYPE_PEAK_FLOW , 2030, 224},
152 {BTIF_HL_DATA_TYPE_ACTIVITY_HUB, 5120, 224},
153 {BTIF_HL_DATA_TYPE_AMM, 1024, 64}
The Android Open Source Project5738f832012-12-12 16:00:35 -0800154};
155
156#define BTIF_HL_DATA_TABLE_SIZE (sizeof(data_type_table) / sizeof(btif_hl_data_type_cfg_t))
157#define BTIF_HL_DEFAULT_SRC_TX_APDU_SIZE 10240 /* use this size if the data type is not
158 defined in the table; for future proof */
159#define BTIF_HL_DEFAULT_SRC_RX_APDU_SIZE 512 /* use this size if the data type is not
160 defined in the table; for future proof */
161
162#define BTIF_HL_ECHO_MAX_TX_RX_APDU_SIZE 1024
163
164/************************************************************************************
165** Static utility functions
166************************************************************************************/
167
168#define BTIF_IF_GET_NAME 16
169void btif_hl_display_calling_process_name(void)
170{
171 char name[16];
172 prctl(BTIF_IF_GET_NAME, name, 0, 0, 0);
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700173 BTIF_TRACE_DEBUG("Process name (%s)", name);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800174}
Priti Agheraf8f30c22013-04-02 15:31:19 -0700175#define BTIF_TIMEOUT_CCH_NO_DCH_SECS 30
The Android Open Source Project5738f832012-12-12 16:00:35 -0800176/*******************************************************************************
177**
178** Function btif_hl_if_channel_setup_pending
179**
180** Description check whether channel id is in setup pending state or not
181**
182** Returns BOOLEAN
183**
184*******************************************************************************/
185BOOLEAN btif_hl_if_channel_setup_pending(int channel_id, UINT8 *p_app_idx, UINT8 *p_mcl_idx)
186{
187 btif_hl_app_cb_t *p_acb;
188 btif_hl_mcl_cb_t *p_mcb;
189 UINT8 i, j;
190 BOOLEAN found=FALSE;
Matthew Xiebea41312014-05-09 01:04:04 -0700191
192 *p_app_idx = 0;
193 *p_mcl_idx = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800194 for (i=0; i < BTA_HL_NUM_APPS ; i ++)
195 {
196 p_acb =BTIF_HL_GET_APP_CB_PTR(i);
197 if (p_acb->in_use)
198 {
199 for (j=0; j< BTA_HL_NUM_MCLS; j++)
200 {
201 p_mcb = BTIF_HL_GET_MCL_CB_PTR(i, j);
202 if (p_mcb->in_use &&
203 p_mcb->is_connected && p_mcb->pcb.channel_id == channel_id )
204 {
205 found = TRUE;
206 *p_app_idx = i;
207 *p_mcl_idx = j;
208 break;
209 }
210 }
211 }
212 if (found)
213 break;
214 }
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700215 BTIF_TRACE_DEBUG("%s found=%d channel_id=0x%08x",
The Android Open Source Project5738f832012-12-12 16:00:35 -0800216 __FUNCTION__, found, channel_id, *p_app_idx, *p_mcl_idx);
217 return found;
218
219}
220/*******************************************************************************
221**
222** Function btif_hl_num_dchs_in_use
223**
224** Description find number of DCHs in use
225**
226** Returns UINT8
227*******************************************************************************/
Priti Agheraf8f30c22013-04-02 15:31:19 -0700228UINT8 btif_hl_num_dchs_in_use(UINT8 mcl_handle){
The Android Open Source Project5738f832012-12-12 16:00:35 -0800229
Priti Agheraf8f30c22013-04-02 15:31:19 -0700230 btif_hl_app_cb_t * p_acb;
231 btif_hl_mcl_cb_t *p_mcb;
232 UINT8 i,j,x;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800233 UINT8 cnt=0;
234
Priti Agheraf8f30c22013-04-02 15:31:19 -0700235 for (i=0; i<BTA_HL_NUM_APPS; i++)
The Android Open Source Project5738f832012-12-12 16:00:35 -0800236 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700237 BTIF_TRACE_DEBUG("btif_hl_num_dchs:i = %d",i);
Priti Agheraf8f30c22013-04-02 15:31:19 -0700238 p_acb =BTIF_HL_GET_APP_CB_PTR(i);
239 if (p_acb && p_acb->in_use)
240 {
241 for (j=0; j < BTA_HL_NUM_MCLS ; j++)
242 {
243 if(p_acb->mcb[j].in_use)
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700244 BTIF_TRACE_DEBUG("btif_hl_num_dchs:mcb in use j=%d, mcl_handle=%d,mcb handle=%d",
Priti Agheraf8f30c22013-04-02 15:31:19 -0700245 j,mcl_handle, p_acb->mcb[j].mcl_handle);
246 if (p_acb->mcb[j].in_use &&
247 (p_acb->mcb[j].mcl_handle == mcl_handle))
248 {
249 p_mcb = &p_acb->mcb[j];
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700250 BTIF_TRACE_DEBUG("btif_hl_num_dchs: mcl handle found j =%d",j);
Priti Agheraf8f30c22013-04-02 15:31:19 -0700251 for (x=0; x < BTA_HL_NUM_MDLS_PER_MCL ; x ++)
252 {
253 if (p_mcb->mdl[x].in_use)
254 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700255 BTIF_TRACE_DEBUG("btif_hl_num_dchs_in_use:found x =%d",x);
Priti Agheraf8f30c22013-04-02 15:31:19 -0700256 cnt++;
257 }
258 }
259 }
260 }
261 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800262 }
Priti Agheraf8f30c22013-04-02 15:31:19 -0700263
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700264 BTIF_TRACE_DEBUG("%s dch in use count=%d", __FUNCTION__, cnt);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800265 return cnt;
266}
267/*******************************************************************************
268**
269** Function btif_hl_tmr_hdlr
270**
271** Description Process timer timeout
272**
273** Returns void
274*******************************************************************************/
275void btif_hl_tmr_hdlr(TIMER_LIST_ENT *tle)
276{
277 btif_hl_mcl_cb_t *p_mcb;
278 UINT8 i,j;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700279 BTIF_TRACE_DEBUG("%s timer_in_use=%d", __FUNCTION__, tle->in_use );
The Android Open Source Project5738f832012-12-12 16:00:35 -0800280
281 for (i=0; i < BTA_HL_NUM_APPS ; i ++)
282 {
283 for (j=0; j< BTA_HL_NUM_MCLS; j++)
284 {
285 p_mcb =BTIF_HL_GET_MCL_CB_PTR(i,j);
286
287 if (p_mcb->cch_timer_active)
288 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700289 BTIF_TRACE_DEBUG("%app_idx=%d, mcl_idx=%d mcl-connected=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -0800290 i, j, p_mcb->is_connected);
291 p_mcb->cch_timer_active = FALSE;
292 if (p_mcb->is_connected)
293 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700294 BTIF_TRACE_DEBUG("Idle timeout Close CCH app_idx=%d mcl_idx=%d mcl_handle=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -0800295 i ,j, p_mcb->mcl_handle);
296 BTA_HlCchClose(p_mcb->mcl_handle);
297 }
298 else
299 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700300 BTIF_TRACE_DEBUG("CCH idle timeout But CCH not connected app_idx=%d mcl_idx=%d ",i,j);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800301 }
302 }
303 }
304 }
305}
306/*******************************************************************************
307**
308** Function btif_hl_stop_cch_timer
309**
310** Description stop CCH timer
311**
312** Returns void
313*******************************************************************************/
314void btif_hl_stop_cch_timer(UINT8 app_idx, UINT8 mcl_idx)
315{
316 btif_hl_mcl_cb_t *p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700317 BTIF_TRACE_DEBUG("%s app_idx=%d, mcl_idx=%d timer_in_use=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -0800318 __FUNCTION__,app_idx, mcl_idx, p_mcb->cch_timer.in_use);
319
320 p_mcb->cch_timer_active = FALSE;
321 if (p_mcb->cch_timer.in_use)
322 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700323 BTIF_TRACE_DEBUG("stop CCH timer ");
The Android Open Source Project5738f832012-12-12 16:00:35 -0800324 btu_stop_timer(&p_mcb->cch_timer);
325 }
326}
327/*******************************************************************************
328**
329** Function btif_hl_start_cch_timer
330**
331** Description start CCH timer
332**
333** Returns void
334*******************************************************************************/
335void btif_hl_start_cch_timer(UINT8 app_idx, UINT8 mcl_idx)
336{
337 btif_hl_mcl_cb_t *p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700338 BTIF_TRACE_DEBUG("%s app_idx=%d, mcl_idx=%d timer_active=%d timer_in_use=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -0800339 __FUNCTION__,app_idx, mcl_idx,
340 p_mcb->cch_timer_active, p_mcb->cch_timer.in_use);
341
342 p_mcb->cch_timer_active = TRUE;
343 if (!p_mcb->cch_timer.in_use)
344 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700345 BTIF_TRACE_DEBUG("Start CCH timer ");
The Android Open Source Project5738f832012-12-12 16:00:35 -0800346 memset(&p_mcb->cch_timer, 0, sizeof(TIMER_LIST_ENT));
347 p_mcb->cch_timer.param = (UINT32)btif_hl_tmr_hdlr;
348 btu_start_timer(&p_mcb->cch_timer, BTU_TTYPE_USER_FUNC,
349 BTIF_TIMEOUT_CCH_NO_DCH_SECS);
350 }
351 else
352 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700353 BTIF_TRACE_DEBUG("Restart CCH timer ");
The Android Open Source Project5738f832012-12-12 16:00:35 -0800354 btu_stop_timer(&p_mcb->cch_timer);
355 btu_start_timer(&p_mcb->cch_timer, BTU_TTYPE_USER_FUNC,
356 BTIF_TIMEOUT_CCH_NO_DCH_SECS);
357 }
358
359}
360/*******************************************************************************
361**
362** Function btif_hl_find_mdl_idx
363**
364** Description Find the MDL index using MDL ID
365**
366** Returns BOOLEAN
367**
368*******************************************************************************/
369static BOOLEAN btif_hl_find_mdl_idx(UINT8 app_idx, UINT8 mcl_idx, UINT16 mdl_id,
370 UINT8 *p_mdl_idx)
371{
372 btif_hl_mcl_cb_t *p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
373 BOOLEAN found=FALSE;
374 UINT8 i;
375
376 for (i=0; i < BTA_HL_NUM_MDLS_PER_MCL ; i ++)
377 {
378 if (p_mcb->mdl[i].in_use &&
379 (mdl_id !=0) &&
380 (p_mcb->mdl[i].mdl_id== mdl_id))
381 {
382 found = TRUE;
383 *p_mdl_idx = i;
384 break;
385 }
386 }
387
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700388 BTIF_TRACE_DEBUG("%s found=%d mdl_id=%d mdl_idx=%d ",
The Android Open Source Project5738f832012-12-12 16:00:35 -0800389 __FUNCTION__,found, mdl_id, i);
390
391 return found;
392}
393
394/*******************************************************************************
395**
396** Function btif_hl_get_buf
397**
398** Description get buffer
399**
400** Returns void
401**
402*******************************************************************************/
403void * btif_hl_get_buf(UINT16 size)
404{
405 void *p_new;
406
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700407 BTIF_TRACE_DEBUG("%s", __FUNCTION__);
408 BTIF_TRACE_DEBUG("ret size=%d GKI_MAX_BUF_SIZE=%d",size, 6000);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800409
410 if (size < 6000)
411 {
412 p_new = GKI_getbuf(size);
413 }
414 else
415 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700416 BTIF_TRACE_DEBUG("btif_hl_get_buf use HL large data pool");
The Android Open Source Project5738f832012-12-12 16:00:35 -0800417 p_new = GKI_getpoolbuf(4);
418 }
419
420 return p_new;
421}
422/*******************************************************************************
423**
424** Function btif_hl_free_buf
425**
426** Description free buffer
427**
428** Return void
429**
430*******************************************************************************/
431void btif_hl_free_buf(void **p)
432{
433 if (*p != NULL)
434 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700435 BTIF_TRACE_DEBUG("%s OK", __FUNCTION__ );
The Android Open Source Project5738f832012-12-12 16:00:35 -0800436 GKI_freebuf(*p);
437 *p = NULL;
438 }
439 else
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700440 BTIF_TRACE_ERROR("%s NULL pointer",__FUNCTION__ );
The Android Open Source Project5738f832012-12-12 16:00:35 -0800441}
442/*******************************************************************************
443**
444** Function btif_hl_is_the_first_reliable_existed
445**
446** Description This function checks whether the first reliable DCH channel
447** has been setup on the MCL or not
448**
449** Returns BOOLEAN - TRUE exist
450** FALSE does not exist
451**
452*******************************************************************************/
453BOOLEAN btif_hl_is_the_first_reliable_existed(UINT8 app_idx, UINT8 mcl_idx )
454{
455 btif_hl_mcl_cb_t *p_mcb =BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
456 BOOLEAN is_existed =FALSE;
457 UINT8 i ;
458
459 for (i=0; i< BTA_HL_NUM_MDLS_PER_MCL; i++)
460 {
461 if (p_mcb->mdl[i].in_use && p_mcb->mdl[i].is_the_first_reliable)
462 {
463 is_existed = TRUE;
464 break;
465 }
466 }
467
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700468 BTIF_TRACE_DEBUG("bta_hl_is_the_first_reliable_existed is_existed=%d ",is_existed );
The Android Open Source Project5738f832012-12-12 16:00:35 -0800469 return is_existed;
470}
471/*******************************************************************************
472**
473** Function btif_hl_clean_delete_mdl
474**
475** Description Cleanup the delete mdl control block
476**
477** Returns Nothing
478**
479*******************************************************************************/
480static void btif_hl_clean_delete_mdl(btif_hl_delete_mdl_t *p_cb)
481{
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700482 BTIF_TRACE_DEBUG("%s", __FUNCTION__ );
The Android Open Source Project5738f832012-12-12 16:00:35 -0800483 memset(p_cb, 0 , sizeof(btif_hl_delete_mdl_t));
484}
485
486/*******************************************************************************
487**
488** Function btif_hl_clean_pcb
489**
490** Description Cleanup the pending chan control block
491**
492** Returns Nothing
493**
494*******************************************************************************/
495static void btif_hl_clean_pcb(btif_hl_pending_chan_cb_t *p_pcb)
496{
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700497 BTIF_TRACE_DEBUG("%s", __FUNCTION__ );
The Android Open Source Project5738f832012-12-12 16:00:35 -0800498 memset(p_pcb, 0 , sizeof(btif_hl_pending_chan_cb_t));
499}
500
501
502/*******************************************************************************
503**
504** Function btif_hl_clean_mdl_cb
505**
506** Description Cleanup the MDL control block
507**
508** Returns Nothing
509**
510*******************************************************************************/
511static void btif_hl_clean_mdl_cb(btif_hl_mdl_cb_t *p_dcb)
512{
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700513 BTIF_TRACE_DEBUG("%s", __FUNCTION__ );
The Android Open Source Project5738f832012-12-12 16:00:35 -0800514 btif_hl_free_buf((void **) &p_dcb->p_rx_pkt);
515 btif_hl_free_buf((void **) &p_dcb->p_tx_pkt);
516 memset(p_dcb, 0 , sizeof(btif_hl_mdl_cb_t));
517}
518
519
520/*******************************************************************************
521**
522** Function btif_hl_reset_mcb
523**
524** Description Reset MCL control block
525**
526** Returns BOOLEAN
527**
528*******************************************************************************/
529static void btif_hl_clean_mcl_cb(UINT8 app_idx, UINT8 mcl_idx)
530{
531 btif_hl_mcl_cb_t *p_mcb;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700532 BTIF_TRACE_DEBUG("%s app_idx=%d, mcl_idx=%d", __FUNCTION__,app_idx, mcl_idx);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800533 p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
534 memset(p_mcb, 0, sizeof(btif_hl_mcl_cb_t));
535}
536
537
538/*******************************************************************************
539**
540** Function btif_hl_find_sdp_idx_using_mdep_filter
541**
542** Description This function finds the SDP record index using MDEP filter parameters
543**
544** Returns BOOLEAN
545**
546*******************************************************************************/
547static void btif_hl_reset_mdep_filter(UINT8 app_idx)
548{
549 btif_hl_app_cb_t *p_acb =BTIF_HL_GET_APP_CB_PTR(app_idx);
550 p_acb->filter.num_elems = 0;
551}
552
553/*******************************************************************************
554**
555** Function btif_hl_find_sdp_idx_using_mdep_filter
556**
557** Description This function finds the SDP record index using MDEP filter parameters
558**
559** Returns BOOLEAN
560**
561*******************************************************************************/
562static BOOLEAN btif_hl_find_sdp_idx_using_mdep_filter(UINT8 app_idx, UINT8 mcl_idx, UINT8 *p_sdp_idx)
563{
564 btif_hl_app_cb_t *p_acb =BTIF_HL_GET_APP_CB_PTR(app_idx);
565 btif_hl_mcl_cb_t *p_mcb =BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
566 UINT8 i, j, num_recs,num_elems, num_mdeps, mdep_cnt, mdep_idx;
567 tBTA_HL_MDEP_ROLE peer_mdep_role;
568 UINT16 data_type;
569 tBTA_HL_SDP_MDEP_CFG *p_mdep;
570 BOOLEAN found = FALSE;
571 BOOLEAN elem_found;
572
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700573 BTIF_TRACE_DEBUG("btif_hl_find_sdp_idx_using_mdep_filter");
The Android Open Source Project5738f832012-12-12 16:00:35 -0800574 num_recs = p_mcb->sdp.num_recs;
575 num_elems = p_acb->filter.num_elems;
576 if (!num_elems)
577 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700578 BTIF_TRACE_DEBUG("btif_hl_find_sdp_idx_using_mdep_filter num_elem=0");
The Android Open Source Project5738f832012-12-12 16:00:35 -0800579 *p_sdp_idx = 0;
580 found = TRUE;
581 return found;
582 }
583
584 for (i=0; i<num_recs; i++)
585 {
586 num_mdeps = p_mcb->sdp.sdp_rec[i].num_mdeps;
587 for (j=0; j<num_elems; j++ )
588 {
589 data_type = p_acb->filter.elem[j].data_type;
590 peer_mdep_role = p_acb->filter.elem[j].peer_mdep_role;
591 elem_found = FALSE;
592 mdep_cnt =0;
593 mdep_idx=0;
594 while (!elem_found && mdep_idx < num_mdeps )
595 {
596 p_mdep = &(p_mcb->sdp.sdp_rec[i].mdep_cfg[mdep_idx]);
597 if ( (p_mdep->data_type == data_type) &&
598 (p_mdep->mdep_role == peer_mdep_role) )
599 {
600 elem_found = TRUE;
601 }
602 else
603 {
604 mdep_idx++;
605 }
606 }
607
608 if (!elem_found)
609 {
610 found = FALSE;
611 break;
612 }
613 else
614 {
615 found = TRUE;
616 }
617 }
618
619 if (found)
620 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700621 BTIF_TRACE_DEBUG("btif_hl_find_sdp_idx_using_mdep_filter found idx=%d",i);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800622 *p_sdp_idx = i;
623 break;
624 }
625 }
626
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700627 BTIF_TRACE_DEBUG("%s found=%d sdp_idx=%d",__FUNCTION__ , found, *p_sdp_idx);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800628
629 btif_hl_reset_mdep_filter(app_idx);
630
631 return found;
632}
633/*******************************************************************************
634**
635** Function btif_hl_is_reconnect_possible
636**
637** Description check reconnect is possible or not
638**
639** Returns BOOLEAN
640**
641*******************************************************************************/
642BOOLEAN btif_hl_is_reconnect_possible(UINT8 app_idx, UINT8 mcl_idx, int mdep_cfg_idx,
643 tBTA_HL_DCH_OPEN_PARAM *p_dch_open_api, tBTA_HL_MDL_ID *p_mdl_id)
644{
645 btif_hl_app_cb_t *p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
646 btif_hl_mcl_cb_t *p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
647 tBTA_HL_DCH_CFG local_cfg = p_dch_open_api->local_cfg;
648 tBTA_HL_DCH_MODE dch_mode = BTA_HL_DCH_MODE_RELIABLE;
649 BOOLEAN use_mdl_dch_mode=FALSE;
650 btif_hl_mdl_cfg_t *p_mdl;
651 btif_hl_mdl_cfg_t *p_mdl1;
652 UINT8 i, j;
653 BOOLEAN is_reconnect_ok=FALSE;
654 BOOLEAN stream_mode_avail=FALSE;
655 UINT16 data_type = p_acb->sup_feature.mdep[mdep_cfg_idx].mdep_cfg.data_cfg[0].data_type;
656 tBTA_HL_MDEP_ID peer_mdep_id = p_dch_open_api->peer_mdep_id;
657 UINT8 mdl_idx;
658
659
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700660 BTIF_TRACE_DEBUG("%s app_idx=%d mcl_idx=%d mdep_cfg_idx=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -0800661 __FUNCTION__, app_idx, mcl_idx, mdep_cfg_idx );
662 switch (local_cfg)
663 {
664 case BTA_HL_DCH_CFG_NO_PREF:
665 if (!btif_hl_is_the_first_reliable_existed(app_idx, mcl_idx))
666 {
667 dch_mode = BTA_HL_DCH_MODE_RELIABLE;
668 }
669 else
670 {
671 use_mdl_dch_mode = TRUE;
672 }
673 break;
674 case BTA_HL_DCH_CFG_RELIABLE:
675 dch_mode = BTA_HL_DCH_MODE_RELIABLE;
676 break;
677 case BTA_HL_DCH_CFG_STREAMING:
678 dch_mode = BTA_HL_DCH_MODE_STREAMING;
679 break;
680 default:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700681 BTIF_TRACE_ERROR("Invalid local_cfg=%d",local_cfg );
The Android Open Source Project5738f832012-12-12 16:00:35 -0800682 return is_reconnect_ok;
683 break;
684
685 }
686
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700687 BTIF_TRACE_DEBUG("local_cfg=%d use_mdl_dch_mode=%d dch_mode=%d ",
The Android Open Source Project5738f832012-12-12 16:00:35 -0800688 local_cfg, use_mdl_dch_mode, dch_mode );
689
690 for (i=0, p_mdl=&p_acb->mdl_cfg[0] ; i< BTA_HL_NUM_MDL_CFGS; i++, p_mdl++ )
691 {
692 if (p_mdl->base.active &&
693 p_mdl->extra.data_type ==data_type &&
694 (p_mdl->extra.peer_mdep_id != BTA_HL_INVALID_MDEP_ID && p_mdl->extra.peer_mdep_id == peer_mdep_id) &&
695 memcpy(p_mdl->base.peer_bd_addr, p_mcb->bd_addr,sizeof(BD_ADDR) ) &&
696 p_mdl->base.mdl_id &&
697 !btif_hl_find_mdl_idx(app_idx, mcl_idx,p_mdl->base.mdl_id, &mdl_idx))
698 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700699 BTIF_TRACE_DEBUG("i=%d Matched active=%d mdl_id =%d, mdl_dch_mode=%d",
Priti Agheraf8f30c22013-04-02 15:31:19 -0700700 i, p_mdl->base.active, p_mdl->base.mdl_id,p_mdl->base.dch_mode);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800701 if (!use_mdl_dch_mode)
702 {
703 if (p_mdl->base.dch_mode == dch_mode)
704 {
705 is_reconnect_ok = TRUE;
706 *p_mdl_id = p_mdl->base.mdl_id;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700707 BTIF_TRACE_DEBUG("reconnect is possible dch_mode=%d mdl_id=%d", dch_mode, p_mdl->base.mdl_id );
The Android Open Source Project5738f832012-12-12 16:00:35 -0800708 break;
709 }
710 }
711 else
712 {
713 is_reconnect_ok = TRUE;
714 for (j=i, p_mdl1=&p_acb->mdl_cfg[i]; j< BTA_HL_NUM_MDL_CFGS; j++, p_mdl1++)
715 {
716 if (p_mdl1->base.active &&
717 p_mdl1->extra.data_type == data_type &&
718 (p_mdl1->extra.peer_mdep_id != BTA_HL_INVALID_MDEP_ID && p_mdl1->extra.peer_mdep_id == peer_mdep_id) &&
719 memcpy(p_mdl1->base.peer_bd_addr, p_mcb->bd_addr,sizeof(BD_ADDR)) &&
720 p_mdl1->base.dch_mode == BTA_HL_DCH_MODE_STREAMING)
721 {
722 stream_mode_avail = TRUE;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700723 BTIF_TRACE_DEBUG("found streaming mode mdl index=%d", j);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800724 break;
725 }
726 }
727
728 if (stream_mode_avail)
729 {
730 dch_mode = BTA_HL_DCH_MODE_STREAMING;
731 *p_mdl_id = p_mdl1->base.mdl_id;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700732 BTIF_TRACE_DEBUG("reconnect is ok index=%d dch_mode=streaming mdl_id=%d", j, *p_mdl_id);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800733 break;
734 }
735 else
736 {
737 dch_mode= p_mdl->base.dch_mode;
738 *p_mdl_id = p_mdl->base.mdl_id;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700739 BTIF_TRACE_DEBUG("reconnect is ok index=%d dch_mode=%d mdl_id=%d", i, p_mdl->base.dch_mode, *p_mdl_id);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800740 break;
741
742 }
743 }
744
745 }
746
747 }
748
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700749 BTIF_TRACE_DEBUG("is_reconnect_ok dch_mode=%d mdl_id=%d",is_reconnect_ok, dch_mode, *p_mdl_id);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800750 return is_reconnect_ok;
751}
752
753/*******************************************************************************
754**
755** Function btif_hl_dch_open
756**
757** Description Process DCH open request using the DCH Open API parameters
758**
759** Returns BOOLEAN
760**
761*******************************************************************************/
762BOOLEAN btif_hl_dch_open(UINT8 app_id, BD_ADDR bd_addr,
763 tBTA_HL_DCH_OPEN_PARAM *p_dch_open_api,
764 int mdep_cfg_idx,
765 btif_hl_pend_dch_op_t op, int *channel_id){
766 btif_hl_app_cb_t *p_acb;
767 btif_hl_mcl_cb_t *p_mcb;
768 btif_hl_pending_chan_cb_t *p_pcb;
769 UINT8 app_idx, mcl_idx;
770 BOOLEAN status = FALSE;
771 tBTA_HL_MDL_ID mdl_id;
772 tBTA_HL_DCH_RECONNECT_PARAM reconnect_param;
773
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700774 BTIF_TRACE_DEBUG("%s app_id=%d ",
The Android Open Source Project5738f832012-12-12 16:00:35 -0800775 __FUNCTION__, app_id );
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700776 BTIF_TRACE_DEBUG("DB [%02x:%02x:%02x:%02x:%02x:%02x]",
The Android Open Source Project5738f832012-12-12 16:00:35 -0800777 bd_addr[0], bd_addr[1],bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]);
778
779 if (btif_hl_find_app_idx(app_id, &app_idx))
780 {
781 if (btif_hl_find_mcl_idx(app_idx, bd_addr , &mcl_idx))
782 {
783 p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
784
785 p_pcb = BTIF_HL_GET_PCB_PTR(app_idx, mcl_idx);
786 if (!p_pcb->in_use)
787 {
788 p_mcb->req_ctrl_psm = p_dch_open_api->ctrl_psm;
789
790 p_pcb->in_use = TRUE;
791 *channel_id =
792 p_pcb->channel_id = (int) btif_hl_get_next_channel_id(app_id);
793 p_pcb->cb_state = BTIF_HL_CHAN_CB_STATE_CONNECTING_PENDING;
794 p_pcb->mdep_cfg_idx = mdep_cfg_idx;
Priti Agheraf8f30c22013-04-02 15:31:19 -0700795 memcpy(p_pcb->bd_addr, bd_addr, sizeof(BD_ADDR));
The Android Open Source Project5738f832012-12-12 16:00:35 -0800796 p_pcb->op = op;
797
798 if (p_mcb->sdp.num_recs)
799 {
800 if (p_mcb->valid_sdp_idx)
801 {
802 p_dch_open_api->ctrl_psm = p_mcb->ctrl_psm;
803 }
804
805 if (!btif_hl_is_reconnect_possible(app_idx, mcl_idx, mdep_cfg_idx, p_dch_open_api, &mdl_id ))
806 {
807
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700808 BTIF_TRACE_DEBUG("Issue DCH open" );
The Android Open Source Project5738f832012-12-12 16:00:35 -0800809 BTA_HlDchOpen(p_mcb->mcl_handle, p_dch_open_api);
810 }
811 else
812 {
813 reconnect_param.ctrl_psm = p_mcb->ctrl_psm;
814 reconnect_param.mdl_id = mdl_id;;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700815 BTIF_TRACE_DEBUG("Issue Reconnect ctrl_psm=0x%x mdl_id=0x%x",reconnect_param.ctrl_psm, reconnect_param.mdl_id );
The Android Open Source Project5738f832012-12-12 16:00:35 -0800816 BTA_HlDchReconnect(p_mcb->mcl_handle, &reconnect_param);
817 }
818
819 status = TRUE;
820 }
821 else
822 {
823 p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
824 p_mcb->cch_oper = BTIF_HL_CCH_OP_DCH_OPEN;
Priti Agheraf8f30c22013-04-02 15:31:19 -0700825 BTA_HlSdpQuery(app_id,p_acb->app_handle, bd_addr);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800826 status = TRUE;
827 }
828 }
829 }
830 }
831
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700832 BTIF_TRACE_DEBUG("status=%d ", status);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800833 return status;
834}
835/*******************************************************************************
836**
837** Function btif_hl_copy_bda
838**
839** Description copy bt_bdaddr_t to BD_ADDR format
840**
841** Returns void
842**
843*******************************************************************************/
844void btif_hl_copy_bda(bt_bdaddr_t *bd_addr, BD_ADDR bda){
845 UINT8 i;
846 for (i=0; i<6; i++)
847 {
848 bd_addr->address[i] = bda[i] ;
849 }
850}
851/*******************************************************************************
852**
853** Function btif_hl_copy_bda
854**
855** Description display bt_bdaddr_t
856**
857** Returns BOOLEAN
858**
859*******************************************************************************/
860void btif_hl_display_bt_bda(bt_bdaddr_t *bd_addr){
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700861 BTIF_TRACE_DEBUG("DB [%02x:%02x:%02x:%02x:%02x:%02x]",
The Android Open Source Project5738f832012-12-12 16:00:35 -0800862 bd_addr->address[0], bd_addr->address[1], bd_addr->address[2],
863 bd_addr->address[3], bd_addr->address[4], bd_addr->address[5]);
864}
865
866/*******************************************************************************
867**
868** Function btif_hl_dch_abort
869**
870** Description Process DCH abort request
871**
872** Returns Nothing
873**
874*******************************************************************************/
875void btif_hl_dch_abort(UINT8 app_idx, UINT8 mcl_idx){
876 btif_hl_mcl_cb_t *p_mcb;
877
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700878 BTIF_TRACE_DEBUG("%s app_idx=%d mcl_idx=%d",__FUNCTION__, app_idx, mcl_idx );
The Android Open Source Project5738f832012-12-12 16:00:35 -0800879 p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
880 if (p_mcb->is_connected)
881 {
882 BTA_HlDchAbort(p_mcb->mcl_handle);
883 }
884 else
885 {
886 p_mcb->pcb.abort_pending = TRUE;
887 }
888
889}
890/*******************************************************************************
891**
892** Function btif_hl_cch_open
893**
894** Description Process CCH open request
895**
896** Returns Nothing
897**
898*******************************************************************************/
899BOOLEAN btif_hl_cch_open(UINT8 app_id, BD_ADDR bd_addr, UINT16 ctrl_psm,
900 int mdep_cfg_idx,
901 btif_hl_pend_dch_op_t op, int *channel_id){
902
903 btif_hl_app_cb_t *p_acb;
904 btif_hl_mcl_cb_t *p_mcb;
905 btif_hl_pending_chan_cb_t *p_pcb;
906 UINT8 app_idx, mcl_idx, chan_idx;
907 BOOLEAN status = TRUE;
908
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700909 BTIF_TRACE_DEBUG("%s app_id=%d ctrl_psm=%d mdep_cfg_idx=%d op=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -0800910 __FUNCTION__, app_id, ctrl_psm, mdep_cfg_idx, op);
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700911 BTIF_TRACE_DEBUG("DB [%02x:%02x:%02x:%02x:%02x:%02x]",
The Android Open Source Project5738f832012-12-12 16:00:35 -0800912 bd_addr[0], bd_addr[1],bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]);
913
914 if (btif_hl_find_app_idx(app_id, &app_idx))
915 {
916 p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
917
918 if (!btif_hl_find_mcl_idx(app_idx, bd_addr, &mcl_idx))
919 {
920 if (btif_hl_find_avail_mcl_idx(app_idx, &mcl_idx))
921 {
922 p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
923 memset(p_mcb,0, sizeof(btif_hl_mcl_cb_t));
924 p_mcb->in_use = TRUE;
925 bdcpy(p_mcb->bd_addr, bd_addr);
926
927 if (!ctrl_psm)
928 {
929 p_mcb->cch_oper = BTIF_HL_CCH_OP_MDEP_FILTERING;
930 }
931 else
932 {
933 p_mcb->cch_oper = BTIF_HL_CCH_OP_MATCHED_CTRL_PSM;
934 p_mcb->req_ctrl_psm = ctrl_psm;
935 }
936
937 p_pcb = BTIF_HL_GET_PCB_PTR(app_idx, mcl_idx);
938 p_pcb->in_use = TRUE;
939 p_pcb->mdep_cfg_idx = mdep_cfg_idx;
940 memcpy(p_pcb->bd_addr, bd_addr, sizeof(BD_ADDR));
941 p_pcb->op = op;
942
943 switch (op)
944 {
945 case BTIF_HL_PEND_DCH_OP_OPEN:
946 *channel_id =
947 p_pcb->channel_id = (int) btif_hl_get_next_channel_id(app_id);
948 p_pcb->cb_state = BTIF_HL_CHAN_CB_STATE_CONNECTING_PENDING;
949 break;
950 case BTIF_HL_PEND_DCH_OP_DELETE_MDL:
951 p_pcb->channel_id = p_acb->delete_mdl.channel_id;
952 p_pcb->cb_state = BTIF_HL_CHAN_CB_STATE_DESTROYED_PENDING;
953 break;
954 default:
955 break;
956 }
Priti Agheraf8f30c22013-04-02 15:31:19 -0700957 BTA_HlSdpQuery(app_id,p_acb->app_handle, bd_addr);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800958 }
959 else
960 {
961 status = FALSE;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700962 BTIF_TRACE_ERROR("Open CCH request discarded- No mcl cb");
The Android Open Source Project5738f832012-12-12 16:00:35 -0800963 }
964 }
965 else
966 {
967 status = FALSE;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700968 BTIF_TRACE_ERROR("Open CCH request discarded- already in USE");
The Android Open Source Project5738f832012-12-12 16:00:35 -0800969 }
970 }
971 else
972 {
973 status = FALSE;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700974 BTIF_TRACE_ERROR("Invalid app_id=%d", app_id);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800975 }
976
977 if (channel_id)
978 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700979 BTIF_TRACE_DEBUG("status=%d channel_id=0x%08x", status, *channel_id);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800980 }
981 else
982 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700983 BTIF_TRACE_DEBUG("status=%d ", status);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800984 }
985 return status;
986}
987
988
989/*******************************************************************************
990**
991** Function btif_hl_find_mdl_idx_using_handle
992**
993** Description Find the MDL index using channel id
994**
995** Returns BOOLEAN
996**
997*******************************************************************************/
998BOOLEAN btif_hl_find_mdl_cfg_idx_using_channel_id(int channel_id,
999 UINT8 *p_app_idx,
1000 UINT8 *p_mdl_cfg_idx){
1001 btif_hl_app_cb_t *p_acb;
1002 btif_hl_mdl_cfg_t *p_mdl;
1003 BOOLEAN found=FALSE;
1004 UINT8 i,j;
1005 int mdl_cfg_channel_id;
1006
Matthew Xiebea41312014-05-09 01:04:04 -07001007 *p_app_idx = 0;
1008 *p_mdl_cfg_idx =0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001009 for (i=0; i < BTA_HL_NUM_APPS ; i ++)
1010 {
1011 p_acb =BTIF_HL_GET_APP_CB_PTR(i);
1012 for (j=0; j< BTA_HL_NUM_MDL_CFGS; j++)
1013 {
1014 p_mdl =BTIF_HL_GET_MDL_CFG_PTR(i,j);
1015 mdl_cfg_channel_id = *(BTIF_HL_GET_MDL_CFG_CHANNEL_ID_PTR(i,j));
1016 if (p_acb->in_use &&
1017 p_mdl->base.active &&
1018 (mdl_cfg_channel_id == channel_id))
1019 {
1020 found = TRUE;
1021 *p_app_idx = i;
1022 *p_mdl_cfg_idx =j;
1023 break;
1024 }
1025 }
1026 }
1027
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001028 BTIF_TRACE_EVENT("%s found=%d channel_id=0x%08x, app_idx=%d mdl_cfg_idx=%d ",
The Android Open Source Project5738f832012-12-12 16:00:35 -08001029 __FUNCTION__,found,channel_id, i,j );
1030 return found;
1031}
1032/*******************************************************************************
1033**
1034** Function btif_hl_find_mdl_idx_using_handle
1035**
1036** Description Find the MDL index using channel id
1037**
1038** Returns BOOLEAN
1039**
1040*******************************************************************************/
1041BOOLEAN btif_hl_find_mdl_idx_using_channel_id(int channel_id,
1042 UINT8 *p_app_idx,UINT8 *p_mcl_idx,
1043 UINT8 *p_mdl_idx){
1044 btif_hl_app_cb_t *p_acb;
1045 btif_hl_mcl_cb_t *p_mcb;
1046 btif_hl_mdl_cb_t *p_dcb;
1047 BOOLEAN found=FALSE;
1048 UINT8 i,j,k;
1049
1050 for (i=0; i < BTA_HL_NUM_APPS ; i ++)
1051 {
1052 p_acb =BTIF_HL_GET_APP_CB_PTR(i);
1053 for (j=0; j< BTA_HL_NUM_MCLS; j++)
1054 {
1055 p_mcb =BTIF_HL_GET_MCL_CB_PTR(i,j);
1056 for (k=0; k< BTA_HL_NUM_MDLS_PER_MCL; k++)
1057 {
1058 p_dcb =BTIF_HL_GET_MDL_CB_PTR(i,j,k);
1059 if (p_acb->in_use &&
1060 p_mcb->in_use &&
1061 p_dcb->in_use &&
1062 (p_dcb->channel_id == channel_id))
1063 {
1064 found = TRUE;
1065 *p_app_idx = i;
1066 *p_mcl_idx =j;
1067 *p_mdl_idx = k;
1068 break;
1069 }
1070 }
1071 }
1072 }
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001073 BTIF_TRACE_DEBUG("%s found=%d app_idx=%d mcl_idx=%d mdl_idx=%d ",
The Android Open Source Project5738f832012-12-12 16:00:35 -08001074 __FUNCTION__,found,i,j,k );
1075 return found;
1076}
1077
1078/*******************************************************************************
1079**
1080** Function btif_hl_find_channel_id_using_mdl_id
1081**
1082** Description Find channel id using mdl_id'
1083**
1084** Returns BOOLEAN
1085*********************************************************************************/
1086BOOLEAN btif_hl_find_channel_id_using_mdl_id(UINT8 app_idx, tBTA_HL_MDL_ID mdl_id,
1087 int *p_channel_id){
1088 btif_hl_app_cb_t *p_acb;
1089 btif_hl_mdl_cfg_t *p_mdl;
1090 BOOLEAN found=FALSE;
1091 UINT8 j=0;
1092 int mdl_cfg_channel_id;
1093 p_acb =BTIF_HL_GET_APP_CB_PTR(app_idx);
1094 if (p_acb && p_acb->in_use)
1095 {
1096 for (j=0; j< BTA_HL_NUM_MDL_CFGS; j++)
1097 {
1098 p_mdl =BTIF_HL_GET_MDL_CFG_PTR(app_idx,j);
1099 mdl_cfg_channel_id = *(BTIF_HL_GET_MDL_CFG_CHANNEL_ID_PTR(app_idx,j));
1100 if ( p_mdl->base.active && (p_mdl->base.mdl_id == mdl_id))
1101 {
1102 found = TRUE;
1103 *p_channel_id = mdl_cfg_channel_id;
1104 break;
1105 }
1106 }
1107 }
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001108 BTIF_TRACE_EVENT("%s found=%d channel_id=0x%08x, mdl_id=0x%x app_idx=%d mdl_cfg_idx=%d ",
The Android Open Source Project5738f832012-12-12 16:00:35 -08001109 __FUNCTION__,found,*p_channel_id,mdl_id, app_idx,j );
1110 return found;
1111}
1112
1113
1114/*******************************************************************************
1115**
1116** Function btif_hl_find_mdl_idx_using_handle
1117**
1118** Description Find the MDL index using handle
1119**
1120** Returns BOOLEAN
1121**
1122*******************************************************************************/
1123BOOLEAN btif_hl_find_mdl_idx_using_handle(tBTA_HL_MDL_HANDLE mdl_handle,
1124 UINT8 *p_app_idx,UINT8 *p_mcl_idx,
1125 UINT8 *p_mdl_idx){
1126 btif_hl_app_cb_t *p_acb;
1127 btif_hl_mcl_cb_t *p_mcb;
1128 btif_hl_mdl_cb_t *p_dcb;
1129 BOOLEAN found=FALSE;
1130 UINT8 i,j,k;
1131
Matthew Xiebea41312014-05-09 01:04:04 -07001132 *p_app_idx = 0;
1133 *p_mcl_idx =0;
1134 *p_mdl_idx = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001135 for (i=0; i < BTA_HL_NUM_APPS ; i ++)
1136 {
1137 p_acb =BTIF_HL_GET_APP_CB_PTR(i);
1138 for (j=0; j< BTA_HL_NUM_MCLS; j++)
1139 {
1140 p_mcb =BTIF_HL_GET_MCL_CB_PTR(i,j);
1141 for (k=0; k< BTA_HL_NUM_MDLS_PER_MCL; k++)
1142 {
1143 p_dcb =BTIF_HL_GET_MDL_CB_PTR(i,j,k);
1144 if (p_acb->in_use &&
1145 p_mcb->in_use &&
1146 p_dcb->in_use &&
1147 (p_dcb->mdl_handle == mdl_handle))
1148 {
1149 found = TRUE;
1150 *p_app_idx = i;
1151 *p_mcl_idx =j;
1152 *p_mdl_idx = k;
1153 break;
1154 }
1155 }
1156 }
1157 }
1158
1159
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001160 BTIF_TRACE_EVENT("%s found=%d app_idx=%d mcl_idx=%d mdl_idx=%d ",
The Android Open Source Project5738f832012-12-12 16:00:35 -08001161 __FUNCTION__,found,i,j,k );
1162 return found;
1163}
1164/*******************************************************************************
1165**
1166** Function btif_hl_find_peer_mdep_id
1167**
1168** Description Find the peer MDEP ID from the received SPD records
1169**
1170** Returns BOOLEAN
1171**
1172*******************************************************************************/
1173static BOOLEAN btif_hl_find_peer_mdep_id(UINT8 app_id, BD_ADDR bd_addr,
1174 tBTA_HL_MDEP_ROLE local_mdep_role,
1175 UINT16 data_type,
1176 tBTA_HL_MDEP_ID *p_peer_mdep_id){
1177 UINT8 app_idx, mcl_idx;
1178 btif_hl_app_cb_t *p_acb;
1179 btif_hl_mcl_cb_t *p_mcb;
1180 tBTA_HL_SDP_REC *p_rec;
1181 UINT8 i, num_mdeps;
1182 BOOLEAN found = FALSE;
1183 tBTA_HL_MDEP_ROLE peer_mdep_role;
1184
1185
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001186 BTIF_TRACE_DEBUG("%s app_id=%d local_mdep_role=%d, data_type=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08001187 __FUNCTION__, app_id, local_mdep_role, data_type);
1188
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001189 BTIF_TRACE_DEBUG("DB [%02x:%02x:%02x:%02x:%02x:%02x]",
The Android Open Source Project5738f832012-12-12 16:00:35 -08001190 bd_addr[0], bd_addr[1],
1191 bd_addr[2], bd_addr[3],
1192 bd_addr[4], bd_addr[5]);
1193
1194
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001195 BTIF_TRACE_DEBUG("local_mdep_role=%d", local_mdep_role);
1196 BTIF_TRACE_DEBUG("data_type=%d", data_type);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001197
1198 if (local_mdep_role == BTA_HL_MDEP_ROLE_SINK)
1199 peer_mdep_role = BTA_HL_MDEP_ROLE_SOURCE;
1200 else
1201 peer_mdep_role = BTA_HL_MDEP_ROLE_SINK;
1202
1203 if (btif_hl_find_app_idx(app_id, &app_idx) )
1204 {
1205 p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
1206 if (btif_hl_find_mcl_idx(app_idx, bd_addr, &mcl_idx))
1207 {
1208 p_mcb =BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
1209
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001210 BTIF_TRACE_DEBUG("app_idx=%d mcl_idx=%d",app_idx, mcl_idx);
1211 BTIF_TRACE_DEBUG("valid_spd_idx=%d sdp_idx=%d",p_mcb->valid_sdp_idx, p_mcb->sdp_idx);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001212 if (p_mcb->valid_sdp_idx)
1213 {
1214 p_rec = &p_mcb->sdp.sdp_rec[p_mcb->sdp_idx];
1215 num_mdeps = p_rec->num_mdeps;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001216 BTIF_TRACE_DEBUG("num_mdeps=%d", num_mdeps);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001217
1218 for (i=0; i< num_mdeps; i++)
1219 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001220 BTIF_TRACE_DEBUG("p_rec->mdep_cfg[%d].mdep_role=%d",i, p_rec->mdep_cfg[i].mdep_role);
1221 BTIF_TRACE_DEBUG("p_rec->mdep_cfg[%d].data_type =%d",i, p_rec->mdep_cfg[i].data_type );
The Android Open Source Project5738f832012-12-12 16:00:35 -08001222 if ((p_rec->mdep_cfg[i].mdep_role == peer_mdep_role) &&
1223 (p_rec->mdep_cfg[i].data_type == data_type))
1224 {
1225 found = TRUE;
1226 *p_peer_mdep_id = p_rec->mdep_cfg[i].mdep_id;
1227 break;
1228 }
1229 }
1230 }
1231 }
1232 }
1233
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001234 BTIF_TRACE_DEBUG("found =%d *p_peer_mdep_id=%d", found, *p_peer_mdep_id);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001235
1236 return found;
1237}
The Android Open Source Project5738f832012-12-12 16:00:35 -08001238
1239/*******************************************************************************
1240**
1241** Function btif_hl_find_mdep_cfg_idx
1242**
1243** Description Find the MDEP configuration index using local MDEP_ID
1244**
1245** Returns BOOLEAN
1246**
1247*******************************************************************************/
1248static BOOLEAN btif_hl_find_mdep_cfg_idx(UINT8 app_idx, tBTA_HL_MDEP_ID local_mdep_id,
1249 UINT8 *p_mdep_cfg_idx){
1250 btif_hl_app_cb_t *p_acb =BTIF_HL_GET_APP_CB_PTR(app_idx);
1251 tBTA_HL_SUP_FEATURE *p_sup_feature= &p_acb->sup_feature;
1252 BOOLEAN found =FALSE;
1253 UINT8 i;
1254
1255 for (i=0; i< p_sup_feature->num_of_mdeps; i++)
1256 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001257 BTIF_TRACE_DEBUG("btif_hl_find_mdep_cfg_idx: mdep_id=%d app_idx = %d",
Priti Agheraf8f30c22013-04-02 15:31:19 -07001258 p_sup_feature->mdep[i].mdep_id,app_idx);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001259 if ( p_sup_feature->mdep[i].mdep_id == local_mdep_id)
1260 {
1261 found = TRUE;
1262 *p_mdep_cfg_idx = i;
1263 break;
1264 }
1265 }
1266
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001267 BTIF_TRACE_DEBUG("%s found=%d mdep_idx=%d local_mdep_id=%d app_idx=%d ",
Priti Agheraf8f30c22013-04-02 15:31:19 -07001268 __FUNCTION__, found,i, local_mdep_id,app_idx);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001269 return found;
1270}
1271
1272
1273
1274/*******************************************************************************
1275**
1276** Function btif_hl_find_mcl_idx
1277**
1278** Description Find the MCL index using BD address
1279**
1280** Returns BOOLEAN
1281**
1282*******************************************************************************/
1283BOOLEAN btif_hl_find_mcl_idx(UINT8 app_idx, BD_ADDR p_bd_addr, UINT8 *p_mcl_idx){
1284 BOOLEAN found=FALSE;
1285 UINT8 i;
1286 btif_hl_app_cb_t *p_acb =BTIF_HL_GET_APP_CB_PTR(app_idx);
1287 btif_hl_mcl_cb_t *p_mcb;
1288
Matthew Xiebea41312014-05-09 01:04:04 -07001289 *p_mcl_idx = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001290 for (i=0; i < BTA_HL_NUM_MCLS ; i ++)
1291 {
1292 p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, i);
1293 if (p_mcb->in_use &&
1294 (!memcmp (p_mcb->bd_addr, p_bd_addr, BD_ADDR_LEN)))
1295 {
1296 found = TRUE;
1297 *p_mcl_idx = i;
1298 break;
1299 }
1300 }
1301
1302
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001303 BTIF_TRACE_DEBUG("%s found=%d idx=%d",__FUNCTION__, found, i);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001304 return found;
1305}
1306/*******************************************************************************
1307**
1308** Function btif_hl_init
1309**
1310** Description HL initialization function.
1311**
1312** Returns void
1313**
1314*******************************************************************************/
1315static void btif_hl_init(void){
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001316 BTIF_TRACE_DEBUG("%s", __FUNCTION__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001317 memset(p_btif_hl_cb, 0, sizeof(btif_hl_cb_t));
1318 btif_hl_init_next_app_id();
1319 btif_hl_init_next_channel_id();
1320}
1321/*******************************************************************************
1322**
1323** Function btif_hl_disable
1324**
1325** Description Disable initialization function.
1326**
1327** Returns void
1328**
1329*******************************************************************************/
1330static void btif_hl_disable(void){
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001331 BTIF_TRACE_DEBUG("%s", __FUNCTION__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001332
1333 if ((p_btif_hl_cb->state != BTIF_HL_STATE_DISABLING) &&
1334 (p_btif_hl_cb->state != BTIF_HL_STATE_DISABLED))
1335 {
1336 btif_hl_set_state(BTIF_HL_STATE_DISABLING);
1337 BTA_HlDisable();
1338 }
1339}
1340/*******************************************************************************
1341**
1342** Function btif_hl_is_no_active_app
1343**
1344** Description Find whether or not any APP is still in use
1345**
1346** Returns BOOLEAN
1347**
1348*******************************************************************************/
1349static BOOLEAN btif_hl_is_no_active_app(void){
1350 BOOLEAN no_active_app = TRUE;
1351 UINT8 i;
1352
1353 for (i=0; i < BTA_HL_NUM_APPS ; i ++)
1354 {
1355 if (btif_hl_cb.acb[i].in_use)
1356 {
1357 no_active_app = FALSE;
1358 break;
1359 }
1360 }
1361
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001362 BTIF_TRACE_DEBUG("%s no_active_app=%d ", __FUNCTION__, no_active_app );
The Android Open Source Project5738f832012-12-12 16:00:35 -08001363 return no_active_app;
1364}
1365
1366/*******************************************************************************
1367**
1368** Function btif_hl_free_app_idx
1369**
1370** Description free an application control block
1371**
1372** Returns void
1373**
1374*******************************************************************************/
1375static void btif_hl_free_app_idx(UINT8 app_idx){
1376
1377 if ((app_idx < BTA_HL_NUM_APPS) && btif_hl_cb.acb[app_idx].in_use )
1378 {
1379 btif_hl_cb.acb[app_idx].in_use = FALSE;
1380 memset (&btif_hl_cb.acb[app_idx], 0, sizeof(btif_hl_app_cb_t));
1381 }
1382}
1383/*******************************************************************************
1384**
1385** Function btif_hl_set_state
1386**
1387** Description set HL state
1388**
1389** Returns void
1390**
1391*******************************************************************************/
1392static void btif_hl_set_state(btif_hl_state_t state){
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001393 BTIF_TRACE_DEBUG("btif_hl_set_state: %d ---> %d ", p_btif_hl_cb->state, state);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001394 p_btif_hl_cb->state = state;
1395}
1396
1397/*******************************************************************************
1398**
1399** Function btif_hl_set_state
1400**
1401** Description get HL state
1402**
1403** Returns btif_hl_state_t
1404**
1405*******************************************************************************/
1406
1407static btif_hl_state_t btif_hl_get_state(void){
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001408 BTIF_TRACE_DEBUG("btif_hl_get_state: %d ", p_btif_hl_cb->state);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001409 return p_btif_hl_cb->state;
1410}
1411
1412/*******************************************************************************
1413**
1414** Function btif_hl_find_data_type_idx
1415**
1416** Description Find the index in the data type table
1417**
1418** Returns BOOLEAN
1419**
1420*******************************************************************************/
1421static BOOLEAN btif_hl_find_data_type_idx(UINT16 data_type, UINT8 *p_idx){
1422 BOOLEAN found = FALSE;
1423 UINT8 i;
1424
1425 for (i=0; i< BTIF_HL_DATA_TABLE_SIZE; i++ )
1426 {
1427 if (data_type_table[i].data_type == data_type)
1428 {
1429 found = TRUE;
1430 *p_idx= i;
1431 break;
1432 }
1433 }
1434
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001435 BTIF_TRACE_DEBUG("%s found=%d, data_type=0x%x idx=%d", __FUNCTION__, found, data_type, i);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001436 return found;
1437}
1438
1439/*******************************************************************************
1440**
1441** Function btif_hl_get_max_tx_apdu_size
1442**
1443** Description Find the maximum TX APDU size for the specified data type and
1444** MDEP role
1445**
1446** Returns UINT16
1447**
1448*******************************************************************************/
1449UINT16 btif_hl_get_max_tx_apdu_size(tBTA_HL_MDEP_ROLE mdep_role,
1450 UINT16 data_type ){
1451 UINT8 idx;
1452 UINT16 max_tx_apdu_size =0;
1453
1454 if (btif_hl_find_data_type_idx(data_type, &idx))
1455 {
1456 if (mdep_role == BTA_HL_MDEP_ROLE_SOURCE)
1457 {
1458 max_tx_apdu_size = data_type_table[idx].max_tx_apdu_size;
1459 }
1460 else
1461 {
1462 max_tx_apdu_size = data_type_table[idx].max_rx_apdu_size;
1463 }
1464 }
1465 else
1466 {
1467 if (mdep_role == BTA_HL_MDEP_ROLE_SOURCE)
1468 {
1469 max_tx_apdu_size = BTIF_HL_DEFAULT_SRC_TX_APDU_SIZE;
1470 }
1471 else
1472 {
1473 max_tx_apdu_size = BTIF_HL_DEFAULT_SRC_RX_APDU_SIZE;
1474 }
1475
1476
1477 }
1478
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001479 BTIF_TRACE_DEBUG("%s mdep_role=%d data_type=0x%4x size=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08001480 __FUNCTION__, mdep_role, data_type, max_tx_apdu_size);
1481 return max_tx_apdu_size;
1482}
1483
1484
1485/*******************************************************************************
1486**
1487** Function btif_hl_get_max_rx_apdu_size
1488**
1489** Description Find the maximum RX APDU size for the specified data type and
1490** MDEP role
1491**
1492** Returns UINT16
1493**
1494*******************************************************************************/
1495UINT16 btif_hl_get_max_rx_apdu_size(tBTA_HL_MDEP_ROLE mdep_role,
1496 UINT16 data_type ){
1497 UINT8 idx;
1498 UINT16 max_rx_apdu_size =0;
1499
1500 if (btif_hl_find_data_type_idx(data_type, &idx))
1501 {
1502 if (mdep_role == BTA_HL_MDEP_ROLE_SOURCE)
1503 {
1504 max_rx_apdu_size = data_type_table[idx].max_rx_apdu_size;
1505 }
1506 else
1507 {
1508 max_rx_apdu_size = data_type_table[idx].max_tx_apdu_size;
1509 }
1510 }
1511 else
1512 {
1513 if (mdep_role == BTA_HL_MDEP_ROLE_SOURCE)
1514 {
1515 max_rx_apdu_size = BTIF_HL_DEFAULT_SRC_RX_APDU_SIZE;
1516 }
1517 else
1518 {
1519 max_rx_apdu_size = BTIF_HL_DEFAULT_SRC_TX_APDU_SIZE;
1520 }
1521 }
1522
1523
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001524 BTIF_TRACE_DEBUG("%s mdep_role=%d data_type=0x%4x size=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08001525 __FUNCTION__, mdep_role, data_type, max_rx_apdu_size);
1526
1527 return max_rx_apdu_size;
1528}
1529
1530/*******************************************************************************
1531**
1532** Function btif_hl_if_channel_setup_pending
1533**
1534** Description
1535**
1536** Returns BOOLEAN
1537**
1538*******************************************************************************/
1539
1540static BOOLEAN btif_hl_get_bta_mdep_role(bthl_mdep_role_t mdep, tBTA_HL_MDEP_ROLE *p){
1541 BOOLEAN status = TRUE;
1542 switch (mdep)
1543 {
1544 case BTHL_MDEP_ROLE_SOURCE:
1545 *p = BTA_HL_MDEP_ROLE_SOURCE;
1546 break;
1547 case BTHL_MDEP_ROLE_SINK:
1548 *p = BTA_HL_MDEP_ROLE_SINK;
1549 break;
1550 default:
Matthew Xiebea41312014-05-09 01:04:04 -07001551 *p = BTA_HL_MDEP_ROLE_SOURCE;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001552 status = FALSE;
1553 break;
1554 }
1555
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001556 BTIF_TRACE_DEBUG("%s status=%d bta_mdep_role=%d (%d:btif)",
The Android Open Source Project5738f832012-12-12 16:00:35 -08001557 __FUNCTION__, status, *p, mdep);
1558 return status;
1559}
1560/*******************************************************************************
1561**
1562** Function btif_hl_get_bta_channel_type
1563**
1564** Description convert bthl channel type to BTA DCH channel type
1565**
1566** Returns BOOLEAN
1567**
1568*******************************************************************************/
1569
1570static BOOLEAN btif_hl_get_bta_channel_type(bthl_channel_type_t channel_type, tBTA_HL_DCH_CFG *p){
1571 BOOLEAN status = TRUE;
1572 switch (channel_type)
1573 {
1574 case BTHL_CHANNEL_TYPE_RELIABLE:
1575 *p = BTA_HL_DCH_CFG_RELIABLE;
1576 break;
1577 case BTHL_CHANNEL_TYPE_STREAMING:
1578 *p = BTA_HL_DCH_CFG_STREAMING;
1579 break;
1580 case BTHL_CHANNEL_TYPE_ANY:
1581 *p = BTA_HL_DCH_CFG_NO_PREF;
1582 break;
1583 default:
1584 status = FALSE;
1585 break;
1586 }
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001587 BTIF_TRACE_DEBUG("%s status = %d BTA DCH CFG=%d (1-rel 2-strm",
The Android Open Source Project5738f832012-12-12 16:00:35 -08001588 __FUNCTION__, status, *p);
1589 return status;
1590}
1591/*******************************************************************************
1592**
1593** Function btif_hl_get_next_app_id
1594**
1595** Description get next applcation id
1596**
1597** Returns UINT8
1598**
1599*******************************************************************************/
1600
1601static UINT8 btif_hl_get_next_app_id(){
1602 UINT8 next_app_id = btif_hl_cb.next_app_id;
1603
1604 btif_hl_cb.next_app_id++;
1605 return next_app_id;
1606}
1607/*******************************************************************************
1608**
1609** Function btif_hl_get_next_channel_id
1610**
1611** Description get next channel id
1612**
1613** Returns int
1614**
1615*******************************************************************************/
1616static int btif_hl_get_next_channel_id(UINT8 app_id){
1617 UINT16 next_channel_id = btif_hl_cb.next_channel_id;
1618 int channel_id;
1619 btif_hl_cb.next_channel_id++;
1620 channel_id = (app_id << 16) + next_channel_id;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001621 BTIF_TRACE_DEBUG("%s channel_id=0x%08x, app_id=0x%02x next_channel_id=0x%04x", __FUNCTION__,
The Android Open Source Project5738f832012-12-12 16:00:35 -08001622 channel_id, app_id, next_channel_id);
1623 return channel_id;
1624}
1625/*******************************************************************************
1626**
1627** Function btif_hl_get_app_id
1628**
1629** Description get the applicaiton id associated with the channel id
1630**
1631** Returns UINT8
1632**
1633*******************************************************************************/
1634
1635static UINT8 btif_hl_get_app_id(int channel_id){
1636 UINT8 app_id =(UINT8) (channel_id >> 16);
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001637 BTIF_TRACE_DEBUG("%s channel_id=0x%08x, app_id=0x%02x ", __FUNCTION__,channel_id, app_id);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001638 return app_id;
1639}
1640/*******************************************************************************
1641**
1642** Function btif_hl_init_next_app_id
1643**
1644** Description initialize the application id
1645**
1646** Returns void
1647**
1648*******************************************************************************/
1649static void btif_hl_init_next_app_id(void){
1650 btif_hl_cb.next_app_id = 1;
1651}
1652/*******************************************************************************
1653**
1654** Function btif_hl_init_next_channel_id
1655**
1656** Description initialize the channel id
1657**
1658** Returns void
1659**
1660*******************************************************************************/
1661static void btif_hl_init_next_channel_id(void){
1662 btif_hl_cb.next_channel_id = 1;
1663}
1664
The Android Open Source Project5738f832012-12-12 16:00:35 -08001665
1666/*******************************************************************************
1667**
1668** Function btif_hl_find_app_idx_using_handle
1669**
1670** Description Find the applicaiton index using handle
1671**
1672** Returns BOOLEAN
1673**
1674*******************************************************************************/
1675BOOLEAN btif_hl_find_app_idx_using_handle(tBTA_HL_APP_HANDLE app_handle,
1676 UINT8 *p_app_idx){
1677 BOOLEAN found=FALSE;
1678 UINT8 i;
1679
1680 for (i=0; i < BTA_HL_NUM_APPS ; i ++)
1681 {
1682 if (btif_hl_cb.acb[i].in_use &&
1683 (btif_hl_cb.acb[i].app_handle == app_handle))
1684 {
1685 found = TRUE;
1686 *p_app_idx = i;
1687 break;
1688 }
1689 }
1690
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001691 BTIF_TRACE_EVENT("%s status=%d handle=%d app_idx=%d ",
The Android Open Source Project5738f832012-12-12 16:00:35 -08001692 __FUNCTION__, found, app_handle , i);
1693
1694 return found;
1695}
1696
1697/*******************************************************************************
1698**
Priti Agheraf8f30c22013-04-02 15:31:19 -07001699** Function btif_hl_find_app_idx_using_app_id
1700**
1701** Description Find the applicaiton index using app_id
1702**
1703** Returns BOOLEAN
1704**
1705*******************************************************************************/
1706BOOLEAN btif_hl_find_app_idx_using_app_id(UINT8 app_id,
1707 UINT8 *p_app_idx){
1708 BOOLEAN found=FALSE;
1709 UINT8 i;
1710
Matthew Xiebea41312014-05-09 01:04:04 -07001711 *p_app_idx = 0;
Priti Agheraf8f30c22013-04-02 15:31:19 -07001712 for (i=0; i < BTA_HL_NUM_APPS ; i ++)
1713 {
1714 if (btif_hl_cb.acb[i].in_use &&
1715 (btif_hl_cb.acb[i].app_id == app_id))
1716 {
1717 found = TRUE;
1718 *p_app_idx = i;
1719 break;
1720 }
1721 }
1722
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001723 BTIF_TRACE_EVENT("%s found=%d app_id=%d app_idx=%d ",
Priti Agheraf8f30c22013-04-02 15:31:19 -07001724 __FUNCTION__, found, app_id , i);
1725
1726 return found;
1727}
1728
1729/*******************************************************************************
1730**
The Android Open Source Project5738f832012-12-12 16:00:35 -08001731** Function btif_hl_find_mcl_idx_using_handle
1732**
1733** Description Find the MCL index using handle
1734**
1735** Returns BOOLEAN
1736**
1737*******************************************************************************/
1738BOOLEAN btif_hl_find_mcl_idx_using_handle( tBTA_HL_MCL_HANDLE mcl_handle,
1739 UINT8 *p_app_idx, UINT8 *p_mcl_idx){
1740 btif_hl_app_cb_t *p_acb;
1741 BOOLEAN found=FALSE;
1742 UINT8 i,j;
1743
1744 for (i=0; i<BTA_HL_NUM_APPS; i++)
1745 {
1746 p_acb =BTIF_HL_GET_APP_CB_PTR(i);
1747 for (j=0; j < BTA_HL_NUM_MCLS ; j++)
1748 {
Priti Agheraf8f30c22013-04-02 15:31:19 -07001749 if (p_acb->mcb[j].in_use)
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001750 BTIF_TRACE_DEBUG("btif_hl_find_mcl_idx_using_handle:app_idx=%d,"
Priti Agheraf8f30c22013-04-02 15:31:19 -07001751 "mcl_idx =%d mcl_handle=%d",i,j,p_acb->mcb[j].mcl_handle);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001752 if (p_acb->mcb[j].in_use &&
1753 (p_acb->mcb[j].mcl_handle == mcl_handle))
1754 {
1755 found = TRUE;
1756 *p_app_idx = i;
1757 *p_mcl_idx = j;
1758 break;
1759 }
1760 }
1761 }
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001762 BTIF_TRACE_DEBUG("%s found=%d app_idx=%d mcl_idx=%d",__FUNCTION__,
The Android Open Source Project5738f832012-12-12 16:00:35 -08001763 found, i, j);
1764 return found;
1765}
1766
1767/*******************************************************************************
1768**
Priti Agheraf8f30c22013-04-02 15:31:19 -07001769** Function btif_hl_find_mdl_idx_using_mdl_id
1770**
1771** Description Find the mdl index using mdl_id
1772**
1773** Returns BOOLEAN
1774**
1775*******************************************************************************/
1776BOOLEAN btif_hl_find_mcl_idx_using_mdl_id( UINT8 mdl_id,UINT8 mcl_handle,
1777 UINT8 *p_app_idx, UINT8 *p_mcl_idx){
1778 btif_hl_app_cb_t *p_acb;
1779 btif_hl_mcl_cb_t *p_mcb;
1780 BOOLEAN found=FALSE;
1781 UINT8 i,j,x;
1782
1783 for (i=0; i<BTA_HL_NUM_APPS; i++)
1784 {
1785 p_acb =BTIF_HL_GET_APP_CB_PTR(i);
1786 for (j=0; j < BTA_HL_NUM_MCLS ; j++)
1787 {
1788 if (p_acb->mcb[j].in_use &&
1789 (p_acb->mcb[j].mcl_handle == mcl_handle))
1790 {
1791 p_mcb = &p_acb->mcb[j];
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001792 BTIF_TRACE_DEBUG("btif_hl_find_mcl_idx_using_mdl_id: mcl handle found j =%d",j);
Priti Agheraf8f30c22013-04-02 15:31:19 -07001793 for (x=0; x < BTA_HL_NUM_MDLS_PER_MCL ; x ++)
1794 {
1795 if (p_mcb->mdl[x].in_use && p_mcb->mdl[x].mdl_id == mdl_id)
1796 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001797 BTIF_TRACE_DEBUG("btif_hl_find_mcl_idx_using_mdl_id:found x =%d",x);
Priti Agheraf8f30c22013-04-02 15:31:19 -07001798 found = TRUE;
1799 *p_app_idx = i;
1800 *p_mcl_idx = j;
1801 break;
1802 }
1803 }
1804 }
1805 }
1806 }
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001807 BTIF_TRACE_DEBUG("%s found=%d app_idx=%d mcl_idx=%d",__FUNCTION__,
Priti Agheraf8f30c22013-04-02 15:31:19 -07001808 found, i, j);
1809 return found;
1810}
1811
1812/*******************************************************************************
1813**
1814** Function btif_hl_find_mcl_idx_using_deleted_mdl_id
1815**
1816** Description Find the app index deleted_mdl_id
1817**
1818** Returns BOOLEAN
1819**
1820*******************************************************************************/
1821BOOLEAN btif_hl_find_app_idx_using_deleted_mdl_id( UINT8 mdl_id,
1822 UINT8 *p_app_idx){
1823 btif_hl_app_cb_t *p_acb;
1824 BOOLEAN found=FALSE;
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08001825 UINT8 i;
Priti Agheraf8f30c22013-04-02 15:31:19 -07001826
1827 for (i=0; i<BTA_HL_NUM_APPS; i++)
1828 {
1829 p_acb =BTIF_HL_GET_APP_CB_PTR(i);
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08001830 if (p_acb->delete_mdl.active) {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001831 BTIF_TRACE_DEBUG("btif_hl_find_app_idx_using_deleted_mdl_id: app_idx=%d,"
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08001832 "mdl_id=%d mcl_handle=%d",i,mdl_id,p_acb->mcb[i].mcl_handle);
1833 }
1834 if (p_acb->delete_mdl.active &&
1835 (p_acb->delete_mdl.mdl_id == mdl_id))
1836 {
1837 found = TRUE;
1838 *p_app_idx = i;
1839 break;
1840 }
Priti Agheraf8f30c22013-04-02 15:31:19 -07001841 }
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001842 BTIF_TRACE_DEBUG("%s found=%d app_idx=%d",__FUNCTION__,
Priti Agheraf8f30c22013-04-02 15:31:19 -07001843 found, i);
1844 return found;
1845}
1846
1847/*******************************************************************************
1848**
1849** Function btif_hl_stop_timer_using_handle
1850**
1851** Description clean control channel cb using handle
1852**
1853** Returns void
1854**
1855*******************************************************************************/
1856static void btif_hl_stop_timer_using_handle( tBTA_HL_MCL_HANDLE mcl_handle){
1857 btif_hl_app_cb_t *p_acb;
1858 BOOLEAN found=FALSE;
1859 UINT8 i,j;
1860
1861 for (i=0; i<BTA_HL_NUM_APPS; i++)
1862 {
1863 p_acb =BTIF_HL_GET_APP_CB_PTR(i);
1864 for (j=0; j < BTA_HL_NUM_MCLS ; j++)
1865 {
1866 if (p_acb->mcb[j].in_use &&
1867 (p_acb->mcb[j].mcl_handle == mcl_handle))
1868 {
1869 btif_hl_stop_cch_timer(i, j);
1870 }
1871 }
1872 }
1873}
1874
1875/*******************************************************************************
1876**
1877** Function btif_hl_find_mcl_idx_using_app_idx
1878**
1879** Description Find the MCL index using handle
1880**
1881** Returns BOOLEAN
1882**
1883*******************************************************************************/
1884BOOLEAN btif_hl_find_mcl_idx_using_app_idx( tBTA_HL_MCL_HANDLE mcl_handle,
1885 UINT8 p_app_idx, UINT8 *p_mcl_idx){
1886 btif_hl_app_cb_t *p_acb;
1887 BOOLEAN found=FALSE;
1888 UINT8 i,j;
1889
1890 p_acb =BTIF_HL_GET_APP_CB_PTR(p_app_idx);
1891 for (j=0; j < BTA_HL_NUM_MCLS ; j++)
1892 {
1893 if (p_acb->mcb[j].in_use &&
1894 (p_acb->mcb[j].mcl_handle == mcl_handle))
1895 {
1896 found = TRUE;
1897 *p_mcl_idx = j;
1898 break;
1899 }
1900 }
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001901 BTIF_TRACE_DEBUG("%s found=%dmcl_idx=%d",__FUNCTION__,
Priti Agheraf8f30c22013-04-02 15:31:19 -07001902 found, j);
1903 return found;
1904}
1905
1906/*******************************************************************************
1907**
1908** Function btif_hl_clean_mdls_using_app_idx
1909**
1910** Description clean dch cpntrol bloack using app_idx
1911**
1912** Returns void
1913**
1914*******************************************************************************/
1915void btif_hl_clean_mdls_using_app_idx( UINT8 app_idx){
1916 btif_hl_app_cb_t *p_acb;
1917 btif_hl_mcl_cb_t *p_mcb;
1918 btif_hl_mdl_cb_t *p_dcb;
1919 UINT8 i,j,x,y;
1920 bt_bdaddr_t bd_addr;
1921
1922 p_acb =BTIF_HL_GET_APP_CB_PTR(app_idx);
1923 for (j=0; j < BTA_HL_NUM_MCLS ; j++)
1924 {
1925 if (p_acb->mcb[j].in_use)
1926 {
1927 p_mcb = &p_acb->mcb[j];
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001928 BTIF_TRACE_DEBUG("btif_hl_find_mcl_idx_using_mdl_id: mcl handle found j =%d",j);
Priti Agheraf8f30c22013-04-02 15:31:19 -07001929 for (x=0; x < BTA_HL_NUM_MDLS_PER_MCL ; x ++)
1930 {
1931 if (p_mcb->mdl[x].in_use)
1932 {
1933 p_dcb = BTIF_HL_GET_MDL_CB_PTR(app_idx, j,x);
1934 btif_hl_release_socket(app_idx,j,x);
1935 for (y=0; y<6; y++)
1936 {
1937 bd_addr.address[y] = p_mcb->bd_addr[y];
1938 }
1939 BTIF_HL_CALL_CBACK(bt_hl_callbacks, channel_state_cb, p_acb->app_id,
1940 &bd_addr, p_dcb->local_mdep_cfg_idx,
1941 p_dcb->channel_id, BTHL_CONN_STATE_DISCONNECTED, 0 );
1942 btif_hl_clean_mdl_cb(p_dcb);
1943 if (!btif_hl_num_dchs_in_use(p_mcb->mcl_handle))
1944 BTA_HlCchClose(p_mcb->mcl_handle);
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001945 BTIF_TRACE_DEBUG("remote DCH close success mdl_idx=%d", x);
Priti Agheraf8f30c22013-04-02 15:31:19 -07001946 }
1947 }
1948 }
1949 }
1950}
1951
1952/*******************************************************************************
1953**
The Android Open Source Project5738f832012-12-12 16:00:35 -08001954** Function btif_hl_find_app_idx
1955**
1956** Description Find the application index using application ID
1957**
1958** Returns BOOLEAN
1959**
1960*******************************************************************************/
1961BOOLEAN btif_hl_find_app_idx(UINT8 app_id, UINT8 *p_app_idx){
1962 BOOLEAN found=FALSE;
1963 UINT8 i;
1964
1965 for (i=0; i < BTA_HL_NUM_APPS ; i ++)
1966 {
1967
1968 if (btif_hl_cb.acb[i].in_use &&
1969 (btif_hl_cb.acb[i].app_id == app_id))
1970 {
1971 found = TRUE;
1972 *p_app_idx = i;
1973 break;
1974 }
1975 }
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001976 BTIF_TRACE_DEBUG("%s found=%d app_idx=%d", __FUNCTION__, found, i );
The Android Open Source Project5738f832012-12-12 16:00:35 -08001977
1978 return found;
1979}
1980
Priti Agheraf8f30c22013-04-02 15:31:19 -07001981/*******************************************************************************
1982**
1983** Function btif_hl_find_app_idx
1984**
1985** Description Find the application index using application ID
1986**
1987** Returns BOOLEAN
1988**
1989*******************************************************************************/
1990BOOLEAN btif_hl_find_app_idx_using_mdepId(UINT8 mdep_id, UINT8 *p_app_idx){
1991 BOOLEAN found=FALSE;
1992 UINT8 i;
1993
Matthew Xiebea41312014-05-09 01:04:04 -07001994 *p_app_idx = 0;
Priti Agheraf8f30c22013-04-02 15:31:19 -07001995 for (i=0; i < BTA_HL_NUM_APPS ; i ++)
1996 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001997 BTIF_TRACE_DEBUG("btif_hl_find_app_idx_using_mdepId: MDEP-ID = %d",
Priti Agheraf8f30c22013-04-02 15:31:19 -07001998 btif_hl_cb.acb[i].sup_feature.mdep[0].mdep_id);
1999 if (btif_hl_cb.acb[i].in_use &&
2000 (btif_hl_cb.acb[i].sup_feature.mdep[0].mdep_id == mdep_id))
2001 {
2002 found = TRUE;
2003 *p_app_idx = i;
2004 break;
2005 }
2006 }
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002007 BTIF_TRACE_DEBUG("%s found=%d app_idx=%d", __FUNCTION__, found, i );
Priti Agheraf8f30c22013-04-02 15:31:19 -07002008
2009 return found;
2010}
The Android Open Source Project5738f832012-12-12 16:00:35 -08002011
2012/*******************************************************************************
2013**
2014** Function btif_hl_find_avail_mdl_idx
2015**
2016** Description Find a not in-use MDL index
2017**
2018** Returns BOOLEAN
2019**
2020*******************************************************************************/
2021BOOLEAN btif_hl_find_avail_mdl_idx(UINT8 app_idx, UINT8 mcl_idx,
2022 UINT8 *p_mdl_idx){
2023 btif_hl_mcl_cb_t *p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
2024 BOOLEAN found=FALSE;
2025 UINT8 i;
2026
2027 for (i=0; i < BTA_HL_NUM_MDLS_PER_MCL ; i ++)
2028 {
2029 if (!p_mcb->mdl[i].in_use)
2030 {
2031 btif_hl_clean_mdl_cb(&p_mcb->mdl[i]);
2032 found = TRUE;
2033 *p_mdl_idx = i;
2034 break;
2035 }
2036 }
2037
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002038 BTIF_TRACE_DEBUG("%s found=%d idx=%d",__FUNCTION__, found, i);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002039 return found;
2040}
2041
2042/*******************************************************************************
2043**
2044** Function btif_hl_find_avail_mcl_idx
2045**
2046** Description Find a not in-use MDL index
2047**
2048** Returns BOOLEAN
2049**
2050*******************************************************************************/
2051BOOLEAN btif_hl_find_avail_mcl_idx(UINT8 app_idx, UINT8 *p_mcl_idx){
2052 BOOLEAN found=FALSE;
2053 UINT8 i;
2054
2055 for (i=0; i < BTA_HL_NUM_MCLS ; i ++)
2056 {
2057 if (!btif_hl_cb.acb[app_idx].mcb[i].in_use)
2058 {
2059 found = TRUE;
2060 *p_mcl_idx = i;
2061 break;
2062 }
2063 }
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002064 BTIF_TRACE_DEBUG("%s found=%d mcl_idx=%d", __FUNCTION__, found, i);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002065 return found;
2066}
2067
2068/*******************************************************************************
2069**
2070** Function btif_hl_find_avail_app_idx
2071**
2072** Description Find a not in-use APP index
2073**
2074** Returns BOOLEAN
2075**
2076*******************************************************************************/
2077static BOOLEAN btif_hl_find_avail_app_idx(UINT8 *p_idx){
2078 BOOLEAN found = FALSE;
2079 UINT8 i;
2080
2081 for (i=0; i < BTA_HL_NUM_APPS ; i ++)
2082 {
2083 if (!btif_hl_cb.acb[i].in_use)
2084 {
2085 found = TRUE;
2086 *p_idx = i;
2087 break;
2088 }
2089 }
2090
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002091 BTIF_TRACE_DEBUG("%s found=%d app_idx=%d", __FUNCTION__, found, i);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002092 return found;
2093}
2094
2095
2096/*******************************************************************************
2097**
2098** Function btif_hl_proc_dereg_cfm
2099**
2100** Description Process the de-registration confirmation
2101**
2102** Returns Nothing
2103**
2104*******************************************************************************/
2105static void btif_hl_proc_dereg_cfm(tBTA_HL *p_data)
2106
2107{
2108 btif_hl_app_cb_t *p_acb;
2109 UINT8 app_idx;
2110 int app_id = 0;
2111 bthl_app_reg_state_t state = BTHL_APP_REG_STATE_DEREG_SUCCESS;
Priti Agheraf8f30c22013-04-02 15:31:19 -07002112 bt_status_t status = BT_STATUS_SUCCESS;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002113
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002114 BTIF_TRACE_DEBUG("%s de-reg status=%d app_handle=%d", __FUNCTION__,
Priti Agheraf8f30c22013-04-02 15:31:19 -07002115 p_data->dereg_cfm.status, p_data->dereg_cfm.app_handle);
2116
2117 if (btif_hl_find_app_idx_using_app_id(p_data->dereg_cfm.app_id, &app_idx))
The Android Open Source Project5738f832012-12-12 16:00:35 -08002118 {
2119 p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
2120 app_id = (int) p_acb->app_id;
2121 if (p_data->dereg_cfm.status == BTA_HL_STATUS_OK)
Priti Agheraf8f30c22013-04-02 15:31:19 -07002122 {
2123 btif_hl_clean_mdls_using_app_idx(app_idx);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002124 memset(p_acb, 0,sizeof(btif_hl_app_cb_t));
Priti Agheraf8f30c22013-04-02 15:31:19 -07002125 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08002126 else
2127 state = BTHL_APP_REG_STATE_DEREG_FAILED;
2128
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002129 BTIF_TRACE_DEBUG("call reg state callback app_id=%d state=%d", app_id, state);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002130 BTIF_HL_CALL_CBACK(bt_hl_callbacks, app_reg_state_cb, app_id, state );
2131
2132 if (btif_hl_is_no_active_app())
2133 {
2134 btif_hl_disable();
2135 }
2136 }
2137}
2138
2139/*******************************************************************************
2140**
The Android Open Source Project5738f832012-12-12 16:00:35 -08002141** Function btif_hl_proc_reg_cfm
2142**
2143** Description Process the registration confirmation
2144**
2145** Returns Nothing
2146**
2147*******************************************************************************/
2148static void btif_hl_proc_reg_cfm(tBTA_HL *p_data){
2149 btif_hl_app_cb_t *p_acb;
2150 UINT8 app_idx;
2151 bthl_app_reg_state_t state = BTHL_APP_REG_STATE_REG_SUCCESS;
2152 bt_status_t bt_status;
2153
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002154 BTIF_TRACE_DEBUG("%s reg status=%d app_handle=%d", __FUNCTION__, p_data->reg_cfm.status, p_data->reg_cfm.app_handle);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002155
2156 if (btif_hl_find_app_idx(p_data->reg_cfm.app_id, &app_idx))
2157 {
2158 p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002159 if (p_data->reg_cfm.status == BTA_HL_STATUS_OK)
2160 {
2161 p_acb->app_handle = p_data->reg_cfm.app_handle;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002162 }
2163 else
2164 {
2165 btif_hl_free_app_idx(app_idx);
Priti Agheraf8f30c22013-04-02 15:31:19 -07002166 reg_counter--;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002167 state = BTHL_APP_REG_STATE_REG_FAILED;
2168 }
2169
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002170 BTIF_TRACE_DEBUG("%s call reg state callback app_id=%d reg state=%d", __FUNCTION__, p_data->reg_cfm.app_id, state);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002171 BTIF_HL_CALL_CBACK(bt_hl_callbacks, app_reg_state_cb, ((int) p_data->reg_cfm.app_id), state );
2172 }
2173}
2174
2175/*******************************************************************************
2176**
The Android Open Source Project5738f832012-12-12 16:00:35 -08002177** Function btif_hl_set_chan_cb_state
2178**
2179** Description set the channel callback state
2180**
2181** Returns void
2182**
2183*******************************************************************************/
2184void btif_hl_set_chan_cb_state(UINT8 app_idx, UINT8 mcl_idx, btif_hl_chan_cb_state_t state){
2185 btif_hl_pending_chan_cb_t *p_pcb = BTIF_HL_GET_PCB_PTR(app_idx, mcl_idx);
2186 btif_hl_chan_cb_state_t cur_state = p_pcb->cb_state;
2187
2188 if (cur_state != state)
2189 {
2190 p_pcb->cb_state = state;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002191 BTIF_TRACE_DEBUG("%s state %d--->%d",__FUNCTION__, cur_state, state);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002192 }
2193
2194
2195}
2196/*******************************************************************************
2197**
2198** Function btif_hl_send_destroyed_cb
2199**
2200** Description send the channel destroyed callback
2201**
2202** Returns void
2203**
2204*******************************************************************************/
2205void btif_hl_send_destroyed_cb(btif_hl_app_cb_t *p_acb ){
2206 bt_bdaddr_t bd_addr;
2207 int app_id = (int) btif_hl_get_app_id(p_acb->delete_mdl.channel_id);
2208
2209 btif_hl_copy_bda(&bd_addr, p_acb->delete_mdl.bd_addr);
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002210 BTIF_TRACE_DEBUG("%s",__FUNCTION__);
2211 BTIF_TRACE_DEBUG("call channel state callback channel_id=0x%08x mdep_cfg_idx=%d, state=%d fd=%d",p_acb->delete_mdl.channel_id,
The Android Open Source Project5738f832012-12-12 16:00:35 -08002212 p_acb->delete_mdl.mdep_cfg_idx, BTHL_CONN_STATE_DESTROYED, 0);
2213 btif_hl_display_bt_bda(&bd_addr);
2214
2215 BTIF_HL_CALL_CBACK(bt_hl_callbacks, channel_state_cb, app_id,
2216 &bd_addr, p_acb->delete_mdl.mdep_cfg_idx,
2217 p_acb->delete_mdl.channel_id, BTHL_CONN_STATE_DESTROYED, 0 );
2218}
2219/*******************************************************************************
2220**
2221** Function btif_hl_send_disconnecting_cb
2222**
2223** Description send a channel disconnecting callback
2224**
2225** Returns void
2226**
2227*******************************************************************************/
2228void btif_hl_send_disconnecting_cb(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx){
2229 btif_hl_mdl_cb_t *p_dcb = BTIF_HL_GET_MDL_CB_PTR( app_idx, mcl_idx, mdl_idx);
2230 btif_hl_soc_cb_t *p_scb = p_dcb->p_scb;
2231 bt_bdaddr_t bd_addr;
2232 int app_id = (int) btif_hl_get_app_id(p_scb->channel_id);
2233
2234 btif_hl_copy_bda(&bd_addr, p_scb->bd_addr);
2235
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002236 BTIF_TRACE_DEBUG("%s",__FUNCTION__);
2237 BTIF_TRACE_DEBUG("call channel state callback channel_id=0x%08x mdep_cfg_idx=%d, state=%d fd=%d",p_scb->channel_id,
The Android Open Source Project5738f832012-12-12 16:00:35 -08002238 p_scb->mdep_cfg_idx, BTHL_CONN_STATE_DISCONNECTING, p_scb->socket_id[0]);
2239 btif_hl_display_bt_bda(&bd_addr);
2240 BTIF_HL_CALL_CBACK(bt_hl_callbacks, channel_state_cb, app_id,
2241 &bd_addr, p_scb->mdep_cfg_idx,
2242 p_scb->channel_id, BTHL_CONN_STATE_DISCONNECTING, p_scb->socket_id[0] );
2243}
2244/*******************************************************************************
2245**
2246** Function btif_hl_send_setup_connecting_cb
2247**
2248** Description send a channel connecting callback
2249**
2250** Returns void
2251**
2252*******************************************************************************/
2253void btif_hl_send_setup_connecting_cb(UINT8 app_idx, UINT8 mcl_idx){
2254 btif_hl_pending_chan_cb_t *p_pcb = BTIF_HL_GET_PCB_PTR(app_idx, mcl_idx);
2255 bt_bdaddr_t bd_addr;
2256 int app_id = (int) btif_hl_get_app_id(p_pcb->channel_id);
2257
2258 btif_hl_copy_bda(&bd_addr, p_pcb->bd_addr);
2259
2260 if (p_pcb->in_use && p_pcb->cb_state == BTIF_HL_CHAN_CB_STATE_CONNECTING_PENDING)
2261 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002262 BTIF_TRACE_DEBUG("%s",__FUNCTION__);
2263 BTIF_TRACE_DEBUG("call channel state callback channel_id=0x%08x mdep_cfg_idx=%d state=%d fd=%d",p_pcb->channel_id,
The Android Open Source Project5738f832012-12-12 16:00:35 -08002264 p_pcb->mdep_cfg_idx, BTHL_CONN_STATE_CONNECTING, 0);
2265 btif_hl_display_bt_bda(&bd_addr);
2266
2267 BTIF_HL_CALL_CBACK(bt_hl_callbacks, channel_state_cb, app_id,
2268 &bd_addr, p_pcb->mdep_cfg_idx,
2269 p_pcb->channel_id, BTHL_CONN_STATE_CONNECTING, 0 );
2270 btif_hl_set_chan_cb_state(app_idx, mcl_idx, BTIF_HL_CHAN_CB_STATE_CONNECTED_PENDING);
2271 }
2272}
2273/*******************************************************************************
2274**
2275** Function btif_hl_send_setup_disconnected_cb
2276**
2277** Description send a channel disconnected callback
2278**
2279** Returns void
2280**
2281*******************************************************************************/
2282void btif_hl_send_setup_disconnected_cb(UINT8 app_idx, UINT8 mcl_idx){
2283 btif_hl_pending_chan_cb_t *p_pcb = BTIF_HL_GET_PCB_PTR(app_idx, mcl_idx);
2284 bt_bdaddr_t bd_addr;
2285 int app_id = (int) btif_hl_get_app_id(p_pcb->channel_id);
2286
2287 btif_hl_copy_bda(&bd_addr, p_pcb->bd_addr);
2288
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002289 BTIF_TRACE_DEBUG("%s p_pcb->in_use=%d",__FUNCTION__, p_pcb->in_use);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002290 if (p_pcb->in_use)
2291 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002292 BTIF_TRACE_DEBUG("%p_pcb->cb_state=%d",p_pcb->cb_state);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002293 if (p_pcb->cb_state == BTIF_HL_CHAN_CB_STATE_CONNECTING_PENDING)
2294 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002295 BTIF_TRACE_DEBUG("call channel state callback channel_id=0x%08x mdep_cfg_idx=%d state=%d fd=%d",p_pcb->channel_id,
The Android Open Source Project5738f832012-12-12 16:00:35 -08002296 p_pcb->mdep_cfg_idx, BTHL_CONN_STATE_CONNECTING, 0);
2297 btif_hl_display_bt_bda(&bd_addr);
2298 BTIF_HL_CALL_CBACK(bt_hl_callbacks, channel_state_cb, app_id,
2299 &bd_addr, p_pcb->mdep_cfg_idx,
2300 p_pcb->channel_id, BTHL_CONN_STATE_CONNECTING, 0 );
2301
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002302 BTIF_TRACE_DEBUG("call channel state callback channel_id=0x%08x mdep_cfg_idx=%d state=%d fd=%d",p_pcb->channel_id,
The Android Open Source Project5738f832012-12-12 16:00:35 -08002303 p_pcb->mdep_cfg_idx, BTHL_CONN_STATE_DISCONNECTED, 0);
2304 btif_hl_display_bt_bda(&bd_addr);
2305 BTIF_HL_CALL_CBACK(bt_hl_callbacks, channel_state_cb, app_id,
2306 &bd_addr, p_pcb->mdep_cfg_idx,
2307 p_pcb->channel_id, BTHL_CONN_STATE_DISCONNECTED, 0 );
2308 }
2309 else if (p_pcb->cb_state == BTIF_HL_CHAN_CB_STATE_CONNECTED_PENDING)
2310 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002311 BTIF_TRACE_DEBUG("call channel state callback channel_id=0x%08x mdep_cfg_idx=%d state=%d fd=%d",p_pcb->channel_id,
The Android Open Source Project5738f832012-12-12 16:00:35 -08002312 p_pcb->mdep_cfg_idx, BTHL_CONN_STATE_DISCONNECTED, 0);
2313 btif_hl_display_bt_bda(&bd_addr);
2314 BTIF_HL_CALL_CBACK(bt_hl_callbacks, channel_state_cb, app_id,
2315 &bd_addr, p_pcb->mdep_cfg_idx,
2316 p_pcb->channel_id, BTHL_CONN_STATE_DISCONNECTED, 0 );
2317 }
2318 btif_hl_clean_pcb(p_pcb);
2319 }
2320}
2321/*******************************************************************************
2322**
2323** Function btif_hl_proc_sdp_query_cfm
2324**
2325** Description Process the SDP query confirmation
2326**
2327** Returns Nothing
2328**
2329*******************************************************************************/
2330static BOOLEAN btif_hl_proc_sdp_query_cfm(tBTA_HL *p_data){
2331 btif_hl_app_cb_t *p_acb;
2332 btif_hl_mcl_cb_t *p_mcb;
2333 tBTA_HL_SDP *p_sdp;
2334 tBTA_HL_CCH_OPEN_PARAM open_param;
2335 UINT8 app_idx, mcl_idx, sdp_idx = 0;
2336 UINT8 num_recs, i, num_mdeps, j;
2337 btif_hl_cch_op_t old_cch_oper;
2338 BOOLEAN status =FALSE;
2339 btif_hl_pending_chan_cb_t *p_pcb;
2340
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002341 BTIF_TRACE_DEBUG("%s", __FUNCTION__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002342
2343 p_sdp = p_data->sdp_query_cfm.p_sdp;
2344 num_recs = p_sdp->num_recs;
2345
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002346 BTIF_TRACE_DEBUG("num of SDP records=%d",num_recs);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002347 for (i=0; i<num_recs; i++)
2348 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002349 BTIF_TRACE_DEBUG("rec_idx=%d ctrl_psm=0x%x data_psm=0x%x",
The Android Open Source Project5738f832012-12-12 16:00:35 -08002350 (i+1),p_sdp->sdp_rec[i].ctrl_psm, p_sdp->sdp_rec[i].data_psm);
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002351 BTIF_TRACE_DEBUG("MCAP supported procedures=0x%x",p_sdp->sdp_rec[i].mcap_sup_proc);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002352 num_mdeps = p_sdp->sdp_rec[i].num_mdeps;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002353 BTIF_TRACE_DEBUG("num of mdeps =%d",num_mdeps);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002354 for (j=0; j< num_mdeps; j++)
2355 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002356 BTIF_TRACE_DEBUG("mdep_idx=%d mdep_id=0x%x data_type=0x%x mdep_role=0x%x",
The Android Open Source Project5738f832012-12-12 16:00:35 -08002357 (j+1),
2358 p_sdp->sdp_rec[i].mdep_cfg[j].mdep_id,
2359 p_sdp->sdp_rec[i].mdep_cfg[j].data_type,
2360 p_sdp->sdp_rec[i].mdep_cfg[j].mdep_role );
2361 }
2362 }
2363
Priti Agheraf8f30c22013-04-02 15:31:19 -07002364 if (btif_hl_find_app_idx_using_app_id(p_data->sdp_query_cfm.app_id, &app_idx))
The Android Open Source Project5738f832012-12-12 16:00:35 -08002365 {
Priti Agheraf8f30c22013-04-02 15:31:19 -07002366 p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
2367
2368 if (btif_hl_find_mcl_idx(app_idx, p_data->sdp_query_cfm.bd_addr, &mcl_idx))
The Android Open Source Project5738f832012-12-12 16:00:35 -08002369 {
Priti Agheraf8f30c22013-04-02 15:31:19 -07002370 p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
2371 if (p_mcb->cch_oper != BTIF_HL_CCH_OP_NONE)
The Android Open Source Project5738f832012-12-12 16:00:35 -08002372 {
Priti Agheraf8f30c22013-04-02 15:31:19 -07002373 memcpy(&p_mcb->sdp, p_sdp, sizeof(tBTA_HL_SDP));
2374 old_cch_oper = p_mcb->cch_oper;
2375 p_mcb->cch_oper = BTIF_HL_CCH_OP_NONE;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002376
2377 switch (old_cch_oper)
2378 {
2379 case BTIF_HL_CCH_OP_MDEP_FILTERING:
Priti Agheraf8f30c22013-04-02 15:31:19 -07002380 status = btif_hl_find_sdp_idx_using_mdep_filter(app_idx,
2381 mcl_idx, &sdp_idx);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002382 break;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002383 default:
The Android Open Source Project5738f832012-12-12 16:00:35 -08002384 break;
2385 }
2386
Priti Agheraf8f30c22013-04-02 15:31:19 -07002387 if (status)
2388 {
2389 p_mcb->sdp_idx = sdp_idx;
2390 p_mcb->valid_sdp_idx = TRUE;
2391 p_mcb->ctrl_psm = p_mcb->sdp.sdp_rec[sdp_idx].ctrl_psm;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002392
Priti Agheraf8f30c22013-04-02 15:31:19 -07002393 switch (old_cch_oper)
2394 {
2395 case BTIF_HL_CCH_OP_MDEP_FILTERING:
2396 p_pcb = BTIF_HL_GET_PCB_PTR(app_idx, mcl_idx);
2397 if (p_pcb->in_use)
2398 {
2399 if (!p_pcb->abort_pending)
2400 {
2401 switch (p_pcb->op)
2402 {
2403 case BTIF_HL_PEND_DCH_OP_OPEN:
2404 btif_hl_send_setup_connecting_cb(app_idx, mcl_idx);
2405 break;
2406 case BTIF_HL_PEND_DCH_OP_DELETE_MDL:
2407 default:
2408 break;
2409 }
2410 open_param.ctrl_psm = p_mcb->ctrl_psm;
2411 bdcpy(open_param.bd_addr, p_mcb->bd_addr);
2412 open_param.sec_mask =
2413 (BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT);
2414 BTA_HlCchOpen(p_acb->app_id,p_acb->app_handle, &open_param);
2415 }
2416 else
2417 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002418 BTIF_TRACE_DEBUG("channel abort pending");
Priti Agheraf8f30c22013-04-02 15:31:19 -07002419 }
2420 }
2421 break;
2422
2423 case BTIF_HL_CCH_OP_DCH_OPEN:
2424 status = btif_hl_proc_pending_op(app_idx,mcl_idx);
2425 break;
2426
2427 default:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002428 BTIF_TRACE_ERROR("Invalid CCH oper %d", old_cch_oper);
Priti Agheraf8f30c22013-04-02 15:31:19 -07002429 break;
2430 }
2431 }
2432 else
2433 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002434 BTIF_TRACE_ERROR("Can not find SDP idx discard CCH Open request");
Priti Agheraf8f30c22013-04-02 15:31:19 -07002435 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08002436 }
2437 }
2438 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08002439 return status;
2440}
2441
2442
2443/*******************************************************************************
2444**
2445** Function btif_hl_proc_cch_open_ind
2446**
2447** Description Process the CCH open indication
2448**
2449** Returns Nothing
2450**
2451*******************************************************************************/
2452static void btif_hl_proc_cch_open_ind(tBTA_HL *p_data)
2453
2454{
2455 btif_hl_mcl_cb_t *p_mcb;
2456 UINT8 app_idx, mcl_idx;
Priti Agheraf8f30c22013-04-02 15:31:19 -07002457 int i;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002458
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002459 BTIF_TRACE_DEBUG("%s", __FUNCTION__);
Priti Agheraf8f30c22013-04-02 15:31:19 -07002460 for(i=0; i<BTA_HL_NUM_APPS; i++)
The Android Open Source Project5738f832012-12-12 16:00:35 -08002461 {
Priti Agheraf8f30c22013-04-02 15:31:19 -07002462 if (btif_hl_cb.acb[i].in_use)
The Android Open Source Project5738f832012-12-12 16:00:35 -08002463 {
Priti Agheraf8f30c22013-04-02 15:31:19 -07002464 if (!btif_hl_find_mcl_idx(i, p_data->cch_open_ind.bd_addr, &mcl_idx))
The Android Open Source Project5738f832012-12-12 16:00:35 -08002465 {
Priti Agheraf8f30c22013-04-02 15:31:19 -07002466 if (btif_hl_find_avail_mcl_idx(i, &mcl_idx))
2467 {
2468 p_mcb = BTIF_HL_GET_MCL_CB_PTR(i, mcl_idx);
2469 memset(p_mcb, 0, sizeof(btif_hl_mcl_cb_t));
2470 p_mcb->in_use = TRUE;
2471 p_mcb->is_connected = TRUE;
2472 p_mcb->mcl_handle = p_data->cch_open_ind.mcl_handle;
2473 bdcpy(p_mcb->bd_addr, p_data->cch_open_ind.bd_addr);
2474 btif_hl_start_cch_timer(i, mcl_idx);
2475 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08002476 }
Priti Agheraf8f30c22013-04-02 15:31:19 -07002477 else
2478 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002479 BTIF_TRACE_ERROR("The MCL already exist for cch_open_ind");
Priti Agheraf8f30c22013-04-02 15:31:19 -07002480 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08002481 }
2482 }
2483}
2484
2485/*******************************************************************************
2486**
2487** Function btif_hl_proc_pending_op
2488**
2489** Description Process the pending dch operation.
2490**
2491** Returns Nothing
2492**
2493*******************************************************************************/
2494BOOLEAN btif_hl_proc_pending_op(UINT8 app_idx, UINT8 mcl_idx)
2495
2496{
2497
2498 btif_hl_app_cb_t *p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
2499 btif_hl_mcl_cb_t *p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
2500 btif_hl_pending_chan_cb_t *p_pcb;
2501 BOOLEAN status = FALSE;
2502 tBTA_HL_DCH_OPEN_PARAM dch_open;
2503 tBTA_HL_MDL_ID mdl_id;
2504 tBTA_HL_DCH_RECONNECT_PARAM reconnect_param;
2505
2506 p_pcb = BTIF_HL_GET_PCB_PTR(app_idx, mcl_idx);
2507 if (p_pcb->in_use)
2508 {
2509 switch (p_pcb->op)
2510 {
2511 case BTIF_HL_PEND_DCH_OP_OPEN:
2512 if (!p_pcb->abort_pending)
2513 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002514 BTIF_TRACE_DEBUG("op BTIF_HL_PEND_DCH_OP_OPEN");
The Android Open Source Project5738f832012-12-12 16:00:35 -08002515 dch_open.ctrl_psm = p_mcb->ctrl_psm;
2516 dch_open.local_mdep_id = p_acb->sup_feature.mdep[p_pcb->mdep_cfg_idx].mdep_id;
2517 if (btif_hl_find_peer_mdep_id(p_acb->app_id, p_mcb->bd_addr,
2518 p_acb->sup_feature.mdep[p_pcb->mdep_cfg_idx].mdep_cfg.mdep_role,
2519 p_acb->sup_feature.mdep[p_pcb->mdep_cfg_idx].mdep_cfg.data_cfg[0].data_type, &dch_open.peer_mdep_id ))
2520 {
2521 dch_open.local_cfg = p_acb->channel_type[p_pcb->mdep_cfg_idx];
2522 if ((p_acb->sup_feature.mdep[p_pcb->mdep_cfg_idx].mdep_cfg.mdep_role == BTA_HL_MDEP_ROLE_SOURCE)
2523 && !btif_hl_is_the_first_reliable_existed(app_idx, mcl_idx))
2524 {
2525 dch_open.local_cfg = BTA_HL_DCH_CFG_RELIABLE;
2526 }
2527 dch_open.sec_mask = (BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT);
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002528 BTIF_TRACE_DEBUG("dch_open.local_cfg=%d ", dch_open.local_cfg);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002529 btif_hl_send_setup_connecting_cb(app_idx,mcl_idx);
2530
2531 if (!btif_hl_is_reconnect_possible(app_idx, mcl_idx, p_pcb->mdep_cfg_idx, &dch_open, &mdl_id ))
2532 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002533 BTIF_TRACE_DEBUG("Issue DCH open, mcl_handle=%d",p_mcb->mcl_handle);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002534 BTA_HlDchOpen(p_mcb->mcl_handle, &dch_open);
2535 }
2536 else
2537 {
2538 reconnect_param.ctrl_psm = p_mcb->ctrl_psm;
2539 reconnect_param.mdl_id = mdl_id;;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002540 BTIF_TRACE_DEBUG("Issue Reconnect ctrl_psm=0x%x mdl_id=0x%x",reconnect_param.ctrl_psm, reconnect_param.mdl_id);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002541 BTA_HlDchReconnect(p_mcb->mcl_handle, &reconnect_param);
2542 }
2543 status = TRUE;
2544 }
2545 }
2546 else
2547 {
2548 btif_hl_send_setup_disconnected_cb(app_idx, mcl_idx);
2549 status = TRUE;
2550 }
2551 break;
2552 case BTIF_HL_PEND_DCH_OP_DELETE_MDL:
2553 BTA_HlDeleteMdl(p_mcb->mcl_handle, p_acb->delete_mdl.mdl_id);
2554 status = TRUE;
2555 break;
2556
2557 default:
2558 break;
2559 }
2560 }
2561 return status;
2562}
2563
2564/*******************************************************************************
2565**
2566** Function btif_hl_proc_cch_open_cfm
2567**
2568** Description Process the CCH open confirmation
2569**
2570** Returns Nothing
2571**
2572*******************************************************************************/
2573static BOOLEAN btif_hl_proc_cch_open_cfm(tBTA_HL *p_data)
2574
2575{
2576 btif_hl_app_cb_t *p_acb;
2577 btif_hl_mcl_cb_t *p_mcb;
2578 UINT8 app_idx, mcl_idx;
2579 BOOLEAN status = FALSE;
2580 tBTA_HL_DCH_OPEN_PARAM dch_open;
2581
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002582 BTIF_TRACE_DEBUG("%s", __FUNCTION__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002583
Priti Agheraf8f30c22013-04-02 15:31:19 -07002584 if (btif_hl_find_app_idx_using_app_id(p_data->cch_open_cfm.app_id, &app_idx))
The Android Open Source Project5738f832012-12-12 16:00:35 -08002585 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002586 BTIF_TRACE_DEBUG("app_idx=%d", app_idx);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002587 if (btif_hl_find_mcl_idx(app_idx, p_data->cch_open_cfm.bd_addr, &mcl_idx))
2588 {
2589 p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
2590
2591 p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002592 BTIF_TRACE_DEBUG("mcl_idx=%d, mcl_handle=%d", mcl_idx,p_data->cch_open_cfm.mcl_handle);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002593 p_mcb->mcl_handle = p_data->cch_open_cfm.mcl_handle;
2594 p_mcb->is_connected = TRUE;
2595 status = btif_hl_proc_pending_op(app_idx, mcl_idx);
2596 if (status)
2597 btif_hl_start_cch_timer(app_idx, mcl_idx);
2598 }
2599 }
2600
2601 return status;
2602}
2603
Priti Agheraf8f30c22013-04-02 15:31:19 -07002604/*******************************************************************************
2605**
2606** Function btif_hl_clean_mcb_using_handle
2607**
2608** Description clean control channel cb using handle
2609**
2610** Returns void
2611**
2612*******************************************************************************/
2613static void btif_hl_clean_mcb_using_handle( tBTA_HL_MCL_HANDLE mcl_handle){
2614 btif_hl_app_cb_t *p_acb;
2615 UINT8 i,j;
2616
2617 for (i=0; i<BTA_HL_NUM_APPS; i++)
2618 {
2619 p_acb =BTIF_HL_GET_APP_CB_PTR(i);
2620 for (j=0; j < BTA_HL_NUM_MCLS ; j++)
2621 {
2622 if (p_acb->mcb[j].in_use)
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002623 BTIF_TRACE_DEBUG("btif_hl_find_mcl_idx_using_handle: app_idx=%d,"
Priti Agheraf8f30c22013-04-02 15:31:19 -07002624 "mcl_idx =%d mcl_handle=%d",i,j,p_acb->mcb[j].mcl_handle);
2625 if (p_acb->mcb[j].in_use &&
2626 (p_acb->mcb[j].mcl_handle == mcl_handle))
2627 {
2628 btif_hl_stop_cch_timer(i, j);
2629 btif_hl_release_mcl_sockets(i, j);
2630 btif_hl_send_setup_disconnected_cb(i, j);
2631 btif_hl_clean_mcl_cb(i, j);
2632 }
2633 }
2634 }
2635}
The Android Open Source Project5738f832012-12-12 16:00:35 -08002636
2637/*******************************************************************************
2638**
2639** Function btif_hl_proc_cch_close_ind
2640**
2641** Description Process the CCH close indication
2642**
2643** Returns Nothing
2644**
2645*******************************************************************************/
2646static void btif_hl_proc_cch_close_ind(tBTA_HL *p_data)
2647
2648{
2649 UINT8 app_idx, mcl_idx;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002650 BTIF_TRACE_DEBUG("%s", __FUNCTION__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002651
Priti Agheraf8f30c22013-04-02 15:31:19 -07002652 btif_hl_clean_mcb_using_handle(p_data->cch_close_ind.mcl_handle);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002653}
2654
2655
2656/*******************************************************************************
2657**
2658** Function btif_hl_proc_cch_close_cfm
2659**
2660** Description Process the CCH close confirmation
2661**
2662** Returns Nothing
2663**
2664*******************************************************************************/
2665static void btif_hl_proc_cch_close_cfm(tBTA_HL *p_data)
2666{
2667 UINT8 app_idx, mcl_idx;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002668 BTIF_TRACE_DEBUG("%s", __FUNCTION__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002669
Priti Agheraf8f30c22013-04-02 15:31:19 -07002670 btif_hl_clean_mcb_using_handle(p_data->cch_close_ind.mcl_handle);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002671}
2672
2673/*******************************************************************************
2674**
2675** Function btif_hl_proc_create_ind
2676**
2677** Description Process the MDL create indication
2678**
2679** Returns Nothing
2680**
2681*******************************************************************************/
2682static void btif_hl_proc_create_ind(tBTA_HL *p_data){
2683 btif_hl_app_cb_t *p_acb;
2684 btif_hl_mcl_cb_t *p_mcb;
2685 tBTA_HL_MDEP *p_mdep;
Priti Agheraf8f30c22013-04-02 15:31:19 -07002686 UINT8 app_idx, orig_app_idx, mcl_idx, mdep_cfg_idx;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002687 BOOLEAN first_reliable_exist;
2688 BOOLEAN success = TRUE;
2689 tBTA_HL_DCH_CFG rsp_cfg = BTA_HL_DCH_CFG_UNKNOWN;
2690 tBTA_HL_DCH_CREATE_RSP rsp_code = BTA_HL_DCH_CREATE_RSP_CFG_REJ;
2691 tBTA_HL_DCH_CREATE_RSP_PARAM create_rsp_param;
2692
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002693 BTIF_TRACE_DEBUG("%s", __FUNCTION__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002694
Priti Agheraf8f30c22013-04-02 15:31:19 -07002695// Find the correct app_idx based on the mdep_id;
2696 btif_hl_find_app_idx_using_mdepId(p_data->dch_create_ind.local_mdep_id,&orig_app_idx);
2697 if (btif_hl_find_mcl_idx(orig_app_idx, p_data->dch_create_ind.bd_addr, &mcl_idx))
The Android Open Source Project5738f832012-12-12 16:00:35 -08002698 {
Priti Agheraf8f30c22013-04-02 15:31:19 -07002699 p_acb =BTIF_HL_GET_APP_CB_PTR(orig_app_idx);
2700 p_mcb =BTIF_HL_GET_MCL_CB_PTR(orig_app_idx, mcl_idx);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002701
Priti Agheraf8f30c22013-04-02 15:31:19 -07002702 if (btif_hl_find_mdep_cfg_idx(orig_app_idx, p_data->dch_create_ind.local_mdep_id, &mdep_cfg_idx))
The Android Open Source Project5738f832012-12-12 16:00:35 -08002703 {
2704 p_mdep = &(p_acb->sup_feature.mdep[mdep_cfg_idx]);
Priti Agheraf8f30c22013-04-02 15:31:19 -07002705 first_reliable_exist = btif_hl_is_the_first_reliable_existed(orig_app_idx, mcl_idx);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002706 switch (p_mdep->mdep_cfg.mdep_role)
2707 {
2708 case BTA_HL_MDEP_ROLE_SOURCE:
2709 if (p_data->dch_create_ind.cfg == BTA_HL_DCH_CFG_NO_PREF)
2710 {
2711 if (first_reliable_exist)
2712 {
2713 rsp_cfg = p_acb->channel_type[mdep_cfg_idx];
2714 }
2715 else
2716 {
2717 rsp_cfg = BTA_HL_DCH_CFG_RELIABLE;
2718 }
2719 rsp_code = BTA_HL_DCH_CREATE_RSP_SUCCESS;
2720 }
2721
2722 break;
2723 case BTA_HL_MDEP_ROLE_SINK:
2724
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002725 BTIF_TRACE_DEBUG("btif_hl_proc_create_ind:BTA_HL_MDEP_ROLE_SINK");
The Android Open Source Project5738f832012-12-12 16:00:35 -08002726 if ((p_data->dch_create_ind.cfg == BTA_HL_DCH_CFG_RELIABLE) ||
2727 (first_reliable_exist && (p_data->dch_create_ind.cfg == BTA_HL_DCH_CFG_STREAMING)))
2728 {
2729 rsp_code = BTA_HL_DCH_CREATE_RSP_SUCCESS;
2730 rsp_cfg = p_data->dch_create_ind.cfg;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002731 BTIF_TRACE_DEBUG("btif_hl_proc_create_ind:BTA_HL_MDEP_ROLE_SINK cfg = %d",rsp_cfg);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002732 }
2733 break;
2734 default:
2735 break;
2736 }
2737 }
2738 }
2739 else
2740 {
2741 success = FALSE;
2742 }
2743
2744 if (success)
2745 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002746 BTIF_TRACE_DEBUG("create response rsp_code=%d rsp_cfg=%d", rsp_code, rsp_cfg );
The Android Open Source Project5738f832012-12-12 16:00:35 -08002747 create_rsp_param.local_mdep_id = p_data->dch_create_ind.local_mdep_id;
2748 create_rsp_param.mdl_id = p_data->dch_create_ind.mdl_id;
2749 create_rsp_param.rsp_code = rsp_code;
2750 create_rsp_param.cfg_rsp = rsp_cfg;
2751 BTA_HlDchCreateRsp(p_mcb->mcl_handle, &create_rsp_param);
2752 }
2753}
2754
2755/*******************************************************************************
2756**
2757** Function btif_hl_proc_dch_open_ind
2758**
2759** Description Process the DCH open indication
2760**
2761** Returns Nothing
2762**
2763*******************************************************************************/
2764static void btif_hl_proc_dch_open_ind(tBTA_HL *p_data)
2765
2766{
2767 btif_hl_app_cb_t *p_acb;
2768 btif_hl_mcl_cb_t *p_mcb;
2769 btif_hl_mdl_cb_t *p_dcb;
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08002770 UINT8 orig_app_idx, mcl_idx, mdl_idx, mdep_cfg_idx;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002771 UINT8 dc_cfg;
2772 BOOLEAN close_dch = FALSE;
2773
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002774 BTIF_TRACE_DEBUG("%s", __FUNCTION__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002775
Priti Agheraf8f30c22013-04-02 15:31:19 -07002776 // Find the correct app_idx based on the mdep_id;
2777 btif_hl_find_app_idx_using_mdepId(p_data->dch_open_ind.local_mdep_id,&orig_app_idx);
2778
2779 if (btif_hl_find_mcl_idx_using_app_idx(p_data->dch_open_ind.mcl_handle, orig_app_idx, &mcl_idx ))
The Android Open Source Project5738f832012-12-12 16:00:35 -08002780 {
Priti Agheraf8f30c22013-04-02 15:31:19 -07002781 p_acb =BTIF_HL_GET_APP_CB_PTR(orig_app_idx);
2782 p_mcb =BTIF_HL_GET_MCL_CB_PTR(orig_app_idx, mcl_idx);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002783
Priti Agheraf8f30c22013-04-02 15:31:19 -07002784 if (btif_hl_find_avail_mdl_idx(orig_app_idx, mcl_idx, &mdl_idx))
The Android Open Source Project5738f832012-12-12 16:00:35 -08002785 {
Priti Agheraf8f30c22013-04-02 15:31:19 -07002786 p_dcb = BTIF_HL_GET_MDL_CB_PTR(orig_app_idx, mcl_idx, mdl_idx);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002787
Priti Agheraf8f30c22013-04-02 15:31:19 -07002788 if (btif_hl_find_mdep_cfg_idx(orig_app_idx, p_data->dch_open_ind.local_mdep_id, &mdep_cfg_idx))
The Android Open Source Project5738f832012-12-12 16:00:35 -08002789 {
2790 p_dcb->in_use = TRUE;
2791 p_dcb->mdl_handle = p_data->dch_open_ind.mdl_handle;
2792 p_dcb->local_mdep_cfg_idx = mdep_cfg_idx;
2793 p_dcb->local_mdep_id = p_data->dch_open_ind.local_mdep_id;
2794 p_dcb->mdl_id = p_data->dch_open_ind.mdl_id;
2795 p_dcb->dch_mode = p_data->dch_open_ind.dch_mode;
2796 p_dcb->dch_mode = p_data->dch_open_ind.dch_mode;
2797 p_dcb->is_the_first_reliable = p_data->dch_open_ind.first_reliable;
2798 p_dcb->mtu = p_data->dch_open_ind.mtu;
2799
Priti Agheraf8f30c22013-04-02 15:31:19 -07002800 if(btif_hl_find_channel_id_using_mdl_id(orig_app_idx,p_dcb->mdl_id , &p_dcb->channel_id))
The Android Open Source Project5738f832012-12-12 16:00:35 -08002801 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002802 BTIF_TRACE_DEBUG(" app_idx=%d mcl_idx=%d mdl_idx=%d channel_id=%d",
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08002803 orig_app_idx, mcl_idx, mdl_idx, p_dcb->channel_id );
Priti Agheraf8f30c22013-04-02 15:31:19 -07002804 if (!btif_hl_create_socket(orig_app_idx, mcl_idx, mdl_idx))
The Android Open Source Project5738f832012-12-12 16:00:35 -08002805 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002806 BTIF_TRACE_ERROR("Unable to create socket");
The Android Open Source Project5738f832012-12-12 16:00:35 -08002807 close_dch = TRUE;
2808 }
2809 }
2810 else
2811 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002812 BTIF_TRACE_ERROR("Unable find channel id for mdl_id=0x%x", p_dcb->mdl_id );
The Android Open Source Project5738f832012-12-12 16:00:35 -08002813 close_dch = TRUE;
2814 }
2815 }
2816 else
2817 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002818 BTIF_TRACE_ERROR("INVALID_LOCAL_MDEP_ID mdep_id=%d",p_data->dch_open_cfm.local_mdep_id);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002819 close_dch = TRUE;
2820 }
2821
2822 if (close_dch)
2823 btif_hl_clean_mdl_cb(p_dcb);
2824 }
2825 else
2826 close_dch = TRUE;
2827 }
2828 else
2829 close_dch = TRUE;
2830
2831 if (close_dch)
2832 BTA_HlDchClose(p_data->dch_open_cfm.mdl_handle);
2833}
2834
2835/*******************************************************************************
2836**
2837** Function btif_hl_proc_dch_open_cfm
2838**
2839** Description Process the DCH close confirmation
2840**
2841** Returns Nothing
2842**
2843*******************************************************************************/
2844static BOOLEAN btif_hl_proc_dch_open_cfm(tBTA_HL *p_data)
2845
2846{
2847 btif_hl_app_cb_t *p_acb;
2848 btif_hl_mcl_cb_t *p_mcb;
2849 btif_hl_mdl_cb_t *p_dcb;
2850 btif_hl_pending_chan_cb_t *p_pcb;
2851 UINT8 app_idx, mcl_idx, mdl_idx, mdep_cfg_idx;
2852 BOOLEAN status = FALSE;
2853 BOOLEAN close_dch = FALSE;
2854
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002855 BTIF_TRACE_DEBUG("%s", __FUNCTION__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002856
Priti Agheraf8f30c22013-04-02 15:31:19 -07002857 // Find the correct app_idx based on the mdep_id;
2858 btif_hl_find_app_idx_using_mdepId(p_data->dch_open_cfm.local_mdep_id,&app_idx);
2859
2860 if (btif_hl_find_mcl_idx_using_app_idx(p_data->dch_open_cfm.mcl_handle, app_idx, &mcl_idx ))
The Android Open Source Project5738f832012-12-12 16:00:35 -08002861 {
2862 p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
2863 p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
2864 p_pcb = BTIF_HL_GET_PCB_PTR(app_idx, mcl_idx);
2865
2866 if (btif_hl_find_avail_mdl_idx(app_idx, mcl_idx, &mdl_idx))
2867 {
2868 p_dcb = BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
2869
2870 if (btif_hl_find_mdep_cfg_idx(app_idx, p_data->dch_open_cfm.local_mdep_id, &mdep_cfg_idx))
2871 {
2872 p_dcb->in_use = TRUE;
2873 p_dcb->mdl_handle = p_data->dch_open_cfm.mdl_handle;
2874 p_dcb->local_mdep_cfg_idx = mdep_cfg_idx;
2875 p_dcb->local_mdep_id = p_data->dch_open_cfm.local_mdep_id;
2876 p_dcb->mdl_id = p_data->dch_open_cfm.mdl_id;
2877 p_dcb->dch_mode = p_data->dch_open_cfm.dch_mode;
2878 p_dcb->is_the_first_reliable= p_data->dch_open_cfm.first_reliable;
2879 p_dcb->mtu = p_data->dch_open_cfm.mtu;
2880 p_dcb->channel_id = p_pcb->channel_id;
2881
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002882 BTIF_TRACE_DEBUG("app_idx=%d mcl_idx=%d mdl_idx=%d", app_idx, mcl_idx, mdl_idx );
The Android Open Source Project5738f832012-12-12 16:00:35 -08002883 btif_hl_send_setup_connecting_cb(app_idx, mcl_idx);
2884 if (btif_hl_create_socket(app_idx, mcl_idx, mdl_idx))
2885 {
2886 status = TRUE;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002887 BTIF_TRACE_DEBUG("app_idx=%d mcl_idx=%d mdl_idx=%d p_dcb->channel_id=0x%08x",
The Android Open Source Project5738f832012-12-12 16:00:35 -08002888 app_idx, mcl_idx, mdl_idx, p_dcb->channel_id);
2889 btif_hl_clean_pcb(p_pcb);
2890 }
2891 else
2892 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002893 BTIF_TRACE_ERROR("Unable to create socket");
The Android Open Source Project5738f832012-12-12 16:00:35 -08002894 close_dch = TRUE;
2895 }
2896 }
2897 else
2898 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002899 BTIF_TRACE_ERROR("INVALID_LOCAL_MDEP_ID mdep_id=%d",p_data->dch_open_cfm.local_mdep_id);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002900 close_dch = TRUE;
2901 }
2902
2903 if (close_dch)
2904 {
2905 btif_hl_clean_mdl_cb(p_dcb);
2906 BTA_HlDchClose(p_data->dch_open_cfm.mdl_handle);
2907 }
2908 }
2909 }
2910
2911 return status;
2912}
2913/*******************************************************************************
2914**
2915** Function btif_hl_proc_dch_reconnect_cfm
2916**
2917** Description Process the DCH reconnect indication
2918**
2919** Returns Nothing
2920**
2921*******************************************************************************/
2922static BOOLEAN btif_hl_proc_dch_reconnect_cfm(tBTA_HL *p_data)
2923{
2924 btif_hl_app_cb_t *p_acb;
2925 btif_hl_mcl_cb_t *p_mcb;
2926 btif_hl_mdl_cb_t *p_dcb;
2927 btif_hl_pending_chan_cb_t *p_pcb;
2928 UINT8 app_idx, mcl_idx, mdl_idx, mdep_cfg_idx;
2929 BOOLEAN status = FALSE;
2930 BOOLEAN close_dch = FALSE;
2931
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002932 BTIF_TRACE_DEBUG("%s", __FUNCTION__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002933
Priti Agheraf8f30c22013-04-02 15:31:19 -07002934 btif_hl_find_app_idx_using_mdepId(p_data->dch_reconnect_cfm.local_mdep_id,&app_idx);
2935
2936 if (btif_hl_find_mcl_idx_using_app_idx(p_data->dch_reconnect_cfm.mcl_handle, app_idx, &mcl_idx ))
The Android Open Source Project5738f832012-12-12 16:00:35 -08002937 {
2938 p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
2939 p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
2940 p_pcb = BTIF_HL_GET_PCB_PTR(app_idx, mcl_idx);
2941
2942 if (btif_hl_find_avail_mdl_idx(app_idx, mcl_idx, &mdl_idx))
2943 {
2944 p_dcb = BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
2945
2946 if (btif_hl_find_mdep_cfg_idx(app_idx, p_data->dch_reconnect_cfm.local_mdep_id, &mdep_cfg_idx))
2947 {
2948 p_dcb->in_use = TRUE;
2949 p_dcb->mdl_handle = p_data->dch_reconnect_cfm.mdl_handle;
2950 p_dcb->local_mdep_cfg_idx = mdep_cfg_idx;
2951 p_dcb->local_mdep_id = p_data->dch_reconnect_cfm.local_mdep_id;
2952 p_dcb->mdl_id = p_data->dch_reconnect_cfm.mdl_id;
2953 p_dcb->dch_mode = p_data->dch_reconnect_cfm.dch_mode;
2954 p_dcb->is_the_first_reliable= p_data->dch_reconnect_cfm.first_reliable;
2955 p_dcb->mtu = p_data->dch_reconnect_cfm.mtu;
2956 p_dcb->channel_id = p_pcb->channel_id;
2957
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002958 BTIF_TRACE_DEBUG("app_idx=%d mcl_idx=%d mdl_idx=%d", app_idx, mcl_idx, mdl_idx );
The Android Open Source Project5738f832012-12-12 16:00:35 -08002959 btif_hl_send_setup_connecting_cb(app_idx, mcl_idx);
2960 if (btif_hl_create_socket(app_idx, mcl_idx, mdl_idx))
2961 {
2962 status = TRUE;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002963 BTIF_TRACE_DEBUG("app_idx=%d mcl_idx=%d mdl_idx=%d p_dcb->channel_id=0x%08x",
The Android Open Source Project5738f832012-12-12 16:00:35 -08002964 app_idx, mcl_idx, mdl_idx, p_dcb->channel_id);
2965 btif_hl_clean_pcb(p_pcb);
2966 }
2967 else
2968 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002969 BTIF_TRACE_ERROR("Unable to create socket");
The Android Open Source Project5738f832012-12-12 16:00:35 -08002970 close_dch = TRUE;
2971 }
2972 }
2973 else
2974 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002975 BTIF_TRACE_ERROR("INVALID_LOCAL_MDEP_ID mdep_id=%d",p_data->dch_open_cfm.local_mdep_id);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002976 close_dch = TRUE;
2977 }
2978
2979 if (close_dch)
2980 {
2981 btif_hl_clean_mdl_cb(p_dcb);
2982 BTA_HlDchClose(p_data->dch_reconnect_cfm.mdl_handle);
2983 }
2984 }
2985 }
2986
2987 return status;
2988
2989}
2990/*******************************************************************************
2991**
2992** Function btif_hl_proc_dch_reconnect_ind
2993**
2994** Description Process the DCH reconnect indication
2995**
2996** Returns Nothing
2997**
2998*******************************************************************************/
2999static void btif_hl_proc_dch_reconnect_ind(tBTA_HL *p_data)
3000
3001{
3002 btif_hl_app_cb_t *p_acb;
3003 btif_hl_mcl_cb_t *p_mcb;
3004 btif_hl_mdl_cb_t *p_dcb;
3005 UINT8 app_idx, mcl_idx, mdl_idx, mdep_cfg_idx, dc_cfg;
3006 BOOLEAN close_dch = FALSE;
3007
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003008 BTIF_TRACE_DEBUG("%s", __FUNCTION__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003009
Priti Agheraf8f30c22013-04-02 15:31:19 -07003010 // Find the correct app_idx based on the mdep_id;
3011 btif_hl_find_app_idx_using_mdepId(p_data->dch_reconnect_ind.local_mdep_id,&app_idx);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003012
Priti Agheraf8f30c22013-04-02 15:31:19 -07003013 if (btif_hl_find_mcl_idx_using_app_idx(p_data->dch_reconnect_ind.mcl_handle, app_idx, &mcl_idx ))
The Android Open Source Project5738f832012-12-12 16:00:35 -08003014 {
3015 p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003016 BTIF_TRACE_DEBUG("btif_hl_proc_dch_reconnect_ind: app_idx = %d, mcl_idx = %d",
Priti Agheraf8f30c22013-04-02 15:31:19 -07003017 app_idx, mcl_idx);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003018 p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
3019
3020 if (btif_hl_find_avail_mdl_idx(app_idx, mcl_idx, &mdl_idx))
3021 {
3022 p_dcb =BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
3023
3024 if (btif_hl_find_mdep_cfg_idx(app_idx, p_data->dch_reconnect_ind.local_mdep_id, &mdep_cfg_idx))
3025 {
3026 p_dcb->in_use = TRUE;
3027 p_dcb->mdl_handle = p_data->dch_reconnect_ind.mdl_handle;
3028 p_dcb->local_mdep_cfg_idx = mdep_cfg_idx;
3029 p_dcb->local_mdep_id = p_data->dch_reconnect_ind.local_mdep_id;
3030 p_dcb->mdl_id = p_data->dch_reconnect_ind.mdl_id;
3031 p_dcb->dch_mode = p_data->dch_reconnect_ind.dch_mode;
3032 p_dcb->dch_mode = p_data->dch_reconnect_ind.dch_mode;
3033 p_dcb->is_the_first_reliable= p_data->dch_reconnect_ind.first_reliable;
3034 p_dcb->mtu = p_data->dch_reconnect_ind.mtu;
3035 p_dcb->channel_id = btif_hl_get_next_channel_id(p_acb->app_id);
3036
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003037 BTIF_TRACE_DEBUG(" app_idx=%d mcl_idx=%d mdl_idx=%d channel_id=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08003038 app_idx, mcl_idx, mdl_idx, p_dcb->channel_id );
3039 if (!btif_hl_create_socket(app_idx, mcl_idx, mdl_idx))
3040 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003041 BTIF_TRACE_ERROR("Unable to create socket");
The Android Open Source Project5738f832012-12-12 16:00:35 -08003042 close_dch = TRUE;
3043 }
3044 }
3045 else
3046 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003047 BTIF_TRACE_ERROR("INVALID_LOCAL_MDEP_ID mdep_id=%d",p_data->dch_open_cfm.local_mdep_id);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003048 close_dch = TRUE;
3049 }
3050
3051 if (close_dch)
3052 btif_hl_clean_mdl_cb(p_dcb);
3053 }
3054 else
3055 close_dch = TRUE;
3056 }
3057 else
3058 close_dch = TRUE;
3059
3060 if (close_dch)
3061 BTA_HlDchClose(p_data->dch_reconnect_ind.mdl_handle);
3062
3063}
3064
3065/*******************************************************************************
3066**
3067** Function btif_hl_proc_dch_close_ind
3068**
3069** Description Process the DCH close indication
3070**
3071** Returns Nothing
3072**
3073*******************************************************************************/
3074static void btif_hl_proc_dch_close_ind(tBTA_HL *p_data)
3075
3076{
3077 btif_hl_mdl_cb_t *p_dcb;
Priti Agheraf8f30c22013-04-02 15:31:19 -07003078 btif_hl_mcl_cb_t *p_mcb;
The Android Open Source Project5738f832012-12-12 16:00:35 -08003079 UINT8 app_idx, mcl_idx, mdl_idx;
3080
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003081 BTIF_TRACE_DEBUG("%s", __FUNCTION__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003082 if (btif_hl_find_mdl_idx_using_handle(p_data->dch_close_ind.mdl_handle,
3083 &app_idx, &mcl_idx, &mdl_idx ))
3084 {
3085 p_dcb = BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
3086 btif_hl_release_socket(app_idx,mcl_idx, mdl_idx);
Priti Agheraf8f30c22013-04-02 15:31:19 -07003087 btif_hl_send_setup_disconnected_cb(app_idx, mcl_idx);
3088 p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx,mcl_idx);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003089 btif_hl_clean_mdl_cb(p_dcb);
Priti Agheraf8f30c22013-04-02 15:31:19 -07003090 if (!btif_hl_num_dchs_in_use(p_mcb->mcl_handle))
The Android Open Source Project5738f832012-12-12 16:00:35 -08003091 btif_hl_start_cch_timer(app_idx, mcl_idx);
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003092 BTIF_TRACE_DEBUG("remote DCH close success mdl_idx=%d", mdl_idx);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003093 }
3094}
3095
3096/*******************************************************************************
3097**
3098** Function btif_hl_proc_dch_close_cfm
3099**
3100** Description Process the DCH reconnect confirmation
3101**
3102** Returns Nothing
3103**
3104*******************************************************************************/
3105static void btif_hl_proc_dch_close_cfm(tBTA_HL *p_data)
3106
3107{
3108 btif_hl_mdl_cb_t *p_dcb;
Priti Agheraf8f30c22013-04-02 15:31:19 -07003109 btif_hl_mcl_cb_t *p_mcb;
The Android Open Source Project5738f832012-12-12 16:00:35 -08003110 UINT8 app_idx, mcl_idx, mdl_idx;
3111
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003112 BTIF_TRACE_DEBUG("%s", __FUNCTION__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003113 if (btif_hl_find_mdl_idx_using_handle(p_data->dch_close_cfm.mdl_handle,
3114 &app_idx, &mcl_idx, &mdl_idx ))
3115 {
3116 p_dcb = BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
3117 btif_hl_release_socket(app_idx,mcl_idx,mdl_idx);
3118 btif_hl_clean_mdl_cb(p_dcb);
Priti Agheraf8f30c22013-04-02 15:31:19 -07003119 p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx,mcl_idx);
3120 if (!btif_hl_num_dchs_in_use(p_mcb->mcl_handle))
The Android Open Source Project5738f832012-12-12 16:00:35 -08003121 btif_hl_start_cch_timer(app_idx, mcl_idx);
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003122 BTIF_TRACE_DEBUG(" local DCH close success mdl_idx=%d", mdl_idx);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003123 }
3124}
3125
3126
3127/*******************************************************************************
3128**
3129** Function btif_hl_proc_abort_ind
3130**
3131** Description Process the abort indicaiton
3132**
3133** Returns Nothing
3134**
3135*******************************************************************************/
3136static void btif_hl_proc_abort_ind(tBTA_HL_MCL_HANDLE mcl_handle){
3137
3138 UINT8 app_idx,mcl_idx;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003139 BTIF_TRACE_DEBUG("%s", __FUNCTION__ );
Priti Agheraf8f30c22013-04-02 15:31:19 -07003140 btif_hl_app_cb_t *p_acb;
3141 UINT8 i,j;
3142
3143 for (i=0; i<BTA_HL_NUM_APPS; i++)
The Android Open Source Project5738f832012-12-12 16:00:35 -08003144 {
Priti Agheraf8f30c22013-04-02 15:31:19 -07003145 p_acb =BTIF_HL_GET_APP_CB_PTR(i);
3146 for (j=0; j < BTA_HL_NUM_MCLS ; j++)
3147 {
3148 if (p_acb->mcb[j].in_use)
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003149 BTIF_TRACE_DEBUG("btif_hl_find_mcl_idx_using_handle: app_idx=%d,mcl_idx =%d mcl_handle=%d",i,j,p_acb->mcb[j].mcl_handle);
Priti Agheraf8f30c22013-04-02 15:31:19 -07003150 if (p_acb->mcb[j].in_use &&
3151 (p_acb->mcb[j].mcl_handle == mcl_handle))
3152 {
3153 btif_hl_stop_cch_timer(i, j);
3154 btif_hl_send_setup_disconnected_cb(i, j);
3155 btif_hl_clean_mcl_cb(i, j);
3156 }
3157 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08003158 }
3159}
3160
3161/*******************************************************************************
3162**
3163** Function btif_hl_proc_abort_cfm
3164**
3165** Description Process the abort confirmation
3166**
3167** Returns Nothing
3168**
3169*******************************************************************************/
3170static void btif_hl_proc_abort_cfm(tBTA_HL_MCL_HANDLE mcl_handle){
3171 UINT8 app_idx,mcl_idx;
3172
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003173 BTIF_TRACE_DEBUG("%s", __FUNCTION__ );
Priti Agheraf8f30c22013-04-02 15:31:19 -07003174 btif_hl_app_cb_t *p_acb;
3175 UINT8 i,j;
3176
3177 for (i=0; i<BTA_HL_NUM_APPS; i++)
The Android Open Source Project5738f832012-12-12 16:00:35 -08003178 {
Priti Agheraf8f30c22013-04-02 15:31:19 -07003179 p_acb =BTIF_HL_GET_APP_CB_PTR(i);
3180 for (j=0; j < BTA_HL_NUM_MCLS ; j++)
3181 {
3182 if (p_acb->mcb[j].in_use)
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003183 BTIF_TRACE_DEBUG("btif_hl_find_mcl_idx_using_handle: app_idx=%d,mcl_idx =%d mcl_handle=%d",i,j,p_acb->mcb[j].mcl_handle);
Priti Agheraf8f30c22013-04-02 15:31:19 -07003184 if (p_acb->mcb[j].in_use &&
3185 (p_acb->mcb[j].mcl_handle == mcl_handle))
3186 {
3187 btif_hl_stop_cch_timer(i, j);
3188 btif_hl_send_setup_disconnected_cb(i, j);
3189 btif_hl_clean_mcl_cb(i, j);
3190 }
3191 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08003192 }
Priti Agheraf8f30c22013-04-02 15:31:19 -07003193
The Android Open Source Project5738f832012-12-12 16:00:35 -08003194}
3195
3196/*******************************************************************************
3197**
3198** Function btif_hl_proc_send_data_cfm
3199**
3200** Description Process the send data confirmation
3201**
3202** Returns Nothing
3203**
3204*******************************************************************************/
3205static void btif_hl_proc_send_data_cfm(tBTA_HL_MDL_HANDLE mdl_handle,
3206 tBTA_HL_STATUS status){
3207 UINT8 app_idx,mcl_idx, mdl_idx;
3208 btif_hl_mdl_cb_t *p_dcb;
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08003209 UNUSED(status);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003210
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003211 BTIF_TRACE_DEBUG("%s", __FUNCTION__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003212 if (btif_hl_find_mdl_idx_using_handle(mdl_handle,
3213 &app_idx, &mcl_idx, &mdl_idx ))
3214 {
3215 p_dcb =BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
3216 btif_hl_free_buf((void **) &p_dcb->p_tx_pkt);
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003217 BTIF_TRACE_DEBUG("send success free p_tx_pkt tx_size=%d", p_dcb->tx_size);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003218 p_dcb->tx_size = 0;
3219 }
3220}
3221
3222/*******************************************************************************
3223**
3224** Function btif_hl_proc_dch_cong_ind
3225**
3226** Description Process the DCH congestion change indication
3227**
3228** Returns Nothing
3229**
3230*******************************************************************************/
3231static void btif_hl_proc_dch_cong_ind(tBTA_HL *p_data)
3232
3233{
3234 btif_hl_mdl_cb_t *p_dcb;
3235 UINT8 app_idx, mcl_idx, mdl_idx;
3236
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003237 BTIF_TRACE_DEBUG("btif_hl_proc_dch_cong_ind");
The Android Open Source Project5738f832012-12-12 16:00:35 -08003238
3239
3240 if (btif_hl_find_mdl_idx_using_handle(p_data->dch_cong_ind.mdl_handle, &app_idx, &mcl_idx, &mdl_idx))
3241 {
3242 p_dcb =BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
3243 p_dcb->cong = p_data->dch_cong_ind.cong;
3244 }
3245}
3246
The Android Open Source Project5738f832012-12-12 16:00:35 -08003247/*******************************************************************************
3248**
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08003249** Function btif_hl_proc_reg_request
The Android Open Source Project5738f832012-12-12 16:00:35 -08003250**
3251** Description Process registration request
3252**
3253** Returns void
3254**
3255*******************************************************************************/
3256static void btif_hl_proc_reg_request(UINT8 app_idx, UINT8 app_id,
3257 tBTA_HL_REG_PARAM *p_reg_param,
3258 tBTA_HL_CBACK *p_cback){
3259 bt_status_t status= BT_STATUS_SUCCESS;
3260 UINT8 i;
3261 btif_hl_app_data_t *p_data;
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08003262 UNUSED(p_cback);
3263
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003264 BTIF_TRACE_DEBUG("%s app_idx=%d app_id=%d", __FUNCTION__, app_idx, app_id);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003265
Priti Agheraf8f30c22013-04-02 15:31:19 -07003266 if(reg_counter >1)
The Android Open Source Project5738f832012-12-12 16:00:35 -08003267 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003268 BTIF_TRACE_DEBUG("btif_hl_proc_reg_request: calling uPDATE");
Priti Agheraf8f30c22013-04-02 15:31:19 -07003269 BTA_HlUpdate(app_id, p_reg_param,TRUE, btif_hl_cback);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003270 }
Priti Agheraf8f30c22013-04-02 15:31:19 -07003271 else
3272 BTA_HlRegister(app_id, p_reg_param, btif_hl_cback);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003273}
3274
3275
3276/*******************************************************************************
3277**
3278** Function btif_hl_proc_cb_evt
3279**
3280** Description Process HL callback events
3281**
3282** Returns void
3283**
3284*******************************************************************************/
3285static void btif_hl_proc_cb_evt(UINT16 event, char* p_param){
3286
3287 btif_hl_evt_cb_t *p_data = (btif_hl_evt_cb_t *)p_param;
3288 bt_bdaddr_t bd_addr;
3289 bthl_channel_state_t state=BTHL_CONN_STATE_DISCONNECTED;
3290 BOOLEAN send_chan_cb=TRUE;
3291 tBTA_HL_REG_PARAM reg_param;
3292 btif_hl_app_cb_t *p_acb;
3293 bthl_app_reg_state_t reg_state = BTHL_APP_REG_STATE_REG_FAILED;
3294 int app_id;
3295 UINT8 preg_idx;
3296 bt_status_t bt_status;
3297
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003298 BTIF_TRACE_DEBUG("%s event %d", __FUNCTION__, event);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003299 btif_hl_display_calling_process_name();
3300
3301 switch (event)
3302 {
3303 case BTIF_HL_SEND_CONNECTED_CB:
3304 case BTIF_HL_SEND_DISCONNECTED_CB:
3305 if (p_data->chan_cb.cb_state == BTIF_HL_CHAN_CB_STATE_CONNECTED_PENDING)
3306 state = BTHL_CONN_STATE_CONNECTED;
3307 else if (p_data->chan_cb.cb_state == BTIF_HL_CHAN_CB_STATE_DISCONNECTED_PENDING)
3308 state = BTHL_CONN_STATE_DISCONNECTED;
3309 else
3310 send_chan_cb = FALSE;
3311
3312 if (send_chan_cb)
3313 {
3314 btif_hl_copy_bda(&bd_addr, p_data->chan_cb.bd_addr);
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003315 BTIF_TRACE_DEBUG("state callbk: ch_id=0x%08x cb_state=%d state=%d fd=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08003316 p_data->chan_cb.channel_id,
3317 p_data->chan_cb.cb_state,
3318 state, p_data->chan_cb.fd);
3319 btif_hl_display_bt_bda(&bd_addr);
3320 BTIF_HL_CALL_CBACK(bt_hl_callbacks, channel_state_cb, p_data->chan_cb.app_id,
3321 &bd_addr, p_data->chan_cb.mdep_cfg_index,
3322 p_data->chan_cb.channel_id, state, p_data->chan_cb.fd );
3323 }
3324
3325 break;
3326 case BTIF_HL_REG_APP:
3327 p_acb = BTIF_HL_GET_APP_CB_PTR(p_data->reg.app_idx);
3328 app_id = (int) p_acb->app_id;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003329 BTIF_TRACE_DEBUG("Rcv BTIF_HL_REG_APP app_idx=%d reg_pending=%d", p_data->reg.app_idx, p_acb->reg_pending);
Priti Agheraf8f30c22013-04-02 15:31:19 -07003330 if (btif_hl_get_state() == BTIF_HL_STATE_ENABLED && p_acb->reg_pending)
The Android Open Source Project5738f832012-12-12 16:00:35 -08003331 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003332 BTIF_TRACE_DEBUG("Rcv BTIF_HL_REG_APP reg_counter=%d",reg_counter);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003333 p_acb->reg_pending = FALSE;
The Android Open Source Project5738f832012-12-12 16:00:35 -08003334 reg_param.dev_type = p_acb->dev_type;
3335 reg_param.sec_mask = BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT;
3336 reg_param.p_srv_name = p_acb->srv_name;
3337 reg_param.p_srv_desp = p_acb->srv_desp;
3338 reg_param.p_provider_name = p_acb->provider_name;
3339 btif_hl_proc_reg_request (p_data->reg.app_idx, p_acb->app_id, &reg_param, btif_hl_cback);
3340 }
3341 else
3342 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003343 BTIF_TRACE_DEBUG("reg request is processed state=%d reg_pending=%d", btif_hl_get_state(), p_acb->reg_pending);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003344 }
3345
3346 break;
3347
3348 case BTIF_HL_UNREG_APP:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003349 BTIF_TRACE_DEBUG("Rcv BTIF_HL_UNREG_APP app_idx=%d", p_data->unreg.app_idx );
The Android Open Source Project5738f832012-12-12 16:00:35 -08003350 p_acb = BTIF_HL_GET_APP_CB_PTR(p_data->unreg.app_idx);
Priti Agheraf8f30c22013-04-02 15:31:19 -07003351 if (btif_hl_get_state() == BTIF_HL_STATE_ENABLED)
3352 {
3353 if(reg_counter >= 1)
3354 BTA_HlUpdate(p_acb->app_id,NULL,FALSE,NULL);
3355 else
3356 BTA_HlDeregister(p_acb->app_id, p_acb->app_handle);
3357 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08003358 break;
3359 case BTIF_HL_UPDATE_MDL:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003360 BTIF_TRACE_DEBUG("Rcv BTIF_HL_UPDATE_MDL app_idx=%d", p_data->update_mdl.app_idx );
The Android Open Source Project5738f832012-12-12 16:00:35 -08003361 p_acb = BTIF_HL_GET_APP_CB_PTR(p_data->update_mdl.app_idx);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003362 break;
3363
3364 default:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003365 BTIF_TRACE_ERROR("Unknown event %d", event);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003366 break;
3367 }
3368}
3369
3370/*******************************************************************************
3371**
3372** Function btif_hl_upstreams_evt
3373**
3374** Description Process HL events
3375**
3376** Returns void
3377**
3378*******************************************************************************/
3379static void btif_hl_upstreams_evt(UINT16 event, char* p_param){
3380 tBTA_HL *p_data = (tBTA_HL *)p_param;
3381 UINT8 app_idx, mcl_idx;
3382 btif_hl_app_cb_t *p_acb;
3383 btif_hl_mcl_cb_t *p_mcb = NULL;
3384 BD_ADDR bd_addr;
3385 btif_hl_pend_dch_op_t pending_op;
3386 BOOLEAN status;
3387
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003388 BTIF_TRACE_DEBUG("%s event %d", __FUNCTION__, event);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003389 btif_hl_display_calling_process_name();
3390 switch (event)
3391 {
3392 case BTA_HL_REGISTER_CFM_EVT:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003393 BTIF_TRACE_DEBUG("Rcv BTA_HL_REGISTER_CFM_EVT");
3394 BTIF_TRACE_DEBUG("app_id=%d app_handle=%d status=%d ",
The Android Open Source Project5738f832012-12-12 16:00:35 -08003395 p_data->reg_cfm.app_id,
3396 p_data->reg_cfm.app_handle,
3397 p_data->reg_cfm.status );
3398
3399 btif_hl_proc_reg_cfm(p_data);
3400 break;
3401 case BTA_HL_SDP_INFO_IND_EVT:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003402 BTIF_TRACE_DEBUG("Rcv BTA_HL_SDP_INFO_IND_EVT");
3403 BTIF_TRACE_DEBUG("app_handle=%d ctrl_psm=0x%04x data_psm=0x%04x x_spec=%d mcap_sup_procs=0x%02x",
The Android Open Source Project5738f832012-12-12 16:00:35 -08003404 p_data->sdp_info_ind.app_handle,
3405 p_data->sdp_info_ind.ctrl_psm,
3406 p_data->sdp_info_ind.data_psm,
3407 p_data->sdp_info_ind.data_x_spec,
3408 p_data->sdp_info_ind.mcap_sup_procs);
Priti Agheraf8f30c22013-04-02 15:31:19 -07003409 //btif_hl_proc_sdp_info_ind(p_data);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003410 break;
3411
3412 case BTA_HL_DEREGISTER_CFM_EVT:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003413 BTIF_TRACE_DEBUG("Rcv BTA_HL_DEREGISTER_CFM_EVT");
3414 BTIF_TRACE_DEBUG("app_handle=%d status=%d ",
The Android Open Source Project5738f832012-12-12 16:00:35 -08003415 p_data->dereg_cfm.app_handle,
3416 p_data->dereg_cfm.status );
3417 btif_hl_proc_dereg_cfm(p_data);
3418 break;
3419
3420 case BTA_HL_SDP_QUERY_CFM_EVT:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003421 BTIF_TRACE_DEBUG("Rcv BTA_HL_SDP_QUERY_CFM_EVT");
3422 BTIF_TRACE_DEBUG("app_handle=%d app_id =%d,status =%d",
Priti Agheraf8f30c22013-04-02 15:31:19 -07003423 p_data->sdp_query_cfm.app_handle,p_data->sdp_query_cfm.app_id,
The Android Open Source Project5738f832012-12-12 16:00:35 -08003424 p_data->sdp_query_cfm.status);
3425
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003426 BTIF_TRACE_DEBUG("DB [%02x] [%02x] [%02x] [%02x] [%02x] [%02x]",
The Android Open Source Project5738f832012-12-12 16:00:35 -08003427 p_data->sdp_query_cfm.bd_addr[0], p_data->sdp_query_cfm.bd_addr[1],
3428 p_data->sdp_query_cfm.bd_addr[2], p_data->sdp_query_cfm.bd_addr[3],
3429 p_data->sdp_query_cfm.bd_addr[4], p_data->sdp_query_cfm.bd_addr[5]);
3430
3431 if (p_data->sdp_query_cfm.status == BTA_HL_STATUS_OK)
3432 status = btif_hl_proc_sdp_query_cfm(p_data);
3433 else
3434 status = FALSE;
3435
3436 if (!status)
3437 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003438 BTIF_TRACE_DEBUG("BTA_HL_SDP_QUERY_CFM_EVT Status = %d",
Priti Agheraf8f30c22013-04-02 15:31:19 -07003439 p_data->sdp_query_cfm.status);
3440 if (btif_hl_find_app_idx_using_app_id(p_data->sdp_query_cfm.app_id, &app_idx))
The Android Open Source Project5738f832012-12-12 16:00:35 -08003441 {
3442 p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
3443 if (btif_hl_find_mcl_idx(app_idx, p_data->sdp_query_cfm.bd_addr, &mcl_idx))
3444 {
3445 p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
Ajay Dudani4420e412013-07-27 09:11:08 -07003446 if ( (p_mcb->cch_oper == BTIF_HL_CCH_OP_MDEP_FILTERING) ||
The Android Open Source Project5738f832012-12-12 16:00:35 -08003447 (p_mcb->cch_oper == BTIF_HL_CCH_OP_DCH_OPEN) )
3448 {
3449 pending_op = p_mcb->pcb.op;
3450 switch (pending_op)
3451 {
3452 case BTIF_HL_PEND_DCH_OP_OPEN:
3453 btif_hl_send_setup_disconnected_cb(app_idx, mcl_idx);
3454 break;
3455 case BTIF_HL_PEND_DCH_OP_RECONNECT:
3456 case BTIF_HL_PEND_DCH_OP_DELETE_MDL:
3457 default:
3458 break;
3459 }
3460 if (!p_mcb->is_connected)
3461 btif_hl_clean_mcl_cb(app_idx, mcl_idx);
3462 }
3463 }
3464 }
3465 }
3466
3467 break;
3468
3469
3470 case BTA_HL_CCH_OPEN_CFM_EVT:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003471 BTIF_TRACE_DEBUG("Rcv BTA_HL_CCH_OPEN_CFM_EVT");
3472 BTIF_TRACE_DEBUG("app_id=%d,app_handle=%d mcl_handle=%d status =%d",
Priti Agheraf8f30c22013-04-02 15:31:19 -07003473 p_data->cch_open_cfm.app_id,
The Android Open Source Project5738f832012-12-12 16:00:35 -08003474 p_data->cch_open_cfm.app_handle,
3475 p_data->cch_open_cfm.mcl_handle,
3476 p_data->cch_open_cfm.status);
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003477 BTIF_TRACE_DEBUG("DB [%02x] [%02x] [%02x] [%02x] [%02x] [%02x]",
The Android Open Source Project5738f832012-12-12 16:00:35 -08003478 p_data->cch_open_cfm.bd_addr[0], p_data->cch_open_cfm.bd_addr[1],
3479 p_data->cch_open_cfm.bd_addr[2], p_data->cch_open_cfm.bd_addr[3],
3480 p_data->cch_open_cfm.bd_addr[4], p_data->cch_open_cfm.bd_addr[5]);
3481
Priti Agheraf8f30c22013-04-02 15:31:19 -07003482 if (p_data->cch_open_cfm.status == BTA_HL_STATUS_OK ||
3483 p_data->cch_open_cfm.status == BTA_HL_STATUS_DUPLICATE_CCH_OPEN)
The Android Open Source Project5738f832012-12-12 16:00:35 -08003484 {
3485 status = btif_hl_proc_cch_open_cfm(p_data);
3486 }
3487 else
3488 {
3489 status = FALSE;
3490 }
3491
3492 if (!status)
3493 {
Priti Agheraf8f30c22013-04-02 15:31:19 -07003494 if (btif_hl_find_app_idx_using_app_id(p_data->cch_open_cfm.app_id, &app_idx))
The Android Open Source Project5738f832012-12-12 16:00:35 -08003495 {
3496 p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
3497 if (btif_hl_find_mcl_idx(app_idx, p_data->cch_open_cfm.bd_addr, &mcl_idx))
3498 {
3499 p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
3500 pending_op = p_mcb->pcb.op;
3501 switch (pending_op)
3502 {
3503 case BTIF_HL_PEND_DCH_OP_OPEN:
3504 btif_hl_send_setup_disconnected_cb(app_idx, mcl_idx);
3505 break;
3506 case BTIF_HL_PEND_DCH_OP_RECONNECT:
3507 case BTIF_HL_PEND_DCH_OP_DELETE_MDL:
3508 default:
3509 break;
3510 }
3511 btif_hl_clean_mcl_cb(app_idx, mcl_idx);
3512 }
3513 }
3514 }
3515 break;
3516
3517 case BTA_HL_DCH_OPEN_CFM_EVT:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003518 BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_OPEN_CFM_EVT");
3519 BTIF_TRACE_DEBUG("mcl_handle=%d mdl_handle=0x%x status=%d ",
The Android Open Source Project5738f832012-12-12 16:00:35 -08003520 p_data->dch_open_cfm.mcl_handle,
3521 p_data->dch_open_cfm.mdl_handle,
3522 p_data->dch_open_cfm.status);
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003523 BTIF_TRACE_DEBUG("first_reliable =%d dch_mode=%d local_mdep_id=%d mdl_id=%d mtu=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08003524 p_data->dch_open_cfm.first_reliable,
3525 p_data->dch_open_cfm.dch_mode,
3526 p_data->dch_open_cfm.local_mdep_id,
3527 p_data->dch_open_cfm.mdl_id,
3528 p_data->dch_open_cfm.mtu);
3529 if (p_data->dch_open_cfm.status == BTA_HL_STATUS_OK)
3530 {
3531 status = btif_hl_proc_dch_open_cfm(p_data);
3532 }
3533 else
3534 {
3535 status = FALSE;
3536 }
3537
3538 if (!status)
3539 {
3540 if (btif_hl_find_mcl_idx_using_handle(p_data->dch_open_cfm.mcl_handle,&app_idx, &mcl_idx))
3541 {
3542 p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
3543 pending_op = p_mcb->pcb.op;
3544 switch (pending_op)
3545 {
3546 case BTIF_HL_PEND_DCH_OP_OPEN:
3547 btif_hl_send_setup_disconnected_cb(app_idx, mcl_idx);
3548 break;
3549 case BTIF_HL_PEND_DCH_OP_RECONNECT:
3550 case BTIF_HL_PEND_DCH_OP_DELETE_MDL:
3551 default:
3552 break;
3553 }
3554 }
3555 }
3556 break;
3557
3558
3559 case BTA_HL_CCH_OPEN_IND_EVT:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003560 BTIF_TRACE_DEBUG("Rcv BTA_HL_CCH_OPEN_IND_EVT");
3561 BTIF_TRACE_DEBUG("app_handle=%d mcl_handle=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08003562 p_data->cch_open_ind.app_handle,
3563 p_data->cch_open_ind.mcl_handle);
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003564 BTIF_TRACE_DEBUG("DB [%02x] [%02x] [%02x] [%02x] [%02x] [%02x]",
The Android Open Source Project5738f832012-12-12 16:00:35 -08003565 p_data->cch_open_ind.bd_addr[0], p_data->cch_open_ind.bd_addr[1],
3566 p_data->cch_open_ind.bd_addr[2], p_data->cch_open_ind.bd_addr[3],
3567 p_data->cch_open_ind.bd_addr[4], p_data->cch_open_ind.bd_addr[5]);
3568
3569 btif_hl_proc_cch_open_ind(p_data);
3570 break;
3571
3572 case BTA_HL_DCH_CREATE_IND_EVT:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003573 BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_CREATE_IND_EVT");
3574 BTIF_TRACE_DEBUG("mcl_handle=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08003575 p_data->dch_create_ind.mcl_handle );
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003576 BTIF_TRACE_DEBUG("local_mdep_id =%d mdl_id=%d cfg=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08003577 p_data->dch_create_ind.local_mdep_id,
3578 p_data->dch_create_ind.mdl_id,
3579 p_data->dch_create_ind.cfg);
3580 btif_hl_proc_create_ind(p_data);
3581 break;
3582
3583 case BTA_HL_DCH_OPEN_IND_EVT:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003584 BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_OPEN_IND_EVT");
3585 BTIF_TRACE_DEBUG("mcl_handle=%d mdl_handle=0x%x",
The Android Open Source Project5738f832012-12-12 16:00:35 -08003586 p_data->dch_open_ind.mcl_handle,
3587 p_data->dch_open_ind.mdl_handle );
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003588 BTIF_TRACE_DEBUG("first_reliable =%d dch_mode=%d local_mdep_id=%d mdl_id=%d mtu=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08003589 p_data->dch_open_ind.first_reliable,
3590 p_data->dch_open_ind.dch_mode,
3591 p_data->dch_open_ind.local_mdep_id,
3592 p_data->dch_open_ind.mdl_id,
3593 p_data->dch_open_ind.mtu);
3594
3595 btif_hl_proc_dch_open_ind(p_data);
3596 break;
3597
3598 case BTA_HL_DELETE_MDL_IND_EVT:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003599 BTIF_TRACE_DEBUG("Rcv BTA_HL_DELETE_MDL_IND_EVT");
3600 BTIF_TRACE_DEBUG("mcl_handle=%d mdl_id=0x%x",
The Android Open Source Project5738f832012-12-12 16:00:35 -08003601 p_data->delete_mdl_ind.mcl_handle,
3602 p_data->delete_mdl_ind.mdl_id);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003603 break;
3604
3605 case BTA_HL_DELETE_MDL_CFM_EVT:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003606 BTIF_TRACE_DEBUG("Rcv BTA_HL_DELETE_MDL_CFM_EVT");
3607 BTIF_TRACE_DEBUG("mcl_handle=%d mdl_id=0x%x status=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08003608 p_data->delete_mdl_cfm.mcl_handle,
3609 p_data->delete_mdl_cfm.mdl_id,
3610 p_data->delete_mdl_cfm.status);
3611
Priti Agheraf8f30c22013-04-02 15:31:19 -07003612 if (btif_hl_find_app_idx_using_deleted_mdl_id( p_data->delete_mdl_cfm.mdl_id,
3613 &app_idx))
The Android Open Source Project5738f832012-12-12 16:00:35 -08003614 {
3615 p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003616 btif_hl_send_destroyed_cb(p_acb);
3617 btif_hl_clean_delete_mdl(&p_acb->delete_mdl);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003618 }
3619 break;
3620
3621 case BTA_HL_DCH_RECONNECT_CFM_EVT:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003622 BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_RECONNECT_CFM_EVT");
3623 BTIF_TRACE_DEBUG("mcl_handle=%d mdl_handle=%d status=%d ",
The Android Open Source Project5738f832012-12-12 16:00:35 -08003624 p_data->dch_reconnect_cfm.mcl_handle,
3625 p_data->dch_reconnect_cfm.mdl_handle,
3626 p_data->dch_reconnect_cfm.status);
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003627 BTIF_TRACE_DEBUG("first_reliable =%d dch_mode=%d mdl_id=%d mtu=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08003628 p_data->dch_reconnect_cfm.first_reliable,
3629 p_data->dch_reconnect_cfm.dch_mode,
3630 p_data->dch_reconnect_cfm.mdl_id,
3631 p_data->dch_reconnect_cfm.mtu);
3632
3633
3634 if (p_data->dch_reconnect_cfm.status == BTA_HL_STATUS_OK)
3635 {
3636 status = btif_hl_proc_dch_reconnect_cfm(p_data);
3637 }
3638 else
3639 {
3640 status = FALSE;
3641 }
3642
3643 if (!status)
3644 {
3645 if (btif_hl_find_mcl_idx_using_handle(p_data->dch_open_cfm.mcl_handle,&app_idx, &mcl_idx))
3646 {
3647 p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
3648 pending_op = p_mcb->pcb.op;
3649 switch (pending_op)
3650 {
3651 case BTIF_HL_PEND_DCH_OP_OPEN:
3652 btif_hl_send_setup_disconnected_cb(app_idx, mcl_idx);
3653 break;
3654 case BTIF_HL_PEND_DCH_OP_RECONNECT:
3655 case BTIF_HL_PEND_DCH_OP_DELETE_MDL:
3656 default:
3657 break;
3658 }
3659 }
3660 }
3661
3662 break;
3663
3664 case BTA_HL_CCH_CLOSE_CFM_EVT:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003665 BTIF_TRACE_DEBUG("Rcv BTA_HL_CCH_CLOSE_CFM_EVT");
3666 BTIF_TRACE_DEBUG("mcl_handle=%d status =%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08003667 p_data->cch_close_cfm.mcl_handle,
3668 p_data->cch_close_cfm.status);
3669 if (p_data->cch_close_cfm.status == BTA_HL_STATUS_OK)
3670 {
3671 btif_hl_proc_cch_close_cfm(p_data);
3672 }
3673 break;
3674
3675 case BTA_HL_CCH_CLOSE_IND_EVT:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003676 BTIF_TRACE_DEBUG("Rcv BTA_HL_CCH_CLOSE_IND_EVT");
3677 BTIF_TRACE_DEBUG("mcl_handle =%d intentional_close=%s",
The Android Open Source Project5738f832012-12-12 16:00:35 -08003678 p_data->cch_close_ind.mcl_handle,
3679 (p_data->cch_close_ind.intentional?"Yes":"No"));
3680
3681 btif_hl_proc_cch_close_ind(p_data);
3682 break;
3683
3684 case BTA_HL_DCH_CLOSE_IND_EVT:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003685 BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_CLOSE_IND_EVT");
3686 BTIF_TRACE_DEBUG("mdl_handle=%d intentional_close=%s",
The Android Open Source Project5738f832012-12-12 16:00:35 -08003687 p_data->dch_close_ind.mdl_handle,
3688 (p_data->dch_close_ind.intentional?"Yes":"No") );
3689
3690 btif_hl_proc_dch_close_ind(p_data);
3691 break;
3692
3693 case BTA_HL_DCH_CLOSE_CFM_EVT:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003694 BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_CLOSE_CFM_EVT");
3695 BTIF_TRACE_DEBUG("mdl_handle=%d status=%d ",
The Android Open Source Project5738f832012-12-12 16:00:35 -08003696 p_data->dch_close_cfm.mdl_handle,
3697 p_data->dch_close_cfm.status);
3698
3699 if (p_data->dch_close_cfm.status == BTA_HL_STATUS_OK)
3700 {
3701 btif_hl_proc_dch_close_cfm(p_data);
3702 }
3703 break;
3704
3705 case BTA_HL_DCH_ECHO_TEST_CFM_EVT:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003706 BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_ECHO_TEST_CFM_EVT");
3707 BTIF_TRACE_DEBUG("mcl_handle=%d status=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08003708 p_data->echo_test_cfm.mcl_handle,
3709 p_data->echo_test_cfm.status );
3710 /* not supported */
3711 break;
3712
3713
3714 case BTA_HL_DCH_RECONNECT_IND_EVT:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003715 BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_RECONNECT_IND_EVT");
The Android Open Source Project5738f832012-12-12 16:00:35 -08003716
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003717 BTIF_TRACE_DEBUG("mcl_handle=%d mdl_handle=5d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08003718 p_data->dch_reconnect_ind.mcl_handle,
3719 p_data->dch_reconnect_ind.mdl_handle );
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003720 BTIF_TRACE_DEBUG("first_reliable =%d dch_mode=%d mdl_id=%d mtu=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08003721 p_data->dch_reconnect_ind.first_reliable,
3722 p_data->dch_reconnect_ind.dch_mode,
3723 p_data->dch_reconnect_ind.mdl_id,
3724 p_data->dch_reconnect_ind.mtu);
3725
3726 btif_hl_proc_dch_reconnect_ind(p_data);
3727 break;
3728
3729 case BTA_HL_CONG_CHG_IND_EVT:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003730 BTIF_TRACE_DEBUG("Rcv BTA_HL_CONG_CHG_IND_EVT");
3731 BTIF_TRACE_DEBUG("mdl_handle=%d cong =%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08003732 p_data->dch_cong_ind.mdl_handle,
3733 p_data->dch_cong_ind.cong);
3734 btif_hl_proc_dch_cong_ind(p_data);
3735 break;
3736
3737 case BTA_HL_DCH_ABORT_IND_EVT:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003738 BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_ABORT_IND_EVT");
3739 BTIF_TRACE_DEBUG("mcl_handle=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08003740 p_data->dch_abort_ind.mcl_handle );
3741 btif_hl_proc_abort_ind(p_data->dch_abort_ind.mcl_handle);
3742 break;
3743 case BTA_HL_DCH_ABORT_CFM_EVT:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003744 BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_ABORT_CFM_EVT");
3745 BTIF_TRACE_DEBUG("mcl_handle=%d status =%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08003746 p_data->dch_abort_cfm.mcl_handle,
3747 p_data->dch_abort_cfm.status);
3748 if (p_data->dch_abort_cfm.status == BTA_HL_STATUS_OK)
3749 {
3750 btif_hl_proc_abort_cfm(p_data->dch_abort_ind.mcl_handle);
3751 }
3752 break;
3753
3754 case BTA_HL_DCH_SEND_DATA_CFM_EVT:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003755 BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_SEND_DATA_CFM_EVT");
3756 BTIF_TRACE_DEBUG("mdl_handle=0x%x status =%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08003757 p_data->dch_send_data_cfm.mdl_handle,
3758 p_data->dch_send_data_cfm.status);
3759 btif_hl_proc_send_data_cfm(p_data->dch_send_data_cfm.mdl_handle,
3760 p_data->dch_send_data_cfm.status);
3761 break;
3762
3763 case BTA_HL_DCH_RCV_DATA_IND_EVT:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003764 BTIF_TRACE_DEBUG("Rcv BTA_HL_DCH_RCV_DATA_IND_EVT");
3765 BTIF_TRACE_DEBUG("mdl_handle=0x%x ",
The Android Open Source Project5738f832012-12-12 16:00:35 -08003766 p_data->dch_rcv_data_ind.mdl_handle);
3767 /* do nothing here */
3768 break;
3769
3770 default:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003771 BTIF_TRACE_DEBUG("Unknown Event (0x%02x)...", event);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003772 break;
3773 }
3774}
3775
3776/*******************************************************************************
3777**
3778** Function btif_hl_cback
3779**
3780** Description Callback function for HL events
3781**
3782** Returns void
3783**
3784*******************************************************************************/
3785static void btif_hl_cback(tBTA_HL_EVT event, tBTA_HL *p_data){
3786 bt_status_t status;
3787 int param_len = 0;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003788 BTIF_TRACE_DEBUG("%s event %d", __FUNCTION__, event);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003789 btif_hl_display_calling_process_name();
3790 switch (event)
3791 {
3792 case BTA_HL_REGISTER_CFM_EVT:
3793 param_len = sizeof(tBTA_HL_REGISTER_CFM);
3794 break;
3795 case BTA_HL_SDP_INFO_IND_EVT:
3796 param_len = sizeof(tBTA_HL_SDP_INFO_IND);
3797 break;
3798 case BTA_HL_DEREGISTER_CFM_EVT:
3799 param_len = sizeof(tBTA_HL_DEREGISTER_CFM);
3800 break;
3801 case BTA_HL_SDP_QUERY_CFM_EVT:
3802 param_len = sizeof(tBTA_HL_SDP_QUERY_CFM);
3803 break;
3804 case BTA_HL_CCH_OPEN_CFM_EVT:
3805 param_len = sizeof(tBTA_HL_CCH_OPEN_CFM);
3806 break;
3807 case BTA_HL_DCH_OPEN_CFM_EVT:
3808 param_len = sizeof(tBTA_HL_DCH_OPEN_CFM);
3809 break;
3810 case BTA_HL_CCH_OPEN_IND_EVT:
3811 param_len = sizeof(tBTA_HL_CCH_OPEN_IND);
3812 break;
3813 case BTA_HL_DCH_CREATE_IND_EVT:
3814 param_len = sizeof(tBTA_HL_DCH_CREATE_IND);
3815 break;
3816 case BTA_HL_DCH_OPEN_IND_EVT:
3817 param_len = sizeof(tBTA_HL_DCH_OPEN_IND);
3818 break;
3819 case BTA_HL_DELETE_MDL_IND_EVT:
3820 param_len = sizeof(tBTA_HL_MDL_IND);
3821 break;
3822 case BTA_HL_DELETE_MDL_CFM_EVT:
3823 param_len = sizeof(tBTA_HL_MDL_CFM);
3824 break;
3825 case BTA_HL_DCH_RECONNECT_CFM_EVT:
3826 param_len = sizeof(tBTA_HL_DCH_OPEN_CFM);
3827 break;
3828 case BTA_HL_CCH_CLOSE_CFM_EVT:
3829 param_len = sizeof(tBTA_HL_MCL_CFM);
3830 break;
3831 case BTA_HL_CCH_CLOSE_IND_EVT:
3832 param_len = sizeof(tBTA_HL_CCH_CLOSE_IND);
3833 break;
3834 case BTA_HL_DCH_CLOSE_IND_EVT:
3835 param_len = sizeof(tBTA_HL_DCH_CLOSE_IND);
3836 break;
3837 case BTA_HL_DCH_CLOSE_CFM_EVT:
3838 param_len = sizeof(tBTA_HL_MDL_CFM);
3839 break;
3840 case BTA_HL_DCH_ECHO_TEST_CFM_EVT:
3841 param_len = sizeof(tBTA_HL_MCL_CFM);
3842 break;
3843 case BTA_HL_DCH_RECONNECT_IND_EVT:
3844 param_len = sizeof(tBTA_HL_DCH_OPEN_IND);
3845 break;
3846 case BTA_HL_CONG_CHG_IND_EVT:
3847 param_len = sizeof(tBTA_HL_DCH_CONG_IND);
3848 break;
3849 case BTA_HL_DCH_ABORT_IND_EVT:
3850 param_len = sizeof(tBTA_HL_MCL_IND);
3851 break;
3852 case BTA_HL_DCH_ABORT_CFM_EVT:
3853 param_len = sizeof(tBTA_HL_MCL_CFM);
3854 break;
3855 case BTA_HL_DCH_SEND_DATA_CFM_EVT:
3856 param_len = sizeof(tBTA_HL_MDL_CFM);
3857 break;
3858 case BTA_HL_DCH_RCV_DATA_IND_EVT:
3859 param_len = sizeof(tBTA_HL_MDL_IND);
3860 break;
3861 default:
3862 param_len = sizeof(tBTA_HL_MDL_IND);
3863 break;
3864 }
3865 status = btif_transfer_context(btif_hl_upstreams_evt, (uint16_t)event, (void*)p_data, param_len, NULL);
3866
3867 /* catch any failed context transfers */
3868 ASSERTC(status == BT_STATUS_SUCCESS, "context transfer failed", status);
3869}
3870
3871/*******************************************************************************
3872**
3873** Function btif_hl_upstreams_ctrl_evt
3874**
3875** Description Callback function for HL control events in the BTIF task context
3876**
3877** Returns void
3878**
3879*******************************************************************************/
3880static void btif_hl_upstreams_ctrl_evt(UINT16 event, char* p_param){
3881 tBTA_HL_CTRL *p_data = (tBTA_HL_CTRL *) p_param;
3882 UINT8 i;
3883 tBTA_HL_REG_PARAM reg_param;
3884 btif_hl_app_cb_t *p_acb;
3885
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003886 BTIF_TRACE_DEBUG("%s event %d", __FUNCTION__, event);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003887 btif_hl_display_calling_process_name();
3888
3889 switch ( event )
3890 {
3891 case BTA_HL_CTRL_ENABLE_CFM_EVT:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003892 BTIF_TRACE_DEBUG("Rcv BTA_HL_CTRL_ENABLE_CFM_EVT");
3893 BTIF_TRACE_DEBUG("status=%d", p_data->enable_cfm.status);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003894
3895 if (p_data->enable_cfm.status == BTA_HL_STATUS_OK)
3896 {
3897 btif_hl_set_state(BTIF_HL_STATE_ENABLED);
3898
3899
3900 for (i=0; i < BTA_HL_NUM_APPS ; i ++)
3901 {
3902 p_acb = BTIF_HL_GET_APP_CB_PTR(i);
3903 if (p_acb->in_use && p_acb->reg_pending)
3904 {
3905 p_acb->reg_pending = FALSE;
3906 reg_param.dev_type = p_acb->dev_type;
3907 reg_param.sec_mask = BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT;
3908 reg_param.p_srv_name = p_acb->srv_name;
3909 reg_param.p_srv_desp = p_acb->srv_desp;
3910 reg_param.p_provider_name = p_acb->provider_name;
3911
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003912 BTIF_TRACE_DEBUG("Register pending app_id=%d", p_acb->app_id);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003913 btif_hl_proc_reg_request (i, p_acb->app_id, &reg_param, btif_hl_cback);
3914 }
3915 }
3916 }
3917
3918 break;
3919 case BTA_HL_CTRL_DISABLE_CFM_EVT:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003920 BTIF_TRACE_DEBUG("Rcv BTA_HL_CTRL_DISABLE_CFM_EVT");
3921 BTIF_TRACE_DEBUG("status=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08003922 p_data->disable_cfm.status);
3923
3924 if (p_data->disable_cfm.status == BTA_HL_STATUS_OK)
3925 {
3926 memset(p_btif_hl_cb, 0, sizeof(btif_hl_cb_t));
3927 btif_hl_set_state(BTIF_HL_STATE_DISABLED);
3928 }
3929
3930 break;
3931 default:
3932 break;
3933 }
3934}
3935
3936/*******************************************************************************
3937**
3938** Function btif_hl_ctrl_cback
3939**
3940** Description Callback function for HL control events
3941**
3942** Returns void
3943**
3944*******************************************************************************/
3945static void btif_hl_ctrl_cback(tBTA_HL_CTRL_EVT event, tBTA_HL_CTRL *p_data){
3946 bt_status_t status;
3947 int param_len = 0;
3948
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003949 BTIF_TRACE_DEBUG("%s event %d", __FUNCTION__, event);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003950 btif_hl_display_calling_process_name();
3951
3952 switch ( event )
3953 {
3954 case BTA_HL_CTRL_ENABLE_CFM_EVT:
3955 case BTA_HL_CTRL_DISABLE_CFM_EVT:
3956 param_len = sizeof(tBTA_HL_CTRL_ENABLE_DISABLE);
3957 break;
3958 default:
3959 break;
3960 }
3961
3962 status = btif_transfer_context(btif_hl_upstreams_ctrl_evt, (uint16_t)event, (void*)p_data, param_len, NULL);
3963 ASSERTC(status == BT_STATUS_SUCCESS, "context transfer failed", status);
3964}
3965/*******************************************************************************
3966**
3967** Function connect_channel
3968**
3969** Description connect a data channel
3970**
3971** Returns bt_status_t
3972**
3973*******************************************************************************/
3974static bt_status_t connect_channel(int app_id, bt_bdaddr_t *bd_addr, int mdep_cfg_index, int *channel_id){
3975 UINT8 app_idx, mcl_idx;
3976 btif_hl_app_cb_t *p_acb = NULL;
Priti Agheraf8f30c22013-04-02 15:31:19 -07003977 btif_hl_pending_chan_cb_t *p_pcb = NULL;
The Android Open Source Project5738f832012-12-12 16:00:35 -08003978 btif_hl_mcl_cb_t *p_mcb=NULL;
3979 bt_status_t status = BT_STATUS_SUCCESS;
3980 tBTA_HL_DCH_OPEN_PARAM dch_open;
3981 BD_ADDR bda;
3982 UINT8 i;
3983
3984 CHECK_BTHL_INIT();
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003985 BTIF_TRACE_EVENT("%s", __FUNCTION__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003986 btif_hl_display_calling_process_name();
3987
3988
3989 for (i=0; i<6; i++)
3990 {
3991 bda[i] = (UINT8) bd_addr->address[i];
3992 }
3993 if (btif_hl_find_app_idx(((UINT8)app_id), &app_idx))
3994 {
3995 p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
3996 if (btif_hl_find_mcl_idx(app_idx, bda , &mcl_idx))
3997 {
3998 p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
3999 if (p_mcb->is_connected)
4000 {
4001 dch_open.ctrl_psm = p_mcb->ctrl_psm;
4002 dch_open.local_mdep_id = p_acb->sup_feature.mdep[mdep_cfg_index].mdep_id;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004003 BTIF_TRACE_DEBUG("connect_channel: app_idx =%d, mdep_cfg_indx =%d, mdep_id =%d app_id= %d", app_idx,
Priti Agheraf8f30c22013-04-02 15:31:19 -07004004 mdep_cfg_index, dch_open.local_mdep_id, app_id);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004005 if (btif_hl_find_peer_mdep_id(p_acb->app_id, p_mcb->bd_addr,
4006 p_acb->sup_feature.mdep[mdep_cfg_index].mdep_cfg.mdep_role,
4007 p_acb->sup_feature.mdep[mdep_cfg_index].mdep_cfg.data_cfg[0].data_type, &dch_open.peer_mdep_id ))
4008 {
4009 dch_open.local_cfg = p_acb->channel_type[mdep_cfg_index];
4010 if ((p_acb->sup_feature.mdep[mdep_cfg_index].mdep_cfg.mdep_role == BTA_HL_MDEP_ROLE_SOURCE)
4011 && !btif_hl_is_the_first_reliable_existed(app_idx,mcl_idx))
4012 {
4013 dch_open.local_cfg = BTA_HL_DCH_CFG_RELIABLE;
4014 }
4015 dch_open.sec_mask = (BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT);
4016
4017 if( !btif_hl_dch_open(p_acb->app_id, bda, &dch_open,
4018 mdep_cfg_index, BTIF_HL_PEND_DCH_OP_OPEN, channel_id ))
4019 {
4020 status = BT_STATUS_FAIL;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004021 BTIF_TRACE_EVENT("%s loc0 status = BT_STATUS_FAIL", __FUNCTION__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004022 }
4023 }
4024 else
4025 {
Priti Agheraf8f30c22013-04-02 15:31:19 -07004026 p_mcb->cch_oper = BTIF_HL_CCH_OP_MDEP_FILTERING;
4027
4028 p_pcb = BTIF_HL_GET_PCB_PTR(app_idx, mcl_idx);
4029 p_pcb->in_use = TRUE;
4030 p_pcb->mdep_cfg_idx = mdep_cfg_index;
4031 memcpy(p_pcb->bd_addr, bda, sizeof(BD_ADDR));
4032 p_pcb->op = BTIF_HL_PEND_DCH_OP_OPEN;
4033 BTA_HlSdpQuery(app_id,p_acb->app_handle, bda);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004034 }
4035 }
4036 else
4037 {
4038 status = BT_STATUS_FAIL;
4039 }
4040 }
4041 else
4042 {
4043 p_acb->filter.num_elems =1;
4044 p_acb->filter.elem[0].data_type = p_acb->sup_feature.mdep[mdep_cfg_index].mdep_cfg.data_cfg[mdep_cfg_index].data_type;
4045 if (p_acb->sup_feature.mdep[mdep_cfg_index].mdep_cfg.mdep_role == BTA_HL_MDEP_ROLE_SINK)
4046 p_acb->filter.elem[0].peer_mdep_role = BTA_HL_MDEP_ROLE_SOURCE;
4047 else
4048 p_acb->filter.elem[0].peer_mdep_role = BTA_HL_MDEP_ROLE_SINK;
4049
4050 if ( !btif_hl_cch_open(p_acb->app_id, bda, 0, mdep_cfg_index,
4051 BTIF_HL_PEND_DCH_OP_OPEN,
4052 channel_id))
4053 {
4054 status = BT_STATUS_FAIL;
4055 }
4056 }
4057 }
4058 else
4059 {
4060 status = BT_STATUS_FAIL;
4061 }
4062
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004063 BTIF_TRACE_DEBUG("%s status=%d channel_id=0x%08x", __FUNCTION__, status, *channel_id);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004064
4065 return status;
4066}
4067/*******************************************************************************
4068**
4069** Function destroy_channel
4070**
4071** Description destroy a data channel
4072**
4073** Returns bt_status_t
4074**
4075*******************************************************************************/
4076static bt_status_t destroy_channel(int channel_id){
Matthew Xiebea41312014-05-09 01:04:04 -07004077 UINT8 app_idx, mcl_idx, mdl_idx, mdl_cfg_idx, app_id, mdep_cfg_idx = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08004078 bt_status_t status = BT_STATUS_SUCCESS;
4079 btif_hl_mdl_cfg_t *p_mdl;
4080 btif_hl_mcl_cb_t *p_mcb;
Priti Agheraf8f30c22013-04-02 15:31:19 -07004081 btif_hl_mdl_cb_t *p_dcb;
The Android Open Source Project5738f832012-12-12 16:00:35 -08004082 btif_hl_app_cb_t *p_acb;
4083
4084 CHECK_BTHL_INIT();
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004085 BTIF_TRACE_EVENT("%s channel_id=0x%08x", __FUNCTION__, channel_id);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004086 btif_hl_display_calling_process_name();
4087
4088
4089 if (btif_hl_if_channel_setup_pending(channel_id, &app_idx, &mcl_idx))
4090 {
4091 btif_hl_dch_abort(app_idx, mcl_idx);
4092 }
4093 else
4094 {
4095 if (btif_hl_find_mdl_cfg_idx_using_channel_id(channel_id, &app_idx, &mdl_cfg_idx))
Priti Agheraf8f30c22013-04-02 15:31:19 -07004096 // if(btif_hl_find_mdl_idx_using_channel_id(channel_id, &app_idx,&mcl_idx, &mdl_idx))
The Android Open Source Project5738f832012-12-12 16:00:35 -08004097 {
4098 p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
4099 if (!p_acb->delete_mdl.active)
4100 {
4101 p_mdl =BTIF_HL_GET_MDL_CFG_PTR(app_idx, mdl_cfg_idx);
4102 p_acb->delete_mdl.active = TRUE;
4103 p_acb->delete_mdl.mdl_id = p_mdl->base.mdl_id;
4104 p_acb->delete_mdl.channel_id = channel_id;
4105 p_acb->delete_mdl.mdep_cfg_idx = p_mdl->extra.mdep_cfg_idx;
4106 memcpy(p_acb->delete_mdl.bd_addr, p_mdl->base.peer_bd_addr,sizeof(BD_ADDR));
4107
4108 if (btif_hl_find_mcl_idx(app_idx, p_mdl->base.peer_bd_addr, &mcl_idx))
4109 {
4110 p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
4111 if (p_mcb->is_connected)
4112 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004113 BTIF_TRACE_DEBUG("calling BTA_HlDeleteMdl mdl_id=%d",p_acb->delete_mdl.mdl_id );
The Android Open Source Project5738f832012-12-12 16:00:35 -08004114 BTA_HlDeleteMdl(p_mcb->mcl_handle, p_acb->delete_mdl.mdl_id);
4115 }
4116 else
4117 {
4118 status = BT_STATUS_FAIL;
4119 }
4120 }
4121 else
4122 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004123 BTIF_TRACE_DEBUG("btif_hl_delete_mdl calling btif_hl_cch_open" );
The Android Open Source Project5738f832012-12-12 16:00:35 -08004124 mdep_cfg_idx = p_mdl->extra.mdep_cfg_idx;
4125 p_acb->filter.num_elems =1;
4126 p_acb->filter.elem[0].data_type = p_acb->sup_feature.mdep[mdep_cfg_idx].mdep_cfg.data_cfg[mdep_cfg_idx].data_type;
4127 if (p_acb->sup_feature.mdep[mdep_cfg_idx].mdep_cfg.mdep_role == BTA_HL_MDEP_ROLE_SINK)
4128 p_acb->filter.elem[0].peer_mdep_role = BTA_HL_MDEP_ROLE_SOURCE;
4129 else
4130 p_acb->filter.elem[0].peer_mdep_role = BTA_HL_MDEP_ROLE_SINK;
4131 if (btif_hl_cch_open(p_acb->app_id, p_acb->delete_mdl.bd_addr, 0,
4132 mdep_cfg_idx,
4133 BTIF_HL_PEND_DCH_OP_DELETE_MDL, NULL))
4134 {
4135 status = BT_STATUS_FAIL;
4136 }
4137 }
4138
4139 if ( status == BT_STATUS_FAIL)
4140 {
4141 /* fail for now */
4142 btif_hl_clean_delete_mdl(&p_acb->delete_mdl);
4143 }
4144 }
4145 else
4146 {
4147 status = BT_STATUS_BUSY;
4148 }
4149 }
4150 else
4151 {
4152 status = BT_STATUS_FAIL;
4153 }
4154
4155 }
4156 return status;
4157}
4158/*******************************************************************************
4159**
4160** Function unregister_application
4161**
4162** Description unregister an HDP application
4163**
4164** Returns bt_status_t
4165**
4166*******************************************************************************/
4167static bt_status_t unregister_application(int app_id){
4168 btif_hl_app_cb_t *p_acb;
4169 UINT8 app_idx;
4170 int len;
4171 bt_status_t status = BT_STATUS_SUCCESS;
4172 btif_hl_evt_cb_t evt_param;
4173
4174 CHECK_BTHL_INIT();
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004175 BTIF_TRACE_EVENT("%s app_id=%d", __FUNCTION__, app_id);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004176 btif_hl_display_calling_process_name();
4177
4178 if (btif_hl_find_app_idx(((UINT8)app_id), &app_idx))
4179 {
4180 evt_param.unreg.app_idx = app_idx;
Priti Agheraf8f30c22013-04-02 15:31:19 -07004181 p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
4182 reg_counter --;
The Android Open Source Project5738f832012-12-12 16:00:35 -08004183 len = sizeof(btif_hl_unreg_t);
4184 status = btif_transfer_context (btif_hl_proc_cb_evt, BTIF_HL_UNREG_APP,
4185 (char*) &evt_param, len, NULL);
4186 ASSERTC(status == BT_STATUS_SUCCESS, "context transfer failed", status);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004187 }
4188 else
4189 {
4190 status = BT_STATUS_FAIL;
4191 }
4192
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004193 BTIF_TRACE_DEBUG("de-reg return status=%d", status);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004194 return status;
4195}
4196/*******************************************************************************
4197**
4198** Function register_application
4199**
4200** Description register an HDP application
4201**
4202** Returns bt_status_t
4203**
4204*******************************************************************************/
4205static bt_status_t register_application(bthl_reg_param_t *p_reg_param, int *app_id){
4206 btif_hl_app_cb_t *p_acb;
4207 tBTA_HL_SUP_FEATURE *p_sup;
4208 tBTA_HL_MDEP_CFG *p_cfg;
4209 tBTA_HL_MDEP_DATA_TYPE_CFG *p_data;
4210 UINT8 app_idx=0, i=0, pending_reg_idx=0;
4211 bthl_mdep_cfg_t *p_mdep_cfg;
4212 bt_status_t status = BT_STATUS_SUCCESS;
4213 btif_hl_evt_cb_t evt_param;
4214 int len;
4215
4216 CHECK_BTHL_INIT();
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004217 BTIF_TRACE_EVENT("%s", __FUNCTION__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004218 btif_hl_display_calling_process_name();
4219
4220 if (btif_hl_get_state() == BTIF_HL_STATE_DISABLED)
4221 {
4222 btif_hl_init();
4223 btif_hl_set_state(BTIF_HL_STATE_ENABLING);
4224 BTA_HlEnable(btif_hl_ctrl_cback);
4225 }
4226
4227 if (!btif_hl_find_avail_app_idx(&app_idx))
4228 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004229 BTIF_TRACE_ERROR("Unable to allocate a new application control block");
The Android Open Source Project5738f832012-12-12 16:00:35 -08004230 return BT_STATUS_FAIL;
4231 }
4232
4233 p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
4234 p_acb->in_use = TRUE;
4235
4236
4237 p_acb->app_id = btif_hl_get_next_app_id();
4238
4239 if (p_reg_param->application_name != NULL )
4240 strncpy(p_acb->application_name, p_reg_param->application_name, BTIF_HL_APPLICATION_NAME_LEN);
4241
4242 if (p_reg_param->provider_name != NULL )
4243 strncpy(p_acb->provider_name, p_reg_param->provider_name, BTA_PROVIDER_NAME_LEN);
4244
4245 if (p_reg_param->srv_name != NULL )
4246 strncpy(p_acb->srv_name, p_reg_param->srv_name, BTA_SERVICE_NAME_LEN);
4247
4248 if (p_reg_param->srv_desp != NULL )
4249 strncpy(p_acb->srv_desp, p_reg_param->srv_desp, BTA_SERVICE_DESP_LEN);
4250
4251 p_sup = &p_acb->sup_feature;
4252 p_sup->advertize_source_sdp = TRUE;
4253 p_sup->echo_cfg.max_rx_apdu_size = BTIF_HL_ECHO_MAX_TX_RX_APDU_SIZE;
4254 p_sup->echo_cfg.max_tx_apdu_size = BTIF_HL_ECHO_MAX_TX_RX_APDU_SIZE;
4255 p_sup->num_of_mdeps = p_reg_param->number_of_mdeps;
4256
4257 for (i=0, p_mdep_cfg = p_reg_param->mdep_cfg ; i< p_sup->num_of_mdeps; i++, p_mdep_cfg++ )
4258 {
4259 p_cfg = &p_sup->mdep[i].mdep_cfg;
4260 p_cfg->num_of_mdep_data_types = 1;
4261 p_data = &p_cfg->data_cfg[0];
4262
4263 if ( !btif_hl_get_bta_mdep_role(p_mdep_cfg->mdep_role, &(p_cfg->mdep_role)))
4264 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004265 BTIF_TRACE_ERROR("Invalid mdep_role=%d", p_mdep_cfg->mdep_role);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004266 status = BT_STATUS_FAIL;
4267 break;
4268 }
4269 else
4270 {
4271 if (p_cfg->mdep_role == BTA_HL_MDEP_ROLE_SINK )
4272 p_sup->app_role_mask |= BTA_HL_MDEP_ROLE_MASK_SINK;
4273 else
4274 p_sup->app_role_mask |= BTA_HL_MDEP_ROLE_MASK_SOURCE;
4275
4276 if ( (p_sup->app_role_mask & BTA_HL_MDEP_ROLE_MASK_SINK) &&
4277 (p_sup->app_role_mask & BTA_HL_MDEP_ROLE_MASK_SINK) )
4278 {
4279 p_acb->dev_type = BTA_HL_DEVICE_TYPE_DUAL;
4280 }
4281 else if ( p_sup->app_role_mask & BTA_HL_MDEP_ROLE_MASK_SINK )
4282 p_acb->dev_type = BTA_HL_DEVICE_TYPE_SINK;
4283 else
4284
4285 p_acb->dev_type = BTA_HL_DEVICE_TYPE_SOURCE;
4286
4287 p_data->data_type = (UINT16) p_mdep_cfg->data_type;
4288 p_data->max_rx_apdu_size = btif_hl_get_max_rx_apdu_size(p_cfg->mdep_role, p_data->data_type);
4289 p_data->max_tx_apdu_size = btif_hl_get_max_tx_apdu_size(p_cfg->mdep_role, p_data->data_type);
4290
4291 if (p_mdep_cfg->mdep_description != NULL )
4292 strncpy(p_data->desp, p_mdep_cfg->mdep_description, BTA_SERVICE_DESP_LEN);
4293
4294 if ( !btif_hl_get_bta_channel_type(p_mdep_cfg->channel_type, &(p_acb->channel_type[i])))
4295 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004296 BTIF_TRACE_ERROR("Invalid channel_type=%d", p_mdep_cfg->channel_type);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004297 status = BT_STATUS_FAIL;
4298 break;
4299 }
4300 }
4301 }
4302
4303 if (status == BT_STATUS_SUCCESS)
4304 {
4305 *app_id = (int) p_acb->app_id;
4306 evt_param.reg.app_idx = app_idx;
4307 len = sizeof(btif_hl_reg_t);
4308 p_acb->reg_pending = TRUE;
Priti Agheraf8f30c22013-04-02 15:31:19 -07004309 reg_counter++;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004310 BTIF_TRACE_DEBUG("calling btif_transfer_context status=%d app_id=%d", status, *app_id);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004311 status = btif_transfer_context (btif_hl_proc_cb_evt, BTIF_HL_REG_APP,
4312 (char*) &evt_param, len, NULL);
4313 ASSERTC(status == BT_STATUS_SUCCESS, "context transfer failed", status);
4314
4315 }
4316 else
4317 {
4318 btif_hl_free_app_idx(app_idx);
4319 }
4320
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004321 BTIF_TRACE_DEBUG("register_application status=%d app_id=%d", status, *app_id);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004322 return status;
4323}
Priti Agheraf8f30c22013-04-02 15:31:19 -07004324
4325/*******************************************************************************
4326**
4327** Function btif_hl_save_mdl_cfg
4328**
4329** Description Save the MDL configuration
4330**
4331** Returns BOOLEAN
4332**
4333*******************************************************************************/
4334BOOLEAN btif_hl_save_mdl_cfg(UINT8 mdep_id, UINT8 item_idx,
4335 tBTA_HL_MDL_CFG *p_mdl_cfg){
4336 btif_hl_mdl_cfg_t *p_mdl=NULL;
4337 BOOLEAN success = FALSE;
4338 btif_hl_app_cb_t *p_acb;
4339 btif_hl_mcl_cb_t *p_mcb;
4340 UINT8 app_idx, mcl_idx, mdl_idx, len;
4341 bt_status_t bt_status;
4342 btif_hl_evt_cb_t evt_param;
4343 int *p_channel_id;
4344
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004345 BTIF_TRACE_DEBUG("%s mdep_id=%d item_idx=%d, local_mdep_id=%d mdl_id=0x%x dch_mode=%d",
Priti Agheraf8f30c22013-04-02 15:31:19 -07004346 __FUNCTION__, mdep_id, item_idx, p_mdl_cfg->local_mdep_id,
4347 p_mdl_cfg->mdl_id, p_mdl_cfg->dch_mode );
4348
4349 if(btif_hl_find_app_idx_using_mdepId(mdep_id,&app_idx))
4350 {
4351 p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
4352 p_mdl = BTIF_HL_GET_MDL_CFG_PTR(app_idx, item_idx);
4353 p_channel_id = BTIF_HL_GET_MDL_CFG_CHANNEL_ID_PTR(app_idx, item_idx);
4354 if (p_mdl)
4355 {
4356 memcpy(&p_mdl->base, p_mdl_cfg, sizeof(tBTA_HL_MDL_CFG));
4357 if (btif_hl_find_mcl_idx(app_idx, p_mdl->base.peer_bd_addr , &mcl_idx))
4358 {
4359 p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
4360 if (p_mcb->pcb.in_use)
4361 *p_channel_id = p_mcb->pcb.channel_id;
4362 else
4363 *p_channel_id = btif_hl_get_next_channel_id(p_acb->app_id);
4364 p_mdl->extra.mdep_cfg_idx = p_mcb->pcb.mdep_cfg_idx;
4365 p_mdl->extra.data_type = p_acb->sup_feature.mdep[p_mcb->pcb.mdep_cfg_idx].mdep_cfg.data_cfg[0].data_type;
4366
4367 if (!btif_hl_find_peer_mdep_id(p_acb->app_id, p_mcb->bd_addr,
4368 p_acb->sup_feature.mdep[p_mcb->pcb.mdep_cfg_idx].mdep_cfg.mdep_role,
4369 p_acb->sup_feature.mdep[p_mcb->pcb.mdep_cfg_idx].mdep_cfg.data_cfg[0].data_type,
4370 &p_mdl->extra.peer_mdep_id))
4371 {
4372 p_mdl->extra.peer_mdep_id = BTA_HL_INVALID_MDEP_ID;
4373 }
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004374 BTIF_TRACE_DEBUG("%s app_idx=%d item_idx=%d mld_id=0x%x",
Priti Agheraf8f30c22013-04-02 15:31:19 -07004375 __FUNCTION__, app_idx, item_idx, p_mdl->base.mdl_id);
4376 evt_param.update_mdl.app_idx = app_idx;
4377 len = sizeof(btif_hl_update_mdl_t);
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004378 BTIF_TRACE_DEBUG("send BTIF_HL_UPDATE_MDL event app_idx=%d ",app_idx);
Priti Agheraf8f30c22013-04-02 15:31:19 -07004379 if ((bt_status = btif_transfer_context (btif_hl_proc_cb_evt, BTIF_HL_UPDATE_MDL,
4380 (char*) &evt_param, len, NULL)) == BT_STATUS_SUCCESS)
4381 {
4382 success = TRUE;
4383 }
4384 ASSERTC(bt_status == BT_STATUS_SUCCESS, "context transfer failed", bt_status);
4385 }
4386 }
4387 }
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004388 BTIF_TRACE_DEBUG("%s success=%d ",__FUNCTION__, success );
Priti Agheraf8f30c22013-04-02 15:31:19 -07004389
4390 return success;
4391}
4392
4393/*******************************************************************************
4394**
4395** Function btif_hl_delete_mdl_cfg
4396**
4397** Description Delete the MDL configuration
4398**
4399** Returns BOOLEAN
4400**
4401*******************************************************************************/
4402BOOLEAN btif_hl_delete_mdl_cfg(UINT8 mdep_id, UINT8 item_idx){
4403 btif_hl_mdl_cfg_t *p_mdl=NULL;
4404 BOOLEAN success = FALSE;
4405 btif_hl_app_cb_t *p_acb;
4406 UINT8 app_idx, len;
4407 bt_status_t bt_status;
4408 btif_hl_evt_cb_t evt_param;
4409
4410 if(btif_hl_find_app_idx_using_mdepId(mdep_id,&app_idx))
4411 {
4412
4413 p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
4414
4415 p_mdl = BTIF_HL_GET_MDL_CFG_PTR(app_idx, item_idx);
4416 if (p_mdl)
4417 {
4418 memset(p_mdl, 0, sizeof(btif_hl_mdl_cfg_t));
4419 evt_param.update_mdl.app_idx = app_idx;
4420 len = sizeof(btif_hl_update_mdl_t);
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004421 BTIF_TRACE_DEBUG("send BTIF_HL_UPDATE_MDL event app_idx=%d ",app_idx);
Priti Agheraf8f30c22013-04-02 15:31:19 -07004422 if ((bt_status = btif_transfer_context (btif_hl_proc_cb_evt, BTIF_HL_UPDATE_MDL,
4423 (char*) &evt_param, len, NULL)) == BT_STATUS_SUCCESS)
4424 {
4425 success = TRUE;
4426 }
4427 ASSERTC(bt_status == BT_STATUS_SUCCESS, "context transfer failed", bt_status);
4428 }
4429 }
4430
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004431 BTIF_TRACE_DEBUG("%s success=%d ",__FUNCTION__, success );
Priti Agheraf8f30c22013-04-02 15:31:19 -07004432 return success;
4433}
4434
4435/*******************************************************************************
4436**
The Android Open Source Project5738f832012-12-12 16:00:35 -08004437** Function init
4438**
4439** Description initializes the hl interface
4440**
4441** Returns bt_status_t
4442**
4443*******************************************************************************/
4444static bt_status_t init( bthl_callbacks_t* callbacks ){
4445 bt_status_t status = BT_STATUS_SUCCESS;
4446
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004447 BTIF_TRACE_EVENT("%s", __FUNCTION__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004448 btif_hl_display_calling_process_name();
4449 bt_hl_callbacks_cb = *callbacks;
4450 bt_hl_callbacks = &bt_hl_callbacks_cb;
4451 btif_hl_soc_thread_init();
Priti Agheraf8f30c22013-04-02 15:31:19 -07004452 reg_counter = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08004453 return status;
4454}
4455/*******************************************************************************
4456**
4457** Function cleanup
4458**
4459** Description Closes the HL interface
4460**
4461** Returns void
4462**
4463*******************************************************************************/
4464static void cleanup( void ){
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004465 BTIF_TRACE_EVENT("%s", __FUNCTION__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004466 btif_hl_display_calling_process_name();
4467 if (bt_hl_callbacks)
4468 {
4469 btif_disable_service(BTA_HDP_SERVICE_ID);
4470 bt_hl_callbacks = NULL;
Priti Agheraf8f30c22013-04-02 15:31:19 -07004471 reg_counter = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08004472 }
4473
4474 btif_hl_disable();
4475 btif_hl_close_select_thread();
4476}
4477
4478static const bthl_interface_t bthlInterface = {
Priti Agheraf8f30c22013-04-02 15:31:19 -07004479 sizeof(bthl_interface_t),
The Android Open Source Project5738f832012-12-12 16:00:35 -08004480 init,
4481 register_application,
4482 unregister_application,
4483 connect_channel,
4484 destroy_channel,
4485 cleanup,
4486};
4487
4488
4489/*******************************************************************************
4490**
4491** Function btif_hl_get_interface
4492**
4493** Description Get the hl callback interface
4494**
4495** Returns bthf_interface_t
4496**
4497*******************************************************************************/
4498const bthl_interface_t *btif_hl_get_interface(){
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004499 BTIF_TRACE_EVENT("%s", __FUNCTION__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004500 return &bthlInterface;
4501}
4502
4503/*******************************************************************************
4504**
4505** Function btif_hl_update_maxfd
4506**
4507** Description Update the max fd if the input fd is greater than the current max fd
4508**
4509** Returns int
4510**
4511*******************************************************************************/
4512int btif_hl_update_maxfd( int max_org_s){
4513 btif_hl_soc_cb_t *p_scb = NULL;
4514 int maxfd=0;
4515
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004516 BTIF_TRACE_DEBUG("btif_hl_update_maxfd max_org_s= %d", max_org_s);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004517
4518 maxfd = max_org_s;
4519 if (!GKI_queue_is_empty(&soc_queue))
4520 {
4521 p_scb = (btif_hl_soc_cb_t *)GKI_getfirst((void *)&soc_queue);
4522 if (maxfd < p_scb->max_s)
4523 {
4524 maxfd = p_scb->max_s;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004525 BTIF_TRACE_DEBUG("btif_hl_update_maxfd 1 maxfd=%d", maxfd);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004526 }
4527 while (p_scb != NULL)
4528 {
4529 if (maxfd < p_scb->max_s)
4530 {
4531 maxfd = p_scb->max_s;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004532 BTIF_TRACE_DEBUG("btif_hl_update_maxfd 2 maxfd=%d", maxfd);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004533 }
4534 p_scb = (btif_hl_soc_cb_t *)GKI_getnext((void *)p_scb );
4535 }
4536 }
4537
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004538 BTIF_TRACE_DEBUG("btif_hl_update_maxfd final *p_max_s=%d", maxfd);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004539 return maxfd;
4540}
4541/*******************************************************************************
4542**
4543** Function btif_hl_get_socket_state
4544**
4545** Description get socket state
4546**
4547** Returns btif_hl_soc_state_t
4548**
4549*******************************************************************************/
4550btif_hl_soc_state_t btif_hl_get_socket_state(btif_hl_soc_cb_t *p_scb){
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004551 BTIF_TRACE_DEBUG("btif_hl_get_socket_state state=%d", p_scb->state);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004552 return p_scb->state;
4553}
4554/*******************************************************************************
4555**
4556** Function btif_hl_set_socket_state
4557**
4558** Description set socket state
4559**
4560** Returns void
4561**
4562*******************************************************************************/
4563void btif_hl_set_socket_state(btif_hl_soc_cb_t *p_scb, btif_hl_soc_state_t new_state){
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004564 BTIF_TRACE_DEBUG("btif_hl_set_socket_state %d---->%d", p_scb->state, new_state);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004565 p_scb->state = new_state;
4566}
4567/*******************************************************************************
4568**
4569** Function btif_hl_release_mcl_sockets
4570**
4571** Description Release all sockets on the MCL
4572**
4573** Returns void
4574**
4575*******************************************************************************/
4576void btif_hl_release_mcl_sockets(UINT8 app_idx, UINT8 mcl_idx){
4577 btif_hl_soc_cb_t *p_scb = NULL;
4578 UINT8 i;
4579 btif_hl_mdl_cb_t *p_dcb;
4580 BOOLEAN found= FALSE;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004581 BTIF_TRACE_DEBUG("%s", __FUNCTION__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004582 for (i=0; i < BTA_HL_NUM_MDLS_PER_MCL ; i ++)
4583 {
4584 p_dcb = BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, i);
4585 if (p_dcb && p_dcb->in_use && p_dcb->p_scb)
4586 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004587 BTIF_TRACE_DEBUG("found socket for app_idx=%d mcl_id=%d, mdl_idx=%d", app_idx, mcl_idx, i);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004588 btif_hl_set_socket_state (p_dcb->p_scb, BTIF_HL_SOC_STATE_W4_REL);
4589 p_dcb->p_scb = NULL;
4590 found = TRUE;
4591 }
4592 }
4593 if (found)
4594 btif_hl_select_close_connected();
4595}
4596/*******************************************************************************
4597**
4598** Function btif_hl_release_socket
4599**
4600** Description release a specified socket
4601**
4602** Returns void
4603**
4604*******************************************************************************/
4605void btif_hl_release_socket(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx){
4606 btif_hl_soc_cb_t *p_scb = NULL;
4607 btif_hl_mdl_cb_t *p_dcb = BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
4608
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004609 BTIF_TRACE_DEBUG("%s", __FUNCTION__);
4610 BTIF_TRACE_DEBUG("app_idx=%d mcl_idx=%d mdl_idx=%d", app_idx, mcl_idx, mdl_idx );
The Android Open Source Project5738f832012-12-12 16:00:35 -08004611
4612 if (p_dcb && p_dcb->p_scb)
4613 {
4614 p_scb = p_dcb->p_scb;
4615 btif_hl_set_socket_state(p_scb, BTIF_HL_SOC_STATE_W4_REL);
4616 p_dcb->p_scb = NULL;
4617 btif_hl_select_close_connected();
4618 }
4619}
4620/*******************************************************************************
4621**
4622** Function btif_hl_create_socket
4623**
4624** Description create a socket
4625**
4626** Returns BOOLEAN
4627**
4628*******************************************************************************/
4629BOOLEAN btif_hl_create_socket(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx){
4630 btif_hl_mcl_cb_t *p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
4631 btif_hl_mdl_cb_t *p_dcb = BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
4632 btif_hl_soc_cb_t *p_scb = NULL;
4633 UINT8 soc_idx;
4634 BOOLEAN status = FALSE;
4635
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004636 BTIF_TRACE_DEBUG("%s", __FUNCTION__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004637
4638 if (p_dcb && ((p_scb = (btif_hl_soc_cb_t *)GKI_getbuf((UINT16)sizeof(btif_hl_soc_cb_t)))!=NULL))
4639 {
4640 if (socketpair(AF_UNIX, SOCK_STREAM, 0, p_scb->socket_id) >= 0)
4641 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004642 BTIF_TRACE_DEBUG("socket id[0]=%d id[1]=%d",p_scb->socket_id[0], p_scb->socket_id[1] );
The Android Open Source Project5738f832012-12-12 16:00:35 -08004643 p_dcb->p_scb = p_scb;
4644 p_scb->app_idx = app_idx;
4645 p_scb->mcl_idx = mcl_idx;
4646 p_scb->mdl_idx = mdl_idx;
4647 p_scb->channel_id = p_dcb->channel_id;
4648 p_scb->mdep_cfg_idx = p_dcb->local_mdep_cfg_idx;
4649 memcpy(p_scb->bd_addr, p_mcb->bd_addr,sizeof(BD_ADDR));
4650 btif_hl_set_socket_state(p_scb, BTIF_HL_SOC_STATE_W4_ADD);
4651 p_scb->max_s = p_scb->socket_id[1];
4652 GKI_enqueue(&soc_queue, (void *) p_scb);
4653 btif_hl_select_wakeup();
4654 status = TRUE;
4655 }
4656 else
4657 {
4658
4659 btif_hl_free_buf((void **)&p_scb);
4660 }
4661 }
4662
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004663 BTIF_TRACE_DEBUG("%s status=%d", __FUNCTION__, status);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004664 return status;
4665}
4666/*******************************************************************************
4667**
4668** Function btif_hl_add_socket_to_set
4669**
4670** Description Add a socket
4671**
4672** Returns void
4673**
4674*******************************************************************************/
4675void btif_hl_add_socket_to_set( fd_set *p_org_set){
4676 btif_hl_soc_cb_t *p_scb = NULL;
4677 btif_hl_mdl_cb_t *p_dcb = NULL;
4678 btif_hl_mcl_cb_t *p_mcb = NULL;
Priti Agheraf8f30c22013-04-02 15:31:19 -07004679 btif_hl_app_cb_t *p_acb = NULL;
The Android Open Source Project5738f832012-12-12 16:00:35 -08004680 btif_hl_evt_cb_t evt_param;
4681 bt_status_t status;
4682 int len;
4683
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004684 BTIF_TRACE_DEBUG("entering %s",__FUNCTION__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004685
4686 if (!GKI_queue_is_empty(&soc_queue))
4687 {
4688 p_scb = (btif_hl_soc_cb_t *)GKI_getfirst((void *)&soc_queue);
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004689 BTIF_TRACE_DEBUG("btif_hl_add_socket_to_set first p_scb=0x%x", p_scb);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004690 while (p_scb != NULL)
4691 {
4692 if (btif_hl_get_socket_state(p_scb) == BTIF_HL_SOC_STATE_W4_ADD)
4693 {
4694 btif_hl_set_socket_state(p_scb, BTIF_HL_SOC_STATE_W4_READ);
4695 FD_SET(p_scb->socket_id[1], p_org_set);
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004696 BTIF_TRACE_DEBUG("found and set socket_id=%d is_set=%d", p_scb->socket_id[1], FD_ISSET(p_scb->socket_id[1], p_org_set));
The Android Open Source Project5738f832012-12-12 16:00:35 -08004697 p_mcb = BTIF_HL_GET_MCL_CB_PTR(p_scb->app_idx, p_scb->mcl_idx);
4698 p_dcb = BTIF_HL_GET_MDL_CB_PTR(p_scb->app_idx, p_scb->mcl_idx, p_scb->mdl_idx);
Priti Agheraf8f30c22013-04-02 15:31:19 -07004699 p_acb = BTIF_HL_GET_APP_CB_PTR(p_scb->app_idx);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004700 if (p_mcb && p_dcb)
4701 {
Priti Agheraf8f30c22013-04-02 15:31:19 -07004702 btif_hl_stop_timer_using_handle(p_mcb->mcl_handle);
4703 evt_param.chan_cb.app_id = p_acb->app_id;
The Android Open Source Project5738f832012-12-12 16:00:35 -08004704 memcpy(evt_param.chan_cb.bd_addr, p_mcb->bd_addr, sizeof(BD_ADDR));
4705 evt_param.chan_cb.channel_id = p_dcb->channel_id;
4706 evt_param.chan_cb.fd = p_scb->socket_id[0];
4707 evt_param.chan_cb.mdep_cfg_index = (int ) p_dcb->local_mdep_cfg_idx;
4708 evt_param.chan_cb.cb_state = BTIF_HL_CHAN_CB_STATE_CONNECTED_PENDING;
4709 len = sizeof(btif_hl_send_chan_state_cb_t);
4710 status = btif_transfer_context (btif_hl_proc_cb_evt, BTIF_HL_SEND_CONNECTED_CB,
4711 (char*) &evt_param, len, NULL);
4712 ASSERTC(status == BT_STATUS_SUCCESS, "context transfer failed", status);
4713 }
4714 }
4715 p_scb = (btif_hl_soc_cb_t *)GKI_getnext((void *)p_scb );
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004716 BTIF_TRACE_DEBUG("next p_scb=0x%x", p_scb);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004717 }
4718 }
4719
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004720 BTIF_TRACE_DEBUG("leaving %s",__FUNCTION__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004721}
4722/*******************************************************************************
4723**
4724** Function btif_hl_close_socket
4725**
4726** Description close a socket
4727**
4728** Returns void
4729**
4730*******************************************************************************/
4731void btif_hl_close_socket( fd_set *p_org_set){
4732 btif_hl_soc_cb_t *p_scb = NULL;
4733 BOOLEAN element_removed = FALSE;
4734 btif_hl_mdl_cb_t *p_dcb = NULL ;
Priti Agheraf8f30c22013-04-02 15:31:19 -07004735 btif_hl_app_cb_t *p_acb = NULL ;
The Android Open Source Project5738f832012-12-12 16:00:35 -08004736 btif_hl_evt_cb_t evt_param;
4737 int len;
Priti Agheraf8f30c22013-04-02 15:31:19 -07004738 int app_idx;
The Android Open Source Project5738f832012-12-12 16:00:35 -08004739 bt_status_t status;
4740
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004741 BTIF_TRACE_DEBUG("entering %s",__FUNCTION__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004742 if (!GKI_queue_is_empty(&soc_queue))
4743 {
4744 p_scb = (btif_hl_soc_cb_t *)GKI_getfirst((void *)&soc_queue);
4745 while (p_scb != NULL)
4746 {
4747 if (btif_hl_get_socket_state(p_scb) == BTIF_HL_SOC_STATE_W4_REL)
4748 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004749 BTIF_TRACE_DEBUG("app_idx=%d mcl_id=%d, mdl_idx=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08004750 p_scb->app_idx, p_scb->mcl_idx, p_scb->mdl_idx);
4751 btif_hl_set_socket_state(p_scb, BTIF_HL_SOC_STATE_IDLE);
4752 if (p_scb->socket_id[1] != -1)
4753 {
4754 FD_CLR(p_scb->socket_id[1] , p_org_set);
4755 shutdown(p_scb->socket_id[1], SHUT_RDWR);
4756 close(p_scb->socket_id[1]);
4757
4758 evt_param.chan_cb.app_id = (int) btif_hl_get_app_id(p_scb->channel_id);
4759 memcpy(evt_param.chan_cb.bd_addr, p_scb->bd_addr, sizeof(BD_ADDR));
4760 evt_param.chan_cb.channel_id = p_scb->channel_id;
4761 evt_param.chan_cb.fd = p_scb->socket_id[0];
4762 evt_param.chan_cb.mdep_cfg_index = (int ) p_scb->mdep_cfg_idx;
4763 evt_param.chan_cb.cb_state = BTIF_HL_CHAN_CB_STATE_DISCONNECTED_PENDING;
4764 len = sizeof(btif_hl_send_chan_state_cb_t);
4765 status = btif_transfer_context (btif_hl_proc_cb_evt, BTIF_HL_SEND_DISCONNECTED_CB,
4766 (char*) &evt_param, len, NULL);
4767 ASSERTC(status == BT_STATUS_SUCCESS, "context transfer failed", status);
4768
4769
The Android Open Source Project5738f832012-12-12 16:00:35 -08004770 }
4771 }
4772 p_scb = (btif_hl_soc_cb_t *)GKI_getnext((void *)p_scb );
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004773 BTIF_TRACE_DEBUG("while loop next p_scb=0x%x", p_scb);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004774 }
4775
4776 p_scb = (btif_hl_soc_cb_t *)GKI_getfirst((void *)&soc_queue);
4777 while (p_scb != NULL)
4778 {
4779 if (btif_hl_get_socket_state(p_scb) == BTIF_HL_SOC_STATE_IDLE)
4780 {
4781 p_dcb = BTIF_HL_GET_MDL_CB_PTR(p_scb->app_idx, p_scb->mcl_idx, p_scb->mdl_idx);
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004782 BTIF_TRACE_DEBUG("idle socket app_idx=%d mcl_id=%d, mdl_idx=%d p_dcb->in_use=%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08004783 p_scb->app_idx, p_scb->mcl_idx, p_scb->mdl_idx, p_dcb->in_use);
4784 GKI_remove_from_queue((void *)&soc_queue, p_scb);
4785 btif_hl_free_buf((void **)&p_scb);
4786 p_dcb->p_scb = NULL;
4787 element_removed = TRUE;
4788 }
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004789 BTIF_TRACE_DEBUG("element_removed=%d p_scb=0x%x", element_removed, p_scb);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004790 if (element_removed)
4791 {
4792 element_removed = FALSE;
4793 p_scb = (btif_hl_soc_cb_t *)GKI_getfirst((void *)&soc_queue);
4794 }
4795 else
4796 p_scb = (btif_hl_soc_cb_t *)GKI_getnext((void *)p_scb );
4797
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004798 BTIF_TRACE_DEBUG("while loop p_scb=0x%x", p_scb);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004799 }
4800 }
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004801 BTIF_TRACE_DEBUG("leaving %s",__FUNCTION__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004802}
4803/*******************************************************************************
4804**
4805** Function btif_hl_select_wakeup_callback
4806**
4807** Description Select wakup callback to add or close a socket
4808**
4809** Returns void
4810**
4811*******************************************************************************/
4812
4813void btif_hl_select_wakeup_callback( fd_set *p_org_set , int wakeup_signal){
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004814 BTIF_TRACE_DEBUG("entering %s wakeup_signal=0x%04x",__FUNCTION__, wakeup_signal);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004815
4816 if (wakeup_signal == btif_hl_signal_select_wakeup )
4817 {
4818 btif_hl_add_socket_to_set(p_org_set);
4819 }
4820 else if (wakeup_signal == btif_hl_signal_select_close_connected)
4821 {
4822 btif_hl_close_socket(p_org_set);
4823 }
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004824 BTIF_TRACE_DEBUG("leaving %s",__FUNCTION__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004825}
4826
4827/*******************************************************************************
4828**
4829** Function btif_hl_select_monitor_callback
4830**
4831** Description Select monitor callback to check pending socket actions
4832**
4833** Returns void
4834**
4835*******************************************************************************/
4836void btif_hl_select_monitor_callback( fd_set *p_cur_set , fd_set *p_org_set){
4837 btif_hl_soc_cb_t *p_scb = NULL;
4838 btif_hl_mdl_cb_t *p_dcb = NULL;
4839 int r;
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08004840 UNUSED(p_org_set);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004841
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004842 BTIF_TRACE_DEBUG("entering %s",__FUNCTION__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004843
4844 if (!GKI_queue_is_empty(&soc_queue))
4845 {
4846 p_scb = (btif_hl_soc_cb_t *)GKI_getfirst((void *)&soc_queue);
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004847 BTIF_TRACE_DEBUG(" GKI queue is not empty ");
The Android Open Source Project5738f832012-12-12 16:00:35 -08004848 while (p_scb != NULL)
4849 {
4850 if (btif_hl_get_socket_state(p_scb) == BTIF_HL_SOC_STATE_W4_READ)
4851 {
4852 if (FD_ISSET(p_scb->socket_id[1], p_cur_set))
4853 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004854 BTIF_TRACE_DEBUG("read data");
4855 BTIF_TRACE_DEBUG("state= BTIF_HL_SOC_STATE_W4_READ");
The Android Open Source Project5738f832012-12-12 16:00:35 -08004856 p_dcb = BTIF_HL_GET_MDL_CB_PTR(p_scb->app_idx, p_scb->mcl_idx, p_scb->mdl_idx);
4857 if (p_dcb->p_tx_pkt)
4858 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004859 BTIF_TRACE_ERROR("Rcv new pkt but the last pkt is still not been sent tx_size=%d", p_dcb->tx_size);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004860 btif_hl_free_buf((void **) &p_dcb->p_tx_pkt);
4861 }
4862 p_dcb->p_tx_pkt = btif_hl_get_buf (p_dcb->mtu);
4863 if (p_dcb )
4864 {
4865 //do
4866 // {
4867 // r = recv(p_scb->socket_id[1], p_dcb->p_tx_pkt, p_dcb->mtu , MSG_DONTWAIT));
4868 // } while (r == SOCKET_ERROR && errno == EINTR);
4869
4870 if ((r = (int)recv(p_scb->socket_id[1], p_dcb->p_tx_pkt, p_dcb->mtu , MSG_DONTWAIT)) > 0)
4871 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004872 BTIF_TRACE_DEBUG("btif_hl_select_monitor_callback send data r =%d", r);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004873 p_dcb->tx_size = r;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004874 BTIF_TRACE_DEBUG("btif_hl_select_monitor_callback send data tx_size=%d", p_dcb->tx_size );
The Android Open Source Project5738f832012-12-12 16:00:35 -08004875 BTA_HlSendData(p_dcb->mdl_handle, p_dcb->tx_size );
4876 }
4877
4878 if (r <= 0 )
4879 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004880 BTIF_TRACE_DEBUG("btif_hl_select_monitor_callback receive failed r=%d",r);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004881 BTA_HlDchClose(p_dcb->mdl_handle );
4882 }
4883 }
4884 }
4885 }
4886 p_scb = (btif_hl_soc_cb_t *)GKI_getnext((void *)p_scb );
4887 }
4888 }
4889 else
4890 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004891 BTIF_TRACE_DEBUG("btif_hl_select_monitor_queue is empty");
The Android Open Source Project5738f832012-12-12 16:00:35 -08004892 }
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004893 BTIF_TRACE_DEBUG("leaving %s",__FUNCTION__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08004894}
4895/*******************************************************************************
4896**
4897** Function btif_hl_select_wakeup_init
4898**
4899** Description select loop wakup init
4900**
4901** Returns int
4902**
4903*******************************************************************************/
4904static inline int btif_hl_select_wakeup_init(fd_set* set){
Sharvil Nanavatie3eecc12014-07-02 00:13:07 -07004905 BTIF_TRACE_DEBUG("%s", __func__);
git-zhenye.broadcom.combf0ce822014-06-19 17:28:53 -07004906 if (signal_fds[0] == -1 && socketpair(AF_UNIX, SOCK_STREAM, 0, signal_fds) < 0)
The Android Open Source Project5738f832012-12-12 16:00:35 -08004907 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004908 BTIF_TRACE_ERROR("socketpair failed: %s", strerror(errno));
The Android Open Source Project5738f832012-12-12 16:00:35 -08004909 return -1;
4910 }
4911
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004912 BTIF_TRACE_DEBUG("btif_hl_select_wakeup_init signal_fds[0]=%d signal_fds[1]=%d",signal_fds[0], signal_fds[1] );
The Android Open Source Project5738f832012-12-12 16:00:35 -08004913 FD_SET(signal_fds[0], set);
4914
4915 return signal_fds[0];
4916}
4917
4918/*******************************************************************************
4919**
4920** Function btif_hl_select_wakeup
4921**
4922** Description send a signal to wakupo the select loop
4923**
4924** Returns int
4925**
4926*******************************************************************************/
4927static inline int btif_hl_select_wakeup(void){
4928 char sig_on = btif_hl_signal_select_wakeup;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004929 BTIF_TRACE_DEBUG("btif_hl_select_wakeup");
The Android Open Source Project5738f832012-12-12 16:00:35 -08004930 return send(signal_fds[1], &sig_on, sizeof(sig_on), 0);
4931}
4932
4933/*******************************************************************************
4934**
4935** Function btif_hl_select_close_connected
4936**
4937** Description send a signal to close a socket
4938**
4939** Returns int
4940**
4941*******************************************************************************/
4942static inline int btif_hl_select_close_connected(void){
4943 char sig_on = btif_hl_signal_select_close_connected;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004944 BTIF_TRACE_DEBUG("btif_hl_select_close_connected");
The Android Open Source Project5738f832012-12-12 16:00:35 -08004945 return send(signal_fds[1], &sig_on, sizeof(sig_on), 0);
4946}
4947
4948/*******************************************************************************
4949**
4950** Function btif_hl_close_select_thread
4951**
4952** Description send signal to close the thread and then close all signal FDs
4953**
4954** Returns int
4955**
4956*******************************************************************************/
4957static inline int btif_hl_close_select_thread(void)
4958{
4959 int result = 0;
4960 char sig_on = btif_hl_signal_select_exit;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004961 BTIF_TRACE_DEBUG("btif_hl_signal_select_exit");
The Android Open Source Project5738f832012-12-12 16:00:35 -08004962 result = send(signal_fds[1], &sig_on, sizeof(sig_on), 0);
Ganesh Ganapathi Battaf7083df2014-04-28 16:25:52 -07004963 if (btif_is_enabled())
4964 {
4965 /* Wait for the select_thread_id to exit if BT is still enabled
4966 and only this profile getting cleaned up*/
4967 if (select_thread_id != -1) {
4968 pthread_join(select_thread_id, NULL);
4969 select_thread_id = -1;
4970 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08004971 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08004972 return result;
4973}
4974
4975/*******************************************************************************
4976**
4977** Function btif_hl_select_wake_reset
4978**
4979** Description clear the received signal for the select loop
4980**
4981** Returns int
4982**
4983*******************************************************************************/
4984static inline int btif_hl_select_wake_reset(void){
4985 char sig_recv = 0;
4986
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07004987 BTIF_TRACE_DEBUG("btif_hl_select_wake_reset");
The Android Open Source Project5738f832012-12-12 16:00:35 -08004988 recv(signal_fds[0], &sig_recv, sizeof(sig_recv), MSG_WAITALL);
4989 return(int)sig_recv;
4990}
4991/*******************************************************************************
4992**
4993** Function btif_hl_select_wake_signaled
4994**
4995** Description check whether a fd is set or not
4996**
4997** Returns int
4998**
4999*******************************************************************************/
5000static inline int btif_hl_select_wake_signaled(fd_set* set){
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005001 BTIF_TRACE_DEBUG("btif_hl_select_wake_signaled");
The Android Open Source Project5738f832012-12-12 16:00:35 -08005002 return FD_ISSET(signal_fds[0], set);
5003}
5004/*******************************************************************************
5005**
5006** Function btif_hl_thread_cleanup
5007**
5008** Description shut down and clean up the select loop
5009**
5010** Returns void
5011**
5012*******************************************************************************/
5013static void btif_hl_thread_cleanup(){
5014 if (listen_s != -1)
5015 close(listen_s);
5016 if (connected_s != -1)
5017 {
5018 shutdown(connected_s, SHUT_RDWR);
5019 close(connected_s);
5020 }
5021 listen_s = connected_s = -1;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005022 BTIF_TRACE_DEBUG("hl thread cleanup");
The Android Open Source Project5738f832012-12-12 16:00:35 -08005023}
5024/*******************************************************************************
5025**
5026** Function btif_hl_select_thread
5027**
5028** Description the select loop
5029**
5030** Returns void
5031**
5032*******************************************************************************/
5033static void *btif_hl_select_thread(void *arg){
5034 fd_set org_set, curr_set;
5035 int r, max_curr_s, max_org_s;
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08005036 UNUSED(arg);
The Android Open Source Project5738f832012-12-12 16:00:35 -08005037
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005038 BTIF_TRACE_DEBUG("entered btif_hl_select_thread");
The Android Open Source Project5738f832012-12-12 16:00:35 -08005039 FD_ZERO(&org_set);
5040 max_org_s = btif_hl_select_wakeup_init(&org_set);
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005041 BTIF_TRACE_DEBUG("max_s=%d ", max_org_s);
The Android Open Source Project5738f832012-12-12 16:00:35 -08005042
5043 for (;;)
5044 {
5045 r = 0;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005046 BTIF_TRACE_DEBUG("set curr_set = org_set ");
The Android Open Source Project5738f832012-12-12 16:00:35 -08005047 curr_set = org_set;
5048 max_curr_s = max_org_s;
5049 int ret = select((max_curr_s + 1), &curr_set, NULL, NULL, NULL);
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005050 BTIF_TRACE_DEBUG("select unblocked ret=%d", ret);
The Android Open Source Project5738f832012-12-12 16:00:35 -08005051 if (ret == -1)
5052 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005053 BTIF_TRACE_DEBUG("select() ret -1, exit the thread");
The Android Open Source Project5738f832012-12-12 16:00:35 -08005054 btif_hl_thread_cleanup();
5055 select_thread_id = -1;
5056 return 0;
5057 }
5058 else if (ret)
5059 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005060 BTIF_TRACE_DEBUG("btif_hl_select_wake_signaled, signal ret=%d", ret);
The Android Open Source Project5738f832012-12-12 16:00:35 -08005061 if (btif_hl_select_wake_signaled(&curr_set))
5062 {
5063 r = btif_hl_select_wake_reset();
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005064 BTIF_TRACE_DEBUG("btif_hl_select_wake_signaled, signal:%d", r);
The Android Open Source Project5738f832012-12-12 16:00:35 -08005065 if (r == btif_hl_signal_select_wakeup || r == btif_hl_signal_select_close_connected )
5066 {
5067 btif_hl_select_wakeup_callback(&org_set, r);
5068 }
5069 else if( r == btif_hl_signal_select_exit)
5070 {
5071 btif_hl_thread_cleanup();
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005072 BTIF_TRACE_DEBUG("Exit hl_select_thread for btif_hl_signal_select_exit");
The Android Open Source Project5738f832012-12-12 16:00:35 -08005073 return 0;
5074 }
5075 }
5076
5077 btif_hl_select_monitor_callback(&curr_set, &org_set);
5078 max_org_s = btif_hl_update_maxfd(max_org_s);
5079 }
5080 else
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005081 BTIF_TRACE_DEBUG("no data, select ret: %d\n", ret);
The Android Open Source Project5738f832012-12-12 16:00:35 -08005082 }
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005083 BTIF_TRACE_DEBUG("leaving hl_select_thread");
The Android Open Source Project5738f832012-12-12 16:00:35 -08005084 return 0;
5085}
5086
5087/*******************************************************************************
5088**
5089** Function create_thread
5090**
5091** Description creat a select loop
5092**
5093** Returns pthread_t
5094**
5095*******************************************************************************/
5096static inline pthread_t create_thread(void *(*start_routine)(void *), void * arg){
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005097 BTIF_TRACE_DEBUG("create_thread: entered");
The Android Open Source Project5738f832012-12-12 16:00:35 -08005098 pthread_attr_t thread_attr;
5099
5100 pthread_attr_init(&thread_attr);
5101 pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_JOINABLE);
5102 pthread_t thread_id = -1;
5103 if ( pthread_create(&thread_id, &thread_attr, start_routine, arg)!=0 )
5104 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005105 BTIF_TRACE_ERROR("pthread_create : %s", strerror(errno));
The Android Open Source Project5738f832012-12-12 16:00:35 -08005106 return -1;
5107 }
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005108 BTIF_TRACE_DEBUG("create_thread: thread created successfully");
The Android Open Source Project5738f832012-12-12 16:00:35 -08005109 return thread_id;
5110}
5111
5112/*******************************************************************************
5113**
5114** Function btif_hl_soc_thread_init
5115**
5116** Description HL select loop init function.
5117**
5118** Returns void
5119**
5120*******************************************************************************/
5121void btif_hl_soc_thread_init(void){
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005122 BTIF_TRACE_DEBUG("%s", __FUNCTION__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08005123 GKI_init_q(&soc_queue);
5124 select_thread_id = create_thread(btif_hl_select_thread, NULL);
5125}
5126/*******************************************************************************
5127**
5128** Function btif_hl_load_mdl_config
5129**
5130** Description load the MDL configuation from the application control block
5131**
5132** Returns BOOLEAN
5133**
5134*******************************************************************************/
5135BOOLEAN btif_hl_load_mdl_config (UINT8 app_id, UINT8 buffer_size,
5136 tBTA_HL_MDL_CFG *p_mdl_buf ){
5137 UINT8 app_idx;
5138 BOOLEAN result = FALSE;
5139 btif_hl_app_cb_t *p_acb;
5140 tBTA_HL_MDL_CFG *p;
5141 int i;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005142 BTIF_TRACE_DEBUG("%s", __FUNCTION__);
The Android Open Source Project5738f832012-12-12 16:00:35 -08005143
5144 if (btif_hl_find_app_idx(app_id, &app_idx))
5145 {
5146 p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
5147 for (i=0, p=p_mdl_buf; i<buffer_size; i++, p++)
5148 {
5149 memcpy(p, &p_acb->mdl_cfg[i].base, sizeof(tBTA_HL_MDL_CFG));
5150 }
5151 result = TRUE;
5152 }
5153
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07005154 BTIF_TRACE_DEBUG("result=%d", result);
The Android Open Source Project5738f832012-12-12 16:00:35 -08005155 return result;
5156}