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