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