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