1/****************************************************************************** 2 * 3 * Copyright (C) 2009-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 * Filename: btif_core.c 22 * 23 * Description: Contains core functionality related to interfacing between 24 * Bluetooth HAL and BTE core stack. 25 * 26 ***********************************************************************************/ 27 28#include <stdlib.h> 29#include <hardware/bluetooth.h> 30#include <string.h> 31#include <sys/types.h> 32#include <sys/stat.h> 33#include <fcntl.h> 34#include <dirent.h> 35#include <ctype.h> 36#include <cutils/properties.h> 37 38#define LOG_TAG "BTIF_CORE" 39#include "btif_api.h" 40#include "bta_api.h" 41#include "gki.h" 42#include "btu.h" 43#include "bte.h" 44#include "bd.h" 45#include "btif_av.h" 46#include "btif_storage.h" 47#include "btif_util.h" 48#include "btif_sock.h" 49#include "btif_pan.h" 50#include "btif_profile_queue.h" 51#include "btif_config.h" 52/************************************************************************************ 53** Constants & Macros 54************************************************************************************/ 55 56#ifndef BTIF_TASK_STACK_SIZE 57#define BTIF_TASK_STACK_SIZE 0x2000 /* In bytes */ 58#endif 59 60#ifndef BTE_DID_CONF_FILE 61#define BTE_DID_CONF_FILE "/etc/bluetooth/bt_did.conf" 62#endif 63 64#define BTIF_TASK_STR ((INT8 *) "BTIF") 65 66/************************************************************************************ 67** Local type definitions 68************************************************************************************/ 69 70/* These type definitions are used when passing data from the HAL to BTIF context 71* in the downstream path for the adapter and remote_device property APIs */ 72 73typedef struct { 74 bt_bdaddr_t bd_addr; 75 bt_property_type_t type; 76} btif_storage_read_t; 77 78typedef struct { 79 bt_bdaddr_t bd_addr; 80 bt_property_t prop; 81} btif_storage_write_t; 82 83typedef union { 84 btif_storage_read_t read_req; 85 btif_storage_write_t write_req; 86} btif_storage_req_t; 87 88typedef enum { 89 BTIF_CORE_STATE_DISABLED = 0, 90 BTIF_CORE_STATE_ENABLING, 91 BTIF_CORE_STATE_ENABLED, 92 BTIF_CORE_STATE_DISABLING 93} btif_core_state_t; 94 95/************************************************************************************ 96** Static variables 97************************************************************************************/ 98 99bt_bdaddr_t btif_local_bd_addr; 100 101static UINT32 btif_task_stack[(BTIF_TASK_STACK_SIZE + 3) / 4]; 102 103/* holds main adapter state */ 104static btif_core_state_t btif_core_state = BTIF_CORE_STATE_DISABLED; 105 106static int btif_shutdown_pending = 0; 107static tBTA_SERVICE_MASK btif_enabled_services = 0; 108 109/* 110* This variable should be set to 1, if the Bluedroid+BTIF libraries are to 111* function in DUT mode. 112* 113* To set this, the btif_init_bluetooth needs to be called with argument as 1 114*/ 115static UINT8 btif_dut_mode = 0; 116 117/************************************************************************************ 118** Static functions 119************************************************************************************/ 120static bt_status_t btif_associate_evt(void); 121static bt_status_t btif_disassociate_evt(void); 122 123/* sends message to btif task */ 124static void btif_sendmsg(void *p_msg); 125 126/************************************************************************************ 127** Externs 128************************************************************************************/ 129extern void bte_load_did_conf(const char *p_path); 130 131/** TODO: Move these to _common.h */ 132void bte_main_boot_entry(void); 133void bte_main_enable(); 134void bte_main_disable(void); 135void bte_main_shutdown(void); 136#if (defined(HCILP_INCLUDED) && HCILP_INCLUDED == TRUE) 137void bte_main_enable_lpm(BOOLEAN enable); 138#endif 139void bte_main_postload_cfg(void); 140void btif_dm_execute_service_request(UINT16 event, char *p_param); 141#ifdef BTIF_DM_OOB_TEST 142void btif_dm_load_local_oob(void); 143#endif 144void bte_main_config_hci_logging(BOOLEAN enable, BOOLEAN bt_disabled); 145 146/************************************************************************************ 147** Functions 148************************************************************************************/ 149 150 151/***************************************************************************** 152** Context switching functions 153*****************************************************************************/ 154 155 156/******************************************************************************* 157** 158** Function btif_context_switched 159** 160** Description Callback used to execute transferred context callback 161** 162** p_msg : message to be executed in btif context 163** 164** Returns void 165** 166*******************************************************************************/ 167 168static void btif_context_switched(void *p_msg) 169{ 170 tBTIF_CONTEXT_SWITCH_CBACK *p; 171 172 BTIF_TRACE_VERBOSE0("btif_context_switched"); 173 174 p = (tBTIF_CONTEXT_SWITCH_CBACK *) p_msg; 175 176 /* each callback knows how to parse the data */ 177 if (p->p_cb) 178 p->p_cb(p->event, p->p_param); 179} 180 181 182/******************************************************************************* 183** 184** Function btif_transfer_context 185** 186** Description This function switches context to btif task 187** 188** p_cback : callback used to process message in btif context 189** event : event id of message 190** p_params : parameter area passed to callback (copied) 191** param_len : length of parameter area 192** p_copy_cback : If set this function will be invoked for deep copy 193** 194** Returns void 195** 196*******************************************************************************/ 197 198bt_status_t btif_transfer_context (tBTIF_CBACK *p_cback, UINT16 event, char* p_params, int param_len, tBTIF_COPY_CBACK *p_copy_cback) 199{ 200 tBTIF_CONTEXT_SWITCH_CBACK *p_msg; 201 202 BTIF_TRACE_VERBOSE2("btif_transfer_context event %d, len %d", event, param_len); 203 204 /* allocate and send message that will be executed in btif context */ 205 if ((p_msg = (tBTIF_CONTEXT_SWITCH_CBACK *) GKI_getbuf(sizeof(tBTIF_CONTEXT_SWITCH_CBACK) + param_len)) != NULL) 206 { 207 p_msg->hdr.event = BT_EVT_CONTEXT_SWITCH_EVT; /* internal event */ 208 p_msg->p_cb = p_cback; 209 210 p_msg->event = event; /* callback event */ 211 212 /* check if caller has provided a copy callback to do the deep copy */ 213 if (p_copy_cback) 214 { 215 p_copy_cback(event, p_msg->p_param, p_params); 216 } 217 else if (p_params) 218 { 219 memcpy(p_msg->p_param, p_params, param_len); /* callback parameter data */ 220 } 221 222 btif_sendmsg(p_msg); 223 return BT_STATUS_SUCCESS; 224 } 225 else 226 { 227 /* let caller deal with a failed allocation */ 228 return BT_STATUS_NOMEM; 229 } 230} 231 232/******************************************************************************* 233** 234** Function btif_is_dut_mode 235** 236** Description checks if BTIF is currently in DUT mode 237** 238** Returns 1 if test mode, otherwize 0 239** 240*******************************************************************************/ 241 242UINT8 btif_is_dut_mode(void) 243{ 244 return (btif_dut_mode == 1); 245} 246 247/******************************************************************************* 248** 249** Function btif_is_enabled 250** 251** Description checks if main adapter is fully enabled 252** 253** Returns 1 if fully enabled, otherwize 0 254** 255*******************************************************************************/ 256 257int btif_is_enabled(void) 258{ 259 return ((!btif_is_dut_mode()) && (btif_core_state == BTIF_CORE_STATE_ENABLED)); 260} 261 262/******************************************************************************* 263** 264** Function btif_task 265** 266** Description BTIF task handler managing all messages being passed 267** Bluetooth HAL and BTA. 268** 269** Returns void 270** 271*******************************************************************************/ 272 273static void btif_task(UINT32 params) 274{ 275 UINT16 event; 276 BT_HDR *p_msg; 277 278 BTIF_TRACE_DEBUG0("btif task starting"); 279 280 btif_associate_evt(); 281 282 for(;;) 283 { 284 /* wait for specified events */ 285 event = GKI_wait(0xFFFF, 0); 286 287 /* 288 * Wait for the trigger to init chip and stack. This trigger will 289 * be received by btu_task once the UART is opened and ready 290 */ 291 if (event == BT_EVT_TRIGGER_STACK_INIT) 292 { 293 BTIF_TRACE_DEBUG0("btif_task: received trigger stack init event"); 294 #if (BLE_INCLUDED == TRUE) 295 btif_dm_load_ble_local_keys(); 296 #endif 297 BTA_EnableBluetooth(bte_dm_evt); 298 } 299 300 /* 301 * Failed to initialize controller hardware, reset state and bring 302 * down all threads 303 */ 304 if (event == BT_EVT_HARDWARE_INIT_FAIL) 305 { 306 BTIF_TRACE_DEBUG0("btif_task: hardware init failed"); 307 bte_main_disable(); 308 btif_queue_release(); 309 GKI_task_self_cleanup(BTIF_TASK); 310 bte_main_shutdown(); 311 btif_dut_mode = 0; 312 btif_core_state = BTIF_CORE_STATE_DISABLED; 313 HAL_CBACK(bt_hal_cbacks,adapter_state_changed_cb,BT_STATE_OFF); 314 break; 315 } 316 317 if (event & EVENT_MASK(GKI_SHUTDOWN_EVT)) 318 break; 319 320 if(event & TASK_MBOX_1_EVT_MASK) 321 { 322 while((p_msg = GKI_read_mbox(BTU_BTIF_MBOX)) != NULL) 323 { 324 BTIF_TRACE_VERBOSE1("btif task fetched event %x", p_msg->event); 325 326 switch (p_msg->event) 327 { 328 case BT_EVT_CONTEXT_SWITCH_EVT: 329 btif_context_switched(p_msg); 330 break; 331 default: 332 BTIF_TRACE_ERROR1("unhandled btif event (%d)", p_msg->event & BT_EVT_MASK); 333 break; 334 } 335 336 GKI_freebuf(p_msg); 337 } 338 } 339 } 340 341 btif_disassociate_evt(); 342 343 BTIF_TRACE_DEBUG0("btif task exiting"); 344} 345 346 347/******************************************************************************* 348** 349** Function btif_sendmsg 350** 351** Description Sends msg to BTIF task 352** 353** Returns void 354** 355*******************************************************************************/ 356 357void btif_sendmsg(void *p_msg) 358{ 359 GKI_send_msg(BTIF_TASK, BTU_BTIF_MBOX, p_msg); 360} 361 362static void btif_fetch_local_bdaddr(bt_bdaddr_t *local_addr) 363{ 364 char val[256]; 365 uint8_t valid_bda = FALSE; 366 int val_size = 0; 367 const uint8_t null_bdaddr[BD_ADDR_LEN] = {0,0,0,0,0,0}; 368 369 /* Get local bdaddr storage path from property */ 370 if (property_get(PROPERTY_BT_BDADDR_PATH, val, NULL)) 371 { 372 int addr_fd; 373 374 BTIF_TRACE_DEBUG1("local bdaddr is stored in %s", val); 375 376 if ((addr_fd = open(val, O_RDONLY)) != -1) 377 { 378 memset(val, 0, sizeof(val)); 379 read(addr_fd, val, FACTORY_BT_BDADDR_STORAGE_LEN); 380 str2bd(val, local_addr); 381 /* If this is not a reserved/special bda, then use it */ 382 if (memcmp(local_addr->address, null_bdaddr, BD_ADDR_LEN) != 0) 383 { 384 valid_bda = TRUE; 385 BTIF_TRACE_DEBUG6("Got Factory BDA %02X:%02X:%02X:%02X:%02X:%02X", 386 local_addr->address[0], local_addr->address[1], local_addr->address[2], 387 local_addr->address[3], local_addr->address[4], local_addr->address[5]); 388 } 389 390 close(addr_fd); 391 } 392 } 393 394 if(!valid_bda) 395 { 396 val_size = sizeof(val); 397 if(btif_config_get_str("Local", "Adapter", "Address", val, &val_size)) 398 { 399 str2bd(val, local_addr); 400 BTIF_TRACE_DEBUG1("local bdaddr from bt_config.xml is %s", val); 401 return; 402 } 403 } 404 405 /* No factory BDADDR found. Look for previously generated random BDA */ 406 if ((!valid_bda) && \ 407 (property_get(PERSIST_BDADDR_PROPERTY, val, NULL))) 408 { 409 str2bd(val, local_addr); 410 valid_bda = TRUE; 411 BTIF_TRACE_DEBUG6("Got prior random BDA %02X:%02X:%02X:%02X:%02X:%02X", 412 local_addr->address[0], local_addr->address[1], local_addr->address[2], 413 local_addr->address[3], local_addr->address[4], local_addr->address[5]); 414 } 415 416 /* Generate new BDA if necessary */ 417 if (!valid_bda) 418 { 419 bdstr_t bdstr; 420 /* Seed the random number generator */ 421 srand((unsigned int) (time(0))); 422 423 /* No autogen BDA. Generate one now. */ 424 local_addr->address[0] = 0x22; 425 local_addr->address[1] = 0x22; 426 local_addr->address[2] = (uint8_t) ((rand() >> 8) & 0xFF); 427 local_addr->address[3] = (uint8_t) ((rand() >> 8) & 0xFF); 428 local_addr->address[4] = (uint8_t) ((rand() >> 8) & 0xFF); 429 local_addr->address[5] = (uint8_t) ((rand() >> 8) & 0xFF); 430 431 /* Convert to ascii, and store as a persistent property */ 432 bd2str(local_addr, &bdstr); 433 434 BTIF_TRACE_DEBUG2("No preset BDA. Generating BDA: %s for prop %s", 435 (char*)bdstr, PERSIST_BDADDR_PROPERTY); 436 437 if (property_set(PERSIST_BDADDR_PROPERTY, (char*)bdstr) < 0) 438 BTIF_TRACE_ERROR1("Failed to set random BDA in prop %s",PERSIST_BDADDR_PROPERTY); 439 } 440 441 //save the bd address to config file 442 bdstr_t bdstr; 443 bd2str(local_addr, &bdstr); 444 val_size = sizeof(val); 445 if (btif_config_get_str("Local", "Adapter", "Address", val, &val_size)) 446 { 447 if (strcmp(bdstr, val) ==0) 448 { 449 // BDA is already present in the config file. 450 return; 451 } 452 } 453 btif_config_set_str("Local", "Adapter", "Address", bdstr); 454 btif_config_save(); 455} 456 457/***************************************************************************** 458** 459** btif core api functions 460** 461*****************************************************************************/ 462 463/******************************************************************************* 464** 465** Function btif_init_bluetooth 466** 467** Description Creates BTIF task and prepares BT scheduler for startup 468** 469** Returns bt_status_t 470** 471*******************************************************************************/ 472 473bt_status_t btif_init_bluetooth() 474{ 475 UINT8 status; 476 btif_config_init(); 477 bte_main_boot_entry(); 478 479 /* As part of the init, fetch the local BD ADDR */ 480 memset(&btif_local_bd_addr, 0, sizeof(bt_bdaddr_t)); 481 btif_fetch_local_bdaddr(&btif_local_bd_addr); 482 483 /* start btif task */ 484 status = GKI_create_task(btif_task, BTIF_TASK, BTIF_TASK_STR, 485 (UINT16 *) ((UINT8 *)btif_task_stack + BTIF_TASK_STACK_SIZE), 486 sizeof(btif_task_stack)); 487 488 if (status != GKI_SUCCESS) 489 return BT_STATUS_FAIL; 490 491 return BT_STATUS_SUCCESS; 492} 493 494/******************************************************************************* 495** 496** Function btif_associate_evt 497** 498** Description Event indicating btif_task is up 499** Attach btif_task to JVM 500** 501** Returns void 502** 503*******************************************************************************/ 504 505static bt_status_t btif_associate_evt(void) 506{ 507 BTIF_TRACE_DEBUG1("%s: notify ASSOCIATE_JVM", __FUNCTION__); 508 HAL_CBACK(bt_hal_cbacks, thread_evt_cb, ASSOCIATE_JVM); 509 510 return BT_STATUS_SUCCESS; 511} 512 513 514/******************************************************************************* 515** 516** Function btif_enable_bluetooth 517** 518** Description Performs chip power on and kickstarts OS scheduler 519** 520** Returns bt_status_t 521** 522*******************************************************************************/ 523 524bt_status_t btif_enable_bluetooth(void) 525{ 526 BTIF_TRACE_DEBUG0("BTIF ENABLE BLUETOOTH"); 527 528 if (btif_core_state != BTIF_CORE_STATE_DISABLED) 529 { 530 ALOGD("not disabled\n"); 531 return BT_STATUS_DONE; 532 } 533 534 btif_core_state = BTIF_CORE_STATE_ENABLING; 535 536 /* Create the GKI tasks and run them */ 537 bte_main_enable(); 538 539 return BT_STATUS_SUCCESS; 540} 541 542 543/******************************************************************************* 544** 545** Function btif_enable_bluetooth_evt 546** 547** Description Event indicating bluetooth enable is completed 548** Notifies HAL user with updated adapter state 549** 550** Returns void 551** 552*******************************************************************************/ 553 554void btif_enable_bluetooth_evt(tBTA_STATUS status, BD_ADDR local_bd) 555{ 556 bt_bdaddr_t bd_addr; 557 bdstr_t bdstr; 558 559 bdcpy(bd_addr.address, local_bd); 560 BTIF_TRACE_DEBUG3("%s: status %d, local bd [%s]", __FUNCTION__, status, 561 bd2str(&bd_addr, &bdstr)); 562 563 if (bdcmp(btif_local_bd_addr.address,local_bd)) 564 { 565 bdstr_t buf; 566 bt_property_t prop; 567 568 /** 569 * The Controller's BDADDR does not match to the BTIF's initial BDADDR! 570 * This could be because the factory BDADDR was stored separatley in 571 * the Controller's non-volatile memory rather than in device's file 572 * system. 573 **/ 574 BTIF_TRACE_WARNING0("***********************************************"); 575 BTIF_TRACE_WARNING6("BTIF init BDA was %02X:%02X:%02X:%02X:%02X:%02X", 576 btif_local_bd_addr.address[0], btif_local_bd_addr.address[1], 577 btif_local_bd_addr.address[2], btif_local_bd_addr.address[3], 578 btif_local_bd_addr.address[4], btif_local_bd_addr.address[5]); 579 BTIF_TRACE_WARNING6("Controller BDA is %02X:%02X:%02X:%02X:%02X:%02X", 580 local_bd[0], local_bd[1], local_bd[2], 581 local_bd[3], local_bd[4], local_bd[5]); 582 BTIF_TRACE_WARNING0("***********************************************"); 583 584 bdcpy(btif_local_bd_addr.address, local_bd); 585 586 //save the bd address to config file 587 bd2str(&btif_local_bd_addr, &buf); 588 btif_config_set_str("Local", "Adapter", "Address", buf); 589 btif_config_save(); 590 591 //fire HAL callback for property change 592 memcpy(buf, &btif_local_bd_addr, sizeof(bt_bdaddr_t)); 593 prop.type = BT_PROPERTY_BDADDR; 594 prop.val = (void*)buf; 595 prop.len = sizeof(bt_bdaddr_t); 596 HAL_CBACK(bt_hal_cbacks, adapter_properties_cb, BT_STATUS_SUCCESS, 1, &prop); 597 } 598 599 bte_main_postload_cfg(); 600#if (defined(HCILP_INCLUDED) && HCILP_INCLUDED == TRUE) 601 bte_main_enable_lpm(TRUE); 602#endif 603 /* add passing up bd address as well ? */ 604 605 /* callback to HAL */ 606 if (status == BTA_SUCCESS) 607 { 608 /* initialize a2dp service */ 609 btif_av_init(); 610 611 /* init rfcomm & l2cap api */ 612 btif_sock_init(); 613 614 /* init pan */ 615 btif_pan_init(); 616 617 /* load did configuration */ 618 bte_load_did_conf(BTE_DID_CONF_FILE); 619 620#ifdef BTIF_DM_OOB_TEST 621 btif_dm_load_local_oob(); 622#endif 623 /* now fully enabled, update state */ 624 btif_core_state = BTIF_CORE_STATE_ENABLED; 625 626 HAL_CBACK(bt_hal_cbacks, adapter_state_changed_cb, BT_STATE_ON); 627 } 628 else 629 { 630 /* cleanup rfcomm & l2cap api */ 631 btif_sock_cleanup(); 632 633 btif_pan_cleanup(); 634 635 /* we failed to enable, reset state */ 636 btif_core_state = BTIF_CORE_STATE_DISABLED; 637 638 HAL_CBACK(bt_hal_cbacks, adapter_state_changed_cb, BT_STATE_OFF); 639 } 640} 641 642/******************************************************************************* 643** 644** Function btif_disable_bluetooth 645** 646** Description Inititates shutdown of Bluetooth system. 647** Any active links will be dropped and device entering 648** non connectable/discoverable mode 649** 650** Returns void 651** 652*******************************************************************************/ 653bt_status_t btif_disable_bluetooth(void) 654{ 655 tBTA_STATUS status; 656 657 if (!btif_is_enabled()) 658 { 659 BTIF_TRACE_ERROR0("btif_disable_bluetooth : not yet enabled"); 660 return BT_STATUS_NOT_READY; 661 } 662 663 BTIF_TRACE_DEBUG0("BTIF DISABLE BLUETOOTH"); 664 665 btif_dm_on_disable(); 666 btif_core_state = BTIF_CORE_STATE_DISABLING; 667 668 /* cleanup rfcomm & l2cap api */ 669 btif_sock_cleanup(); 670 671 btif_pan_cleanup(); 672 673 status = BTA_DisableBluetooth(); 674 675 btif_config_flush(); 676 677 if (status != BTA_SUCCESS) 678 { 679 BTIF_TRACE_ERROR1("disable bt failed (%d)", status); 680 681 /* reset the original state to allow attempting disable again */ 682 btif_core_state = BTIF_CORE_STATE_ENABLED; 683 684 return BT_STATUS_FAIL; 685 } 686 return BT_STATUS_SUCCESS; 687} 688 689/******************************************************************************* 690** 691** Function btif_disable_bluetooth_evt 692** 693** Description Event notifying BT disable is now complete. 694** Terminates main stack tasks and notifies HAL 695** user with updated BT state. 696** 697** Returns void 698** 699*******************************************************************************/ 700 701void btif_disable_bluetooth_evt(void) 702{ 703 BTIF_TRACE_DEBUG1("%s", __FUNCTION__); 704 705#if (defined(HCILP_INCLUDED) && HCILP_INCLUDED == TRUE) 706 bte_main_enable_lpm(FALSE); 707#endif 708 709 bte_main_disable(); 710 711 /* update local state */ 712 btif_core_state = BTIF_CORE_STATE_DISABLED; 713 714 /* callback to HAL */ 715 HAL_CBACK(bt_hal_cbacks, adapter_state_changed_cb, BT_STATE_OFF); 716 717 if (btif_shutdown_pending) 718 { 719 BTIF_TRACE_DEBUG1("%s: calling btif_shutdown_bluetooth", __FUNCTION__); 720 btif_shutdown_bluetooth(); 721 } 722} 723 724 725/******************************************************************************* 726** 727** Function btif_shutdown_bluetooth 728** 729** Description Finalizes BT scheduler shutdown and terminates BTIF 730** task. 731** 732** Returns void 733** 734*******************************************************************************/ 735 736bt_status_t btif_shutdown_bluetooth(void) 737{ 738 BTIF_TRACE_DEBUG1("%s", __FUNCTION__); 739 740 if (btif_is_enabled()) 741 { 742 BTIF_TRACE_WARNING0("shutdown while still enabled, initiate disable"); 743 744 /* shutdown called prior to disabling, initiate disable */ 745 btif_disable_bluetooth(); 746 btif_shutdown_pending = 1; 747 return BT_STATUS_NOT_READY; 748 } 749 750 btif_shutdown_pending = 0; 751 752 if (btif_core_state == BTIF_CORE_STATE_ENABLING) 753 { 754 // Java layer abort BT ENABLING, could be due to ENABLE TIMEOUT 755 // Direct call from cleanup()@bluetooth.c 756 // bring down HCI/Vendor lib 757 bte_main_disable(); 758 btif_core_state = BTIF_CORE_STATE_DISABLED; 759 HAL_CBACK(bt_hal_cbacks, adapter_state_changed_cb, BT_STATE_OFF); 760 } 761 762 GKI_destroy_task(BTIF_TASK); 763 btif_queue_release(); 764 bte_main_shutdown(); 765 766 btif_dut_mode = 0; 767 768 BTIF_TRACE_DEBUG1("%s done", __FUNCTION__); 769 770 return BT_STATUS_SUCCESS; 771} 772 773 774/******************************************************************************* 775** 776** Function btif_disassociate_evt 777** 778** Description Event indicating btif_task is going down 779** Detach btif_task to JVM 780** 781** Returns void 782** 783*******************************************************************************/ 784 785static bt_status_t btif_disassociate_evt(void) 786{ 787 BTIF_TRACE_DEBUG1("%s: notify DISASSOCIATE_JVM", __FUNCTION__); 788 789 HAL_CBACK(bt_hal_cbacks, thread_evt_cb, DISASSOCIATE_JVM); 790 791 /* shutdown complete, all events notified and we reset HAL callbacks */ 792 bt_hal_cbacks = NULL; 793 794 return BT_STATUS_SUCCESS; 795} 796 797/**************************************************************************** 798** 799** BTIF Test Mode APIs 800** 801*****************************************************************************/ 802/******************************************************************************* 803** 804** Function btif_dut_mode_cback 805** 806** Description Callback invoked on completion of vendor specific test mode command 807** 808** Returns None 809** 810*******************************************************************************/ 811static void btif_dut_mode_cback( tBTM_VSC_CMPL *p ) 812{ 813 /* For now nothing to be done. */ 814} 815 816/******************************************************************************* 817** 818** Function btif_dut_mode_configure 819** 820** Description Configure Test Mode - 'enable' to 1 puts the device in test mode and 0 exits 821** test mode 822** 823** Returns BT_STATUS_SUCCESS on success 824** 825*******************************************************************************/ 826bt_status_t btif_dut_mode_configure(uint8_t enable) 827{ 828 BTIF_TRACE_DEBUG1("%s", __FUNCTION__); 829 830 if (btif_core_state != BTIF_CORE_STATE_ENABLED) { 831 BTIF_TRACE_ERROR0("btif_dut_mode_configure : Bluetooth not enabled"); 832 return BT_STATUS_NOT_READY; 833 } 834 835 btif_dut_mode = enable; 836 if (enable == 1) { 837 BTA_EnableTestMode(); 838 } else { 839 BTA_DisableTestMode(); 840 } 841 return BT_STATUS_SUCCESS; 842} 843 844/******************************************************************************* 845** 846** Function btif_dut_mode_send 847** 848** Description Sends a HCI Vendor specific command to the controller 849** 850** Returns BT_STATUS_SUCCESS on success 851** 852*******************************************************************************/ 853bt_status_t btif_dut_mode_send(uint16_t opcode, uint8_t *buf, uint8_t len) 854{ 855 /* TODO: Check that opcode is a vendor command group */ 856 BTIF_TRACE_DEBUG1("%s", __FUNCTION__); 857 if (!btif_is_dut_mode()) { 858 BTIF_TRACE_ERROR0("Bluedroid HAL needs to be init with test_mode set to 1."); 859 return BT_STATUS_FAIL; 860 } 861 BTM_VendorSpecificCommand(opcode, len, buf, btif_dut_mode_cback); 862 return BT_STATUS_SUCCESS; 863} 864 865/***************************************************************************** 866** 867** btif api adapter property functions 868** 869*****************************************************************************/ 870 871static bt_status_t btif_in_get_adapter_properties(void) 872{ 873 bt_property_t properties[6]; 874 uint32_t num_props; 875 876 bt_bdaddr_t addr; 877 bt_bdname_t name; 878 bt_scan_mode_t mode; 879 uint32_t disc_timeout; 880 bt_bdaddr_t bonded_devices[BTM_SEC_MAX_DEVICE_RECORDS]; 881 bt_uuid_t local_uuids[BT_MAX_NUM_UUIDS]; 882 num_props = 0; 883 884 /* BD_ADDR */ 885 BTIF_STORAGE_FILL_PROPERTY(&properties[num_props], BT_PROPERTY_BDADDR, 886 sizeof(addr), &addr); 887 btif_storage_get_adapter_property(&properties[num_props]); 888 num_props++; 889 890 /* BD_NAME */ 891 BTIF_STORAGE_FILL_PROPERTY(&properties[num_props], BT_PROPERTY_BDNAME, 892 sizeof(name), &name); 893 btif_storage_get_adapter_property(&properties[num_props]); 894 num_props++; 895 896 /* SCAN_MODE */ 897 BTIF_STORAGE_FILL_PROPERTY(&properties[num_props], BT_PROPERTY_ADAPTER_SCAN_MODE, 898 sizeof(mode), &mode); 899 btif_storage_get_adapter_property(&properties[num_props]); 900 num_props++; 901 902 /* DISC_TIMEOUT */ 903 BTIF_STORAGE_FILL_PROPERTY(&properties[num_props], BT_PROPERTY_ADAPTER_DISCOVERY_TIMEOUT, 904 sizeof(disc_timeout), &disc_timeout); 905 btif_storage_get_adapter_property(&properties[num_props]); 906 num_props++; 907 908 /* BONDED_DEVICES */ 909 BTIF_STORAGE_FILL_PROPERTY(&properties[num_props], BT_PROPERTY_ADAPTER_BONDED_DEVICES, 910 sizeof(bonded_devices), bonded_devices); 911 btif_storage_get_adapter_property(&properties[num_props]); 912 num_props++; 913 914 /* LOCAL UUIDs */ 915 BTIF_STORAGE_FILL_PROPERTY(&properties[num_props], BT_PROPERTY_UUIDS, 916 sizeof(local_uuids), local_uuids); 917 btif_storage_get_adapter_property(&properties[num_props]); 918 num_props++; 919 920 HAL_CBACK(bt_hal_cbacks, adapter_properties_cb, 921 BT_STATUS_SUCCESS, num_props, properties); 922 923 return BT_STATUS_SUCCESS; 924} 925 926static bt_status_t btif_in_get_remote_device_properties(bt_bdaddr_t *bd_addr) 927{ 928 bt_property_t remote_properties[8]; 929 uint32_t num_props = 0; 930 931 bt_bdname_t name, alias; 932 uint32_t cod, devtype; 933 bt_uuid_t remote_uuids[BT_MAX_NUM_UUIDS]; 934 935 memset(remote_properties, 0, sizeof(remote_properties)); 936 BTIF_STORAGE_FILL_PROPERTY(&remote_properties[num_props], BT_PROPERTY_BDNAME, 937 sizeof(name), &name); 938 btif_storage_get_remote_device_property(bd_addr, 939 &remote_properties[num_props]); 940 num_props++; 941 942 BTIF_STORAGE_FILL_PROPERTY(&remote_properties[num_props], BT_PROPERTY_REMOTE_FRIENDLY_NAME, 943 sizeof(alias), &alias); 944 btif_storage_get_remote_device_property(bd_addr, 945 &remote_properties[num_props]); 946 num_props++; 947 948 BTIF_STORAGE_FILL_PROPERTY(&remote_properties[num_props], BT_PROPERTY_CLASS_OF_DEVICE, 949 sizeof(cod), &cod); 950 btif_storage_get_remote_device_property(bd_addr, 951 &remote_properties[num_props]); 952 num_props++; 953 954 BTIF_STORAGE_FILL_PROPERTY(&remote_properties[num_props], BT_PROPERTY_TYPE_OF_DEVICE, 955 sizeof(devtype), &devtype); 956 btif_storage_get_remote_device_property(bd_addr, 957 &remote_properties[num_props]); 958 num_props++; 959 960 BTIF_STORAGE_FILL_PROPERTY(&remote_properties[num_props], BT_PROPERTY_UUIDS, 961 sizeof(remote_uuids), remote_uuids); 962 btif_storage_get_remote_device_property(bd_addr, 963 &remote_properties[num_props]); 964 num_props++; 965 966 HAL_CBACK(bt_hal_cbacks, remote_device_properties_cb, 967 BT_STATUS_SUCCESS, bd_addr, num_props, remote_properties); 968 969 return BT_STATUS_SUCCESS; 970} 971 972 973/******************************************************************************* 974** 975** Function execute_storage_request 976** 977** Description Executes adapter storage request in BTIF context 978** 979** Returns bt_status_t 980** 981*******************************************************************************/ 982 983static void execute_storage_request(UINT16 event, char *p_param) 984{ 985 uint8_t is_local; 986 int num_entries = 0; 987 bt_status_t status = BT_STATUS_SUCCESS; 988 989 BTIF_TRACE_EVENT1("execute storage request event : %d", event); 990 991 switch(event) 992 { 993 case BTIF_CORE_STORAGE_ADAPTER_WRITE: 994 { 995 btif_storage_req_t *p_req = (btif_storage_req_t*)p_param; 996 bt_property_t *p_prop = &(p_req->write_req.prop); 997 BTIF_TRACE_EVENT3("type: %d, len %d, 0x%x", p_prop->type, 998 p_prop->len, p_prop->val); 999 1000 status = btif_storage_set_adapter_property(p_prop); 1001 HAL_CBACK(bt_hal_cbacks, adapter_properties_cb, status, 1, p_prop); 1002 } break; 1003 1004 case BTIF_CORE_STORAGE_ADAPTER_READ: 1005 { 1006 btif_storage_req_t *p_req = (btif_storage_req_t*)p_param; 1007 char buf[512]; 1008 bt_property_t prop; 1009 prop.type = p_req->read_req.type; 1010 prop.val = (void*)buf; 1011 prop.len = sizeof(buf); 1012 status = btif_storage_get_adapter_property(&prop); 1013 HAL_CBACK(bt_hal_cbacks, adapter_properties_cb, status, 1, &prop); 1014 } break; 1015 1016 case BTIF_CORE_STORAGE_ADAPTER_READ_ALL: 1017 { 1018 status = btif_in_get_adapter_properties(); 1019 } break; 1020 1021 case BTIF_CORE_STORAGE_NOTIFY_STATUS: 1022 { 1023 HAL_CBACK(bt_hal_cbacks, adapter_properties_cb, status, 0, NULL); 1024 } break; 1025 1026 default: 1027 BTIF_TRACE_ERROR2("%s invalid event id (%d)", __FUNCTION__, event); 1028 break; 1029 } 1030} 1031 1032static void execute_storage_remote_request(UINT16 event, char *p_param) 1033{ 1034 bt_status_t status = BT_STATUS_FAIL; 1035 bt_property_t prop; 1036 1037 BTIF_TRACE_EVENT1("execute storage remote request event : %d", event); 1038 1039 switch (event) 1040 { 1041 case BTIF_CORE_STORAGE_REMOTE_READ: 1042 { 1043 char buf[1024]; 1044 btif_storage_req_t *p_req = (btif_storage_req_t*)p_param; 1045 prop.type = p_req->read_req.type; 1046 prop.val = (void*) buf; 1047 prop.len = sizeof(buf); 1048 1049 status = btif_storage_get_remote_device_property(&(p_req->read_req.bd_addr), 1050 &prop); 1051 HAL_CBACK(bt_hal_cbacks, remote_device_properties_cb, 1052 status, &(p_req->read_req.bd_addr), 1, &prop); 1053 }break; 1054 case BTIF_CORE_STORAGE_REMOTE_WRITE: 1055 { 1056 btif_storage_req_t *p_req = (btif_storage_req_t*)p_param; 1057 status = btif_storage_set_remote_device_property(&(p_req->write_req.bd_addr), 1058 &(p_req->write_req.prop)); 1059 }break; 1060 case BTIF_CORE_STORAGE_REMOTE_READ_ALL: 1061 { 1062 btif_storage_req_t *p_req = (btif_storage_req_t*)p_param; 1063 btif_in_get_remote_device_properties(&p_req->read_req.bd_addr); 1064 }break; 1065 } 1066} 1067 1068void btif_adapter_properties_evt(bt_status_t status, uint32_t num_props, 1069 bt_property_t *p_props) 1070{ 1071 HAL_CBACK(bt_hal_cbacks, adapter_properties_cb, 1072 status, num_props, p_props); 1073 1074} 1075void btif_remote_properties_evt(bt_status_t status, bt_bdaddr_t *remote_addr, 1076 uint32_t num_props, bt_property_t *p_props) 1077{ 1078 HAL_CBACK(bt_hal_cbacks, remote_device_properties_cb, 1079 status, remote_addr, num_props, p_props); 1080} 1081 1082/******************************************************************************* 1083** 1084** Function btif_in_storage_request_copy_cb 1085** 1086** Description Switch context callback function to perform the deep copy for 1087** both the adapter and remote_device property API 1088** 1089** Returns None 1090** 1091*******************************************************************************/ 1092static void btif_in_storage_request_copy_cb(UINT16 event, 1093 char *p_new_buf, char *p_old_buf) 1094{ 1095 btif_storage_req_t *new_req = (btif_storage_req_t*)p_new_buf; 1096 btif_storage_req_t *old_req = (btif_storage_req_t*)p_old_buf; 1097 1098 BTIF_TRACE_EVENT1("%s", __FUNCTION__); 1099 switch (event) 1100 { 1101 case BTIF_CORE_STORAGE_REMOTE_WRITE: 1102 case BTIF_CORE_STORAGE_ADAPTER_WRITE: 1103 { 1104 bdcpy(new_req->write_req.bd_addr.address, old_req->write_req.bd_addr.address); 1105 /* Copy the member variables one at a time */ 1106 new_req->write_req.prop.type = old_req->write_req.prop.type; 1107 new_req->write_req.prop.len = old_req->write_req.prop.len; 1108 1109 new_req->write_req.prop.val = (UINT8 *)(p_new_buf + sizeof(btif_storage_req_t)); 1110 memcpy(new_req->write_req.prop.val, old_req->write_req.prop.val, 1111 old_req->write_req.prop.len); 1112 }break; 1113 } 1114} 1115 1116/******************************************************************************* 1117** 1118** Function btif_get_adapter_properties 1119** 1120** Description Fetch all available properties (local & remote) 1121** 1122** Returns bt_status_t 1123** 1124*******************************************************************************/ 1125 1126bt_status_t btif_get_adapter_properties(void) 1127{ 1128 BTIF_TRACE_EVENT1("%s", __FUNCTION__); 1129 1130 if (!btif_is_enabled()) 1131 return BT_STATUS_NOT_READY; 1132 1133 return btif_transfer_context(execute_storage_request, 1134 BTIF_CORE_STORAGE_ADAPTER_READ_ALL, 1135 NULL, 0, NULL); 1136} 1137 1138/******************************************************************************* 1139** 1140** Function btif_get_adapter_property 1141** 1142** Description Fetches property value from local cache 1143** 1144** Returns bt_status_t 1145** 1146*******************************************************************************/ 1147 1148bt_status_t btif_get_adapter_property(bt_property_type_t type) 1149{ 1150 btif_storage_req_t req; 1151 1152 BTIF_TRACE_EVENT2("%s %d", __FUNCTION__, type); 1153 1154 /* Allow get_adapter_property only for BDADDR and BDNAME if BT is disabled */ 1155 if (!btif_is_enabled() && (type != BT_PROPERTY_BDADDR) && (type != BT_PROPERTY_BDNAME)) 1156 return BT_STATUS_NOT_READY; 1157 1158 memset(&(req.read_req.bd_addr), 0, sizeof(bt_bdaddr_t)); 1159 req.read_req.type = type; 1160 1161 return btif_transfer_context(execute_storage_request, 1162 BTIF_CORE_STORAGE_ADAPTER_READ, 1163 (char*)&req, sizeof(btif_storage_req_t), NULL); 1164} 1165 1166/******************************************************************************* 1167** 1168** Function btif_set_adapter_property 1169** 1170** Description Updates core stack with property value and stores it in 1171** local cache 1172** 1173** Returns bt_status_t 1174** 1175*******************************************************************************/ 1176 1177bt_status_t btif_set_adapter_property(const bt_property_t *property) 1178{ 1179 btif_storage_req_t req; 1180 bt_status_t status = BT_STATUS_SUCCESS; 1181 int storage_req_id = BTIF_CORE_STORAGE_NOTIFY_STATUS; /* default */ 1182 char bd_name[BTM_MAX_LOC_BD_NAME_LEN +1]; 1183 UINT16 name_len = 0; 1184 1185 BTIF_TRACE_EVENT3("btif_set_adapter_property type: %d, len %d, 0x%x", 1186 property->type, property->len, property->val); 1187 1188 if (!btif_is_enabled()) 1189 return BT_STATUS_NOT_READY; 1190 1191 switch(property->type) 1192 { 1193 case BT_PROPERTY_BDNAME: 1194 { 1195 name_len = property->len > BTM_MAX_LOC_BD_NAME_LEN ? BTM_MAX_LOC_BD_NAME_LEN: 1196 property->len; 1197 memcpy(bd_name,property->val, name_len); 1198 bd_name[name_len] = '\0'; 1199 1200 BTIF_TRACE_EVENT1("set property name : %s", (char *)bd_name); 1201 1202 BTA_DmSetDeviceName((char *)bd_name); 1203 1204 storage_req_id = BTIF_CORE_STORAGE_ADAPTER_WRITE; 1205 } 1206 break; 1207 1208 case BT_PROPERTY_ADAPTER_SCAN_MODE: 1209 { 1210 bt_scan_mode_t mode = *(bt_scan_mode_t*)property->val; 1211 tBTA_DM_DISC disc_mode; 1212 tBTA_DM_CONN conn_mode; 1213 1214 switch(mode) 1215 { 1216 case BT_SCAN_MODE_NONE: 1217 disc_mode = BTA_DM_NON_DISC; 1218 conn_mode = BTA_DM_NON_CONN; 1219 break; 1220 1221 case BT_SCAN_MODE_CONNECTABLE: 1222 disc_mode = BTA_DM_NON_DISC; 1223 conn_mode = BTA_DM_CONN; 1224 break; 1225 1226 case BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE: 1227 disc_mode = BTA_DM_GENERAL_DISC; 1228 conn_mode = BTA_DM_CONN; 1229 break; 1230 1231 default: 1232 BTIF_TRACE_ERROR1("invalid scan mode (0x%x)", mode); 1233 return BT_STATUS_PARM_INVALID; 1234 } 1235 1236 BTIF_TRACE_EVENT1("set property scan mode : %x", mode); 1237 1238 BTA_DmSetVisibility(disc_mode, conn_mode, BTA_DM_IGNORE, BTA_DM_IGNORE); 1239 1240 storage_req_id = BTIF_CORE_STORAGE_ADAPTER_WRITE; 1241 } 1242 break; 1243 case BT_PROPERTY_ADAPTER_DISCOVERY_TIMEOUT: 1244 { 1245 /* Nothing to do beside store the value in NV. Java 1246 will change the SCAN_MODE property after setting timeout, 1247 if required */ 1248 storage_req_id = BTIF_CORE_STORAGE_ADAPTER_WRITE; 1249 } 1250 break; 1251 case BT_PROPERTY_BDADDR: 1252 case BT_PROPERTY_UUIDS: 1253 case BT_PROPERTY_ADAPTER_BONDED_DEVICES: 1254 case BT_PROPERTY_REMOTE_FRIENDLY_NAME: 1255 /* no write support through HAL, these properties are only populated from BTA events */ 1256 status = BT_STATUS_FAIL; 1257 break; 1258 default: 1259 BTIF_TRACE_ERROR1("btif_get_adapter_property : invalid type %d", 1260 property->type); 1261 status = BT_STATUS_FAIL; 1262 break; 1263 } 1264 1265 if (storage_req_id != BTIF_CORE_STORAGE_NO_ACTION) 1266 { 1267 int btif_status; 1268 /* pass on to storage for updating local database */ 1269 1270 memset(&(req.write_req.bd_addr), 0, sizeof(bt_bdaddr_t)); 1271 memcpy(&(req.write_req.prop), property, sizeof(bt_property_t)); 1272 1273 return btif_transfer_context(execute_storage_request, 1274 storage_req_id, 1275 (char*)&req, 1276 sizeof(btif_storage_req_t)+property->len, 1277 btif_in_storage_request_copy_cb); 1278 } 1279 1280 return status; 1281 1282} 1283 1284/******************************************************************************* 1285** 1286** Function btif_get_remote_device_property 1287** 1288** Description Fetches the remote device property from the NVRAM 1289** 1290** Returns bt_status_t 1291** 1292*******************************************************************************/ 1293bt_status_t btif_get_remote_device_property(bt_bdaddr_t *remote_addr, 1294 bt_property_type_t type) 1295{ 1296 btif_storage_req_t req; 1297 1298 if (!btif_is_enabled()) 1299 return BT_STATUS_NOT_READY; 1300 1301 memcpy(&(req.read_req.bd_addr), remote_addr, sizeof(bt_bdaddr_t)); 1302 req.read_req.type = type; 1303 return btif_transfer_context(execute_storage_remote_request, 1304 BTIF_CORE_STORAGE_REMOTE_READ, 1305 (char*)&req, sizeof(btif_storage_req_t), 1306 NULL); 1307} 1308 1309/******************************************************************************* 1310** 1311** Function btif_get_remote_device_properties 1312** 1313** Description Fetches all the remote device properties from NVRAM 1314** 1315** Returns bt_status_t 1316** 1317*******************************************************************************/ 1318bt_status_t btif_get_remote_device_properties(bt_bdaddr_t *remote_addr) 1319{ 1320 btif_storage_req_t req; 1321 1322 if (!btif_is_enabled()) 1323 return BT_STATUS_NOT_READY; 1324 1325 memcpy(&(req.read_req.bd_addr), remote_addr, sizeof(bt_bdaddr_t)); 1326 return btif_transfer_context(execute_storage_remote_request, 1327 BTIF_CORE_STORAGE_REMOTE_READ_ALL, 1328 (char*)&req, sizeof(btif_storage_req_t), 1329 NULL); 1330} 1331 1332/******************************************************************************* 1333** 1334** Function btif_set_remote_device_property 1335** 1336** Description Writes the remote device property to NVRAM. 1337** Currently, BT_PROPERTY_REMOTE_FRIENDLY_NAME is the only 1338** remote device property that can be set 1339** 1340** Returns bt_status_t 1341** 1342*******************************************************************************/ 1343bt_status_t btif_set_remote_device_property(bt_bdaddr_t *remote_addr, 1344 const bt_property_t *property) 1345{ 1346 btif_storage_req_t req; 1347 1348 if (!btif_is_enabled()) 1349 return BT_STATUS_NOT_READY; 1350 1351 memcpy(&(req.write_req.bd_addr), remote_addr, sizeof(bt_bdaddr_t)); 1352 memcpy(&(req.write_req.prop), property, sizeof(bt_property_t)); 1353 1354 return btif_transfer_context(execute_storage_remote_request, 1355 BTIF_CORE_STORAGE_REMOTE_WRITE, 1356 (char*)&req, 1357 sizeof(btif_storage_req_t)+property->len, 1358 btif_in_storage_request_copy_cb); 1359} 1360 1361 1362/******************************************************************************* 1363** 1364** Function btif_get_remote_service_record 1365** 1366** Description Looks up the service matching uuid on the remote device 1367** and fetches the SCN and service_name if the UUID is found 1368** 1369** Returns bt_status_t 1370** 1371*******************************************************************************/ 1372bt_status_t btif_get_remote_service_record(bt_bdaddr_t *remote_addr, 1373 bt_uuid_t *uuid) 1374{ 1375 if (!btif_is_enabled()) 1376 return BT_STATUS_NOT_READY; 1377 1378 return btif_dm_get_remote_service_record(remote_addr, uuid); 1379} 1380 1381 1382/******************************************************************************* 1383** 1384** Function btif_get_enabled_services_mask 1385** 1386** Description Fetches currently enabled services 1387** 1388** Returns tBTA_SERVICE_MASK 1389** 1390*******************************************************************************/ 1391 1392tBTA_SERVICE_MASK btif_get_enabled_services_mask(void) 1393{ 1394 return btif_enabled_services; 1395} 1396 1397/******************************************************************************* 1398** 1399** Function btif_enable_service 1400** 1401** Description Enables the service 'service_ID' to the service_mask. 1402** Upon BT enable, BTIF core shall invoke the BTA APIs to 1403** enable the profiles 1404** 1405** Returns bt_status_t 1406** 1407*******************************************************************************/ 1408bt_status_t btif_enable_service(tBTA_SERVICE_ID service_id) 1409{ 1410 tBTA_SERVICE_ID *p_id = &service_id; 1411 1412 /* If BT is enabled, we need to switch to BTIF context and trigger the 1413 * enable for that profile 1414 * 1415 * Otherwise, we just set the flag. On BT_Enable, the DM will trigger 1416 * enable for the profiles that have been enabled */ 1417 1418 btif_enabled_services |= (1 << service_id); 1419 1420 BTIF_TRACE_DEBUG2("%s: current services:0x%x", __FUNCTION__, btif_enabled_services); 1421 1422 if (btif_is_enabled()) 1423 { 1424 btif_transfer_context(btif_dm_execute_service_request, 1425 BTIF_DM_ENABLE_SERVICE, 1426 (char*)p_id, sizeof(tBTA_SERVICE_ID), NULL); 1427 } 1428 1429 return BT_STATUS_SUCCESS; 1430} 1431/******************************************************************************* 1432** 1433** Function btif_disable_service 1434** 1435** Description Disables the service 'service_ID' to the service_mask. 1436** Upon BT disable, BTIF core shall invoke the BTA APIs to 1437** disable the profiles 1438** 1439** Returns bt_status_t 1440** 1441*******************************************************************************/ 1442bt_status_t btif_disable_service(tBTA_SERVICE_ID service_id) 1443{ 1444 tBTA_SERVICE_ID *p_id = &service_id; 1445 1446 /* If BT is enabled, we need to switch to BTIF context and trigger the 1447 * disable for that profile so that the appropriate uuid_property_changed will 1448 * be triggerred. Otherwise, we just need to clear the service_id in the mask 1449 */ 1450 1451 btif_enabled_services &= (tBTA_SERVICE_MASK)(~(1<<service_id)); 1452 1453 BTIF_TRACE_DEBUG2("%s: Current Services:0x%x", __FUNCTION__, btif_enabled_services); 1454 1455 if (btif_is_enabled()) 1456 { 1457 btif_transfer_context(btif_dm_execute_service_request, 1458 BTIF_DM_DISABLE_SERVICE, 1459 (char*)p_id, sizeof(tBTA_SERVICE_ID), NULL); 1460 } 1461 1462 return BT_STATUS_SUCCESS; 1463} 1464 1465/******************************************************************************* 1466** 1467** Function btif_config_hci_snoop_log 1468** 1469** Description enable or disable HCI snoop log 1470** 1471** Returns bt_status_t 1472** 1473*******************************************************************************/ 1474bt_status_t btif_config_hci_snoop_log(uint8_t enable) 1475{ 1476 bte_main_config_hci_logging(enable != 0, 1477 btif_core_state == BTIF_CORE_STATE_DISABLED); 1478 return BT_STATUS_SUCCESS; 1479} 1480