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