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