• 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  *  This is the implementation file for the HeaLth device profile (HL)
22  *  subsystem call-out functions.
23  *
24  ******************************************************************************/
25 
26 #include <stdio.h>
27 #include <stdlib.h>
28 #include <errno.h>
29 #include <string.h>
30 #include <sys/types.h>
31 #include <sys/socket.h>
32 #include <sys/un.h>
33 #include <time.h>
34 #include <fcntl.h>
35 #include <ctype.h>
36 #include <cutils/sockets.h>
37 #include <unistd.h>
38 #include "bta_api.h"
39 #include "btm_api.h"
40 #include "bta_sys.h"
41 #include "bta_hl_api.h"
42 #include "bta_hl_co.h"
43 #include "bta_hl_ci.h"
44 #include "btif_hl.h"
45 #include "btif_util.h"
46 
47 
48 /*****************************************************************************
49 **  Constants and Data Types
50 *****************************************************************************/
51 /**************************
52 **  Common Definitions
53 ***************************/
54 
55 
56 
57 
58 /*******************************************************************************
59 **
60 ** Function        bta_hl_co_get_num_of_mdep
61 **
62 ** Description     This function is called to get the number of MDEPs for this
63 **                 application ID
64 **
65 ** Parameters      app_id - application ID
66 **                 p_num_of_mdep (output) - number of MDEP configurations supported
67 **                                          by the application
68 **
69 ** Returns         Bloolean - TRUE success
70 **
71 *******************************************************************************/
bta_hl_co_get_num_of_mdep(UINT8 app_id,UINT8 * p_num_of_mdep)72 BOOLEAN bta_hl_co_get_num_of_mdep(UINT8 app_id, UINT8 *p_num_of_mdep)
73 {
74     UINT8 app_idx;
75     BOOLEAN success = FALSE;
76 
77     if (btif_hl_find_app_idx(app_id, &app_idx))
78     {
79         *p_num_of_mdep = p_btif_hl_cb->acb[app_idx].sup_feature.num_of_mdeps;
80         success = TRUE;
81     }
82 
83 
84     BTIF_TRACE_DEBUG("%s success=%d num_mdeps=%d",
85                       __FUNCTION__, success, *p_num_of_mdep );
86     return success;
87 }
88 
89 /*******************************************************************************
90 **
91 ** Function        bta_hl_co_advrtise_source_sdp
92 **
93 ** Description     This function is called to find out whether the SOURCE MDEP
94 **                 configuration information should be advertize in the SDP or nopt
95 **
96 ** Parameters      app_id - application ID
97 **
98 ** Returns         Bloolean - TRUE advertise the SOURCE MDEP configuration
99 **                            information
100 **
101 *******************************************************************************/
bta_hl_co_advrtise_source_sdp(UINT8 app_id)102 BOOLEAN bta_hl_co_advrtise_source_sdp(UINT8 app_id)
103 {
104     BOOLEAN     advertize_source_sdp=FALSE;
105     UINT8       app_idx;
106 
107     if (btif_hl_find_app_idx(app_id, &app_idx))
108     {
109         advertize_source_sdp = p_btif_hl_cb->acb[app_idx].sup_feature.advertize_source_sdp;
110     }
111 
112 
113     BTIF_TRACE_DEBUG("%s advertize_flag=%d", __FUNCTION__, advertize_source_sdp );
114 
115     return advertize_source_sdp;
116 }
117 /*******************************************************************************
118 **
119 ** Function        bta_hl_co_get_mdep_config
120 **
121 ** Description     This function is called to get the supported feature
122 **                 configuration for the specified mdep index and it also assigns
123 **                 the MDEP ID for the specified mdep index
124 **
125 ** Parameters      app_id - HDP application ID
126 **                 mdep_idx - the mdep index
127 **                  mdep_counter - number of mdeps
128 **                 mdep_id  - the assigned MDEP ID for the specified medp_idx
129 **                 p_mdl_cfg (output) - pointer to the MDEP configuration
130 **
131 **
132 ** Returns         Bloolean - TRUE success
133 *******************************************************************************/
bta_hl_co_get_mdep_config(UINT8 app_id,UINT8 mdep_idx,UINT8 mdep_counter,tBTA_HL_MDEP_ID mdep_id,tBTA_HL_MDEP_CFG * p_mdep_cfg)134 BOOLEAN bta_hl_co_get_mdep_config(UINT8  app_id,
135                                   UINT8 mdep_idx,
136                                   UINT8 mdep_counter,
137                                   tBTA_HL_MDEP_ID mdep_id,
138                                   tBTA_HL_MDEP_CFG *p_mdep_cfg)
139 {
140     UINT8       idx  ;
141     UINT8       app_idx;
142     BOOLEAN     success = FALSE;
143 
144     BTIF_TRACE_DEBUG("%s app_id=%d mdep_idx=%d mdep_id=%d mdep_counter=%d",
145                       __FUNCTION__, app_id,mdep_idx,mdep_id,mdep_counter);
146 
147     if (btif_hl_find_app_idx(app_id, &app_idx))
148     {
149         idx = mdep_idx -mdep_counter-1;
150         p_btif_hl_cb->acb[app_idx].sup_feature.mdep[idx].mdep_id = mdep_id;
151         memcpy(p_mdep_cfg,
152                &p_btif_hl_cb->acb[app_idx].sup_feature.mdep[idx].mdep_cfg,
153                sizeof(tBTA_HL_MDEP_CFG));
154 
155         success = TRUE;
156     }
157 
158     BTIF_TRACE_DEBUG("%s success=%d mdep_idx=%d mdep_id=%d",
159                       __FUNCTION__, success, mdep_idx, mdep_id );
160 
161     return success;
162 }
163 
164 
165 /*******************************************************************************
166 **
167 ** Function        bta_hl_co_get_echo_config
168 **
169 ** Description     This function is called to get the echo test
170 **                 maximum APDU size configurations
171 **
172 ** Parameters      app_id - HDP application ID
173 **                 p_echo_cfg (output) - pointer to the Echo test maximum APDU size
174 **                                       configuration
175 **
176 ** Returns         Bloolean - TRUE success
177 *******************************************************************************/
bta_hl_co_get_echo_config(UINT8 app_id,tBTA_HL_ECHO_CFG * p_echo_cfg)178 BOOLEAN bta_hl_co_get_echo_config(UINT8  app_id,
179                                   tBTA_HL_ECHO_CFG *p_echo_cfg)
180 {
181     UINT8               app_idx;
182     BOOLEAN             success = FALSE;
183     btif_hl_app_cb_t    *p_acb;
184     tBTA_HL_SUP_FEATURE *p_sup;
185 
186     BTIF_TRACE_DEBUG("%s app_id=%d",__FUNCTION__, app_id );
187 
188     if (btif_hl_find_app_idx(app_id, &app_idx))
189     {
190         p_acb = BTIF_HL_GET_APP_CB_PTR(app_idx);
191         p_sup = &p_acb->sup_feature;
192         p_echo_cfg->max_rx_apdu_size = p_sup->echo_cfg.max_rx_apdu_size;
193         p_echo_cfg->max_tx_apdu_size = p_sup->echo_cfg.max_tx_apdu_size;
194         success = TRUE;
195     }
196 
197     BTIF_TRACE_DEBUG("%s success=%d max tx_size=%d rx_size=%d",
198                       __FUNCTION__, success, p_echo_cfg->max_tx_apdu_size,
199                       p_echo_cfg->max_rx_apdu_size );
200 
201     return success;
202 }
203 
204 
205 /*******************************************************************************
206 **
207 ** Function        bta_hl_co_save_mdl
208 **
209 ** Description     This function is called to save a MDL configuration item in persistent
210 **                 storage
211 **
212 ** Parameters      app_id - HDP application ID
213 **                 item_idx - the MDL configuration storage index
214 **                 p_mdl_cfg - pointer to the MDL configuration data
215 **
216 ** Returns        void
217 **
218 *******************************************************************************/
bta_hl_co_save_mdl(UINT8 mdep_id,UINT8 item_idx,tBTA_HL_MDL_CFG * p_mdl_cfg)219 void bta_hl_co_save_mdl(UINT8 mdep_id, UINT8 item_idx, tBTA_HL_MDL_CFG *p_mdl_cfg )
220 {
221 
222     BTIF_TRACE_DEBUG("%s mdep_id =%d, item_idx=%d active=%d mdl_id=%d time=%d",
223                       __FUNCTION__, mdep_id, item_idx,
224                       p_mdl_cfg->active,
225                       p_mdl_cfg->mdl_id,
226                       p_mdl_cfg->time);
227 
228     btif_hl_save_mdl_cfg(mdep_id, item_idx, p_mdl_cfg);
229 
230 }
231 
232 /*******************************************************************************
233 **
234 ** Function        bta_hl_co_delete_mdl
235 **
236 ** Description     This function is called to delete a MDL configuration item in persistent
237 **                 storage
238 **
239 ** Parameters      app_id - HDP application ID
240 **                 item_idx - the MDL configuration storage index
241 **
242 ** Returns          void
243 **
244 *******************************************************************************/
bta_hl_co_delete_mdl(UINT8 mdep_id,UINT8 item_idx)245 void bta_hl_co_delete_mdl(UINT8 mdep_id, UINT8 item_idx)
246 {
247 
248 
249     BTIF_TRACE_DEBUG("%s mdep_id=%d, item_idx=%d", __FUNCTION__, mdep_id, item_idx);
250 
251     btif_hl_delete_mdl_cfg(mdep_id, item_idx);
252 
253 
254 }
255 
256 /*******************************************************************************
257 **
258 ** Function         bta_hl_co_get_mdl_config
259 **
260 ** Description     This function is called to get the MDL configuration
261 **                 from the persistent memory. This function shall only be called
262 *8                 once after the device is powered up
263 **
264 ** Parameters      app_id - HDP application ID
265 **                 buffer_size - the unit of the buffer size is sizeof(tBTA_HL_MDL_CFG)
266 **                 p_mdl_buf - Point to the starting location of the buffer
267 **
268 ** Returns         BOOLEAN
269 **
270 **
271 *******************************************************************************/
bta_hl_co_load_mdl_config(UINT8 app_id,UINT8 buffer_size,tBTA_HL_MDL_CFG * p_mdl_buf)272 BOOLEAN bta_hl_co_load_mdl_config (UINT8 app_id, UINT8 buffer_size,
273                                    tBTA_HL_MDL_CFG *p_mdl_buf )
274 {
275     BOOLEAN result = TRUE;
276     UINT8 i;
277     tBTA_HL_MDL_CFG *p;
278 
279     BTIF_TRACE_DEBUG("%s app_id=%d, num_items=%d",
280                       __FUNCTION__, app_id, buffer_size);
281 
282     if (buffer_size > BTA_HL_NUM_MDL_CFGS)
283     {
284         result = FALSE;
285         return result;
286     }
287     result = btif_hl_load_mdl_config(app_id, buffer_size, p_mdl_buf);
288 
289     if (result)
290     {
291         for (i=0, p=p_mdl_buf; i<buffer_size; i++, p++ )
292         {
293             if (p->active)
294             {
295                 BTIF_TRACE_DEBUG("i=%d mdl_id=0x%x dch_mode=%d local mdep_role=%d mdep_id=%d mtu=%d",
296                                   i, p->mdl_id, p->dch_mode, p->local_mdep_role, p->local_mdep_role, p->mtu);
297             }
298         }
299     }
300 
301     BTIF_TRACE_DEBUG("%s success=%d num_items=%d", __FUNCTION__, result, buffer_size);
302 
303     return result;
304 }
305 
306 /*******************************************************************************
307 **
308 ** Function         bta_hl_co_get_tx_data
309 **
310 ** Description     Get the data to be sent
311 **
312 ** Parameters      app_id - HDP application ID
313 **                 mdl_handle - MDL handle
314 **                 buf_size - the size of the buffer
315 **                 p_buf - the buffer pointer
316 **                 evt - the evt to be passed back to the HL in the
317 **                       bta_hl_ci_get_tx_data call-in function
318 **
319 ** Returns        Void
320 **
321 *******************************************************************************/
bta_hl_co_get_tx_data(UINT8 app_id,tBTA_HL_MDL_HANDLE mdl_handle,UINT16 buf_size,UINT8 * p_buf,UINT16 evt)322 void bta_hl_co_get_tx_data (UINT8 app_id, tBTA_HL_MDL_HANDLE mdl_handle,
323                             UINT16 buf_size, UINT8 *p_buf,  UINT16 evt)
324 {
325     UINT8 app_idx, mcl_idx, mdl_idx;
326     btif_hl_mdl_cb_t *p_dcb;
327     tBTA_HL_STATUS status = BTA_HL_STATUS_FAIL;
328 
329     BTIF_TRACE_DEBUG("%s app_id=%d mdl_handle=0x%x buf_size=%d",
330                       __FUNCTION__, app_id, mdl_handle, buf_size);
331 
332     if (btif_hl_find_mdl_idx_using_handle(mdl_handle, &app_idx, &mcl_idx, &mdl_idx))
333     {
334         p_dcb = BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
335 
336         if (p_dcb->tx_size <= buf_size )
337         {
338             memcpy(p_buf, p_dcb->p_tx_pkt, p_dcb->tx_size);
339             btif_hl_free_buf((void **) &p_dcb->p_tx_pkt);
340             p_dcb->tx_size = 0;
341             status = BTA_HL_STATUS_OK;
342         }
343     }
344 
345 
346     bta_hl_ci_get_tx_data(mdl_handle,  status, evt);
347 
348 }
349 
350 
351 /*******************************************************************************
352 **
353 ** Function        bta_hl_co_put_rx_data
354 **
355 ** Description     Put the received data
356 **
357 ** Parameters      app_id - HDP application ID
358 **                 mdl_handle - MDL handle
359 **                 data_size - the size of the data
360 **                 p_data - the data pointer
361 **                 evt - the evt to be passed back to the HL in the
362 **                       bta_hl_ci_put_rx_data call-in function
363 **
364 ** Returns        Void
365 **
366 *******************************************************************************/
bta_hl_co_put_rx_data(UINT8 app_id,tBTA_HL_MDL_HANDLE mdl_handle,UINT16 data_size,UINT8 * p_data,UINT16 evt)367 void bta_hl_co_put_rx_data (UINT8 app_id, tBTA_HL_MDL_HANDLE mdl_handle,
368                             UINT16 data_size, UINT8 *p_data, UINT16 evt)
369 {
370     UINT8 app_idx, mcl_idx, mdl_idx;
371     btif_hl_mdl_cb_t *p_dcb;
372     tBTA_HL_STATUS status = BTA_HL_STATUS_FAIL;
373     int            r;
374     BTIF_TRACE_DEBUG("%s app_id=%d mdl_handle=0x%x data_size=%d",
375                       __FUNCTION__,app_id, mdl_handle, data_size);
376 
377     if (btif_hl_find_mdl_idx_using_handle(mdl_handle, &app_idx, &mcl_idx, &mdl_idx))
378     {
379         p_dcb = BTIF_HL_GET_MDL_CB_PTR(app_idx, mcl_idx, mdl_idx);
380 
381         if ((p_dcb->p_rx_pkt = (UINT8 *)btif_hl_get_buf(data_size)) != NULL)
382         {
383             memcpy(p_dcb->p_rx_pkt, p_data, data_size);
384             if (p_dcb->p_scb)
385             {
386                 BTIF_TRACE_DEBUG("app_idx=%d mcl_idx=0x%x mdl_idx=0x%x data_size=%d",
387                                   app_idx, mcl_idx, mdl_idx, data_size);
388                 r = TEMP_FAILURE_RETRY(send(p_dcb->p_scb->socket_id[1], p_dcb->p_rx_pkt, data_size, 0));
389 
390                 if (r == data_size)
391                 {
392                     BTIF_TRACE_DEBUG("socket send success data_size=%d",  data_size);
393                     status = BTA_HL_STATUS_OK;
394                 }
395                 else
396                 {
397                     BTIF_TRACE_ERROR("socket send failed r=%d data_size=%d",r, data_size);
398                 }
399 
400 
401             }
402             btif_hl_free_buf((void **) &p_dcb->p_rx_pkt);
403         }
404     }
405 
406     bta_hl_ci_put_rx_data(mdl_handle,  status, evt);
407 }
408 
409 
410 /*******************************************************************************
411 **
412 ** Function         bta_hl_co_get_tx_data
413 **
414 ** Description     Get the Echo data to be sent
415 **
416 ** Parameters      app_id - HDP application ID
417 **                 mcl_handle - MCL handle
418 **                 buf_size - the size of the buffer
419 **                 p_buf - the buffer pointer
420 **                 evt - the evt to be passed back to the HL in the
421 **                       bta_hl_ci_get_tx_data call-in function
422 **
423 ** Returns        Void
424 **
425 *******************************************************************************/
bta_hl_co_get_echo_data(UINT8 app_id,tBTA_HL_MCL_HANDLE mcl_handle,UINT16 buf_size,UINT8 * p_buf,UINT16 evt)426 void bta_hl_co_get_echo_data (UINT8 app_id, tBTA_HL_MCL_HANDLE mcl_handle,
427                               UINT16 buf_size, UINT8 *p_buf,  UINT16 evt)
428 {
429     tBTA_HL_STATUS status = BTA_HL_STATUS_FAIL;
430     UNUSED(app_id);
431     UNUSED(buf_size);
432     UNUSED(p_buf);
433 
434     BTIF_TRACE_ERROR("%s not supported",__FUNCTION__);
435     bta_hl_ci_get_echo_data(mcl_handle,  status, evt);
436 }
437 
438 
439 /*******************************************************************************
440 **
441 ** Function        bta_hl_co_put_echo_data
442 **
443 ** Description     Put the received loopback echo data
444 **
445 ** Parameters      app_id - HDP application ID
446 **                 mcl_handle - MCL handle
447 **                 data_size - the size of the data
448 **                 p_data - the data pointer
449 **                 evt - the evt to be passed back to the HL in the
450 **                       bta_hl_ci_put_echo_data call-in function
451 **
452 ** Returns        Void
453 **
454 *******************************************************************************/
bta_hl_co_put_echo_data(UINT8 app_id,tBTA_HL_MCL_HANDLE mcl_handle,UINT16 data_size,UINT8 * p_data,UINT16 evt)455 void bta_hl_co_put_echo_data (UINT8 app_id, tBTA_HL_MCL_HANDLE mcl_handle,
456                               UINT16 data_size, UINT8 *p_data, UINT16 evt)
457 {
458     tBTA_HL_STATUS status = BTA_HL_STATUS_FAIL;
459     UNUSED(app_id);
460     UNUSED(data_size);
461     UNUSED(p_data);
462 
463     BTIF_TRACE_ERROR("%s not supported",__FUNCTION__);
464     bta_hl_ci_put_echo_data(mcl_handle,  status, evt);
465 }
466 
467