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