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