1 /****************************************************************************** 2 * 3 * Copyright (C) 2003-2014 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 * This is the API implementation file for the BTA device manager. 22 * 23 ******************************************************************************/ 24 25 #include "bt_common.h" 26 #include "bta_sys.h" 27 #include "bta_api.h" 28 #include "bta_dm_int.h" 29 #include "bta_sys_int.h" 30 #include "btm_api.h" 31 #include "btm_int.h" 32 #include <string.h> 33 #include "utl.h" 34 35 /***************************************************************************** 36 ** Constants 37 *****************************************************************************/ 38 39 static const tBTA_SYS_REG bta_dm_reg = 40 { 41 bta_dm_sm_execute, 42 bta_dm_sm_disable 43 }; 44 45 static const tBTA_SYS_REG bta_dm_search_reg = 46 { 47 bta_dm_search_sm_execute, 48 bta_dm_search_sm_disable 49 }; 50 51 /******************************************************************************* 52 ** 53 ** Function BTA_EnableBluetooth 54 ** 55 ** Description Enables bluetooth service. This function must be 56 ** called before any other functions in the BTA API are called. 57 ** 58 ** 59 ** Returns tBTA_STATUS 60 ** 61 *******************************************************************************/ 62 tBTA_STATUS BTA_EnableBluetooth(tBTA_DM_SEC_CBACK *p_cback) 63 { 64 /* Bluetooth disabling is in progress */ 65 if (bta_dm_cb.disabling) 66 return BTA_FAILURE; 67 68 bta_dm_init_cb(); 69 70 bta_sys_register(BTA_ID_DM, &bta_dm_reg ); 71 bta_sys_register(BTA_ID_DM_SEARCH, &bta_dm_search_reg ); 72 73 /* if UUID list is not provided as static data */ 74 bta_sys_eir_register(bta_dm_eir_update_uuid); 75 76 tBTA_DM_API_ENABLE *p_msg = 77 (tBTA_DM_API_ENABLE *)osi_malloc(sizeof(tBTA_DM_API_ENABLE)); 78 p_msg->hdr.event = BTA_DM_API_ENABLE_EVT; 79 p_msg->p_sec_cback = p_cback; 80 81 bta_sys_sendmsg(p_msg); 82 83 return BTA_SUCCESS; 84 } 85 86 /******************************************************************************* 87 ** 88 ** Function BTA_DisableBluetooth 89 ** 90 ** Description Disables bluetooth service. This function is called when 91 ** the application no longer needs bluetooth service 92 ** 93 ** Returns void 94 ** 95 *******************************************************************************/ 96 tBTA_STATUS BTA_DisableBluetooth(void) 97 { 98 BT_HDR *p_msg = (BT_HDR *)osi_malloc(sizeof(BT_HDR)); 99 100 p_msg->event = BTA_DM_API_DISABLE_EVT; 101 102 bta_sys_sendmsg(p_msg); 103 104 return BTA_SUCCESS; 105 } 106 107 /******************************************************************************* 108 ** 109 ** Function BTA_EnableTestMode 110 ** 111 ** Description Enables bluetooth device under test mode 112 ** 113 ** 114 ** Returns tBTA_STATUS 115 ** 116 *******************************************************************************/ 117 tBTA_STATUS BTA_EnableTestMode(void) 118 { 119 BT_HDR *p_msg = (BT_HDR *)osi_malloc(sizeof(BT_HDR)); 120 121 APPL_TRACE_API("%s", __func__); 122 123 p_msg->event = BTA_DM_API_ENABLE_TEST_MODE_EVT; 124 bta_sys_sendmsg(p_msg); 125 126 return BTA_SUCCESS; 127 } 128 129 /******************************************************************************* 130 ** 131 ** Function BTA_DisableTestMode 132 ** 133 ** Description Disable bluetooth device under test mode 134 ** 135 ** 136 ** Returns None 137 ** 138 *******************************************************************************/ 139 void BTA_DisableTestMode(void) 140 { 141 BT_HDR *p_msg = (BT_HDR *)osi_malloc(sizeof(BT_HDR)); 142 143 APPL_TRACE_API("%s", __func__); 144 145 p_msg->event = BTA_DM_API_DISABLE_TEST_MODE_EVT; 146 bta_sys_sendmsg(p_msg); 147 } 148 149 /******************************************************************************* 150 ** 151 ** Function BTA_DmSetDeviceName 152 ** 153 ** Description This function sets the Bluetooth name of local device 154 ** 155 ** 156 ** Returns void 157 ** 158 *******************************************************************************/ 159 void BTA_DmSetDeviceName(char *p_name) 160 { 161 tBTA_DM_API_SET_NAME *p_msg = 162 (tBTA_DM_API_SET_NAME *)osi_malloc(sizeof(tBTA_DM_API_SET_NAME)); 163 164 p_msg->hdr.event = BTA_DM_API_SET_NAME_EVT; 165 strlcpy((char*)p_msg->name, p_name, BD_NAME_LEN); 166 167 bta_sys_sendmsg(p_msg); 168 } 169 170 /******************************************************************************* 171 ** 172 ** Function BTA_DmSetVisibility 173 ** 174 ** Description This function sets the Bluetooth connectable, 175 ** discoverable, pairable and conn paired only modes of local device 176 ** 177 ** 178 ** Returns void 179 ** 180 *******************************************************************************/ 181 void BTA_DmSetVisibility(tBTA_DM_DISC disc_mode, tBTA_DM_CONN conn_mode, UINT8 pairable_mode, UINT8 conn_filter ) 182 { 183 tBTA_DM_API_SET_VISIBILITY *p_msg = 184 (tBTA_DM_API_SET_VISIBILITY *)osi_malloc(sizeof(tBTA_DM_MSG)); 185 186 p_msg->hdr.event = BTA_DM_API_SET_VISIBILITY_EVT; 187 p_msg->disc_mode = disc_mode; 188 p_msg->conn_mode = conn_mode; 189 p_msg->pair_mode = pairable_mode; 190 p_msg->conn_paired_only = conn_filter; 191 192 bta_sys_sendmsg(p_msg); 193 } 194 195 /******************************************************************************* 196 ** 197 ** Function BTA_DmSearch 198 ** 199 ** Description This function searches for peer Bluetooth devices. It performs 200 ** an inquiry and gets the remote name for devices. Service 201 ** discovery is done if services is non zero 202 ** 203 ** 204 ** Returns void 205 ** 206 *******************************************************************************/ 207 void BTA_DmSearch(tBTA_DM_INQ *p_dm_inq, tBTA_SERVICE_MASK services, tBTA_DM_SEARCH_CBACK *p_cback) 208 { 209 tBTA_DM_API_SEARCH *p_msg = 210 (tBTA_DM_API_SEARCH *)osi_calloc(sizeof(tBTA_DM_API_SEARCH)); 211 212 p_msg->hdr.event = BTA_DM_API_SEARCH_EVT; 213 memcpy(&p_msg->inq_params, p_dm_inq, sizeof(tBTA_DM_INQ)); 214 p_msg->services = services; 215 p_msg->p_cback = p_cback; 216 p_msg->rs_res = BTA_DM_RS_NONE; 217 218 bta_sys_sendmsg(p_msg); 219 } 220 221 /******************************************************************************* 222 ** 223 ** Function BTA_DmSearchCancel 224 ** 225 ** Description This function cancels a search initiated by BTA_DmSearch 226 ** 227 ** 228 ** Returns void 229 ** 230 *******************************************************************************/ 231 void BTA_DmSearchCancel(void) 232 { 233 BT_HDR *p_msg = (BT_HDR *)osi_malloc(sizeof(BT_HDR)); 234 235 p_msg->event = BTA_DM_API_SEARCH_CANCEL_EVT; 236 bta_sys_sendmsg(p_msg); 237 } 238 239 /******************************************************************************* 240 ** 241 ** Function BTA_DmDiscover 242 ** 243 ** Description This function does service discovery for services of a 244 ** peer device 245 ** 246 ** 247 ** Returns void 248 ** 249 *******************************************************************************/ 250 void BTA_DmDiscover(BD_ADDR bd_addr, tBTA_SERVICE_MASK services, 251 tBTA_DM_SEARCH_CBACK *p_cback, BOOLEAN sdp_search) 252 { 253 tBTA_DM_API_DISCOVER *p_msg = 254 (tBTA_DM_API_DISCOVER *)osi_calloc(sizeof(tBTA_DM_API_DISCOVER)); 255 256 p_msg->hdr.event = BTA_DM_API_DISCOVER_EVT; 257 bdcpy(p_msg->bd_addr, bd_addr); 258 p_msg->services = services; 259 p_msg->p_cback = p_cback; 260 p_msg->sdp_search = sdp_search; 261 262 bta_sys_sendmsg(p_msg); 263 } 264 265 /******************************************************************************* 266 ** 267 ** Function BTA_DmDiscoverUUID 268 ** 269 ** Description This function does service discovery for services of a 270 ** peer device 271 ** 272 ** 273 ** Returns void 274 ** 275 *******************************************************************************/ 276 void BTA_DmDiscoverUUID(BD_ADDR bd_addr, tSDP_UUID *uuid, 277 tBTA_DM_SEARCH_CBACK *p_cback, BOOLEAN sdp_search) 278 { 279 tBTA_DM_API_DISCOVER *p_msg = 280 (tBTA_DM_API_DISCOVER *)osi_malloc(sizeof(tBTA_DM_API_DISCOVER)); 281 282 p_msg->hdr.event = BTA_DM_API_DISCOVER_EVT; 283 bdcpy(p_msg->bd_addr, bd_addr); 284 p_msg->services = BTA_USER_SERVICE_MASK; //Not exposed at API level 285 p_msg->p_cback = p_cback; 286 p_msg->sdp_search = sdp_search; 287 288 #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE 289 p_msg->num_uuid = 0; 290 p_msg->p_uuid = NULL; 291 #endif 292 memcpy(&p_msg->uuid, uuid, sizeof(tSDP_UUID) ); 293 294 bta_sys_sendmsg(p_msg); 295 } 296 297 /******************************************************************************* 298 ** 299 ** Function BTA_DmBond 300 ** 301 ** Description This function initiates a bonding procedure with a peer 302 ** device 303 ** 304 ** 305 ** Returns void 306 ** 307 *******************************************************************************/ 308 void BTA_DmBond(BD_ADDR bd_addr) 309 { 310 tBTA_DM_API_BOND *p_msg = 311 (tBTA_DM_API_BOND *)osi_malloc(sizeof(tBTA_DM_API_BOND)); 312 313 p_msg->hdr.event = BTA_DM_API_BOND_EVT; 314 bdcpy(p_msg->bd_addr, bd_addr); 315 p_msg->transport = BTA_TRANSPORT_UNKNOWN; 316 317 bta_sys_sendmsg(p_msg); 318 } 319 320 /******************************************************************************* 321 ** 322 ** Function BTA_DmBondByTransports 323 ** 324 ** Description This function initiates a bonding procedure with a peer 325 ** device 326 ** 327 ** 328 ** Returns void 329 ** 330 *******************************************************************************/ 331 void BTA_DmBondByTransport(BD_ADDR bd_addr, tBTA_TRANSPORT transport) 332 { 333 tBTA_DM_API_BOND *p_msg = 334 (tBTA_DM_API_BOND *)osi_malloc(sizeof(tBTA_DM_API_BOND)); 335 336 p_msg->hdr.event = BTA_DM_API_BOND_EVT; 337 bdcpy(p_msg->bd_addr, bd_addr); 338 p_msg->transport = transport; 339 340 bta_sys_sendmsg(p_msg); 341 } 342 343 /******************************************************************************* 344 ** 345 ** Function BTA_DmBondCancel 346 ** 347 ** Description This function cancels the bonding procedure with a peer 348 ** device 349 ** 350 ** 351 ** Returns void 352 ** 353 *******************************************************************************/ 354 void BTA_DmBondCancel(BD_ADDR bd_addr) 355 { 356 tBTA_DM_API_BOND_CANCEL *p_msg = 357 (tBTA_DM_API_BOND_CANCEL *)osi_malloc(sizeof(tBTA_DM_API_BOND_CANCEL)); 358 359 p_msg->hdr.event = BTA_DM_API_BOND_CANCEL_EVT; 360 bdcpy(p_msg->bd_addr, bd_addr); 361 362 bta_sys_sendmsg(p_msg); 363 } 364 365 /******************************************************************************* 366 ** 367 ** Function BTA_DmPinReply 368 ** 369 ** Description This function provides a pincode for a remote device when 370 ** one is requested by DM through BTA_DM_PIN_REQ_EVT 371 ** 372 ** 373 ** Returns void 374 ** 375 *******************************************************************************/ 376 void BTA_DmPinReply(BD_ADDR bd_addr, BOOLEAN accept, UINT8 pin_len, UINT8 *p_pin) 377 378 { 379 tBTA_DM_API_PIN_REPLY *p_msg = 380 (tBTA_DM_API_PIN_REPLY *)osi_malloc(sizeof(tBTA_DM_API_PIN_REPLY)); 381 382 p_msg->hdr.event = BTA_DM_API_PIN_REPLY_EVT; 383 bdcpy(p_msg->bd_addr, bd_addr); 384 p_msg->accept = accept; 385 if (accept) { 386 p_msg->pin_len = pin_len; 387 memcpy(p_msg->p_pin, p_pin, pin_len); 388 } 389 390 bta_sys_sendmsg(p_msg); 391 } 392 393 /******************************************************************************* 394 ** 395 ** Function BTA_DmLocalOob 396 ** 397 ** Description This function retrieves the OOB data from local controller. 398 ** The result is reported by: 399 ** - bta_dm_co_loc_oob_ext() if device supports secure 400 ** connections (SC) 401 ** - bta_dm_co_loc_oob() if device doesn't support SC 402 ** 403 ** Returns void 404 ** 405 *******************************************************************************/ 406 void BTA_DmLocalOob(void) 407 { 408 tBTA_DM_API_LOC_OOB *p_msg = 409 (tBTA_DM_API_LOC_OOB *)osi_malloc(sizeof(tBTA_DM_API_LOC_OOB)); 410 411 p_msg->hdr.event = BTA_DM_API_LOC_OOB_EVT; 412 bta_sys_sendmsg(p_msg); 413 } 414 415 /******************************************************************************* 416 ** 417 ** Function BTA_DmConfirm 418 ** 419 ** Description This function accepts or rejects the numerical value of the 420 ** Simple Pairing process on BTA_DM_SP_CFM_REQ_EVT 421 ** 422 ** Returns void 423 ** 424 *******************************************************************************/ 425 void BTA_DmConfirm(BD_ADDR bd_addr, BOOLEAN accept) 426 { 427 tBTA_DM_API_CONFIRM *p_msg = 428 (tBTA_DM_API_CONFIRM *)osi_malloc(sizeof(tBTA_DM_API_CONFIRM)); 429 430 p_msg->hdr.event = BTA_DM_API_CONFIRM_EVT; 431 bdcpy(p_msg->bd_addr, bd_addr); 432 p_msg->accept = accept; 433 434 bta_sys_sendmsg(p_msg); 435 } 436 437 /******************************************************************************* 438 ** 439 ** Function BTA_DmAddDevice 440 ** 441 ** Description This function adds a device to the security database list of 442 ** peer device 443 ** 444 ** 445 ** Returns void 446 ** 447 *******************************************************************************/ 448 void BTA_DmAddDevice(BD_ADDR bd_addr, DEV_CLASS dev_class, LINK_KEY link_key, 449 tBTA_SERVICE_MASK trusted_mask, BOOLEAN is_trusted, 450 UINT8 key_type, tBTA_IO_CAP io_cap, UINT8 pin_length) 451 { 452 tBTA_DM_API_ADD_DEVICE *p_msg = 453 (tBTA_DM_API_ADD_DEVICE *)osi_calloc(sizeof(tBTA_DM_API_ADD_DEVICE)); 454 455 p_msg->hdr.event = BTA_DM_API_ADD_DEVICE_EVT; 456 bdcpy(p_msg->bd_addr, bd_addr); 457 p_msg->tm = trusted_mask; 458 p_msg->is_trusted = is_trusted; 459 p_msg->io_cap = io_cap; 460 461 if (link_key) { 462 p_msg->link_key_known = TRUE; 463 p_msg->key_type = key_type; 464 memcpy(p_msg->link_key, link_key, LINK_KEY_LEN); 465 } 466 467 /* Load device class if specified */ 468 if (dev_class) { 469 p_msg->dc_known = TRUE; 470 memcpy(p_msg->dc, dev_class, DEV_CLASS_LEN); 471 } 472 473 memset(p_msg->bd_name, 0, BD_NAME_LEN + 1); 474 memset(p_msg->features, 0, sizeof (p_msg->features)); 475 p_msg->pin_length = pin_length; 476 477 bta_sys_sendmsg(p_msg); 478 } 479 480 /******************************************************************************* 481 ** 482 ** Function BTA_DmRemoveDevice 483 ** 484 ** Description This function removes a device fromthe security database list of 485 ** peer device. It manages unpairing even while connected. 486 ** 487 ** 488 ** Returns void 489 ** 490 *******************************************************************************/ 491 tBTA_STATUS BTA_DmRemoveDevice(BD_ADDR bd_addr) 492 { 493 tBTA_DM_API_REMOVE_DEVICE *p_msg = 494 (tBTA_DM_API_REMOVE_DEVICE *)osi_calloc(sizeof(tBTA_DM_API_REMOVE_DEVICE)); 495 496 p_msg->hdr.event = BTA_DM_API_REMOVE_DEVICE_EVT; 497 bdcpy(p_msg->bd_addr, bd_addr); 498 499 bta_sys_sendmsg(p_msg); 500 501 return BTA_SUCCESS; 502 } 503 504 /******************************************************************************* 505 ** 506 ** Function BTA_GetEirService 507 ** 508 ** Description This function is called to get BTA service mask from EIR. 509 ** 510 ** Parameters p_eir - pointer of EIR significant part 511 ** p_services - return the BTA service mask 512 ** 513 ** Returns None 514 ** 515 *******************************************************************************/ 516 extern const UINT16 bta_service_id_to_uuid_lkup_tbl []; 517 void BTA_GetEirService( UINT8 *p_eir, tBTA_SERVICE_MASK *p_services ) 518 { 519 UINT8 xx, yy; 520 UINT8 num_uuid, max_num_uuid = 32; 521 UINT8 uuid_list[32*LEN_UUID_16]; 522 UINT16 *p_uuid16 = (UINT16 *)uuid_list; 523 tBTA_SERVICE_MASK mask; 524 525 BTM_GetEirUuidList( p_eir, LEN_UUID_16, &num_uuid, uuid_list, max_num_uuid); 526 for( xx = 0; xx < num_uuid; xx++ ) 527 { 528 mask = 1; 529 for( yy = 0; yy < BTA_MAX_SERVICE_ID; yy++ ) 530 { 531 if( *(p_uuid16 + xx) == bta_service_id_to_uuid_lkup_tbl[yy] ) 532 { 533 *p_services |= mask; 534 break; 535 } 536 mask <<= 1; 537 } 538 539 /* for HSP v1.2 only device */ 540 if (*(p_uuid16 + xx) == UUID_SERVCLASS_HEADSET_HS) 541 *p_services |= BTA_HSP_SERVICE_MASK; 542 543 if (*(p_uuid16 + xx) == UUID_SERVCLASS_HDP_SOURCE) 544 *p_services |= BTA_HL_SERVICE_MASK; 545 546 if (*(p_uuid16 + xx) == UUID_SERVCLASS_HDP_SINK) 547 *p_services |= BTA_HL_SERVICE_MASK; 548 } 549 } 550 551 /******************************************************************************* 552 ** 553 ** Function BTA_DmGetConnectionState 554 ** 555 ** Description Returns whether the remote device is currently connected. 556 ** 557 ** Returns 0 if the device is NOT connected. 558 ** 559 *******************************************************************************/ 560 UINT16 BTA_DmGetConnectionState( BD_ADDR bd_addr ) 561 { 562 tBTA_DM_PEER_DEVICE * p_dev = bta_dm_find_peer_device(bd_addr); 563 return (p_dev && p_dev->conn_state == BTA_DM_CONNECTED); 564 } 565 566 567 /******************************************************************************* 568 ** Device Identification (DI) Server Functions 569 *******************************************************************************/ 570 /******************************************************************************* 571 ** 572 ** Function BTA_DmSetLocalDiRecord 573 ** 574 ** Description This function adds a DI record to the local SDP database. 575 ** 576 ** Returns BTA_SUCCESS if record set sucessfully, otherwise error code. 577 ** 578 *******************************************************************************/ 579 tBTA_STATUS BTA_DmSetLocalDiRecord( tBTA_DI_RECORD *p_device_info, 580 UINT32 *p_handle ) 581 { 582 tBTA_STATUS status = BTA_FAILURE; 583 584 if(bta_dm_di_cb.di_num < BTA_DI_NUM_MAX) 585 { 586 if(SDP_SetLocalDiRecord((tSDP_DI_RECORD *)p_device_info, p_handle) == SDP_SUCCESS) 587 { 588 if(!p_device_info->primary_record) 589 { 590 bta_dm_di_cb.di_handle[bta_dm_di_cb.di_num] = *p_handle; 591 bta_dm_di_cb.di_num ++; 592 } 593 594 bta_sys_add_uuid(UUID_SERVCLASS_PNP_INFORMATION); 595 status = BTA_SUCCESS; 596 } 597 } 598 599 return status; 600 } 601 602 /******************************************************************************* 603 ** 604 ** Function bta_dmexecutecallback 605 ** 606 ** Description This function will request BTA to execute a call back in the context of BTU task 607 ** This API was named in lower case because it is only intended 608 ** for the internal customers(like BTIF). 609 ** 610 ** Returns void 611 ** 612 *******************************************************************************/ 613 void bta_dmexecutecallback (tBTA_DM_EXEC_CBACK* p_callback, void * p_param) 614 { 615 tBTA_DM_API_EXECUTE_CBACK *p_msg = 616 (tBTA_DM_API_EXECUTE_CBACK *)osi_malloc(sizeof(tBTA_DM_MSG)); 617 618 p_msg->hdr.event = BTA_DM_API_EXECUTE_CBACK_EVT; 619 p_msg->p_param= p_param; 620 p_msg->p_exec_cback= p_callback; 621 622 bta_sys_sendmsg(p_msg); 623 } 624 625 /******************************************************************************* 626 ** 627 ** Function BTA_DmAddBleKey 628 ** 629 ** Description Add/modify LE device information. This function will be 630 ** normally called during host startup to restore all required 631 ** information stored in the NVRAM. 632 ** 633 ** Parameters: bd_addr - BD address of the peer 634 ** p_le_key - LE key values. 635 ** key_type - LE SMP key type. 636 ** 637 ** Returns BTA_SUCCESS if successful 638 ** BTA_FAIL if operation failed. 639 ** 640 *******************************************************************************/ 641 void BTA_DmAddBleKey (BD_ADDR bd_addr, tBTA_LE_KEY_VALUE *p_le_key, tBTA_LE_KEY_TYPE key_type) 642 { 643 #if BLE_INCLUDED == TRUE 644 645 tBTA_DM_API_ADD_BLEKEY *p_msg = 646 (tBTA_DM_API_ADD_BLEKEY *)osi_calloc(sizeof(tBTA_DM_API_ADD_BLEKEY)); 647 648 p_msg->hdr.event = BTA_DM_API_ADD_BLEKEY_EVT; 649 p_msg->key_type = key_type; 650 bdcpy(p_msg->bd_addr, bd_addr); 651 memcpy(&p_msg->blekey, p_le_key, sizeof(tBTA_LE_KEY_VALUE)); 652 653 bta_sys_sendmsg(p_msg); 654 #endif 655 } 656 657 /******************************************************************************* 658 ** 659 ** Function BTA_DmAddBleDevice 660 ** 661 ** Description Add a BLE device. This function will be normally called 662 ** during host startup to restore all required information 663 ** for a LE device stored in the NVRAM. 664 ** 665 ** Parameters: bd_addr - BD address of the peer 666 ** dev_type - Remote device's device type. 667 ** addr_type - LE device address type. 668 ** 669 ** Returns void 670 ** 671 *******************************************************************************/ 672 void BTA_DmAddBleDevice(BD_ADDR bd_addr, tBLE_ADDR_TYPE addr_type, tBT_DEVICE_TYPE dev_type) 673 { 674 #if BLE_INCLUDED == TRUE 675 tBTA_DM_API_ADD_BLE_DEVICE *p_msg = 676 (tBTA_DM_API_ADD_BLE_DEVICE *)osi_calloc(sizeof(tBTA_DM_API_ADD_BLE_DEVICE)); 677 678 p_msg->hdr.event = BTA_DM_API_ADD_BLEDEVICE_EVT; 679 bdcpy(p_msg->bd_addr, bd_addr); 680 p_msg->addr_type = addr_type; 681 p_msg->dev_type = dev_type; 682 683 bta_sys_sendmsg(p_msg); 684 #endif 685 } 686 687 /******************************************************************************* 688 ** 689 ** Function BTA_DmBlePasskeyReply 690 ** 691 ** Description Send BLE SMP passkey reply. 692 ** 693 ** Parameters: bd_addr - BD address of the peer 694 ** accept - passkey entry sucessful or declined. 695 ** passkey - passkey value, must be a 6 digit number, 696 ** can be lead by 0. 697 ** 698 ** Returns void 699 ** 700 *******************************************************************************/ 701 void BTA_DmBlePasskeyReply(BD_ADDR bd_addr, BOOLEAN accept, UINT32 passkey) 702 { 703 #if BLE_INCLUDED == TRUE 704 tBTA_DM_API_PASSKEY_REPLY *p_msg = 705 (tBTA_DM_API_PASSKEY_REPLY *)osi_calloc(sizeof(tBTA_DM_API_PASSKEY_REPLY)); 706 707 p_msg->hdr.event = BTA_DM_API_BLE_PASSKEY_REPLY_EVT; 708 bdcpy(p_msg->bd_addr, bd_addr); 709 p_msg->accept = accept; 710 711 if (accept) 712 p_msg->passkey = passkey; 713 714 bta_sys_sendmsg(p_msg); 715 #endif 716 } 717 718 /******************************************************************************* 719 ** 720 ** Function BTA_DmBleConfirmReply 721 ** 722 ** Description Send BLE SMP SC user confirmation reply. 723 ** 724 ** Parameters: bd_addr - BD address of the peer 725 ** accept - numbers to compare are the same or different. 726 ** 727 ** Returns void 728 ** 729 *******************************************************************************/ 730 void BTA_DmBleConfirmReply(BD_ADDR bd_addr, BOOLEAN accept) 731 { 732 #if BLE_INCLUDED == TRUE 733 tBTA_DM_API_CONFIRM *p_msg = 734 (tBTA_DM_API_CONFIRM *)osi_calloc(sizeof(tBTA_DM_API_CONFIRM)); 735 736 p_msg->hdr.event = BTA_DM_API_BLE_CONFIRM_REPLY_EVT; 737 bdcpy(p_msg->bd_addr, bd_addr); 738 p_msg->accept = accept; 739 740 bta_sys_sendmsg(p_msg); 741 #endif 742 } 743 744 /******************************************************************************* 745 ** 746 ** Function BTA_DmBleSecurityGrant 747 ** 748 ** Description Grant security request access. 749 ** 750 ** Parameters: bd_addr - BD address of the peer 751 ** res - security grant status. 752 ** 753 ** Returns void 754 ** 755 *******************************************************************************/ 756 void BTA_DmBleSecurityGrant(BD_ADDR bd_addr, tBTA_DM_BLE_SEC_GRANT res) 757 { 758 #if BLE_INCLUDED == TRUE 759 tBTA_DM_API_BLE_SEC_GRANT *p_msg = 760 (tBTA_DM_API_BLE_SEC_GRANT *)osi_calloc(sizeof(tBTA_DM_API_BLE_SEC_GRANT)); 761 762 p_msg->hdr.event = BTA_DM_API_BLE_SEC_GRANT_EVT; 763 bdcpy(p_msg->bd_addr, bd_addr); 764 p_msg->res = res; 765 766 bta_sys_sendmsg(p_msg); 767 #endif 768 } 769 770 /******************************************************************************* 771 ** 772 ** Function BTA_DmSetBlePrefConnParams 773 ** 774 ** Description This function is called to set the preferred connection 775 ** parameters when default connection parameter is not desired. 776 ** 777 ** Parameters: bd_addr - BD address of the peripheral 778 ** scan_interval - scan interval 779 ** scan_window - scan window 780 ** min_conn_int - minimum preferred connection interval 781 ** max_conn_int - maximum preferred connection interval 782 ** slave_latency - preferred slave latency 783 ** supervision_tout - preferred supervision timeout 784 ** 785 ** 786 ** Returns void 787 ** 788 *******************************************************************************/ 789 void BTA_DmSetBlePrefConnParams(BD_ADDR bd_addr, 790 UINT16 min_conn_int, UINT16 max_conn_int, 791 UINT16 slave_latency, UINT16 supervision_tout ) 792 { 793 #if BLE_INCLUDED == TRUE 794 tBTA_DM_API_BLE_CONN_PARAMS *p_msg = 795 (tBTA_DM_API_BLE_CONN_PARAMS *)osi_calloc(sizeof(tBTA_DM_API_BLE_CONN_PARAMS)); 796 797 p_msg->hdr.event = BTA_DM_API_BLE_CONN_PARAM_EVT; 798 memcpy(p_msg->peer_bda, bd_addr, BD_ADDR_LEN); 799 p_msg->conn_int_max = max_conn_int; 800 p_msg->conn_int_min = min_conn_int; 801 p_msg->slave_latency = slave_latency; 802 p_msg->supervision_tout = supervision_tout; 803 804 bta_sys_sendmsg(p_msg); 805 #endif 806 } 807 808 /******************************************************************************* 809 ** 810 ** Function BTA_DmSetBleConnScanParams 811 ** 812 ** Description This function is called to set scan parameters used in 813 ** BLE connection request 814 ** 815 ** Parameters: scan_interval - scan interval 816 ** scan_window - scan window 817 ** 818 ** Returns void 819 ** 820 *******************************************************************************/ 821 void BTA_DmSetBleConnScanParams(UINT32 scan_interval, UINT32 scan_window) 822 { 823 #if BLE_INCLUDED == TRUE 824 tBTA_DM_API_BLE_SCAN_PARAMS *p_msg = 825 (tBTA_DM_API_BLE_SCAN_PARAMS *)osi_calloc(sizeof(tBTA_DM_API_BLE_SCAN_PARAMS)); 826 827 p_msg->hdr.event = BTA_DM_API_BLE_CONN_SCAN_PARAM_EVT; 828 p_msg->scan_int = scan_interval; 829 p_msg->scan_window = scan_window; 830 831 bta_sys_sendmsg(p_msg); 832 #endif // BLE_INCLUDED == TRUE 833 } 834 835 /******************************************************************************* 836 ** 837 ** Function BTA_DmSetBleScanParams 838 ** 839 ** Description This function is called to set scan parameters 840 ** 841 ** Parameters: client_if - Client IF 842 ** scan_interval - scan interval 843 ** scan_window - scan window 844 ** scan_mode - scan mode 845 ** scan_param_setup_status_cback - Set scan param status callback 846 ** 847 ** Returns void 848 ** 849 *******************************************************************************/ 850 851 #if BLE_INCLUDED == TRUE 852 void BTA_DmSetBleScanParams(tGATT_IF client_if, UINT32 scan_interval, 853 UINT32 scan_window, tBLE_SCAN_MODE scan_mode, 854 tBLE_SCAN_PARAM_SETUP_CBACK scan_param_setup_cback) 855 { 856 tBTA_DM_API_BLE_SCAN_PARAMS *p_msg = 857 (tBTA_DM_API_BLE_SCAN_PARAMS *)osi_calloc(sizeof(tBTA_DM_API_BLE_SCAN_PARAMS)); 858 859 p_msg->hdr.event = BTA_DM_API_BLE_SCAN_PARAM_EVT; 860 p_msg->client_if = client_if; 861 p_msg->scan_int = scan_interval; 862 p_msg->scan_window = scan_window; 863 p_msg->scan_mode = scan_mode; 864 p_msg->scan_param_setup_cback = scan_param_setup_cback; 865 866 bta_sys_sendmsg(p_msg); 867 } 868 #endif // BLE_INCLUDED == TRUE 869 870 /******************************************************************************* 871 ** 872 ** Function BTA_DmSetBleAdvParams 873 ** 874 ** Description This function sets the advertising parameters BLE functionality. 875 ** It is to be called when device act in peripheral or broadcaster 876 ** role. 877 ** 878 ** 879 ** Returns void 880 ** 881 *******************************************************************************/ 882 void BTA_DmSetBleAdvParams (UINT16 adv_int_min, UINT16 adv_int_max, 883 tBLE_BD_ADDR *p_dir_bda) 884 { 885 #if BLE_INCLUDED == TRUE 886 tBTA_DM_API_BLE_ADV_PARAMS *p_msg = 887 (tBTA_DM_API_BLE_ADV_PARAMS *)osi_calloc(sizeof(tBTA_DM_API_BLE_ADV_PARAMS)); 888 889 APPL_TRACE_API("BTA_DmSetBleAdvParam: %d, %d", adv_int_min, adv_int_max); 890 891 p_msg->hdr.event = BTA_DM_API_BLE_ADV_PARAM_EVT; 892 p_msg->adv_int_min = adv_int_min; 893 p_msg->adv_int_max = adv_int_max; 894 895 if (p_dir_bda != NULL) { 896 p_msg->p_dir_bda = (tBLE_BD_ADDR *)(p_msg + 1); 897 memcpy(p_msg->p_dir_bda, p_dir_bda, sizeof(tBLE_BD_ADDR)); 898 } 899 900 bta_sys_sendmsg(p_msg); 901 #endif 902 } 903 904 /******************************************************************************* 905 ** BLE ADV data management API 906 ********************************************************************************/ 907 908 #if BLE_INCLUDED == TRUE 909 /******************************************************************************* 910 ** 911 ** Function BTA_DmBleSetAdvConfig 912 ** 913 ** Description This function is called to override the BTA default ADV parameters. 914 ** 915 ** Parameters data_mask: adv data mask. 916 ** p_adv_cfg: Pointer to User defined ADV data structure. This 917 ** memory space can not be freed until p_adv_data_cback 918 ** is received. 919 ** p_adv_data_cback: set adv data complete callback. 920 ** 921 ** Returns None 922 ** 923 *******************************************************************************/ 924 void BTA_DmBleSetAdvConfig (tBTA_BLE_AD_MASK data_mask, tBTA_BLE_ADV_DATA *p_adv_cfg, 925 tBTA_SET_ADV_DATA_CMPL_CBACK *p_adv_data_cback) 926 { 927 tBTA_DM_API_SET_ADV_CONFIG *p_msg = osi_calloc(sizeof(*p_msg)); 928 929 p_msg->hdr.event = BTA_DM_API_BLE_SET_ADV_CONFIG_EVT; 930 p_msg->data_mask = data_mask; 931 p_msg->p_adv_data_cback = p_adv_data_cback; 932 memcpy(&p_msg->adv_cfg, p_adv_cfg, sizeof(p_msg->adv_cfg)); 933 934 bta_sys_sendmsg(p_msg); 935 } 936 937 /******************************************************************************* 938 ** 939 ** Function BTA_DmBleSetScanRsp 940 ** 941 ** Description This function is called to override the BTA scan response. 942 ** 943 ** Parameters Pointer to User defined ADV data structure 944 ** 945 ** Returns None 946 ** 947 *******************************************************************************/ 948 extern void BTA_DmBleSetScanRsp (tBTA_BLE_AD_MASK data_mask, tBTA_BLE_ADV_DATA *p_adv_cfg, 949 tBTA_SET_ADV_DATA_CMPL_CBACK *p_adv_data_cback) 950 { 951 tBTA_DM_API_SET_ADV_CONFIG *p_msg = osi_calloc(sizeof(*p_msg)); 952 953 p_msg->hdr.event = BTA_DM_API_BLE_SET_SCAN_RSP_EVT; 954 p_msg->data_mask = data_mask; 955 p_msg->p_adv_data_cback = p_adv_data_cback; 956 memcpy(&p_msg->adv_cfg, p_adv_cfg, sizeof(p_msg->adv_cfg)); 957 958 bta_sys_sendmsg(p_msg); 959 } 960 961 /******************************************************************************* 962 ** 963 ** Function BTA_DmBleSetStorageParams 964 ** 965 ** Description This function is called to override the BTA scan response. 966 ** 967 ** Parameters batch_scan_full_max -Max storage space (in %) allocated to full scanning 968 ** batch_scan_trunc_max -Max storage space (in %) allocated to truncated scanning 969 ** batch_scan_notify_threshold -Setup notification level based on total space 970 ** p_setup_cback - Setup callback pointer 971 ** p_thres_cback - Threshold callback pointer 972 ** p_rep_cback - Reports callback pointer 973 ** ref_value - Ref value 974 ** 975 ** Returns None 976 ** 977 *******************************************************************************/ 978 extern void BTA_DmBleSetStorageParams(UINT8 batch_scan_full_max, 979 UINT8 batch_scan_trunc_max, 980 UINT8 batch_scan_notify_threshold, 981 tBTA_BLE_SCAN_SETUP_CBACK *p_setup_cback, 982 tBTA_BLE_SCAN_THRESHOLD_CBACK *p_thres_cback, 983 tBTA_BLE_SCAN_REP_CBACK* p_rep_cback, 984 tBTA_DM_BLE_REF_VALUE ref_value) 985 { 986 tBTA_DM_API_SET_STORAGE_CONFIG *p_msg = 987 (tBTA_DM_API_SET_STORAGE_CONFIG *)osi_malloc(sizeof(tBTA_DM_API_SET_STORAGE_CONFIG)); 988 989 bta_dm_cb.p_setup_cback = p_setup_cback; 990 991 p_msg->hdr.event = BTA_DM_API_BLE_SETUP_STORAGE_EVT; 992 p_msg->p_setup_cback=bta_ble_scan_setup_cb; 993 p_msg->p_thres_cback=p_thres_cback; 994 p_msg->p_read_rep_cback=p_rep_cback; 995 p_msg->ref_value = ref_value; 996 p_msg->batch_scan_full_max = batch_scan_full_max; 997 p_msg->batch_scan_trunc_max = batch_scan_trunc_max; 998 p_msg->batch_scan_notify_threshold = batch_scan_notify_threshold; 999 1000 bta_sys_sendmsg(p_msg); 1001 } 1002 1003 /******************************************************************************* 1004 ** 1005 ** Function BTA_DmBleEnableBatchScan 1006 ** 1007 ** Description This function is called to enable the batch scan 1008 ** 1009 ** Parameters scan_mode -Batch scan mode 1010 ** scan_interval - Scan interval 1011 ** scan_window - Scan window 1012 ** discard_rule -Discard rules 1013 ** addr_type - Address type 1014 ** ref_value - Reference value 1015 ** 1016 ** Returns None 1017 ** 1018 *******************************************************************************/ 1019 extern void BTA_DmBleEnableBatchScan(tBTA_BLE_BATCH_SCAN_MODE scan_mode, 1020 UINT32 scan_interval, UINT32 scan_window, 1021 tBTA_BLE_DISCARD_RULE discard_rule, 1022 tBLE_ADDR_TYPE addr_type, 1023 tBTA_DM_BLE_REF_VALUE ref_value) 1024 { 1025 tBTA_DM_API_ENABLE_SCAN *p_msg = 1026 (tBTA_DM_API_ENABLE_SCAN *)osi_malloc(sizeof(tBTA_DM_API_ENABLE_SCAN)); 1027 1028 p_msg->hdr.event = BTA_DM_API_BLE_ENABLE_BATCH_SCAN_EVT; 1029 p_msg->scan_mode = scan_mode; 1030 p_msg->scan_int = scan_interval; 1031 p_msg->scan_window = scan_window; 1032 p_msg->discard_rule = discard_rule; 1033 p_msg->addr_type = addr_type; 1034 p_msg->ref_value = ref_value; 1035 1036 bta_sys_sendmsg(p_msg); 1037 } 1038 1039 /******************************************************************************* 1040 ** 1041 ** Function BTA_DmBleDisableBatchScan 1042 ** 1043 ** Description This function is called to disable the batch scan 1044 ** 1045 ** Parameters ref_value - Reference value 1046 ** 1047 ** Returns None 1048 ** 1049 *******************************************************************************/ 1050 extern void BTA_DmBleDisableBatchScan(tBTA_DM_BLE_REF_VALUE ref_value) 1051 { 1052 tBTA_DM_API_DISABLE_SCAN *p_msg = 1053 (tBTA_DM_API_DISABLE_SCAN *)osi_malloc(sizeof(tBTA_DM_API_DISABLE_SCAN)); 1054 1055 p_msg->hdr.event = BTA_DM_API_BLE_DISABLE_BATCH_SCAN_EVT; 1056 p_msg->ref_value = ref_value; 1057 1058 bta_sys_sendmsg(p_msg); 1059 } 1060 1061 /******************************************************************************* 1062 ** 1063 ** Function BTA_DmBleReadScanReports 1064 ** 1065 ** Description This function is called to read scan reports 1066 ** 1067 ** Parameters scan_type -Batch scan mode 1068 ** ref_value - Reference value 1069 ** 1070 ** Returns None 1071 ** 1072 *******************************************************************************/ 1073 extern void BTA_DmBleReadScanReports(tBTA_BLE_BATCH_SCAN_MODE scan_type, 1074 tBTA_DM_BLE_REF_VALUE ref_value) 1075 { 1076 tBTA_DM_API_READ_SCAN_REPORTS *p_msg = 1077 (tBTA_DM_API_READ_SCAN_REPORTS *)osi_malloc(sizeof(tBTA_DM_API_READ_SCAN_REPORTS)); 1078 1079 p_msg->hdr.event = BTA_DM_API_BLE_READ_SCAN_REPORTS_EVT; 1080 p_msg->scan_type = scan_type; 1081 p_msg->ref_value = ref_value; 1082 1083 bta_sys_sendmsg(p_msg); 1084 } 1085 1086 /******************************************************************************* 1087 ** 1088 ** Function BTA_DmBleTrackAdvertiser 1089 ** 1090 ** Description This function is called to track advertiser 1091 ** 1092 ** Parameters ref_value - Reference value 1093 ** p_track_adv_cback - Track ADV callback 1094 ** 1095 ** Returns None 1096 ** 1097 *******************************************************************************/ 1098 extern void BTA_DmBleTrackAdvertiser(tBTA_DM_BLE_REF_VALUE ref_value, 1099 tBTA_BLE_TRACK_ADV_CBACK *p_track_adv_cback) 1100 { 1101 tBTA_DM_API_TRACK_ADVERTISER *p_msg = 1102 (tBTA_DM_API_TRACK_ADVERTISER *)osi_malloc(sizeof(tBTA_DM_API_TRACK_ADVERTISER)); 1103 1104 p_msg->hdr.event = BTA_DM_API_BLE_TRACK_ADVERTISER_EVT; 1105 p_msg->p_track_adv_cback = p_track_adv_cback; 1106 p_msg->ref_value = ref_value; 1107 1108 bta_sys_sendmsg(p_msg); 1109 } 1110 1111 #endif 1112 1113 /******************************************************************************* 1114 ** BLE ADV data management API 1115 ********************************************************************************/ 1116 #if BLE_INCLUDED == TRUE 1117 1118 /******************************************************************************* 1119 ** 1120 ** Function BTA_DmBleBroadcast 1121 ** 1122 ** Description This function starts or stops LE broadcasting. 1123 ** 1124 ** Parameters start: start or stop broadcast. 1125 ** 1126 ** Returns None 1127 ** 1128 *******************************************************************************/ 1129 extern void BTA_DmBleBroadcast (BOOLEAN start) 1130 { 1131 tBTA_DM_API_BLE_OBSERVE *p_msg = 1132 (tBTA_DM_API_BLE_OBSERVE *)osi_calloc(sizeof(tBTA_DM_API_BLE_OBSERVE)); 1133 1134 APPL_TRACE_API("BTA_DmBleBroadcast: start = %d ", start); 1135 1136 p_msg->hdr.event = BTA_DM_API_BLE_BROADCAST_EVT; 1137 p_msg->start = start; 1138 1139 bta_sys_sendmsg(p_msg); 1140 } 1141 1142 #endif 1143 /******************************************************************************* 1144 ** 1145 ** Function BTA_DmBleSetBgConnType 1146 ** 1147 ** Description This function is called to set BLE connectable mode for a 1148 ** peripheral device. 1149 ** 1150 ** Parameters bg_conn_type: it can be auto connection, or selective connection. 1151 ** p_select_cback: callback function when selective connection procedure 1152 ** is being used. 1153 ** 1154 ** Returns void 1155 ** 1156 *******************************************************************************/ 1157 void BTA_DmBleSetBgConnType(tBTA_DM_BLE_CONN_TYPE bg_conn_type, tBTA_DM_BLE_SEL_CBACK *p_select_cback) 1158 { 1159 #if BLE_INCLUDED == TRUE 1160 tBTA_DM_API_BLE_SET_BG_CONN_TYPE *p_msg = 1161 (tBTA_DM_API_BLE_SET_BG_CONN_TYPE *)osi_calloc(sizeof(tBTA_DM_API_BLE_SET_BG_CONN_TYPE)); 1162 1163 p_msg->hdr.event = BTA_DM_API_BLE_SET_BG_CONN_TYPE; 1164 p_msg->bg_conn_type = bg_conn_type; 1165 p_msg->p_select_cback = p_select_cback; 1166 1167 bta_sys_sendmsg(p_msg); 1168 #endif 1169 } 1170 1171 /******************************************************************************* 1172 ** 1173 ** Function bta_dm_discover_send_msg 1174 ** 1175 ** Description This function send discover message to BTA task. 1176 ** 1177 ** Returns void 1178 ** 1179 *******************************************************************************/ 1180 #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE 1181 static void bta_dm_discover_send_msg(BD_ADDR bd_addr, tBTA_SERVICE_MASK_EXT *p_services, 1182 tBTA_DM_SEARCH_CBACK *p_cback, BOOLEAN sdp_search, 1183 tBTA_TRANSPORT transport) 1184 { 1185 const size_t len = p_services ? 1186 (sizeof(tBTA_DM_API_DISCOVER) + sizeof(tBT_UUID) * p_services->num_uuid) 1187 : sizeof(tBTA_DM_API_DISCOVER); 1188 tBTA_DM_API_DISCOVER *p_msg = (tBTA_DM_API_DISCOVER *)osi_calloc(len); 1189 1190 p_msg->hdr.event = BTA_DM_API_DISCOVER_EVT; 1191 bdcpy(p_msg->bd_addr, bd_addr); 1192 p_msg->p_cback = p_cback; 1193 p_msg->sdp_search = sdp_search; 1194 p_msg->transport = transport; 1195 1196 if (p_services != NULL) { 1197 #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE 1198 p_msg->services = p_services->srvc_mask; 1199 p_msg->num_uuid = p_services->num_uuid; 1200 if (p_services->num_uuid != 0) { 1201 p_msg->p_uuid = (tBT_UUID *)(p_msg + 1); 1202 memcpy(p_msg->p_uuid, p_services->p_uuid, 1203 sizeof(tBT_UUID) * p_services->num_uuid); 1204 } 1205 #endif 1206 } 1207 1208 bta_sys_sendmsg(p_msg); 1209 } 1210 #endif 1211 1212 /******************************************************************************* 1213 ** 1214 ** Function BTA_DmDiscoverByTransport 1215 ** 1216 ** Description This function does service discovery on particular transport 1217 ** for services of a 1218 ** peer device. When services.num_uuid is 0, it indicates all 1219 ** GATT based services are to be searched; otherwise a list of 1220 ** UUID of interested services should be provided through 1221 ** p_services->p_uuid. 1222 ** 1223 ** 1224 ** 1225 ** Returns void 1226 ** 1227 *******************************************************************************/ 1228 void BTA_DmDiscoverByTransport(BD_ADDR bd_addr, tBTA_SERVICE_MASK_EXT *p_services, 1229 tBTA_DM_SEARCH_CBACK *p_cback, BOOLEAN sdp_search, 1230 tBTA_TRANSPORT transport) 1231 { 1232 #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE 1233 bta_dm_discover_send_msg(bd_addr, p_services, p_cback, sdp_search, transport); 1234 #endif 1235 } 1236 1237 1238 /******************************************************************************* 1239 ** 1240 ** Function BTA_DmDiscoverExt 1241 ** 1242 ** Description This function does service discovery for services of a 1243 ** peer device. When services.num_uuid is 0, it indicates all 1244 ** GATT based services are to be searched; other wise a list of 1245 ** UUID of interested services should be provided through 1246 ** p_services->p_uuid. 1247 ** 1248 ** 1249 ** 1250 ** Returns void 1251 ** 1252 *******************************************************************************/ 1253 void BTA_DmDiscoverExt(BD_ADDR bd_addr, tBTA_SERVICE_MASK_EXT *p_services, 1254 tBTA_DM_SEARCH_CBACK *p_cback, BOOLEAN sdp_search) 1255 { 1256 #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE 1257 bta_dm_discover_send_msg(bd_addr, p_services, p_cback, sdp_search, BTA_TRANSPORT_UNKNOWN); 1258 #endif 1259 1260 } 1261 1262 /******************************************************************************* 1263 ** 1264 ** Function BTA_DmSearchExt 1265 ** 1266 ** Description This function searches for peer Bluetooth devices. It performs 1267 ** an inquiry and gets the remote name for devices. Service 1268 ** discovery is done if services is non zero 1269 ** 1270 ** Parameters p_dm_inq: inquiry conditions 1271 ** p_services: if service is not empty, service discovery will be done. 1272 ** for all GATT based service condition, put num_uuid, and 1273 ** p_uuid is the pointer to the list of UUID values. 1274 ** p_cback: callback functino when search is completed. 1275 ** 1276 ** 1277 ** 1278 ** Returns void 1279 ** 1280 *******************************************************************************/ 1281 void BTA_DmSearchExt(tBTA_DM_INQ *p_dm_inq, tBTA_SERVICE_MASK_EXT *p_services, tBTA_DM_SEARCH_CBACK *p_cback) 1282 { 1283 #if BLE_INCLUDED == TRUE && BTA_GATT_INCLUDED == TRUE 1284 const size_t len = p_services ? 1285 (sizeof(tBTA_DM_API_SEARCH) + sizeof(tBT_UUID) * p_services->num_uuid) 1286 : sizeof(tBTA_DM_API_SEARCH); 1287 tBTA_DM_API_SEARCH *p_msg = (tBTA_DM_API_SEARCH *)osi_calloc(len); 1288 1289 p_msg->hdr.event = BTA_DM_API_SEARCH_EVT; 1290 memcpy(&p_msg->inq_params, p_dm_inq, sizeof(tBTA_DM_INQ)); 1291 p_msg->p_cback = p_cback; 1292 p_msg->rs_res = BTA_DM_RS_NONE; 1293 1294 if (p_services != NULL) { 1295 p_msg->services = p_services->srvc_mask; 1296 p_msg->num_uuid = p_services->num_uuid; 1297 1298 if (p_services->num_uuid != 0) { 1299 p_msg->p_uuid = (tBT_UUID *)(p_msg + 1); 1300 memcpy(p_msg->p_uuid, p_services->p_uuid, 1301 sizeof(tBT_UUID) * p_services->num_uuid); 1302 } else { 1303 p_msg->p_uuid = NULL; 1304 } 1305 } 1306 1307 bta_sys_sendmsg(p_msg); 1308 #else 1309 UNUSED(p_dm_inq); 1310 UNUSED(p_services); 1311 UNUSED(p_cback); 1312 #endif 1313 } 1314 /******************************************************************************* 1315 ** 1316 ** Function BTA_DmBleUpdateConnectionParam 1317 ** 1318 ** Description Update connection parameters, can only be used when connection is up. 1319 ** 1320 ** Parameters: bd_addr - BD address of the peer 1321 ** min_int - minimum connection interval, [0x0004~ 0x4000] 1322 ** max_int - maximum connection interval, [0x0004~ 0x4000] 1323 ** latency - slave latency [0 ~ 500] 1324 ** timeout - supervision timeout [0x000a ~ 0xc80] 1325 ** 1326 ** Returns void 1327 ** 1328 *******************************************************************************/ 1329 void BTA_DmBleUpdateConnectionParam(BD_ADDR bd_addr, UINT16 min_int, 1330 UINT16 max_int, UINT16 latency, 1331 UINT16 timeout) 1332 { 1333 #if BLE_INCLUDED == TRUE 1334 tBTA_DM_API_UPDATE_CONN_PARAM *p_msg = 1335 (tBTA_DM_API_UPDATE_CONN_PARAM *)osi_calloc(sizeof(tBTA_DM_API_UPDATE_CONN_PARAM)); 1336 1337 p_msg->hdr.event = BTA_DM_API_UPDATE_CONN_PARAM_EVT; 1338 bdcpy(p_msg->bd_addr, bd_addr); 1339 p_msg->min_int = min_int; 1340 p_msg->max_int = max_int; 1341 p_msg->latency = latency; 1342 p_msg->timeout = timeout; 1343 1344 bta_sys_sendmsg(p_msg); 1345 #endif 1346 } 1347 1348 /******************************************************************************* 1349 ** 1350 ** Function BTA_DmBleConfigLocalPrivacy 1351 ** 1352 ** Description Enable/disable privacy on the local device 1353 ** 1354 ** Parameters: privacy_enable - enable/disabe privacy on remote device. 1355 ** 1356 ** Returns void 1357 ** 1358 *******************************************************************************/ 1359 void BTA_DmBleConfigLocalPrivacy(BOOLEAN privacy_enable) 1360 { 1361 #if BLE_INCLUDED == TRUE && BLE_PRIVACY_SPT == TRUE 1362 tBTA_DM_API_LOCAL_PRIVACY *p_msg = 1363 (tBTA_DM_API_LOCAL_PRIVACY *)osi_calloc(sizeof(tBTA_DM_API_ENABLE_PRIVACY)); 1364 1365 p_msg->hdr.event = BTA_DM_API_LOCAL_PRIVACY_EVT; 1366 p_msg->privacy_enable = privacy_enable; 1367 1368 bta_sys_sendmsg(p_msg); 1369 #else 1370 UNUSED (privacy_enable); 1371 #endif 1372 } 1373 1374 #if BLE_INCLUDED == TRUE 1375 /******************************************************************************* 1376 ** 1377 ** Function BTA_BleEnableAdvInstance 1378 ** 1379 ** Description This function enable a Multi-ADV instance with the specififed 1380 ** adv parameters 1381 ** 1382 ** Parameters p_params: pointer to the adv parameter structure. 1383 ** p_cback: callback function associated to this adv instance. 1384 ** p_ref: reference data pointer to this adv instance. 1385 ** 1386 ** Returns BTA_SUCCESS if command started sucessfully; otherwise failure. 1387 ** 1388 *******************************************************************************/ 1389 void BTA_BleEnableAdvInstance (tBTA_BLE_ADV_PARAMS *p_params, 1390 tBTA_BLE_MULTI_ADV_CBACK *p_cback, 1391 void *p_ref) 1392 { 1393 const size_t len = sizeof(tBTA_BLE_ADV_PARAMS) + 1394 sizeof(tBTA_DM_API_BLE_MULTI_ADV_ENB); 1395 tBTA_DM_API_BLE_MULTI_ADV_ENB *p_msg = 1396 (tBTA_DM_API_BLE_MULTI_ADV_ENB *)osi_calloc(len); 1397 1398 APPL_TRACE_API("%s", __func__); 1399 1400 p_msg->hdr.event = BTA_DM_API_BLE_MULTI_ADV_ENB_EVT; 1401 p_msg->p_cback = (void *)p_cback; 1402 if (p_params != NULL) { 1403 p_msg->p_params = (void *)(p_msg + 1); 1404 memcpy(p_msg->p_params, p_params, sizeof(tBTA_BLE_ADV_PARAMS)); 1405 } 1406 p_msg->p_ref = p_ref; 1407 1408 bta_sys_sendmsg(p_msg); 1409 } 1410 1411 /******************************************************************************* 1412 ** 1413 ** Function BTA_BleUpdateAdvInstParam 1414 ** 1415 ** Description This function update a Multi-ADV instance with the specififed 1416 ** adv parameters. 1417 ** 1418 ** Parameters inst_id: Adv instance to update the parameter. 1419 ** p_params: pointer to the adv parameter structure. 1420 ** 1421 ** Returns BTA_SUCCESS if command started sucessfully; otherwise failure. 1422 ** 1423 *******************************************************************************/ 1424 void BTA_BleUpdateAdvInstParam (UINT8 inst_id, tBTA_BLE_ADV_PARAMS *p_params) 1425 { 1426 const size_t len = sizeof(tBTA_BLE_ADV_PARAMS) + 1427 sizeof(tBTA_DM_API_BLE_MULTI_ADV_PARAM); 1428 tBTA_DM_API_BLE_MULTI_ADV_PARAM *p_msg = 1429 (tBTA_DM_API_BLE_MULTI_ADV_PARAM *)osi_calloc(len); 1430 1431 APPL_TRACE_API("%s", __func__); 1432 1433 p_msg->hdr.event = BTA_DM_API_BLE_MULTI_ADV_PARAM_UPD_EVT; 1434 p_msg->inst_id = inst_id; 1435 p_msg->p_params = (void *)(p_msg + 1); 1436 memcpy(p_msg->p_params, p_params, sizeof(tBTA_BLE_ADV_PARAMS)); 1437 1438 bta_sys_sendmsg(p_msg); 1439 } 1440 1441 /******************************************************************************* 1442 ** 1443 ** Function BTA_BleCfgAdvInstData 1444 ** 1445 ** Description This function configure a Multi-ADV instance with the specififed 1446 ** adv data or scan response data. 1447 ** 1448 ** Parameter inst_id: Adv instance to configure the adv data or scan response. 1449 ** is_scan_rsp: is the data scan response or adv data. 1450 ** data_mask: adv data type as bit mask. 1451 ** p_data: pointer to the ADV data structure tBTA_BLE_ADV_DATA. This 1452 ** memory space can not be freed until BTA_BLE_MULTI_ADV_DATA_EVT 1453 ** is sent to application. 1454 ** 1455 ** Returns BTA_SUCCESS if command started sucessfully; otherwise failure. 1456 ** 1457 *******************************************************************************/ 1458 void BTA_BleCfgAdvInstData (UINT8 inst_id, BOOLEAN is_scan_rsp, 1459 tBTA_BLE_AD_MASK data_mask, 1460 tBTA_BLE_ADV_DATA *p_data) 1461 { 1462 tBTA_DM_API_BLE_MULTI_ADV_DATA *p_msg = osi_calloc(sizeof(*p_msg)); 1463 1464 p_msg->hdr.event = BTA_DM_API_BLE_MULTI_ADV_DATA_EVT; 1465 p_msg->inst_id = inst_id; 1466 p_msg->is_scan_rsp = is_scan_rsp; 1467 p_msg->data_mask = data_mask; 1468 memcpy(&p_msg->data, p_data, sizeof(p_msg->data)); 1469 1470 bta_sys_sendmsg(p_msg); 1471 } 1472 1473 /******************************************************************************* 1474 ** 1475 ** Function BTA_BleDisableAdvInstance 1476 ** 1477 ** Description This function disable a Multi-ADV instance. 1478 ** 1479 ** Parameter inst_id: instance ID to disable. 1480 ** 1481 ** Returns BTA_SUCCESS if command started sucessfully; otherwise failure. 1482 ** 1483 *******************************************************************************/ 1484 void BTA_BleDisableAdvInstance(UINT8 inst_id) 1485 { 1486 tBTA_DM_API_BLE_MULTI_ADV_DISABLE *p_msg = 1487 (tBTA_DM_API_BLE_MULTI_ADV_DISABLE *)osi_calloc(sizeof(tBTA_DM_API_BLE_MULTI_ADV_DISABLE)); 1488 1489 APPL_TRACE_API("%s: %d", __func__, inst_id); 1490 1491 p_msg->hdr.event = BTA_DM_API_BLE_MULTI_ADV_DISABLE_EVT; 1492 p_msg->inst_id = inst_id; 1493 1494 bta_sys_sendmsg(p_msg); 1495 } 1496 1497 /******************************************************************************* 1498 ** 1499 ** Function BTA_DmBleCfgFilterCondition 1500 ** 1501 ** Description This function is called to configure the adv data payload filter 1502 ** condition. 1503 ** 1504 ** Parameters action: to read/write/clear 1505 ** cond_type: filter condition type 1506 ** filt_index - Filter index 1507 ** p_cond: filter condition parameter 1508 ** p_cmpl_back - Command completed callback 1509 ** ref_value - Reference value 1510 ** 1511 ** Returns void 1512 ** 1513 *******************************************************************************/ 1514 void BTA_DmBleCfgFilterCondition(tBTA_DM_BLE_SCAN_COND_OP action, 1515 tBTA_DM_BLE_PF_COND_TYPE cond_type, 1516 tBTA_DM_BLE_PF_FILT_INDEX filt_index, 1517 tBTA_DM_BLE_PF_COND_PARAM *p_cond, 1518 tBTA_DM_BLE_PF_CFG_CBACK *p_cmpl_cback, 1519 tBTA_DM_BLE_REF_VALUE ref_value) 1520 { 1521 #if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE 1522 tBTA_DM_API_CFG_FILTER_COND *p_msg; 1523 APPL_TRACE_API ("BTA_DmBleCfgFilterCondition: %d, %d", action, cond_type); 1524 1525 UINT16 len = sizeof(tBTA_DM_API_CFG_FILTER_COND) + 1526 sizeof(tBTA_DM_BLE_PF_COND_PARAM); 1527 UINT8 *p; 1528 1529 if (NULL != p_cond) 1530 { 1531 switch(cond_type) 1532 { 1533 case BTA_DM_BLE_PF_SRVC_DATA_PATTERN: 1534 case BTA_DM_BLE_PF_MANU_DATA: 1535 /* Length of pattern and pattern mask and other elements in */ 1536 /* tBTA_DM_BLE_PF_MANU_COND */ 1537 len += ((p_cond->manu_data.data_len) * 2) + 1538 sizeof(UINT16) + sizeof(UINT16) + sizeof(UINT8); 1539 break; 1540 1541 case BTA_DM_BLE_PF_LOCAL_NAME: 1542 len += ((p_cond->local_name.data_len) + sizeof(UINT8)); 1543 break; 1544 1545 case BTM_BLE_PF_SRVC_UUID: 1546 case BTM_BLE_PF_SRVC_SOL_UUID: 1547 len += sizeof(tBLE_BD_ADDR) + sizeof(tBTA_DM_BLE_PF_COND_MASK); 1548 break; 1549 1550 default: 1551 break; 1552 } 1553 } 1554 1555 p_msg = (tBTA_DM_API_CFG_FILTER_COND *)osi_calloc(len); 1556 p_msg->hdr.event = BTA_DM_API_CFG_FILTER_COND_EVT; 1557 p_msg->action = action; 1558 p_msg->cond_type = cond_type; 1559 p_msg->filt_index = filt_index; 1560 p_msg->p_filt_cfg_cback = p_cmpl_cback; 1561 p_msg->ref_value = ref_value; 1562 if (p_cond) { 1563 p_msg->p_cond_param = (tBTA_DM_BLE_PF_COND_PARAM *)(p_msg + 1); 1564 memcpy(p_msg->p_cond_param, p_cond, sizeof(tBTA_DM_BLE_PF_COND_PARAM)); 1565 1566 p = (UINT8 *)(p_msg->p_cond_param + 1); 1567 1568 if (cond_type == BTA_DM_BLE_PF_SRVC_DATA_PATTERN || 1569 cond_type == BTA_DM_BLE_PF_MANU_DATA) { 1570 p_msg->p_cond_param->manu_data.p_pattern = p; 1571 p_msg->p_cond_param->manu_data.data_len = p_cond->manu_data.data_len; 1572 memcpy(p_msg->p_cond_param->manu_data.p_pattern, p_cond->manu_data.p_pattern, 1573 p_cond->manu_data.data_len); 1574 p += p_cond->manu_data.data_len; 1575 1576 if (cond_type == BTA_DM_BLE_PF_MANU_DATA) { 1577 p_msg->p_cond_param->manu_data.company_id_mask = 1578 p_cond->manu_data.company_id_mask; 1579 if ( p_cond->manu_data.p_pattern_mask != NULL) { 1580 p_msg->p_cond_param->manu_data.p_pattern_mask = p; 1581 memcpy(p_msg->p_cond_param->manu_data.p_pattern_mask, 1582 p_cond->manu_data.p_pattern_mask, 1583 p_cond->manu_data.data_len); 1584 } 1585 } 1586 } else if (cond_type == BTA_DM_BLE_PF_LOCAL_NAME) { 1587 p_msg->p_cond_param->local_name.p_data = p; 1588 p_msg->p_cond_param->local_name.data_len = 1589 p_cond->local_name.data_len; 1590 memcpy(p_msg->p_cond_param->local_name.p_data, 1591 p_cond->local_name.p_data, p_cond->local_name.data_len); 1592 } else if (cond_type == BTM_BLE_PF_SRVC_UUID || 1593 cond_type == BTM_BLE_PF_SRVC_SOL_UUID) { 1594 if (p_cond->srvc_uuid.p_target_addr != NULL) { 1595 p_msg->p_cond_param->srvc_uuid.p_target_addr = (tBLE_BD_ADDR *)(p); 1596 p_msg->p_cond_param->srvc_uuid.p_target_addr->type = 1597 p_cond->srvc_uuid.p_target_addr->type; 1598 memcpy(p_msg->p_cond_param->srvc_uuid.p_target_addr->bda, 1599 p_cond->srvc_uuid.p_target_addr->bda, BD_ADDR_LEN); 1600 p = (UINT8 *)(p_msg->p_cond_param->srvc_uuid.p_target_addr + 1); 1601 } 1602 if (p_cond->srvc_uuid.p_uuid_mask) { 1603 p_msg->p_cond_param->srvc_uuid.p_uuid_mask = (tBTA_DM_BLE_PF_COND_MASK *)p; 1604 memcpy(p_msg->p_cond_param->srvc_uuid.p_uuid_mask, 1605 p_cond->srvc_uuid.p_uuid_mask, 1606 sizeof(tBTA_DM_BLE_PF_COND_MASK)); 1607 } 1608 } 1609 } 1610 1611 bta_sys_sendmsg(p_msg); 1612 1613 #else 1614 UNUSED(action); 1615 UNUSED(cond_type); 1616 UNUSED(filt_index); 1617 UNUSED(p_cond); 1618 UNUSED(p_cmpl_cback); 1619 UNUSED(ref_value); 1620 #endif 1621 } 1622 1623 /******************************************************************************* 1624 ** 1625 ** Function BTA_DmBleScanFilterSetup 1626 ** 1627 ** Description This function is called to setup the adv data payload filter param 1628 ** 1629 ** Parameters p_target: enable the filter condition on a target device; if NULL 1630 ** filt_index - Filter index 1631 ** p_filt_params -Filter parameters 1632 ** ref_value - Reference value 1633 ** action - Add, delete or clear 1634 ** p_cmpl_back - Command completed callback 1635 ** 1636 ** Returns void 1637 ** 1638 *******************************************************************************/ 1639 void BTA_DmBleScanFilterSetup(UINT8 action, 1640 tBTA_DM_BLE_PF_FILT_INDEX filt_index, 1641 tBTA_DM_BLE_PF_FILT_PARAMS *p_filt_params, 1642 tBLE_BD_ADDR *p_target, 1643 tBTA_DM_BLE_PF_PARAM_CBACK *p_cmpl_cback, 1644 tBTA_DM_BLE_REF_VALUE ref_value) 1645 { 1646 #if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE 1647 const size_t len = sizeof(tBTA_DM_API_SCAN_FILTER_PARAM_SETUP) + 1648 sizeof(tBLE_BD_ADDR); 1649 tBTA_DM_API_SCAN_FILTER_PARAM_SETUP *p_msg = 1650 (tBTA_DM_API_SCAN_FILTER_PARAM_SETUP *)osi_calloc(len); 1651 1652 APPL_TRACE_API("%s: %d", __func__, action); 1653 1654 p_msg->hdr.event = BTA_DM_API_SCAN_FILTER_SETUP_EVT; 1655 p_msg->action = action; 1656 p_msg->filt_index = filt_index; 1657 if (p_filt_params) { 1658 memcpy(&p_msg->filt_params, p_filt_params, 1659 sizeof(tBTA_DM_BLE_PF_FILT_PARAMS)); 1660 } 1661 p_msg->p_filt_param_cback = p_cmpl_cback; 1662 p_msg->ref_value = ref_value; 1663 1664 if (p_target) { 1665 p_msg->p_target = (tBLE_BD_ADDR *)(p_msg + 1); 1666 memcpy(p_msg->p_target, p_target, sizeof(tBLE_BD_ADDR)); 1667 } 1668 1669 bta_sys_sendmsg(p_msg); 1670 1671 #else 1672 UNUSED(action); 1673 UNUSED(filt_index); 1674 UNUSED(p_filt_params); 1675 UNUSED(p_target); 1676 UNUSED(p_cmpl_cback); 1677 UNUSED(ref_value); 1678 #endif 1679 } 1680 1681 /******************************************************************************* 1682 ** 1683 ** Function BTA_DmBleGetEnergyInfo 1684 ** 1685 ** Description This function is called to obtain the energy info 1686 ** 1687 ** Parameters p_cmpl_cback - Command complete callback 1688 ** 1689 ** Returns void 1690 ** 1691 *******************************************************************************/ 1692 void BTA_DmBleGetEnergyInfo(tBTA_BLE_ENERGY_INFO_CBACK *p_cmpl_cback) 1693 { 1694 const size_t len = sizeof(tBTA_DM_API_ENERGY_INFO) + sizeof(tBLE_BD_ADDR); 1695 tBTA_DM_API_ENERGY_INFO *p_msg = (tBTA_DM_API_ENERGY_INFO *)osi_calloc(len); 1696 1697 APPL_TRACE_API("%s", __func__); 1698 1699 p_msg->hdr.event = BTA_DM_API_BLE_ENERGY_INFO_EVT; 1700 p_msg->p_energy_info_cback = p_cmpl_cback; 1701 1702 bta_sys_sendmsg(p_msg); 1703 } 1704 1705 /******************************************************************************* 1706 ** 1707 ** Function BTA_DmEnableScanFilter 1708 ** 1709 ** Description This function is called to enable the adv data payload filter 1710 ** 1711 ** Parameters action - enable or disable the APCF feature 1712 ** p_cmpl_cback - Command completed callback 1713 ** ref_value - Reference value 1714 ** 1715 ** Returns void 1716 ** 1717 *******************************************************************************/ 1718 void BTA_DmEnableScanFilter(UINT8 action, tBTA_DM_BLE_PF_STATUS_CBACK *p_cmpl_cback, 1719 tBTA_DM_BLE_REF_VALUE ref_value) 1720 { 1721 #if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE 1722 const size_t len = sizeof(tBTA_DM_API_ENABLE_SCAN_FILTER) + 1723 sizeof(tBLE_BD_ADDR); 1724 tBTA_DM_API_ENABLE_SCAN_FILTER *p_msg = 1725 (tBTA_DM_API_ENABLE_SCAN_FILTER *)osi_calloc(len); 1726 1727 APPL_TRACE_API("%s: %d", __func__, action); 1728 1729 p_msg->hdr.event = BTA_DM_API_SCAN_FILTER_ENABLE_EVT; 1730 p_msg->action = action; 1731 p_msg->ref_value = ref_value; 1732 p_msg->p_filt_status_cback = p_cmpl_cback; 1733 1734 bta_sys_sendmsg(p_msg); 1735 1736 #else 1737 UNUSED(action); 1738 UNUSED(p_cmpl_cback); 1739 UNUSED(ref_value); 1740 #endif 1741 } 1742 1743 /******************************************************************************* 1744 ** 1745 ** Function BTA_DmBleUpdateConnectionParams 1746 ** 1747 ** Description Update connection parameters, can only be used when connection is up. 1748 ** 1749 ** Parameters: bd_addr - BD address of the peer 1750 ** min_int - minimum connection interval, [0x0004~ 0x4000] 1751 ** max_int - maximum connection interval, [0x0004~ 0x4000] 1752 ** latency - slave latency [0 ~ 500] 1753 ** timeout - supervision timeout [0x000a ~ 0xc80] 1754 ** 1755 ** Returns void 1756 ** 1757 *******************************************************************************/ 1758 void BTA_DmBleUpdateConnectionParams(BD_ADDR bd_addr, UINT16 min_int, UINT16 max_int, 1759 UINT16 latency, UINT16 timeout) 1760 { 1761 tBTA_DM_API_UPDATE_CONN_PARAM *p_msg = 1762 (tBTA_DM_API_UPDATE_CONN_PARAM *)osi_calloc(sizeof(tBTA_DM_API_UPDATE_CONN_PARAM)); 1763 1764 p_msg->hdr.event = BTA_DM_API_UPDATE_CONN_PARAM_EVT; 1765 bdcpy(p_msg->bd_addr, bd_addr); 1766 p_msg->min_int = min_int; 1767 p_msg->max_int = max_int; 1768 p_msg->latency = latency; 1769 p_msg->timeout = timeout; 1770 1771 bta_sys_sendmsg(p_msg); 1772 } 1773 1774 /******************************************************************************* 1775 ** 1776 ** Function BTA_DmBleSetDataLength 1777 ** 1778 ** Description This function is to set maximum LE data packet size 1779 ** 1780 ** Returns void 1781 ** 1782 ** 1783 *******************************************************************************/ 1784 void BTA_DmBleSetDataLength(BD_ADDR remote_device, UINT16 tx_data_length) 1785 { 1786 tBTA_DM_API_BLE_SET_DATA_LENGTH *p_msg = 1787 (tBTA_DM_API_BLE_SET_DATA_LENGTH *)osi_malloc(sizeof(tBTA_DM_API_BLE_SET_DATA_LENGTH)); 1788 1789 bdcpy(p_msg->remote_bda, remote_device); 1790 p_msg->hdr.event = BTA_DM_API_SET_DATA_LENGTH_EVT; 1791 p_msg->tx_data_length = tx_data_length; 1792 1793 bta_sys_sendmsg(p_msg); 1794 } 1795 1796 #endif 1797 1798 /******************************************************************************* 1799 ** 1800 ** Function BTA_DmSetEncryption 1801 ** 1802 ** Description This function is called to ensure that connection is 1803 ** encrypted. Should be called only on an open connection. 1804 ** Typically only needed for connections that first want to 1805 ** bring up unencrypted links, then later encrypt them. 1806 ** 1807 ** Parameters: bd_addr - Address of the peer device 1808 ** transport - transport of the link to be encruypted 1809 ** p_callback - Pointer to callback function to indicat the 1810 ** link encryption status 1811 ** sec_act - This is the security action to indicate 1812 ** what knid of BLE security level is required for 1813 ** the BLE link if the BLE is supported 1814 ** Note: This parameter is ignored for the BR/EDR link 1815 ** or the BLE is not supported 1816 ** 1817 ** Returns void 1818 ** 1819 *******************************************************************************/ 1820 void BTA_DmSetEncryption(BD_ADDR bd_addr, tBTA_TRANSPORT transport, tBTA_DM_ENCRYPT_CBACK *p_callback, 1821 tBTA_DM_BLE_SEC_ACT sec_act) 1822 { 1823 tBTA_DM_API_SET_ENCRYPTION *p_msg = (tBTA_DM_API_SET_ENCRYPTION *)osi_calloc(sizeof(tBTA_DM_API_SET_ENCRYPTION)); 1824 1825 APPL_TRACE_API("%s", __func__); 1826 1827 p_msg->hdr.event = BTA_DM_API_SET_ENCRYPTION_EVT; 1828 memcpy(p_msg->bd_addr, bd_addr, BD_ADDR_LEN); 1829 p_msg->transport = transport; 1830 p_msg->p_callback = p_callback; 1831 p_msg->sec_act = sec_act; 1832 1833 bta_sys_sendmsg(p_msg); 1834 } 1835 1836 /******************************************************************************* 1837 ** 1838 ** Function BTA_DmCloseACL 1839 ** 1840 ** Description This function force to close an ACL connection and remove the 1841 ** device from the security database list of known devices. 1842 ** 1843 ** Parameters: bd_addr - Address of the peer device 1844 ** remove_dev - remove device or not after link down 1845 ** 1846 ** Returns void 1847 ** 1848 *******************************************************************************/ 1849 void BTA_DmCloseACL(BD_ADDR bd_addr, BOOLEAN remove_dev, tBTA_TRANSPORT transport) 1850 { 1851 tBTA_DM_API_REMOVE_ACL *p_msg = 1852 (tBTA_DM_API_REMOVE_ACL *)osi_calloc(sizeof(tBTA_DM_API_REMOVE_ACL)); 1853 1854 APPL_TRACE_API("%s", __func__); 1855 1856 p_msg->hdr.event = BTA_DM_API_REMOVE_ACL_EVT; 1857 memcpy(p_msg->bd_addr, bd_addr, BD_ADDR_LEN); 1858 p_msg->remove_dev = remove_dev; 1859 p_msg->transport = transport; 1860 1861 bta_sys_sendmsg(p_msg); 1862 } 1863 1864 #if BLE_INCLUDED == TRUE 1865 /******************************************************************************* 1866 ** 1867 ** Function BTA_DmBleObserve 1868 ** 1869 ** Description This procedure keep the device listening for advertising 1870 ** events from a broadcast device. 1871 ** 1872 ** Parameters start: start or stop observe. 1873 ** 1874 ** Returns void 1875 1876 ** 1877 ** Returns void. 1878 ** 1879 *******************************************************************************/ 1880 extern void BTA_DmBleObserve(BOOLEAN start, UINT8 duration, 1881 tBTA_DM_SEARCH_CBACK *p_results_cb) 1882 { 1883 tBTA_DM_API_BLE_OBSERVE *p_msg = 1884 (tBTA_DM_API_BLE_OBSERVE *)osi_calloc(sizeof(tBTA_DM_API_BLE_OBSERVE)); 1885 1886 APPL_TRACE_API("%s:start = %d ", __func__, start); 1887 1888 p_msg->hdr.event = BTA_DM_API_BLE_OBSERVE_EVT; 1889 p_msg->start = start; 1890 p_msg->duration = duration; 1891 p_msg->p_cback = p_results_cb; 1892 1893 bta_sys_sendmsg(p_msg); 1894 } 1895 1896 /******************************************************************************* 1897 ** 1898 ** Function BTA_VendorInit 1899 ** 1900 ** Description This function initializes vendor specific 1901 ** 1902 ** Returns void 1903 ** 1904 *******************************************************************************/ 1905 void BTA_VendorInit (void) 1906 { 1907 APPL_TRACE_API("BTA_VendorInit"); 1908 } 1909 1910 /******************************************************************************* 1911 ** 1912 ** Function BTA_VendorCleanup 1913 ** 1914 ** Description This function frees up Broadcom specific VS specific dynamic memory 1915 ** 1916 ** Returns void 1917 ** 1918 *******************************************************************************/ 1919 void BTA_VendorCleanup (void) 1920 { 1921 tBTM_BLE_VSC_CB cmn_ble_vsc_cb; 1922 BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb); 1923 1924 #if (BLE_INCLUDED == TRUE && BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE) 1925 if (cmn_ble_vsc_cb.max_filter > 0) 1926 { 1927 btm_ble_adv_filter_cleanup(); 1928 #if BLE_PRIVACY_SPT == TRUE 1929 btm_ble_resolving_list_cleanup (); 1930 #endif 1931 } 1932 1933 if (cmn_ble_vsc_cb.tot_scan_results_strg > 0) 1934 btm_ble_batchscan_cleanup(); 1935 #endif 1936 1937 if(cmn_ble_vsc_cb.adv_inst_max > 0) 1938 btm_ble_multi_adv_cleanup(); 1939 } 1940 1941 #endif 1942