15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 32dc999935d4c69ae31ea93d9014165965dd373d6Hemant Gupta * Copyright (C) 2014 The Android Open Source Project 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2009-2012 Broadcom Corporation 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************* 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Filename: btif_core.c 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Description: Contains core functionality related to interfacing between 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Bluetooth HAL and BTE core stack. 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 27ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2949120dc867c7818511b5afec461dfc97d17eef58Marie Janssen#define LOG_TAG "bt_btif_core" 3049120dc867c7818511b5afec461dfc97d17eef58Marie Janssen 31140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski#include <base/at_exit.h> 32140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski#include <base/bind.h> 33140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski#include <base/run_loop.h> 34140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski#include <base/threading/thread.h> 350eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Manton#include <ctype.h> 360eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Manton#include <dirent.h> 370eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Manton#include <fcntl.h> 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <hardware/bluetooth.h> 390eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Manton#include <stdlib.h> 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <sys/stat.h> 420eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Manton#include <sys/types.h> 43d30195cbf09735da593e186c4c99cce6232b072eArman Uguray#include <unistd.h> 44d30195cbf09735da593e186c4c99cce6232b072eArman Uguray 456bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson#include "bt_common.h" 466c65c2f3a372885a976c14b3ccacd0b5a5fbb8bdZhihai Xu#include "bt_utils.h" 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_api.h" 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bte.h" 490eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Manton#include "btif_api.h" 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btif_av.h" 510eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Manton#include "btif_config.h" 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btif_pan.h" 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btif_profile_queue.h" 540eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Manton#include "btif_sock.h" 550eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Manton#include "btif_storage.h" 560620f9706d9aa06ba7f8982840eeb7ab2ad90e7aAdam Lesinski#include "btif_uid.h" 570eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Manton#include "btif_util.h" 580eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Manton#include "btu.h" 5979ecab5d0418fde77e9afcdd451bd713af73e180Chris Manton#include "device/include/controller.h" 600f9b91e150e153229235c163861198e23600e636Sharvil Nanavati#include "osi/include/fixed_queue.h" 610f9b91e150e153229235c163861198e23600e636Sharvil Nanavati#include "osi/include/future.h" 6244802768c447ab480d4227b3a852a97d923b816dSharvil Nanavati#include "osi/include/log.h" 63db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "osi/include/osi.h" 643eb4a4827c9436ddd8333457be3474b6fadfb38fJakub Pawlowski#include "osi/include/properties.h" 650f9b91e150e153229235c163861198e23600e636Sharvil Nanavati#include "osi/include/thread.h" 66db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "stack_manager.h" 670eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Manton 68ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************* 696bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Constants & Macros 70ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef BTE_DID_CONF_FILE 73f2d6434a6b7ad98e20c7a601d2a0950237514837Arman Uguray// TODO(armansito): Find a better way than searching by a hardcoded path. 74f2d6434a6b7ad98e20c7a601d2a0950237514837Arman Uguray#if defined(OS_GENERIC) 75f2d6434a6b7ad98e20c7a601d2a0950237514837Arman Uguray#define BTE_DID_CONF_FILE "bt_did.conf" 76f2d6434a6b7ad98e20c7a601d2a0950237514837Arman Uguray#else // !defined(OS_GENERIC) 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTE_DID_CONF_FILE "/etc/bluetooth/bt_did.conf" 78f2d6434a6b7ad98e20c7a601d2a0950237514837Arman Uguray#endif // defined(OS_GENERIC) 79f2d6434a6b7ad98e20c7a601d2a0950237514837Arman Uguray#endif // BTE_DID_CONF_FILE 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 81ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************* 826bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Local type definitions 83ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 856bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson/* These type definitions are used when passing data from the HAL to BTIF 86aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski * context in the downstream path for the adapter and remote_device property 87aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski * APIs 88aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski */ 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef struct { 919e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowski RawAddress bd_addr; 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bt_property_type_t type; 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} btif_storage_read_t; 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef struct { 969e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowski RawAddress bd_addr; 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bt_property_t prop; 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} btif_storage_write_t; 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef union { 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_storage_read_t read_req; 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_storage_write_t write_req; 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} btif_storage_req_t; 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef enum { 1066bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_CORE_STATE_DISABLED = 0, 1076bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_CORE_STATE_ENABLING, 1086bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_CORE_STATE_ENABLED, 1096bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_CORE_STATE_DISABLING 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} btif_core_state_t; 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 112ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************* 1136bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Static variables 114ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTA_SERVICE_MASK btif_enabled_services = 0; 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* 119aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski * This variable should be set to 1, if the Bluedroid+BTIF libraries are to 120aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski * function in DUT mode. 121aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski * 122aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski * To set this, the btif_init_bluetooth needs to be called with argument as 1 123aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski */ 124b7f64bc45dec7f7fec74ceb04874f322b9434bbfMarie Janssenstatic uint8_t btif_dut_mode = 0; 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1266bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonstatic thread_t* bt_jni_workqueue_thread; 1276bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonstatic const char* BT_JNI_WORKQUEUE_NAME = "bt_jni_workqueue"; 1280620f9706d9aa06ba7f8982840eeb7ab2ad90e7aAdam Lesinskistatic uid_set_t* uid_set = NULL; 129140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowskibase::MessageLoop* message_loop_ = NULL; 1306bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonbase::RunLoop* jni_run_loop = NULL; 1310eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Manton 132ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************* 1336bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Static functions 134ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 135140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowskistatic void btif_jni_associate(); 1361bd691cb8ae3c23ffe25b5ca1fcfd11b82a9fbdaPavlin Radoslavovstatic void btif_jni_disassociate(); 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* sends message to btif task */ 1396bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonstatic void btif_sendmsg(void* p_msg); 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 141ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************* 1426bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Externs 143ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1446bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonextern fixed_queue_t* btu_hci_msg_queue; 145860a9af89f8dbf8ef65785d5db960c1fa488d2baChris Manton 1466bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonvoid btif_dm_execute_service_request(uint16_t event, char* p_param); 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef BTIF_DM_OOB_TEST 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_dm_load_local_oob(void); 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1526bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 1536bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function btif_context_switched 1546bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 1556bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description Callback used to execute transferred context callback 1566bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 1576bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * p_msg : message to be executed in btif context 1586bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 1596bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns void 1606bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 1616bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1636bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonstatic void btif_context_switched(void* p_msg) { 1646bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_TRACE_VERBOSE("btif_context_switched"); 1656bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 1666bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson tBTIF_CONTEXT_SWITCH_CBACK* p = (tBTIF_CONTEXT_SWITCH_CBACK*)p_msg; 1676bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 1686bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson /* each callback knows how to parse the data */ 1696bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson if (p->p_cb) p->p_cb(p->event, p->p_param); 1706bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson} 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1736bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 1746bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function btif_transfer_context 1756bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 1766bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description This function switches context to btif task 1776bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 1786bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * p_cback : callback used to process message in btif context 1796bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * event : event id of message 1806bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * p_params : parameter area passed to callback (copied) 1816bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * param_len : length of parameter area 1826bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * p_copy_cback : If set this function will be invoked for deep 183f45481678af0694902b5200ba69ced4cb61d73f0Myles Watson * copy 1846bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 1856bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns void 1866bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 1876bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 188717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov 1896bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonbt_status_t btif_transfer_context(tBTIF_CBACK* p_cback, uint16_t event, 1906bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson char* p_params, int param_len, 1916bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson tBTIF_COPY_CBACK* p_copy_cback) { 1926bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson tBTIF_CONTEXT_SWITCH_CBACK* p_msg = (tBTIF_CONTEXT_SWITCH_CBACK*)osi_malloc( 1936bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson sizeof(tBTIF_CONTEXT_SWITCH_CBACK) + param_len); 194717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov 1956bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_TRACE_VERBOSE("btif_transfer_context event %d, len %d", event, 1966bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson param_len); 1976bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 1986bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson /* allocate and send message that will be executed in btif context */ 1996bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson p_msg->hdr.event = BT_EVT_CONTEXT_SWITCH_EVT; /* internal event */ 2006bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson p_msg->p_cb = p_cback; 2016bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 2026bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson p_msg->event = event; /* callback event */ 2036bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 2046bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson /* check if caller has provided a copy callback to do the deep copy */ 2056bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson if (p_copy_cback) { 2066bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson p_copy_cback(event, p_msg->p_param, p_params); 2076bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } else if (p_params) { 2086bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson memcpy(p_msg->p_param, p_params, param_len); /* callback parameter data */ 2096bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 2106bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 2116bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_sendmsg(p_msg); 2126bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 2136bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_SUCCESS; 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2160482c8a3f4253b5b86180b44de6cd9dbaecd5e99Jakub Pawlowski/** 2170482c8a3f4253b5b86180b44de6cd9dbaecd5e99Jakub Pawlowski * This function posts a task into the btif message loop, that executes it in 2180482c8a3f4253b5b86180b44de6cd9dbaecd5e99Jakub Pawlowski * the JNI message loop. 2190482c8a3f4253b5b86180b44de6cd9dbaecd5e99Jakub Pawlowski **/ 2200482c8a3f4253b5b86180b44de6cd9dbaecd5e99Jakub Pawlowskibt_status_t do_in_jni_thread(const tracked_objects::Location& from_here, 2210482c8a3f4253b5b86180b44de6cd9dbaecd5e99Jakub Pawlowski const base::Closure& task) { 2226bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson if (!message_loop_ || !message_loop_->task_runner().get()) { 2236bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_TRACE_WARNING("%s: Dropped message, message_loop not initialized yet!", 2246bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson __func__); 225140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski return BT_STATUS_FAIL; 226140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski } 227140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski 2280482c8a3f4253b5b86180b44de6cd9dbaecd5e99Jakub Pawlowski if (message_loop_->task_runner()->PostTask(from_here, task)) 229140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski return BT_STATUS_SUCCESS; 230140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski 231140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski BTIF_TRACE_ERROR("%s: Post task to task runner failed!", __func__); 232140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski return BT_STATUS_FAIL; 233140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski} 234140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski 2350482c8a3f4253b5b86180b44de6cd9dbaecd5e99Jakub Pawlowskibt_status_t do_in_jni_thread(const base::Closure& task) { 2360482c8a3f4253b5b86180b44de6cd9dbaecd5e99Jakub Pawlowski return do_in_jni_thread(FROM_HERE, task); 2370482c8a3f4253b5b86180b44de6cd9dbaecd5e99Jakub Pawlowski} 2380482c8a3f4253b5b86180b44de6cd9dbaecd5e99Jakub Pawlowski 239140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski/******************************************************************************* 2406bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 2416bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function btif_is_dut_mode 2426bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 2436bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description checks if BTIF is currently in DUT mode 2446bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 2456bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns 1 if test mode, otherwize 0 2466bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 2476bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 2486bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 2496bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonuint8_t btif_is_dut_mode(void) { return (btif_dut_mode == 1); } 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2526bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 2536bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function btif_is_enabled 2546bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 2556bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description checks if main adapter is fully enabled 2566bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 2576bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns 1 if fully enabled, otherwize 0 2586bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 2596bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 2606bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 2616bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonint btif_is_enabled(void) { 2626bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return ((!btif_is_dut_mode()) && 2636bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson (stack_manager_get_interface()->get_stack_is_running())); 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2666bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonvoid btif_init_ok(UNUSED_ATTR uint16_t event, UNUSED_ATTR char* p_param) { 2670eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Manton BTIF_TRACE_DEBUG("btif_task: received trigger stack init event"); 2680eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Manton btif_dm_load_ble_local_keys(); 2690eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Manton BTA_EnableBluetooth(bte_dm_evt); 2700eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Manton} 2710eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Manton 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2736bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 2746bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function btif_task 2756bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 2766bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description BTIF task handler managing all messages being passed 2776bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Bluetooth HAL and BTA. 2786bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 2796bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns void 2806bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 2816bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 2826bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonstatic void bt_jni_msg_ready(void* context) { 2836bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BT_HDR* p_msg = (BT_HDR*)context; 2840eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Manton 2850eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Manton BTIF_TRACE_VERBOSE("btif task fetched event %x", p_msg->event); 2860eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Manton 2870eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Manton switch (p_msg->event) { 2880eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Manton case BT_EVT_CONTEXT_SWITCH_EVT: 2890eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Manton btif_context_switched(p_msg); 2900eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Manton break; 2910eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Manton default: 2920eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Manton BTIF_TRACE_ERROR("unhandled btif event (%d)", p_msg->event & BT_EVT_MASK); 2930eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Manton break; 2940eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Manton } 295cceb430489a70add1b996d54289867c17f4ac0fdPavlin Radoslavov osi_free(p_msg); 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2996bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 3006bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function btif_sendmsg 3016bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 3026bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description Sends msg to BTIF task 3036bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 3046bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns void 3056bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 3066bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 3076bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 3086bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonvoid btif_sendmsg(void* p_msg) { 309140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski do_in_jni_thread(base::Bind(&bt_jni_msg_ready, p_msg)); 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3126bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonvoid btif_thread_post(thread_fn func, void* context) { 313140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski do_in_jni_thread(base::Bind(func, context)); 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3166bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonvoid run_message_loop(UNUSED_ATTR void* context) { 317137aa547f3d163929120d250a87e55dbf6c748abPavlin Radoslavov LOG_INFO(LOG_TAG, "%s entered", __func__); 318137aa547f3d163929120d250a87e55dbf6c748abPavlin Radoslavov 3196bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson // TODO(jpawlowski): exit_manager should be defined in main(), but there is no 3206bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson // main method. 3216bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson // It is therefore defined in bt_jni_workqueue_thread, and will be deleted 3226bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson // when we free it. 323140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski base::AtExitManager exit_manager; 324140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski 325140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski message_loop_ = new base::MessageLoop(base::MessageLoop::Type::TYPE_DEFAULT); 326140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski 327140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski // Associate this workqueue thread with JNI. 3286bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson message_loop_->task_runner()->PostTask(FROM_HERE, 3296bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson base::Bind(&btif_jni_associate)); 330140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski 331140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski jni_run_loop = new base::RunLoop(); 332140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski jni_run_loop->Run(); 333140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski 334140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski delete message_loop_; 335140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski message_loop_ = NULL; 336140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski 337140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski delete jni_run_loop; 338140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski jni_run_loop = NULL; 339137aa547f3d163929120d250a87e55dbf6c748abPavlin Radoslavov 340137aa547f3d163929120d250a87e55dbf6c748abPavlin Radoslavov LOG_INFO(LOG_TAG, "%s finished", __func__); 341140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski} 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3436bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 3446bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function btif_init_bluetooth 3456bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 3466bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description Creates BTIF task and prepares BT scheduler for startup 3476bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 3486bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns bt_status_t 3496bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 3506bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 3510eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Mantonbt_status_t btif_init_bluetooth() { 352137aa547f3d163929120d250a87e55dbf6c748abPavlin Radoslavov LOG_INFO(LOG_TAG, "%s entered", __func__); 353137aa547f3d163929120d250a87e55dbf6c748abPavlin Radoslavov 3540eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Manton bte_main_boot_entry(); 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3560eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Manton bt_jni_workqueue_thread = thread_new(BT_JNI_WORKQUEUE_NAME); 3570eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Manton if (bt_jni_workqueue_thread == NULL) { 3586bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson LOG_ERROR(LOG_TAG, "%s Unable to create thread %s", __func__, 3596bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BT_JNI_WORKQUEUE_NAME); 3600eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Manton goto error_exit; 3610eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Manton } 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 363140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski thread_post(bt_jni_workqueue_thread, run_message_loop, nullptr); 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 365137aa547f3d163929120d250a87e55dbf6c748abPavlin Radoslavov LOG_INFO(LOG_TAG, "%s finished", __func__); 3660eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Manton return BT_STATUS_SUCCESS; 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3680eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Mantonerror_exit:; 3696bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson thread_free(bt_jni_workqueue_thread); 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3716bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson bt_jni_workqueue_thread = NULL; 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3736bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_FAIL; 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3776bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 3786bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function btif_enable_bluetooth_evt 3796bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 3806bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description Event indicating bluetooth enable is completed 3816bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Notifies HAL user with updated adapter state 3826bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 3836bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns void 3846bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 3856bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 3866bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 3876bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonvoid btif_enable_bluetooth_evt(tBTA_STATUS status) { 388137aa547f3d163929120d250a87e55dbf6c748abPavlin Radoslavov LOG_INFO(LOG_TAG, "%s entered: status %d", __func__, status); 3896bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 3901c7a152a96e68c5f5e140f7f47ed2734588cb9e0Myles Watson /* Fetch the local BD ADDR */ 3919e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowski RawAddress local_bd_addr = *controller_get_interface()->get_address(); 3926bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 393aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski std::string bdstr = local_bd_addr.ToString(); 3946bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 3951c7a152a96e68c5f5e140f7f47ed2734588cb9e0Myles Watson char val[PROPERTY_VALUE_MAX] = ""; 3961c7a152a96e68c5f5e140f7f47ed2734588cb9e0Myles Watson int val_size = 0; 3971c7a152a96e68c5f5e140f7f47ed2734588cb9e0Myles Watson if ((btif_config_get_str("Adapter", "Address", val, &val_size) == 0) || 398aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski strcmp(bdstr.c_str(), val) == 0) { 3991c7a152a96e68c5f5e140f7f47ed2734588cb9e0Myles Watson // This address is not present in the config file, save it there. 4001c7a152a96e68c5f5e140f7f47ed2734588cb9e0Myles Watson BTIF_TRACE_WARNING("%s: Saving the Adapter Address", __func__); 401aaa50649b95c0ab2cd84e67fab77596bbb24d095Jakub Pawlowski btif_config_set_str("Adapter", "Address", bdstr.c_str()); 4026bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_config_save(); 4036bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 4046bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson // fire HAL callback for property change 4051c7a152a96e68c5f5e140f7f47ed2734588cb9e0Myles Watson bt_property_t prop; 4066bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson prop.type = BT_PROPERTY_BDADDR; 4071c7a152a96e68c5f5e140f7f47ed2734588cb9e0Myles Watson prop.val = (void*)&local_bd_addr; 4089e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowski prop.len = sizeof(RawAddress); 4096bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson HAL_CBACK(bt_hal_cbacks, adapter_properties_cb, BT_STATUS_SUCCESS, 1, 4106bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson &prop); 4116bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 4126bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 4136bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson bte_main_postload_cfg(); 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4156bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson /* callback to HAL */ 4166bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson if (status == BTA_SUCCESS) { 4176bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson uid_set = uid_set_create(); 4180620f9706d9aa06ba7f8982840eeb7ab2ad90e7aAdam Lesinski 4196bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_dm_init(uid_set); 4200620f9706d9aa06ba7f8982840eeb7ab2ad90e7aAdam Lesinski 4216bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson /* init rfcomm & l2cap api */ 4226bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_sock_init(uid_set); 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4246bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson /* init pan */ 4256bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_pan_init(); 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4276bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson /* load did configuration */ 4286bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson bte_load_did_conf(BTE_DID_CONF_FILE); 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef BTIF_DM_OOB_TEST 4316bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_dm_load_local_oob(); 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4346bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson future_ready(stack_manager_get_hack_future(), FUTURE_SUCCESS); 4356bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } else { 4366bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson /* cleanup rfcomm & l2cap api */ 4376bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_sock_cleanup(); 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4396bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_pan_cleanup(); 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4416bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson future_ready(stack_manager_get_hack_future(), FUTURE_FAIL); 4426bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 443137aa547f3d163929120d250a87e55dbf6c748abPavlin Radoslavov 444137aa547f3d163929120d250a87e55dbf6c748abPavlin Radoslavov LOG_INFO(LOG_TAG, "%s finished", __func__); 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4486bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 4496bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function btif_disable_bluetooth 4506bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 4516bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description Inititates shutdown of Bluetooth system. 4526bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Any active links will be dropped and device entering 4536bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * non connectable/discoverable mode 4546bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 4556bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns void 4566bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 4576bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 4586bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonbt_status_t btif_disable_bluetooth(void) { 459137aa547f3d163929120d250a87e55dbf6c748abPavlin Radoslavov LOG_INFO(LOG_TAG, "%s entered", __func__); 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4616bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btm_ble_multi_adv_cleanup(); 4629008888d24407541aa383aa4bd363a40abbf954bMyles Watson // TODO(jpawlowski): this should do whole BTA_VendorCleanup(), but it would 4639008888d24407541aa383aa4bd363a40abbf954bMyles Watson // kill the stack now. 464e47b769e71fa88f207db747e62974662e43aa07cJakub Pawlowski 4656bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_dm_on_disable(); 4666bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson /* cleanup rfcomm & l2cap api */ 4676bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_sock_cleanup(); 4686bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_pan_cleanup(); 4696bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTA_DisableBluetooth(); 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 471137aa547f3d163929120d250a87e55dbf6c748abPavlin Radoslavov LOG_INFO(LOG_TAG, "%s finished", __func__); 472137aa547f3d163929120d250a87e55dbf6c748abPavlin Radoslavov 4736bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_SUCCESS; 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4776bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 4786bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function btif_disable_bluetooth_evt 4796bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 4806bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description Event notifying BT disable is now complete. 4816bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Terminates main stack tasks and notifies HAL 4826bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * user with updated BT state. 4836bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 4846bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns void 4856bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 4866bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 4876bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 4886bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonvoid btif_disable_bluetooth_evt(void) { 489137aa547f3d163929120d250a87e55dbf6c748abPavlin Radoslavov LOG_INFO(LOG_TAG, "%s entered", __func__); 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4916bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson bte_main_disable(); 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4936bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson /* callback to HAL */ 4946bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson future_ready(stack_manager_get_hack_future(), FUTURE_SUCCESS); 495137aa547f3d163929120d250a87e55dbf6c748abPavlin Radoslavov 496137aa547f3d163929120d250a87e55dbf6c748abPavlin Radoslavov LOG_INFO(LOG_TAG, "%s finished", __func__); 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5006bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 5016bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function btif_cleanup_bluetooth 5026bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 5036bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description Cleanup BTIF state. 5046bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 5056bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns void 5066bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 5076bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 5086bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 5096bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonbt_status_t btif_cleanup_bluetooth(void) { 510137aa547f3d163929120d250a87e55dbf6c748abPavlin Radoslavov LOG_INFO(LOG_TAG, "%s entered", __func__); 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5126bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTA_VendorCleanup(); 51358318f48fc93afe606c77f3ef83c7bff83b65bf8Pavlin Radoslavov 5146bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_dm_cleanup(); 5156bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_jni_disassociate(); 5166bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_queue_release(); 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5186bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson if (jni_run_loop && message_loop_) { 5196bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson message_loop_->task_runner()->PostTask(FROM_HERE, 5206bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson jni_run_loop->QuitClosure()); 5216bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 522140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowski 5236bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson thread_free(bt_jni_workqueue_thread); 5246bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson bt_jni_workqueue_thread = NULL; 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5266bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson bte_main_cleanup(); 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5286bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_dut_mode = 0; 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 530137aa547f3d163929120d250a87e55dbf6c748abPavlin Radoslavov LOG_INFO(LOG_TAG, "%s finished", __func__); 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5326bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_SUCCESS; 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5366bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 5376bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function btif_dut_mode_cback 5386bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 5396bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description Callback invoked on completion of vendor specific test mode 540f45481678af0694902b5200ba69ced4cb61d73f0Myles Watson * command 5416bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 5426bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns None 5436bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 5446bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 5459008888d24407541aa383aa4bd363a40abbf954bMyles Watsonstatic void btif_dut_mode_cback(UNUSED_ATTR tBTM_VSC_CMPL* p) { 5466bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson /* For now nothing to be done. */ 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5506bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 5516bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function btif_dut_mode_configure 5526bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 5536bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description Configure Test Mode - 'enable' to 1 puts the device in test 554f45481678af0694902b5200ba69ced4cb61d73f0Myles Watson * mode and 0 exits test mode 5556bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 5566bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns BT_STATUS_SUCCESS on success 5576bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 5586bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 5596bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonbt_status_t btif_dut_mode_configure(uint8_t enable) { 5606bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_TRACE_DEBUG("%s", __func__); 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5626bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson if (!stack_manager_get_interface()->get_stack_is_running()) { 5636bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_TRACE_ERROR("btif_dut_mode_configure : Bluetooth not enabled"); 5646bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_NOT_READY; 5656bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 5666bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 5676bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_dut_mode = enable; 5686bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson if (enable == 1) { 5696bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTA_EnableTestMode(); 5706bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } else { 5716bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTA_DisableTestMode(); 5726bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 5736bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_SUCCESS; 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5776bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 5786bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function btif_dut_mode_send 5796bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 5806bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description Sends a HCI Vendor specific command to the controller 5816bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 5826bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns BT_STATUS_SUCCESS on success 5836bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 5846bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 5856bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonbt_status_t btif_dut_mode_send(uint16_t opcode, uint8_t* buf, uint8_t len) { 5866bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson /* TODO: Check that opcode is a vendor command group */ 5876bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_TRACE_DEBUG("%s", __func__); 5886bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson if (!btif_is_dut_mode()) { 5896bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_TRACE_ERROR("Bluedroid HAL needs to be init with test_mode set to 1."); 5906bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_FAIL; 5916bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 5926bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTM_VendorSpecificCommand(opcode, len, buf, btif_dut_mode_cback); 5936bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_SUCCESS; 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 595ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 5976bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 5986bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * btif api adapter property functions 5996bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 6006bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ****************************************************************************/ 6016bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 6026bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonstatic bt_status_t btif_in_get_adapter_properties(void) { 6036bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson bt_property_t properties[6]; 6047dc0525365025e17e289869288b1b7d5146306ccStanley Tng uint32_t num_props = 0; 6056bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 6069e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowski RawAddress addr; 6076bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson bt_bdname_t name; 6086bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson bt_scan_mode_t mode; 6096bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson uint32_t disc_timeout; 6109e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowski RawAddress bonded_devices[BTM_SEC_MAX_DEVICE_RECORDS]; 6116bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson bt_uuid_t local_uuids[BT_MAX_NUM_UUIDS]; 6127dc0525365025e17e289869288b1b7d5146306ccStanley Tng bt_status_t status; 6136bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 6149e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowski /* RawAddress */ 6156bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_STORAGE_FILL_PROPERTY(&properties[num_props], BT_PROPERTY_BDADDR, 6166bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson sizeof(addr), &addr); 6177dc0525365025e17e289869288b1b7d5146306ccStanley Tng status = btif_storage_get_adapter_property(&properties[num_props]); 6187dc0525365025e17e289869288b1b7d5146306ccStanley Tng // Add BT_PROPERTY_BDADDR property into list only when successful. 6197dc0525365025e17e289869288b1b7d5146306ccStanley Tng // Otherwise, skip this property entry. 6207dc0525365025e17e289869288b1b7d5146306ccStanley Tng if (status == BT_STATUS_SUCCESS) { 6217dc0525365025e17e289869288b1b7d5146306ccStanley Tng num_props++; 6227dc0525365025e17e289869288b1b7d5146306ccStanley Tng } 6236bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 6246bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson /* BD_NAME */ 6256bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_STORAGE_FILL_PROPERTY(&properties[num_props], BT_PROPERTY_BDNAME, 6266bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson sizeof(name), &name); 6276bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_storage_get_adapter_property(&properties[num_props]); 6286bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson num_props++; 6296bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 6306bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson /* SCAN_MODE */ 6316bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_STORAGE_FILL_PROPERTY(&properties[num_props], 6326bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BT_PROPERTY_ADAPTER_SCAN_MODE, sizeof(mode), 6336bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson &mode); 6346bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_storage_get_adapter_property(&properties[num_props]); 6356bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson num_props++; 6366bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 6376bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson /* DISC_TIMEOUT */ 6386bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_STORAGE_FILL_PROPERTY(&properties[num_props], 6396bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BT_PROPERTY_ADAPTER_DISCOVERY_TIMEOUT, 6406bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson sizeof(disc_timeout), &disc_timeout); 6416bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_storage_get_adapter_property(&properties[num_props]); 6426bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson num_props++; 6436bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 6446bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson /* BONDED_DEVICES */ 6456bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_STORAGE_FILL_PROPERTY(&properties[num_props], 6466bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BT_PROPERTY_ADAPTER_BONDED_DEVICES, 6476bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson sizeof(bonded_devices), bonded_devices); 6486bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_storage_get_adapter_property(&properties[num_props]); 6496bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson num_props++; 6506bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 6516bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson /* LOCAL UUIDs */ 6526bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_STORAGE_FILL_PROPERTY(&properties[num_props], BT_PROPERTY_UUIDS, 6536bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson sizeof(local_uuids), local_uuids); 6546bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_storage_get_adapter_property(&properties[num_props]); 6556bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson num_props++; 6566bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 6576bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson HAL_CBACK(bt_hal_cbacks, adapter_properties_cb, BT_STATUS_SUCCESS, num_props, 6586bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson properties); 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6606bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_SUCCESS; 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6639e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskistatic bt_status_t btif_in_get_remote_device_properties(RawAddress* bd_addr) { 6646bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson bt_property_t remote_properties[8]; 6656bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson uint32_t num_props = 0; 6666bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 6676bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson bt_bdname_t name, alias; 6686bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson uint32_t cod, devtype; 6696bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson bt_uuid_t remote_uuids[BT_MAX_NUM_UUIDS]; 6706bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 6716bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson memset(remote_properties, 0, sizeof(remote_properties)); 6726bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_STORAGE_FILL_PROPERTY(&remote_properties[num_props], BT_PROPERTY_BDNAME, 6736bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson sizeof(name), &name); 6746bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_storage_get_remote_device_property(bd_addr, 6756bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson &remote_properties[num_props]); 6766bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson num_props++; 6776bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 6786bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_STORAGE_FILL_PROPERTY(&remote_properties[num_props], 6796bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BT_PROPERTY_REMOTE_FRIENDLY_NAME, sizeof(alias), 6806bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson &alias); 6816bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_storage_get_remote_device_property(bd_addr, 6826bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson &remote_properties[num_props]); 6836bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson num_props++; 6846bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 6856bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_STORAGE_FILL_PROPERTY(&remote_properties[num_props], 6866bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BT_PROPERTY_CLASS_OF_DEVICE, sizeof(cod), &cod); 6876bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_storage_get_remote_device_property(bd_addr, 6886bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson &remote_properties[num_props]); 6896bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson num_props++; 6906bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 6916bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_STORAGE_FILL_PROPERTY(&remote_properties[num_props], 6926bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BT_PROPERTY_TYPE_OF_DEVICE, sizeof(devtype), 6936bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson &devtype); 6946bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_storage_get_remote_device_property(bd_addr, 6956bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson &remote_properties[num_props]); 6966bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson num_props++; 6976bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 6986bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_STORAGE_FILL_PROPERTY(&remote_properties[num_props], BT_PROPERTY_UUIDS, 6996bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson sizeof(remote_uuids), remote_uuids); 7006bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_storage_get_remote_device_property(bd_addr, 7016bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson &remote_properties[num_props]); 7026bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson num_props++; 7036bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 7046bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson HAL_CBACK(bt_hal_cbacks, remote_device_properties_cb, BT_STATUS_SUCCESS, 7056bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson bd_addr, num_props, remote_properties); 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7076bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_SUCCESS; 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7116bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 7126bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function execute_storage_request 7136bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 7146bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description Executes adapter storage request in BTIF context 7156bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 7166bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns bt_status_t 7176bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 7186bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7206bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonstatic void execute_storage_request(uint16_t event, char* p_param) { 7216bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson bt_status_t status = BT_STATUS_SUCCESS; 7226bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 7236bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_TRACE_EVENT("execute storage request event : %d", event); 7246bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 7256bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson switch (event) { 7266bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BTIF_CORE_STORAGE_ADAPTER_WRITE: { 7276bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_storage_req_t* p_req = (btif_storage_req_t*)p_param; 7286bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson bt_property_t* p_prop = &(p_req->write_req.prop); 7296bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_TRACE_EVENT("type: %d, len %d, 0x%x", p_prop->type, p_prop->len, 7306bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson p_prop->val); 7316bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 7326bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson status = btif_storage_set_adapter_property(p_prop); 7336bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson HAL_CBACK(bt_hal_cbacks, adapter_properties_cb, status, 1, p_prop); 7346bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } break; 7356bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 7366bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BTIF_CORE_STORAGE_ADAPTER_READ: { 7376bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_storage_req_t* p_req = (btif_storage_req_t*)p_param; 7386bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson char buf[512]; 7396bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson bt_property_t prop; 7406bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson prop.type = p_req->read_req.type; 7416bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson prop.val = (void*)buf; 7426bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson prop.len = sizeof(buf); 7436bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson if (prop.type == BT_PROPERTY_LOCAL_LE_FEATURES) { 7446bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson tBTM_BLE_VSC_CB cmn_vsc_cb; 7456bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson bt_local_le_features_t local_le_features; 7466bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 7476bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson /* LE features are not stored in storage. Should be retrived from stack 7486bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson */ 7496bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTM_BleGetVendorCapabilities(&cmn_vsc_cb); 7506bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson local_le_features.local_privacy_enabled = BTM_BleLocalPrivacyEnabled(); 7516bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 7526bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson prop.len = sizeof(bt_local_le_features_t); 7536bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson if (cmn_vsc_cb.filter_support == 1) 7546bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson local_le_features.max_adv_filter_supported = cmn_vsc_cb.max_filter; 7556bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson else 7566bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson local_le_features.max_adv_filter_supported = 0; 7576bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson local_le_features.max_adv_instance = cmn_vsc_cb.adv_inst_max; 7586bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson local_le_features.max_irk_list_size = cmn_vsc_cb.max_irk_list_sz; 7596bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson local_le_features.rpa_offload_supported = cmn_vsc_cb.rpa_offloading; 7606bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson local_le_features.scan_result_storage_size = 7616bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson cmn_vsc_cb.tot_scan_results_strg; 7626bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson local_le_features.activity_energy_info_supported = 7636bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson cmn_vsc_cb.energy_support; 7646bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson local_le_features.version_supported = cmn_vsc_cb.version_supported; 7656bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson local_le_features.total_trackable_advertisers = 7666bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson cmn_vsc_cb.total_trackable_advertisers; 7676bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 7686bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson local_le_features.extended_scan_support = 7696bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson cmn_vsc_cb.extended_scan_support > 0; 7706bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson local_le_features.debug_logging_supported = 7716bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson cmn_vsc_cb.debug_logging_supported > 0; 7726bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson memcpy(prop.val, &local_le_features, prop.len); 7736bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } else { 7746bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson status = btif_storage_get_adapter_property(&prop); 7756bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 7766bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson HAL_CBACK(bt_hal_cbacks, adapter_properties_cb, status, 1, &prop); 7776bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } break; 7786bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 7796bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BTIF_CORE_STORAGE_ADAPTER_READ_ALL: { 7806bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson status = btif_in_get_adapter_properties(); 7816bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } break; 7826bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 7836bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BTIF_CORE_STORAGE_NOTIFY_STATUS: { 7846bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson HAL_CBACK(bt_hal_cbacks, adapter_properties_cb, status, 0, NULL); 7856bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } break; 7866bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 7876bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson default: 7886bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_TRACE_ERROR("%s invalid event id (%d)", __func__, event); 7896bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 7906bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7936bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonstatic void execute_storage_remote_request(uint16_t event, char* p_param) { 7946bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson bt_status_t status = BT_STATUS_FAIL; 7956bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson bt_property_t prop; 7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7976bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_TRACE_EVENT("execute storage remote request event : %d", event); 7986bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 7996bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson switch (event) { 8006bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BTIF_CORE_STORAGE_REMOTE_READ: { 8016bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson char buf[1024]; 8026bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_storage_req_t* p_req = (btif_storage_req_t*)p_param; 8036bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson prop.type = p_req->read_req.type; 8046bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson prop.val = (void*)buf; 8056bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson prop.len = sizeof(buf); 8066bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 8076bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson status = btif_storage_get_remote_device_property( 8086bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson &(p_req->read_req.bd_addr), &prop); 8096bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson HAL_CBACK(bt_hal_cbacks, remote_device_properties_cb, status, 8106bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson &(p_req->read_req.bd_addr), 1, &prop); 8116bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } break; 8126bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BTIF_CORE_STORAGE_REMOTE_WRITE: { 8136bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_storage_req_t* p_req = (btif_storage_req_t*)p_param; 8146bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson status = btif_storage_set_remote_device_property( 8156bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson &(p_req->write_req.bd_addr), &(p_req->write_req.prop)); 8166bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } break; 8176bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BTIF_CORE_STORAGE_REMOTE_READ_ALL: { 8186bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_storage_req_t* p_req = (btif_storage_req_t*)p_param; 8196bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_in_get_remote_device_properties(&p_req->read_req.bd_addr); 8206bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } break; 8216bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_adapter_properties_evt(bt_status_t status, uint32_t num_props, 8256bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson bt_property_t* p_props) { 8266bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson HAL_CBACK(bt_hal_cbacks, adapter_properties_cb, status, num_props, p_props); 8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8289e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskivoid btif_remote_properties_evt(bt_status_t status, RawAddress* remote_addr, 8296bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson uint32_t num_props, bt_property_t* p_props) { 8306bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson HAL_CBACK(bt_hal_cbacks, remote_device_properties_cb, status, remote_addr, 8316bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson num_props, p_props); 8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8356bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 8366bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function btif_in_storage_request_copy_cb 8376bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 8386bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description Switch context callback function to perform the deep copy for 8396bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * both the adapter and remote_device property API 8406bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 8416bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns None 8426bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 8436bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 8446bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonstatic void btif_in_storage_request_copy_cb(uint16_t event, char* p_new_buf, 8456bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson char* p_old_buf) { 8466bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_storage_req_t* new_req = (btif_storage_req_t*)p_new_buf; 8476bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_storage_req_t* old_req = (btif_storage_req_t*)p_old_buf; 8486bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 8496bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_TRACE_EVENT("%s", __func__); 8506bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson switch (event) { 8516bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BTIF_CORE_STORAGE_REMOTE_WRITE: 8526bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BTIF_CORE_STORAGE_ADAPTER_WRITE: { 85378b81c6db0aed32eb595ce4de7eb22fc24800058Jakub Pawlowski new_req->write_req.bd_addr = old_req->write_req.bd_addr; 8546bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson /* Copy the member variables one at a time */ 8556bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson new_req->write_req.prop.type = old_req->write_req.prop.type; 8566bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson new_req->write_req.prop.len = old_req->write_req.prop.len; 8576bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 8586bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson new_req->write_req.prop.val = 8596bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson (uint8_t*)(p_new_buf + sizeof(btif_storage_req_t)); 8606bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson memcpy(new_req->write_req.prop.val, old_req->write_req.prop.val, 8616bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson old_req->write_req.prop.len); 8626bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } break; 8636bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8676bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 8686bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function btif_get_adapter_properties 8696bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 8706bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description Fetch all available properties (local & remote) 8716bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 8726bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns bt_status_t 8736bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 8746bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 8756bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 8766bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonbt_status_t btif_get_adapter_properties(void) { 8776bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_TRACE_EVENT("%s", __func__); 8786bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 8796bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson if (!btif_is_enabled()) return BT_STATUS_NOT_READY; 8806bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 8816bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return btif_transfer_context(execute_storage_request, 8826bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_CORE_STORAGE_ADAPTER_READ_ALL, NULL, 0, 8836bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson NULL); 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8876bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 8886bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function btif_get_adapter_property 8896bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 8906bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description Fetches property value from local cache 8916bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 8926bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns bt_status_t 8936bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 8946bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 8956bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 8966bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonbt_status_t btif_get_adapter_property(bt_property_type_t type) { 8976bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_storage_req_t req; 8986bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 8996bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_TRACE_EVENT("%s %d", __func__, type); 9006bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 9016bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson /* Allow get_adapter_property only for BDADDR and BDNAME if BT is disabled */ 9026bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson if (!btif_is_enabled() && (type != BT_PROPERTY_BDADDR) && 9036bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson (type != BT_PROPERTY_BDNAME)) 9046bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_NOT_READY; 9056bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 906be01dc9122c61348d5276048eaa98259240855f1Jakub Pawlowski req.read_req.bd_addr = RawAddress::kEmpty; 9076bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson req.read_req.type = type; 9086bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 9096bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return btif_transfer_context(execute_storage_request, 9106bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_CORE_STORAGE_ADAPTER_READ, (char*)&req, 9116bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson sizeof(btif_storage_req_t), NULL); 9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9156bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 9166bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function btif_set_adapter_property 9176bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 9186bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description Updates core stack with property value and stores it in 9196bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * local cache 9206bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 9216bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns bt_status_t 9226bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 9236bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9256bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonbt_status_t btif_set_adapter_property(const bt_property_t* property) { 9266bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_storage_req_t req; 9276bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson bt_status_t status = BT_STATUS_SUCCESS; 9286bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson int storage_req_id = BTIF_CORE_STORAGE_NOTIFY_STATUS; /* default */ 9296bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson char bd_name[BTM_MAX_LOC_BD_NAME_LEN + 1]; 9306bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson uint16_t name_len = 0; 9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9326bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_TRACE_EVENT("btif_set_adapter_property type: %d, len %d, 0x%x", 9336bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson property->type, property->len, property->val); 9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9356bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson if (!btif_is_enabled()) return BT_STATUS_NOT_READY; 9366bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 9376bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson switch (property->type) { 9386bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BT_PROPERTY_BDNAME: { 9396bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson name_len = property->len > BTM_MAX_LOC_BD_NAME_LEN 9406bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ? BTM_MAX_LOC_BD_NAME_LEN 9416bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson : property->len; 9426bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson memcpy(bd_name, property->val, name_len); 9436bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson bd_name[name_len] = '\0'; 9446bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 9456bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_TRACE_EVENT("set property name : %s", (char*)bd_name); 9466bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 9476bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTA_DmSetDeviceName((char*)bd_name); 9486bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 9496bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson storage_req_id = BTIF_CORE_STORAGE_ADAPTER_WRITE; 9506bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } break; 9516bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 9526bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BT_PROPERTY_ADAPTER_SCAN_MODE: { 9536bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson bt_scan_mode_t mode = *(bt_scan_mode_t*)property->val; 9546bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson tBTA_DM_DISC disc_mode; 9556bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson tBTA_DM_CONN conn_mode; 9566bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 9576bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson switch (mode) { 9586bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BT_SCAN_MODE_NONE: 9596bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson disc_mode = BTA_DM_NON_DISC; 9606bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson conn_mode = BTA_DM_NON_CONN; 9616bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 9626bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 9636bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BT_SCAN_MODE_CONNECTABLE: 9646bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson disc_mode = BTA_DM_NON_DISC; 9656bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson conn_mode = BTA_DM_CONN; 9666bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 9676bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 9686bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE: 9696bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson disc_mode = BTA_DM_GENERAL_DISC; 9706bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson conn_mode = BTA_DM_CONN; 9716bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9736bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson default: 9746bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_TRACE_ERROR("invalid scan mode (0x%x)", mode); 9756bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_PARM_INVALID; 9766bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 9776bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 9786bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_TRACE_EVENT("set property scan mode : %x", mode); 9796bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 9806bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTA_DmSetVisibility(disc_mode, conn_mode, BTA_DM_IGNORE, BTA_DM_IGNORE); 9816bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 9826bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson storage_req_id = BTIF_CORE_STORAGE_ADAPTER_WRITE; 9836bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } break; 9846bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BT_PROPERTY_ADAPTER_DISCOVERY_TIMEOUT: { 9856bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson /* Nothing to do beside store the value in NV. Java 9866bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson will change the SCAN_MODE property after setting timeout, 9876bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson if required */ 9886bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson storage_req_id = BTIF_CORE_STORAGE_ADAPTER_WRITE; 9896bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } break; 9906bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BT_PROPERTY_BDADDR: 9916bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BT_PROPERTY_UUIDS: 9926bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BT_PROPERTY_ADAPTER_BONDED_DEVICES: 9936bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson case BT_PROPERTY_REMOTE_FRIENDLY_NAME: 9946bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson /* no write support through HAL, these properties are only populated from 9956bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * BTA events */ 9966bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson status = BT_STATUS_FAIL; 9976bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 9986bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson default: 9996bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_TRACE_ERROR("btif_get_adapter_property : invalid type %d", 10006bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson property->type); 10016bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson status = BT_STATUS_FAIL; 10026bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 10036bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10056bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson if (storage_req_id != BTIF_CORE_STORAGE_NO_ACTION) { 10066bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson /* pass on to storage for updating local database */ 10076bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 10085f6ecfac764e2fd95fe266b2c25f9fafa4a4e405Jack He req.write_req.bd_addr = RawAddress::kEmpty; 10096bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson memcpy(&(req.write_req.prop), property, sizeof(bt_property_t)); 10106bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 10116bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return btif_transfer_context(execute_storage_request, storage_req_id, 10126bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson (char*)&req, 10136bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson sizeof(btif_storage_req_t) + property->len, 10146bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_in_storage_request_copy_cb); 10156bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 10166bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 10176bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return status; 10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10216bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 10226bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function btif_get_remote_device_property 10236bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 10246bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description Fetches the remote device property from the NVRAM 10256bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 10266bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns bt_status_t 10276bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 10286bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 10299e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskibt_status_t btif_get_remote_device_property(RawAddress* remote_addr, 10306bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson bt_property_type_t type) { 10316bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_storage_req_t req; 10326bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 10336bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson if (!btif_is_enabled()) return BT_STATUS_NOT_READY; 10346bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 10355f6ecfac764e2fd95fe266b2c25f9fafa4a4e405Jack He req.read_req.bd_addr = *remote_addr; 10366bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson req.read_req.type = type; 10376bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return btif_transfer_context(execute_storage_remote_request, 10386bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_CORE_STORAGE_REMOTE_READ, (char*)&req, 10396bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson sizeof(btif_storage_req_t), NULL); 10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10436bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 10446bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function btif_get_remote_device_properties 10456bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 10466bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description Fetches all the remote device properties from NVRAM 10476bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 10486bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns bt_status_t 10496bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 10506bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 10519e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskibt_status_t btif_get_remote_device_properties(RawAddress* remote_addr) { 10526bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_storage_req_t req; 10536bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 10546bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson if (!btif_is_enabled()) return BT_STATUS_NOT_READY; 10556bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 10565f6ecfac764e2fd95fe266b2c25f9fafa4a4e405Jack He req.read_req.bd_addr = *remote_addr; 10576bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return btif_transfer_context(execute_storage_remote_request, 10586bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_CORE_STORAGE_REMOTE_READ_ALL, (char*)&req, 10596bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson sizeof(btif_storage_req_t), NULL); 10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10636bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 10646bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function btif_set_remote_device_property 10656bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 10666bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description Writes the remote device property to NVRAM. 10676bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Currently, BT_PROPERTY_REMOTE_FRIENDLY_NAME is the only 10686bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * remote device property that can be set 10696bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 10706bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns bt_status_t 10716bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 10726bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 10739e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskibt_status_t btif_set_remote_device_property(RawAddress* remote_addr, 10746bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson const bt_property_t* property) { 10756bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_storage_req_t req; 10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10776bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson if (!btif_is_enabled()) return BT_STATUS_NOT_READY; 10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1079be01dc9122c61348d5276048eaa98259240855f1Jakub Pawlowski req.write_req.bd_addr = *remote_addr; 10806bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson memcpy(&(req.write_req.prop), property, sizeof(bt_property_t)); 10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10826bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return btif_transfer_context(execute_storage_remote_request, 10836bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_CORE_STORAGE_REMOTE_WRITE, (char*)&req, 10846bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson sizeof(btif_storage_req_t) + property->len, 10856bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_in_storage_request_copy_cb); 10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10886bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson/******************************************************************************* 10896bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 10906bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function btif_get_remote_service_record 10916bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 10926bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description Looks up the service matching uuid on the remote device 10936bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * and fetches the SCN and service_name if the UUID is found 10946bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 10956bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns bt_status_t 10966bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 10976bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 10989e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskibt_status_t btif_get_remote_service_record(RawAddress* remote_addr, 10996bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson bt_uuid_t* uuid) { 11006bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson if (!btif_is_enabled()) return BT_STATUS_NOT_READY; 11016bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 11026bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return btif_dm_get_remote_service_record(remote_addr, uuid); 11036bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson} 11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11066bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 11076bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function btif_get_enabled_services_mask 11086bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 11096bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description Fetches currently enabled services 11106bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 11116bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns tBTA_SERVICE_MASK 11126bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 11136bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 11146bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 11156bd442f543972b072ef2cbbcf2f7c91202de1045Myles WatsontBTA_SERVICE_MASK btif_get_enabled_services_mask(void) { 11166bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return btif_enabled_services; 11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11206bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 11216bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function btif_enable_service 11226bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 11236bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description Enables the service 'service_ID' to the service_mask. 11246bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Upon BT enable, BTIF core shall invoke the BTA APIs to 11256bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * enable the profiles 11266bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 11276bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns bt_status_t 11286bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 11296bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 11306bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonbt_status_t btif_enable_service(tBTA_SERVICE_ID service_id) { 11316bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson tBTA_SERVICE_ID* p_id = &service_id; 11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11336bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson /* If BT is enabled, we need to switch to BTIF context and trigger the 11346bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * enable for that profile 11356bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 11366bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Otherwise, we just set the flag. On BT_Enable, the DM will trigger 11376bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * enable for the profiles that have been enabled */ 11386bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 11396bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_enabled_services |= (1 << service_id); 11406bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 11416bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_TRACE_DEBUG("%s: current services:0x%x", __func__, 11426bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_enabled_services); 11436bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 11446bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson if (btif_is_enabled()) { 11456bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_transfer_context(btif_dm_execute_service_request, 11466bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_DM_ENABLE_SERVICE, (char*)p_id, 11476bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson sizeof(tBTA_SERVICE_ID), NULL); 11486bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 11496bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 11506bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_SUCCESS; 11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11536bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 11546bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function btif_disable_service 11556bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 11566bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description Disables the service 'service_ID' to the service_mask. 11576bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Upon BT disable, BTIF core shall invoke the BTA APIs to 11586bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * disable the profiles 11596bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 11606bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns bt_status_t 11616bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * 11626bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/ 11636bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonbt_status_t btif_disable_service(tBTA_SERVICE_ID service_id) { 11646bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson tBTA_SERVICE_ID* p_id = &service_id; 11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11666bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson /* If BT is enabled, we need to switch to BTIF context and trigger the 11676bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * disable for that profile so that the appropriate uuid_property_changed will 11686bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * be triggerred. Otherwise, we just need to clear the service_id in the mask 11696bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson */ 11706bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 11716bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_enabled_services &= (tBTA_SERVICE_MASK)(~(1 << service_id)); 11726bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 11736bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_TRACE_DEBUG("%s: Current Services:0x%x", __func__, 11746bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_enabled_services); 11756bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 11766bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson if (btif_is_enabled()) { 11776bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson btif_transfer_context(btif_dm_execute_service_request, 11786bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_DM_DISABLE_SERVICE, (char*)p_id, 11796bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson sizeof(tBTA_SERVICE_ID), NULL); 11806bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 11816bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 11826bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return BT_STATUS_SUCCESS; 11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1184bad70b1d0071ee9b16a029ff145e8e53038571ffZhihai Xu 1185140645f6b8d87464c08f082bd14740eecab23f71Jakub Pawlowskistatic void btif_jni_associate() { 11860eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Manton BTIF_TRACE_DEBUG("%s Associating thread to JVM", __func__); 11870eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Manton HAL_CBACK(bt_hal_cbacks, thread_evt_cb, ASSOCIATE_JVM); 1188bad70b1d0071ee9b16a029ff145e8e53038571ffZhihai Xu} 11890eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Manton 11901bd691cb8ae3c23ffe25b5ca1fcfd11b82a9fbdaPavlin Radoslavovstatic void btif_jni_disassociate() { 11918ea8188a481504641fc6a72087704eb808d0bd87Zach Johnson BTIF_TRACE_DEBUG("%s Disassociating thread from JVM", __func__); 11928ea8188a481504641fc6a72087704eb808d0bd87Zach Johnson HAL_CBACK(bt_hal_cbacks, thread_evt_cb, DISASSOCIATE_JVM); 11938ea8188a481504641fc6a72087704eb808d0bd87Zach Johnson bt_hal_cbacks = NULL; 11940eefef0f35dbf400f295e4be8c4c1ee295042d88Chris Manton} 1195