1 /******************************************************************************
2  *
3  *  Copyright 2003-2012 Broadcom Corporation
4  *
5  *  Licensed under the Apache License, Version 2.0 (the "License");
6  *  you may not use this file except in compliance with the License.
7  *  You may obtain a copy of the License at:
8  *
9  *  http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  *
17  ******************************************************************************/
18 
19 /******************************************************************************
20  *
21  *  Routes connection status callbacks from various sub systems to DM
22  *
23  ******************************************************************************/
24 
25 #include <cstdint>
26 
27 #include "bt_target.h"  // Must be first to define build configuration
28 
29 #include "bta/sys/bta_sys.h"
30 #include "bta/sys/bta_sys_int.h"
31 #include "main/shim/dumpsys.h"
32 #include "osi/include/log.h"
33 #include "osi/include/osi.h"  // UNUSED_ATTR
34 #include "stack/include/btm_api.h"
35 #include "types/hci_role.h"
36 #include "types/raw_address.h"
37 
38 /*******************************************************************************
39  *
40  * Function         bta_sys_rm_register
41  *
42  * Description      Called by BTA DM to register role management callbacks
43  *
44  *
45  * Returns          void
46  *
47  ******************************************************************************/
bta_sys_rm_register(tBTA_SYS_CONN_CBACK * p_cback)48 void bta_sys_rm_register(tBTA_SYS_CONN_CBACK* p_cback) {
49   bta_sys_cb.prm_cb = p_cback;
50 }
51 
52 /*******************************************************************************
53  *
54  * Function         bta_sys_role_chg_register
55  *
56  * Description      Called by BTA AV to register role change callbacks
57  *
58  *
59  * Returns          void
60  *
61  ******************************************************************************/
bta_sys_role_chg_register(tBTA_SYS_CONN_CBACK * p_cback)62 void bta_sys_role_chg_register(tBTA_SYS_CONN_CBACK* p_cback) {
63   bta_sys_cb.p_role_cb = p_cback;
64 }
65 /*******************************************************************************
66  *
67  * Function         bta_sys_ssr_cfg_register
68  *
69  * Description      Called by BTA DM to register SSR configuration callback
70  *
71  *
72  * Returns          void
73  *
74  ******************************************************************************/
bta_sys_ssr_cfg_register(tBTA_SYS_SSR_CFG_CBACK * p_cback)75 void bta_sys_ssr_cfg_register(tBTA_SYS_SSR_CFG_CBACK* p_cback) {
76   bta_sys_cb.p_ssr_cb = p_cback;
77 }
78 
79 /*******************************************************************************
80  *
81  * Function         bta_sys_role_chg_register
82  *
83  * Description      Called by BTA AV to register role change callbacks
84  *
85  *
86  * Returns          void
87  *
88  ******************************************************************************/
bta_sys_notify_role_chg(const RawAddress & peer_addr,tHCI_ROLE new_role,tHCI_STATUS hci_status)89 void bta_sys_notify_role_chg(const RawAddress& peer_addr, tHCI_ROLE new_role,
90                              tHCI_STATUS hci_status) {
91   LOG_DEBUG("Role changed peer:%s new_role:%s hci_status:%s",
92             PRIVATE_ADDRESS(peer_addr), RoleText(new_role).c_str(),
93             hci_error_code_text(hci_status).c_str());
94   if (bta_sys_cb.p_role_cb) {
95     bta_sys_cb.p_role_cb(BTA_SYS_ROLE_CHANGE, new_role, hci_status, peer_addr);
96   }
97 }
98 
99 /*******************************************************************************
100  *
101  * Function         bta_sys_collision_register
102  *
103  * Description      Called by any BTA module to register for collision event.
104  *
105  *
106  * Returns          void
107  *
108  ******************************************************************************/
bta_sys_collision_register(uint8_t bta_id,tBTA_SYS_CONN_CBACK * p_cback)109 void bta_sys_collision_register(uint8_t bta_id, tBTA_SYS_CONN_CBACK* p_cback) {
110   uint8_t index;
111 
112   for (index = 0; index < MAX_COLLISION_REG; index++) {
113     if ((bta_sys_cb.colli_reg.id[index] == bta_id) ||
114         (bta_sys_cb.colli_reg.id[index] == 0)) {
115       bta_sys_cb.colli_reg.id[index] = bta_id;
116       bta_sys_cb.colli_reg.p_coll_cback[index] = p_cback;
117       return;
118     }
119   }
120 }
121 
122 /*******************************************************************************
123  *
124  * Function         bta_sys_notify_collision
125  *
126  * Description      Called by BTA DM to notify collision event.
127  *
128  *
129  * Returns          void
130  *
131  ******************************************************************************/
bta_sys_notify_collision(const RawAddress & peer_addr)132 void bta_sys_notify_collision(const RawAddress& peer_addr) {
133   uint8_t index;
134 
135   for (index = 0; index < MAX_COLLISION_REG; index++) {
136     if ((bta_sys_cb.colli_reg.id[index] != 0) &&
137         (bta_sys_cb.colli_reg.p_coll_cback[index] != NULL)) {
138       bta_sys_cb.colli_reg.p_coll_cback[index](BTA_SYS_CONN_OPEN, BTA_ID_SYS, 0,
139                                                peer_addr);
140     }
141   }
142 }
143 
144 /*******************************************************************************
145  *
146  * Function         bta_sys_sco_register
147  *
148  * Description      Called by BTA AV to register sco connection change callbacks
149  *
150  *
151  * Returns          void
152  *
153  ******************************************************************************/
bta_sys_sco_register(tBTA_SYS_CONN_CBACK * p_cback)154 void bta_sys_sco_register(tBTA_SYS_CONN_CBACK* p_cback) {
155   bta_sys_cb.p_sco_cb = p_cback;
156 }
157 
158 /*******************************************************************************
159  *
160  * Function         bta_sys_pm_register
161  *
162  * Description      Called by BTA DM to register power management callbacks
163  *
164  *
165  * Returns          void
166  *
167  ******************************************************************************/
bta_sys_pm_register(tBTA_SYS_CONN_CBACK * p_cback)168 void bta_sys_pm_register(tBTA_SYS_CONN_CBACK* p_cback) {
169   bta_sys_cb.ppm_cb = p_cback;
170 }
171 
172 /*******************************************************************************
173  *
174  * Function         bta_sys_conn_open
175  *
176  * Description      Called by BTA subsystems when a connection is made to
177  *                  the service
178  *
179  *
180  * Returns          void
181  *
182  ******************************************************************************/
bta_sys_conn_open(uint8_t id,uint8_t app_id,const RawAddress & peer_addr)183 void bta_sys_conn_open(uint8_t id, uint8_t app_id,
184                        const RawAddress& peer_addr) {
185   if (bta_sys_cb.prm_cb) {
186     bta_sys_cb.prm_cb(BTA_SYS_CONN_OPEN, id, app_id, peer_addr);
187   }
188 
189   if (bta_sys_cb.ppm_cb) {
190     bta_sys_cb.ppm_cb(BTA_SYS_CONN_OPEN, id, app_id, peer_addr);
191   }
192 }
193 
194 /*******************************************************************************
195  *
196  * Function         bta_sys_conn_close
197  *
198  * Description      Called by BTA subsystems when a connection to the service
199  *                  is closed
200  *
201  *
202  * Returns          void
203  *
204  ******************************************************************************/
bta_sys_conn_close(uint8_t id,uint8_t app_id,const RawAddress & peer_addr)205 void bta_sys_conn_close(uint8_t id, uint8_t app_id,
206                         const RawAddress& peer_addr) {
207   if (bta_sys_cb.prm_cb) {
208     bta_sys_cb.prm_cb(BTA_SYS_CONN_CLOSE, id, app_id, peer_addr);
209   }
210 
211   if (bta_sys_cb.ppm_cb) {
212     bta_sys_cb.ppm_cb(BTA_SYS_CONN_CLOSE, id, app_id, peer_addr);
213   }
214 }
215 
216 /*******************************************************************************
217  *
218  * Function         bta_sys_app_open
219  *
220  * Description      Called by BTA subsystems when application initiates
221  *                  connection to a peer device
222  *
223  *
224  * Returns          void
225  *
226  ******************************************************************************/
bta_sys_app_open(uint8_t id,uint8_t app_id,const RawAddress & peer_addr)227 void bta_sys_app_open(uint8_t id, uint8_t app_id, const RawAddress& peer_addr) {
228   if (bta_sys_cb.ppm_cb) {
229     bta_sys_cb.ppm_cb(BTA_SYS_APP_OPEN, id, app_id, peer_addr);
230   }
231 }
232 
233 /*******************************************************************************
234  *
235  * Function         bta_sys_app_close
236  *
237  * Description      Called by BTA subsystems when application initiates close
238  *                  of connection to peer device
239  *
240  * Returns          void
241  *
242  ******************************************************************************/
bta_sys_app_close(uint8_t id,uint8_t app_id,const RawAddress & peer_addr)243 void bta_sys_app_close(uint8_t id, uint8_t app_id,
244                        const RawAddress& peer_addr) {
245   if (bta_sys_cb.ppm_cb) {
246     bta_sys_cb.ppm_cb(BTA_SYS_APP_CLOSE, id, app_id, peer_addr);
247   }
248 }
249 
250 /*******************************************************************************
251  *
252  * Function         bta_sys_sco_open
253  *
254  * Description      Called by BTA subsystems when sco connection for that
255  *                  service is open
256  *
257  * Returns          void
258  *
259  ******************************************************************************/
bta_sys_sco_open(uint8_t id,uint8_t app_id,const RawAddress & peer_addr)260 void bta_sys_sco_open(uint8_t id, uint8_t app_id, const RawAddress& peer_addr) {
261   /* AG triggers p_sco_cb by bta_sys_sco_use. */
262   if ((id != BTA_ID_AG) && (bta_sys_cb.p_sco_cb)) {
263     /* without querying BTM_GetNumScoLinks() */
264     bta_sys_cb.p_sco_cb(BTA_SYS_SCO_OPEN, 1, app_id, peer_addr);
265   }
266 
267   if (bta_sys_cb.ppm_cb) {
268     bta_sys_cb.ppm_cb(BTA_SYS_SCO_OPEN, id, app_id, peer_addr);
269   }
270 }
271 
272 /*******************************************************************************
273  *
274  * Function         bta_sys_sco_close
275  *
276  * Description      Called by BTA subsystems when sco connection for that
277  *                  service is closed
278  *
279  * Returns          void
280  *
281  ******************************************************************************/
bta_sys_sco_close(uint8_t id,uint8_t app_id,const RawAddress & peer_addr)282 void bta_sys_sco_close(uint8_t id, uint8_t app_id,
283                        const RawAddress& peer_addr) {
284   uint8_t num_sco_links;
285 
286   if ((id != BTA_ID_AG) && (bta_sys_cb.p_sco_cb)) {
287     num_sco_links = BTM_GetNumScoLinks();
288     bta_sys_cb.p_sco_cb(BTA_SYS_SCO_CLOSE, num_sco_links, app_id, peer_addr);
289   }
290 
291   if (bta_sys_cb.ppm_cb) {
292     bta_sys_cb.ppm_cb(BTA_SYS_SCO_CLOSE, id, app_id, peer_addr);
293   }
294 }
295 
296 /*******************************************************************************
297  *
298  * Function         bta_sys_sco_use
299  *
300  * Description      Called by BTA subsystems when that service needs to use sco.
301  *
302  *
303  * Returns          void
304  *
305  ******************************************************************************/
bta_sys_sco_use(UNUSED_ATTR uint8_t id,uint8_t app_id,const RawAddress & peer_addr)306 void bta_sys_sco_use(UNUSED_ATTR uint8_t id, uint8_t app_id,
307                      const RawAddress& peer_addr) {
308   /* AV streaming need to be suspended before SCO is connected. */
309   if (bta_sys_cb.p_sco_cb) {
310     /* without querying BTM_GetNumScoLinks() */
311     bta_sys_cb.p_sco_cb(BTA_SYS_SCO_OPEN, 1, app_id, peer_addr);
312   }
313 }
314 
315 /*******************************************************************************
316  *
317  * Function         bta_sys_sco_unuse
318  *
319  * Description      Called by BTA subsystems when sco connection for that
320  *                  service is no longer needed.
321  *
322  * Returns          void
323  *
324  ******************************************************************************/
bta_sys_sco_unuse(uint8_t id,uint8_t app_id,const RawAddress & peer_addr)325 void bta_sys_sco_unuse(uint8_t id, uint8_t app_id,
326                        const RawAddress& peer_addr) {
327   if ((bta_sys_cb.p_sco_cb)) {
328     uint8_t num_sco_links = BTM_GetNumScoLinks();
329     bta_sys_cb.p_sco_cb(BTA_SYS_SCO_CLOSE, num_sco_links, app_id, peer_addr);
330   }
331 }
332 /*******************************************************************************
333  *
334  * Function         bta_sys_chg_ssr_config
335  *
336  * Description      Called by BTA subsystems to indicate that the given app SSR
337  *                  setting needs to be changed.
338  *
339  * Returns          void
340  *
341  ******************************************************************************/
bta_sys_chg_ssr_config(uint8_t id,uint8_t app_id,uint16_t max_latency,uint16_t min_tout)342 void bta_sys_chg_ssr_config(uint8_t id, uint8_t app_id, uint16_t max_latency,
343                             uint16_t min_tout) {
344   if (bta_sys_cb.p_ssr_cb) {
345     bta_sys_cb.p_ssr_cb(id, app_id, max_latency, min_tout);
346   }
347 }
348 
349 /*******************************************************************************
350  *
351  * Function         bta_sys_idle
352  *
353  * Description      Called by BTA subsystems to indicate that the connection to
354  *                  peer device is idle
355  *
356  * Returns          void
357  *
358  ******************************************************************************/
bta_sys_idle(uint8_t id,uint8_t app_id,const RawAddress & peer_addr)359 void bta_sys_idle(uint8_t id, uint8_t app_id, const RawAddress& peer_addr) {
360   if (bta_sys_cb.prm_cb) {
361     bta_sys_cb.prm_cb(BTA_SYS_CONN_IDLE, id, app_id, peer_addr);
362   }
363 
364   if (bta_sys_cb.ppm_cb) {
365     bta_sys_cb.ppm_cb(BTA_SYS_CONN_IDLE, id, app_id, peer_addr);
366   }
367 }
368 
369 /*******************************************************************************
370  *
371  * Function         bta_sys_busy
372  *
373  * Description      Called by BTA subsystems to indicate that the connection to
374  *                  peer device is busy
375  *
376  * Returns          void
377  *
378  ******************************************************************************/
bta_sys_busy(uint8_t id,uint8_t app_id,const RawAddress & peer_addr)379 void bta_sys_busy(uint8_t id, uint8_t app_id, const RawAddress& peer_addr) {
380   if (bta_sys_cb.prm_cb) {
381     bta_sys_cb.prm_cb(BTA_SYS_CONN_BUSY, id, app_id, peer_addr);
382   }
383 
384   if (bta_sys_cb.ppm_cb) {
385     bta_sys_cb.ppm_cb(BTA_SYS_CONN_BUSY, id, app_id, peer_addr);
386   }
387 }
388 
389 #if (BTA_EIR_CANNED_UUID_LIST != TRUE)
390 /*******************************************************************************
391  *
392  * Function         bta_sys_eir_register
393  *
394  * Description      Called by BTA DM to register EIR utility function that can
395  *                  be used by the other BTA modules to add/remove UUID.
396  *
397  * Returns          void
398  *
399  ******************************************************************************/
bta_sys_eir_register(tBTA_SYS_EIR_CBACK * p_cback)400 void bta_sys_eir_register(tBTA_SYS_EIR_CBACK* p_cback) {
401   bta_sys_cb.eir_cb = p_cback;
402 }
403 
404 /*******************************************************************************
405  *
406  * Function         bta_sys_cust_eir_register
407  *
408  * Description      Called by BTA DM to register EIR utility function that can
409  *                  be used by the other BTA modules to add/remove custom UUID.
410  *
411  * Returns          void
412  *
413  ******************************************************************************/
bta_sys_cust_eir_register(tBTA_SYS_CUST_EIR_CBACK * p_cback)414 void bta_sys_cust_eir_register(tBTA_SYS_CUST_EIR_CBACK* p_cback) {
415   bta_sys_cb.cust_eir_cb = p_cback;
416 }
417 
418 /*******************************************************************************
419  *
420  * Function         bta_sys_add_uuid
421  *
422  * Description      Called by BTA subsystems to indicate to DM that new service
423  *                  class UUID is added.
424  *
425  * Returns          void
426  *
427  ******************************************************************************/
bta_sys_add_uuid(uint16_t uuid16)428 void bta_sys_add_uuid(uint16_t uuid16) {
429   if (bta_sys_cb.eir_cb) {
430     bta_sys_cb.eir_cb(uuid16, true);
431   }
432 }
433 
434 /*******************************************************************************
435  *
436  * Function         bta_sys_remove_uuid
437  *
438  * Description      Called by BTA subsystems to indicate to DM that the service
439  *                  class UUID is removed.
440  *
441  * Returns          void
442  *
443  ******************************************************************************/
bta_sys_remove_uuid(uint16_t uuid16)444 void bta_sys_remove_uuid(uint16_t uuid16) {
445   if (bta_sys_cb.eir_cb) {
446     bta_sys_cb.eir_cb(uuid16, false);
447   }
448 }
449 
450 /*******************************************************************************
451  *
452  * Function         bta_sys_add_cust_uuid
453  *
454  * Description      Called by BTA subsystems to indicate to DM that the custom service
455  *                  class UUID is removed.
456  *
457  * Returns          void
458  *
459  ******************************************************************************/
bta_sys_add_cust_uuid(const tBTA_CUSTOM_UUID & curr)460 void bta_sys_add_cust_uuid(const tBTA_CUSTOM_UUID& curr) {
461   if (bta_sys_cb.cust_eir_cb) {
462     bta_sys_cb.cust_eir_cb(curr, true);
463   }
464 }
465 
466 /*******************************************************************************
467  *
468  * Function         bta_sys_remove_cust_uuid
469  *
470  * Description      Called by BTA subsystems to indicate to DM that the service
471  *                  class UUID is removed.
472  *
473  * Returns          void
474  *
475  ******************************************************************************/
bta_sys_remove_cust_uuid(const tBTA_CUSTOM_UUID & curr)476 void bta_sys_remove_cust_uuid(const tBTA_CUSTOM_UUID& curr) {
477   if (bta_sys_cb.cust_eir_cb) {
478     bta_sys_cb.cust_eir_cb(curr, false);
479   }
480 }
481 #endif
482