• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /******************************************************************************
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 
61 #define MAX_DATATYPE_SUPPORTED 8
62 
63 extern int btif_hl_update_maxfd( int max_org_s);
64 extern void btif_hl_select_monitor_callback( fd_set *p_cur_set, fd_set *p_org_set );
65 extern void btif_hl_select_wakeup_callback( fd_set *p_org_set , int wakeup_signal );
66 extern int btif_hl_update_maxfd( int max_org_s);
67 extern void btif_hl_select_monitor_callback( fd_set *p_cur_set, fd_set *p_org_set );
68 extern void btif_hl_select_wakeup_callback( fd_set *p_org_set , int wakeup_signal );
69 extern void btif_hl_soc_thread_init(void);
70 extern void btif_hl_release_mcl_sockets(UINT8 app_idx, UINT8 mcl_idx);
71 extern BOOLEAN btif_hl_create_socket(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx);
72 extern void btif_hl_release_socket(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx);
73 
74 btif_hl_cb_t btif_hl_cb;
75 btif_hl_cb_t *p_btif_hl_cb = &btif_hl_cb;
76 
77 /************************************************************************************
78 **  Static variables
79 ************************************************************************************/
80 static bthl_callbacks_t  bt_hl_callbacks_cb;
81 static bthl_callbacks_t *bt_hl_callbacks=NULL;
82 
83 /* signal socketpair to wake up select loop */
84 
85 const int btif_hl_signal_select_wakeup = 1;
86 const int btif_hl_signal_select_exit = 2;
87 const int btif_hl_signal_select_close_connected = 3;
88 
89 static int listen_s = -1;
90 static int connected_s = -1;
91 static int select_thread_id = -1;
92 static int signal_fds[2];
93 static BUFFER_Q soc_queue;
94 static int reg_counter;
95 
96 static inline int btif_hl_select_wakeup(void);
97 static inline int btif_hl_select_exit(void);
98 static inline int btif_hl_select_close_connected(void);
99 static inline int btif_hl_close_select_thread(void);
100 static UINT8 btif_hl_get_next_app_id(void);
101 static int btif_hl_get_next_channel_id(UINT8 app_id);
102 static void btif_hl_init_next_app_id(void);
103 static void btif_hl_init_next_channel_id(void);
104 static void btif_hl_ctrl_cback(tBTA_HL_CTRL_EVT event, tBTA_HL_CTRL *p_data);
105 static void btif_hl_set_state(btif_hl_state_t state);
106 static btif_hl_state_t btif_hl_get_state(void);
107 static void btif_hl_cback(tBTA_HL_EVT event, tBTA_HL *p_data);
108 static void btif_hl_proc_cb_evt(UINT16 event, char* p_param);
109 
110 #define CHECK_CALL_CBACK(P_CB, P_CBACK, ...)\
111     if (P_CB && P_CB->P_CBACK) {            \
112         P_CB->P_CBACK(__VA_ARGS__);         \
113     }                                       \
114     else {                                  \
115         ASSERTC(0, "Callback is NULL", 0);  \
116     }
117 
118 
119 #define BTIF_HL_CALL_CBACK(P_CB, P_CBACK, ...)\
120      if((p_btif_hl_cb->state != BTIF_HL_STATE_DISABLING) &&\
121          (p_btif_hl_cb->state != BTIF_HL_STATE_DISABLED))  \
122      {                                                     \
123         if (P_CB && P_CB->P_CBACK) {                       \
124             P_CB->P_CBACK(__VA_ARGS__);                    \
125         }                                                  \
126         else {                                             \
127             ASSERTC(0, "Callback is NULL", 0);             \
128         }                                                  \
129     }
130 
131 
132 #define CHECK_BTHL_INIT() if (bt_hl_callbacks == NULL)\
133     {\
134         BTIF_TRACE_WARNING1("BTHL: %s: BTHL not initialized", __FUNCTION__);\
135         return BT_STATUS_NOT_READY;\
136     }\
137     else\
138     {\
139         BTIF_TRACE_EVENT1("BTHL: %s", __FUNCTION__);\
140     }
141 
142 
143 static const btif_hl_data_type_cfg_t data_type_table[] = {
144     /* Data Specilization                   Ntx     Nrx (from Bluetooth SIG's HDP whitepaper)*/
145     {BTIF_HL_DATA_TYPE_PULSE_OXIMETER,      9216,   256},
146     {BTIF_HL_DATA_TYPE_BLOOD_PRESSURE_MON,  896,    224},
147     {BTIF_HL_DATA_TYPE_BODY_THERMOMETER,    896,    224},
148     {BTIF_HL_DATA_TYPE_BODY_WEIGHT_SCALE,   896,    224},
149     {BTIF_HL_DATA_TYPE_GLUCOSE_METER,       896,    224},
150     {BTIF_HL_DATA_TYPE_STEP_COUNTER,        6624,   224}
151 };
152 
153 #define BTIF_HL_DATA_TABLE_SIZE  (sizeof(data_type_table) / sizeof(btif_hl_data_type_cfg_t))
154 #define BTIF_HL_DEFAULT_SRC_TX_APDU_SIZE   10240 /* use this size if the data type is not
155                                                     defined in the table; for future proof */
156 #define BTIF_HL_DEFAULT_SRC_RX_APDU_SIZE   512  /* use this size if the data type is not
157                                                    defined in the table; for future proof */
158 
159 #define BTIF_HL_ECHO_MAX_TX_RX_APDU_SIZE 1024
160 
161 /************************************************************************************
162 **  Static utility functions
163 ************************************************************************************/
164 
165 #define BTIF_IF_GET_NAME 16
btif_hl_display_calling_process_name(void)166 void btif_hl_display_calling_process_name(void)
167 {
168     char name[16];
169     prctl(BTIF_IF_GET_NAME, name, 0, 0, 0);
170     BTIF_TRACE_DEBUG1("Process name (%s)", name);
171 }
172 #define BTIF_TIMEOUT_CCH_NO_DCH_SECS   30
173 /*******************************************************************************
174 **
175 ** Function      btif_hl_if_channel_setup_pending
176 **
177 ** Description   check whether channel id is in setup pending state or not
178 **
179 ** Returns      BOOLEAN
180 **
181 *******************************************************************************/
btif_hl_if_channel_setup_pending(int channel_id,UINT8 * p_app_idx,UINT8 * p_mcl_idx)182 BOOLEAN btif_hl_if_channel_setup_pending(int channel_id, UINT8 *p_app_idx, UINT8 *p_mcl_idx)
183 {
184     btif_hl_app_cb_t    *p_acb;
185     btif_hl_mcl_cb_t    *p_mcb;
186     UINT8 i, j;
187     BOOLEAN found=FALSE;
188     for (i=0; i < BTA_HL_NUM_APPS ; i ++)
189     {
190         p_acb  =BTIF_HL_GET_APP_CB_PTR(i);
191         if (p_acb->in_use)
192         {
193             for (j=0; j< BTA_HL_NUM_MCLS; j++)
194             {
195                 p_mcb = BTIF_HL_GET_MCL_CB_PTR(i, j);
196                 if (p_mcb->in_use &&
197                     p_mcb->is_connected && p_mcb->pcb.channel_id == channel_id )
198                 {
199                     found = TRUE;
200                     *p_app_idx = i;
201                     *p_mcl_idx = j;
202                     break;
203                 }
204             }
205         }
206         if (found)
207             break;
208     }
209     BTIF_TRACE_DEBUG5("%s found=%d channel_id=0x%08x",
210                       __FUNCTION__, found, channel_id, *p_app_idx, *p_mcl_idx);
211     return found;
212 
213 }
214 /*******************************************************************************
215 **
216 ** Function      btif_hl_num_dchs_in_use
217 **
218 ** Description find number of DCHs in use
219 **
220 ** Returns      UINT8
221 *******************************************************************************/
btif_hl_num_dchs_in_use(UINT8 mcl_handle)222 UINT8 btif_hl_num_dchs_in_use(UINT8 mcl_handle){
223 
224     btif_hl_app_cb_t    * p_acb;
225     btif_hl_mcl_cb_t    *p_mcb;
226     UINT8               i,j,x;
227     UINT8               cnt=0;
228 
229     for (i=0; i<BTA_HL_NUM_APPS; i++)
230     {
231         BTIF_TRACE_DEBUG1("btif_hl_num_dchs:i = %d",i);
232         p_acb =BTIF_HL_GET_APP_CB_PTR(i);
233         if (p_acb && p_acb->in_use)
234         {
235             for (j=0; j < BTA_HL_NUM_MCLS ; j++)
236             {
237                 if(p_acb->mcb[j].in_use)
238                     BTIF_TRACE_DEBUG3("btif_hl_num_dchs:mcb in use j=%d, mcl_handle=%d,mcb handle=%d",
239                                         j,mcl_handle, p_acb->mcb[j].mcl_handle);
240                 if (p_acb->mcb[j].in_use &&
241                     (p_acb->mcb[j].mcl_handle == mcl_handle))
242                 {
243                     p_mcb = &p_acb->mcb[j];
244                     BTIF_TRACE_DEBUG1("btif_hl_num_dchs: mcl handle found j =%d",j);
245                     for (x=0; x < BTA_HL_NUM_MDLS_PER_MCL ; x ++)
246                     {
247                         if (p_mcb->mdl[x].in_use)
248                         {
249                             BTIF_TRACE_DEBUG1("btif_hl_num_dchs_in_use:found x =%d",x);
250                             cnt++;
251                         }
252                     }
253                 }
254             }
255         }
256     }
257 
258     BTIF_TRACE_DEBUG2("%s dch in use count=%d", __FUNCTION__, cnt);
259     return cnt;
260 }
261 /*******************************************************************************
262 **
263 ** Function      btif_hl_tmr_hdlr
264 **
265 ** Description   Process timer timeout
266 **
267 ** Returns      void
268 *******************************************************************************/
btif_hl_tmr_hdlr(TIMER_LIST_ENT * tle)269 void btif_hl_tmr_hdlr(TIMER_LIST_ENT *tle)
270 {
271     btif_hl_mcl_cb_t    *p_mcb;
272     UINT8               i,j;
273     BTIF_TRACE_DEBUG2("%s timer_in_use=%d",  __FUNCTION__, tle->in_use );
274 
275     for (i=0; i < BTA_HL_NUM_APPS ; i ++)
276     {
277         for (j=0; j< BTA_HL_NUM_MCLS; j++)
278         {
279             p_mcb =BTIF_HL_GET_MCL_CB_PTR(i,j);
280 
281             if (p_mcb->cch_timer_active)
282             {
283                 BTIF_TRACE_DEBUG3("%app_idx=%d, mcl_idx=%d mcl-connected=%d",
284                                   i, j,  p_mcb->is_connected);
285                 p_mcb->cch_timer_active = FALSE;
286                 if (p_mcb->is_connected)
287                 {
288                     BTIF_TRACE_DEBUG3("Idle timeout Close CCH app_idx=%d mcl_idx=%d mcl_handle=%d",
289                                       i ,j, p_mcb->mcl_handle);
290                     BTA_HlCchClose(p_mcb->mcl_handle);
291                 }
292                 else
293                 {
294                     BTIF_TRACE_DEBUG2("CCH idle timeout But CCH not connected app_idx=%d mcl_idx=%d ",i,j);
295                 }
296             }
297         }
298     }
299 }
300 /*******************************************************************************
301 **
302 ** Function      btif_hl_stop_cch_timer
303 **
304 ** Description  stop CCH timer
305 **
306 ** Returns      void
307 *******************************************************************************/
btif_hl_stop_cch_timer(UINT8 app_idx,UINT8 mcl_idx)308 void btif_hl_stop_cch_timer(UINT8 app_idx, UINT8 mcl_idx)
309 {
310     btif_hl_mcl_cb_t    *p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
311     BTIF_TRACE_DEBUG4("%s app_idx=%d, mcl_idx=%d timer_in_use=%d",
312                       __FUNCTION__,app_idx, mcl_idx, p_mcb->cch_timer.in_use);
313 
314     p_mcb->cch_timer_active = FALSE;
315     if (p_mcb->cch_timer.in_use)
316     {
317         BTIF_TRACE_DEBUG0("stop CCH timer ");
318         btu_stop_timer(&p_mcb->cch_timer);
319     }
320 }
321 /*******************************************************************************
322 **
323 ** Function      btif_hl_start_cch_timer
324 **
325 ** Description  start CCH timer
326 **
327 ** Returns      void
328 *******************************************************************************/
btif_hl_start_cch_timer(UINT8 app_idx,UINT8 mcl_idx)329 void btif_hl_start_cch_timer(UINT8 app_idx, UINT8 mcl_idx)
330 {
331     btif_hl_mcl_cb_t    *p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
332     BTIF_TRACE_DEBUG5("%s app_idx=%d, mcl_idx=%d  timer_active=%d timer_in_use=%d",
333                       __FUNCTION__,app_idx, mcl_idx,
334                       p_mcb->cch_timer_active, p_mcb->cch_timer.in_use);
335 
336     p_mcb->cch_timer_active = TRUE;
337     if (!p_mcb->cch_timer.in_use)
338     {
339         BTIF_TRACE_DEBUG0("Start CCH timer ");
340         memset(&p_mcb->cch_timer, 0, sizeof(TIMER_LIST_ENT));
341         p_mcb->cch_timer.param = (UINT32)btif_hl_tmr_hdlr;
342         btu_start_timer(&p_mcb->cch_timer, BTU_TTYPE_USER_FUNC,
343                         BTIF_TIMEOUT_CCH_NO_DCH_SECS);
344     }
345     else
346     {
347         BTIF_TRACE_DEBUG0("Restart CCH timer ");
348         btu_stop_timer(&p_mcb->cch_timer);
349         btu_start_timer(&p_mcb->cch_timer, BTU_TTYPE_USER_FUNC,
350                         BTIF_TIMEOUT_CCH_NO_DCH_SECS);
351     }
352 
353 }
354 /*******************************************************************************
355 **
356 ** Function      btif_hl_find_mdl_idx
357 **
358 ** Description  Find the MDL index using MDL ID
359 **
360 ** Returns      BOOLEAN
361 **
362 *******************************************************************************/
btif_hl_find_mdl_idx(UINT8 app_idx,UINT8 mcl_idx,UINT16 mdl_id,UINT8 * p_mdl_idx)363 static BOOLEAN btif_hl_find_mdl_idx(UINT8 app_idx, UINT8 mcl_idx, UINT16 mdl_id,
364                                     UINT8 *p_mdl_idx)
365 {
366     btif_hl_mcl_cb_t      *p_mcb  = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
367     BOOLEAN found=FALSE;
368     UINT8 i;
369 
370     for (i=0; i < BTA_HL_NUM_MDLS_PER_MCL ; i ++)
371     {
372         if (p_mcb->mdl[i].in_use  &&
373             (mdl_id !=0) &&
374             (p_mcb->mdl[i].mdl_id== mdl_id))
375         {
376             found = TRUE;
377             *p_mdl_idx = i;
378             break;
379         }
380     }
381 
382     BTIF_TRACE_DEBUG4("%s found=%d mdl_id=%d mdl_idx=%d ",
383                       __FUNCTION__,found, mdl_id, i);
384 
385     return found;
386 }
387 
388 /*******************************************************************************
389 **
390 ** Function      btif_hl_get_buf
391 **
392 ** Description   get buffer
393 **
394 ** Returns     void
395 **
396 *******************************************************************************/
btif_hl_get_buf(UINT16 size)397 void * btif_hl_get_buf(UINT16 size)
398 {
399     void *p_new;
400 
401     BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
402     BTIF_TRACE_DEBUG2("ret size=%d GKI_MAX_BUF_SIZE=%d",size, 6000);
403 
404     if (size < 6000)
405     {
406         p_new = GKI_getbuf(size);
407     }
408     else
409     {
410         BTIF_TRACE_DEBUG0("btif_hl_get_buf use HL large data pool");
411         p_new = GKI_getpoolbuf(4);
412     }
413 
414     return p_new;
415 }
416 /*******************************************************************************
417 **
418 ** Function      btif_hl_free_buf
419 **
420 ** Description free buffer
421 **
422 ** Return void
423 **
424 *******************************************************************************/
btif_hl_free_buf(void ** p)425 void btif_hl_free_buf(void **p)
426 {
427     if (*p != NULL)
428     {
429         BTIF_TRACE_DEBUG1("%s OK", __FUNCTION__ );
430         GKI_freebuf(*p);
431         *p = NULL;
432     }
433     else
434         BTIF_TRACE_ERROR1("%s NULL pointer",__FUNCTION__ );
435 }
436 /*******************************************************************************
437 **
438 ** Function      btif_hl_is_the_first_reliable_existed
439 **
440 ** Description  This function checks whether the first reliable DCH channel
441 **              has been setup on the MCL or not
442 **
443 ** Returns      BOOLEAN - TRUE exist
444 **                        FALSE does not exist
445 **
446 *******************************************************************************/
btif_hl_is_the_first_reliable_existed(UINT8 app_idx,UINT8 mcl_idx)447 BOOLEAN btif_hl_is_the_first_reliable_existed(UINT8 app_idx, UINT8 mcl_idx )
448 {
449     btif_hl_mcl_cb_t          *p_mcb  =BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
450     BOOLEAN is_existed =FALSE;
451     UINT8 i ;
452 
453     for (i=0; i< BTA_HL_NUM_MDLS_PER_MCL; i++)
454     {
455         if (p_mcb->mdl[i].in_use && p_mcb->mdl[i].is_the_first_reliable)
456         {
457             is_existed = TRUE;
458             break;
459         }
460     }
461 
462     BTIF_TRACE_DEBUG1("bta_hl_is_the_first_reliable_existed is_existed=%d  ",is_existed );
463     return is_existed;
464 }
465 /*******************************************************************************
466 **
467 ** Function      btif_hl_clean_delete_mdl
468 **
469 ** Description   Cleanup the delete mdl control block
470 **
471 ** Returns     Nothing
472 **
473 *******************************************************************************/
btif_hl_clean_delete_mdl(btif_hl_delete_mdl_t * p_cb)474 static void btif_hl_clean_delete_mdl(btif_hl_delete_mdl_t *p_cb)
475 {
476     BTIF_TRACE_DEBUG1("%s", __FUNCTION__ );
477     memset(p_cb, 0 , sizeof(btif_hl_delete_mdl_t));
478 }
479 
480 /*******************************************************************************
481 **
482 ** Function      btif_hl_clean_pcb
483 **
484 ** Description   Cleanup the pending chan control block
485 **
486 ** Returns     Nothing
487 **
488 *******************************************************************************/
btif_hl_clean_pcb(btif_hl_pending_chan_cb_t * p_pcb)489 static void btif_hl_clean_pcb(btif_hl_pending_chan_cb_t *p_pcb)
490 {
491     BTIF_TRACE_DEBUG1("%s", __FUNCTION__ );
492     memset(p_pcb, 0 , sizeof(btif_hl_pending_chan_cb_t));
493 }
494 
495 
496 /*******************************************************************************
497 **
498 ** Function      btif_hl_clean_mdl_cb
499 **
500 ** Description   Cleanup the MDL control block
501 **
502 ** Returns     Nothing
503 **
504 *******************************************************************************/
btif_hl_clean_mdl_cb(btif_hl_mdl_cb_t * p_dcb)505 static void btif_hl_clean_mdl_cb(btif_hl_mdl_cb_t *p_dcb)
506 {
507     BTIF_TRACE_DEBUG1("%s", __FUNCTION__ );
508     btif_hl_free_buf((void **) &p_dcb->p_rx_pkt);
509     btif_hl_free_buf((void **) &p_dcb->p_tx_pkt);
510     memset(p_dcb, 0 , sizeof(btif_hl_mdl_cb_t));
511 }
512 
513 
514 /*******************************************************************************
515 **
516 ** Function      btif_hl_reset_mcb
517 **
518 ** Description   Reset MCL control block
519 **
520 ** Returns      BOOLEAN
521 **
522 *******************************************************************************/
btif_hl_clean_mcl_cb(UINT8 app_idx,UINT8 mcl_idx)523 static void btif_hl_clean_mcl_cb(UINT8 app_idx, UINT8 mcl_idx)
524 {
525     btif_hl_mcl_cb_t     *p_mcb;
526     BTIF_TRACE_DEBUG3("%s app_idx=%d, mcl_idx=%d", __FUNCTION__,app_idx, mcl_idx);
527     p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
528     memset(p_mcb, 0, sizeof(btif_hl_mcl_cb_t));
529 }
530 
531 
532 /*******************************************************************************
533 **
534 ** Function      btif_hl_find_sdp_idx_using_mdep_filter
535 **
536 ** Description  This function finds the SDP record index using MDEP filter parameters
537 **
538 ** Returns      BOOLEAN
539 **
540 *******************************************************************************/
btif_hl_reset_mdep_filter(UINT8 app_idx)541 static void btif_hl_reset_mdep_filter(UINT8 app_idx)
542 {
543     btif_hl_app_cb_t          *p_acb  =BTIF_HL_GET_APP_CB_PTR(app_idx);
544     p_acb->filter.num_elems = 0;
545 }
546 
547 /*******************************************************************************
548 **
549 ** Function      btif_hl_find_sdp_idx_using_mdep_filter
550 **
551 ** Description  This function finds the SDP record index using MDEP filter parameters
552 **
553 ** Returns      BOOLEAN
554 **
555 *******************************************************************************/
btif_hl_find_sdp_idx_using_mdep_filter(UINT8 app_idx,UINT8 mcl_idx,UINT8 * p_sdp_idx)556 static BOOLEAN btif_hl_find_sdp_idx_using_mdep_filter(UINT8 app_idx, UINT8 mcl_idx, UINT8 *p_sdp_idx)
557 {
558     btif_hl_app_cb_t          *p_acb  =BTIF_HL_GET_APP_CB_PTR(app_idx);
559     btif_hl_mcl_cb_t          *p_mcb  =BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
560     UINT8                   i, j, num_recs,num_elems, num_mdeps, mdep_cnt, mdep_idx;
561     tBTA_HL_MDEP_ROLE       peer_mdep_role;
562     UINT16                  data_type;
563     tBTA_HL_SDP_MDEP_CFG    *p_mdep;
564     BOOLEAN                 found = FALSE;
565     BOOLEAN                 elem_found;
566 
567     BTIF_TRACE_DEBUG0("btif_hl_find_sdp_idx_using_mdep_filter");
568     num_recs = p_mcb->sdp.num_recs;
569     num_elems = p_acb->filter.num_elems;
570     if (!num_elems)
571     {
572         BTIF_TRACE_DEBUG0("btif_hl_find_sdp_idx_using_mdep_filter num_elem=0");
573         *p_sdp_idx = 0;
574         found = TRUE;
575         return found;
576     }
577 
578     for (i=0; i<num_recs; i++)
579     {
580         num_mdeps = p_mcb->sdp.sdp_rec[i].num_mdeps;
581         for (j=0; j<num_elems; j++ )
582         {
583             data_type = p_acb->filter.elem[j].data_type;
584             peer_mdep_role = p_acb->filter.elem[j].peer_mdep_role;
585             elem_found = FALSE;
586             mdep_cnt =0;
587             mdep_idx=0;
588             while (!elem_found && mdep_idx < num_mdeps )
589             {
590                 p_mdep = &(p_mcb->sdp.sdp_rec[i].mdep_cfg[mdep_idx]);
591                 if ( (p_mdep->data_type == data_type) &&
592                      (p_mdep->mdep_role == peer_mdep_role) )
593                 {
594                     elem_found = TRUE;
595                 }
596                 else
597                 {
598                     mdep_idx++;
599                 }
600             }
601 
602             if (!elem_found)
603             {
604                 found = FALSE;
605                 break;
606             }
607             else
608             {
609                 found = TRUE;
610             }
611         }
612 
613         if (found)
614         {
615             BTIF_TRACE_DEBUG1("btif_hl_find_sdp_idx_using_mdep_filter found idx=%d",i);
616             *p_sdp_idx = i;
617             break;
618         }
619     }
620 
621     BTIF_TRACE_DEBUG3("%s found=%d sdp_idx=%d",__FUNCTION__ , found, *p_sdp_idx);
622 
623     btif_hl_reset_mdep_filter(app_idx);
624 
625     return found;
626 }
627 /*******************************************************************************
628 **
629 ** Function      btif_hl_is_reconnect_possible
630 **
631 ** Description  check reconnect is possible or not
632 **
633 ** Returns      BOOLEAN
634 **
635 *******************************************************************************/
btif_hl_is_reconnect_possible(UINT8 app_idx,UINT8 mcl_idx,int mdep_cfg_idx,tBTA_HL_DCH_OPEN_PARAM * p_dch_open_api,tBTA_HL_MDL_ID * p_mdl_id)636 BOOLEAN btif_hl_is_reconnect_possible(UINT8 app_idx, UINT8 mcl_idx,  int mdep_cfg_idx,
637                                       tBTA_HL_DCH_OPEN_PARAM *p_dch_open_api, tBTA_HL_MDL_ID *p_mdl_id)
638 {
639     btif_hl_app_cb_t     *p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
640     btif_hl_mcl_cb_t     *p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
641     tBTA_HL_DCH_CFG      local_cfg = p_dch_open_api->local_cfg;
642     tBTA_HL_DCH_MODE     dch_mode = BTA_HL_DCH_MODE_RELIABLE;
643     BOOLEAN              use_mdl_dch_mode=FALSE;
644     btif_hl_mdl_cfg_t    *p_mdl;
645     btif_hl_mdl_cfg_t    *p_mdl1;
646     UINT8                i, j;
647     BOOLEAN              is_reconnect_ok=FALSE;
648     BOOLEAN              stream_mode_avail=FALSE;
649     UINT16               data_type = p_acb->sup_feature.mdep[mdep_cfg_idx].mdep_cfg.data_cfg[0].data_type;
650     tBTA_HL_MDEP_ID      peer_mdep_id = p_dch_open_api->peer_mdep_id;
651     UINT8                mdl_idx;
652 
653 
654     BTIF_TRACE_DEBUG4("%s app_idx=%d mcl_idx=%d mdep_cfg_idx=%d",
655                       __FUNCTION__, app_idx, mcl_idx, mdep_cfg_idx  );
656     switch (local_cfg)
657     {
658         case BTA_HL_DCH_CFG_NO_PREF:
659             if (!btif_hl_is_the_first_reliable_existed(app_idx, mcl_idx))
660             {
661                 dch_mode = BTA_HL_DCH_MODE_RELIABLE;
662             }
663             else
664             {
665                 use_mdl_dch_mode = TRUE;
666             }
667             break;
668         case BTA_HL_DCH_CFG_RELIABLE:
669             dch_mode = BTA_HL_DCH_MODE_RELIABLE;
670             break;
671         case BTA_HL_DCH_CFG_STREAMING:
672             dch_mode = BTA_HL_DCH_MODE_STREAMING;
673             break;
674         default:
675             BTIF_TRACE_ERROR1("Invalid local_cfg=%d",local_cfg );
676             return is_reconnect_ok;
677             break;
678 
679     }
680 
681     BTIF_TRACE_DEBUG3("local_cfg=%d use_mdl_dch_mode=%d dch_mode=%d ",
682                       local_cfg, use_mdl_dch_mode, dch_mode  );
683 
684     for (i=0, p_mdl=&p_acb->mdl_cfg[0] ; i< BTA_HL_NUM_MDL_CFGS; i++, p_mdl++ )
685     {
686         if (p_mdl->base.active &&
687             p_mdl->extra.data_type ==data_type &&
688             (p_mdl->extra.peer_mdep_id != BTA_HL_INVALID_MDEP_ID && p_mdl->extra.peer_mdep_id == peer_mdep_id) &&
689             memcpy(p_mdl->base.peer_bd_addr, p_mcb->bd_addr,sizeof(BD_ADDR) ) &&
690             p_mdl->base.mdl_id &&
691             !btif_hl_find_mdl_idx(app_idx, mcl_idx,p_mdl->base.mdl_id, &mdl_idx))
692         {
693             BTIF_TRACE_DEBUG4("i=%d Matched active=%d   mdl_id =%d, mdl_dch_mode=%d",
694                               i, p_mdl->base.active, p_mdl->base.mdl_id,p_mdl->base.dch_mode);
695             if (!use_mdl_dch_mode)
696             {
697                 if (p_mdl->base.dch_mode == dch_mode)
698                 {
699                     is_reconnect_ok = TRUE;
700                     *p_mdl_id = p_mdl->base.mdl_id;
701                     BTIF_TRACE_DEBUG2("reconnect is possible dch_mode=%d mdl_id=%d", dch_mode, p_mdl->base.mdl_id );
702                     break;
703                 }
704             }
705             else
706             {
707                 is_reconnect_ok = TRUE;
708                 for (j=i, p_mdl1=&p_acb->mdl_cfg[i]; j< BTA_HL_NUM_MDL_CFGS; j++, p_mdl1++)
709                 {
710                     if (p_mdl1->base.active &&
711                         p_mdl1->extra.data_type == data_type &&
712                         (p_mdl1->extra.peer_mdep_id != BTA_HL_INVALID_MDEP_ID && p_mdl1->extra.peer_mdep_id == peer_mdep_id) &&
713                         memcpy(p_mdl1->base.peer_bd_addr, p_mcb->bd_addr,sizeof(BD_ADDR)) &&
714                         p_mdl1->base.dch_mode == BTA_HL_DCH_MODE_STREAMING)
715                     {
716                         stream_mode_avail = TRUE;
717                         BTIF_TRACE_DEBUG1("found streaming mode mdl index=%d", j);
718                         break;
719                     }
720                 }
721 
722                 if (stream_mode_avail)
723                 {
724                     dch_mode = BTA_HL_DCH_MODE_STREAMING;
725                     *p_mdl_id = p_mdl1->base.mdl_id;
726                     BTIF_TRACE_DEBUG2("reconnect is ok index=%d dch_mode=streaming  mdl_id=%d", j, *p_mdl_id);
727                     break;
728                 }
729                 else
730                 {
731                     dch_mode= p_mdl->base.dch_mode;
732                     *p_mdl_id = p_mdl->base.mdl_id;
733                     BTIF_TRACE_DEBUG3("reconnect is ok index=%d  dch_mode=%d mdl_id=%d", i,  p_mdl->base.dch_mode, *p_mdl_id);
734                     break;
735 
736                 }
737             }
738 
739         }
740 
741     }
742 
743     BTIF_TRACE_DEBUG3("is_reconnect_ok  dch_mode=%d mdl_id=%d",is_reconnect_ok, dch_mode, *p_mdl_id);
744     return is_reconnect_ok;
745 }
746 
747 /*******************************************************************************
748 **
749 ** Function      btif_hl_dch_open
750 **
751 ** Description   Process DCH open request using the DCH Open API parameters
752 **
753 ** Returns      BOOLEAN
754 **
755 *******************************************************************************/
btif_hl_dch_open(UINT8 app_id,BD_ADDR bd_addr,tBTA_HL_DCH_OPEN_PARAM * p_dch_open_api,int mdep_cfg_idx,btif_hl_pend_dch_op_t op,int * channel_id)756 BOOLEAN btif_hl_dch_open(UINT8 app_id, BD_ADDR bd_addr,
757                          tBTA_HL_DCH_OPEN_PARAM *p_dch_open_api,
758                          int mdep_cfg_idx,
759                          btif_hl_pend_dch_op_t op, int *channel_id){
760     btif_hl_app_cb_t            *p_acb;
761     btif_hl_mcl_cb_t            *p_mcb;
762     btif_hl_pending_chan_cb_t   *p_pcb;
763     UINT8                       app_idx, mcl_idx;
764     BOOLEAN                     status = FALSE;
765     tBTA_HL_MDL_ID              mdl_id;
766     tBTA_HL_DCH_RECONNECT_PARAM reconnect_param;
767 
768     BTIF_TRACE_DEBUG2("%s app_id=%d ",
769                       __FUNCTION__, app_id );
770     BTIF_TRACE_DEBUG6("DB [%02x:%02x:%02x:%02x:%02x:%02x]",
771                       bd_addr[0],  bd_addr[1],bd_addr[2],  bd_addr[3], bd_addr[4],  bd_addr[5]);
772 
773     if (btif_hl_find_app_idx(app_id, &app_idx))
774     {
775         if (btif_hl_find_mcl_idx(app_idx, bd_addr , &mcl_idx))
776         {
777             p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
778 
779             p_pcb = BTIF_HL_GET_PCB_PTR(app_idx, mcl_idx);
780             if (!p_pcb->in_use)
781             {
782                 p_mcb->req_ctrl_psm = p_dch_open_api->ctrl_psm;
783 
784                 p_pcb->in_use = TRUE;
785                 *channel_id       =
786                 p_pcb->channel_id =  (int) btif_hl_get_next_channel_id(app_id);
787                 p_pcb->cb_state = BTIF_HL_CHAN_CB_STATE_CONNECTING_PENDING;
788                 p_pcb->mdep_cfg_idx = mdep_cfg_idx;
789                 memcpy(p_pcb->bd_addr, bd_addr, sizeof(BD_ADDR));
790                 p_pcb->op = op;
791 
792                 if (p_mcb->sdp.num_recs)
793                 {
794                     if (p_mcb->valid_sdp_idx)
795                     {
796                         p_dch_open_api->ctrl_psm  = p_mcb->ctrl_psm;
797                     }
798 
799                     if (!btif_hl_is_reconnect_possible(app_idx, mcl_idx, mdep_cfg_idx, p_dch_open_api, &mdl_id ))
800                     {
801 
802                         BTIF_TRACE_DEBUG0("Issue DCH open" );
803                         BTA_HlDchOpen(p_mcb->mcl_handle, p_dch_open_api);
804                     }
805                     else
806                     {
807                         reconnect_param.ctrl_psm = p_mcb->ctrl_psm;
808                         reconnect_param.mdl_id = mdl_id;;
809                         BTIF_TRACE_DEBUG2("Issue Reconnect ctrl_psm=0x%x mdl_id=0x%x",reconnect_param.ctrl_psm, reconnect_param.mdl_id   );
810                         BTA_HlDchReconnect(p_mcb->mcl_handle, &reconnect_param);
811                     }
812 
813                     status = TRUE;
814                 }
815                 else
816                 {
817                     p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
818                     p_mcb->cch_oper = BTIF_HL_CCH_OP_DCH_OPEN;
819                     BTA_HlSdpQuery(app_id,p_acb->app_handle, bd_addr);
820                     status = TRUE;
821                 }
822             }
823         }
824     }
825 
826     BTIF_TRACE_DEBUG1("status=%d ", status);
827     return status;
828 }
829 /*******************************************************************************
830 **
831 ** Function      btif_hl_copy_bda
832 **
833 ** Description  copy bt_bdaddr_t to BD_ADDR format
834 **
835 ** Returns      void
836 **
837 *******************************************************************************/
btif_hl_copy_bda(bt_bdaddr_t * bd_addr,BD_ADDR bda)838 void btif_hl_copy_bda(bt_bdaddr_t *bd_addr, BD_ADDR  bda){
839     UINT8 i;
840     for (i=0; i<6; i++)
841     {
842         bd_addr->address[i] = bda[i] ;
843     }
844 }
845 /*******************************************************************************
846 **
847 ** Function      btif_hl_copy_bda
848 **
849 ** Description  display bt_bdaddr_t
850 **
851 ** Returns      BOOLEAN
852 **
853 *******************************************************************************/
btif_hl_display_bt_bda(bt_bdaddr_t * bd_addr)854 void btif_hl_display_bt_bda(bt_bdaddr_t *bd_addr){
855     BTIF_TRACE_DEBUG6("DB [%02x:%02x:%02x:%02x:%02x:%02x]",
856                       bd_addr->address[0],   bd_addr->address[1], bd_addr->address[2],
857                       bd_addr->address[3],  bd_addr->address[4],   bd_addr->address[5]);
858 }
859 
860 /*******************************************************************************
861 **
862 ** Function         btif_hl_dch_abort
863 **
864 ** Description      Process DCH abort request
865 **
866 ** Returns          Nothing
867 **
868 *******************************************************************************/
btif_hl_dch_abort(UINT8 app_idx,UINT8 mcl_idx)869 void  btif_hl_dch_abort(UINT8 app_idx, UINT8 mcl_idx){
870     btif_hl_mcl_cb_t      *p_mcb;
871 
872     BTIF_TRACE_DEBUG3("%s app_idx=%d mcl_idx=%d",__FUNCTION__, app_idx, mcl_idx );
873     p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
874     if (p_mcb->is_connected)
875     {
876         BTA_HlDchAbort(p_mcb->mcl_handle);
877     }
878     else
879     {
880         p_mcb->pcb.abort_pending = TRUE;
881     }
882 
883 }
884 /*******************************************************************************
885 **
886 ** Function      btif_hl_cch_open
887 **
888 ** Description   Process CCH open request
889 **
890 ** Returns     Nothing
891 **
892 *******************************************************************************/
btif_hl_cch_open(UINT8 app_id,BD_ADDR bd_addr,UINT16 ctrl_psm,int mdep_cfg_idx,btif_hl_pend_dch_op_t op,int * channel_id)893 BOOLEAN btif_hl_cch_open(UINT8 app_id, BD_ADDR bd_addr, UINT16 ctrl_psm,
894                          int mdep_cfg_idx,
895                          btif_hl_pend_dch_op_t op, int *channel_id){
896 
897     btif_hl_app_cb_t            *p_acb;
898     btif_hl_mcl_cb_t            *p_mcb;
899     btif_hl_pending_chan_cb_t   *p_pcb;
900     UINT8                       app_idx, mcl_idx, chan_idx;
901     BOOLEAN                     status = TRUE;
902 
903     BTIF_TRACE_DEBUG5("%s app_id=%d ctrl_psm=%d mdep_cfg_idx=%d op=%d",
904                       __FUNCTION__, app_id, ctrl_psm, mdep_cfg_idx, op);
905     BTIF_TRACE_DEBUG6("DB [%02x:%02x:%02x:%02x:%02x:%02x]",
906                       bd_addr[0],  bd_addr[1],bd_addr[2],  bd_addr[3], bd_addr[4],  bd_addr[5]);
907 
908     if (btif_hl_find_app_idx(app_id, &app_idx))
909     {
910         p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
911 
912         if (!btif_hl_find_mcl_idx(app_idx, bd_addr, &mcl_idx))
913         {
914             if (btif_hl_find_avail_mcl_idx(app_idx, &mcl_idx))
915             {
916                 p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
917                 memset(p_mcb,0, sizeof(btif_hl_mcl_cb_t));
918                 p_mcb->in_use = TRUE;
919                 bdcpy(p_mcb->bd_addr, bd_addr);
920 
921                 if (!ctrl_psm)
922                 {
923                     p_mcb->cch_oper = BTIF_HL_CCH_OP_MDEP_FILTERING;
924                 }
925                 else
926                 {
927                     p_mcb->cch_oper        = BTIF_HL_CCH_OP_MATCHED_CTRL_PSM;
928                     p_mcb->req_ctrl_psm    = ctrl_psm;
929                 }
930 
931                 p_pcb = BTIF_HL_GET_PCB_PTR(app_idx, mcl_idx);
932                 p_pcb->in_use = TRUE;
933                 p_pcb->mdep_cfg_idx = mdep_cfg_idx;
934                 memcpy(p_pcb->bd_addr, bd_addr, sizeof(BD_ADDR));
935                 p_pcb->op = op;
936 
937                 switch (op)
938                 {
939                     case BTIF_HL_PEND_DCH_OP_OPEN:
940                         *channel_id       =
941                         p_pcb->channel_id =  (int) btif_hl_get_next_channel_id(app_id);
942                         p_pcb->cb_state = BTIF_HL_CHAN_CB_STATE_CONNECTING_PENDING;
943                         break;
944                     case BTIF_HL_PEND_DCH_OP_DELETE_MDL:
945                         p_pcb->channel_id =  p_acb->delete_mdl.channel_id;
946                         p_pcb->cb_state = BTIF_HL_CHAN_CB_STATE_DESTROYED_PENDING;
947                         break;
948                     default:
949                         break;
950                 }
951                 BTA_HlSdpQuery(app_id,p_acb->app_handle, bd_addr);
952             }
953             else
954             {
955                 status = FALSE;
956                 BTIF_TRACE_ERROR0("Open CCH request discarded- No mcl cb");
957             }
958         }
959         else
960         {
961             status = FALSE;
962             BTIF_TRACE_ERROR0("Open CCH request discarded- already in USE");
963         }
964     }
965     else
966     {
967         status = FALSE;
968         BTIF_TRACE_ERROR1("Invalid app_id=%d", app_id);
969     }
970 
971     if (channel_id)
972     {
973         BTIF_TRACE_DEBUG2("status=%d channel_id=0x%08x", status, *channel_id);
974     }
975     else
976     {
977         BTIF_TRACE_DEBUG1("status=%d ", status);
978     }
979     return status;
980 }
981 
982 
983 /*******************************************************************************
984 **
985 ** Function      btif_hl_find_mdl_idx_using_handle
986 **
987 ** Description  Find the MDL index using channel id
988 **
989 ** Returns      BOOLEAN
990 **
991 *******************************************************************************/
btif_hl_find_mdl_cfg_idx_using_channel_id(int channel_id,UINT8 * p_app_idx,UINT8 * p_mdl_cfg_idx)992 BOOLEAN btif_hl_find_mdl_cfg_idx_using_channel_id(int channel_id,
993                                                   UINT8 *p_app_idx,
994                                                   UINT8 *p_mdl_cfg_idx){
995     btif_hl_app_cb_t      *p_acb;
996     btif_hl_mdl_cfg_t     *p_mdl;
997     BOOLEAN found=FALSE;
998     UINT8 i,j;
999     int mdl_cfg_channel_id;
1000 
1001     for (i=0; i < BTA_HL_NUM_APPS ; i ++)
1002     {
1003         p_acb =BTIF_HL_GET_APP_CB_PTR(i);
1004         for (j=0; j< BTA_HL_NUM_MDL_CFGS; j++)
1005         {
1006             p_mdl =BTIF_HL_GET_MDL_CFG_PTR(i,j);
1007             mdl_cfg_channel_id = *(BTIF_HL_GET_MDL_CFG_CHANNEL_ID_PTR(i,j));
1008             if (p_acb->in_use &&
1009                 p_mdl->base.active &&
1010                 (mdl_cfg_channel_id == channel_id))
1011             {
1012                 found = TRUE;
1013                 *p_app_idx = i;
1014                 *p_mdl_cfg_idx =j;
1015                 break;
1016             }
1017         }
1018     }
1019 
1020     BTIF_TRACE_EVENT5("%s found=%d channel_id=0x%08x, app_idx=%d mdl_cfg_idx=%d  ",
1021                       __FUNCTION__,found,channel_id, i,j );
1022     return found;
1023 }
1024 /*******************************************************************************
1025 **
1026 ** Function      btif_hl_find_mdl_idx_using_handle
1027 **
1028 ** Description  Find the MDL index using channel id
1029 **
1030 ** Returns      BOOLEAN
1031 **
1032 *******************************************************************************/
btif_hl_find_mdl_idx_using_channel_id(int channel_id,UINT8 * p_app_idx,UINT8 * p_mcl_idx,UINT8 * p_mdl_idx)1033 BOOLEAN btif_hl_find_mdl_idx_using_channel_id(int channel_id,
1034                                               UINT8 *p_app_idx,UINT8 *p_mcl_idx,
1035                                               UINT8 *p_mdl_idx){
1036     btif_hl_app_cb_t      *p_acb;
1037     btif_hl_mcl_cb_t      *p_mcb;
1038     btif_hl_mdl_cb_t      *p_dcb;
1039     BOOLEAN found=FALSE;
1040     UINT8 i,j,k;
1041 
1042     for (i=0; i < BTA_HL_NUM_APPS ; i ++)
1043     {
1044         p_acb =BTIF_HL_GET_APP_CB_PTR(i);
1045         for (j=0; j< BTA_HL_NUM_MCLS; j++)
1046         {
1047             p_mcb =BTIF_HL_GET_MCL_CB_PTR(i,j);
1048             for (k=0; k< BTA_HL_NUM_MDLS_PER_MCL; k++)
1049             {
1050                 p_dcb =BTIF_HL_GET_MDL_CB_PTR(i,j,k);
1051                 if (p_acb->in_use &&
1052                     p_mcb->in_use &&
1053                     p_dcb->in_use &&
1054                     (p_dcb->channel_id == channel_id))
1055                 {
1056                     found = TRUE;
1057                     *p_app_idx = i;
1058                     *p_mcl_idx =j;
1059                     *p_mdl_idx = k;
1060                     break;
1061                 }
1062             }
1063         }
1064     }
1065     BTIF_TRACE_DEBUG5("%s found=%d app_idx=%d mcl_idx=%d mdl_idx=%d  ",
1066                       __FUNCTION__,found,i,j,k );
1067     return found;
1068 }
1069 
1070 /*******************************************************************************
1071 **
1072 ** Function      btif_hl_find_channel_id_using_mdl_id
1073 **
1074 ** Description  Find channel id using mdl_id'
1075 **
1076 ** Returns      BOOLEAN
1077 *********************************************************************************/
btif_hl_find_channel_id_using_mdl_id(UINT8 app_idx,tBTA_HL_MDL_ID mdl_id,int * p_channel_id)1078 BOOLEAN btif_hl_find_channel_id_using_mdl_id(UINT8 app_idx, tBTA_HL_MDL_ID mdl_id,
1079                                             int *p_channel_id){
1080     btif_hl_app_cb_t      *p_acb;
1081     btif_hl_mdl_cfg_t     *p_mdl;
1082     BOOLEAN found=FALSE;
1083     UINT8 j=0;
1084     int mdl_cfg_channel_id;
1085     p_acb =BTIF_HL_GET_APP_CB_PTR(app_idx);
1086     if (p_acb && p_acb->in_use)
1087         {
1088             for (j=0; j< BTA_HL_NUM_MDL_CFGS; j++)
1089                 {
1090                     p_mdl =BTIF_HL_GET_MDL_CFG_PTR(app_idx,j);
1091                     mdl_cfg_channel_id = *(BTIF_HL_GET_MDL_CFG_CHANNEL_ID_PTR(app_idx,j));
1092                     if ( p_mdl->base.active && (p_mdl->base.mdl_id == mdl_id))
1093                     {
1094                             found = TRUE;
1095                             *p_channel_id = mdl_cfg_channel_id;
1096                             break;
1097                     }
1098                 }
1099         }
1100     BTIF_TRACE_EVENT6("%s found=%d channel_id=0x%08x, mdl_id=0x%x app_idx=%d mdl_cfg_idx=%d  ",
1101                     __FUNCTION__,found,*p_channel_id,mdl_id, app_idx,j );
1102     return found;
1103 }
1104 
1105 
1106 /*******************************************************************************
1107 **
1108 ** Function      btif_hl_find_mdl_idx_using_handle
1109 **
1110 ** Description  Find the MDL index using handle
1111 **
1112 ** Returns      BOOLEAN
1113 **
1114 *******************************************************************************/
btif_hl_find_mdl_idx_using_handle(tBTA_HL_MDL_HANDLE mdl_handle,UINT8 * p_app_idx,UINT8 * p_mcl_idx,UINT8 * p_mdl_idx)1115 BOOLEAN btif_hl_find_mdl_idx_using_handle(tBTA_HL_MDL_HANDLE mdl_handle,
1116                                           UINT8 *p_app_idx,UINT8 *p_mcl_idx,
1117                                           UINT8 *p_mdl_idx){
1118     btif_hl_app_cb_t      *p_acb;
1119     btif_hl_mcl_cb_t      *p_mcb;
1120     btif_hl_mdl_cb_t      *p_dcb;
1121     BOOLEAN found=FALSE;
1122     UINT8 i,j,k;
1123 
1124     for (i=0; i < BTA_HL_NUM_APPS ; i ++)
1125     {
1126         p_acb =BTIF_HL_GET_APP_CB_PTR(i);
1127         for (j=0; j< BTA_HL_NUM_MCLS; j++)
1128         {
1129             p_mcb =BTIF_HL_GET_MCL_CB_PTR(i,j);
1130             for (k=0; k< BTA_HL_NUM_MDLS_PER_MCL; k++)
1131             {
1132                 p_dcb =BTIF_HL_GET_MDL_CB_PTR(i,j,k);
1133                 if (p_acb->in_use &&
1134                     p_mcb->in_use &&
1135                     p_dcb->in_use &&
1136                     (p_dcb->mdl_handle == mdl_handle))
1137                 {
1138                     found = TRUE;
1139                     *p_app_idx = i;
1140                     *p_mcl_idx =j;
1141                     *p_mdl_idx = k;
1142                     break;
1143                 }
1144             }
1145         }
1146     }
1147 
1148 
1149     BTIF_TRACE_EVENT5("%s found=%d app_idx=%d mcl_idx=%d mdl_idx=%d  ",
1150                       __FUNCTION__,found,i,j,k );
1151     return found;
1152 }
1153 /*******************************************************************************
1154 **
1155 ** Function        btif_hl_find_peer_mdep_id
1156 **
1157 ** Description      Find the peer MDEP ID from the received SPD records
1158 **
1159 ** Returns          BOOLEAN
1160 **
1161 *******************************************************************************/
btif_hl_find_peer_mdep_id(UINT8 app_id,BD_ADDR bd_addr,tBTA_HL_MDEP_ROLE local_mdep_role,UINT16 data_type,tBTA_HL_MDEP_ID * p_peer_mdep_id)1162 static BOOLEAN btif_hl_find_peer_mdep_id(UINT8 app_id, BD_ADDR bd_addr,
1163                                          tBTA_HL_MDEP_ROLE local_mdep_role,
1164                                          UINT16 data_type,
1165                                          tBTA_HL_MDEP_ID *p_peer_mdep_id){
1166     UINT8               app_idx, mcl_idx;
1167     btif_hl_app_cb_t     *p_acb;
1168     btif_hl_mcl_cb_t     *p_mcb;
1169     tBTA_HL_SDP_REC     *p_rec;
1170     UINT8               i, num_mdeps;
1171     BOOLEAN             found = FALSE;
1172     tBTA_HL_MDEP_ROLE   peer_mdep_role;
1173 
1174 
1175     BTIF_TRACE_DEBUG4("%s app_id=%d local_mdep_role=%d, data_type=%d",
1176                       __FUNCTION__, app_id, local_mdep_role, data_type);
1177 
1178     BTIF_TRACE_DEBUG6("DB [%02x:%02x:%02x:%02x:%02x:%02x]",
1179                       bd_addr[0],  bd_addr[1],
1180                       bd_addr[2],  bd_addr[3],
1181                       bd_addr[4],  bd_addr[5]);
1182 
1183 
1184     BTIF_TRACE_DEBUG1("local_mdep_role=%d", local_mdep_role);
1185     BTIF_TRACE_DEBUG1("data_type=%d", data_type);
1186 
1187     if (local_mdep_role == BTA_HL_MDEP_ROLE_SINK)
1188         peer_mdep_role = BTA_HL_MDEP_ROLE_SOURCE;
1189     else
1190         peer_mdep_role = BTA_HL_MDEP_ROLE_SINK;
1191 
1192     if (btif_hl_find_app_idx(app_id, &app_idx) )
1193     {
1194         p_acb  = BTIF_HL_GET_APP_CB_PTR(app_idx);
1195         if (btif_hl_find_mcl_idx(app_idx, bd_addr, &mcl_idx))
1196         {
1197             p_mcb  =BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
1198 
1199             BTIF_TRACE_DEBUG2("app_idx=%d mcl_idx=%d",app_idx, mcl_idx);
1200             BTIF_TRACE_DEBUG2("valid_spd_idx=%d sdp_idx=%d",p_mcb->valid_sdp_idx, p_mcb->sdp_idx);
1201             if (p_mcb->valid_sdp_idx)
1202             {
1203                 p_rec = &p_mcb->sdp.sdp_rec[p_mcb->sdp_idx];
1204                 num_mdeps = p_rec->num_mdeps;
1205                 BTIF_TRACE_DEBUG1("num_mdeps=%d", num_mdeps);
1206 
1207                 for (i=0; i< num_mdeps; i++)
1208                 {
1209                     BTIF_TRACE_DEBUG2("p_rec->mdep_cfg[%d].mdep_role=%d",i, p_rec->mdep_cfg[i].mdep_role);
1210                     BTIF_TRACE_DEBUG2("p_rec->mdep_cfg[%d].data_type =%d",i, p_rec->mdep_cfg[i].data_type );
1211                     if ((p_rec->mdep_cfg[i].mdep_role == peer_mdep_role) &&
1212                         (p_rec->mdep_cfg[i].data_type == data_type))
1213                     {
1214                         found = TRUE;
1215                         *p_peer_mdep_id = p_rec->mdep_cfg[i].mdep_id;
1216                         break;
1217                     }
1218                 }
1219             }
1220         }
1221     }
1222 
1223     BTIF_TRACE_DEBUG2("found =%d  *p_peer_mdep_id=%d", found,  *p_peer_mdep_id);
1224 
1225     return found;
1226 }
1227 /*******************************************************************************
1228 **
1229 ** Function        btif_hl_find_local_mdep_id
1230 **
1231 ** Description      Find the local MDEP ID from the MDEP configuration
1232 **
1233 ** Returns          BOOLEAN
1234 **
1235 *******************************************************************************/
btif_hl_find_local_mdep_id(UINT8 app_id,tBTA_HL_MDEP_ROLE local_mdep_role,UINT16 mdep_data_type,tBTA_HL_MDEP_ID * p_local_mdep_id)1236 static BOOLEAN btif_hl_find_local_mdep_id(UINT8 app_id,
1237                                           tBTA_HL_MDEP_ROLE local_mdep_role,
1238                                           UINT16 mdep_data_type,
1239                                           tBTA_HL_MDEP_ID *p_local_mdep_id){
1240     UINT8 app_idx;
1241     btif_hl_app_cb_t      *p_acb;
1242     UINT8  i,j;
1243     BOOLEAN found = FALSE;
1244 
1245     BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
1246 
1247     if (btif_hl_find_app_idx(app_id, &app_idx) )
1248     {
1249         p_acb  =BTIF_HL_GET_APP_CB_PTR(app_idx);
1250 
1251         for (i=0; i< p_acb->sup_feature.num_of_mdeps; i++)
1252         {
1253             if (p_acb->sup_feature.mdep[i].mdep_cfg.mdep_role == local_mdep_role )
1254             {
1255                 for (j=0; j< p_acb->sup_feature.mdep[i].mdep_cfg.num_of_mdep_data_types; j++)
1256                 {
1257                     if ( p_acb->sup_feature.mdep[i].mdep_cfg.data_cfg[j].data_type == mdep_data_type)
1258                     {
1259                         found = TRUE;
1260                         *p_local_mdep_id = p_acb->sup_feature.mdep[i].mdep_id;
1261                         return found;
1262                     }
1263                 }
1264             }
1265         }
1266 
1267 
1268     }
1269     BTIF_TRACE_DEBUG2("found=%d local mdep id=%d", found, *p_local_mdep_id );
1270     return found;
1271 }
1272 
1273 /*******************************************************************************
1274 **
1275 ** Function      btif_hl_find_mdep_cfg_idx
1276 **
1277 ** Description  Find the MDEP configuration index using local MDEP_ID
1278 **
1279 ** Returns      BOOLEAN
1280 **
1281 *******************************************************************************/
btif_hl_find_mdep_cfg_idx(UINT8 app_idx,tBTA_HL_MDEP_ID local_mdep_id,UINT8 * p_mdep_cfg_idx)1282 static  BOOLEAN btif_hl_find_mdep_cfg_idx(UINT8 app_idx,  tBTA_HL_MDEP_ID local_mdep_id,
1283                                           UINT8 *p_mdep_cfg_idx){
1284     btif_hl_app_cb_t      *p_acb =BTIF_HL_GET_APP_CB_PTR(app_idx);
1285     tBTA_HL_SUP_FEATURE     *p_sup_feature= &p_acb->sup_feature;
1286     BOOLEAN found =FALSE;
1287     UINT8 i;
1288 
1289     for (i=0; i< p_sup_feature->num_of_mdeps; i++)
1290     {
1291         BTIF_TRACE_DEBUG2("btif_hl_find_mdep_cfg_idx: mdep_id=%d app_idx = %d",
1292                     p_sup_feature->mdep[i].mdep_id,app_idx);
1293         if ( p_sup_feature->mdep[i].mdep_id == local_mdep_id)
1294         {
1295             found = TRUE;
1296             *p_mdep_cfg_idx = i;
1297             break;
1298         }
1299     }
1300 
1301     BTIF_TRACE_DEBUG5("%s found=%d mdep_idx=%d local_mdep_id=%d app_idx=%d ",
1302                       __FUNCTION__, found,i, local_mdep_id,app_idx);
1303     return found;
1304 }
1305 
1306 
1307 
1308 /*******************************************************************************
1309 **
1310 ** Function      btif_hl_find_mcl_idx
1311 **
1312 ** Description  Find the MCL index using BD address
1313 **
1314 ** Returns      BOOLEAN
1315 **
1316 *******************************************************************************/
btif_hl_find_mcl_idx(UINT8 app_idx,BD_ADDR p_bd_addr,UINT8 * p_mcl_idx)1317 BOOLEAN btif_hl_find_mcl_idx(UINT8 app_idx, BD_ADDR p_bd_addr, UINT8 *p_mcl_idx){
1318     BOOLEAN found=FALSE;
1319     UINT8 i;
1320     btif_hl_app_cb_t  *p_acb =BTIF_HL_GET_APP_CB_PTR(app_idx);
1321     btif_hl_mcl_cb_t  *p_mcb;
1322 
1323     for (i=0; i < BTA_HL_NUM_MCLS ; i ++)
1324     {
1325         p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, i);
1326         if (p_mcb->in_use &&
1327             (!memcmp (p_mcb->bd_addr, p_bd_addr, BD_ADDR_LEN)))
1328         {
1329             found = TRUE;
1330             *p_mcl_idx = i;
1331             break;
1332         }
1333     }
1334 
1335 
1336     BTIF_TRACE_DEBUG3("%s found=%d idx=%d",__FUNCTION__, found, i);
1337     return found;
1338 }
1339 /*******************************************************************************
1340 **
1341 ** Function         btif_hl_init
1342 **
1343 ** Description      HL initialization function.
1344 **
1345 ** Returns          void
1346 **
1347 *******************************************************************************/
btif_hl_init(void)1348 static void btif_hl_init(void){
1349     BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
1350     memset(p_btif_hl_cb, 0, sizeof(btif_hl_cb_t));
1351     btif_hl_init_next_app_id();
1352     btif_hl_init_next_channel_id();
1353 }
1354 /*******************************************************************************
1355 **
1356 ** Function         btif_hl_disable
1357 **
1358 ** Description      Disable initialization function.
1359 **
1360 ** Returns          void
1361 **
1362 *******************************************************************************/
btif_hl_disable(void)1363 static void btif_hl_disable(void){
1364     BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
1365 
1366     if ((p_btif_hl_cb->state != BTIF_HL_STATE_DISABLING) &&
1367         (p_btif_hl_cb->state != BTIF_HL_STATE_DISABLED))
1368     {
1369         btif_hl_set_state(BTIF_HL_STATE_DISABLING);
1370         BTA_HlDisable();
1371     }
1372 }
1373 /*******************************************************************************
1374 **
1375 ** Function      btif_hl_is_no_active_app
1376 **
1377 ** Description  Find whether or not  any APP is still in use
1378 **
1379 ** Returns      BOOLEAN
1380 **
1381 *******************************************************************************/
btif_hl_is_no_active_app(void)1382 static BOOLEAN btif_hl_is_no_active_app(void){
1383     BOOLEAN no_active_app = TRUE;
1384     UINT8 i;
1385 
1386     for (i=0; i < BTA_HL_NUM_APPS ; i ++)
1387     {
1388         if (btif_hl_cb.acb[i].in_use)
1389         {
1390             no_active_app = FALSE;
1391             break;
1392         }
1393     }
1394 
1395     BTIF_TRACE_DEBUG2("%s no_active_app=%d  ", __FUNCTION__, no_active_app );
1396     return no_active_app;
1397 }
1398 
1399 /*******************************************************************************
1400 **
1401 ** Function      btif_hl_free_app_idx
1402 **
1403 ** Description free an application control block
1404 **
1405 ** Returns      void
1406 **
1407 *******************************************************************************/
btif_hl_free_app_idx(UINT8 app_idx)1408 static void btif_hl_free_app_idx(UINT8 app_idx){
1409 
1410     if ((app_idx < BTA_HL_NUM_APPS) && btif_hl_cb.acb[app_idx].in_use )
1411     {
1412         btif_hl_cb.acb[app_idx].in_use = FALSE;
1413         memset (&btif_hl_cb.acb[app_idx], 0, sizeof(btif_hl_app_cb_t));
1414     }
1415 }
1416 /*******************************************************************************
1417 **
1418 ** Function      btif_hl_set_state
1419 **
1420 ** Description set HL state
1421 **
1422 ** Returns      void
1423 **
1424 *******************************************************************************/
btif_hl_set_state(btif_hl_state_t state)1425 static void btif_hl_set_state(btif_hl_state_t state){
1426     BTIF_TRACE_DEBUG2("btif_hl_set_state:  %d ---> %d ", p_btif_hl_cb->state, state);
1427     p_btif_hl_cb->state = state;
1428 }
1429 
1430 /*******************************************************************************
1431 **
1432 ** Function      btif_hl_set_state
1433 **
1434 ** Description get HL state
1435 **
1436 ** Returns      btif_hl_state_t
1437 **
1438 *******************************************************************************/
1439 
btif_hl_get_state(void)1440 static btif_hl_state_t btif_hl_get_state(void){
1441     BTIF_TRACE_DEBUG1("btif_hl_get_state:  %d   ", p_btif_hl_cb->state);
1442     return p_btif_hl_cb->state;
1443 }
1444 
1445 /*******************************************************************************
1446 **
1447 ** Function      btif_hl_find_data_type_idx
1448 **
1449 ** Description  Find the index in the data type table
1450 **
1451 ** Returns      BOOLEAN
1452 **
1453 *******************************************************************************/
btif_hl_find_data_type_idx(UINT16 data_type,UINT8 * p_idx)1454 static BOOLEAN  btif_hl_find_data_type_idx(UINT16 data_type, UINT8 *p_idx){
1455     BOOLEAN found = FALSE;
1456     UINT8 i;
1457 
1458     for (i=0; i< BTIF_HL_DATA_TABLE_SIZE; i++ )
1459     {
1460         if (data_type_table[i].data_type == data_type)
1461         {
1462             found = TRUE;
1463             *p_idx= i;
1464             break;
1465         }
1466     }
1467 
1468     BTIF_TRACE_DEBUG4("%s found=%d, data_type=0x%x idx=%d", __FUNCTION__, found, data_type, i);
1469     return found;
1470 }
1471 
1472 /*******************************************************************************
1473 **
1474 ** Function      btif_hl_get_max_tx_apdu_size
1475 **
1476 ** Description  Find the maximum TX APDU size for the specified data type and
1477 **              MDEP role
1478 **
1479 ** Returns      UINT16
1480 **
1481 *******************************************************************************/
btif_hl_get_max_tx_apdu_size(tBTA_HL_MDEP_ROLE mdep_role,UINT16 data_type)1482 UINT16  btif_hl_get_max_tx_apdu_size(tBTA_HL_MDEP_ROLE mdep_role,
1483                                      UINT16 data_type ){
1484     UINT8 idx;
1485     UINT16 max_tx_apdu_size =0;
1486 
1487     if (btif_hl_find_data_type_idx(data_type, &idx))
1488     {
1489         if (mdep_role == BTA_HL_MDEP_ROLE_SOURCE)
1490         {
1491             max_tx_apdu_size = data_type_table[idx].max_tx_apdu_size;
1492         }
1493         else
1494         {
1495             max_tx_apdu_size = data_type_table[idx].max_rx_apdu_size;
1496         }
1497     }
1498     else
1499     {
1500         if (mdep_role == BTA_HL_MDEP_ROLE_SOURCE)
1501         {
1502             max_tx_apdu_size = BTIF_HL_DEFAULT_SRC_TX_APDU_SIZE;
1503         }
1504         else
1505         {
1506             max_tx_apdu_size = BTIF_HL_DEFAULT_SRC_RX_APDU_SIZE;
1507         }
1508 
1509 
1510     }
1511 
1512     BTIF_TRACE_DEBUG4("%s mdep_role=%d data_type=0x%4x size=%d",
1513                       __FUNCTION__, mdep_role, data_type, max_tx_apdu_size);
1514     return max_tx_apdu_size;
1515 }
1516 
1517 
1518 /*******************************************************************************
1519 **
1520 ** Function      btif_hl_get_max_rx_apdu_size
1521 **
1522 ** Description  Find the maximum RX APDU size for the specified data type and
1523 **              MDEP role
1524 **
1525 ** Returns      UINT16
1526 **
1527 *******************************************************************************/
btif_hl_get_max_rx_apdu_size(tBTA_HL_MDEP_ROLE mdep_role,UINT16 data_type)1528 UINT16  btif_hl_get_max_rx_apdu_size(tBTA_HL_MDEP_ROLE mdep_role,
1529                                      UINT16 data_type ){
1530     UINT8  idx;
1531     UINT16 max_rx_apdu_size =0;
1532 
1533     if (btif_hl_find_data_type_idx(data_type, &idx))
1534     {
1535         if (mdep_role == BTA_HL_MDEP_ROLE_SOURCE)
1536         {
1537             max_rx_apdu_size = data_type_table[idx].max_rx_apdu_size;
1538         }
1539         else
1540         {
1541             max_rx_apdu_size = data_type_table[idx].max_tx_apdu_size;
1542         }
1543     }
1544     else
1545     {
1546         if (mdep_role == BTA_HL_MDEP_ROLE_SOURCE)
1547         {
1548             max_rx_apdu_size = BTIF_HL_DEFAULT_SRC_RX_APDU_SIZE;
1549         }
1550         else
1551         {
1552             max_rx_apdu_size = BTIF_HL_DEFAULT_SRC_TX_APDU_SIZE;
1553         }
1554     }
1555 
1556 
1557     BTIF_TRACE_DEBUG4("%s mdep_role=%d data_type=0x%4x size=%d",
1558                       __FUNCTION__, mdep_role, data_type, max_rx_apdu_size);
1559 
1560     return max_rx_apdu_size;
1561 }
1562 
1563 /*******************************************************************************
1564 **
1565 ** Function      btif_hl_if_channel_setup_pending
1566 **
1567 ** Description
1568 **
1569 ** Returns      BOOLEAN
1570 **
1571 *******************************************************************************/
1572 
btif_hl_get_bta_mdep_role(bthl_mdep_role_t mdep,tBTA_HL_MDEP_ROLE * p)1573 static BOOLEAN btif_hl_get_bta_mdep_role(bthl_mdep_role_t mdep, tBTA_HL_MDEP_ROLE *p){
1574     BOOLEAN status = TRUE;
1575     switch (mdep)
1576     {
1577         case BTHL_MDEP_ROLE_SOURCE:
1578             *p = BTA_HL_MDEP_ROLE_SOURCE;
1579             break;
1580         case BTHL_MDEP_ROLE_SINK:
1581             *p = BTA_HL_MDEP_ROLE_SINK;
1582             break;
1583         default:
1584             status = FALSE;
1585             break;
1586     }
1587 
1588     BTIF_TRACE_DEBUG4("%s status=%d bta_mdep_role=%d (%d:btif)",
1589                       __FUNCTION__, status, *p, mdep);
1590     return status;
1591 }
1592 /*******************************************************************************
1593 **
1594 ** Function btif_hl_get_bta_channel_type
1595 **
1596 ** Description convert bthl channel type to BTA DCH channel type
1597 **
1598 ** Returns BOOLEAN
1599 **
1600 *******************************************************************************/
1601 
btif_hl_get_bta_channel_type(bthl_channel_type_t channel_type,tBTA_HL_DCH_CFG * p)1602 static BOOLEAN btif_hl_get_bta_channel_type(bthl_channel_type_t channel_type, tBTA_HL_DCH_CFG *p){
1603     BOOLEAN status = TRUE;
1604     switch (channel_type)
1605     {
1606         case BTHL_CHANNEL_TYPE_RELIABLE:
1607             *p = BTA_HL_DCH_CFG_RELIABLE;
1608             break;
1609         case BTHL_CHANNEL_TYPE_STREAMING:
1610             *p = BTA_HL_DCH_CFG_STREAMING;
1611             break;
1612         case BTHL_CHANNEL_TYPE_ANY:
1613             *p = BTA_HL_DCH_CFG_NO_PREF;
1614             break;
1615         default:
1616             status = FALSE;
1617             break;
1618     }
1619     BTIF_TRACE_DEBUG3("%s status = %d BTA DCH CFG=%d (1-rel 2-strm",
1620                       __FUNCTION__, status, *p);
1621     return status;
1622 }
1623 /*******************************************************************************
1624 **
1625 ** Function btif_hl_get_next_app_id
1626 **
1627 ** Description get next applcation id
1628 **
1629 ** Returns UINT8
1630 **
1631 *******************************************************************************/
1632 
btif_hl_get_next_app_id()1633 static UINT8 btif_hl_get_next_app_id(){
1634     UINT8 next_app_id = btif_hl_cb.next_app_id;
1635 
1636     btif_hl_cb.next_app_id++;
1637     return next_app_id;
1638 }
1639 /*******************************************************************************
1640 **
1641 ** Function btif_hl_get_next_channel_id
1642 **
1643 ** Description get next channel id
1644 **
1645 ** Returns int
1646 **
1647 *******************************************************************************/
btif_hl_get_next_channel_id(UINT8 app_id)1648 static int btif_hl_get_next_channel_id(UINT8 app_id){
1649     UINT16 next_channel_id = btif_hl_cb.next_channel_id;
1650     int channel_id;
1651     btif_hl_cb.next_channel_id++;
1652     channel_id = (app_id << 16) + next_channel_id;
1653     BTIF_TRACE_DEBUG4("%s channel_id=0x%08x, app_id=0x%02x next_channel_id=0x%04x", __FUNCTION__,
1654                       channel_id, app_id,  next_channel_id);
1655     return channel_id;
1656 }
1657 /*******************************************************************************
1658 **
1659 ** Function btif_hl_get_app_id
1660 **
1661 ** Description get the applicaiton id associated with the channel id
1662 **
1663 ** Returns UINT8
1664 **
1665 *******************************************************************************/
1666 
btif_hl_get_app_id(int channel_id)1667 static UINT8 btif_hl_get_app_id(int channel_id){
1668     UINT8 app_id =(UINT8) (channel_id >> 16);
1669     BTIF_TRACE_DEBUG3("%s channel_id=0x%08x, app_id=0x%02x ", __FUNCTION__,channel_id, app_id);
1670     return app_id;
1671 }
1672 /*******************************************************************************
1673 **
1674 ** Function btif_hl_init_next_app_id
1675 **
1676 ** Description initialize the application id
1677 **
1678 ** Returns void
1679 **
1680 *******************************************************************************/
btif_hl_init_next_app_id(void)1681 static void btif_hl_init_next_app_id(void){
1682     btif_hl_cb.next_app_id = 1;
1683 }
1684 /*******************************************************************************
1685 **
1686 ** Function btif_hl_init_next_channel_id
1687 **
1688 ** Description initialize the channel id
1689 **
1690 ** Returns void
1691 **
1692 *******************************************************************************/
btif_hl_init_next_channel_id(void)1693 static void btif_hl_init_next_channel_id(void){
1694     btif_hl_cb.next_channel_id = 1;
1695 }
1696 
1697 
1698 /*******************************************************************************
1699 **
1700 ** Function      btif_hl_find_app_idx_using_handle
1701 **
1702 ** Description  Find the applicaiton index using handle
1703 **
1704 ** Returns      BOOLEAN
1705 **
1706 *******************************************************************************/
btif_hl_find_app_idx_using_handle(tBTA_HL_APP_HANDLE app_handle,UINT8 * p_app_idx)1707 BOOLEAN btif_hl_find_app_idx_using_handle(tBTA_HL_APP_HANDLE app_handle,
1708                                           UINT8 *p_app_idx){
1709     BOOLEAN found=FALSE;
1710     UINT8 i;
1711 
1712     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_handle == app_handle))
1716         {
1717             found = TRUE;
1718             *p_app_idx = i;
1719             break;
1720         }
1721     }
1722 
1723     BTIF_TRACE_EVENT4("%s status=%d handle=%d app_idx=%d ",
1724                       __FUNCTION__, found, app_handle , i);
1725 
1726     return found;
1727 }
1728 
1729 /*******************************************************************************
1730 **
1731 ** Function      btif_hl_find_app_idx_using_app_id
1732 **
1733 ** Description  Find the applicaiton index using app_id
1734 **
1735 ** Returns      BOOLEAN
1736 **
1737 *******************************************************************************/
btif_hl_find_app_idx_using_app_id(UINT8 app_id,UINT8 * p_app_idx)1738 BOOLEAN btif_hl_find_app_idx_using_app_id(UINT8 app_id,
1739                                           UINT8 *p_app_idx){
1740     BOOLEAN found=FALSE;
1741     UINT8 i;
1742 
1743     for (i=0; i < BTA_HL_NUM_APPS ; i ++)
1744     {
1745         if (btif_hl_cb.acb[i].in_use &&
1746             (btif_hl_cb.acb[i].app_id == app_id))
1747         {
1748             found = TRUE;
1749             *p_app_idx = i;
1750             break;
1751         }
1752     }
1753 
1754     BTIF_TRACE_EVENT4("%s found=%d app_id=%d app_idx=%d ",
1755                       __FUNCTION__, found, app_id , i);
1756 
1757     return found;
1758 }
1759 
1760 /*******************************************************************************
1761 **
1762 ** Function      btif_hl_find_mcl_idx_using_handle
1763 **
1764 ** Description  Find the MCL index using handle
1765 **
1766 ** Returns      BOOLEAN
1767 **
1768 *******************************************************************************/
btif_hl_find_mcl_idx_using_handle(tBTA_HL_MCL_HANDLE mcl_handle,UINT8 * p_app_idx,UINT8 * p_mcl_idx)1769 BOOLEAN btif_hl_find_mcl_idx_using_handle( tBTA_HL_MCL_HANDLE mcl_handle,
1770                                            UINT8 *p_app_idx, UINT8 *p_mcl_idx){
1771     btif_hl_app_cb_t  *p_acb;
1772     BOOLEAN         found=FALSE;
1773     UINT8 i,j;
1774 
1775     for (i=0; i<BTA_HL_NUM_APPS; i++)
1776     {
1777         p_acb =BTIF_HL_GET_APP_CB_PTR(i);
1778         for (j=0; j < BTA_HL_NUM_MCLS ; j++)
1779         {
1780             if (p_acb->mcb[j].in_use)
1781                 BTIF_TRACE_DEBUG3("btif_hl_find_mcl_idx_using_handle:app_idx=%d,"
1782                 "mcl_idx =%d mcl_handle=%d",i,j,p_acb->mcb[j].mcl_handle);
1783             if (p_acb->mcb[j].in_use &&
1784                 (p_acb->mcb[j].mcl_handle == mcl_handle))
1785             {
1786                 found = TRUE;
1787                 *p_app_idx = i;
1788                 *p_mcl_idx = j;
1789                 break;
1790             }
1791         }
1792     }
1793     BTIF_TRACE_DEBUG4("%s found=%d app_idx=%d mcl_idx=%d",__FUNCTION__,
1794                       found, i, j);
1795     return found;
1796 }
1797 
1798 /*******************************************************************************
1799 **
1800 ** Function      btif_hl_find_mdl_idx_using_mdl_id
1801 **
1802 ** Description  Find the mdl index using mdl_id
1803 **
1804 ** Returns      BOOLEAN
1805 **
1806 *******************************************************************************/
btif_hl_find_mcl_idx_using_mdl_id(UINT8 mdl_id,UINT8 mcl_handle,UINT8 * p_app_idx,UINT8 * p_mcl_idx)1807 BOOLEAN btif_hl_find_mcl_idx_using_mdl_id( UINT8 mdl_id,UINT8 mcl_handle,
1808                                            UINT8 *p_app_idx, UINT8 *p_mcl_idx){
1809     btif_hl_app_cb_t  *p_acb;
1810     btif_hl_mcl_cb_t  *p_mcb;
1811     BOOLEAN         found=FALSE;
1812     UINT8 i,j,x;
1813 
1814     for (i=0; i<BTA_HL_NUM_APPS; i++)
1815     {
1816         p_acb =BTIF_HL_GET_APP_CB_PTR(i);
1817         for (j=0; j < BTA_HL_NUM_MCLS ; j++)
1818         {
1819             if (p_acb->mcb[j].in_use &&
1820                 (p_acb->mcb[j].mcl_handle == mcl_handle))
1821             {
1822                     p_mcb = &p_acb->mcb[j];
1823                     BTIF_TRACE_DEBUG1("btif_hl_find_mcl_idx_using_mdl_id: mcl handle found j =%d",j);
1824                     for (x=0; x < BTA_HL_NUM_MDLS_PER_MCL ; x ++)
1825                     {
1826                         if (p_mcb->mdl[x].in_use && p_mcb->mdl[x].mdl_id == mdl_id)
1827                         {
1828                             BTIF_TRACE_DEBUG1("btif_hl_find_mcl_idx_using_mdl_id:found x =%d",x);
1829                             found = TRUE;
1830                             *p_app_idx = i;
1831                             *p_mcl_idx = j;
1832                             break;
1833                         }
1834                     }
1835             }
1836         }
1837     }
1838     BTIF_TRACE_DEBUG4("%s found=%d app_idx=%d mcl_idx=%d",__FUNCTION__,
1839                       found, i, j);
1840     return found;
1841 }
1842 
1843 /*******************************************************************************
1844 **
1845 ** Function      btif_hl_find_mcl_idx_using_deleted_mdl_id
1846 **
1847 ** Description  Find the app index deleted_mdl_id
1848 **
1849 ** Returns      BOOLEAN
1850 **
1851 *******************************************************************************/
btif_hl_find_app_idx_using_deleted_mdl_id(UINT8 mdl_id,UINT8 * p_app_idx)1852 BOOLEAN btif_hl_find_app_idx_using_deleted_mdl_id( UINT8 mdl_id,
1853                                            UINT8 *p_app_idx){
1854     btif_hl_app_cb_t  *p_acb;
1855     BOOLEAN         found=FALSE;
1856     UINT8 i,j;
1857 
1858     for (i=0; i<BTA_HL_NUM_APPS; i++)
1859     {
1860         p_acb =BTIF_HL_GET_APP_CB_PTR(i);
1861         if (p_acb->delete_mdl.active)
1862                 BTIF_TRACE_DEBUG3("btif_hl_find_app_idx_using_deleted_mdl_id: app_idx=%d,"
1863                     "mcl_idx =%d mcl_handle=%d",i,j,p_acb->mcb[j].mcl_handle);
1864             if (p_acb->delete_mdl.active &&
1865                 (p_acb->delete_mdl.mdl_id == mdl_id))
1866             {
1867                 found = TRUE;
1868                 *p_app_idx = i;
1869                 break;
1870             }
1871     }
1872     BTIF_TRACE_DEBUG3("%s found=%d app_idx=%d",__FUNCTION__,
1873                       found, i);
1874     return found;
1875 }
1876 
1877 /*******************************************************************************
1878 **
1879 ** Function      btif_hl_stop_timer_using_handle
1880 **
1881 ** Description  clean control channel cb using handle
1882 **
1883 ** Returns      void
1884 **
1885 *******************************************************************************/
btif_hl_stop_timer_using_handle(tBTA_HL_MCL_HANDLE mcl_handle)1886 static void btif_hl_stop_timer_using_handle( tBTA_HL_MCL_HANDLE mcl_handle){
1887     btif_hl_app_cb_t  *p_acb;
1888     BOOLEAN         found=FALSE;
1889     UINT8 i,j;
1890 
1891     for (i=0; i<BTA_HL_NUM_APPS; i++)
1892     {
1893         p_acb =BTIF_HL_GET_APP_CB_PTR(i);
1894         for (j=0; j < BTA_HL_NUM_MCLS ; j++)
1895         {
1896             if (p_acb->mcb[j].in_use &&
1897                 (p_acb->mcb[j].mcl_handle == mcl_handle))
1898             {
1899                 btif_hl_stop_cch_timer(i, j);
1900             }
1901         }
1902     }
1903 }
1904 
1905 /*******************************************************************************
1906 **
1907 ** Function      btif_hl_find_mcl_idx_using_app_idx
1908 **
1909 ** Description  Find the MCL index using handle
1910 **
1911 ** Returns      BOOLEAN
1912 **
1913 *******************************************************************************/
btif_hl_find_mcl_idx_using_app_idx(tBTA_HL_MCL_HANDLE mcl_handle,UINT8 p_app_idx,UINT8 * p_mcl_idx)1914 BOOLEAN btif_hl_find_mcl_idx_using_app_idx( tBTA_HL_MCL_HANDLE mcl_handle,
1915                                            UINT8 p_app_idx, UINT8 *p_mcl_idx){
1916     btif_hl_app_cb_t  *p_acb;
1917     BOOLEAN         found=FALSE;
1918     UINT8 i,j;
1919 
1920     p_acb =BTIF_HL_GET_APP_CB_PTR(p_app_idx);
1921     for (j=0; j < BTA_HL_NUM_MCLS ; j++)
1922     {
1923         if (p_acb->mcb[j].in_use &&
1924             (p_acb->mcb[j].mcl_handle == mcl_handle))
1925         {
1926             found = TRUE;
1927             *p_mcl_idx = j;
1928             break;
1929         }
1930     }
1931     BTIF_TRACE_DEBUG3("%s found=%dmcl_idx=%d",__FUNCTION__,
1932                       found, j);
1933     return found;
1934 }
1935 
1936 /*******************************************************************************
1937 **
1938 ** Function      btif_hl_clean_mdls_using_app_idx
1939 **
1940 ** Description  clean dch cpntrol bloack using app_idx
1941 **
1942 ** Returns      void
1943 **
1944 *******************************************************************************/
btif_hl_clean_mdls_using_app_idx(UINT8 app_idx)1945 void btif_hl_clean_mdls_using_app_idx( UINT8 app_idx){
1946     btif_hl_app_cb_t  *p_acb;
1947     btif_hl_mcl_cb_t  *p_mcb;
1948     btif_hl_mdl_cb_t  *p_dcb;
1949     UINT8 i,j,x,y;
1950     bt_bdaddr_t     bd_addr;
1951 
1952         p_acb =BTIF_HL_GET_APP_CB_PTR(app_idx);
1953         for (j=0; j < BTA_HL_NUM_MCLS ; j++)
1954         {
1955             if (p_acb->mcb[j].in_use)
1956             {
1957                     p_mcb = &p_acb->mcb[j];
1958                     BTIF_TRACE_DEBUG1("btif_hl_find_mcl_idx_using_mdl_id: mcl handle found j =%d",j);
1959                     for (x=0; x < BTA_HL_NUM_MDLS_PER_MCL ; x ++)
1960                     {
1961                         if (p_mcb->mdl[x].in_use)
1962                         {
1963                             p_dcb = BTIF_HL_GET_MDL_CB_PTR(app_idx, j,x);
1964                             btif_hl_release_socket(app_idx,j,x);
1965                             for (y=0; y<6; y++)
1966                             {
1967                                 bd_addr.address[y] = p_mcb->bd_addr[y];
1968                             }
1969                             BTIF_HL_CALL_CBACK(bt_hl_callbacks, channel_state_cb,  p_acb->app_id,
1970                                                &bd_addr, p_dcb->local_mdep_cfg_idx,
1971                                                p_dcb->channel_id, BTHL_CONN_STATE_DISCONNECTED, 0 );
1972                             btif_hl_clean_mdl_cb(p_dcb);
1973                             if (!btif_hl_num_dchs_in_use(p_mcb->mcl_handle))
1974                                     BTA_HlCchClose(p_mcb->mcl_handle);
1975                             BTIF_TRACE_DEBUG1("remote DCH close success mdl_idx=%d", x);
1976                         }
1977                     }
1978             }
1979         }
1980 }
1981 
1982 /*******************************************************************************
1983 **
1984 ** Function      btif_hl_find_app_idx
1985 **
1986 ** Description  Find the application index using application ID
1987 **
1988 ** Returns      BOOLEAN
1989 **
1990 *******************************************************************************/
btif_hl_find_app_idx(UINT8 app_id,UINT8 * p_app_idx)1991 BOOLEAN btif_hl_find_app_idx(UINT8 app_id, UINT8 *p_app_idx){
1992     BOOLEAN found=FALSE;
1993     UINT8 i;
1994 
1995     for (i=0; i < BTA_HL_NUM_APPS ; i ++)
1996     {
1997 
1998         if (btif_hl_cb.acb[i].in_use &&
1999             (btif_hl_cb.acb[i].app_id == app_id))
2000         {
2001             found = TRUE;
2002             *p_app_idx = i;
2003             break;
2004         }
2005     }
2006     BTIF_TRACE_DEBUG3("%s found=%d app_idx=%d", __FUNCTION__, found, i );
2007 
2008     return found;
2009 }
2010 
2011 /*******************************************************************************
2012 **
2013 ** Function      btif_hl_find_app_idx
2014 **
2015 ** Description  Find the application index using application ID
2016 **
2017 ** Returns      BOOLEAN
2018 **
2019 *******************************************************************************/
btif_hl_find_app_idx_using_mdepId(UINT8 mdep_id,UINT8 * p_app_idx)2020 BOOLEAN btif_hl_find_app_idx_using_mdepId(UINT8 mdep_id, UINT8 *p_app_idx){
2021     BOOLEAN found=FALSE;
2022     UINT8 i;
2023 
2024     for (i=0; i < BTA_HL_NUM_APPS ; i ++)
2025     {
2026         BTIF_TRACE_DEBUG1("btif_hl_find_app_idx_using_mdepId: MDEP-ID = %d",
2027                 btif_hl_cb.acb[i].sup_feature.mdep[0].mdep_id);
2028         if (btif_hl_cb.acb[i].in_use &&
2029             (btif_hl_cb.acb[i].sup_feature.mdep[0].mdep_id == mdep_id))
2030         {
2031             found = TRUE;
2032             *p_app_idx = i;
2033             break;
2034         }
2035     }
2036     BTIF_TRACE_DEBUG3("%s found=%d app_idx=%d", __FUNCTION__, found, i );
2037 
2038     return found;
2039 }
2040 
2041 /*******************************************************************************
2042 **
2043 ** Function      btif_hl_find_avail_mdl_idx
2044 **
2045 ** Description  Find a not in-use MDL index
2046 **
2047 ** Returns      BOOLEAN
2048 **
2049 *******************************************************************************/
btif_hl_find_avail_mdl_idx(UINT8 app_idx,UINT8 mcl_idx,UINT8 * p_mdl_idx)2050 BOOLEAN btif_hl_find_avail_mdl_idx(UINT8 app_idx, UINT8 mcl_idx,
2051                                    UINT8 *p_mdl_idx){
2052     btif_hl_mcl_cb_t      *p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
2053     BOOLEAN found=FALSE;
2054     UINT8 i;
2055 
2056     for (i=0; i < BTA_HL_NUM_MDLS_PER_MCL ; i ++)
2057     {
2058         if (!p_mcb->mdl[i].in_use)
2059         {
2060             btif_hl_clean_mdl_cb(&p_mcb->mdl[i]);
2061             found = TRUE;
2062             *p_mdl_idx = i;
2063             break;
2064         }
2065     }
2066 
2067     BTIF_TRACE_DEBUG3("%s found=%d idx=%d",__FUNCTION__, found, i);
2068     return found;
2069 }
2070 
2071 /*******************************************************************************
2072 **
2073 ** Function      btif_hl_find_avail_mcl_idx
2074 **
2075 ** Description  Find a not in-use MDL index
2076 **
2077 ** Returns      BOOLEAN
2078 **
2079 *******************************************************************************/
btif_hl_find_avail_mcl_idx(UINT8 app_idx,UINT8 * p_mcl_idx)2080 BOOLEAN btif_hl_find_avail_mcl_idx(UINT8 app_idx, UINT8 *p_mcl_idx){
2081     BOOLEAN found=FALSE;
2082     UINT8 i;
2083 
2084     for (i=0; i < BTA_HL_NUM_MCLS ; i ++)
2085     {
2086         if (!btif_hl_cb.acb[app_idx].mcb[i].in_use)
2087         {
2088             found = TRUE;
2089             *p_mcl_idx = i;
2090             break;
2091         }
2092     }
2093     BTIF_TRACE_DEBUG3("%s found=%d mcl_idx=%d", __FUNCTION__, found, i);
2094     return found;
2095 }
2096 
2097 /*******************************************************************************
2098 **
2099 ** Function      btif_hl_find_avail_app_idx
2100 **
2101 ** Description  Find a not in-use APP index
2102 **
2103 ** Returns      BOOLEAN
2104 **
2105 *******************************************************************************/
btif_hl_find_avail_app_idx(UINT8 * p_idx)2106 static BOOLEAN btif_hl_find_avail_app_idx(UINT8 *p_idx){
2107     BOOLEAN found = FALSE;
2108     UINT8 i;
2109 
2110     for (i=0; i < BTA_HL_NUM_APPS ; i ++)
2111     {
2112         if (!btif_hl_cb.acb[i].in_use)
2113         {
2114             found = TRUE;
2115             *p_idx = i;
2116             break;
2117         }
2118     }
2119 
2120     BTIF_TRACE_DEBUG3("%s found=%d app_idx=%d", __FUNCTION__, found, i);
2121     return found;
2122 }
2123 
2124 
2125 /*******************************************************************************
2126 **
2127 ** Function         btif_hl_proc_dereg_cfm
2128 **
2129 ** Description      Process the de-registration confirmation
2130 **
2131 ** Returns          Nothing
2132 **
2133 *******************************************************************************/
btif_hl_proc_dereg_cfm(tBTA_HL * p_data)2134 static void btif_hl_proc_dereg_cfm(tBTA_HL *p_data)
2135 
2136 {
2137     btif_hl_app_cb_t        *p_acb;
2138     UINT8                   app_idx;
2139     int                     app_id = 0;
2140     bthl_app_reg_state_t    state = BTHL_APP_REG_STATE_DEREG_SUCCESS;
2141     bt_status_t             status            = BT_STATUS_SUCCESS;
2142 
2143     BTIF_TRACE_DEBUG3("%s de-reg status=%d app_handle=%d", __FUNCTION__,
2144                 p_data->dereg_cfm.status, p_data->dereg_cfm.app_handle);
2145 
2146     if (btif_hl_find_app_idx_using_app_id(p_data->dereg_cfm.app_id, &app_idx))
2147     {
2148         p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
2149         app_id = (int) p_acb->app_id;
2150         if (p_data->dereg_cfm.status == BTA_HL_STATUS_OK)
2151         {
2152             btif_hl_clean_mdls_using_app_idx(app_idx);
2153             memset(p_acb, 0,sizeof(btif_hl_app_cb_t));
2154         }
2155         else
2156             state = BTHL_APP_REG_STATE_DEREG_FAILED;
2157 
2158         BTIF_TRACE_DEBUG2("call reg state callback app_id=%d state=%d", app_id, state);
2159         BTIF_HL_CALL_CBACK(bt_hl_callbacks, app_reg_state_cb, app_id, state );
2160 
2161         if (btif_hl_is_no_active_app())
2162         {
2163             btif_hl_disable();
2164         }
2165     }
2166 }
2167 
2168 /*******************************************************************************
2169 **
2170 ** Function         btif_hl_proc_reg_cfm
2171 **
2172 ** Description      Process the registration confirmation
2173 **
2174 ** Returns          Nothing
2175 **
2176 *******************************************************************************/
btif_hl_proc_reg_cfm(tBTA_HL * p_data)2177 static void btif_hl_proc_reg_cfm(tBTA_HL *p_data){
2178     btif_hl_app_cb_t       *p_acb;
2179     UINT8                  app_idx;
2180     bthl_app_reg_state_t   state = BTHL_APP_REG_STATE_REG_SUCCESS;
2181     bt_status_t            bt_status;
2182 
2183     BTIF_TRACE_DEBUG3("%s reg status=%d app_handle=%d", __FUNCTION__, p_data->reg_cfm.status, p_data->reg_cfm.app_handle);
2184 
2185     if (btif_hl_find_app_idx(p_data->reg_cfm.app_id, &app_idx))
2186     {
2187         p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
2188         if (p_data->reg_cfm.status == BTA_HL_STATUS_OK)
2189         {
2190             p_acb->app_handle = p_data->reg_cfm.app_handle;
2191         }
2192         else
2193         {
2194             btif_hl_free_app_idx(app_idx);
2195             reg_counter--;
2196             state = BTHL_APP_REG_STATE_REG_FAILED;
2197         }
2198 
2199         BTIF_TRACE_DEBUG3("%s call reg state callback app_id=%d reg state=%d", __FUNCTION__,  p_data->reg_cfm.app_id, state);
2200         BTIF_HL_CALL_CBACK(bt_hl_callbacks, app_reg_state_cb, ((int) p_data->reg_cfm.app_id), state );
2201     }
2202 }
2203 
2204 /*******************************************************************************
2205 **
2206 ** Function         btif_hl_proc_sdp_info_ind
2207 **
2208 ** Description      Process the SDP info indication
2209 **
2210 ** Returns          Nothing
2211 **
2212 *******************************************************************************/
btif_hl_proc_sdp_info_ind(tBTA_HL * p_data)2213 static void btif_hl_proc_sdp_info_ind(tBTA_HL *p_data)
2214 
2215 {
2216     btif_hl_app_cb_t         *p_acb;
2217     UINT8                   app_idx;
2218 
2219     BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
2220     if (btif_hl_find_app_idx_using_handle(p_data->sdp_info_ind.app_handle, &app_idx))
2221     {
2222         p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
2223         memcpy(&p_acb->sdp_info_ind, &p_data->sdp_info_ind, sizeof(tBTA_HL_SDP_INFO_IND));
2224     }
2225 }
2226 /*******************************************************************************
2227 **
2228 ** Function btif_hl_set_chan_cb_state
2229 **
2230 ** Description set the channel callback state
2231 **
2232 ** Returns void
2233 **
2234 *******************************************************************************/
btif_hl_set_chan_cb_state(UINT8 app_idx,UINT8 mcl_idx,btif_hl_chan_cb_state_t state)2235 void btif_hl_set_chan_cb_state(UINT8 app_idx, UINT8 mcl_idx, btif_hl_chan_cb_state_t state){
2236     btif_hl_pending_chan_cb_t   *p_pcb = BTIF_HL_GET_PCB_PTR(app_idx, mcl_idx);
2237     btif_hl_chan_cb_state_t cur_state = p_pcb->cb_state;
2238 
2239     if (cur_state != state)
2240     {
2241         p_pcb->cb_state = state;
2242         BTIF_TRACE_DEBUG3("%s state %d--->%d",__FUNCTION__, cur_state, state);
2243     }
2244 
2245 
2246 }
2247 /*******************************************************************************
2248 **
2249 ** Function btif_hl_send_destroyed_cb
2250 **
2251 ** Description send the channel destroyed callback
2252 **
2253 ** Returns void
2254 **
2255 *******************************************************************************/
btif_hl_send_destroyed_cb(btif_hl_app_cb_t * p_acb)2256 void btif_hl_send_destroyed_cb(btif_hl_app_cb_t        *p_acb ){
2257     bt_bdaddr_t     bd_addr;
2258     int             app_id = (int) btif_hl_get_app_id(p_acb->delete_mdl.channel_id);
2259 
2260     btif_hl_copy_bda(&bd_addr, p_acb->delete_mdl.bd_addr);
2261     BTIF_TRACE_DEBUG1("%s",__FUNCTION__);
2262     BTIF_TRACE_DEBUG4("call channel state callback channel_id=0x%08x mdep_cfg_idx=%d, state=%d fd=%d",p_acb->delete_mdl.channel_id,
2263                       p_acb->delete_mdl.mdep_cfg_idx, BTHL_CONN_STATE_DESTROYED, 0);
2264     btif_hl_display_bt_bda(&bd_addr);
2265 
2266     BTIF_HL_CALL_CBACK(bt_hl_callbacks, channel_state_cb,  app_id,
2267                        &bd_addr, p_acb->delete_mdl.mdep_cfg_idx,
2268                        p_acb->delete_mdl.channel_id, BTHL_CONN_STATE_DESTROYED, 0 );
2269 }
2270 /*******************************************************************************
2271 **
2272 ** Function btif_hl_send_disconnecting_cb
2273 **
2274 ** Description send a channel disconnecting callback
2275 **
2276 ** Returns void
2277 **
2278 *******************************************************************************/
btif_hl_send_disconnecting_cb(UINT8 app_idx,UINT8 mcl_idx,UINT8 mdl_idx)2279 void btif_hl_send_disconnecting_cb(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx){
2280     btif_hl_mdl_cb_t        *p_dcb = BTIF_HL_GET_MDL_CB_PTR( app_idx,  mcl_idx, mdl_idx);
2281     btif_hl_soc_cb_t        *p_scb = p_dcb->p_scb;
2282     bt_bdaddr_t             bd_addr;
2283     int                     app_id = (int) btif_hl_get_app_id(p_scb->channel_id);
2284 
2285     btif_hl_copy_bda(&bd_addr, p_scb->bd_addr);
2286 
2287     BTIF_TRACE_DEBUG1("%s",__FUNCTION__);
2288     BTIF_TRACE_DEBUG4("call channel state callback  channel_id=0x%08x mdep_cfg_idx=%d, state=%d fd=%d",p_scb->channel_id,
2289                       p_scb->mdep_cfg_idx, BTHL_CONN_STATE_DISCONNECTING, p_scb->socket_id[0]);
2290     btif_hl_display_bt_bda(&bd_addr);
2291     BTIF_HL_CALL_CBACK(bt_hl_callbacks, channel_state_cb,  app_id,
2292                        &bd_addr, p_scb->mdep_cfg_idx,
2293                        p_scb->channel_id, BTHL_CONN_STATE_DISCONNECTING, p_scb->socket_id[0] );
2294 }
2295 /*******************************************************************************
2296 **
2297 ** Function btif_hl_send_setup_connecting_cb
2298 **
2299 ** Description send a channel connecting callback
2300 **
2301 ** Returns void
2302 **
2303 *******************************************************************************/
btif_hl_send_setup_connecting_cb(UINT8 app_idx,UINT8 mcl_idx)2304 void btif_hl_send_setup_connecting_cb(UINT8 app_idx, UINT8 mcl_idx){
2305     btif_hl_pending_chan_cb_t   *p_pcb = BTIF_HL_GET_PCB_PTR(app_idx, mcl_idx);
2306     bt_bdaddr_t                 bd_addr;
2307     int                         app_id = (int) btif_hl_get_app_id(p_pcb->channel_id);
2308 
2309     btif_hl_copy_bda(&bd_addr, p_pcb->bd_addr);
2310 
2311     if (p_pcb->in_use && p_pcb->cb_state == BTIF_HL_CHAN_CB_STATE_CONNECTING_PENDING)
2312     {
2313         BTIF_TRACE_DEBUG1("%s",__FUNCTION__);
2314         BTIF_TRACE_DEBUG4("call channel state callback  channel_id=0x%08x mdep_cfg_idx=%d state=%d fd=%d",p_pcb->channel_id,
2315                           p_pcb->mdep_cfg_idx, BTHL_CONN_STATE_CONNECTING, 0);
2316         btif_hl_display_bt_bda(&bd_addr);
2317 
2318         BTIF_HL_CALL_CBACK(bt_hl_callbacks, channel_state_cb, app_id,
2319                            &bd_addr, p_pcb->mdep_cfg_idx,
2320                            p_pcb->channel_id, BTHL_CONN_STATE_CONNECTING, 0 );
2321         btif_hl_set_chan_cb_state(app_idx, mcl_idx, BTIF_HL_CHAN_CB_STATE_CONNECTED_PENDING);
2322     }
2323 }
2324 /*******************************************************************************
2325 **
2326 ** Function btif_hl_send_setup_disconnected_cb
2327 **
2328 ** Description send a channel disconnected callback
2329 **
2330 ** Returns void
2331 **
2332 *******************************************************************************/
btif_hl_send_setup_disconnected_cb(UINT8 app_idx,UINT8 mcl_idx)2333 void btif_hl_send_setup_disconnected_cb(UINT8 app_idx, UINT8 mcl_idx){
2334     btif_hl_pending_chan_cb_t   *p_pcb = BTIF_HL_GET_PCB_PTR(app_idx, mcl_idx);
2335     bt_bdaddr_t                 bd_addr;
2336     int                         app_id = (int) btif_hl_get_app_id(p_pcb->channel_id);
2337 
2338     btif_hl_copy_bda(&bd_addr, p_pcb->bd_addr);
2339 
2340     BTIF_TRACE_DEBUG2("%s p_pcb->in_use=%d",__FUNCTION__, p_pcb->in_use);
2341     if (p_pcb->in_use)
2342     {
2343         BTIF_TRACE_DEBUG1("%p_pcb->cb_state=%d",p_pcb->cb_state);
2344         if (p_pcb->cb_state == BTIF_HL_CHAN_CB_STATE_CONNECTING_PENDING)
2345         {
2346             BTIF_TRACE_DEBUG4("call channel state callback  channel_id=0x%08x mdep_cfg_idx=%d state=%d fd=%d",p_pcb->channel_id,
2347                               p_pcb->mdep_cfg_idx, BTHL_CONN_STATE_CONNECTING, 0);
2348             btif_hl_display_bt_bda(&bd_addr);
2349             BTIF_HL_CALL_CBACK(bt_hl_callbacks, channel_state_cb, app_id,
2350                                &bd_addr, p_pcb->mdep_cfg_idx,
2351                                p_pcb->channel_id, BTHL_CONN_STATE_CONNECTING, 0 );
2352 
2353             BTIF_TRACE_DEBUG4("call channel state callback  channel_id=0x%08x mdep_cfg_idx=%d state=%d fd=%d",p_pcb->channel_id,
2354                               p_pcb->mdep_cfg_idx, BTHL_CONN_STATE_DISCONNECTED, 0);
2355             btif_hl_display_bt_bda(&bd_addr);
2356             BTIF_HL_CALL_CBACK(bt_hl_callbacks, channel_state_cb, app_id,
2357                                &bd_addr, p_pcb->mdep_cfg_idx,
2358                                p_pcb->channel_id, BTHL_CONN_STATE_DISCONNECTED, 0 );
2359         }
2360         else if (p_pcb->cb_state == BTIF_HL_CHAN_CB_STATE_CONNECTED_PENDING)
2361         {
2362             BTIF_TRACE_DEBUG4("call channel state callback  channel_id=0x%08x mdep_cfg_idx=%d state=%d fd=%d",p_pcb->channel_id,
2363                               p_pcb->mdep_cfg_idx, BTHL_CONN_STATE_DISCONNECTED, 0);
2364             btif_hl_display_bt_bda(&bd_addr);
2365             BTIF_HL_CALL_CBACK(bt_hl_callbacks, channel_state_cb,  app_id,
2366                                &bd_addr, p_pcb->mdep_cfg_idx,
2367                                p_pcb->channel_id, BTHL_CONN_STATE_DISCONNECTED, 0 );
2368         }
2369         btif_hl_clean_pcb(p_pcb);
2370     }
2371 }
2372 /*******************************************************************************
2373 **
2374 ** Function         btif_hl_proc_sdp_query_cfm
2375 **
2376 ** Description      Process the SDP query confirmation
2377 **
2378 ** Returns          Nothing
2379 **
2380 *******************************************************************************/
btif_hl_proc_sdp_query_cfm(tBTA_HL * p_data)2381 static BOOLEAN btif_hl_proc_sdp_query_cfm(tBTA_HL *p_data){
2382     btif_hl_app_cb_t                *p_acb;
2383     btif_hl_mcl_cb_t                *p_mcb;
2384     tBTA_HL_SDP                     *p_sdp;
2385     tBTA_HL_CCH_OPEN_PARAM          open_param;
2386     UINT8                           app_idx, mcl_idx, sdp_idx = 0;
2387     UINT8                           num_recs, i, num_mdeps, j;
2388     btif_hl_cch_op_t                old_cch_oper;
2389     BOOLEAN                         status =FALSE;
2390     btif_hl_pending_chan_cb_t     *p_pcb;
2391 
2392     BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
2393 
2394     p_sdp = p_data->sdp_query_cfm.p_sdp;
2395     num_recs = p_sdp->num_recs;
2396 
2397     BTIF_TRACE_DEBUG1("num of SDP records=%d",num_recs);
2398     for (i=0; i<num_recs; i++)
2399     {
2400         BTIF_TRACE_DEBUG3("rec_idx=%d ctrl_psm=0x%x data_psm=0x%x",
2401                           (i+1),p_sdp->sdp_rec[i].ctrl_psm, p_sdp->sdp_rec[i].data_psm);
2402         BTIF_TRACE_DEBUG1("MCAP supported procedures=0x%x",p_sdp->sdp_rec[i].mcap_sup_proc);
2403         num_mdeps = p_sdp->sdp_rec[i].num_mdeps;
2404         BTIF_TRACE_DEBUG1("num of mdeps =%d",num_mdeps);
2405         for (j=0; j< num_mdeps; j++)
2406         {
2407             BTIF_TRACE_DEBUG4("mdep_idx=%d mdep_id=0x%x data_type=0x%x mdep_role=0x%x",
2408                               (j+1),
2409                               p_sdp->sdp_rec[i].mdep_cfg[j].mdep_id,
2410                               p_sdp->sdp_rec[i].mdep_cfg[j].data_type,
2411                               p_sdp->sdp_rec[i].mdep_cfg[j].mdep_role );
2412         }
2413     }
2414 
2415         if (btif_hl_find_app_idx_using_app_id(p_data->sdp_query_cfm.app_id, &app_idx))
2416         {
2417             p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
2418 
2419             if (btif_hl_find_mcl_idx(app_idx, p_data->sdp_query_cfm.bd_addr, &mcl_idx))
2420             {
2421                 p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
2422                 if (p_mcb->cch_oper != BTIF_HL_CCH_OP_NONE)
2423                 {
2424                     memcpy(&p_mcb->sdp, p_sdp, sizeof(tBTA_HL_SDP));
2425                     old_cch_oper = p_mcb->cch_oper;
2426                     p_mcb->cch_oper = BTIF_HL_CCH_OP_NONE;
2427 
2428                     switch (old_cch_oper)
2429                     {
2430                         case BTIF_HL_CCH_OP_MDEP_FILTERING:
2431                             status = btif_hl_find_sdp_idx_using_mdep_filter(app_idx,
2432                                                                     mcl_idx, &sdp_idx);
2433                             break;
2434                         default:
2435                             break;
2436                     }
2437 
2438                     if (status)
2439                     {
2440                         p_mcb->sdp_idx       = sdp_idx;
2441                         p_mcb->valid_sdp_idx = TRUE;
2442                         p_mcb->ctrl_psm      = p_mcb->sdp.sdp_rec[sdp_idx].ctrl_psm;
2443 
2444                         switch (old_cch_oper)
2445                         {
2446                             case BTIF_HL_CCH_OP_MDEP_FILTERING:
2447                                 p_pcb = BTIF_HL_GET_PCB_PTR(app_idx, mcl_idx);
2448                                 if (p_pcb->in_use)
2449                                 {
2450                                     if (!p_pcb->abort_pending)
2451                                     {
2452                                         switch (p_pcb->op)
2453                                         {
2454                                             case BTIF_HL_PEND_DCH_OP_OPEN:
2455                                                 btif_hl_send_setup_connecting_cb(app_idx, mcl_idx);
2456                                                 break;
2457                                             case BTIF_HL_PEND_DCH_OP_DELETE_MDL:
2458                                             default:
2459                                                 break;
2460                                         }
2461                                         open_param.ctrl_psm = p_mcb->ctrl_psm;
2462                                         bdcpy(open_param.bd_addr, p_mcb->bd_addr);
2463                                         open_param.sec_mask =
2464                                                 (BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT);
2465                                         BTA_HlCchOpen(p_acb->app_id,p_acb->app_handle, &open_param);
2466                                     }
2467                                     else
2468                                     {
2469                                         BTIF_TRACE_DEBUG0("channel abort pending");
2470                                     }
2471                                 }
2472                                 break;
2473 
2474                             case BTIF_HL_CCH_OP_DCH_OPEN:
2475                                 status = btif_hl_proc_pending_op(app_idx,mcl_idx);
2476                                 break;
2477 
2478                             default:
2479                                 BTIF_TRACE_ERROR1("Invalid CCH oper %d", old_cch_oper);
2480                                 break;
2481                         }
2482                     }
2483                     else
2484                     {
2485                         BTIF_TRACE_ERROR0("Can not find SDP idx discard CCH Open request");
2486                     }
2487                 }
2488             }
2489         }
2490     return status;
2491 }
2492 
2493 
2494 /*******************************************************************************
2495 **
2496 ** Function         btif_hl_proc_cch_open_ind
2497 **
2498 ** Description      Process the CCH open indication
2499 **
2500 ** Returns          Nothing
2501 **
2502 *******************************************************************************/
btif_hl_proc_cch_open_ind(tBTA_HL * p_data)2503 static void btif_hl_proc_cch_open_ind(tBTA_HL *p_data)
2504 
2505 {
2506     btif_hl_mcl_cb_t         *p_mcb;
2507     UINT8                   app_idx, mcl_idx;
2508     int                     i;
2509 
2510     BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
2511     for(i=0; i<BTA_HL_NUM_APPS; i++)
2512     {
2513         if (btif_hl_cb.acb[i].in_use)
2514         {
2515             if (!btif_hl_find_mcl_idx(i, p_data->cch_open_ind.bd_addr, &mcl_idx))
2516             {
2517                 if (btif_hl_find_avail_mcl_idx(i, &mcl_idx))
2518                 {
2519                     p_mcb = BTIF_HL_GET_MCL_CB_PTR(i, mcl_idx);
2520                     memset(p_mcb, 0, sizeof(btif_hl_mcl_cb_t));
2521                     p_mcb->in_use = TRUE;
2522                     p_mcb->is_connected = TRUE;
2523                     p_mcb->mcl_handle = p_data->cch_open_ind.mcl_handle;
2524                     bdcpy(p_mcb->bd_addr, p_data->cch_open_ind.bd_addr);
2525                     btif_hl_start_cch_timer(i, mcl_idx);
2526                 }
2527             }
2528             else
2529             {
2530                 BTIF_TRACE_ERROR0("The MCL already exist for cch_open_ind");
2531             }
2532         }
2533     }
2534 }
2535 
2536 /*******************************************************************************
2537 **
2538 ** Function         btif_hl_proc_pending_op
2539 **
2540 ** Description      Process the pending dch operation.
2541 **
2542 ** Returns          Nothing
2543 **
2544 *******************************************************************************/
btif_hl_proc_pending_op(UINT8 app_idx,UINT8 mcl_idx)2545 BOOLEAN btif_hl_proc_pending_op(UINT8 app_idx, UINT8 mcl_idx)
2546 
2547 {
2548 
2549     btif_hl_app_cb_t            *p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
2550     btif_hl_mcl_cb_t            *p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
2551     btif_hl_pending_chan_cb_t   *p_pcb;
2552     BOOLEAN                     status = FALSE;
2553     tBTA_HL_DCH_OPEN_PARAM      dch_open;
2554     tBTA_HL_MDL_ID              mdl_id;
2555     tBTA_HL_DCH_RECONNECT_PARAM reconnect_param;
2556 
2557     p_pcb = BTIF_HL_GET_PCB_PTR(app_idx, mcl_idx);
2558     if (p_pcb->in_use)
2559     {
2560         switch (p_pcb->op)
2561         {
2562             case BTIF_HL_PEND_DCH_OP_OPEN:
2563                 if (!p_pcb->abort_pending)
2564                 {
2565                     BTIF_TRACE_DEBUG0("op BTIF_HL_PEND_DCH_OP_OPEN");
2566                     dch_open.ctrl_psm = p_mcb->ctrl_psm;
2567                     dch_open.local_mdep_id = p_acb->sup_feature.mdep[p_pcb->mdep_cfg_idx].mdep_id;
2568                     if (btif_hl_find_peer_mdep_id(p_acb->app_id, p_mcb->bd_addr,
2569                                                   p_acb->sup_feature.mdep[p_pcb->mdep_cfg_idx].mdep_cfg.mdep_role,
2570                                                   p_acb->sup_feature.mdep[p_pcb->mdep_cfg_idx].mdep_cfg.data_cfg[0].data_type, &dch_open.peer_mdep_id ))
2571                     {
2572                         dch_open.local_cfg = p_acb->channel_type[p_pcb->mdep_cfg_idx];
2573                         if ((p_acb->sup_feature.mdep[p_pcb->mdep_cfg_idx].mdep_cfg.mdep_role == BTA_HL_MDEP_ROLE_SOURCE)
2574                             && !btif_hl_is_the_first_reliable_existed(app_idx, mcl_idx))
2575                         {
2576                             dch_open.local_cfg = BTA_HL_DCH_CFG_RELIABLE;
2577                         }
2578                         dch_open.sec_mask = (BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT);
2579                         BTIF_TRACE_DEBUG1("dch_open.local_cfg=%d  ", dch_open.local_cfg);
2580                         btif_hl_send_setup_connecting_cb(app_idx,mcl_idx);
2581 
2582                         if (!btif_hl_is_reconnect_possible(app_idx, mcl_idx, p_pcb->mdep_cfg_idx, &dch_open, &mdl_id ))
2583                         {
2584                             BTIF_TRACE_DEBUG1("Issue DCH open, mcl_handle=%d",p_mcb->mcl_handle);
2585                             BTA_HlDchOpen(p_mcb->mcl_handle, &dch_open);
2586                         }
2587                         else
2588                         {
2589                             reconnect_param.ctrl_psm = p_mcb->ctrl_psm;
2590                             reconnect_param.mdl_id = mdl_id;;
2591                             BTIF_TRACE_DEBUG2("Issue Reconnect ctrl_psm=0x%x mdl_id=0x%x",reconnect_param.ctrl_psm, reconnect_param.mdl_id);
2592                             BTA_HlDchReconnect(p_mcb->mcl_handle, &reconnect_param);
2593                         }
2594                         status = TRUE;
2595                     }
2596                 }
2597                 else
2598                 {
2599                     btif_hl_send_setup_disconnected_cb(app_idx, mcl_idx);
2600                     status = TRUE;
2601                 }
2602                 break;
2603             case BTIF_HL_PEND_DCH_OP_DELETE_MDL:
2604                 BTA_HlDeleteMdl(p_mcb->mcl_handle, p_acb->delete_mdl.mdl_id);
2605                 status = TRUE;
2606                 break;
2607 
2608             default:
2609                 break;
2610         }
2611     }
2612     return status;
2613 }
2614 
2615 /*******************************************************************************
2616 **
2617 ** Function         btif_hl_proc_cch_open_cfm
2618 **
2619 ** Description      Process the CCH open confirmation
2620 **
2621 ** Returns          Nothing
2622 **
2623 *******************************************************************************/
btif_hl_proc_cch_open_cfm(tBTA_HL * p_data)2624 static BOOLEAN btif_hl_proc_cch_open_cfm(tBTA_HL *p_data)
2625 
2626 {
2627     btif_hl_app_cb_t         *p_acb;
2628     btif_hl_mcl_cb_t         *p_mcb;
2629     UINT8                    app_idx, mcl_idx;
2630     BOOLEAN                  status = FALSE;
2631     tBTA_HL_DCH_OPEN_PARAM   dch_open;
2632 
2633 
2634     BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
2635 
2636     if (btif_hl_find_app_idx_using_app_id(p_data->cch_open_cfm.app_id, &app_idx))
2637     {
2638         BTIF_TRACE_DEBUG1("app_idx=%d", app_idx);
2639         if (btif_hl_find_mcl_idx(app_idx, p_data->cch_open_cfm.bd_addr, &mcl_idx))
2640         {
2641             p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
2642 
2643             p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
2644             BTIF_TRACE_DEBUG2("mcl_idx=%d, mcl_handle=%d", mcl_idx,p_data->cch_open_cfm.mcl_handle);
2645             p_mcb->mcl_handle = p_data->cch_open_cfm.mcl_handle;
2646             p_mcb->is_connected = TRUE;
2647             status = btif_hl_proc_pending_op(app_idx, mcl_idx);
2648             if (status)
2649                 btif_hl_start_cch_timer(app_idx, mcl_idx);
2650         }
2651     }
2652 
2653     return status;
2654 }
2655 
2656 /*******************************************************************************
2657 **
2658 ** Function      btif_hl_clean_mcb_using_handle
2659 **
2660 ** Description  clean control channel cb using handle
2661 **
2662 ** Returns      void
2663 **
2664 *******************************************************************************/
btif_hl_clean_mcb_using_handle(tBTA_HL_MCL_HANDLE mcl_handle)2665 static void btif_hl_clean_mcb_using_handle( tBTA_HL_MCL_HANDLE mcl_handle){
2666     btif_hl_app_cb_t  *p_acb;
2667     UINT8 i,j;
2668 
2669     for (i=0; i<BTA_HL_NUM_APPS; i++)
2670     {
2671         p_acb =BTIF_HL_GET_APP_CB_PTR(i);
2672         for (j=0; j < BTA_HL_NUM_MCLS ; j++)
2673         {
2674             if (p_acb->mcb[j].in_use)
2675                 BTIF_TRACE_DEBUG3("btif_hl_find_mcl_idx_using_handle: app_idx=%d,"
2676                     "mcl_idx =%d mcl_handle=%d",i,j,p_acb->mcb[j].mcl_handle);
2677             if (p_acb->mcb[j].in_use &&
2678                 (p_acb->mcb[j].mcl_handle == mcl_handle))
2679             {
2680                 btif_hl_stop_cch_timer(i, j);
2681                 btif_hl_release_mcl_sockets(i, j);
2682                 btif_hl_send_setup_disconnected_cb(i, j);
2683                 btif_hl_clean_mcl_cb(i, j);
2684             }
2685         }
2686     }
2687 }
2688 
2689 /*******************************************************************************
2690 **
2691 ** Function         btif_hl_proc_cch_close_ind
2692 **
2693 ** Description      Process the CCH close indication
2694 **
2695 ** Returns          Nothing
2696 **
2697 *******************************************************************************/
btif_hl_proc_cch_close_ind(tBTA_HL * p_data)2698 static void btif_hl_proc_cch_close_ind(tBTA_HL *p_data)
2699 
2700 {
2701     UINT8                   app_idx, mcl_idx;
2702     BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
2703 
2704     btif_hl_clean_mcb_using_handle(p_data->cch_close_ind.mcl_handle);
2705 }
2706 
2707 
2708 /*******************************************************************************
2709 **
2710 ** Function         btif_hl_proc_cch_close_cfm
2711 **
2712 ** Description      Process the CCH close confirmation
2713 **
2714 ** Returns          Nothing
2715 **
2716 *******************************************************************************/
btif_hl_proc_cch_close_cfm(tBTA_HL * p_data)2717 static void btif_hl_proc_cch_close_cfm(tBTA_HL *p_data)
2718 {
2719     UINT8                   app_idx, mcl_idx;
2720     BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
2721 
2722     btif_hl_clean_mcb_using_handle(p_data->cch_close_ind.mcl_handle);
2723 }
2724 
2725 /*******************************************************************************
2726 **
2727 ** Function         btif_hl_proc_create_ind
2728 **
2729 ** Description      Process the MDL create indication
2730 **
2731 ** Returns          Nothing
2732 **
2733 *******************************************************************************/
btif_hl_proc_create_ind(tBTA_HL * p_data)2734 static void btif_hl_proc_create_ind(tBTA_HL *p_data){
2735     btif_hl_app_cb_t         *p_acb;
2736     btif_hl_mcl_cb_t         *p_mcb;
2737     tBTA_HL_MDEP            *p_mdep;
2738     UINT8                   app_idx, orig_app_idx, mcl_idx, mdep_cfg_idx;
2739     BOOLEAN                 first_reliable_exist;
2740     BOOLEAN                 success = TRUE;
2741     tBTA_HL_DCH_CFG         rsp_cfg = BTA_HL_DCH_CFG_UNKNOWN;
2742     tBTA_HL_DCH_CREATE_RSP  rsp_code = BTA_HL_DCH_CREATE_RSP_CFG_REJ;
2743     tBTA_HL_DCH_CREATE_RSP_PARAM create_rsp_param;
2744 
2745     BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
2746 
2747 // Find the correct app_idx based on the mdep_id;
2748     btif_hl_find_app_idx_using_mdepId(p_data->dch_create_ind.local_mdep_id,&orig_app_idx);
2749     if (btif_hl_find_mcl_idx(orig_app_idx, p_data->dch_create_ind.bd_addr, &mcl_idx))
2750     {
2751         p_acb =BTIF_HL_GET_APP_CB_PTR(orig_app_idx);
2752         p_mcb =BTIF_HL_GET_MCL_CB_PTR(orig_app_idx, mcl_idx);
2753 
2754         if (btif_hl_find_mdep_cfg_idx(orig_app_idx, p_data->dch_create_ind.local_mdep_id, &mdep_cfg_idx))
2755         {
2756             p_mdep = &(p_acb->sup_feature.mdep[mdep_cfg_idx]);
2757             first_reliable_exist = btif_hl_is_the_first_reliable_existed(orig_app_idx, mcl_idx);
2758             switch (p_mdep->mdep_cfg.mdep_role)
2759             {
2760                 case BTA_HL_MDEP_ROLE_SOURCE:
2761                     if (p_data->dch_create_ind.cfg == BTA_HL_DCH_CFG_NO_PREF)
2762                     {
2763                         if (first_reliable_exist)
2764                         {
2765                             rsp_cfg = p_acb->channel_type[mdep_cfg_idx];
2766                         }
2767                         else
2768                         {
2769                             rsp_cfg = BTA_HL_DCH_CFG_RELIABLE;
2770                         }
2771                         rsp_code = BTA_HL_DCH_CREATE_RSP_SUCCESS;
2772                     }
2773 
2774                     break;
2775                 case BTA_HL_MDEP_ROLE_SINK:
2776 
2777                     BTIF_TRACE_DEBUG0("btif_hl_proc_create_ind:BTA_HL_MDEP_ROLE_SINK");
2778                     if ((p_data->dch_create_ind.cfg  == BTA_HL_DCH_CFG_RELIABLE) ||
2779                         (first_reliable_exist && (p_data->dch_create_ind.cfg  == BTA_HL_DCH_CFG_STREAMING)))
2780                     {
2781                         rsp_code = BTA_HL_DCH_CREATE_RSP_SUCCESS;
2782                         rsp_cfg = p_data->dch_create_ind.cfg;
2783                         BTIF_TRACE_DEBUG1("btif_hl_proc_create_ind:BTA_HL_MDEP_ROLE_SINK cfg = %d",rsp_cfg);
2784                     }
2785                     break;
2786                 default:
2787                     break;
2788             }
2789         }
2790     }
2791     else
2792     {
2793         success = FALSE;
2794     }
2795 
2796     if (success)
2797     {
2798         BTIF_TRACE_DEBUG2("create response rsp_code=%d rsp_cfg=%d", rsp_code, rsp_cfg );
2799         create_rsp_param.local_mdep_id = p_data->dch_create_ind.local_mdep_id;
2800         create_rsp_param.mdl_id = p_data->dch_create_ind.mdl_id;
2801         create_rsp_param.rsp_code = rsp_code;
2802         create_rsp_param.cfg_rsp = rsp_cfg;
2803         BTA_HlDchCreateRsp(p_mcb->mcl_handle, &create_rsp_param);
2804     }
2805 }
2806 
2807 /*******************************************************************************
2808 **
2809 ** Function         btif_hl_proc_dch_open_ind
2810 **
2811 ** Description      Process the DCH open indication
2812 **
2813 ** Returns          Nothing
2814 **
2815 *******************************************************************************/
btif_hl_proc_dch_open_ind(tBTA_HL * p_data)2816 static void btif_hl_proc_dch_open_ind(tBTA_HL *p_data)
2817 
2818 {
2819     btif_hl_app_cb_t         *p_acb;
2820     btif_hl_mcl_cb_t         *p_mcb;
2821     btif_hl_mdl_cb_t         *p_dcb;
2822     UINT8                    app_idx,orig_app_idx, mcl_idx, mdl_idx, mdep_cfg_idx;
2823     UINT8                    dc_cfg;
2824     BOOLEAN close_dch = FALSE;
2825 
2826     BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
2827 
2828     // Find the correct app_idx based on the mdep_id;
2829     btif_hl_find_app_idx_using_mdepId(p_data->dch_open_ind.local_mdep_id,&orig_app_idx);
2830 
2831     if (btif_hl_find_mcl_idx_using_app_idx(p_data->dch_open_ind.mcl_handle, orig_app_idx, &mcl_idx ))
2832     {
2833         p_acb =BTIF_HL_GET_APP_CB_PTR(orig_app_idx);
2834         p_mcb =BTIF_HL_GET_MCL_CB_PTR(orig_app_idx, mcl_idx);
2835 
2836         if (btif_hl_find_avail_mdl_idx(orig_app_idx, mcl_idx, &mdl_idx))
2837         {
2838             p_dcb = BTIF_HL_GET_MDL_CB_PTR(orig_app_idx, mcl_idx, mdl_idx);
2839 
2840             if (btif_hl_find_mdep_cfg_idx(orig_app_idx, p_data->dch_open_ind.local_mdep_id, &mdep_cfg_idx))
2841             {
2842                 p_dcb->in_use               = TRUE;
2843                 p_dcb->mdl_handle           =  p_data->dch_open_ind.mdl_handle;
2844                 p_dcb->local_mdep_cfg_idx   = mdep_cfg_idx;
2845                 p_dcb->local_mdep_id        = p_data->dch_open_ind.local_mdep_id;
2846                 p_dcb->mdl_id               = p_data->dch_open_ind.mdl_id;
2847                 p_dcb->dch_mode             = p_data->dch_open_ind.dch_mode;
2848                 p_dcb->dch_mode             = p_data->dch_open_ind.dch_mode;
2849                 p_dcb->is_the_first_reliable = p_data->dch_open_ind.first_reliable;
2850                 p_dcb->mtu                  = p_data->dch_open_ind.mtu;
2851 
2852                 if(btif_hl_find_channel_id_using_mdl_id(orig_app_idx,p_dcb->mdl_id , &p_dcb->channel_id))
2853                 {
2854                     BTIF_TRACE_DEBUG4(" app_idx=%d mcl_idx=%d mdl_idx=%d channel_id=%d",
2855                                         app_idx, mcl_idx, mdl_idx, p_dcb->channel_id  );
2856                     if (!btif_hl_create_socket(orig_app_idx, mcl_idx, mdl_idx))
2857                     {
2858                         BTIF_TRACE_ERROR0("Unable to create socket");
2859                         close_dch = TRUE;
2860                     }
2861                 }
2862                 else
2863                 {
2864                     BTIF_TRACE_ERROR1("Unable find channel id for mdl_id=0x%x", p_dcb->mdl_id  );
2865                     close_dch = TRUE;
2866                 }
2867             }
2868             else
2869             {
2870                 BTIF_TRACE_ERROR1("INVALID_LOCAL_MDEP_ID mdep_id=%d",p_data->dch_open_cfm.local_mdep_id);
2871                 close_dch = TRUE;
2872             }
2873 
2874             if (close_dch)
2875                 btif_hl_clean_mdl_cb(p_dcb);
2876         }
2877         else
2878             close_dch = TRUE;
2879     }
2880     else
2881         close_dch = TRUE;
2882 
2883     if (close_dch)
2884         BTA_HlDchClose(p_data->dch_open_cfm.mdl_handle);
2885 }
2886 
2887 /*******************************************************************************
2888 **
2889 ** Function         btif_hl_proc_dch_open_cfm
2890 **
2891 ** Description      Process the DCH close confirmation
2892 **
2893 ** Returns          Nothing
2894 **
2895 *******************************************************************************/
btif_hl_proc_dch_open_cfm(tBTA_HL * p_data)2896 static BOOLEAN btif_hl_proc_dch_open_cfm(tBTA_HL *p_data)
2897 
2898 {
2899     btif_hl_app_cb_t            *p_acb;
2900     btif_hl_mcl_cb_t            *p_mcb;
2901     btif_hl_mdl_cb_t            *p_dcb;
2902     btif_hl_pending_chan_cb_t   *p_pcb;
2903     UINT8                    app_idx, mcl_idx, mdl_idx, mdep_cfg_idx;
2904     BOOLEAN                  status = FALSE;
2905     BOOLEAN                  close_dch = FALSE;
2906 
2907     BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
2908 
2909     // Find the correct app_idx based on the mdep_id;
2910     btif_hl_find_app_idx_using_mdepId(p_data->dch_open_cfm.local_mdep_id,&app_idx);
2911 
2912     if (btif_hl_find_mcl_idx_using_app_idx(p_data->dch_open_cfm.mcl_handle, app_idx, &mcl_idx ))
2913     {
2914         p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
2915         p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
2916         p_pcb = BTIF_HL_GET_PCB_PTR(app_idx, mcl_idx);
2917 
2918         if (btif_hl_find_avail_mdl_idx(app_idx, mcl_idx, &mdl_idx))
2919         {
2920             p_dcb = BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
2921 
2922             if (btif_hl_find_mdep_cfg_idx(app_idx, p_data->dch_open_cfm.local_mdep_id, &mdep_cfg_idx))
2923             {
2924                 p_dcb->in_use               = TRUE;
2925                 p_dcb->mdl_handle           = p_data->dch_open_cfm.mdl_handle;
2926                 p_dcb->local_mdep_cfg_idx   = mdep_cfg_idx;
2927                 p_dcb->local_mdep_id        = p_data->dch_open_cfm.local_mdep_id;
2928                 p_dcb->mdl_id               = p_data->dch_open_cfm.mdl_id;
2929                 p_dcb->dch_mode             = p_data->dch_open_cfm.dch_mode;
2930                 p_dcb->is_the_first_reliable= p_data->dch_open_cfm.first_reliable;
2931                 p_dcb->mtu                  = p_data->dch_open_cfm.mtu;
2932                 p_dcb->channel_id           = p_pcb->channel_id;
2933 
2934                 BTIF_TRACE_DEBUG3("app_idx=%d mcl_idx=%d mdl_idx=%d",  app_idx, mcl_idx, mdl_idx  );
2935                 btif_hl_send_setup_connecting_cb(app_idx, mcl_idx);
2936                 if (btif_hl_create_socket(app_idx, mcl_idx, mdl_idx))
2937                 {
2938                     status = TRUE;
2939                     BTIF_TRACE_DEBUG4("app_idx=%d mcl_idx=%d mdl_idx=%d p_dcb->channel_id=0x%08x",
2940                                       app_idx, mcl_idx, mdl_idx, p_dcb->channel_id);
2941                     btif_hl_clean_pcb(p_pcb);
2942                 }
2943                 else
2944                 {
2945                     BTIF_TRACE_ERROR0("Unable to create socket");
2946                     close_dch = TRUE;
2947                 }
2948             }
2949             else
2950             {
2951                 BTIF_TRACE_ERROR1("INVALID_LOCAL_MDEP_ID mdep_id=%d",p_data->dch_open_cfm.local_mdep_id);
2952                 close_dch = TRUE;
2953             }
2954 
2955             if (close_dch)
2956             {
2957                 btif_hl_clean_mdl_cb(p_dcb);
2958                 BTA_HlDchClose(p_data->dch_open_cfm.mdl_handle);
2959             }
2960         }
2961     }
2962 
2963     return status;
2964 }
2965 /*******************************************************************************
2966 **
2967 ** Function         btif_hl_proc_dch_reconnect_cfm
2968 **
2969 ** Description      Process the DCH reconnect indication
2970 **
2971 ** Returns          Nothing
2972 **
2973 *******************************************************************************/
btif_hl_proc_dch_reconnect_cfm(tBTA_HL * p_data)2974 static BOOLEAN btif_hl_proc_dch_reconnect_cfm(tBTA_HL *p_data)
2975 {
2976     btif_hl_app_cb_t            *p_acb;
2977     btif_hl_mcl_cb_t            *p_mcb;
2978     btif_hl_mdl_cb_t            *p_dcb;
2979     btif_hl_pending_chan_cb_t   *p_pcb;
2980     UINT8                    app_idx, mcl_idx, mdl_idx, mdep_cfg_idx;
2981     BOOLEAN                  status = FALSE;
2982     BOOLEAN                  close_dch = FALSE;
2983 
2984     BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
2985 
2986     btif_hl_find_app_idx_using_mdepId(p_data->dch_reconnect_cfm.local_mdep_id,&app_idx);
2987 
2988     if (btif_hl_find_mcl_idx_using_app_idx(p_data->dch_reconnect_cfm.mcl_handle, app_idx, &mcl_idx ))
2989     {
2990         p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
2991         p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
2992         p_pcb = BTIF_HL_GET_PCB_PTR(app_idx, mcl_idx);
2993 
2994         if (btif_hl_find_avail_mdl_idx(app_idx, mcl_idx, &mdl_idx))
2995         {
2996             p_dcb = BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
2997 
2998             if (btif_hl_find_mdep_cfg_idx(app_idx, p_data->dch_reconnect_cfm.local_mdep_id, &mdep_cfg_idx))
2999             {
3000                 p_dcb->in_use               = TRUE;
3001                 p_dcb->mdl_handle           = p_data->dch_reconnect_cfm.mdl_handle;
3002                 p_dcb->local_mdep_cfg_idx   = mdep_cfg_idx;
3003                 p_dcb->local_mdep_id        = p_data->dch_reconnect_cfm.local_mdep_id;
3004                 p_dcb->mdl_id               = p_data->dch_reconnect_cfm.mdl_id;
3005                 p_dcb->dch_mode             = p_data->dch_reconnect_cfm.dch_mode;
3006                 p_dcb->is_the_first_reliable= p_data->dch_reconnect_cfm.first_reliable;
3007                 p_dcb->mtu                  = p_data->dch_reconnect_cfm.mtu;
3008                 p_dcb->channel_id           = p_pcb->channel_id;
3009 
3010                 BTIF_TRACE_DEBUG3("app_idx=%d mcl_idx=%d mdl_idx=%d",  app_idx, mcl_idx, mdl_idx  );
3011                 btif_hl_send_setup_connecting_cb(app_idx, mcl_idx);
3012                 if (btif_hl_create_socket(app_idx, mcl_idx, mdl_idx))
3013                 {
3014                     status = TRUE;
3015                     BTIF_TRACE_DEBUG4("app_idx=%d mcl_idx=%d mdl_idx=%d p_dcb->channel_id=0x%08x",
3016                                       app_idx, mcl_idx, mdl_idx, p_dcb->channel_id);
3017                     btif_hl_clean_pcb(p_pcb);
3018                 }
3019                 else
3020                 {
3021                     BTIF_TRACE_ERROR0("Unable to create socket");
3022                     close_dch = TRUE;
3023                 }
3024             }
3025             else
3026             {
3027                 BTIF_TRACE_ERROR1("INVALID_LOCAL_MDEP_ID mdep_id=%d",p_data->dch_open_cfm.local_mdep_id);
3028                 close_dch = TRUE;
3029             }
3030 
3031             if (close_dch)
3032             {
3033                 btif_hl_clean_mdl_cb(p_dcb);
3034                 BTA_HlDchClose(p_data->dch_reconnect_cfm.mdl_handle);
3035             }
3036         }
3037     }
3038 
3039     return status;
3040 
3041 }
3042 /*******************************************************************************
3043 **
3044 ** Function         btif_hl_proc_dch_reconnect_ind
3045 **
3046 ** Description      Process the DCH reconnect indication
3047 **
3048 ** Returns          Nothing
3049 **
3050 *******************************************************************************/
btif_hl_proc_dch_reconnect_ind(tBTA_HL * p_data)3051 static void btif_hl_proc_dch_reconnect_ind(tBTA_HL *p_data)
3052 
3053 {
3054     btif_hl_app_cb_t        *p_acb;
3055     btif_hl_mcl_cb_t        *p_mcb;
3056     btif_hl_mdl_cb_t        *p_dcb;
3057     UINT8                   app_idx, mcl_idx, mdl_idx, mdep_cfg_idx, dc_cfg;
3058     BOOLEAN                 close_dch = FALSE;
3059 
3060     BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
3061 
3062     // Find the correct app_idx based on the mdep_id;
3063     btif_hl_find_app_idx_using_mdepId(p_data->dch_reconnect_ind.local_mdep_id,&app_idx);
3064 
3065     if (btif_hl_find_mcl_idx_using_app_idx(p_data->dch_reconnect_ind.mcl_handle, app_idx, &mcl_idx ))
3066     {
3067         p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
3068         BTIF_TRACE_DEBUG2("btif_hl_proc_dch_reconnect_ind: app_idx = %d, mcl_idx = %d",
3069                                 app_idx, mcl_idx);
3070         p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
3071 
3072         if (btif_hl_find_avail_mdl_idx(app_idx, mcl_idx, &mdl_idx))
3073         {
3074             p_dcb =BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
3075 
3076             if (btif_hl_find_mdep_cfg_idx(app_idx, p_data->dch_reconnect_ind.local_mdep_id, &mdep_cfg_idx))
3077             {
3078                 p_dcb->in_use               = TRUE;
3079                 p_dcb->mdl_handle           = p_data->dch_reconnect_ind.mdl_handle;
3080                 p_dcb->local_mdep_cfg_idx   = mdep_cfg_idx;
3081                 p_dcb->local_mdep_id        = p_data->dch_reconnect_ind.local_mdep_id;
3082                 p_dcb->mdl_id               = p_data->dch_reconnect_ind.mdl_id;
3083                 p_dcb->dch_mode             = p_data->dch_reconnect_ind.dch_mode;
3084                 p_dcb->dch_mode             = p_data->dch_reconnect_ind.dch_mode;
3085                 p_dcb->is_the_first_reliable= p_data->dch_reconnect_ind.first_reliable;
3086                 p_dcb->mtu                  = p_data->dch_reconnect_ind.mtu;
3087                 p_dcb->channel_id           = btif_hl_get_next_channel_id(p_acb->app_id);
3088 
3089                 BTIF_TRACE_DEBUG4(" app_idx=%d mcl_idx=%d mdl_idx=%d channel_id=%d",
3090                                   app_idx, mcl_idx, mdl_idx, p_dcb->channel_id  );
3091                 if (!btif_hl_create_socket(app_idx, mcl_idx, mdl_idx))
3092                 {
3093                     BTIF_TRACE_ERROR0("Unable to create socket");
3094                     close_dch = TRUE;
3095                 }
3096             }
3097             else
3098             {
3099                 BTIF_TRACE_ERROR1("INVALID_LOCAL_MDEP_ID mdep_id=%d",p_data->dch_open_cfm.local_mdep_id);
3100                 close_dch = TRUE;
3101             }
3102 
3103             if (close_dch)
3104                 btif_hl_clean_mdl_cb(p_dcb);
3105         }
3106         else
3107             close_dch = TRUE;
3108     }
3109     else
3110         close_dch = TRUE;
3111 
3112     if (close_dch)
3113         BTA_HlDchClose(p_data->dch_reconnect_ind.mdl_handle);
3114 
3115 }
3116 
3117 /*******************************************************************************
3118 **
3119 ** Function         btif_hl_proc_dch_close_ind
3120 **
3121 ** Description      Process the DCH close indication
3122 **
3123 ** Returns          Nothing
3124 **
3125 *******************************************************************************/
btif_hl_proc_dch_close_ind(tBTA_HL * p_data)3126 static void btif_hl_proc_dch_close_ind(tBTA_HL *p_data)
3127 
3128 {
3129     btif_hl_mdl_cb_t         *p_dcb;
3130     btif_hl_mcl_cb_t         *p_mcb;
3131     UINT8                   app_idx, mcl_idx, mdl_idx;
3132 
3133     BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
3134     if (btif_hl_find_mdl_idx_using_handle(p_data->dch_close_ind.mdl_handle,
3135                                           &app_idx, &mcl_idx, &mdl_idx ))
3136     {
3137         p_dcb = BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
3138         btif_hl_release_socket(app_idx,mcl_idx, mdl_idx);
3139         btif_hl_send_setup_disconnected_cb(app_idx, mcl_idx);
3140         p_mcb =  BTIF_HL_GET_MCL_CB_PTR(app_idx,mcl_idx);
3141         btif_hl_clean_mdl_cb(p_dcb);
3142         if (!btif_hl_num_dchs_in_use(p_mcb->mcl_handle))
3143             btif_hl_start_cch_timer(app_idx, mcl_idx);
3144         BTIF_TRACE_DEBUG1("remote DCH close success mdl_idx=%d", mdl_idx);
3145     }
3146 }
3147 
3148 /*******************************************************************************
3149 **
3150 ** Function         btif_hl_proc_dch_close_cfm
3151 **
3152 ** Description      Process the DCH reconnect confirmation
3153 **
3154 ** Returns          Nothing
3155 **
3156 *******************************************************************************/
btif_hl_proc_dch_close_cfm(tBTA_HL * p_data)3157 static void btif_hl_proc_dch_close_cfm(tBTA_HL *p_data)
3158 
3159 {
3160     btif_hl_mdl_cb_t         *p_dcb;
3161     btif_hl_mcl_cb_t         *p_mcb;
3162     UINT8                   app_idx, mcl_idx, mdl_idx;
3163 
3164     BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
3165     if (btif_hl_find_mdl_idx_using_handle(p_data->dch_close_cfm.mdl_handle,
3166                                           &app_idx, &mcl_idx, &mdl_idx ))
3167     {
3168         p_dcb = BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
3169         btif_hl_release_socket(app_idx,mcl_idx,mdl_idx);
3170         btif_hl_clean_mdl_cb(p_dcb);
3171         p_mcb =  BTIF_HL_GET_MCL_CB_PTR(app_idx,mcl_idx);
3172         if (!btif_hl_num_dchs_in_use(p_mcb->mcl_handle))
3173             btif_hl_start_cch_timer(app_idx, mcl_idx);
3174         BTIF_TRACE_DEBUG1(" local DCH close success mdl_idx=%d", mdl_idx);
3175     }
3176 }
3177 
3178 
3179 /*******************************************************************************
3180 **
3181 ** Function         btif_hl_proc_abort_ind
3182 **
3183 ** Description      Process the abort indicaiton
3184 **
3185 ** Returns          Nothing
3186 **
3187 *******************************************************************************/
btif_hl_proc_abort_ind(tBTA_HL_MCL_HANDLE mcl_handle)3188 static void btif_hl_proc_abort_ind(tBTA_HL_MCL_HANDLE mcl_handle){
3189 
3190     UINT8                   app_idx,mcl_idx;
3191     BTIF_TRACE_DEBUG1("%s", __FUNCTION__ );
3192     btif_hl_app_cb_t  *p_acb;
3193     UINT8 i,j;
3194 
3195     for (i=0; i<BTA_HL_NUM_APPS; i++)
3196     {
3197         p_acb =BTIF_HL_GET_APP_CB_PTR(i);
3198         for (j=0; j < BTA_HL_NUM_MCLS ; j++)
3199         {
3200             if (p_acb->mcb[j].in_use)
3201                 BTIF_TRACE_DEBUG3("btif_hl_find_mcl_idx_using_handle: app_idx=%d,mcl_idx =%d mcl_handle=%d",i,j,p_acb->mcb[j].mcl_handle);
3202             if (p_acb->mcb[j].in_use &&
3203                 (p_acb->mcb[j].mcl_handle == mcl_handle))
3204             {
3205                 btif_hl_stop_cch_timer(i, j);
3206                 btif_hl_send_setup_disconnected_cb(i, j);
3207                 btif_hl_clean_mcl_cb(i, j);
3208             }
3209         }
3210     }
3211 }
3212 
3213 /*******************************************************************************
3214 **
3215 ** Function         btif_hl_proc_abort_cfm
3216 **
3217 ** Description      Process the abort confirmation
3218 **
3219 ** Returns          Nothing
3220 **
3221 *******************************************************************************/
btif_hl_proc_abort_cfm(tBTA_HL_MCL_HANDLE mcl_handle)3222 static void btif_hl_proc_abort_cfm(tBTA_HL_MCL_HANDLE mcl_handle){
3223     UINT8                   app_idx,mcl_idx;
3224 
3225     BTIF_TRACE_DEBUG1("%s", __FUNCTION__ );
3226     btif_hl_app_cb_t  *p_acb;
3227     UINT8 i,j;
3228 
3229     for (i=0; i<BTA_HL_NUM_APPS; i++)
3230     {
3231         p_acb =BTIF_HL_GET_APP_CB_PTR(i);
3232         for (j=0; j < BTA_HL_NUM_MCLS ; j++)
3233         {
3234             if (p_acb->mcb[j].in_use)
3235                 BTIF_TRACE_DEBUG3("btif_hl_find_mcl_idx_using_handle: app_idx=%d,mcl_idx =%d mcl_handle=%d",i,j,p_acb->mcb[j].mcl_handle);
3236             if (p_acb->mcb[j].in_use &&
3237                 (p_acb->mcb[j].mcl_handle == mcl_handle))
3238             {
3239                 btif_hl_stop_cch_timer(i, j);
3240                 btif_hl_send_setup_disconnected_cb(i, j);
3241                 btif_hl_clean_mcl_cb(i, j);
3242             }
3243         }
3244     }
3245 
3246 }
3247 
3248 /*******************************************************************************
3249 **
3250 ** Function         btif_hl_proc_send_data_cfm
3251 **
3252 ** Description      Process the send data confirmation
3253 **
3254 ** Returns          Nothing
3255 **
3256 *******************************************************************************/
btif_hl_proc_send_data_cfm(tBTA_HL_MDL_HANDLE mdl_handle,tBTA_HL_STATUS status)3257 static void btif_hl_proc_send_data_cfm(tBTA_HL_MDL_HANDLE mdl_handle,
3258                                        tBTA_HL_STATUS status){
3259     UINT8                   app_idx,mcl_idx, mdl_idx;
3260     btif_hl_mdl_cb_t         *p_dcb;
3261 
3262     BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
3263     if (btif_hl_find_mdl_idx_using_handle(mdl_handle,
3264                                           &app_idx, &mcl_idx, &mdl_idx ))
3265     {
3266         p_dcb =BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
3267         btif_hl_free_buf((void **) &p_dcb->p_tx_pkt);
3268         BTIF_TRACE_DEBUG1("send success free p_tx_pkt tx_size=%d", p_dcb->tx_size);
3269         p_dcb->tx_size = 0;
3270     }
3271 }
3272 
3273 /*******************************************************************************
3274 **
3275 ** Function         btif_hl_proc_dch_cong_ind
3276 **
3277 ** Description      Process the DCH congestion change indication
3278 **
3279 ** Returns          Nothing
3280 **
3281 *******************************************************************************/
btif_hl_proc_dch_cong_ind(tBTA_HL * p_data)3282 static void btif_hl_proc_dch_cong_ind(tBTA_HL *p_data)
3283 
3284 {
3285     btif_hl_mdl_cb_t         *p_dcb;
3286     UINT8                   app_idx, mcl_idx, mdl_idx;
3287 
3288     BTIF_TRACE_DEBUG0("btif_hl_proc_dch_cong_ind");
3289 
3290 
3291     if (btif_hl_find_mdl_idx_using_handle(p_data->dch_cong_ind.mdl_handle, &app_idx, &mcl_idx, &mdl_idx))
3292     {
3293         p_dcb =BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
3294         p_dcb->cong = p_data->dch_cong_ind.cong;
3295     }
3296 }
3297 
3298 /*******************************************************************************
3299 **
3300 ** Function         btif_hl_proc_cb_evt
3301 **
3302 ** Description      Process registration request
3303 **
3304 ** Returns          void
3305 **
3306 *******************************************************************************/
btif_hl_proc_reg_request(UINT8 app_idx,UINT8 app_id,tBTA_HL_REG_PARAM * p_reg_param,tBTA_HL_CBACK * p_cback)3307 static void btif_hl_proc_reg_request(UINT8 app_idx, UINT8  app_id,
3308                                      tBTA_HL_REG_PARAM *p_reg_param,
3309                                      tBTA_HL_CBACK *p_cback){
3310     bt_status_t status= BT_STATUS_SUCCESS;
3311     UINT8 i;
3312     btif_hl_app_data_t *p_data;
3313     BTIF_TRACE_DEBUG3("%s app_idx=%d app_id=%d", __FUNCTION__, app_idx, app_id);
3314 
3315     if(reg_counter >1)
3316     {
3317         BTIF_TRACE_DEBUG0("btif_hl_proc_reg_request: calling uPDATE");
3318         BTA_HlUpdate(app_id, p_reg_param,TRUE, btif_hl_cback);
3319     }
3320     else
3321         BTA_HlRegister(app_id, p_reg_param, btif_hl_cback);
3322 }
3323 
3324 
3325 /*******************************************************************************
3326 **
3327 ** Function         btif_hl_proc_cb_evt
3328 **
3329 ** Description      Process HL callback events
3330 **
3331 ** Returns          void
3332 **
3333 *******************************************************************************/
btif_hl_proc_cb_evt(UINT16 event,char * p_param)3334 static void btif_hl_proc_cb_evt(UINT16 event, char* p_param){
3335 
3336     btif_hl_evt_cb_t                *p_data = (btif_hl_evt_cb_t *)p_param;
3337     bt_bdaddr_t                     bd_addr;
3338     bthl_channel_state_t            state=BTHL_CONN_STATE_DISCONNECTED;
3339     BOOLEAN                         send_chan_cb=TRUE;
3340     tBTA_HL_REG_PARAM               reg_param;
3341     btif_hl_app_cb_t                *p_acb;
3342     bthl_app_reg_state_t            reg_state = BTHL_APP_REG_STATE_REG_FAILED;
3343     int                             app_id;
3344     UINT8                           preg_idx;
3345     bt_status_t                     bt_status;
3346 
3347     BTIF_TRACE_DEBUG2("%s event %d", __FUNCTION__, event);
3348     btif_hl_display_calling_process_name();
3349 
3350     switch (event)
3351     {
3352         case BTIF_HL_SEND_CONNECTED_CB:
3353         case BTIF_HL_SEND_DISCONNECTED_CB:
3354             if (p_data->chan_cb.cb_state == BTIF_HL_CHAN_CB_STATE_CONNECTED_PENDING)
3355                 state = BTHL_CONN_STATE_CONNECTED;
3356             else if (p_data->chan_cb.cb_state == BTIF_HL_CHAN_CB_STATE_DISCONNECTED_PENDING)
3357                 state = BTHL_CONN_STATE_DISCONNECTED;
3358             else
3359                 send_chan_cb = FALSE;
3360 
3361             if (send_chan_cb)
3362             {
3363                 btif_hl_copy_bda(&bd_addr, p_data->chan_cb.bd_addr);
3364                 BTIF_TRACE_DEBUG4("state callbk: ch_id=0x%08x cb_state=%d state=%d  fd=%d",
3365                                   p_data->chan_cb.channel_id,
3366                                   p_data->chan_cb.cb_state,
3367                                   state,  p_data->chan_cb.fd);
3368                 btif_hl_display_bt_bda(&bd_addr);
3369                 BTIF_HL_CALL_CBACK(bt_hl_callbacks, channel_state_cb,  p_data->chan_cb.app_id,
3370                                    &bd_addr, p_data->chan_cb.mdep_cfg_index,
3371                                    p_data->chan_cb.channel_id, state, p_data->chan_cb.fd );
3372             }
3373 
3374             break;
3375         case BTIF_HL_REG_APP:
3376             p_acb  = BTIF_HL_GET_APP_CB_PTR(p_data->reg.app_idx);
3377             app_id = (int) p_acb->app_id;
3378             BTIF_TRACE_DEBUG2("Rcv BTIF_HL_REG_APP app_idx=%d reg_pending=%d", p_data->reg.app_idx, p_acb->reg_pending);
3379             if (btif_hl_get_state() == BTIF_HL_STATE_ENABLED && p_acb->reg_pending)
3380             {
3381                 BTIF_TRACE_DEBUG1("Rcv BTIF_HL_REG_APP reg_counter=%d",reg_counter);
3382                 p_acb->reg_pending = FALSE;
3383                 reg_param.dev_type = p_acb->dev_type;
3384                 reg_param.sec_mask = BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT;
3385                 reg_param.p_srv_name = p_acb->srv_name;
3386                 reg_param.p_srv_desp = p_acb->srv_desp;
3387                 reg_param.p_provider_name = p_acb->provider_name;
3388                 btif_hl_proc_reg_request (p_data->reg.app_idx, p_acb->app_id, &reg_param, btif_hl_cback);
3389             }
3390             else
3391             {
3392                 BTIF_TRACE_DEBUG2("reg request is processed state=%d reg_pending=%d", btif_hl_get_state(), p_acb->reg_pending);
3393             }
3394 
3395             break;
3396 
3397         case BTIF_HL_UNREG_APP:
3398             BTIF_TRACE_DEBUG1("Rcv BTIF_HL_UNREG_APP app_idx=%d", p_data->unreg.app_idx );
3399             p_acb = BTIF_HL_GET_APP_CB_PTR(p_data->unreg.app_idx);
3400             if (btif_hl_get_state() == BTIF_HL_STATE_ENABLED)
3401             {
3402                 if(reg_counter >= 1)
3403                     BTA_HlUpdate(p_acb->app_id,NULL,FALSE,NULL);
3404                 else
3405                     BTA_HlDeregister(p_acb->app_id, p_acb->app_handle);
3406             }
3407             break;
3408         case BTIF_HL_UPDATE_MDL:
3409             BTIF_TRACE_DEBUG1("Rcv BTIF_HL_UPDATE_MDL app_idx=%d", p_data->update_mdl.app_idx );
3410             p_acb = BTIF_HL_GET_APP_CB_PTR(p_data->update_mdl.app_idx);
3411             break;
3412 
3413         default:
3414             BTIF_TRACE_ERROR1("Unknown event %d", event);
3415             break;
3416     }
3417 }
3418 
3419 /*******************************************************************************
3420 **
3421 ** Function         btif_hl_upstreams_evt
3422 **
3423 ** Description      Process HL events
3424 **
3425 ** Returns          void
3426 **
3427 *******************************************************************************/
btif_hl_upstreams_evt(UINT16 event,char * p_param)3428 static void btif_hl_upstreams_evt(UINT16 event, char* p_param){
3429     tBTA_HL *p_data = (tBTA_HL *)p_param;
3430     UINT8                 app_idx, mcl_idx;
3431     btif_hl_app_cb_t      *p_acb;
3432     btif_hl_mcl_cb_t      *p_mcb = NULL;
3433     BD_ADDR               bd_addr;
3434     btif_hl_pend_dch_op_t  pending_op;
3435     BOOLEAN status;
3436 
3437     BTIF_TRACE_DEBUG2("%s event %d", __FUNCTION__, event);
3438     btif_hl_display_calling_process_name();
3439     switch (event)
3440     {
3441         case BTA_HL_REGISTER_CFM_EVT:
3442             BTIF_TRACE_DEBUG0("Rcv BTA_HL_REGISTER_CFM_EVT");
3443             BTIF_TRACE_DEBUG3("app_id=%d app_handle=%d status=%d ",
3444                               p_data->reg_cfm.app_id,
3445                               p_data->reg_cfm.app_handle,
3446                               p_data->reg_cfm.status );
3447 
3448             btif_hl_proc_reg_cfm(p_data);
3449             break;
3450         case BTA_HL_SDP_INFO_IND_EVT:
3451             BTIF_TRACE_DEBUG0("Rcv BTA_HL_SDP_INFO_IND_EVT");
3452             BTIF_TRACE_DEBUG5("app_handle=%d ctrl_psm=0x%04x data_psm=0x%04x x_spec=%d mcap_sup_procs=0x%02x",
3453                               p_data->sdp_info_ind.app_handle,
3454                               p_data->sdp_info_ind.ctrl_psm,
3455                               p_data->sdp_info_ind.data_psm,
3456                               p_data->sdp_info_ind.data_x_spec,
3457                               p_data->sdp_info_ind.mcap_sup_procs);
3458             //btif_hl_proc_sdp_info_ind(p_data);
3459             break;
3460 
3461         case BTA_HL_DEREGISTER_CFM_EVT:
3462             BTIF_TRACE_DEBUG0("Rcv BTA_HL_DEREGISTER_CFM_EVT");
3463             BTIF_TRACE_DEBUG2("app_handle=%d status=%d ",
3464                               p_data->dereg_cfm.app_handle,
3465                               p_data->dereg_cfm.status );
3466             btif_hl_proc_dereg_cfm(p_data);
3467             break;
3468 
3469         case BTA_HL_SDP_QUERY_CFM_EVT:
3470             BTIF_TRACE_DEBUG0("Rcv BTA_HL_SDP_QUERY_CFM_EVT");
3471             BTIF_TRACE_DEBUG3("app_handle=%d app_id =%d,status =%d",
3472                               p_data->sdp_query_cfm.app_handle,p_data->sdp_query_cfm.app_id,
3473                               p_data->sdp_query_cfm.status);
3474 
3475             BTIF_TRACE_DEBUG6("DB [%02x] [%02x] [%02x] [%02x] [%02x] [%02x]",
3476                               p_data->sdp_query_cfm.bd_addr[0], p_data->sdp_query_cfm.bd_addr[1],
3477                               p_data->sdp_query_cfm.bd_addr[2], p_data->sdp_query_cfm.bd_addr[3],
3478                               p_data->sdp_query_cfm.bd_addr[4], p_data->sdp_query_cfm.bd_addr[5]);
3479 
3480             if (p_data->sdp_query_cfm.status == BTA_HL_STATUS_OK)
3481                 status = btif_hl_proc_sdp_query_cfm(p_data);
3482             else
3483                 status = FALSE;
3484 
3485             if (!status)
3486             {
3487                 BTIF_TRACE_DEBUG1("BTA_HL_SDP_QUERY_CFM_EVT Status = %d",
3488                                                         p_data->sdp_query_cfm.status);
3489                 if (btif_hl_find_app_idx_using_app_id(p_data->sdp_query_cfm.app_id, &app_idx))
3490                 {
3491                     p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
3492                     if (btif_hl_find_mcl_idx(app_idx, p_data->sdp_query_cfm.bd_addr, &mcl_idx))
3493                     {
3494                         p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
3495                         if ( (p_mcb->cch_oper =  BTIF_HL_CCH_OP_MDEP_FILTERING) ||
3496                              (p_mcb->cch_oper == BTIF_HL_CCH_OP_DCH_OPEN) )
3497                         {
3498                             pending_op = p_mcb->pcb.op;
3499                             switch (pending_op)
3500                             {
3501                                 case BTIF_HL_PEND_DCH_OP_OPEN:
3502                                     btif_hl_send_setup_disconnected_cb(app_idx, mcl_idx);
3503                                     break;
3504                                 case BTIF_HL_PEND_DCH_OP_RECONNECT:
3505                                 case BTIF_HL_PEND_DCH_OP_DELETE_MDL:
3506                                 default:
3507                                     break;
3508                             }
3509                             if (!p_mcb->is_connected)
3510                                 btif_hl_clean_mcl_cb(app_idx, mcl_idx);
3511                         }
3512                     }
3513                 }
3514             }
3515 
3516             break;
3517 
3518 
3519         case BTA_HL_CCH_OPEN_CFM_EVT:
3520             BTIF_TRACE_DEBUG0("Rcv BTA_HL_CCH_OPEN_CFM_EVT");
3521             BTIF_TRACE_DEBUG4("app_id=%d,app_handle=%d mcl_handle=%d status =%d",
3522                               p_data->cch_open_cfm.app_id,
3523                               p_data->cch_open_cfm.app_handle,
3524                               p_data->cch_open_cfm.mcl_handle,
3525                               p_data->cch_open_cfm.status);
3526             BTIF_TRACE_DEBUG6("DB [%02x] [%02x] [%02x] [%02x] [%02x] [%02x]",
3527                               p_data->cch_open_cfm.bd_addr[0], p_data->cch_open_cfm.bd_addr[1],
3528                               p_data->cch_open_cfm.bd_addr[2], p_data->cch_open_cfm.bd_addr[3],
3529                               p_data->cch_open_cfm.bd_addr[4], p_data->cch_open_cfm.bd_addr[5]);
3530 
3531             if (p_data->cch_open_cfm.status == BTA_HL_STATUS_OK ||
3532                         p_data->cch_open_cfm.status == BTA_HL_STATUS_DUPLICATE_CCH_OPEN)
3533             {
3534                 status = btif_hl_proc_cch_open_cfm(p_data);
3535             }
3536             else
3537             {
3538                 status = FALSE;
3539             }
3540 
3541             if (!status)
3542             {
3543                 if (btif_hl_find_app_idx_using_app_id(p_data->cch_open_cfm.app_id, &app_idx))
3544                 {
3545                     p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
3546                     if (btif_hl_find_mcl_idx(app_idx, p_data->cch_open_cfm.bd_addr, &mcl_idx))
3547                     {
3548                         p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
3549                         pending_op = p_mcb->pcb.op;
3550                         switch (pending_op)
3551                         {
3552                             case BTIF_HL_PEND_DCH_OP_OPEN:
3553                                 btif_hl_send_setup_disconnected_cb(app_idx, mcl_idx);
3554                                 break;
3555                             case BTIF_HL_PEND_DCH_OP_RECONNECT:
3556                             case BTIF_HL_PEND_DCH_OP_DELETE_MDL:
3557                             default:
3558                                 break;
3559                         }
3560                         btif_hl_clean_mcl_cb(app_idx, mcl_idx);
3561                     }
3562                 }
3563             }
3564             break;
3565 
3566         case BTA_HL_DCH_OPEN_CFM_EVT:
3567             BTIF_TRACE_DEBUG0("Rcv BTA_HL_DCH_OPEN_CFM_EVT");
3568             BTIF_TRACE_DEBUG3("mcl_handle=%d mdl_handle=0x%x status=%d ",
3569                               p_data->dch_open_cfm.mcl_handle,
3570                               p_data->dch_open_cfm.mdl_handle,
3571                               p_data->dch_open_cfm.status);
3572             BTIF_TRACE_DEBUG5("first_reliable =%d dch_mode=%d local_mdep_id=%d mdl_id=%d mtu=%d",
3573                               p_data->dch_open_cfm.first_reliable,
3574                               p_data->dch_open_cfm.dch_mode,
3575                               p_data->dch_open_cfm.local_mdep_id,
3576                               p_data->dch_open_cfm.mdl_id,
3577                               p_data->dch_open_cfm.mtu);
3578             if (p_data->dch_open_cfm.status == BTA_HL_STATUS_OK)
3579             {
3580                 status = btif_hl_proc_dch_open_cfm(p_data);
3581             }
3582             else
3583             {
3584                 status = FALSE;
3585             }
3586 
3587             if (!status)
3588             {
3589                 if (btif_hl_find_mcl_idx_using_handle(p_data->dch_open_cfm.mcl_handle,&app_idx, &mcl_idx))
3590                 {
3591                     p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
3592                     pending_op = p_mcb->pcb.op;
3593                     switch (pending_op)
3594                     {
3595                         case BTIF_HL_PEND_DCH_OP_OPEN:
3596                             btif_hl_send_setup_disconnected_cb(app_idx, mcl_idx);
3597                             break;
3598                         case BTIF_HL_PEND_DCH_OP_RECONNECT:
3599                         case BTIF_HL_PEND_DCH_OP_DELETE_MDL:
3600                         default:
3601                             break;
3602                     }
3603                 }
3604             }
3605             break;
3606 
3607 
3608         case BTA_HL_CCH_OPEN_IND_EVT:
3609             BTIF_TRACE_DEBUG0("Rcv BTA_HL_CCH_OPEN_IND_EVT");
3610             BTIF_TRACE_DEBUG2("app_handle=%d mcl_handle=%d",
3611                               p_data->cch_open_ind.app_handle,
3612                               p_data->cch_open_ind.mcl_handle);
3613             BTIF_TRACE_DEBUG6("DB [%02x] [%02x] [%02x] [%02x] [%02x] [%02x]",
3614                               p_data->cch_open_ind.bd_addr[0], p_data->cch_open_ind.bd_addr[1],
3615                               p_data->cch_open_ind.bd_addr[2], p_data->cch_open_ind.bd_addr[3],
3616                               p_data->cch_open_ind.bd_addr[4], p_data->cch_open_ind.bd_addr[5]);
3617 
3618             btif_hl_proc_cch_open_ind(p_data);
3619             break;
3620 
3621         case BTA_HL_DCH_CREATE_IND_EVT:
3622             BTIF_TRACE_DEBUG0("Rcv BTA_HL_DCH_CREATE_IND_EVT");
3623             BTIF_TRACE_DEBUG1("mcl_handle=%d",
3624                               p_data->dch_create_ind.mcl_handle );
3625             BTIF_TRACE_DEBUG3("local_mdep_id =%d mdl_id=%d cfg=%d",
3626                               p_data->dch_create_ind.local_mdep_id,
3627                               p_data->dch_create_ind.mdl_id,
3628                               p_data->dch_create_ind.cfg);
3629             btif_hl_proc_create_ind(p_data);
3630             break;
3631 
3632         case BTA_HL_DCH_OPEN_IND_EVT:
3633             BTIF_TRACE_DEBUG0("Rcv BTA_HL_DCH_OPEN_IND_EVT");
3634             BTIF_TRACE_DEBUG2("mcl_handle=%d mdl_handle=0x%x",
3635                               p_data->dch_open_ind.mcl_handle,
3636                               p_data->dch_open_ind.mdl_handle );
3637             BTIF_TRACE_DEBUG5("first_reliable =%d dch_mode=%d local_mdep_id=%d mdl_id=%d mtu=%d",
3638                               p_data->dch_open_ind.first_reliable,
3639                               p_data->dch_open_ind.dch_mode,
3640                               p_data->dch_open_ind.local_mdep_id,
3641                               p_data->dch_open_ind.mdl_id,
3642                               p_data->dch_open_ind.mtu);
3643 
3644             btif_hl_proc_dch_open_ind(p_data);
3645             break;
3646 
3647         case BTA_HL_DELETE_MDL_IND_EVT:
3648             BTIF_TRACE_DEBUG0("Rcv BTA_HL_DELETE_MDL_IND_EVT");
3649             BTIF_TRACE_DEBUG2("mcl_handle=%d mdl_id=0x%x",
3650                               p_data->delete_mdl_ind.mcl_handle,
3651                               p_data->delete_mdl_ind.mdl_id);
3652             break;
3653 
3654         case BTA_HL_DELETE_MDL_CFM_EVT:
3655             BTIF_TRACE_DEBUG0("Rcv BTA_HL_DELETE_MDL_CFM_EVT");
3656             BTIF_TRACE_DEBUG3("mcl_handle=%d mdl_id=0x%x status=%d",
3657                               p_data->delete_mdl_cfm.mcl_handle,
3658                               p_data->delete_mdl_cfm.mdl_id,
3659                               p_data->delete_mdl_cfm.status);
3660 
3661             if (btif_hl_find_app_idx_using_deleted_mdl_id( p_data->delete_mdl_cfm.mdl_id,
3662                                     &app_idx))
3663             {
3664                 p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
3665                 btif_hl_send_destroyed_cb(p_acb);
3666                 btif_hl_clean_delete_mdl(&p_acb->delete_mdl);
3667             }
3668             break;
3669 
3670         case BTA_HL_DCH_RECONNECT_CFM_EVT:
3671             BTIF_TRACE_DEBUG0("Rcv BTA_HL_DCH_RECONNECT_CFM_EVT");
3672             BTIF_TRACE_DEBUG3("mcl_handle=%d mdl_handle=%d status=%d   ",
3673                               p_data->dch_reconnect_cfm.mcl_handle,
3674                               p_data->dch_reconnect_cfm.mdl_handle,
3675                               p_data->dch_reconnect_cfm.status);
3676             BTIF_TRACE_DEBUG4("first_reliable =%d dch_mode=%d mdl_id=%d mtu=%d",
3677                               p_data->dch_reconnect_cfm.first_reliable,
3678                               p_data->dch_reconnect_cfm.dch_mode,
3679                               p_data->dch_reconnect_cfm.mdl_id,
3680                               p_data->dch_reconnect_cfm.mtu);
3681 
3682 
3683             if (p_data->dch_reconnect_cfm.status == BTA_HL_STATUS_OK)
3684             {
3685                 status = btif_hl_proc_dch_reconnect_cfm(p_data);
3686             }
3687             else
3688             {
3689                 status = FALSE;
3690             }
3691 
3692             if (!status)
3693             {
3694                 if (btif_hl_find_mcl_idx_using_handle(p_data->dch_open_cfm.mcl_handle,&app_idx, &mcl_idx))
3695                 {
3696                     p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
3697                     pending_op = p_mcb->pcb.op;
3698                     switch (pending_op)
3699                     {
3700                         case BTIF_HL_PEND_DCH_OP_OPEN:
3701                             btif_hl_send_setup_disconnected_cb(app_idx, mcl_idx);
3702                             break;
3703                         case BTIF_HL_PEND_DCH_OP_RECONNECT:
3704                         case BTIF_HL_PEND_DCH_OP_DELETE_MDL:
3705                         default:
3706                             break;
3707                     }
3708                 }
3709             }
3710 
3711             break;
3712 
3713         case BTA_HL_CCH_CLOSE_CFM_EVT:
3714             BTIF_TRACE_DEBUG0("Rcv BTA_HL_CCH_CLOSE_CFM_EVT");
3715             BTIF_TRACE_DEBUG2("mcl_handle=%d status =%d",
3716                               p_data->cch_close_cfm.mcl_handle,
3717                               p_data->cch_close_cfm.status);
3718             if (p_data->cch_close_cfm.status == BTA_HL_STATUS_OK)
3719             {
3720                 btif_hl_proc_cch_close_cfm(p_data);
3721             }
3722             break;
3723 
3724         case BTA_HL_CCH_CLOSE_IND_EVT:
3725             BTIF_TRACE_DEBUG0("Rcv BTA_HL_CCH_CLOSE_IND_EVT");
3726             BTIF_TRACE_DEBUG2("mcl_handle =%d intentional_close=%s",
3727                               p_data->cch_close_ind.mcl_handle,
3728                               (p_data->cch_close_ind.intentional?"Yes":"No"));
3729 
3730             btif_hl_proc_cch_close_ind(p_data);
3731             break;
3732 
3733         case BTA_HL_DCH_CLOSE_IND_EVT:
3734             BTIF_TRACE_DEBUG0("Rcv BTA_HL_DCH_CLOSE_IND_EVT");
3735             BTIF_TRACE_DEBUG2("mdl_handle=%d intentional_close=%s",
3736                               p_data->dch_close_ind.mdl_handle,
3737                               (p_data->dch_close_ind.intentional?"Yes":"No") );
3738 
3739             btif_hl_proc_dch_close_ind(p_data);
3740             break;
3741 
3742         case BTA_HL_DCH_CLOSE_CFM_EVT:
3743             BTIF_TRACE_DEBUG0("Rcv BTA_HL_DCH_CLOSE_CFM_EVT");
3744             BTIF_TRACE_DEBUG2("mdl_handle=%d status=%d ",
3745                               p_data->dch_close_cfm.mdl_handle,
3746                               p_data->dch_close_cfm.status);
3747 
3748             if (p_data->dch_close_cfm.status == BTA_HL_STATUS_OK)
3749             {
3750                 btif_hl_proc_dch_close_cfm(p_data);
3751             }
3752             break;
3753 
3754         case BTA_HL_DCH_ECHO_TEST_CFM_EVT:
3755             BTIF_TRACE_DEBUG0("Rcv BTA_HL_DCH_ECHO_TEST_CFM_EVT");
3756             BTIF_TRACE_DEBUG2("mcl_handle=%d    status=%d",
3757                               p_data->echo_test_cfm.mcl_handle,
3758                               p_data->echo_test_cfm.status );
3759             /* not supported */
3760             break;
3761 
3762 
3763         case BTA_HL_DCH_RECONNECT_IND_EVT:
3764             BTIF_TRACE_DEBUG0("Rcv BTA_HL_DCH_RECONNECT_IND_EVT");
3765 
3766             BTIF_TRACE_DEBUG2("mcl_handle=%d mdl_handle=5d",
3767                               p_data->dch_reconnect_ind.mcl_handle,
3768                               p_data->dch_reconnect_ind.mdl_handle );
3769             BTIF_TRACE_DEBUG4("first_reliable =%d dch_mode=%d mdl_id=%d mtu=%d",
3770                               p_data->dch_reconnect_ind.first_reliable,
3771                               p_data->dch_reconnect_ind.dch_mode,
3772                               p_data->dch_reconnect_ind.mdl_id,
3773                               p_data->dch_reconnect_ind.mtu);
3774 
3775             btif_hl_proc_dch_reconnect_ind(p_data);
3776             break;
3777 
3778         case BTA_HL_CONG_CHG_IND_EVT:
3779             BTIF_TRACE_DEBUG0("Rcv BTA_HL_CONG_CHG_IND_EVT");
3780             BTIF_TRACE_DEBUG2("mdl_handle=%d cong =%d",
3781                               p_data->dch_cong_ind.mdl_handle,
3782                               p_data->dch_cong_ind.cong);
3783             btif_hl_proc_dch_cong_ind(p_data);
3784             break;
3785 
3786         case BTA_HL_DCH_ABORT_IND_EVT:
3787             BTIF_TRACE_DEBUG0("Rcv BTA_HL_DCH_ABORT_IND_EVT");
3788             BTIF_TRACE_DEBUG1("mcl_handle=%d",
3789                               p_data->dch_abort_ind.mcl_handle );
3790             btif_hl_proc_abort_ind(p_data->dch_abort_ind.mcl_handle);
3791             break;
3792         case BTA_HL_DCH_ABORT_CFM_EVT:
3793             BTIF_TRACE_DEBUG0("Rcv BTA_HL_DCH_ABORT_CFM_EVT");
3794             BTIF_TRACE_DEBUG2("mcl_handle=%d status =%d",
3795                               p_data->dch_abort_cfm.mcl_handle,
3796                               p_data->dch_abort_cfm.status);
3797             if (p_data->dch_abort_cfm.status == BTA_HL_STATUS_OK)
3798             {
3799                 btif_hl_proc_abort_cfm(p_data->dch_abort_ind.mcl_handle);
3800             }
3801             break;
3802 
3803         case BTA_HL_DCH_SEND_DATA_CFM_EVT:
3804             BTIF_TRACE_DEBUG0("Rcv BTA_HL_DCH_SEND_DATA_CFM_EVT");
3805             BTIF_TRACE_DEBUG2("mdl_handle=0x%x status =%d",
3806                               p_data->dch_send_data_cfm.mdl_handle,
3807                               p_data->dch_send_data_cfm.status);
3808             btif_hl_proc_send_data_cfm(p_data->dch_send_data_cfm.mdl_handle,
3809                                        p_data->dch_send_data_cfm.status);
3810             break;
3811 
3812         case BTA_HL_DCH_RCV_DATA_IND_EVT:
3813             BTIF_TRACE_DEBUG0("Rcv BTA_HL_DCH_RCV_DATA_IND_EVT");
3814             BTIF_TRACE_DEBUG1("mdl_handle=0x%x ",
3815                               p_data->dch_rcv_data_ind.mdl_handle);
3816             /* do nothing here */
3817             break;
3818 
3819         default:
3820             BTIF_TRACE_DEBUG1("Unknown Event (0x%02x)...", event);
3821             break;
3822     }
3823 }
3824 
3825 /*******************************************************************************
3826 **
3827 ** Function         btif_hl_cback
3828 **
3829 ** Description      Callback function for HL events
3830 **
3831 ** Returns          void
3832 **
3833 *******************************************************************************/
btif_hl_cback(tBTA_HL_EVT event,tBTA_HL * p_data)3834 static void btif_hl_cback(tBTA_HL_EVT event, tBTA_HL *p_data){
3835     bt_status_t status;
3836     int param_len = 0;
3837     BTIF_TRACE_DEBUG2("%s event %d", __FUNCTION__, event);
3838     btif_hl_display_calling_process_name();
3839     switch (event)
3840     {
3841         case BTA_HL_REGISTER_CFM_EVT:
3842             param_len = sizeof(tBTA_HL_REGISTER_CFM);
3843             break;
3844         case BTA_HL_SDP_INFO_IND_EVT:
3845             param_len = sizeof(tBTA_HL_SDP_INFO_IND);
3846             break;
3847         case BTA_HL_DEREGISTER_CFM_EVT:
3848             param_len = sizeof(tBTA_HL_DEREGISTER_CFM);
3849             break;
3850         case BTA_HL_SDP_QUERY_CFM_EVT:
3851             param_len = sizeof(tBTA_HL_SDP_QUERY_CFM);
3852             break;
3853         case BTA_HL_CCH_OPEN_CFM_EVT:
3854             param_len = sizeof(tBTA_HL_CCH_OPEN_CFM);
3855             break;
3856         case BTA_HL_DCH_OPEN_CFM_EVT:
3857             param_len = sizeof(tBTA_HL_DCH_OPEN_CFM);
3858             break;
3859         case BTA_HL_CCH_OPEN_IND_EVT:
3860             param_len = sizeof(tBTA_HL_CCH_OPEN_IND);
3861             break;
3862         case BTA_HL_DCH_CREATE_IND_EVT:
3863             param_len = sizeof(tBTA_HL_DCH_CREATE_IND);
3864             break;
3865         case BTA_HL_DCH_OPEN_IND_EVT:
3866             param_len = sizeof(tBTA_HL_DCH_OPEN_IND);
3867             break;
3868         case BTA_HL_DELETE_MDL_IND_EVT:
3869             param_len = sizeof(tBTA_HL_MDL_IND);
3870             break;
3871         case BTA_HL_DELETE_MDL_CFM_EVT:
3872             param_len = sizeof(tBTA_HL_MDL_CFM);
3873             break;
3874         case BTA_HL_DCH_RECONNECT_CFM_EVT:
3875             param_len = sizeof(tBTA_HL_DCH_OPEN_CFM);
3876             break;
3877         case BTA_HL_CCH_CLOSE_CFM_EVT:
3878             param_len = sizeof(tBTA_HL_MCL_CFM);
3879             break;
3880         case BTA_HL_CCH_CLOSE_IND_EVT:
3881             param_len = sizeof(tBTA_HL_CCH_CLOSE_IND);
3882             break;
3883         case BTA_HL_DCH_CLOSE_IND_EVT:
3884             param_len = sizeof(tBTA_HL_DCH_CLOSE_IND);
3885             break;
3886         case BTA_HL_DCH_CLOSE_CFM_EVT:
3887             param_len = sizeof(tBTA_HL_MDL_CFM);
3888             break;
3889         case BTA_HL_DCH_ECHO_TEST_CFM_EVT:
3890             param_len = sizeof(tBTA_HL_MCL_CFM);
3891             break;
3892         case BTA_HL_DCH_RECONNECT_IND_EVT:
3893             param_len = sizeof(tBTA_HL_DCH_OPEN_IND);
3894             break;
3895         case BTA_HL_CONG_CHG_IND_EVT:
3896             param_len = sizeof(tBTA_HL_DCH_CONG_IND);
3897             break;
3898         case BTA_HL_DCH_ABORT_IND_EVT:
3899             param_len = sizeof(tBTA_HL_MCL_IND);
3900             break;
3901         case BTA_HL_DCH_ABORT_CFM_EVT:
3902             param_len = sizeof(tBTA_HL_MCL_CFM);
3903             break;
3904         case BTA_HL_DCH_SEND_DATA_CFM_EVT:
3905             param_len = sizeof(tBTA_HL_MDL_CFM);
3906             break;
3907         case BTA_HL_DCH_RCV_DATA_IND_EVT:
3908             param_len = sizeof(tBTA_HL_MDL_IND);
3909             break;
3910         default:
3911             param_len = sizeof(tBTA_HL_MDL_IND);
3912             break;
3913     }
3914     status = btif_transfer_context(btif_hl_upstreams_evt, (uint16_t)event, (void*)p_data, param_len, NULL);
3915 
3916     /* catch any failed context transfers */
3917     ASSERTC(status == BT_STATUS_SUCCESS, "context transfer failed", status);
3918 }
3919 
3920 /*******************************************************************************
3921 **
3922 ** Function         btif_hl_upstreams_ctrl_evt
3923 **
3924 ** Description      Callback function for HL control events in the BTIF task context
3925 **
3926 ** Returns          void
3927 **
3928 *******************************************************************************/
btif_hl_upstreams_ctrl_evt(UINT16 event,char * p_param)3929 static void btif_hl_upstreams_ctrl_evt(UINT16 event, char* p_param){
3930     tBTA_HL_CTRL *p_data = (tBTA_HL_CTRL *) p_param;
3931     UINT8               i;
3932     tBTA_HL_REG_PARAM   reg_param;
3933     btif_hl_app_cb_t    *p_acb;
3934 
3935     BTIF_TRACE_DEBUG2("%s event %d", __FUNCTION__, event);
3936     btif_hl_display_calling_process_name();
3937 
3938     switch ( event )
3939     {
3940         case BTA_HL_CTRL_ENABLE_CFM_EVT:
3941             BTIF_TRACE_DEBUG0("Rcv BTA_HL_CTRL_ENABLE_CFM_EVT");
3942             BTIF_TRACE_DEBUG1("status=%d", p_data->enable_cfm.status);
3943 
3944             if (p_data->enable_cfm.status == BTA_HL_STATUS_OK)
3945             {
3946                 btif_hl_set_state(BTIF_HL_STATE_ENABLED);
3947 
3948 
3949                 for (i=0; i < BTA_HL_NUM_APPS ; i ++)
3950                 {
3951                     p_acb = BTIF_HL_GET_APP_CB_PTR(i);
3952                     if (p_acb->in_use && p_acb->reg_pending)
3953                     {
3954                         p_acb->reg_pending = FALSE;
3955                         reg_param.dev_type = p_acb->dev_type;
3956                         reg_param.sec_mask = BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT;
3957                         reg_param.p_srv_name = p_acb->srv_name;
3958                         reg_param.p_srv_desp = p_acb->srv_desp;
3959                         reg_param.p_provider_name = p_acb->provider_name;
3960 
3961                         BTIF_TRACE_DEBUG1("Register pending app_id=%d", p_acb->app_id);
3962                         btif_hl_proc_reg_request (i, p_acb->app_id, &reg_param, btif_hl_cback);
3963                     }
3964                 }
3965             }
3966 
3967             break;
3968         case BTA_HL_CTRL_DISABLE_CFM_EVT:
3969             BTIF_TRACE_DEBUG0("Rcv BTA_HL_CTRL_DISABLE_CFM_EVT");
3970             BTIF_TRACE_DEBUG1("status=%d",
3971                               p_data->disable_cfm.status);
3972 
3973             if (p_data->disable_cfm.status == BTA_HL_STATUS_OK)
3974             {
3975                 memset(p_btif_hl_cb, 0, sizeof(btif_hl_cb_t));
3976                 btif_hl_set_state(BTIF_HL_STATE_DISABLED);
3977             }
3978 
3979             break;
3980         default:
3981             break;
3982     }
3983 }
3984 
3985 /*******************************************************************************
3986 **
3987 ** Function         btif_hl_ctrl_cback
3988 **
3989 ** Description      Callback function for HL control events
3990 **
3991 ** Returns          void
3992 **
3993 *******************************************************************************/
btif_hl_ctrl_cback(tBTA_HL_CTRL_EVT event,tBTA_HL_CTRL * p_data)3994 static void btif_hl_ctrl_cback(tBTA_HL_CTRL_EVT event, tBTA_HL_CTRL *p_data){
3995     bt_status_t status;
3996     int param_len = 0;
3997 
3998     BTIF_TRACE_DEBUG2("%s event %d", __FUNCTION__, event);
3999     btif_hl_display_calling_process_name();
4000 
4001     switch ( event )
4002     {
4003         case BTA_HL_CTRL_ENABLE_CFM_EVT:
4004         case BTA_HL_CTRL_DISABLE_CFM_EVT:
4005             param_len = sizeof(tBTA_HL_CTRL_ENABLE_DISABLE);
4006             break;
4007         default:
4008             break;
4009     }
4010 
4011     status = btif_transfer_context(btif_hl_upstreams_ctrl_evt, (uint16_t)event, (void*)p_data, param_len, NULL);
4012     ASSERTC(status == BT_STATUS_SUCCESS, "context transfer failed", status);
4013 }
4014 /*******************************************************************************
4015 **
4016 ** Function         connect_channel
4017 **
4018 ** Description     connect a data channel
4019 **
4020 ** Returns         bt_status_t
4021 **
4022 *******************************************************************************/
connect_channel(int app_id,bt_bdaddr_t * bd_addr,int mdep_cfg_index,int * channel_id)4023 static bt_status_t connect_channel(int app_id, bt_bdaddr_t *bd_addr, int mdep_cfg_index, int *channel_id){
4024     UINT8                   app_idx, mcl_idx;
4025     btif_hl_app_cb_t        *p_acb = NULL;
4026     btif_hl_pending_chan_cb_t   *p_pcb = NULL;
4027     btif_hl_mcl_cb_t        *p_mcb=NULL;
4028     bt_status_t             status = BT_STATUS_SUCCESS;
4029     tBTA_HL_DCH_OPEN_PARAM  dch_open;
4030     BD_ADDR                 bda;
4031     UINT8 i;
4032 
4033     CHECK_BTHL_INIT();
4034     BTIF_TRACE_EVENT1("%s", __FUNCTION__);
4035     btif_hl_display_calling_process_name();
4036 
4037 
4038     for (i=0; i<6; i++)
4039     {
4040         bda[i] = (UINT8) bd_addr->address[i];
4041     }
4042     if (btif_hl_find_app_idx(((UINT8)app_id), &app_idx))
4043     {
4044         p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
4045         if (btif_hl_find_mcl_idx(app_idx, bda , &mcl_idx))
4046         {
4047             p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
4048             if (p_mcb->is_connected)
4049             {
4050                 dch_open.ctrl_psm = p_mcb->ctrl_psm;
4051                 dch_open.local_mdep_id = p_acb->sup_feature.mdep[mdep_cfg_index].mdep_id;
4052                 BTIF_TRACE_DEBUG4("connect_channel: app_idx =%d, mdep_cfg_indx =%d, mdep_id =%d app_id= %d", app_idx,
4053                                                 mdep_cfg_index, dch_open.local_mdep_id, app_id);
4054                 if (btif_hl_find_peer_mdep_id(p_acb->app_id, p_mcb->bd_addr,
4055                                               p_acb->sup_feature.mdep[mdep_cfg_index].mdep_cfg.mdep_role,
4056                                               p_acb->sup_feature.mdep[mdep_cfg_index].mdep_cfg.data_cfg[0].data_type, &dch_open.peer_mdep_id ))
4057                 {
4058                     dch_open.local_cfg = p_acb->channel_type[mdep_cfg_index];
4059                     if ((p_acb->sup_feature.mdep[mdep_cfg_index].mdep_cfg.mdep_role == BTA_HL_MDEP_ROLE_SOURCE)
4060                         && !btif_hl_is_the_first_reliable_existed(app_idx,mcl_idx))
4061                     {
4062                         dch_open.local_cfg = BTA_HL_DCH_CFG_RELIABLE;
4063                     }
4064                     dch_open.sec_mask = (BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT);
4065 
4066                     if( !btif_hl_dch_open(p_acb->app_id, bda, &dch_open,
4067                                               mdep_cfg_index, BTIF_HL_PEND_DCH_OP_OPEN, channel_id ))
4068                     {
4069                         status = BT_STATUS_FAIL;
4070                         BTIF_TRACE_EVENT1("%s loc0 status = BT_STATUS_FAIL", __FUNCTION__);
4071                     }
4072                 }
4073                 else
4074                 {
4075                     p_mcb->cch_oper = BTIF_HL_CCH_OP_MDEP_FILTERING;
4076 
4077                     p_pcb = BTIF_HL_GET_PCB_PTR(app_idx, mcl_idx);
4078                     p_pcb->in_use = TRUE;
4079                     p_pcb->mdep_cfg_idx = mdep_cfg_index;
4080                     memcpy(p_pcb->bd_addr, bda, sizeof(BD_ADDR));
4081                     p_pcb->op = BTIF_HL_PEND_DCH_OP_OPEN;
4082                     BTA_HlSdpQuery(app_id,p_acb->app_handle, bda);
4083                 }
4084             }
4085             else
4086             {
4087                 status = BT_STATUS_FAIL;
4088             }
4089         }
4090         else
4091         {
4092             p_acb->filter.num_elems =1;
4093             p_acb->filter.elem[0].data_type = p_acb->sup_feature.mdep[mdep_cfg_index].mdep_cfg.data_cfg[mdep_cfg_index].data_type;
4094             if (p_acb->sup_feature.mdep[mdep_cfg_index].mdep_cfg.mdep_role == BTA_HL_MDEP_ROLE_SINK)
4095                 p_acb->filter.elem[0].peer_mdep_role = BTA_HL_MDEP_ROLE_SOURCE;
4096             else
4097                 p_acb->filter.elem[0].peer_mdep_role = BTA_HL_MDEP_ROLE_SINK;
4098 
4099             if ( !btif_hl_cch_open(p_acb->app_id, bda, 0, mdep_cfg_index,
4100                                    BTIF_HL_PEND_DCH_OP_OPEN,
4101                                    channel_id))
4102             {
4103                 status = BT_STATUS_FAIL;
4104             }
4105         }
4106     }
4107     else
4108     {
4109         status = BT_STATUS_FAIL;
4110     }
4111 
4112     BTIF_TRACE_DEBUG3("%s status=%d channel_id=0x%08x", __FUNCTION__, status, *channel_id);
4113 
4114     return status;
4115 }
4116 /*******************************************************************************
4117 **
4118 ** Function         destroy_channel
4119 **
4120 ** Description      destroy a data channel
4121 **
4122 ** Returns         bt_status_t
4123 **
4124 *******************************************************************************/
destroy_channel(int channel_id)4125 static bt_status_t destroy_channel(int channel_id){
4126     UINT8 app_idx, mcl_idx, mdl_idx, mdl_cfg_idx, app_id, mdep_cfg_idx;
4127     bt_status_t status = BT_STATUS_SUCCESS;
4128     btif_hl_mdl_cfg_t     *p_mdl;
4129     btif_hl_mcl_cb_t     *p_mcb;
4130     btif_hl_mdl_cb_t     *p_dcb;
4131     btif_hl_app_cb_t     *p_acb;
4132 
4133     CHECK_BTHL_INIT();
4134     BTIF_TRACE_EVENT2("%s channel_id=0x%08x", __FUNCTION__, channel_id);
4135     btif_hl_display_calling_process_name();
4136 
4137 
4138     if (btif_hl_if_channel_setup_pending(channel_id, &app_idx, &mcl_idx))
4139     {
4140         btif_hl_dch_abort(app_idx, mcl_idx);
4141     }
4142     else
4143     {
4144         if (btif_hl_find_mdl_cfg_idx_using_channel_id(channel_id, &app_idx, &mdl_cfg_idx))
4145  //       if(btif_hl_find_mdl_idx_using_channel_id(channel_id, &app_idx,&mcl_idx, &mdl_idx))
4146         {
4147             p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
4148             if (!p_acb->delete_mdl.active)
4149             {
4150                 p_mdl =BTIF_HL_GET_MDL_CFG_PTR(app_idx, mdl_cfg_idx);
4151                 p_acb->delete_mdl.active = TRUE;
4152                 p_acb->delete_mdl.mdl_id = p_mdl->base.mdl_id;
4153                 p_acb->delete_mdl.channel_id = channel_id;
4154                 p_acb->delete_mdl.mdep_cfg_idx = p_mdl->extra.mdep_cfg_idx;
4155                 memcpy(p_acb->delete_mdl.bd_addr, p_mdl->base.peer_bd_addr,sizeof(BD_ADDR));
4156 
4157                 if (btif_hl_find_mcl_idx(app_idx, p_mdl->base.peer_bd_addr, &mcl_idx))
4158                 {
4159                     p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
4160                     if (p_mcb->is_connected)
4161                     {
4162                         BTIF_TRACE_DEBUG1("calling BTA_HlDeleteMdl mdl_id=%d",p_acb->delete_mdl.mdl_id );
4163                         BTA_HlDeleteMdl(p_mcb->mcl_handle, p_acb->delete_mdl.mdl_id);
4164                     }
4165                     else
4166                     {
4167                         status = BT_STATUS_FAIL;
4168                     }
4169                 }
4170                 else
4171                 {
4172                     BTIF_TRACE_DEBUG0("btif_hl_delete_mdl calling btif_hl_cch_open"  );
4173                     mdep_cfg_idx = p_mdl->extra.mdep_cfg_idx;
4174                     p_acb->filter.num_elems =1;
4175                     p_acb->filter.elem[0].data_type = p_acb->sup_feature.mdep[mdep_cfg_idx].mdep_cfg.data_cfg[mdep_cfg_idx].data_type;
4176                     if (p_acb->sup_feature.mdep[mdep_cfg_idx].mdep_cfg.mdep_role == BTA_HL_MDEP_ROLE_SINK)
4177                         p_acb->filter.elem[0].peer_mdep_role = BTA_HL_MDEP_ROLE_SOURCE;
4178                     else
4179                         p_acb->filter.elem[0].peer_mdep_role = BTA_HL_MDEP_ROLE_SINK;
4180                     if (btif_hl_cch_open(p_acb->app_id, p_acb->delete_mdl.bd_addr, 0,
4181                                          mdep_cfg_idx,
4182                                          BTIF_HL_PEND_DCH_OP_DELETE_MDL, NULL))
4183                     {
4184                         status = BT_STATUS_FAIL;
4185                     }
4186                 }
4187 
4188                 if (  status == BT_STATUS_FAIL)
4189                 {
4190                     /* fail for now  */
4191                     btif_hl_clean_delete_mdl(&p_acb->delete_mdl);
4192                 }
4193             }
4194             else
4195             {
4196                 status = BT_STATUS_BUSY;
4197             }
4198         }
4199         else
4200         {
4201             status = BT_STATUS_FAIL;
4202         }
4203 
4204     }
4205     return status;
4206 }
4207 /*******************************************************************************
4208 **
4209 ** Function         unregister_application
4210 **
4211 ** Description     unregister an HDP application
4212 **
4213 ** Returns         bt_status_t
4214 **
4215 *******************************************************************************/
unregister_application(int app_id)4216 static bt_status_t unregister_application(int app_id){
4217     btif_hl_app_cb_t    *p_acb;
4218     UINT8               app_idx;
4219     int                 len;
4220     bt_status_t         status = BT_STATUS_SUCCESS;
4221     btif_hl_evt_cb_t    evt_param;
4222 
4223     CHECK_BTHL_INIT();
4224     BTIF_TRACE_EVENT2("%s app_id=%d", __FUNCTION__, app_id);
4225     btif_hl_display_calling_process_name();
4226 
4227     if (btif_hl_find_app_idx(((UINT8)app_id), &app_idx))
4228     {
4229         evt_param.unreg.app_idx = app_idx;
4230         p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
4231         reg_counter --;
4232         len = sizeof(btif_hl_unreg_t);
4233         status = btif_transfer_context (btif_hl_proc_cb_evt, BTIF_HL_UNREG_APP,
4234                                         (char*) &evt_param, len, NULL);
4235         ASSERTC(status == BT_STATUS_SUCCESS, "context transfer failed", status);
4236     }
4237     else
4238     {
4239         status  = BT_STATUS_FAIL;
4240     }
4241 
4242     BTIF_TRACE_DEBUG1("de-reg return status=%d", status);
4243     return status;
4244 }
4245 /*******************************************************************************
4246 **
4247 ** Function         register_application
4248 **
4249 ** Description     register an HDP application
4250 **
4251 ** Returns         bt_status_t
4252 **
4253 *******************************************************************************/
register_application(bthl_reg_param_t * p_reg_param,int * app_id)4254 static bt_status_t register_application(bthl_reg_param_t *p_reg_param, int *app_id){
4255     btif_hl_app_cb_t            *p_acb;
4256     tBTA_HL_SUP_FEATURE         *p_sup;
4257     tBTA_HL_MDEP_CFG            *p_cfg;
4258     tBTA_HL_MDEP_DATA_TYPE_CFG  *p_data;
4259     UINT8                       app_idx=0, i=0, pending_reg_idx=0;
4260     bthl_mdep_cfg_t             *p_mdep_cfg;
4261     bt_status_t                 status = BT_STATUS_SUCCESS;
4262     btif_hl_evt_cb_t            evt_param;
4263     int                         len;
4264 
4265     CHECK_BTHL_INIT();
4266     BTIF_TRACE_EVENT1("%s", __FUNCTION__);
4267     btif_hl_display_calling_process_name();
4268 
4269     if (btif_hl_get_state() == BTIF_HL_STATE_DISABLED)
4270     {
4271         btif_hl_init();
4272         btif_hl_set_state(BTIF_HL_STATE_ENABLING);
4273         BTA_HlEnable(btif_hl_ctrl_cback);
4274     }
4275 
4276     if (!btif_hl_find_avail_app_idx(&app_idx))
4277     {
4278         BTIF_TRACE_ERROR0("Unable to allocate a new application control block");
4279         return BT_STATUS_FAIL;
4280     }
4281 
4282     p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
4283     p_acb->in_use = TRUE;
4284 
4285 
4286     p_acb->app_id = btif_hl_get_next_app_id();
4287 
4288     if (p_reg_param->application_name != NULL )
4289         strncpy(p_acb->application_name, p_reg_param->application_name, BTIF_HL_APPLICATION_NAME_LEN);
4290 
4291     if (p_reg_param->provider_name != NULL )
4292         strncpy(p_acb->provider_name, p_reg_param->provider_name, BTA_PROVIDER_NAME_LEN);
4293 
4294     if (p_reg_param->srv_name != NULL )
4295         strncpy(p_acb->srv_name, p_reg_param->srv_name, BTA_SERVICE_NAME_LEN);
4296 
4297     if (p_reg_param->srv_desp != NULL )
4298         strncpy(p_acb->srv_desp, p_reg_param->srv_desp, BTA_SERVICE_DESP_LEN);
4299 
4300     p_sup = &p_acb->sup_feature;
4301     p_sup->advertize_source_sdp = TRUE;
4302     p_sup->echo_cfg.max_rx_apdu_size = BTIF_HL_ECHO_MAX_TX_RX_APDU_SIZE;
4303     p_sup->echo_cfg.max_tx_apdu_size = BTIF_HL_ECHO_MAX_TX_RX_APDU_SIZE;
4304     p_sup->num_of_mdeps = p_reg_param->number_of_mdeps;
4305 
4306     for (i=0, p_mdep_cfg = p_reg_param->mdep_cfg ; i<  p_sup->num_of_mdeps; i++, p_mdep_cfg++  )
4307     {
4308         p_cfg = &p_sup->mdep[i].mdep_cfg;
4309         p_cfg->num_of_mdep_data_types = 1;
4310         p_data  = &p_cfg->data_cfg[0];
4311 
4312         if ( !btif_hl_get_bta_mdep_role(p_mdep_cfg->mdep_role, &(p_cfg->mdep_role)))
4313         {
4314             BTIF_TRACE_ERROR1("Invalid mdep_role=%d", p_mdep_cfg->mdep_role);
4315             status = BT_STATUS_FAIL;
4316             break;
4317         }
4318         else
4319         {
4320             if (p_cfg->mdep_role == BTA_HL_MDEP_ROLE_SINK )
4321                 p_sup->app_role_mask |= BTA_HL_MDEP_ROLE_MASK_SINK;
4322             else
4323                 p_sup->app_role_mask |=  BTA_HL_MDEP_ROLE_MASK_SOURCE;
4324 
4325             if ( (p_sup->app_role_mask & BTA_HL_MDEP_ROLE_MASK_SINK) &&
4326                  (p_sup->app_role_mask & BTA_HL_MDEP_ROLE_MASK_SINK) )
4327             {
4328                 p_acb->dev_type = BTA_HL_DEVICE_TYPE_DUAL;
4329             }
4330             else if ( p_sup->app_role_mask & BTA_HL_MDEP_ROLE_MASK_SINK )
4331                 p_acb->dev_type = BTA_HL_DEVICE_TYPE_SINK;
4332             else
4333 
4334                 p_acb->dev_type = BTA_HL_DEVICE_TYPE_SOURCE;
4335 
4336             p_data->data_type = (UINT16) p_mdep_cfg->data_type;
4337             p_data->max_rx_apdu_size = btif_hl_get_max_rx_apdu_size(p_cfg->mdep_role, p_data->data_type);
4338             p_data->max_tx_apdu_size = btif_hl_get_max_tx_apdu_size(p_cfg->mdep_role, p_data->data_type);
4339 
4340             if (p_mdep_cfg->mdep_description != NULL )
4341                 strncpy(p_data->desp, p_mdep_cfg->mdep_description, BTA_SERVICE_DESP_LEN);
4342 
4343             if ( !btif_hl_get_bta_channel_type(p_mdep_cfg->channel_type, &(p_acb->channel_type[i])))
4344             {
4345                 BTIF_TRACE_ERROR1("Invalid channel_type=%d", p_mdep_cfg->channel_type);
4346                 status = BT_STATUS_FAIL;
4347                 break;
4348             }
4349         }
4350     }
4351 
4352     if (status == BT_STATUS_SUCCESS)
4353     {
4354         *app_id = (int) p_acb->app_id;
4355         evt_param.reg.app_idx = app_idx;
4356         len = sizeof(btif_hl_reg_t);
4357         p_acb->reg_pending = TRUE;
4358         reg_counter++;
4359         BTIF_TRACE_DEBUG2("calling btif_transfer_context status=%d app_id=%d", status, *app_id);
4360         status = btif_transfer_context (btif_hl_proc_cb_evt, BTIF_HL_REG_APP,
4361                                         (char*) &evt_param, len, NULL);
4362         ASSERTC(status == BT_STATUS_SUCCESS, "context transfer failed", status);
4363 
4364     }
4365     else
4366     {
4367         btif_hl_free_app_idx(app_idx);
4368     }
4369 
4370     BTIF_TRACE_DEBUG2("register_application status=%d app_id=%d", status, *app_id);
4371     return status;
4372 }
4373 
4374 /*******************************************************************************
4375 **
4376 ** Function      btif_hl_save_mdl_cfg
4377 **
4378 ** Description  Save the MDL configuration
4379 **
4380 ** Returns      BOOLEAN
4381 **
4382 *******************************************************************************/
btif_hl_save_mdl_cfg(UINT8 mdep_id,UINT8 item_idx,tBTA_HL_MDL_CFG * p_mdl_cfg)4383 BOOLEAN  btif_hl_save_mdl_cfg(UINT8 mdep_id, UINT8 item_idx,
4384                               tBTA_HL_MDL_CFG *p_mdl_cfg){
4385     btif_hl_mdl_cfg_t   *p_mdl=NULL;
4386     BOOLEAN             success = FALSE;
4387     btif_hl_app_cb_t    *p_acb;
4388     btif_hl_mcl_cb_t    *p_mcb;
4389     UINT8               app_idx, mcl_idx, mdl_idx, len;
4390     bt_status_t         bt_status;
4391     btif_hl_evt_cb_t    evt_param;
4392     int                 *p_channel_id;
4393 
4394     BTIF_TRACE_DEBUG6("%s mdep_id=%d item_idx=%d, local_mdep_id=%d mdl_id=0x%x dch_mode=%d",
4395                       __FUNCTION__, mdep_id, item_idx, p_mdl_cfg->local_mdep_id,
4396                       p_mdl_cfg->mdl_id, p_mdl_cfg->dch_mode );
4397 
4398     if(btif_hl_find_app_idx_using_mdepId(mdep_id,&app_idx))
4399     {
4400         p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
4401         p_mdl = BTIF_HL_GET_MDL_CFG_PTR(app_idx, item_idx);
4402         p_channel_id = BTIF_HL_GET_MDL_CFG_CHANNEL_ID_PTR(app_idx, item_idx);
4403         if (p_mdl)
4404         {
4405             memcpy(&p_mdl->base, p_mdl_cfg, sizeof(tBTA_HL_MDL_CFG));
4406             if (btif_hl_find_mcl_idx(app_idx, p_mdl->base.peer_bd_addr , &mcl_idx))
4407             {
4408                 p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
4409                 if (p_mcb->pcb.in_use)
4410                     *p_channel_id = p_mcb->pcb.channel_id;
4411                 else
4412                     *p_channel_id = btif_hl_get_next_channel_id(p_acb->app_id);
4413                 p_mdl->extra.mdep_cfg_idx = p_mcb->pcb.mdep_cfg_idx;
4414                 p_mdl->extra.data_type = p_acb->sup_feature.mdep[p_mcb->pcb.mdep_cfg_idx].mdep_cfg.data_cfg[0].data_type;
4415 
4416                 if (!btif_hl_find_peer_mdep_id(p_acb->app_id, p_mcb->bd_addr,
4417                                                p_acb->sup_feature.mdep[p_mcb->pcb.mdep_cfg_idx].mdep_cfg.mdep_role,
4418                                                p_acb->sup_feature.mdep[p_mcb->pcb.mdep_cfg_idx].mdep_cfg.data_cfg[0].data_type,
4419                                                &p_mdl->extra.peer_mdep_id))
4420                 {
4421                     p_mdl->extra.peer_mdep_id = BTA_HL_INVALID_MDEP_ID;
4422                 }
4423                 BTIF_TRACE_DEBUG4("%s app_idx=%d item_idx=%d mld_id=0x%x",
4424                                   __FUNCTION__, app_idx, item_idx, p_mdl->base.mdl_id);
4425                 evt_param.update_mdl.app_idx = app_idx;
4426                 len = sizeof(btif_hl_update_mdl_t);
4427                 BTIF_TRACE_DEBUG1("send BTIF_HL_UPDATE_MDL event app_idx=%d  ",app_idx);
4428                 if ((bt_status = btif_transfer_context (btif_hl_proc_cb_evt, BTIF_HL_UPDATE_MDL,
4429                                                         (char*) &evt_param, len, NULL)) == BT_STATUS_SUCCESS)
4430                 {
4431                     success = TRUE;
4432                 }
4433                 ASSERTC(bt_status == BT_STATUS_SUCCESS, "context transfer failed", bt_status);
4434             }
4435         }
4436     }
4437     BTIF_TRACE_DEBUG2("%s success=%d  ",__FUNCTION__, success );
4438 
4439     return success;
4440 }
4441 
4442 /*******************************************************************************
4443 **
4444 ** Function      btif_hl_delete_mdl_cfg
4445 **
4446 ** Description  Delete the MDL configuration
4447 **
4448 ** Returns      BOOLEAN
4449 **
4450 *******************************************************************************/
btif_hl_delete_mdl_cfg(UINT8 mdep_id,UINT8 item_idx)4451 BOOLEAN  btif_hl_delete_mdl_cfg(UINT8 mdep_id, UINT8 item_idx){
4452     btif_hl_mdl_cfg_t     *p_mdl=NULL;
4453     BOOLEAN             success = FALSE;
4454     btif_hl_app_cb_t      *p_acb;
4455     UINT8               app_idx, len;
4456     bt_status_t         bt_status;
4457     btif_hl_evt_cb_t    evt_param;
4458 
4459     if(btif_hl_find_app_idx_using_mdepId(mdep_id,&app_idx))
4460     {
4461 
4462         p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
4463 
4464         p_mdl = BTIF_HL_GET_MDL_CFG_PTR(app_idx, item_idx);
4465         if (p_mdl)
4466         {
4467             memset(p_mdl, 0, sizeof(btif_hl_mdl_cfg_t));
4468             evt_param.update_mdl.app_idx = app_idx;
4469             len = sizeof(btif_hl_update_mdl_t);
4470             BTIF_TRACE_DEBUG1("send BTIF_HL_UPDATE_MDL event app_idx=%d  ",app_idx);
4471             if ((bt_status = btif_transfer_context (btif_hl_proc_cb_evt, BTIF_HL_UPDATE_MDL,
4472                                                     (char*) &evt_param, len, NULL)) == BT_STATUS_SUCCESS)
4473             {
4474                 success = TRUE;
4475             }
4476             ASSERTC(bt_status == BT_STATUS_SUCCESS, "context transfer failed", bt_status);
4477         }
4478     }
4479 
4480     BTIF_TRACE_DEBUG2("%s success=%d  ",__FUNCTION__, success );
4481     return success;
4482 }
4483 
4484 /*******************************************************************************
4485 **
4486 ** Function         get_device_datatype
4487 **
4488 ** Description      Start SDP on remote device and look for Remote HDP Data type and role
4489 **
4490 ** Returns         bt_status_t
4491 **
4492 *******************************************************************************/
get_device_datatype(int app_id,bt_bdaddr_t * bd_addr)4493 static bt_status_t get_device_datatype(int app_id, bt_bdaddr_t *bd_addr){
4494     btif_hl_app_cb_t    *p_acb;
4495     UINT8               app_idx;
4496     bt_status_t         status = BT_STATUS_SUCCESS;
4497     BD_ADDR             bda;
4498     UINT8               i;
4499 
4500     CHECK_BTHL_INIT();
4501     BTIF_TRACE_EVENT2("%s app_id=%d", __FUNCTION__, app_id);
4502     btif_hl_display_calling_process_name();
4503 
4504     for (i=0; i<6; i++)
4505     {
4506         bda[i] = (UINT8) bd_addr->address[i];
4507     }
4508 
4509     if (btif_hl_find_app_idx(((UINT8)app_id), &app_idx))
4510     {
4511         p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
4512         BTA_HlSdpQuery(app_id,p_acb->app_handle,bda);
4513     }
4514     else
4515     {
4516         status  = BT_STATUS_FAIL;
4517     }
4518 
4519     BTIF_TRACE_DEBUG1("de-reg return status=%d", status);
4520     return status;
4521 }
4522 
4523 /*******************************************************************************
4524 **
4525 ** Function         init
4526 **
4527 ** Description     initializes the hl interface
4528 **
4529 ** Returns         bt_status_t
4530 **
4531 *******************************************************************************/
init(bthl_callbacks_t * callbacks)4532 static bt_status_t init( bthl_callbacks_t* callbacks ){
4533     bt_status_t status = BT_STATUS_SUCCESS;
4534 
4535     BTIF_TRACE_EVENT1("%s", __FUNCTION__);
4536     btif_hl_display_calling_process_name();
4537     bt_hl_callbacks_cb = *callbacks;
4538     bt_hl_callbacks = &bt_hl_callbacks_cb;
4539     btif_hl_soc_thread_init();
4540     reg_counter = 0;
4541     return status;
4542 }
4543 /*******************************************************************************
4544 **
4545 ** Function         cleanup
4546 **
4547 ** Description      Closes the HL interface
4548 **
4549 ** Returns          void
4550 **
4551 *******************************************************************************/
cleanup(void)4552 static void  cleanup( void ){
4553     BTIF_TRACE_EVENT1("%s", __FUNCTION__);
4554     btif_hl_display_calling_process_name();
4555     if (bt_hl_callbacks)
4556     {
4557         btif_disable_service(BTA_HDP_SERVICE_ID);
4558         bt_hl_callbacks = NULL;
4559         reg_counter = 0;
4560     }
4561 
4562     btif_hl_disable();
4563     btif_hl_close_select_thread();
4564 }
4565 
4566 static const bthl_interface_t bthlInterface = {
4567     sizeof(bthl_interface_t),
4568     init,
4569     register_application,
4570     unregister_application,
4571     connect_channel,
4572     destroy_channel,
4573     cleanup,
4574 };
4575 
4576 
4577 /*******************************************************************************
4578 **
4579 ** Function         btif_hl_get_interface
4580 **
4581 ** Description      Get the hl callback interface
4582 **
4583 ** Returns          bthf_interface_t
4584 **
4585 *******************************************************************************/
btif_hl_get_interface()4586 const bthl_interface_t *btif_hl_get_interface(){
4587     BTIF_TRACE_EVENT1("%s", __FUNCTION__);
4588     return &bthlInterface;
4589 }
4590 
4591 /*******************************************************************************
4592 **
4593 ** Function btif_hl_update_maxfd
4594 **
4595 ** Description Update the max fd if the input fd is greater than the current max fd
4596 **
4597 ** Returns int
4598 **
4599 *******************************************************************************/
btif_hl_update_maxfd(int max_org_s)4600 int btif_hl_update_maxfd( int max_org_s){
4601     btif_hl_soc_cb_t      *p_scb = NULL;
4602     int maxfd=0;
4603 
4604     BTIF_TRACE_DEBUG1("btif_hl_update_maxfd max_org_s= %d", max_org_s);
4605 
4606     maxfd = max_org_s;
4607     if (!GKI_queue_is_empty(&soc_queue))
4608     {
4609         p_scb = (btif_hl_soc_cb_t *)GKI_getfirst((void *)&soc_queue);
4610         if (maxfd < p_scb->max_s)
4611         {
4612             maxfd = p_scb->max_s;
4613             BTIF_TRACE_DEBUG1("btif_hl_update_maxfd 1 maxfd=%d", maxfd);
4614         }
4615         while (p_scb != NULL)
4616         {
4617             if (maxfd < p_scb->max_s)
4618             {
4619                 maxfd = p_scb->max_s;
4620                 BTIF_TRACE_DEBUG1("btif_hl_update_maxfd 2 maxfd=%d", maxfd);
4621             }
4622             p_scb = (btif_hl_soc_cb_t *)GKI_getnext((void *)p_scb );
4623         }
4624     }
4625 
4626     BTIF_TRACE_DEBUG1("btif_hl_update_maxfd final *p_max_s=%d", maxfd);
4627     return maxfd;
4628 }
4629 /*******************************************************************************
4630 **
4631 ** Function btif_hl_get_socket_state
4632 **
4633 ** Description get socket state
4634 **
4635 ** Returns btif_hl_soc_state_t
4636 **
4637 *******************************************************************************/
btif_hl_get_socket_state(btif_hl_soc_cb_t * p_scb)4638 btif_hl_soc_state_t btif_hl_get_socket_state(btif_hl_soc_cb_t *p_scb){
4639     BTIF_TRACE_DEBUG1("btif_hl_get_socket_state state=%d", p_scb->state);
4640     return p_scb->state;
4641 }
4642 /*******************************************************************************
4643 **
4644 ** Function btif_hl_set_socket_state
4645 **
4646 ** Description set socket state
4647 **
4648 ** Returns void
4649 **
4650 *******************************************************************************/
btif_hl_set_socket_state(btif_hl_soc_cb_t * p_scb,btif_hl_soc_state_t new_state)4651 void btif_hl_set_socket_state(btif_hl_soc_cb_t *p_scb, btif_hl_soc_state_t new_state){
4652     BTIF_TRACE_DEBUG2("btif_hl_set_socket_state %d---->%d", p_scb->state, new_state);
4653     p_scb->state = new_state;
4654 }
4655 /*******************************************************************************
4656 **
4657 ** Function btif_hl_release_mcl_sockets
4658 **
4659 ** Description Release all sockets on the MCL
4660 **
4661 ** Returns void
4662 **
4663 *******************************************************************************/
btif_hl_release_mcl_sockets(UINT8 app_idx,UINT8 mcl_idx)4664 void btif_hl_release_mcl_sockets(UINT8 app_idx, UINT8 mcl_idx){
4665     btif_hl_soc_cb_t    *p_scb = NULL;
4666     UINT8               i;
4667     btif_hl_mdl_cb_t    *p_dcb;
4668     BOOLEAN             found= FALSE;
4669     BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
4670     for (i=0; i < BTA_HL_NUM_MDLS_PER_MCL ; i ++)
4671     {
4672         p_dcb = BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, i);
4673         if (p_dcb && p_dcb->in_use && p_dcb->p_scb)
4674         {
4675             BTIF_TRACE_DEBUG3("found socket for app_idx=%d mcl_id=%d, mdl_idx=%d", app_idx, mcl_idx, i);
4676             btif_hl_set_socket_state (p_dcb->p_scb, BTIF_HL_SOC_STATE_W4_REL);
4677             p_dcb->p_scb = NULL;
4678             found = TRUE;
4679         }
4680     }
4681     if (found)
4682         btif_hl_select_close_connected();
4683 }
4684 /*******************************************************************************
4685 **
4686 ** Function btif_hl_release_socket
4687 **
4688 ** Description release a specified socket
4689 **
4690 ** Returns void
4691 **
4692 *******************************************************************************/
btif_hl_release_socket(UINT8 app_idx,UINT8 mcl_idx,UINT8 mdl_idx)4693 void btif_hl_release_socket(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx){
4694     btif_hl_soc_cb_t       *p_scb = NULL;
4695     btif_hl_mdl_cb_t      *p_dcb = BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
4696 
4697     BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
4698     BTIF_TRACE_DEBUG3("app_idx=%d mcl_idx=%d mdl_idx=%d",  app_idx, mcl_idx, mdl_idx  );
4699 
4700     if (p_dcb && p_dcb->p_scb)
4701     {
4702         p_scb = p_dcb->p_scb;
4703         btif_hl_set_socket_state(p_scb,  BTIF_HL_SOC_STATE_W4_REL);
4704         p_dcb->p_scb = NULL;
4705         btif_hl_select_close_connected();
4706     }
4707 }
4708 /*******************************************************************************
4709 **
4710 ** Function btif_hl_create_socket
4711 **
4712 ** Description create a socket
4713 **
4714 ** Returns BOOLEAN
4715 **
4716 *******************************************************************************/
btif_hl_create_socket(UINT8 app_idx,UINT8 mcl_idx,UINT8 mdl_idx)4717 BOOLEAN btif_hl_create_socket(UINT8 app_idx, UINT8 mcl_idx, UINT8 mdl_idx){
4718     btif_hl_mcl_cb_t      *p_mcb = BTIF_HL_GET_MCL_CB_PTR(app_idx, mcl_idx);
4719     btif_hl_mdl_cb_t      *p_dcb = BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
4720     btif_hl_soc_cb_t      *p_scb = NULL;
4721     UINT8                 soc_idx;
4722     BOOLEAN               status = FALSE;
4723 
4724     BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
4725 
4726     if (p_dcb && ((p_scb = (btif_hl_soc_cb_t *)GKI_getbuf((UINT16)sizeof(btif_hl_soc_cb_t)))!=NULL))
4727     {
4728         if (socketpair(AF_UNIX, SOCK_STREAM, 0, p_scb->socket_id) >= 0)
4729         {
4730             BTIF_TRACE_DEBUG2("socket id[0]=%d id[1]=%d",p_scb->socket_id[0], p_scb->socket_id[1] );
4731             p_dcb->p_scb = p_scb;
4732             p_scb->app_idx = app_idx;
4733             p_scb->mcl_idx = mcl_idx;
4734             p_scb->mdl_idx = mdl_idx;
4735             p_scb->channel_id = p_dcb->channel_id;
4736             p_scb->mdep_cfg_idx = p_dcb->local_mdep_cfg_idx;
4737             memcpy(p_scb->bd_addr, p_mcb->bd_addr,sizeof(BD_ADDR));
4738             btif_hl_set_socket_state(p_scb,  BTIF_HL_SOC_STATE_W4_ADD);
4739             p_scb->max_s = p_scb->socket_id[1];
4740             GKI_enqueue(&soc_queue, (void *) p_scb);
4741             btif_hl_select_wakeup();
4742             status = TRUE;
4743         }
4744         else
4745         {
4746 
4747             btif_hl_free_buf((void **)&p_scb);
4748         }
4749     }
4750 
4751     BTIF_TRACE_DEBUG2("%s status=%d", __FUNCTION__, status);
4752     return status;
4753 }
4754 /*******************************************************************************
4755 **
4756 ** Function btif_hl_add_socket_to_set
4757 **
4758 ** Description Add a socket
4759 **
4760 ** Returns void
4761 **
4762 *******************************************************************************/
btif_hl_add_socket_to_set(fd_set * p_org_set)4763 void btif_hl_add_socket_to_set( fd_set *p_org_set){
4764     btif_hl_soc_cb_t                *p_scb = NULL;
4765     btif_hl_mdl_cb_t                *p_dcb = NULL;
4766     btif_hl_mcl_cb_t                *p_mcb = NULL;
4767     btif_hl_app_cb_t                *p_acb = NULL;
4768     btif_hl_evt_cb_t                evt_param;
4769     bt_status_t                     status;
4770     int                             len;
4771 
4772     BTIF_TRACE_DEBUG1("entering %s",__FUNCTION__);
4773 
4774     if (!GKI_queue_is_empty(&soc_queue))
4775     {
4776         p_scb = (btif_hl_soc_cb_t *)GKI_getfirst((void *)&soc_queue);
4777         BTIF_TRACE_DEBUG1("btif_hl_add_socket_to_set first p_scb=0x%x", p_scb);
4778         while (p_scb != NULL)
4779         {
4780             if (btif_hl_get_socket_state(p_scb) == BTIF_HL_SOC_STATE_W4_ADD)
4781             {
4782                 btif_hl_set_socket_state(p_scb,   BTIF_HL_SOC_STATE_W4_READ);
4783                 FD_SET(p_scb->socket_id[1], p_org_set);
4784                 BTIF_TRACE_DEBUG2("found and set socket_id=%d is_set=%d", p_scb->socket_id[1], FD_ISSET(p_scb->socket_id[1], p_org_set));
4785                 p_mcb = BTIF_HL_GET_MCL_CB_PTR(p_scb->app_idx, p_scb->mcl_idx);
4786                 p_dcb = BTIF_HL_GET_MDL_CB_PTR(p_scb->app_idx, p_scb->mcl_idx, p_scb->mdl_idx);
4787                 p_acb = BTIF_HL_GET_APP_CB_PTR(p_scb->app_idx);
4788                 if (p_mcb && p_dcb)
4789                 {
4790                     btif_hl_stop_timer_using_handle(p_mcb->mcl_handle);
4791                     evt_param.chan_cb.app_id = p_acb->app_id;
4792                     memcpy(evt_param.chan_cb.bd_addr, p_mcb->bd_addr, sizeof(BD_ADDR));
4793                     evt_param.chan_cb.channel_id = p_dcb->channel_id;
4794                     evt_param.chan_cb.fd = p_scb->socket_id[0];
4795                     evt_param.chan_cb.mdep_cfg_index = (int ) p_dcb->local_mdep_cfg_idx;
4796                     evt_param.chan_cb.cb_state = BTIF_HL_CHAN_CB_STATE_CONNECTED_PENDING;
4797                     len = sizeof(btif_hl_send_chan_state_cb_t);
4798                     status = btif_transfer_context (btif_hl_proc_cb_evt, BTIF_HL_SEND_CONNECTED_CB,
4799                                                     (char*) &evt_param, len, NULL);
4800                     ASSERTC(status == BT_STATUS_SUCCESS, "context transfer failed", status);
4801                 }
4802             }
4803             p_scb = (btif_hl_soc_cb_t *)GKI_getnext((void *)p_scb );
4804             BTIF_TRACE_DEBUG1("next p_scb=0x%x", p_scb);
4805         }
4806     }
4807 
4808     BTIF_TRACE_DEBUG1("leaving %s",__FUNCTION__);
4809 }
4810 /*******************************************************************************
4811 **
4812 ** Function btif_hl_close_socket
4813 **
4814 ** Description close a socket
4815 **
4816 ** Returns void
4817 **
4818 *******************************************************************************/
btif_hl_close_socket(fd_set * p_org_set)4819 void btif_hl_close_socket( fd_set *p_org_set){
4820     btif_hl_soc_cb_t                *p_scb = NULL;
4821     BOOLEAN                         element_removed = FALSE;
4822     btif_hl_mdl_cb_t                *p_dcb = NULL ;
4823     btif_hl_app_cb_t                *p_acb = NULL ;
4824     btif_hl_evt_cb_t                evt_param;
4825     int                             len;
4826     int                             app_idx;
4827     bt_status_t                     status;
4828 
4829     BTIF_TRACE_DEBUG1("entering %s",__FUNCTION__);
4830     if (!GKI_queue_is_empty(&soc_queue))
4831     {
4832         p_scb = (btif_hl_soc_cb_t *)GKI_getfirst((void *)&soc_queue);
4833         while (p_scb != NULL)
4834         {
4835             if (btif_hl_get_socket_state(p_scb) == BTIF_HL_SOC_STATE_W4_REL)
4836             {
4837                 BTIF_TRACE_DEBUG3("app_idx=%d mcl_id=%d, mdl_idx=%d",
4838                                   p_scb->app_idx, p_scb->mcl_idx, p_scb->mdl_idx);
4839                 btif_hl_set_socket_state(p_scb,   BTIF_HL_SOC_STATE_IDLE);
4840                 if (p_scb->socket_id[1] != -1)
4841                 {
4842                     FD_CLR(p_scb->socket_id[1] , p_org_set);
4843                     shutdown(p_scb->socket_id[1], SHUT_RDWR);
4844                     close(p_scb->socket_id[1]);
4845 
4846                     evt_param.chan_cb.app_id = (int) btif_hl_get_app_id(p_scb->channel_id);
4847                     memcpy(evt_param.chan_cb.bd_addr, p_scb->bd_addr, sizeof(BD_ADDR));
4848                     evt_param.chan_cb.channel_id = p_scb->channel_id;
4849                     evt_param.chan_cb.fd = p_scb->socket_id[0];
4850                     evt_param.chan_cb.mdep_cfg_index = (int ) p_scb->mdep_cfg_idx;
4851                     evt_param.chan_cb.cb_state = BTIF_HL_CHAN_CB_STATE_DISCONNECTED_PENDING;
4852                     len = sizeof(btif_hl_send_chan_state_cb_t);
4853                     status = btif_transfer_context (btif_hl_proc_cb_evt, BTIF_HL_SEND_DISCONNECTED_CB,
4854                                                     (char*) &evt_param, len, NULL);
4855                     ASSERTC(status == BT_STATUS_SUCCESS, "context transfer failed", status);
4856 
4857 
4858                 }
4859             }
4860             p_scb = (btif_hl_soc_cb_t *)GKI_getnext((void *)p_scb );
4861             BTIF_TRACE_DEBUG1("while loop next p_scb=0x%x", p_scb);
4862         }
4863 
4864         p_scb = (btif_hl_soc_cb_t *)GKI_getfirst((void *)&soc_queue);
4865         while (p_scb != NULL)
4866         {
4867             if (btif_hl_get_socket_state(p_scb) == BTIF_HL_SOC_STATE_IDLE)
4868             {
4869                 p_dcb = BTIF_HL_GET_MDL_CB_PTR(p_scb->app_idx, p_scb->mcl_idx, p_scb->mdl_idx);
4870                 BTIF_TRACE_DEBUG4("idle socket app_idx=%d mcl_id=%d, mdl_idx=%d p_dcb->in_use=%d",
4871                                   p_scb->app_idx, p_scb->mcl_idx, p_scb->mdl_idx, p_dcb->in_use);
4872                 GKI_remove_from_queue((void *)&soc_queue, p_scb);
4873                 btif_hl_free_buf((void **)&p_scb);
4874                 p_dcb->p_scb = NULL;
4875                 element_removed = TRUE;
4876             }
4877             BTIF_TRACE_DEBUG2("element_removed=%d p_scb=0x%x", element_removed, p_scb);
4878             if (element_removed)
4879             {
4880                 element_removed = FALSE;
4881                 p_scb = (btif_hl_soc_cb_t *)GKI_getfirst((void *)&soc_queue);
4882             }
4883             else
4884                 p_scb = (btif_hl_soc_cb_t *)GKI_getnext((void *)p_scb );
4885 
4886             BTIF_TRACE_DEBUG1("while loop p_scb=0x%x", p_scb);
4887         }
4888     }
4889     BTIF_TRACE_DEBUG1("leaving %s",__FUNCTION__);
4890 }
4891 /*******************************************************************************
4892 **
4893 ** Function btif_hl_select_wakeup_callback
4894 **
4895 ** Description Select wakup callback to add or close a socket
4896 **
4897 ** Returns void
4898 **
4899 *******************************************************************************/
4900 
btif_hl_select_wakeup_callback(fd_set * p_org_set,int wakeup_signal)4901 void btif_hl_select_wakeup_callback( fd_set *p_org_set ,  int wakeup_signal){
4902     BTIF_TRACE_DEBUG2("entering %s wakeup_signal=0x%04x",__FUNCTION__, wakeup_signal);
4903 
4904     if (wakeup_signal == btif_hl_signal_select_wakeup )
4905     {
4906         btif_hl_add_socket_to_set(p_org_set);
4907     }
4908     else if (wakeup_signal == btif_hl_signal_select_close_connected)
4909     {
4910         btif_hl_close_socket(p_org_set);
4911     }
4912     BTIF_TRACE_DEBUG1("leaving %s",__FUNCTION__);
4913 }
4914 
4915 /*******************************************************************************
4916 **
4917 ** Function btif_hl_select_monitor_callback
4918 **
4919 ** Description Select monitor callback to check pending socket actions
4920 **
4921 ** Returns void
4922 **
4923 *******************************************************************************/
btif_hl_select_monitor_callback(fd_set * p_cur_set,fd_set * p_org_set)4924 void btif_hl_select_monitor_callback( fd_set *p_cur_set , fd_set *p_org_set){
4925     btif_hl_soc_cb_t      *p_scb = NULL;
4926     btif_hl_mdl_cb_t      *p_dcb = NULL;
4927     int r;
4928 
4929     BTIF_TRACE_DEBUG1("entering %s",__FUNCTION__);
4930 
4931     if (!GKI_queue_is_empty(&soc_queue))
4932     {
4933         p_scb = (btif_hl_soc_cb_t *)GKI_getfirst((void *)&soc_queue);
4934         BTIF_TRACE_DEBUG0(" GKI queue is not empty ");
4935         while (p_scb != NULL)
4936         {
4937             if (btif_hl_get_socket_state(p_scb) == BTIF_HL_SOC_STATE_W4_READ)
4938             {
4939                 if (FD_ISSET(p_scb->socket_id[1], p_cur_set))
4940                 {
4941                     BTIF_TRACE_DEBUG0("read data");
4942                     BTIF_TRACE_DEBUG0("state= BTIF_HL_SOC_STATE_W4_READ");
4943                     p_dcb = BTIF_HL_GET_MDL_CB_PTR(p_scb->app_idx, p_scb->mcl_idx, p_scb->mdl_idx);
4944                     if (p_dcb->p_tx_pkt)
4945                     {
4946                         BTIF_TRACE_ERROR1("Rcv new pkt but the last pkt is still not been sent tx_size=%d", p_dcb->tx_size);
4947                         btif_hl_free_buf((void **) &p_dcb->p_tx_pkt);
4948                     }
4949                     p_dcb->p_tx_pkt =  btif_hl_get_buf (p_dcb->mtu);
4950                     if (p_dcb )
4951                     {
4952                         //do
4953                         // {
4954                         //     r = recv(p_scb->socket_id[1], p_dcb->p_tx_pkt, p_dcb->mtu , MSG_DONTWAIT));
4955                         // } while (r == SOCKET_ERROR && errno == EINTR);
4956 
4957                         if ((r = (int)recv(p_scb->socket_id[1], p_dcb->p_tx_pkt, p_dcb->mtu , MSG_DONTWAIT)) > 0)
4958                         {
4959                             BTIF_TRACE_DEBUG1("btif_hl_select_monitor_callback send data r =%d", r);
4960                             p_dcb->tx_size = r;
4961                             BTIF_TRACE_DEBUG1("btif_hl_select_monitor_callback send data tx_size=%d", p_dcb->tx_size );
4962                             BTA_HlSendData(p_dcb->mdl_handle, p_dcb->tx_size  );
4963                         }
4964 
4965                         if (r <= 0 )
4966                         {
4967                             BTIF_TRACE_DEBUG1("btif_hl_select_monitor_callback  receive failed r=%d",r);
4968                             BTA_HlDchClose(p_dcb->mdl_handle );
4969                         }
4970                     }
4971                 }
4972             }
4973             p_scb = (btif_hl_soc_cb_t *)GKI_getnext((void *)p_scb );
4974         }
4975     }
4976     else
4977     {
4978         BTIF_TRACE_DEBUG0("btif_hl_select_monitor_queue is empty");
4979     }
4980     BTIF_TRACE_DEBUG1("leaving %s",__FUNCTION__);
4981 }
4982 /*******************************************************************************
4983 **
4984 ** Function btif_hl_select_wakeup_init
4985 **
4986 ** Description select loop wakup init
4987 **
4988 ** Returns int
4989 **
4990 *******************************************************************************/
btif_hl_select_wakeup_init(fd_set * set)4991 static inline int btif_hl_select_wakeup_init(fd_set* set){
4992     BTIF_TRACE_DEBUG0("btif_hl_select_wakeup_init");
4993     if (socketpair(AF_UNIX, SOCK_STREAM, 0, signal_fds) < 0)
4994     {
4995         BTIF_TRACE_ERROR1("socketpair failed: %s", strerror(errno));
4996         return -1;
4997     }
4998 
4999     BTIF_TRACE_DEBUG2("btif_hl_select_wakeup_init signal_fds[0]=%d signal_fds[1]=%d",signal_fds[0], signal_fds[1] );
5000     FD_SET(signal_fds[0], set);
5001 
5002     return signal_fds[0];
5003 }
5004 
5005 /*******************************************************************************
5006 **
5007 ** Function btif_hl_select_wakeup
5008 **
5009 ** Description send a signal to wakupo the select loop
5010 **
5011 ** Returns int
5012 **
5013 *******************************************************************************/
btif_hl_select_wakeup(void)5014 static inline int btif_hl_select_wakeup(void){
5015     char sig_on = btif_hl_signal_select_wakeup;
5016     BTIF_TRACE_DEBUG0("btif_hl_select_wakeup");
5017     return send(signal_fds[1], &sig_on, sizeof(sig_on), 0);
5018 }
5019 
5020 /*******************************************************************************
5021 **
5022 ** Function btif_hl_select_close_connected
5023 **
5024 ** Description send a signal to close a socket
5025 **
5026 ** Returns int
5027 **
5028 *******************************************************************************/
btif_hl_select_close_connected(void)5029 static inline int btif_hl_select_close_connected(void){
5030     char sig_on = btif_hl_signal_select_close_connected;
5031     BTIF_TRACE_DEBUG0("btif_hl_select_close_connected");
5032     return send(signal_fds[1], &sig_on, sizeof(sig_on), 0);
5033 }
5034 
5035 /*******************************************************************************
5036 **
5037 ** Function btif_hl_close_select_thread
5038 **
5039 ** Description send signal to close the thread and then close all signal FDs
5040 **
5041 ** Returns int
5042 **
5043 *******************************************************************************/
btif_hl_close_select_thread(void)5044 static inline int btif_hl_close_select_thread(void)
5045 {
5046     int result = 0;
5047     char sig_on = btif_hl_signal_select_exit;
5048     BTIF_TRACE_DEBUG0("btif_hl_signal_select_exit");
5049     result = send(signal_fds[1], &sig_on, sizeof(sig_on), 0);
5050     /* Wait for the select_thread_id to exit */
5051     if (select_thread_id != -1) {
5052         pthread_join(select_thread_id, NULL);
5053         select_thread_id = -1;
5054     }
5055    /* Cleanup signal sockets */
5056     if(signal_fds[0] != -1)
5057     {
5058         close(signal_fds[0]);
5059         signal_fds[0] = -1;
5060     }
5061     if(signal_fds[1] != -1)
5062     {
5063         close(signal_fds[1]);
5064         signal_fds[1] = -1;
5065     }
5066     return result;
5067 }
5068 
5069 /*******************************************************************************
5070 **
5071 ** Function btif_hl_select_wake_reset
5072 **
5073 ** Description clear the received signal for the select loop
5074 **
5075 ** Returns int
5076 **
5077 *******************************************************************************/
btif_hl_select_wake_reset(void)5078 static inline int btif_hl_select_wake_reset(void){
5079     char sig_recv = 0;
5080 
5081     BTIF_TRACE_DEBUG0("btif_hl_select_wake_reset");
5082     recv(signal_fds[0], &sig_recv, sizeof(sig_recv), MSG_WAITALL);
5083     return(int)sig_recv;
5084 }
5085 /*******************************************************************************
5086 **
5087 ** Function btif_hl_select_wake_signaled
5088 **
5089 ** Description check whether a fd is set or not
5090 **
5091 ** Returns int
5092 **
5093 *******************************************************************************/
btif_hl_select_wake_signaled(fd_set * set)5094 static inline int btif_hl_select_wake_signaled(fd_set* set){
5095     BTIF_TRACE_DEBUG0("btif_hl_select_wake_signaled");
5096     return FD_ISSET(signal_fds[0], set);
5097 }
5098 /*******************************************************************************
5099 **
5100 ** Function btif_hl_thread_cleanup
5101 **
5102 ** Description  shut down and clean up the select loop
5103 **
5104 ** Returns void
5105 **
5106 *******************************************************************************/
btif_hl_thread_cleanup()5107 static void btif_hl_thread_cleanup(){
5108     if (listen_s != -1)
5109         close(listen_s);
5110     if (connected_s != -1)
5111     {
5112         shutdown(connected_s, SHUT_RDWR);
5113         close(connected_s);
5114     }
5115     listen_s = connected_s = -1;
5116     BTIF_TRACE_DEBUG0("hl thread cleanup");
5117 }
5118 /*******************************************************************************
5119 **
5120 ** Function btif_hl_select_thread
5121 **
5122 ** Description the select loop
5123 **
5124 ** Returns void
5125 **
5126 *******************************************************************************/
btif_hl_select_thread(void * arg)5127 static void *btif_hl_select_thread(void *arg){
5128     fd_set org_set, curr_set;
5129     int r, max_curr_s, max_org_s;
5130 
5131     BTIF_TRACE_DEBUG0("entered btif_hl_select_thread");
5132     FD_ZERO(&org_set);
5133     max_org_s = btif_hl_select_wakeup_init(&org_set);
5134     BTIF_TRACE_DEBUG1("max_s=%d ", max_org_s);
5135 
5136     for (;;)
5137     {
5138         r = 0;
5139         BTIF_TRACE_DEBUG0("set curr_set = org_set ");
5140         curr_set = org_set;
5141         max_curr_s = max_org_s;
5142         int ret = select((max_curr_s + 1), &curr_set, NULL, NULL, NULL);
5143         BTIF_TRACE_DEBUG1("select unblocked ret=%d", ret);
5144         if (ret == -1)
5145         {
5146             BTIF_TRACE_DEBUG0("select() ret -1, exit the thread");
5147             btif_hl_thread_cleanup();
5148             select_thread_id = -1;
5149             return 0;
5150         }
5151         else if (ret)
5152         {
5153             BTIF_TRACE_DEBUG1("btif_hl_select_wake_signaled, signal ret=%d", ret);
5154             if (btif_hl_select_wake_signaled(&curr_set))
5155             {
5156                 r = btif_hl_select_wake_reset();
5157                 BTIF_TRACE_DEBUG1("btif_hl_select_wake_signaled, signal:%d", r);
5158                 if (r == btif_hl_signal_select_wakeup || r == btif_hl_signal_select_close_connected )
5159                 {
5160                     btif_hl_select_wakeup_callback(&org_set, r);
5161                 }
5162                 else if( r == btif_hl_signal_select_exit)
5163                 {
5164                     btif_hl_thread_cleanup();
5165                     BTIF_TRACE_DEBUG0("Exit hl_select_thread for btif_hl_signal_select_exit");
5166                     return 0;
5167                 }
5168             }
5169 
5170             btif_hl_select_monitor_callback(&curr_set, &org_set);
5171             max_org_s = btif_hl_update_maxfd(max_org_s);
5172         }
5173         else
5174             BTIF_TRACE_DEBUG1("no data, select ret: %d\n", ret);
5175     }
5176     BTIF_TRACE_DEBUG0("leaving hl_select_thread");
5177     return 0;
5178 }
5179 
5180 /*******************************************************************************
5181 **
5182 ** Function create_thread
5183 **
5184 ** Description creat a select loop
5185 **
5186 ** Returns pthread_t
5187 **
5188 *******************************************************************************/
create_thread(void * (* start_routine)(void *),void * arg)5189 static inline pthread_t create_thread(void *(*start_routine)(void *), void * arg){
5190     BTIF_TRACE_DEBUG0("create_thread: entered");
5191     pthread_attr_t thread_attr;
5192 
5193     pthread_attr_init(&thread_attr);
5194     pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_JOINABLE);
5195     pthread_t thread_id = -1;
5196     if ( pthread_create(&thread_id, &thread_attr, start_routine, arg)!=0 )
5197     {
5198         BTIF_TRACE_ERROR1("pthread_create : %s", strerror(errno));
5199         return -1;
5200     }
5201     BTIF_TRACE_DEBUG0("create_thread: thread created successfully");
5202     return thread_id;
5203 }
5204 
5205 /*******************************************************************************
5206 **
5207 ** Function         btif_hl_soc_thread_init
5208 **
5209 ** Description      HL select loop init function.
5210 **
5211 ** Returns          void
5212 **
5213 *******************************************************************************/
btif_hl_soc_thread_init(void)5214 void btif_hl_soc_thread_init(void){
5215     BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
5216     GKI_init_q(&soc_queue);
5217     select_thread_id = create_thread(btif_hl_select_thread, NULL);
5218 }
5219 /*******************************************************************************
5220 **
5221 ** Function btif_hl_load_mdl_config
5222 **
5223 ** Description load the MDL configuation from the application control block
5224 **
5225 ** Returns BOOLEAN
5226 **
5227 *******************************************************************************/
btif_hl_load_mdl_config(UINT8 app_id,UINT8 buffer_size,tBTA_HL_MDL_CFG * p_mdl_buf)5228 BOOLEAN btif_hl_load_mdl_config (UINT8 app_id, UINT8 buffer_size,
5229                                  tBTA_HL_MDL_CFG *p_mdl_buf ){
5230     UINT8 app_idx;
5231     BOOLEAN result = FALSE;
5232     btif_hl_app_cb_t          *p_acb;
5233     tBTA_HL_MDL_CFG *p;
5234     int i;
5235     BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
5236 
5237     if (btif_hl_find_app_idx(app_id, &app_idx))
5238     {
5239         p_acb  = BTIF_HL_GET_APP_CB_PTR(app_idx);
5240         for (i=0, p=p_mdl_buf; i<buffer_size; i++, p++)
5241         {
5242             memcpy(p, &p_acb->mdl_cfg[i].base, sizeof(tBTA_HL_MDL_CFG));
5243         }
5244         result = TRUE;
5245     }
5246 
5247     BTIF_TRACE_DEBUG1("result=%d", result);
5248     return result;
5249 }
5250