15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 3819a24084c0fd90d56e54653b4b286e085037da6Mudumba Ananth * Copyright (C) 1999-2014 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * This file contains functions that handle inquiries. These include 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * setting discoverable mode, controlling the mode of the Baseband, and 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * maintaining a small database of inquiry responses, with API for people 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * to browse it. 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include <stddef.h> 29911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include <stdio.h> 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdlib.h> 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3379ecab5d0418fde77e9afcdd451bd713af73e180Chris Manton#include "device/include/controller.h" 34d7ffd64accbd50a27289a388856e56244ccbb5daMyles Watson#include "osi/include/osi.h" 35d3842ed786d7adf1de9f0f9b2cd0de18fa5576e2Andre Eisenbach#include "osi/include/time.h" 36d3842ed786d7adf1de9f0f9b2cd0de18fa5576e2Andre Eisenbach 37cfd6525c3d30e0efec789b5ddbf25dd24e37cc15Jakub Pawlowski#include "advertise_data_parser.h" 38258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov#include "bt_common.h" 39911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "bt_types.h" 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h" 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h" 42911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "btu.h" 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcidefs.h" 44911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "hcimsgs.h" 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov/* 3 second timeout waiting for responses */ 4778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov#define BTM_INQ_REPLY_TIMEOUT_MS (3 * 1000) 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* TRUE to enable DEBUG traces for btm_inq */ 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef BTM_INQ_DEBUG 51d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#define BTM_INQ_DEBUG FALSE 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov 54911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonextern fixed_queue_t* btu_general_alarm_queue; 5578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov 56ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************/ 579ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson/* L O C A L D A T A D E F I N I T I O N S */ 58ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************/ 59911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic const LAP general_inq_lap = {0x9e, 0x8b, 0x33}; 60911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic const LAP limited_inq_lap = {0x9e, 0x8b, 0x00}; 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 62911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonconst uint16_t BTM_EIR_UUID_LKUP_TBL[BTM_EIR_MAX_SERVICES] = { 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UUID_SERVCLASS_SERVICE_DISCOVERY_SERVER, 64911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* UUID_SERVCLASS_BROWSE_GROUP_DESCRIPTOR, */ 65911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* UUID_SERVCLASS_PUBLIC_BROWSE_GROUP, */ 66911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UUID_SERVCLASS_SERIAL_PORT, UUID_SERVCLASS_LAN_ACCESS_USING_PPP, 67911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UUID_SERVCLASS_DIALUP_NETWORKING, UUID_SERVCLASS_IRMC_SYNC, 68911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UUID_SERVCLASS_OBEX_OBJECT_PUSH, UUID_SERVCLASS_OBEX_FILE_TRANSFER, 69911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UUID_SERVCLASS_IRMC_SYNC_COMMAND, UUID_SERVCLASS_HEADSET, 70911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UUID_SERVCLASS_CORDLESS_TELEPHONY, UUID_SERVCLASS_AUDIO_SOURCE, 71911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UUID_SERVCLASS_AUDIO_SINK, UUID_SERVCLASS_AV_REM_CTRL_TARGET, 72911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* UUID_SERVCLASS_ADV_AUDIO_DISTRIBUTION, */ 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UUID_SERVCLASS_AV_REMOTE_CONTROL, 74911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* UUID_SERVCLASS_VIDEO_CONFERENCING, */ 75911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UUID_SERVCLASS_INTERCOM, UUID_SERVCLASS_FAX, 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UUID_SERVCLASS_HEADSET_AUDIO_GATEWAY, 77911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* UUID_SERVCLASS_WAP, */ 78911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* UUID_SERVCLASS_WAP_CLIENT, */ 79911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UUID_SERVCLASS_PANU, UUID_SERVCLASS_NAP, UUID_SERVCLASS_GN, 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UUID_SERVCLASS_DIRECT_PRINTING, 81911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* UUID_SERVCLASS_REFERENCE_PRINTING, */ 82911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UUID_SERVCLASS_IMAGING, UUID_SERVCLASS_IMAGING_RESPONDER, 83911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UUID_SERVCLASS_IMAGING_AUTO_ARCHIVE, UUID_SERVCLASS_IMAGING_REF_OBJECTS, 84911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UUID_SERVCLASS_HF_HANDSFREE, UUID_SERVCLASS_AG_HANDSFREE, 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UUID_SERVCLASS_DIR_PRT_REF_OBJ_SERVICE, 86911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* UUID_SERVCLASS_REFLECTED_UI, */ 87911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UUID_SERVCLASS_BASIC_PRINTING, UUID_SERVCLASS_PRINTING_STATUS, 88911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UUID_SERVCLASS_HUMAN_INTERFACE, UUID_SERVCLASS_CABLE_REPLACEMENT, 89911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UUID_SERVCLASS_HCRP_PRINT, UUID_SERVCLASS_HCRP_SCAN, 90911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* UUID_SERVCLASS_COMMON_ISDN_ACCESS, */ 91911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* UUID_SERVCLASS_VIDEO_CONFERENCING_GW, */ 92911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* UUID_SERVCLASS_UDI_MT, */ 93911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* UUID_SERVCLASS_UDI_TA, */ 94911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* UUID_SERVCLASS_VCP, */ 95911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UUID_SERVCLASS_SAP, UUID_SERVCLASS_PBAP_PCE, UUID_SERVCLASS_PBAP_PSE, 96911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UUID_SERVCLASS_PHONE_ACCESS, UUID_SERVCLASS_HEADSET_HS, 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UUID_SERVCLASS_PNP_INFORMATION, 98911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* UUID_SERVCLASS_GENERIC_NETWORKING, */ 99911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* UUID_SERVCLASS_GENERIC_FILETRANSFER, */ 100911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* UUID_SERVCLASS_GENERIC_AUDIO, */ 101911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* UUID_SERVCLASS_GENERIC_TELEPHONY, */ 102911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* UUID_SERVCLASS_UPNP_SERVICE, */ 103911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* UUID_SERVCLASS_UPNP_IP_SERVICE, */ 104911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* UUID_SERVCLASS_ESDP_UPNP_IP_PAN, */ 105911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* UUID_SERVCLASS_ESDP_UPNP_IP_LAP, */ 106911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* UUID_SERVCLASS_ESDP_UPNP_IP_L2CAP, */ 107911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UUID_SERVCLASS_VIDEO_SOURCE, UUID_SERVCLASS_VIDEO_SINK, 108911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* UUID_SERVCLASS_VIDEO_DISTRIBUTION */ 109911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UUID_SERVCLASS_MESSAGE_ACCESS, UUID_SERVCLASS_MESSAGE_NOTIFICATION, 110911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UUID_SERVCLASS_HDP_SOURCE, UUID_SERVCLASS_HDP_SINK}; 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 112ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************/ 1139ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson/* L O C A L F U N C T I O N P R O T O T Y P E S */ 114ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************/ 115911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_initiate_inquiry(tBTM_INQUIRY_VAR_ST* p_inq); 116911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic tBTM_STATUS btm_set_inq_event_filter(uint8_t filter_cond_type, 117911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_INQ_FILT_COND* p_filt_cond); 118911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_clr_inq_result_flt(void); 119911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 120911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic uint8_t btm_convert_uuid_to_eir_service(uint16_t uuid16); 121911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_set_eir_uuid(uint8_t* p_eir, tBTM_INQ_RESULTS* p_results); 122cfd6525c3d30e0efec789b5ddbf25dd24e37cc15Jakub Pawlowskistatic const uint8_t* btm_eir_get_uuid_list(uint8_t* p_eir, size_t eir_len, 123cfd6525c3d30e0efec789b5ddbf25dd24e37cc15Jakub Pawlowski uint8_t uuid_size, 124cfd6525c3d30e0efec789b5ddbf25dd24e37cc15Jakub Pawlowski uint8_t* p_num_uuid, 125cfd6525c3d30e0efec789b5ddbf25dd24e37cc15Jakub Pawlowski uint8_t* p_uuid_list_type); 126cfd6525c3d30e0efec789b5ddbf25dd24e37cc15Jakub Pawlowskistatic uint16_t btm_convert_uuid_to_uuid16(const uint8_t* p_uuid, 127cfd6525c3d30e0efec789b5ddbf25dd24e37cc15Jakub Pawlowski uint8_t uuid_size); 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 130ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 131ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_SetDiscoverability 132ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 133ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to set the device into or out of 134ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * discoverable mode. Discoverable mode means inquiry 1359ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * scans are enabled. If a value of '0' is entered for window 1369ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * or interval, the default values are used. 137ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 138ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns BTM_SUCCESS if successful 139ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_BUSY if a setting of the filter is already in progress 140ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_NO_RESOURCES if couldn't get a memory pool buffer 141ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_ILLEGAL_VALUE if a bad parameter was detected 142ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_WRONG_MODE if the device is not up. 143ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 144ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 145911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_SetDiscoverability(uint16_t inq_mode, uint16_t window, 146911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t interval) { 147911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t scan_mode = 0; 148911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t service_class; 149911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_cod; 150911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t major, minor; 151911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson DEV_CLASS cod; 152911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson LAP temp_lap[2]; 153911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool is_limited; 154911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool cod_limited; 155911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 156911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("BTM_SetDiscoverability"); 157911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (controller_get_interface()->supports_ble()) { 158911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_ble_set_discoverability((uint16_t)(inq_mode)) == BTM_SUCCESS) { 159911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_inq_vars.discoverable_mode &= (~BTM_BLE_DISCOVERABLE_MASK); 160911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_inq_vars.discoverable_mode |= 161911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (inq_mode & BTM_BLE_DISCOVERABLE_MASK); 162911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 163911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 164911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson inq_mode &= ~BTM_BLE_DISCOVERABLE_MASK; 165911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 166911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /*** Check mode parameter ***/ 167911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (inq_mode > BTM_MAX_DISCOVERABLE) return (BTM_ILLEGAL_VALUE); 168911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 169911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Make sure the controller is active */ 170911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!controller_get_interface()->get_is_ready()) return (BTM_DEV_RESET); 171911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 172911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If the window and/or interval is '0', set to default values */ 173911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!window) window = BTM_DEFAULT_DISC_WINDOW; 174911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 175911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!interval) interval = BTM_DEFAULT_DISC_INTERVAL; 176911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 177911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API( 178911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "BTM_SetDiscoverability: mode %d [NonDisc-0, Lim-1, Gen-2], window " 179911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "0x%04x, interval 0x%04x", 180911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson inq_mode, window, interval); 181911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 182911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /*** Check for valid window and interval parameters ***/ 183911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /*** Only check window and duration if mode is connectable ***/ 184911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (inq_mode != BTM_NON_DISCOVERABLE) { 185911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* window must be less than or equal to interval */ 186911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (window < HCI_MIN_INQUIRYSCAN_WINDOW || 187911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson window > HCI_MAX_INQUIRYSCAN_WINDOW || 188911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson interval < HCI_MIN_INQUIRYSCAN_INTERVAL || 189911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson interval > HCI_MAX_INQUIRYSCAN_INTERVAL || window > interval) { 190911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_ILLEGAL_VALUE); 191911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 192911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 193911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 194911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Set the IAC if needed */ 195911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (inq_mode != BTM_NON_DISCOVERABLE) { 196911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (inq_mode & BTM_LIMITED_DISCOVERABLE) { 197911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Use the GIAC and LIAC codes for limited discoverable mode */ 198911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(temp_lap[0], limited_inq_lap, LAP_LEN); 199911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(temp_lap[1], general_inq_lap, LAP_LEN); 200911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 201911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_write_cur_iac_lap(2, (LAP * const)temp_lap); 202911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 203911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_write_cur_iac_lap(1, (LAP * const) & general_inq_lap); 204911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 205911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 206911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson scan_mode |= HCI_INQUIRY_SCAN_ENABLED; 207911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 208911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 209911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Send down the inquiry scan window and period if changed */ 210911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((window != btm_cb.btm_inq_vars.inq_scan_window) || 211911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (interval != btm_cb.btm_inq_vars.inq_scan_period)) { 212911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_write_inqscan_cfg(interval, window); 213911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_inq_vars.inq_scan_window = window; 214911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_inq_vars.inq_scan_period = interval; 215911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 216911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 217911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.btm_inq_vars.connectable_mode & BTM_CONNECTABLE_MASK) 218911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson scan_mode |= HCI_PAGE_SCAN_ENABLED; 219911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 220911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_write_scan_enable(scan_mode); 221911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_inq_vars.discoverable_mode &= (~BTM_DISCOVERABLE_MASK); 222911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_inq_vars.discoverable_mode |= inq_mode; 223911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 224911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Change the service class bit if mode has changed */ 225911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cod = BTM_ReadDeviceClass(); 226911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_COD_SERVICE_CLASS(service_class, p_cod); 227911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson is_limited = (inq_mode & BTM_LIMITED_DISCOVERABLE) ? true : false; 228911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson cod_limited = (service_class & BTM_COD_SERVICE_LMTD_DISCOVER) ? true : false; 229911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_limited ^ cod_limited) { 230911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_COD_MINOR_CLASS(minor, p_cod); 231911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_COD_MAJOR_CLASS(major, p_cod); 232911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_limited) 233911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson service_class |= BTM_COD_SERVICE_LMTD_DISCOVER; 234911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 235911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson service_class &= ~BTM_COD_SERVICE_LMTD_DISCOVER; 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 237911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson FIELDS_TO_COD(cod, minor, major, service_class); 238911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (void)BTM_SetDeviceClass(cod); 239911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 241911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_SUCCESS); 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 245ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 246ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_SetInquiryScanType 247ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 248ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to set the iquiry scan-type to 249ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * standard or interlaced. 250ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 251ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns BTM_SUCCESS if successful 252ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_MODE_UNSUPPORTED if not a 1.2 device 253ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_WRONG_MODE if the device is not up. 254ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 255ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 256911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_SetInquiryScanType(uint16_t scan_type) { 257911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("BTM_SetInquiryScanType"); 258911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (scan_type != BTM_SCAN_TYPE_STANDARD && 259911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson scan_type != BTM_SCAN_TYPE_INTERLACED) 260911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_ILLEGAL_VALUE); 261911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 262911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* whatever app wants if device is not 1.2 scan type should be STANDARD */ 263911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!controller_get_interface()->supports_interlaced_inquiry_scan()) 264911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_MODE_UNSUPPORTED); 265911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 266911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Check for scan type if configuration has been changed */ 267911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (scan_type != btm_cb.btm_inq_vars.inq_scan_type) { 268911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (BTM_IsDeviceUp()) { 269911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_write_inqscan_type((uint8_t)scan_type); 270911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_inq_vars.inq_scan_type = scan_type; 271911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 272911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_WRONG_MODE); 273911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 274911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_SUCCESS); 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 278ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 279ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_SetPageScanType 280ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 281ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to set the page scan-type to 282ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * standard or interlaced. 283ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 284ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns BTM_SUCCESS if successful 285ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_MODE_UNSUPPORTED if not a 1.2 device 286ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_WRONG_MODE if the device is not up. 287ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 288ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 289911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_SetPageScanType(uint16_t scan_type) { 290911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("BTM_SetPageScanType"); 291911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (scan_type != BTM_SCAN_TYPE_STANDARD && 292911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson scan_type != BTM_SCAN_TYPE_INTERLACED) 293911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_ILLEGAL_VALUE); 294911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 295911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* whatever app wants if device is not 1.2 scan type should be STANDARD */ 296911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!controller_get_interface()->supports_interlaced_inquiry_scan()) 297911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_MODE_UNSUPPORTED); 298911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 299911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Check for scan type if configuration has been changed */ 300911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (scan_type != btm_cb.btm_inq_vars.page_scan_type) { 301911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (BTM_IsDeviceUp()) { 302911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_write_pagescan_type((uint8_t)scan_type); 303911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_inq_vars.page_scan_type = scan_type; 304911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 305911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_WRONG_MODE); 306911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 307911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_SUCCESS); 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 311ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 312ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_SetInquiryMode 313ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 314ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to set standard or with RSSI 315ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * mode of the inquiry for local device. 316ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 317ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Output Params: mode - standard, with RSSI, extended 318ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 319ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns BTM_SUCCESS if successful 320ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_NO_RESOURCES if couldn't get a memory pool buffer 321ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_ILLEGAL_VALUE if a bad parameter was detected 322ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_WRONG_MODE if the device is not up. 323ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 324ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 325911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_SetInquiryMode(uint8_t mode) { 326911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson const controller_t* controller = controller_get_interface(); 327911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("BTM_SetInquiryMode"); 328911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (mode == BTM_INQ_RESULT_STANDARD) { 329911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* mandatory mode */ 330911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if (mode == BTM_INQ_RESULT_WITH_RSSI) { 331911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!controller->supports_rssi_with_inquiry_results()) 332911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_MODE_UNSUPPORTED); 333911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if (mode == BTM_INQ_RESULT_EXTENDED) { 334911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!controller->supports_extended_inquiry_response()) 335911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_MODE_UNSUPPORTED); 336911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 337911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_ILLEGAL_VALUE); 338911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 339911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!BTM_IsDeviceUp()) return (BTM_WRONG_MODE); 340911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 341911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_write_inquiry_mode(mode); 342911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 343911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_SUCCESS); 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 347ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 348ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_ReadDiscoverability 349ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 350ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to read the current discoverability 351ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * mode of the device. 352ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 353ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Output Params: p_window - current inquiry scan duration 354ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_interval - current inquiry scan interval 355ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 356ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns BTM_NON_DISCOVERABLE, BTM_LIMITED_DISCOVERABLE, or 357ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_GENERAL_DISCOVERABLE 358ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 359ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 360911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint16_t BTM_ReadDiscoverability(uint16_t* p_window, uint16_t* p_interval) { 361911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("BTM_ReadDiscoverability"); 362911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_window) *p_window = btm_cb.btm_inq_vars.inq_scan_window; 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 364911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_interval) *p_interval = btm_cb.btm_inq_vars.inq_scan_period; 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 366911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (btm_cb.btm_inq_vars.discoverable_mode); 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 370ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 371ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_SetPeriodicInquiryMode 372ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3739ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called to set the device periodic inquiry 3749ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * mode. If the duration is zero, the periodic inquiry mode is 3759ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * cancelled. 376ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3779ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Note: We currently do not allow concurrent inquiry and 3789ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * periodic inquiry. 379ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 380ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: p_inqparms - pointer to the inquiry information 381ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * mode - GENERAL or LIMITED inquiry 3829ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * duration - length in 1.28 sec intervals (If '0', the 3839ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * inquiry is CANCELLED) 3849ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * max_resps - maximum amount of devices to search for 3859ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * before ending the inquiry 3869ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * filter_cond_type - BTM_CLR_INQUIRY_FILTER, 3879ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * BTM_FILTER_COND_DEVICE_CLASS, or 388ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_FILTER_COND_BD_ADDR 3899ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * filter_cond - value for the filter (based on 3909ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * filter_cond_type) 391ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 3929ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * max_delay - maximum amount of time between successive 3939ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * inquiries 3949ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * min_delay - minimum amount of time between successive 3959ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * inquiries 3969ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * p_results_cb - callback returning pointer to results 3979ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * (tBTM_INQ_RESULTS) 398ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 399ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns BTM_CMD_STARTED if successfully started 400ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_ILLEGAL_VALUE if a bad parameter is detected 401ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_NO_RESOURCES if could not allocate a message buffer 402ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SUCCESS - if cancelling the periodic inquiry 403ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_BUSY - if an inquiry is already active 404ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_WRONG_MODE if the device is not up. 405ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 406ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 407911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_SetPeriodicInquiryMode(tBTM_INQ_PARMS* p_inqparms, 408911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t max_delay, uint16_t min_delay, 409911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_INQ_RESULTS_CB* p_results_cb) { 410911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_STATUS status; 411911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_INQUIRY_VAR_ST* p_inq = &btm_cb.btm_inq_vars; 412911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 413911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API( 414911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "BTM_SetPeriodicInquiryMode: mode: %d, dur: %d, rsps: %d, flt: %d, min: " 415911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "%d, max: %d", 416911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inqparms->mode, p_inqparms->duration, p_inqparms->max_resps, 417911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inqparms->filter_cond_type, min_delay, max_delay); 418911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 419911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /*** Make sure the device is ready ***/ 420911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!BTM_IsDeviceUp()) return (BTM_WRONG_MODE); 421911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 422911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Only one active inquiry is allowed in this implementation. 423911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson Also do not allow an inquiry if the inquiry filter is being updated */ 424911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inq->inq_active || p_inq->inqfilt_active) return (BTM_BUSY); 425911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 426911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If illegal parameters return false */ 427911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inqparms->mode != BTM_GENERAL_INQUIRY && 428911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inqparms->mode != BTM_LIMITED_INQUIRY) 429911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_ILLEGAL_VALUE); 430911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 431911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Verify the parameters for this command */ 432911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inqparms->duration < BTM_MIN_INQUIRY_LEN || 433911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inqparms->duration > BTM_MAX_INQUIRY_LENGTH || 434911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson min_delay <= p_inqparms->duration || 435911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson min_delay < BTM_PER_INQ_MIN_MIN_PERIOD || 436911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson min_delay > BTM_PER_INQ_MAX_MIN_PERIOD || max_delay <= min_delay || 437911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson max_delay < BTM_PER_INQ_MIN_MAX_PERIOD) 438911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* max_delay > BTM_PER_INQ_MAX_MAX_PERIOD)*/ 439911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* BTM_PER_INQ_MAX_MAX_PERIOD set to 1's in all bits. Condition resulting in 440911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson false always*/ 441911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 442911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_ILLEGAL_VALUE); 443911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 444911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 445911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Save the inquiry parameters to be used upon the completion of 446911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * setting/clearing the inquiry filter */ 447911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->inqparms = *p_inqparms; 448911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->per_min_delay = min_delay; 449911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->per_max_delay = max_delay; 450911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->inq_cmpl_info.num_resp = 0; /* Clear the results counter */ 451911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->p_inq_results_cb = p_results_cb; 452911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 453911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->inq_active = (uint8_t)( 454911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_inqparms->mode == BTM_LIMITED_INQUIRY) 455911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ? (BTM_LIMITED_INQUIRY_ACTIVE | BTM_PERIODIC_INQUIRY_ACTIVE) 456911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson : (BTM_GENERAL_INQUIRY_ACTIVE | BTM_PERIODIC_INQUIRY_ACTIVE)); 457911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 458911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If a filter is specified, then save it for later and clear the current 459911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson filter. 460911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson The setting of the filter is done upon completion of clearing of the 461911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson previous 462911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson filter. 463911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 464911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inqparms->filter_cond_type != BTM_CLR_INQUIRY_FILTER) { 465911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->state = BTM_INQ_CLR_FILT_STATE; 466911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inqparms->filter_cond_type = BTM_CLR_INQUIRY_FILTER; 467911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else /* The filter is not being used so simply clear it; the inquiry can 468911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson start after this operation */ 469911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->state = BTM_INQ_SET_FILT_STATE; 470911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 471911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Before beginning the inquiry the current filter must be cleared, so 472911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * initiate the command */ 473911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson status = btm_set_inq_event_filter(p_inqparms->filter_cond_type, 474911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson &p_inqparms->filter_cond); 475911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (status != BTM_CMD_STARTED) { 476911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If set filter command is not succesful reset the state */ 477911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->p_inq_results_cb = NULL; 478911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->state = BTM_INQ_INACTIVE_STATE; 479911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 481911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (status); 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 485ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 486ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_CancelPeriodicInquiry 487ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 488ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function cancels a periodic inquiry 489ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 490ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns 491ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_NO_RESOURCES if could not allocate a message buffer 492ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_SUCCESS - if cancelling the periodic inquiry 493ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_WRONG_MODE if the device is not up. 494ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 495ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 496911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_CancelPeriodicInquiry(void) { 497911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_INQUIRY_VAR_ST* p_inq = &btm_cb.btm_inq_vars; 498911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_STATUS status = BTM_SUCCESS; 499911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("BTM_CancelPeriodicInquiry called"); 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 501911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /*** Make sure the device is ready ***/ 502911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!BTM_IsDeviceUp()) return (BTM_WRONG_MODE); 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 504911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Only cancel if one is active */ 505911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.btm_inq_vars.inq_active & BTM_PERIODIC_INQUIRY_ACTIVE) { 506911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_inq_vars.inq_active = BTM_INQUIRY_INACTIVE; 507911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_inq_vars.p_inq_results_cb = (tBTM_INQ_RESULTS_CB*)NULL; 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 509911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_exit_per_inq(); 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 511911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If the event filter is in progress, mark it so that the processing of the 512911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return 513911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson event will be ignored */ 514911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inq->inqfilt_active) p_inq->pending_filt_complete_event++; 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 516911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->inqfilt_active = false; 517911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->inq_counter++; 518911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 519911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 520911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (status); 521911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson} 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 524ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 525ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_SetConnectability 526ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 527ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to set the device into or out of 5289ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * connectable mode. Discoverable mode means page scans are 5299ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * enabled. 530ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 531ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns BTM_SUCCESS if successful 532ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_ILLEGAL_VALUE if a bad parameter is detected 533ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_NO_RESOURCES if could not allocate a message buffer 534ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_WRONG_MODE if the device is not up. 535ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 536ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 537911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_SetConnectability(uint16_t page_mode, uint16_t window, 538911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t interval) { 539911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t scan_mode = 0; 540911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_INQUIRY_VAR_ST* p_inq = &btm_cb.btm_inq_vars; 541911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 542911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("BTM_SetConnectability"); 543911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 544911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (controller_get_interface()->supports_ble()) { 545911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_ble_set_connectability(page_mode) != BTM_SUCCESS) { 546911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_NO_RESOURCES; 547911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 548911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->connectable_mode &= (~BTM_BLE_CONNECTABLE_MASK); 549911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->connectable_mode |= (page_mode & BTM_BLE_CONNECTABLE_MASK); 550911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 551911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson page_mode &= ~BTM_BLE_CONNECTABLE_MASK; 552911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 553911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /*** Check mode parameter ***/ 554911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (page_mode != BTM_NON_CONNECTABLE && page_mode != BTM_CONNECTABLE) 555911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_ILLEGAL_VALUE); 556911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 557911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Make sure the controller is active */ 558911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!controller_get_interface()->get_is_ready()) return (BTM_DEV_RESET); 559911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 560911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If the window and/or interval is '0', set to default values */ 561911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!window) window = BTM_DEFAULT_CONN_WINDOW; 562911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 563911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!interval) interval = BTM_DEFAULT_CONN_INTERVAL; 564911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 565911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API( 566911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "BTM_SetConnectability: mode %d [NonConn-0, Conn-1], window 0x%04x, " 567911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "interval 0x%04x", 568911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson page_mode, window, interval); 569911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 570911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /*** Check for valid window and interval parameters ***/ 571911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /*** Only check window and duration if mode is connectable ***/ 572911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (page_mode == BTM_CONNECTABLE) { 573911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* window must be less than or equal to interval */ 574911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (window < HCI_MIN_PAGESCAN_WINDOW || window > HCI_MAX_PAGESCAN_WINDOW || 575911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson interval < HCI_MIN_PAGESCAN_INTERVAL || 576911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson interval > HCI_MAX_PAGESCAN_INTERVAL || window > interval) { 577911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_ILLEGAL_VALUE); 578911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 579911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 580911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson scan_mode |= HCI_PAGE_SCAN_ENABLED; 581911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 582911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 583911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((window != p_inq->page_scan_window) || 584911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (interval != p_inq->page_scan_period)) { 585911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->page_scan_window = window; 586911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->page_scan_period = interval; 587911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_write_pagescan_cfg(interval, window); 588911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 589911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 590911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Keep the inquiry scan as previouosly set */ 591911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inq->discoverable_mode & BTM_DISCOVERABLE_MASK) 592911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson scan_mode |= HCI_INQUIRY_SCAN_ENABLED; 593911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 594911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_write_scan_enable(scan_mode); 595911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->connectable_mode &= (~BTM_CONNECTABLE_MASK); 596911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->connectable_mode |= page_mode; 597911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_SUCCESS); 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 601ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 602ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_ReadConnectability 603ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 604ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to read the current discoverability 605ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * mode of the device. 606ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Output Params p_window - current page scan duration 607ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_interval - current time between page scans 608ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 609ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns BTM_NON_CONNECTABLE or BTM_CONNECTABLE 610ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 611ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 612911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint16_t BTM_ReadConnectability(uint16_t* p_window, uint16_t* p_interval) { 613911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("BTM_ReadConnectability"); 614911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_window) *p_window = btm_cb.btm_inq_vars.page_scan_window; 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 616911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_interval) *p_interval = btm_cb.btm_inq_vars.page_scan_period; 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 618911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (btm_cb.btm_inq_vars.connectable_mode); 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 622ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 623ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_IsInquiryActive 624ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 6259ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function returns a bit mask of the current inquiry 6269ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * state 627ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 628ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns BTM_INQUIRY_INACTIVE if inactive (0) 629ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_LIMITED_INQUIRY_ACTIVE if a limted inquiry is active 630ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_GENERAL_INQUIRY_ACTIVE if a general inquiry is active 631ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_PERIODIC_INQUIRY_ACTIVE if a periodic inquiry is active 632ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 633ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 634911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint16_t BTM_IsInquiryActive(void) { 635911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("BTM_IsInquiryActive"); 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 637911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (btm_cb.btm_inq_vars.inq_active); 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 641ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 642ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_CancelInquiry 643ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 644ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function cancels an inquiry if active 645ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 646ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns BTM_SUCCESS if successful 647ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_NO_RESOURCES if could not allocate a message buffer 648ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_WRONG_MODE if the device is not up. 649ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 650ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 651911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_CancelInquiry(void) { 652911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_STATUS status = BTM_SUCCESS; 653911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_INQUIRY_VAR_ST* p_inq = &btm_cb.btm_inq_vars; 654d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTA_HOST_INTERLEAVE_SEARCH == TRUE) 655911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t active_mode = p_inq->inq_active; 6567f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#endif 657911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("BTM_CancelInquiry called"); 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 659911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /*** Make sure the device is ready ***/ 660911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!BTM_IsDeviceUp()) return (BTM_WRONG_MODE); 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 662911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Only cancel if not in periodic mode, otherwise the caller should call 663911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * BTM_CancelPeriodicMode */ 664911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_inq->inq_active & BTM_INQUIRY_ACTIVE_MASK) != 0 && 665911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (!(p_inq->inq_active & BTM_PERIODIC_INQUIRY_ACTIVE))) { 666911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->inq_active = BTM_INQUIRY_INACTIVE; 667911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->state = BTM_INQ_INACTIVE_STATE; 668911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->p_inq_results_cb = 669911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (tBTM_INQ_RESULTS_CB*)NULL; /* Do not notify caller anymore */ 670911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->p_inq_cmpl_cb = 671911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (tBTM_CMPL_CB*)NULL; /* Do not notify caller anymore */ 672911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 673911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If the event filter is in progress, mark it so that the processing of the 674911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return 675911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson event will be ignored */ 676911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inq->inqfilt_active) { 677911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->inqfilt_active = false; 678911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->pending_filt_complete_event++; 679911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 680911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Initiate the cancel inquiry */ 681911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else { 682911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (((p_inq->inqparms.mode & BTM_BR_INQUIRY_MASK) != 0) 683d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTA_HOST_INTERLEAVE_SEARCH == TRUE) 684911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson && (active_mode & BTM_BR_INQUIRY_MASK) 6857f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#endif 686911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ) { 687911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_inq_cancel(); 688911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 689911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (((p_inq->inqparms.mode & BTM_BLE_INQUIRY_MASK) != 0) 690d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTA_HOST_INTERLEAVE_SEARCH == TRUE) 691911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson && (active_mode & BTM_BLE_INQ_ACTIVE_MASK) 6927f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#endif 693911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ) 694911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_stop_inquiry(); 695911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 697911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Do not send the BUSY_LEVEL event yet. Wait for the cancel_complete event 698911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * and then send the BUSY_LEVEL event 699911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * btm_acl_update_busy_level (BTM_BLI_INQ_DONE_EVT); 700911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 702911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->inq_counter++; 703911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_clr_inq_result_flt(); 704911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 706911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (status); 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 710ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 711ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_StartInquiry 712ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 713ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to start an inquiry. 714ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 715ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters: p_inqparms - pointer to the inquiry information 7169ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * mode - GENERAL or LIMITED inquiry, BR/LE bit mask 7179ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * seperately 7189ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * duration - length in 1.28 sec intervals (If '0', the 7199ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * inquiry is CANCELLED) 7209ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * max_resps - maximum amount of devices to search for 7219ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * before ending the inquiry 7229ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * filter_cond_type - BTM_CLR_INQUIRY_FILTER, 7239ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * BTM_FILTER_COND_DEVICE_CLASS, or 724ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_FILTER_COND_BD_ADDR 7259ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * filter_cond - value for the filter (based on 7269ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * filter_cond_type) 7279ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * 7289ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * p_results_cb - Pointer to the callback routine which gets 7299ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * called upon receipt of an inquiry result. If 7309ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * this field is NULL, the application is not 7319ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * notified. 7329ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * 7339ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * p_cmpl_cb - Pointer to the callback routine which gets 7349ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * called upon completion. If this field is 7359ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * NULL, the application is not notified when 7369ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * completed. 737ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns tBTM_STATUS 738ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_CMD_STARTED if successfully initiated 739ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_BUSY if already in progress 740ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_ILLEGAL_VALUE if parameter(s) are out of range 7419ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * BTM_NO_RESOURCES if could not allocate resources to start 7429ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * the command 743ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_WRONG_MODE if the device is not up. 744ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 745ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 746911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_StartInquiry(tBTM_INQ_PARMS* p_inqparms, 747911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_INQ_RESULTS_CB* p_results_cb, 748911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_CMPL_CB* p_cmpl_cb) { 749911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_STATUS status = BTM_CMD_STARTED; 750911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_INQUIRY_VAR_ST* p_inq = &btm_cb.btm_inq_vars; 751911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 752911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("BTM_StartInquiry: mode: %d, dur: %d, rsps: %d, flt: %d", 753911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inqparms->mode, p_inqparms->duration, p_inqparms->max_resps, 754911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inqparms->filter_cond_type); 755911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 756911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Only one active inquiry is allowed in this implementation. 757911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson Also do not allow an inquiry if the inquiry filter is being updated */ 758911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inq->inq_active || p_inq->inqfilt_active) { 759911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /*check if LE observe is already running*/ 760911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inq->scan_type == INQ_LE_OBSERVE && 761911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->p_inq_ble_results_cb != NULL) { 762911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("BTM_StartInquiry: LE observe in progress"); 763911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->scan_type = INQ_GENERAL; 764911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->inq_active = BTM_INQUIRY_INACTIVE; 765911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.ble_ctr_cb.inq_var.scan_type = BTM_BLE_SCAN_MODE_NONE; 7669df2a552f7df99d79e1602781b37f6a6380fc71cJakub Pawlowski btm_send_hci_scan_enable(BTM_BLE_SCAN_DISABLE, BTM_BLE_DUPLICATE_ENABLE); 767911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 768911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_BUSY); 769911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("BTM_StartInquiry: return BUSY"); 770911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 771911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 772911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->scan_type = INQ_GENERAL; 773911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 774911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /*** Make sure the device is ready ***/ 775911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!BTM_IsDeviceUp()) return (BTM_WRONG_MODE); 776911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 777911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_inqparms->mode & BTM_BR_INQUIRY_MASK) != BTM_GENERAL_INQUIRY && 778911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_inqparms->mode & BTM_BR_INQUIRY_MASK) != BTM_LIMITED_INQUIRY && 779911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_inqparms->mode & BTM_BLE_INQUIRY_MASK) != BTM_BLE_GENERAL_INQUIRY && 780911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_inqparms->mode & BTM_BLE_INQUIRY_MASK) != BTM_BLE_LIMITED_INQUIRY) 781911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_ILLEGAL_VALUE); 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 783d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTA_HOST_INTERLEAVE_SEARCH == TRUE) 784911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inq->next_state == BTM_FINISH) return BTM_ILLEGAL_VALUE; 7857f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#endif 7867f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie 787911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Save the inquiry parameters to be used upon the completion of 788911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * setting/clearing the inquiry filter */ 789911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->inqparms = *p_inqparms; 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 791911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Initialize the inquiry variables */ 792911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->state = BTM_INQ_ACTIVE_STATE; 793911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->p_inq_cmpl_cb = p_cmpl_cb; 794911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->p_inq_results_cb = p_results_cb; 795911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->inq_cmpl_info.num_resp = 0; /* Clear the results counter */ 796911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->inq_active = p_inqparms->mode; 7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 798911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("BTM_StartInquiry: p_inq->inq_active = 0x%02x", 799911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->inq_active); 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8017f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie/* interleave scan minimal conditions */ 80284baa7f16e830394408278dbb8c508dd9fa02887Myles Watson#if (BTA_HOST_INTERLEAVE_SEARCH == TRUE) 8037f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie 804911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* check if both modes are present */ 805911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_inqparms->mode & BTM_BLE_INQUIRY_MASK) && 806911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_inqparms->mode & BTM_BR_INQUIRY_MASK)) { 807911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("BTM:Interleave Inquiry Mode Set"); 808911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inqparms->duration = p_inqparms->intl_duration[p_inq->next_state]; 809911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->inqparms.duration = p_inqparms->duration; 810911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 811911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("BTM:Single Mode: No interleaving, Mode:0x%02x", 812911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inqparms->mode); 813911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->next_state = BTM_NO_INTERLEAVING; 814911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 8157f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#endif 8167f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie 817911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* start LE inquiry here if requested */ 818911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_inqparms->mode & BTM_BLE_INQUIRY_MASK) 819d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTA_HOST_INTERLEAVE_SEARCH == TRUE) 820911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson && 821911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_inq->next_state == BTM_BLE_ONE || p_inq->next_state == BTM_BLE_TWO || 822911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->next_state == BTM_NO_INTERLEAVING) 8237f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#endif 824911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ) 8257f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie 826911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 827d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTA_HOST_INTERLEAVE_SEARCH == TRUE) 828911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->inq_active = (p_inqparms->mode & BTM_BLE_INQUIRY_MASK); 829911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("BTM:Starting LE Scan with duration %d and activeMode:0x%02x", 830911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inqparms->duration, 831911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_inqparms->mode & BTM_BLE_INQUIRY_MASK)); 8327f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#endif 833911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!controller_get_interface()->supports_ble()) { 834911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->inqparms.mode &= ~BTM_BLE_INQUIRY_MASK; 835911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson status = BTM_ILLEGAL_VALUE; 836911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 837911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* BLE for now does not support filter condition for inquiry */ 838911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else { 839911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson status = btm_ble_start_inquiry( 840911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (uint8_t)(p_inqparms->mode & BTM_BLE_INQUIRY_MASK), 841911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inqparms->duration); 842911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (status != BTM_CMD_STARTED) { 843911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("Err Starting LE Inquiry."); 844911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->inqparms.mode &= ~BTM_BLE_INQUIRY_MASK; 845911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 846911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 847d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTA_HOST_INTERLEAVE_SEARCH == FALSE) 848911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inqparms->mode &= ~BTM_BLE_INQUIRY_MASK; 8497f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#endif 8507f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie 851d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTA_HOST_INTERLEAVE_SEARCH == TRUE) 852911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inq->next_state == BTM_NO_INTERLEAVING) { 853911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->next_state = BTM_FINISH; 854911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 855911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API( 856911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "BTM:Interleaving: started LE scan, Advancing to next state: %d", 857911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->next_state + 1); 858911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->next_state += 1; 859911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 860911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* reset next_state if status <> BTM_Started */ 861911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (status != BTM_CMD_STARTED) p_inq->next_state = BTM_BR_ONE; 862911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 863911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if interleave scan..return here */ 864911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return status; 8657f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#endif 8667f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie 867911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("BTM_StartInquiry: mode = %02x", p_inqparms->mode); 868911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 870911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* we're done with this routine if BR/EDR inquiry is not desired. */ 871911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_inqparms->mode & BTM_BR_INQUIRY_MASK) == BTM_INQUIRY_NONE) 872911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return status; 873ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 874911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson/* BR/EDR inquiry portion */ 875d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTA_HOST_INTERLEAVE_SEARCH == TRUE) 876911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_inq->next_state == BTM_BR_ONE || p_inq->next_state == BTM_BR_TWO || 877911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->next_state == BTM_NO_INTERLEAVING)) { 878911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->inq_active = (p_inqparms->mode & BTM_BR_INQUIRY_MASK); 8797f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#endif 880911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If a filter is specified, then save it for later and clear the current 881911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson filter. 882911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson The setting of the filter is done upon completion of clearing of the 883911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson previous 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project filter. 8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 886911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (p_inqparms->filter_cond_type) { 887911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_CLR_INQUIRY_FILTER: 8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_inq->state = BTM_INQ_SET_FILT_STATE; 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 891911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_FILTER_COND_DEVICE_CLASS: 892911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case BTM_FILTER_COND_BD_ADDR: 8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* The filter is not being used so simply clear it; 8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project the inquiry can start after this operation */ 8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_inq->state = BTM_INQ_CLR_FILT_STATE; 8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_inqparms->filter_cond_type = BTM_CLR_INQUIRY_FILTER; 8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* =============>>>> adding LE filtering here ????? */ 8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 900911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson default: 9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (BTM_ILLEGAL_VALUE); 9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 904911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Before beginning the inquiry the current filter must be cleared, so 905911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * initiate the command */ 906911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson status = btm_set_inq_event_filter(p_inqparms->filter_cond_type, 907911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson &p_inqparms->filter_cond); 908911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (status != BTM_CMD_STARTED) p_inq->state = BTM_INQ_INACTIVE_STATE; 9097f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie 910d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTA_HOST_INTERLEAVE_SEARCH == TRUE) 911911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inq->next_state == BTM_NO_INTERLEAVING) 912911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->next_state = BTM_FINISH; 913911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else { 914911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API( 915911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "BTM:Interleaving: Started BTM inq, Advancing to next state: %d", 916911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->next_state + 1); 917911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->next_state += 1; 918911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 919911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 920911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (status != BTM_CMD_STARTED) { 921911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Some error beginning the scan process. 922911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson Reset the next_state parameter.. Do we need to reset the inq_active also? 923911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 924911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("BTM:Interleaving: Error in Starting inquiry, status: 0x%02x", 925911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson status); 926911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->next_state = BTM_BR_ONE; 927911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 9287f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#endif 9297f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie 930911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (status); 9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 934ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 935ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_ReadRemoteDeviceName 936ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 937ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function initiates a remote device HCI command to the 9389ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * controller and calls the callback when the process has 9399ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * completed. 940ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 941ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Input Params: remote_bda - device address of name to retrieve 9429ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * p_cb - callback function called when 9439ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * BTM_CMD_STARTED is returned. 9449ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * A pointer to tBTM_REMOTE_DEV_NAME is 9459ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * passed to the callback. 946ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 947ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns 9489ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * BTM_CMD_STARTED is returned if the request was successfully 9499ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * sent to HCI. 950ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_BUSY if already in progress 951ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_UNKNOWN_ADDR if device address is bad 9529ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * BTM_NO_RESOURCES if could not allocate resources to start 9539ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * the command 954ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_WRONG_MODE if the device is not up. 955ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 956ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 957911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_ReadRemoteDeviceName(BD_ADDR remote_bda, tBTM_CMPL_CB* p_cb, 958911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBT_TRANSPORT transport) { 9598bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He BTM_TRACE_API("%s: bd addr [%02x%02x%02x%02x%02x%02x]", __func__, 960911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson remote_bda[0], remote_bda[1], remote_bda[2], remote_bda[3], 961911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson remote_bda[4], remote_bda[5]); 9628bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He /* Use LE transport when LE is the only available option */ 963911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (transport == BT_TRANSPORT_LE) { 9648bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He return btm_ble_read_remote_name(remote_bda, p_cb); 9658bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He } 9668bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He /* Use classic transport for BR/EDR and Dual Mode devices */ 9678bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He return btm_initiate_rem_name(remote_bda, BTM_RMT_NAME_EXT, 9688bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He BTM_EXT_RMT_NAME_TIMEOUT_MS, p_cb); 9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 972ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 973ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_CancelRemoteDeviceName 974ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 975ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function initiates the cancel request for the specified 976ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * remote device. 977ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 978ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Input Params: None 979ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 980ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns 9819ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * BTM_CMD_STARTED is returned if the request was successfully 9829ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * sent to HCI. 9839ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * BTM_NO_RESOURCES if could not allocate resources to start 9849ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * the command 9859ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * BTM_WRONG_MODE if there is not an active remote name 9869ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * request. 987ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 988ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 989911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_CancelRemoteDeviceName(void) { 990911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_INQUIRY_VAR_ST* p_inq = &btm_cb.btm_inq_vars; 9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 992911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("BTM_CancelRemoteDeviceName()"); 9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 994911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Make sure there is not already one in progress */ 995911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inq->remname_active) { 996911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (BTM_UseLeLink(p_inq->remname_bda)) { 997911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_ble_cancel_remote_name(p_inq->remname_bda)) 998b6ab9b3af6b8793ff781e0359a78611726ab2300Jakub Pawlowski return (BTM_CMD_STARTED); 999911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 1000911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_UNKNOWN_ADDR); 1001911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 1002911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_rmt_name_req_cancel(p_inq->remname_bda); 1003911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_CMD_STARTED); 1004911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 1005911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_WRONG_MODE); 10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1009ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1010ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_InqDbRead 1011ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1012ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function looks through the inquiry database for a match 1013ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * based on Bluetooth Device Address. This is the application's 10149ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * interface to get the inquiry details of a specific BD 10159ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * address. 1016ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1017ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns pointer to entry, or NULL if not found 1018ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1019ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1020911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_INQ_INFO* BTM_InqDbRead(const BD_ADDR p_bda) { 1021911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("BTM_InqDbRead: bd addr [%02x%02x%02x%02x%02x%02x]", p_bda[0], 1022911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_bda[1], p_bda[2], p_bda[3], p_bda[4], p_bda[5]); 10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1024911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tINQ_DB_ENT* p_ent = btm_inq_db_find(p_bda); 1025911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_ent) return NULL; 10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1027911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return &p_ent->inq_info; 10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1031ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1032ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_InqDbFirst 1033ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 10349ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function looks through the inquiry database for the 10359ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * first used entry, and returns that. This is used in 10369ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * conjunction with 1037ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_InqDbNext by applications as a way to walk through the 1038ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * inquiry database. 1039ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1040ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns pointer to first in-use entry, or NULL if DB is empty 1041ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1042ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1043911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_INQ_INFO* BTM_InqDbFirst(void) { 1044911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx; 1045911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tINQ_DB_ENT* p_ent = btm_cb.btm_inq_vars.inq_db; 10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1047911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < BTM_INQ_DB_SIZE; xx++, p_ent++) { 1048911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_ent->in_use) return (&p_ent->inq_info); 1049911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1051911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If here, no used entry found */ 1052911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return ((tBTM_INQ_INFO*)NULL); 10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1056ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1057ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_InqDbNext 1058ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 10599ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function looks through the inquiry database for the 10609ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * next used entry, and returns that. If the input parameter 10619ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * is NULL, the first entry is returned. 1062ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1063ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns pointer to next in-use entry, or NULL if no more found. 1064ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1065ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1066911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_INQ_INFO* BTM_InqDbNext(tBTM_INQ_INFO* p_cur) { 1067911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tINQ_DB_ENT* p_ent; 1068911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t inx; 10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1070911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cur) { 1071911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ent = (tINQ_DB_ENT*)((uint8_t*)p_cur - offsetof(tINQ_DB_ENT, inq_info)); 1072911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson inx = (uint16_t)((p_ent - btm_cb.btm_inq_vars.inq_db) + 1); 10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1074911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (p_ent = &btm_cb.btm_inq_vars.inq_db[inx]; inx < BTM_INQ_DB_SIZE; 1075911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson inx++, p_ent++) { 1076911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_ent->in_use) return (&p_ent->inq_info); 10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1079911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If here, more entries found */ 1080911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return ((tBTM_INQ_INFO*)NULL); 1081911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 1082911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_InqDbFirst()); 1083911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson} 10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1086ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1087ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_ClearInqDb 1088ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1089ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to clear out a device or all devices 1090ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * from the inquiry database. 1091ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1092ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameter p_bda - (input) BD_ADDR -> Address of device to clear 1093ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * (NULL clears all entries) 1094ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1095ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns BTM_BUSY if an inquiry, get remote name, or event filter 1096ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * is active, otherwise BTM_SUCCESS 1097ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1098ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1099911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_ClearInqDb(BD_ADDR p_bda) { 1100911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_INQUIRY_VAR_ST* p_inq = &btm_cb.btm_inq_vars; 11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1102911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If an inquiry or remote name is in progress return busy */ 1103911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inq->inq_active != BTM_INQUIRY_INACTIVE || p_inq->inqfilt_active) 1104911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_BUSY); 11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1106911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_clr_inq_db(p_bda); 11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1108911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_SUCCESS); 11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1112ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1113ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_ReadInquiryRspTxPower 1114ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1115ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This command will read the inquiry Transmit Power level used 11169ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * to transmit the FHS and EIR data packets. This can be used 11179ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * directly in the Tx Power Level EIR data type. 1118ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1119ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns BTM_SUCCESS if successful 1120ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1121ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1122911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_ReadInquiryRspTxPower(tBTM_CMPL_CB* p_cb) { 1123911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.devcb.p_inq_tx_power_cmpl_cb) return (BTM_BUSY); 1124911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1125911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.p_inq_tx_power_cmpl_cb = p_cb; 1126911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson alarm_set_on_queue(btm_cb.devcb.read_inq_tx_power_timer, 1127911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_INQ_REPLY_TIMEOUT_MS, btm_read_inq_tx_power_timeout, 1128911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson NULL, btu_general_alarm_queue); 1129911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1130911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_read_inq_tx_power(); 1131911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_CMD_STARTED); 11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1135ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************* 11369ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * ** 11379ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * BTM Internal Inquiry Functions ** 11389ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * ** 1139ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************* 1140ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1141ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************* 1142ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1143ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_inq_db_reset 1144ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1145ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called at at reset to clear the inquiry 1146ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * database & pending callback. 1147ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1148ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1149ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1150ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1151911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_inq_db_reset(void) { 1152911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_REMOTE_DEV_NAME rem_name; 1153911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_INQUIRY_VAR_ST* p_inq = &btm_cb.btm_inq_vars; 1154911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t num_responses; 1155911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t temp_inq_active; 1156911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_STATUS status; 1157911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1158911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If an inquiry or periodic inquiry is active, reset the mode to inactive */ 1159911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inq->inq_active != BTM_INQUIRY_INACTIVE) { 1160911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson temp_inq_active = p_inq->inq_active; /* Save so state can change BEFORE 1161911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson callback is called */ 1162911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->inq_active = BTM_INQUIRY_INACTIVE; 1163911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1164911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If not a periodic inquiry, the complete callback must be called to notify 1165911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * caller */ 1166911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (temp_inq_active == BTM_LIMITED_INQUIRY_ACTIVE || 1167911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson temp_inq_active == BTM_GENERAL_INQUIRY_ACTIVE) { 1168911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inq->p_inq_cmpl_cb) { 1169911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson num_responses = 0; 1170911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*p_inq->p_inq_cmpl_cb)(&num_responses); 1171911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1172911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1173911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1174911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1175911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Cancel a remote name request if active, and notify the caller (if waiting) 1176911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 1177911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inq->remname_active) { 1178911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson alarm_cancel(p_inq->remote_name_timer); 1179911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->remname_active = false; 1180911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memset(p_inq->remname_bda, 0, BD_ADDR_LEN); 1181911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1182911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inq->p_remname_cmpl_cb) { 1183911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rem_name.status = BTM_DEV_RESET; 1184911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1185911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*p_inq->p_remname_cmpl_cb)(&rem_name); 1186911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->p_remname_cmpl_cb = NULL; 1187911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1188911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1189911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1190911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Cancel an inquiry filter request if active, and notify the caller (if 1191911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * waiting) */ 1192911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inq->inqfilt_active) { 1193911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->inqfilt_active = false; 1194911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1195911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inq->p_inqfilter_cmpl_cb) { 1196911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson status = BTM_DEV_RESET; 1197911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*p_inq->p_inqfilter_cmpl_cb)(&status); 1198911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1199911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1200911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1201911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->state = BTM_INQ_INACTIVE_STATE; 1202911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->pending_filt_complete_event = 0; 1203911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->p_inq_results_cb = NULL; 1204911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_clr_inq_db(NULL); /* Clear out all the entries in the database */ 1205911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_clr_inq_result_flt(); 1206911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1207911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->discoverable_mode = BTM_NON_DISCOVERABLE; 1208911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->connectable_mode = BTM_NON_CONNECTABLE; 1209911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->page_scan_type = BTM_SCAN_TYPE_STANDARD; 1210911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->inq_scan_type = BTM_SCAN_TYPE_STANDARD; 1211911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1212911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->discoverable_mode |= BTM_BLE_NON_DISCOVERABLE; 1213911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->connectable_mode |= BTM_BLE_NON_CONNECTABLE; 1214911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1217ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************* 1218ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1219ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_inq_db_init 1220ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1221ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called at startup to initialize the inquiry 1222ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * database. 1223ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1224ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1225ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1226ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1227911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_inq_db_init(void) { 1228911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson alarm_free(btm_cb.btm_inq_vars.remote_name_timer); 1229911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_inq_vars.remote_name_timer = 1230911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson alarm_new("btm_inq.remote_name_timer"); 1231911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_inq_vars.no_inc_ssp = BTM_NO_SSP_ON_INQUIRY; 12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1234ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************* 1235ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1236ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_inq_stop_on_ssp 1237ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1238ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called on incoming SSP 1239ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1240ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1241ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1242ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1243911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_inq_stop_on_ssp(void) { 1244911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t normal_active = 1245911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (BTM_GENERAL_INQUIRY_ACTIVE | BTM_LIMITED_INQUIRY_ACTIVE); 12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_INQ_DEBUG == TRUE) 1248911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 1249911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "btm_inq_stop_on_ssp: no_inc_ssp=%d inq_active:0x%x state:%d " 1250911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "inqfilt_active:%d", 1251911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_inq_vars.no_inc_ssp, btm_cb.btm_inq_vars.inq_active, 1252911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_inq_vars.state, btm_cb.btm_inq_vars.inqfilt_active); 12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1254911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.btm_inq_vars.no_inc_ssp) { 1255911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.btm_inq_vars.state == BTM_INQ_ACTIVE_STATE) { 1256911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.btm_inq_vars.inq_active & BTM_PERIODIC_INQUIRY_ACTIVE) { 1257911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_CancelPeriodicInquiry(); 1258911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if (btm_cb.btm_inq_vars.inq_active & normal_active) { 1259911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* can not call BTM_CancelInquiry() here. We need to report inquiry 1260911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * complete evt */ 1261911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_inq_cancel(); 1262911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1263911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1264911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* do not allow inquiry to start */ 1265911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_inq_vars.inq_active |= BTM_SSP_INQUIRY_ACTIVE; 1266911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1269ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************* 1270ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1271ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_inq_clear_ssp 1272ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1273ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when pairing_state becomes idle 1274ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1275ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1276ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1277ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1278911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_inq_clear_ssp(void) { 1279911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_inq_vars.inq_active &= ~BTM_SSP_INQUIRY_ACTIVE; 12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1282ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/******************************************************************************* 1283ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1284ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_clr_inq_db 1285ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1286ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to clear out a device or all devices 1287ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * from the inquiry database. 1288ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1289ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameter p_bda - (input) BD_ADDR -> Address of device to clear 1290ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * (NULL clears all entries) 1291ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1292ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1293ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1294ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1295911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_clr_inq_db(BD_ADDR p_bda) { 1296911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_INQUIRY_VAR_ST* p_inq = &btm_cb.btm_inq_vars; 1297911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tINQ_DB_ENT* p_ent = p_inq->inq_db; 1298911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx; 12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_INQ_DEBUG == TRUE) 1301911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("btm_clr_inq_db: inq_active:0x%x state:%d", 1302911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state); 13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1304911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < BTM_INQ_DB_SIZE; xx++, p_ent++) { 1305911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_ent->in_use) { 1306911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If this is the specified BD_ADDR or clearing all devices */ 1307911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_bda == NULL || (!memcmp(p_ent->inq_info.results.remote_bd_addr, 1308911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_bda, BD_ADDR_LEN))) { 1309911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ent->in_use = false; 1310911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1311911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1312911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_INQ_DEBUG == TRUE) 1314911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("inq_active:0x%x state:%d", btm_cb.btm_inq_vars.inq_active, 1315911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_inq_vars.state); 13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1320ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1321ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_clr_inq_result_flt 1322ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1323ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function looks through the bdaddr database for a match 1324ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * based on Bluetooth Device Address 1325ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1326ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true if found, else false (new entry) 1327ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1328ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1329911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_clr_inq_result_flt(void) { 1330911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_INQUIRY_VAR_ST* p_inq = &btm_cb.btm_inq_vars; 13315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1332911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson osi_free_and_reset((void**)&p_inq->p_bd_db); 1333911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->num_bd_entries = 0; 1334911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->max_bd_entries = 0; 13355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1338ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1339ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_inq_find_bdaddr 1340ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1341ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function looks through the bdaddr database for a match 1342ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * based on Bluetooth Device Address 1343ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1344ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true if found, else false (new entry) 1345ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1346ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1347911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool btm_inq_find_bdaddr(BD_ADDR p_bda) { 1348911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_INQUIRY_VAR_ST* p_inq = &btm_cb.btm_inq_vars; 1349911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tINQ_BDADDR* p_db = &p_inq->p_bd_db[0]; 1350911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx; 13515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1352911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Don't bother searching, database doesn't exist or periodic mode */ 1353911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_inq->inq_active & BTM_PERIODIC_INQUIRY_ACTIVE) || !p_db) 1354911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (false); 13555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1356911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < p_inq->num_bd_entries; xx++, p_db++) { 1357911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!memcmp(p_db->bd_addr, p_bda, BD_ADDR_LEN) && 1358911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_db->inq_count == p_inq->inq_counter) 1359911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (true); 1360911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 13615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1362911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (xx < p_inq->max_bd_entries) { 1363911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_db->inq_count = p_inq->inq_counter; 1364911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_db->bd_addr, p_bda, BD_ADDR_LEN); 1365911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->num_bd_entries++; 1366911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 13675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1368911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If here, New Entry */ 1369911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (false); 13705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1373ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1374ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_inq_db_find 1375ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1376ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function looks through the inquiry database for a match 1377ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * based on Bluetooth Device Address 1378ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1379ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns pointer to entry, or NULL if not found 1380ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1381ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1382911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontINQ_DB_ENT* btm_inq_db_find(const BD_ADDR p_bda) { 1383911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx; 1384911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tINQ_DB_ENT* p_ent = btm_cb.btm_inq_vars.inq_db; 1385911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1386911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < BTM_INQ_DB_SIZE; xx++, p_ent++) { 1387911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_ent->in_use) && 1388911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (!memcmp(p_ent->inq_info.results.remote_bd_addr, p_bda, BD_ADDR_LEN))) 1389911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (p_ent); 1390911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1391911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1392911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If here, not found */ 1393911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (NULL); 13945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1397ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1398ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_inq_db_new 1399ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 14009ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function looks through the inquiry database for an 14019ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * unused entry. If no entry is free, it allocates the oldest 14029ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * entry. 1403ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1404ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns pointer to entry 1405ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1406ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1407911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontINQ_DB_ENT* btm_inq_db_new(BD_ADDR p_bda) { 1408911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t xx; 1409911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tINQ_DB_ENT* p_ent = btm_cb.btm_inq_vars.inq_db; 1410911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tINQ_DB_ENT* p_old = btm_cb.btm_inq_vars.inq_db; 1411911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint32_t ot = 0xFFFFFFFF; 14125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1413911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < BTM_INQ_DB_SIZE; xx++, p_ent++) { 1414911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_ent->in_use) { 1415911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memset(p_ent, 0, sizeof(tINQ_DB_ENT)); 1416911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_ent->inq_info.results.remote_bd_addr, p_bda, BD_ADDR_LEN); 1417911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ent->in_use = true; 14185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1419911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (p_ent); 1420911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1421911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1422911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_ent->time_of_resp < ot) { 1423911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_old = p_ent; 1424911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ot = p_ent->time_of_resp; 14255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1426911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 14275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1428911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If here, no free entry found. Return the oldest. */ 14295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1430911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memset(p_old, 0, sizeof(tINQ_DB_ENT)); 1431911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_old->inq_info.results.remote_bd_addr, p_bda, BD_ADDR_LEN); 1432911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_old->in_use = true; 14335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1434911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (p_old); 14355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1438ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1439ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_set_inq_event_filter 1440ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1441ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to set the inquiry event filter. 14429ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * It is called by either internally, or by the external API 14439ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * function (BTM_SetInqEventFilter). It is used internally as 14449ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * part of the inquiry processing. 1445ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1446ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Input Params: 14479ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * filter_cond_type - this is the type of inquiry filter to 14489ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * apply: 1449ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_FILTER_COND_DEVICE_CLASS, 1450ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_FILTER_COND_BD_ADDR, or 1451ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_CLR_INQUIRY_FILTER 1452ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 14539ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * p_filt_cond - this is either a BD_ADDR or DEV_CLASS 14549ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * depending on the filter_cond_type 14559ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * (See section 4.7.3 of Core Spec 1.0b). 1456ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1457ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns BTM_CMD_STARTED if successfully initiated 1458ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_NO_RESOURCES if couldn't get a memory pool buffer 1459ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_ILLEGAL_VALUE if a bad parameter was detected 1460ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1461ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1462911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic tBTM_STATUS btm_set_inq_event_filter(uint8_t filter_cond_type, 1463911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_INQ_FILT_COND* p_filt_cond) { 1464911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t condition_length = DEV_CLASS_LEN * 2; 1465911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t condition_buf[DEV_CLASS_LEN * 2]; 1466911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_cond = condition_buf; /* points to the condition to pass to HCI */ 14675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_INQ_DEBUG == TRUE) 1469911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 1470911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "btm_set_inq_event_filter: filter type %d [Clear-0, COD-1, BDADDR-2]", 1471911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson filter_cond_type); 1472911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 1473911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson " condition [%02x%02x%02x %02x%02x%02x]", 1474911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_filt_cond->bdaddr_cond[0], p_filt_cond->bdaddr_cond[1], 1475911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_filt_cond->bdaddr_cond[2], p_filt_cond->bdaddr_cond[3], 1476911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_filt_cond->bdaddr_cond[4], p_filt_cond->bdaddr_cond[5]); 14775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 14785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1479911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Load the correct filter condition to pass to the lower layer */ 1480911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (filter_cond_type) { 14815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_FILTER_COND_DEVICE_CLASS: 1482911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* copy the device class and device class fields into contiguous memory to 1483911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * send to HCI */ 1484911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(condition_buf, p_filt_cond->cod_cond.dev_class, DEV_CLASS_LEN); 1485911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(&condition_buf[DEV_CLASS_LEN], 1486911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_filt_cond->cod_cond.dev_class_mask, DEV_CLASS_LEN); 14875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1488911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* condition length should already be set as the default */ 1489911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 14905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_FILTER_COND_BD_ADDR: 1492911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cond = p_filt_cond->bdaddr_cond; 14935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1494911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* condition length should already be set as the default */ 1495911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 14965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_CLR_INQUIRY_FILTER: 1498911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson condition_length = 0; 1499911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 15005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 1502911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_ILLEGAL_VALUE); /* Bad parameter was passed in */ 1503911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 15045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1505911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_inq_vars.inqfilt_active = true; 15065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1507911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Filter the inquiry results for the specified condition type and value */ 1508911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_set_event_filter(HCI_FILTER_INQUIRY_RESULT, filter_cond_type, 1509911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cond, condition_length); 1510911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_CMD_STARTED); 15115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1514ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1515ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_event_filter_complete 1516ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 15179ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called when a set event filter has 15189ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * completed. 1519ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Note: This routine currently only handles inquiry filters. 1520ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Connection filters are ignored for now. 1521ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1522ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1523ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1524ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1525911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_event_filter_complete(uint8_t* p) { 1526911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t hci_status; 1527911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_STATUS status; 1528911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_INQUIRY_VAR_ST* p_inq = &btm_cb.btm_inq_vars; 1529911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_CMPL_CB* p_cb = p_inq->p_inqfilter_cmpl_cb; 15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_INQ_DEBUG == TRUE) 1532911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 1533911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "btm_event_filter_complete: inq_active:0x%x state:%d inqfilt_active:%d", 1534911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state, 1535911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_inq_vars.inqfilt_active); 15365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1537911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If the filter complete event is from an old or cancelled request, ignore it 1538911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 1539911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inq->pending_filt_complete_event) { 1540911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->pending_filt_complete_event--; 1541911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 1542911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1543911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1544911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Only process the inquiry filter; Ignore the connection filter until it 1545911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson is used by the upper layers */ 1546911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inq->inqfilt_active == true) { 1547911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Extract the returned status from the buffer */ 1548911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT8(hci_status, p); 1549911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (hci_status != HCI_SUCCESS) { 1550911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If standalone operation, return the error status; if embedded in the 1551911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * inquiry, continue the inquiry */ 1552911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING( 1553911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "BTM Warning: Set Event Filter Failed (HCI returned 0x%x)", 1554911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson hci_status); 1555911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson status = BTM_ERR_PROCESSING; 1556911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 1557911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson status = BTM_SUCCESS; 1558911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1559911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If the set filter was initiated externally (via BTM_SetInqEventFilter), 1560911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson call the 1561911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson callback function to notify the initiator that it has completed */ 1562911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inq->state == BTM_INQ_INACTIVE_STATE) { 1563911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->inqfilt_active = false; 1564911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb) (*p_cb)(&status); 1565911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else /* An inquiry is active (the set filter command was internally 1566911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson generated), 1567911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson process the next state of the process (Set a new filter or start 1568911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson the inquiry). */ 1569911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 1570911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (status != BTM_SUCCESS) { 1571911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Process the inquiry complete (Error Status) */ 1572911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_process_inq_complete( 1573911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_ERR_PROCESSING, 1574911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (uint8_t)(p_inq->inqparms.mode & BTM_BR_INQUIRY_MASK)); 1575911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1576911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* btm_process_inq_complete() does not restore the following settings on 1577911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * periodic inquiry */ 1578911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->inqfilt_active = false; 1579911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->inq_active = BTM_INQUIRY_INACTIVE; 1580911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->state = BTM_INQ_INACTIVE_STATE; 15815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1582911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 1583911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1584911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1585911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Check to see if a new filter needs to be set up */ 1586911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inq->state == BTM_INQ_CLR_FILT_STATE) { 1587911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson status = btm_set_inq_event_filter(p_inq->inqparms.filter_cond_type, 1588911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson &p_inq->inqparms.filter_cond); 1589911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (status == BTM_CMD_STARTED) { 1590911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->state = BTM_INQ_SET_FILT_STATE; 1591911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else /* Error setting the filter: Call the initiator's callback 1592911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson function to indicate a failure */ 15935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1594911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->inqfilt_active = false; 15955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1596911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Process the inquiry complete (Error Status) */ 1597911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_process_inq_complete( 1598911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_ERR_PROCESSING, 1599911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (uint8_t)(p_inq->inqparms.mode & BTM_BR_INQUIRY_MASK)); 16005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1601911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else /* Initiate the Inquiry or Periodic Inquiry */ 1602911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 1603911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->state = BTM_INQ_ACTIVE_STATE; 1604911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->inqfilt_active = false; 1605911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_initiate_inquiry(p_inq); 1606911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 16075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1608911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 16095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1612ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1613ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_initiate_inquiry 1614ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 16159ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called to start an inquiry or periodic 16169ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * inquiry upon completion of the setting and/or clearing of 16179ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * the inquiry filter. 1618ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 16199ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Inputs: p_inq (btm_cb.btm_inq_vars) - pointer to saved inquiry 16209ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * information 1621ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * mode - GENERAL or LIMITED inquiry 16229ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * duration - length in 1.28 sec intervals 16239ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * (If '0', the inquiry is CANCELLED) 16249ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * max_resps - maximum amount of devices to search for 16259ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * before ending the inquiry 16269ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * filter_cond_type - BTM_CLR_INQUIRY_FILTER, 16279ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * BTM_FILTER_COND_DEVICE_CLASS, or 1628ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_FILTER_COND_BD_ADDR 16299ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * filter_cond - value for the filter 16309ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * (based on filter_cond_type) 1631ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 16329ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Returns If an error occurs the initiator's callback is called with 16339ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * the error status. 1634ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1635ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1636911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void btm_initiate_inquiry(tBTM_INQUIRY_VAR_ST* p_inq) { 1637911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson const LAP* lap; 1638911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_INQ_PARMS* p_inqparms = &p_inq->inqparms; 16395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_INQ_DEBUG == TRUE) 1641911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 1642911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "btm_initiate_inquiry: inq_active:0x%x state:%d inqfilt_active:%d", 1643911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state, 1644911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_inq_vars.inqfilt_active); 16455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1646911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_acl_update_busy_level(BTM_BLI_INQ_EVT); 16475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1648911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inq->inq_active & BTM_SSP_INQUIRY_ACTIVE) { 1649911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_process_inq_complete(BTM_NO_RESOURCES, 1650911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (uint8_t)(p_inqparms->mode & BTM_BR_INQUIRY_MASK)); 1651911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 1652911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 16535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1654911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Make sure the number of responses doesn't overflow the database 1655911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * configuration */ 1656911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inqparms->max_resps = (uint8_t)((p_inqparms->max_resps <= BTM_INQ_DB_SIZE) 1657911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ? p_inqparms->max_resps 1658911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson : BTM_INQ_DB_SIZE); 16595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1660911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson lap = (p_inq->inq_active & BTM_LIMITED_INQUIRY_ACTIVE) ? &limited_inq_lap 1661911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson : &general_inq_lap; 16625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1663911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inq->inq_active & BTM_PERIODIC_INQUIRY_ACTIVE) { 1664911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_per_inq_mode(p_inq->per_max_delay, p_inq->per_min_delay, *lap, 1665911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inqparms->duration, p_inqparms->max_resps); 1666911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1667911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_clr_inq_result_flt(); 16685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1669911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Allocate memory to hold bd_addrs responding */ 1670911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->p_bd_db = (tINQ_BDADDR*)osi_calloc(BT_DEFAULT_BUFFER_SIZE); 1671911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->max_bd_entries = 1672911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (uint16_t)(BT_DEFAULT_BUFFER_SIZE / sizeof(tINQ_BDADDR)); 16735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1674911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_inquiry(*lap, p_inqparms->duration, 0); 1675911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 16765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1679ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1680ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_process_inq_results 1681ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 16829ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called when inquiry results are received 16839ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * from the device. It updates the inquiry database. If the 16849ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * inquiry database is full, the oldest entry is discarded. 1685ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1686ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters inq_res_mode - BTM_INQ_RESULT_STANDARD 1687ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_INQ_RESULT_WITH_RSSI 1688ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_INQ_RESULT_EXTENDED 1689ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1690ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1691ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1692ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1693911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_process_inq_results(uint8_t* p, uint8_t inq_res_mode) { 1694911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t num_resp, xx; 1695911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BD_ADDR bda; 1696911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tINQ_DB_ENT* p_i; 1697911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_INQ_RESULTS* p_cur = NULL; 1698911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool is_new = true; 1699911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool update = false; 1700911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int8_t i_rssi; 1701911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_INQUIRY_VAR_ST* p_inq = &btm_cb.btm_inq_vars; 1702911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_INQ_RESULTS_CB* p_inq_results_cb = p_inq->p_inq_results_cb; 1703911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t page_scan_rep_mode = 0; 1704911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t page_scan_per_mode = 0; 1705911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t page_scan_mode = 0; 1706911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t rssi = 0; 1707911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson DEV_CLASS dc; 1708911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t clock_offset; 1709911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_eir_data = NULL; 17105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_INQ_DEBUG == TRUE) 1712911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 1713911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "btm_process_inq_results inq_active:0x%x state:%d inqfilt_active:%d", 1714911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state, 1715911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_inq_vars.inqfilt_active); 17165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1717911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Only process the results if the BR inquiry is still active */ 1718911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!(p_inq->inq_active & BTM_BR_INQ_ACTIVE_MASK)) return; 17191a011544dc621f0321e26287287407272f66281bMyles Watson 1720911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT8(num_resp, p); 17215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1722911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (inq_res_mode == BTM_INQ_RESULT_EXTENDED && (num_resp > 1)) { 1723911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("btm_process_inq_results() extended results (%d) > 1", 1724911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson num_resp); 1725911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 1726911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 17275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1728911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < num_resp; xx++) { 1729911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson update = false; 1730911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Extract inquiry results */ 1731911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_BDADDR(bda, p); 1732911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT8(page_scan_rep_mode, p); 1733911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT8(page_scan_per_mode, p); 17345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1735911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (inq_res_mode == BTM_INQ_RESULT_STANDARD) { 1736911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT8(page_scan_mode, p); 1737911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 17385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1739911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_DEVCLASS(dc, p); 1740911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT16(clock_offset, p); 1741911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (inq_res_mode != BTM_INQ_RESULT_STANDARD) { 1742911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT8(rssi, p); 1743911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 17445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1745911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_i = btm_inq_db_find(bda); 17465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1747911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Only process the num_resp is smaller than max_resps. 1748911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson If results are queued to BTU task while canceling inquiry, 1749911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson or when more than one result is in this response, > max_resp 1750911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson responses could be processed which can confuse some apps 1751911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 1752911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inq->inqparms.max_resps && 1753911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->inq_cmpl_info.num_resp >= p_inq->inqparms.max_resps 1754911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* new device response */ 1755911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson && 1756911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_i == NULL || 1757911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* exisiting device with BR/EDR info */ 1758911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_i && 1759911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_i->inq_info.results.device_type & BT_DEVICE_TYPE_BREDR) != 0))) { 1760911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* BTM_TRACE_WARNING("INQ RES: Extra Response Received...ignoring"); */ 1761911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return; 1762911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1763911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1764911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Check if this address has already been processed for this inquiry */ 1765911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_inq_find_bdaddr(bda)) { 1766911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* BTM_TRACE_DEBUG("BDA seen before [%02x%02x %02x%02x %02x%02x]", 1767911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);*/ 1768911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* By default suppose no update needed */ 1769911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson i_rssi = (int8_t)rssi; 1770911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1771911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If this new RSSI is higher than the last one */ 1772911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inq->inqparms.report_dup && (rssi != 0) && p_i && 1773911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (i_rssi > p_i->inq_info.results.rssi || 1774911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_i->inq_info.results.rssi == 0 1775911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* BR/EDR inquiry information update */ 1776911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson || 1777911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_i->inq_info.results.device_type & BT_DEVICE_TYPE_BREDR) != 0)) { 1778911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cur = &p_i->inq_info.results; 1779911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("update RSSI new:%d, old:%d", i_rssi, p_cur->rssi); 1780911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cur->rssi = i_rssi; 1781911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson update = true; 1782911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1783911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If we received a second Extended Inq Event for an already */ 1784911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* discovered device, this is because for the first one EIR was not 1785911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson received */ 1786911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else if ((inq_res_mode == BTM_INQ_RESULT_EXTENDED) && (p_i)) { 1787911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cur = &p_i->inq_info.results; 1788911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson update = true; 1789911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1790911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If no update needed continue with next response (if any) */ 1791911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 1792911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson continue; 1793911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1794911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1795911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If existing entry, use that, else get a new one (possibly reusing the 1796911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * oldest) */ 1797911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_i == NULL) { 1798911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_i = btm_inq_db_new(bda); 1799911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson is_new = true; 1800911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1801911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1802911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If an entry for the device already exists, overwrite it ONLY if it is 1803911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson from 1804911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson a previous inquiry. (Ignore it if it is a duplicate response from the 1805911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson same 1806911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson inquiry. 1807911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 1808911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else if (p_i->inq_count == p_inq->inq_counter && 1809911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_i->inq_info.results.device_type == BT_DEVICE_TYPE_BREDR)) 1810911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson is_new = false; 18115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1812911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* keep updating RSSI to have latest value */ 1813911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (inq_res_mode != BTM_INQ_RESULT_STANDARD) 1814911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_i->inq_info.results.rssi = (int8_t)rssi; 1815911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 1816911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_i->inq_info.results.rssi = BTM_INQ_RES_IGNORE_RSSI; 1817911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1818911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_new == true) { 1819911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Save the info */ 1820911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cur = &p_i->inq_info.results; 1821911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cur->page_scan_rep_mode = page_scan_rep_mode; 1822911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cur->page_scan_per_mode = page_scan_per_mode; 1823911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cur->page_scan_mode = page_scan_mode; 1824911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cur->dev_class[0] = dc[0]; 1825911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cur->dev_class[1] = dc[1]; 1826911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cur->dev_class[2] = dc[2]; 1827911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cur->clock_offset = clock_offset | BTM_CLOCK_OFFSET_VALID; 1828911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1829911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_i->time_of_resp = time_get_os_boottime_ms(); 1830911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1831911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_i->inq_count != p_inq->inq_counter) 1832911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->inq_cmpl_info.num_resp++; /* A new response was found */ 1833911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1834911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cur->inq_result_type = BTM_INQ_RESULT_BR; 1835911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_i->inq_count != p_inq->inq_counter) { 1836911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cur->device_type = BT_DEVICE_TYPE_BREDR; 1837911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_i->scan_rsp = false; 1838911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 1839911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cur->device_type |= BT_DEVICE_TYPE_BREDR; 1840911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_i->inq_count = p_inq->inq_counter; /* Mark entry for current inquiry */ 1841911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1842911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If the number of responses found and not unlimited, issue a cancel 1843911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * inquiry */ 1844911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!(p_inq->inq_active & BTM_PERIODIC_INQUIRY_ACTIVE) && 1845911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->inqparms.max_resps && 1846911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->inq_cmpl_info.num_resp == p_inq->inqparms.max_resps && 1847911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* BLE scanning is active and received adv */ 1848911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((((p_inq->inqparms.mode & BTM_BLE_INQUIRY_MASK) != 0) && 1849911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cur->device_type == BT_DEVICE_TYPE_DUMO && p_i->scan_rsp) || 1850911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_inq->inqparms.mode & BTM_BLE_INQUIRY_MASK) == 0)) { 1851911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* BTM_TRACE_DEBUG("BTMINQ: Found devices, cancelling 1852911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * inquiry..."); */ 1853911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_inq_cancel(); 1854911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1855911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_inq->inqparms.mode & BTM_BLE_INQUIRY_MASK) != 0) 1856911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_stop_inquiry(); 1857911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_acl_update_busy_level(BTM_BLI_INQ_DONE_EVT); 1858911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1859911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Initialize flag to false. This flag is set/used by application */ 1860911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_i->inq_info.appl_knows_rem_name = false; 1861911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1862911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1863911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_new || update) { 1864911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (inq_res_mode == BTM_INQ_RESULT_EXTENDED) { 1865911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memset(p_cur->eir_uuid, 0, 1866911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_EIR_SERVICE_ARRAY_SIZE * (BTM_EIR_ARRAY_BITS / 8)); 1867911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* set bit map of UUID list from received EIR */ 1868911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_set_eir_uuid(p, p_cur); 1869911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_eir_data = p; 1870911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 1871911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_eir_data = NULL; 1872911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1873911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If a callback is registered, call it with the results */ 1874911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inq_results_cb) 18750595ca0018ac9980d1dd7e192301f8494a01f9cbJakub Pawlowski (p_inq_results_cb)((tBTM_INQ_RESULTS*)p_cur, p_eir_data, 62); 1876911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1877911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 18785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 18795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1881ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1882ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_sort_inq_result 1883ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1884ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when inquiry complete is received 1885ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * from the device to sort inquiry results based on rssi. 1886ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1887ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1888ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1889ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1890911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_sort_inq_result(void) { 1891911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t xx, yy, num_resp; 1892911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tINQ_DB_ENT* p_ent = btm_cb.btm_inq_vars.inq_db; 1893911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tINQ_DB_ENT* p_next = btm_cb.btm_inq_vars.inq_db + 1; 1894911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int size; 1895911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tINQ_DB_ENT* p_tmp = (tINQ_DB_ENT*)osi_malloc(sizeof(tINQ_DB_ENT)); 1896911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1897911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson num_resp = (btm_cb.btm_inq_vars.inq_cmpl_info.num_resp < BTM_INQ_DB_SIZE) 1898911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ? btm_cb.btm_inq_vars.inq_cmpl_info.num_resp 1899911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson : BTM_INQ_DB_SIZE; 1900911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1901911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson size = sizeof(tINQ_DB_ENT); 1902911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < num_resp - 1; xx++, p_ent++) { 1903911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (yy = xx + 1, p_next = p_ent + 1; yy < num_resp; yy++, p_next++) { 1904911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_ent->inq_info.results.rssi < p_next->inq_info.results.rssi) { 1905911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_tmp, p_next, size); 1906911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_next, p_ent, size); 1907911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_ent, p_tmp, size); 1908911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1909911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1910911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1911911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1912911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson osi_free(p_tmp); 19135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 19145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1916ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1917ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_process_inq_complete 1918ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1919ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when inquiry complete is received 19209ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * from the device. Call the callback if not in periodic 19219ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * inquiry mode AND it is not NULL 19229ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * (The caller wants the event). 1923ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 19249ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * The callback pass back the status and the number of 19259ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * responses 1926ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1927ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 1928ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1929ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1930911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_process_inq_complete(uint8_t status, uint8_t mode) { 1931911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_CMPL_CB* p_inq_cb = btm_cb.btm_inq_vars.p_inq_cmpl_cb; 1932911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_INQUIRY_VAR_ST* p_inq = &btm_cb.btm_inq_vars; 19335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1934d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTA_HOST_INTERLEAVE_SEARCH == TRUE) 1935911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* inquiry inactive case happens when inquiry is cancelled. 1936911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson Make mode 0 for no further inquiries from the current inquiry process 1937911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 1938911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (status != HCI_SUCCESS || p_inq->next_state == BTM_FINISH || 1939911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson !p_inq->inq_active) { 1940911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* re-initialize for next inquiry request */ 1941911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->next_state = BTM_BR_ONE; 1942911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* make the mode 0 here */ 1943911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->inqparms.mode &= ~(p_inq->inqparms.mode); 1944911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 19457f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#endif 19465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1947d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (BTA_HOST_INTERLEAVE_SEARCH == FALSE) 1948911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->inqparms.mode &= ~(mode); 19497f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#endif 19507f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie 1951911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inq->scan_type == INQ_LE_OBSERVE && !p_inq->inq_active) { 1952911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /*end of LE observe*/ 1953911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->p_inq_ble_results_cb = (tBTM_INQ_RESULTS_CB*)NULL; 1954911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->p_inq_ble_cmpl_cb = (tBTM_CMPL_CB*)NULL; 1955911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->scan_type = INQ_NONE; 1956911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 19575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_INQ_DEBUG == TRUE) 1959911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG( 1960911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "btm_process_inq_complete inq_active:0x%x state:%d inqfilt_active:%d", 1961911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state, 1962911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_inq_vars.inqfilt_active); 19635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1964911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_acl_update_busy_level(BTM_BLI_INQ_DONE_EVT); 1965911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Ignore any stray or late complete messages if the inquiry is not active */ 1966911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inq->inq_active) { 1967911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->inq_cmpl_info.status = (tBTM_STATUS)( 1968911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (status == HCI_SUCCESS) ? BTM_SUCCESS : BTM_ERR_PROCESSING); 19695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1970911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Notify caller that the inquiry has completed; (periodic inquiries do not 1971911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * send completion events */ 1972911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!(p_inq->inq_active & BTM_PERIODIC_INQUIRY_ACTIVE) && 1973911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->inqparms.mode == 0) { 1974911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_clear_all_pending_le_entry(); 1975911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->state = BTM_INQ_INACTIVE_STATE; 19765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1977911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Increment so the start of a next inquiry has a new count */ 1978911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->inq_counter++; 19795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1980911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_clr_inq_result_flt(); 19815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1982911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_inq->inq_cmpl_info.status == BTM_SUCCESS) && 1983911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson controller_get_interface()->supports_rssi_with_inquiry_results()) { 1984911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sort_inq_result(); 1985911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 19865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1987911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Clear the results callback if set */ 1988911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->p_inq_results_cb = (tBTM_INQ_RESULTS_CB*)NULL; 1989911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->inq_active = BTM_INQUIRY_INACTIVE; 1990911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->p_inq_cmpl_cb = (tBTM_CMPL_CB*)NULL; 19915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1992911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If we have a callback registered for inquiry complete, call it */ 1993911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("BTM Inq Compl Callback: status 0x%02x, num results %d", 1994911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->inq_cmpl_info.status, 1995911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->inq_cmpl_info.num_resp); 19965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1997911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inq_cb) (p_inq_cb)((tBTM_INQUIRY_CMPL*)&p_inq->inq_cmpl_info); 19985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1999911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#if (BTA_HOST_INTERLEAVE_SEARCH == TRUE) 2000911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inq->inqparms.mode != 0 && 2001911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson !(p_inq->inq_active & BTM_PERIODIC_INQUIRY_ACTIVE)) { 2002911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* make inquiry inactive for next iteration */ 2003911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->inq_active = BTM_INQUIRY_INACTIVE; 2004911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* call the inquiry again */ 2005911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_StartInquiry(&p_inq->inqparms, p_inq->p_inq_results_cb, 2006911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->p_inq_cmpl_cb); 20070830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora } 2008911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#endif 2009911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2010911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inq->inqparms.mode == 0 && 2011911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->scan_type == INQ_GENERAL) // this inquiry is complete 2012911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 2013911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->scan_type = INQ_NONE; 2014911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* check if the LE observe is pending */ 2015911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inq->p_inq_ble_results_cb != NULL) { 2016911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("BTM Inq Compl: resuming a pending LE scan"); 2017911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_BleObserve(1, 0, p_inq->p_inq_ble_results_cb, 2018911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->p_inq_ble_cmpl_cb); 2019911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2020911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 20215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_INQ_DEBUG == TRUE) 2022911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("inq_active:0x%x state:%d inqfilt_active:%d", 2023911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state, 2024911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_inq_vars.inqfilt_active); 20255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 20265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 20275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2029ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2030ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_process_cancel_complete 2031ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 20329ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called when inquiry cancel complete is 20339ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * received from the device. This function will also call the 20349ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * btm_process_inq_complete. This function is needed to 20359ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * differentiate a cancel_cmpl_evt from the inq_cmpl_evt. 2036ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2037ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 2038ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2039ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2040911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_process_cancel_complete(uint8_t status, uint8_t mode) { 2041911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_acl_update_busy_level(BTM_BLI_INQ_CANCEL_EVT); 2042911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_process_inq_complete(status, mode); 20435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 20445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2045ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2046ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_initiate_rem_name 2047ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 20489ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function looks initiates a remote name request. It is 20499ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * called either by GAP or by the API call 20509ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * BTM_ReadRemoteDeviceName. 2051ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 20528bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He * Input Params: p_cb - callback function called when 20539ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * BTM_CMD_STARTED is returned. 20549ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * A pointer to tBTM_REMOTE_DEV_NAME is 20559ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * passed to the callback. 2056ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2057ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns 2058ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_CMD_STARTED is returned if the request was sent to HCI. 2059ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_BUSY if already in progress 20609ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * BTM_NO_RESOURCES if could not allocate resources to start 20619ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * the command 2062ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_WRONG_MODE if the device is not up. 2063ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2064ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 20658bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack HetBTM_STATUS btm_initiate_rem_name(BD_ADDR remote_bda, uint8_t origin, 20668bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He period_ms_t timeout_ms, tBTM_CMPL_CB* p_cb) { 2067911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_INQUIRY_VAR_ST* p_inq = &btm_cb.btm_inq_vars; 2068911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2069911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /*** Make sure the device is ready ***/ 2070911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!BTM_IsDeviceUp()) return (BTM_WRONG_MODE); 2071911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2072911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (origin == BTM_RMT_NAME_SEC) { 2073911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_rmt_name_req(remote_bda, HCI_PAGE_SCAN_REP_MODE_R1, 2074911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson HCI_MANDATARY_PAGE_SCAN_MODE, 0); 2075911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_CMD_STARTED; 2076911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2077911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Make sure there are no two remote name requests from external API in 2078911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson progress */ 2079911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else if (origin == BTM_RMT_NAME_EXT) { 2080911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_inq->remname_active) { 2081911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_BUSY); 2082911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 2083911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If there is no remote name request running,call the callback function 2084911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * and start timer */ 2085911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->p_remname_cmpl_cb = p_cb; 2086911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_inq->remname_bda, remote_bda, BD_ADDR_LEN); 2087911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2088911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson alarm_set_on_queue(p_inq->remote_name_timer, timeout_ms, 2089911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_inq_remote_name_timer_timeout, NULL, 2090911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btu_general_alarm_queue); 2091911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2092911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If the database entry exists for the device, use its clock offset */ 20938bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He tINQ_DB_ENT* p_i = btm_inq_db_find(remote_bda); 20948bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He if (p_i) { 20958bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He tBTM_INQ_INFO* p_cur = &p_i->inq_info; 2096911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_rmt_name_req( 2097911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson remote_bda, p_cur->results.page_scan_rep_mode, 2098911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cur->results.page_scan_mode, 2099911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (uint16_t)(p_cur->results.clock_offset | BTM_CLOCK_OFFSET_VALID)); 21008bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He } else { 21018bf2285959ffb8960f1bf01499c15cfa1e2ccf16Jack He /* Otherwise use defaults and mark the clock offset as invalid */ 2102763abdfe7983c8388c1fd0ce6aa05a44df11eacaJakub Pawlowski btsnd_hcic_rmt_name_req(remote_bda, HCI_PAGE_SCAN_REP_MODE_R1, 2103763abdfe7983c8388c1fd0ce6aa05a44df11eacaJakub Pawlowski HCI_MANDATARY_PAGE_SCAN_MODE, 0); 2104911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2105911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2106911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->remname_active = true; 2107911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_CMD_STARTED; 21085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2109911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 2110911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_ILLEGAL_VALUE; 2111911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 21125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 21135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2115ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2116ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_process_remote_name 2117ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2118ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when a remote name is received from 21199ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * the device. If remote names are cached, it updates the 21209ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * inquiry database. 2121ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2122ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 2123ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2124ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2125911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_process_remote_name(BD_ADDR bda, BD_NAME bdn, uint16_t evt_len, 2126911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t hci_status) { 2127911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_REMOTE_DEV_NAME rem_name; 2128911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_INQUIRY_VAR_ST* p_inq = &btm_cb.btm_inq_vars; 2129911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_CMPL_CB* p_cb = p_inq->p_remname_cmpl_cb; 2130911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_n1; 2131911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2132911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t temp_evt_len; 2133911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2134911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (bda != NULL) { 2135911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("BDA %02x:%02x:%02x:%02x:%02x:%02x", bda[0], bda[1], bda[2], 2136911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bda[3], bda[4], bda[5]); 2137911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2138911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2139911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT("Inquire BDA %02x:%02x:%02x:%02x:%02x:%02x", 2140911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->remname_bda[0], p_inq->remname_bda[1], 2141911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->remname_bda[2], p_inq->remname_bda[3], 2142911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->remname_bda[4], p_inq->remname_bda[5]); 2143911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2144911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If the inquire BDA and remote DBA are the same, then stop the timer and set 2145911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson * the active to false */ 2146911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_inq->remname_active == true) && 2147911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (((bda != NULL) && (memcmp(bda, p_inq->remname_bda, BD_ADDR_LEN) == 0)) || 2148911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bda == NULL)) 2149911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2150911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 2151911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (BTM_UseLeLink(p_inq->remname_bda)) { 2152911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (hci_status == HCI_ERR_UNSPECIFIED) 2153911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_ble_cancel_remote_name(p_inq->remname_bda); 2154911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2155911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson alarm_cancel(p_inq->remote_name_timer); 2156911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->remname_active = false; 2157911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Clean up and return the status if the command was not successful */ 2158911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Note: If part of the inquiry, the name is not stored, and the */ 2159911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* inquiry complete callback is called. */ 2160911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2161911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (hci_status == HCI_SUCCESS) { 2162911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Copy the name from the data stream into the return structure */ 2163911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Note that even if it is not being returned, it is used as a */ 2164911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* temporary buffer. */ 2165911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_n1 = (uint8_t*)rem_name.remote_bd_name; 2166911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rem_name.length = (evt_len < BD_NAME_LEN) ? evt_len : BD_NAME_LEN; 2167911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rem_name.remote_bd_name[rem_name.length] = 0; 2168911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rem_name.status = BTM_SUCCESS; 2169911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson temp_evt_len = rem_name.length; 2170911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2171911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson while (temp_evt_len > 0) { 2172911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_n1++ = *bdn++; 2173911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson temp_evt_len--; 2174911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2175911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rem_name.remote_bd_name[rem_name.length] = 0; 2176911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2177911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2178911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If processing a stand alone remote name then report the error in the 2179911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson callback */ 2180911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else { 2181911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rem_name.status = BTM_BAD_VALUE_RET; 2182911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rem_name.length = 0; 2183911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson rem_name.remote_bd_name[0] = 0; 2184911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2185911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Reset the remote BAD to zero and call callback if possible */ 2186911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memset(p_inq->remname_bda, 0, BD_ADDR_LEN); 2187911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2188911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_inq->p_remname_cmpl_cb = NULL; 2189911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb) (p_cb)((tBTM_REMOTE_DEV_NAME*)&rem_name); 2190911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 21915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 21925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2193911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_inq_remote_name_timer_timeout(UNUSED_ATTR void* data) { 2194911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_inq_rmt_name_failed(); 219578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov} 219678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov 21975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2198ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2199ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_inq_rmt_name_failed 2200ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2201ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is if timeout expires while getting remote 2202ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * name. This is done for devices that incorrectly do not 2203ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * report operation failure 2204ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2205ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 2206ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2207ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2208911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_inq_rmt_name_failed(void) { 2209911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_ERROR("btm_inq_rmt_name_failed() remname_active=%d", 2210911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.btm_inq_vars.remname_active); 22115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2212911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (btm_cb.btm_inq_vars.remname_active) 2213911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_process_remote_name(btm_cb.btm_inq_vars.remname_bda, NULL, 0, 2214911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson HCI_ERR_UNSPECIFIED); 2215911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 2216911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_process_remote_name(NULL, NULL, 0, HCI_ERR_UNSPECIFIED); 22175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2218911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_sec_rmt_name_request_complete(NULL, NULL, HCI_ERR_UNSPECIFIED); 22195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 222078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov 222178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov/******************************************************************************* 2222ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2223ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_read_inq_tx_power_timeout 2224ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2225ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Callback when reading the inquiry tx power times out. 2226ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2227ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 2228ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2229ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2230911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_read_inq_tx_power_timeout(UNUSED_ATTR void* data) { 2231911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_CMPL_CB* p_cb = btm_cb.devcb.p_inq_tx_power_cmpl_cb; 2232911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.p_inq_tx_power_cmpl_cb = NULL; 2233911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb) (*p_cb)((void*)NULL); 223478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov} 223578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov 22365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2237ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2238ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_read_inq_tx_power_complete 2239ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2240ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description read inquiry tx power level complete callback function. 2241ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2242ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 2243ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2244ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2245911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_read_inq_tx_power_complete(uint8_t* p) { 2246911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_CMPL_CB* p_cb = btm_cb.devcb.p_inq_tx_power_cmpl_cb; 2247911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tBTM_INQ_TXPWR_RESULTS results; 2248911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2249911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG("%s", __func__); 2250911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson alarm_cancel(btm_cb.devcb.read_inq_tx_power_timer); 2251911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btm_cb.devcb.p_inq_tx_power_cmpl_cb = NULL; 2252911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2253911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* If there was a registered callback, call it */ 2254911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cb) { 2255911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT8(results.hci_status, p); 2256911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2257911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (results.hci_status == HCI_SUCCESS) { 2258911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson results.status = BTM_SUCCESS; 2259911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2260911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT8(results.tx_power, p); 2261911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_EVENT( 2262911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson "BTM INQ TX POWER Complete: tx_power %d, hci status 0x%02x", 2263911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson results.tx_power, results.hci_status); 2264911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 2265911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson results.status = BTM_ERR_PROCESSING; 2266911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2267911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*p_cb)(&results); 2268911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 22695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 22705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2271ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2272ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_WriteEIR 2273ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2274ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to write EIR data to controller. 2275ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2276ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters p_buff - allocated HCI command buffer including extended 2277ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * inquriry response 2278ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2279ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns BTM_SUCCESS - if successful 2280ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_MODE_UNSUPPORTED - if local device cannot support it 2281ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2282ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2283911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_STATUS BTM_WriteEIR(BT_HDR* p_buff) { 2284911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (controller_get_interface()->supports_extended_inquiry_response()) { 2285911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("Write Extended Inquiry Response to controller"); 2286911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson btsnd_hcic_write_ext_inquiry_response(p_buff, BTM_EIR_DEFAULT_FEC_REQUIRED); 2287911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_SUCCESS; 2288911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 2289911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson osi_free(p_buff); 2290911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_MODE_UNSUPPORTED; 2291911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 22925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 22935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2295ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2296ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_convert_uuid_to_eir_service 2297ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2298ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to get the bit position of UUID. 2299ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2300ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters uuid16 - UUID 16-bit 2301ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2302ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns BTM EIR service ID if found 2303ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_EIR_MAX_SERVICES - if not found 2304ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2305ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2306911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic uint8_t btm_convert_uuid_to_eir_service(uint16_t uuid16) { 2307911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t xx; 23085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2309911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < BTM_EIR_MAX_SERVICES; xx++) { 2310911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (uuid16 == BTM_EIR_UUID_LKUP_TBL[xx]) { 2311911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return xx; 23125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2313911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2314911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_EIR_MAX_SERVICES; 23155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 23165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2318ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2319ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_HasEirService 2320ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2321ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to know if UUID in bit map of UUID. 2322ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2323ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters p_eir_uuid - bit map of UUID list 2324ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * uuid16 - UUID 16-bit 2325ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2326ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns true - if found 2327ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * false - if not found 2328ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2329ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2330911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonbool BTM_HasEirService(uint32_t* p_eir_uuid, uint16_t uuid16) { 2331911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t service_id; 23325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2333911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson service_id = btm_convert_uuid_to_eir_service(uuid16); 2334911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (service_id < BTM_EIR_MAX_SERVICES) 2335911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (BTM_EIR_HAS_SERVICE(p_eir_uuid, service_id)); 2336911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else 2337911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (false); 23385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 23395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2341ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2342ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_HasInquiryEirService 2343ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 23449ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called to know if UUID in bit map of UUID 23459ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * list. 2346ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2347ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters p_results - inquiry results 2348ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * uuid16 - UUID 16-bit 2349ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2350ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns BTM_EIR_FOUND - if found 2351ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_EIR_NOT_FOUND - if not found and it is complete list 2352ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_EIR_UNKNOWN - if not found and it is not complete list 2353ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2354ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2355911d1ae03efec2d54c3b1b605589d790d1745488Myles WatsontBTM_EIR_SEARCH_RESULT BTM_HasInquiryEirService(tBTM_INQ_RESULTS* p_results, 2356911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t uuid16) { 2357911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (BTM_HasEirService(p_results->eir_uuid, uuid16)) { 2358911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_EIR_FOUND; 2359911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if (p_results->eir_complete_list) { 2360911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_EIR_NOT_FOUND; 2361911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 2362911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_EIR_UNKNOWN; 23635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 23645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2366ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2367ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_AddEirService 2368ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 23699ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called to add a service in bit map of UUID 23709ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * list. 2371ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2372ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters p_eir_uuid - bit mask of UUID list for EIR 2373ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * uuid16 - UUID 16-bit 2374ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2375ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns None 2376ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2377ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2378911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid BTM_AddEirService(uint32_t* p_eir_uuid, uint16_t uuid16) { 2379911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t service_id; 23805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2381911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson service_id = btm_convert_uuid_to_eir_service(uuid16); 2382911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (service_id < BTM_EIR_MAX_SERVICES) 2383911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_EIR_SET_SERVICE(p_eir_uuid, service_id); 23845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 23855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2387ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2388ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_RemoveEirService 2389ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 23909ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called to remove a service in bit map of 23919ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * UUID list. 2392ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2393ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters p_eir_uuid - bit mask of UUID list for EIR 2394ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * uuid16 - UUID 16-bit 2395ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2396ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns None 2397ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2398ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2399911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid BTM_RemoveEirService(uint32_t* p_eir_uuid, uint16_t uuid16) { 2400911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t service_id; 24015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2402911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson service_id = btm_convert_uuid_to_eir_service(uuid16); 2403911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (service_id < BTM_EIR_MAX_SERVICES) 2404911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_EIR_CLR_SERVICE(p_eir_uuid, service_id); 24055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 24065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2408ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2409ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_GetEirSupportedServices 2410ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 24119ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called to get UUID list from bit map of 24129ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * UUID list. 2413ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2414ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters p_eir_uuid - bit mask of UUID list for EIR 2415ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p - reference of current pointer of EIR 2416ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * max_num_uuid16 - max number of UUID can be written in EIR 2417ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * num_uuid16 - number of UUID have been written in EIR 2418ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2419ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns BTM_EIR_MORE_16BITS_UUID_TYPE, if it has more than max 2420ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_EIR_COMPLETE_16BITS_UUID_TYPE, otherwise 2421ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2422ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2423911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint8_t BTM_GetEirSupportedServices(uint32_t* p_eir_uuid, uint8_t** p, 2424911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t max_num_uuid16, 2425911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_num_uuid16) { 2426911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t service_index; 2427911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2428911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_num_uuid16 = 0; 2429911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2430911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (service_index = 0; service_index < BTM_EIR_MAX_SERVICES; 2431911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson service_index++) { 2432911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (BTM_EIR_HAS_SERVICE(p_eir_uuid, service_index)) { 2433911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (*p_num_uuid16 < max_num_uuid16) { 2434911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT16_TO_STREAM(*p, BTM_EIR_UUID_LKUP_TBL[service_index]); 2435911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (*p_num_uuid16)++; 2436911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2437911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if max number of UUIDs are stored and found one more */ 2438911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else { 2439911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_EIR_MORE_16BITS_UUID_TYPE; 2440911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2441911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2442911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2443911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return BTM_EIR_COMPLETE_16BITS_UUID_TYPE; 24445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 24455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2447ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2448ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function BTM_GetEirUuidList 2449ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2450ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function parses EIR and returns UUID list. 2451ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2452ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters p_eir - EIR 24530595ca0018ac9980d1dd7e192301f8494a01f9cbJakub Pawlowski * eir_len - EIR len 2454ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * uuid_size - LEN_UUID_16, LEN_UUID_32, LEN_UUID_128 2455ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_num_uuid - return number of UUID in found list 2456ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_uuid_list - return UUID list 2457ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * max_num_uuid - maximum number of UUID to be returned 2458ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2459ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns 0 - if not found 2460ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_EIR_COMPLETE_16BITS_UUID_TYPE 2461ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_EIR_MORE_16BITS_UUID_TYPE 2462ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_EIR_COMPLETE_32BITS_UUID_TYPE 2463ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_EIR_MORE_32BITS_UUID_TYPE 2464ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_EIR_COMPLETE_128BITS_UUID_TYPE 2465ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * BTM_EIR_MORE_128BITS_UUID_TYPE 2466ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2467ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 24680595ca0018ac9980d1dd7e192301f8494a01f9cbJakub Pawlowskiuint8_t BTM_GetEirUuidList(uint8_t* p_eir, size_t eir_len, uint8_t uuid_size, 2469911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_num_uuid, uint8_t* p_uuid_list, 2470911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t max_num_uuid) { 2471cfd6525c3d30e0efec789b5ddbf25dd24e37cc15Jakub Pawlowski const uint8_t* p_uuid_data; 2472911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t type; 2473911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t yy, xx; 2474911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t* p_uuid16 = (uint16_t*)p_uuid_list; 2475911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint32_t* p_uuid32 = (uint32_t*)p_uuid_list; 2476911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson char buff[LEN_UUID_128 * 2 + 1]; 2477911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 24780595ca0018ac9980d1dd7e192301f8494a01f9cbJakub Pawlowski p_uuid_data = 24790595ca0018ac9980d1dd7e192301f8494a01f9cbJakub Pawlowski btm_eir_get_uuid_list(p_eir, eir_len, uuid_size, p_num_uuid, &type); 2480911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_uuid_data == NULL) { 2481911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return 0x00; 2482911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2483911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2484911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (*p_num_uuid > max_num_uuid) { 24850595ca0018ac9980d1dd7e192301f8494a01f9cbJakub Pawlowski BTM_TRACE_WARNING("%s: number of uuid in EIR = %d, size of uuid list = %d", 24860595ca0018ac9980d1dd7e192301f8494a01f9cbJakub Pawlowski __func__, *p_num_uuid, max_num_uuid); 2487911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_num_uuid = max_num_uuid; 2488911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2489911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 24900595ca0018ac9980d1dd7e192301f8494a01f9cbJakub Pawlowski BTM_TRACE_DEBUG("%s: type = %02X, number of uuid = %d", __func__, type, 2491911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_num_uuid); 2492911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2493911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (uuid_size == LEN_UUID_16) { 2494911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (yy = 0; yy < *p_num_uuid; yy++) { 2495911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT16(*(p_uuid16 + yy), p_uuid_data); 2496911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG(" 0x%04X", *(p_uuid16 + yy)); 2497911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2498911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if (uuid_size == LEN_UUID_32) { 2499911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (yy = 0; yy < *p_num_uuid; yy++) { 2500911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT32(*(p_uuid32 + yy), p_uuid_data); 2501911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG(" 0x%08X", *(p_uuid32 + yy)); 2502911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2503911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if (uuid_size == LEN_UUID_128) { 2504911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (yy = 0; yy < *p_num_uuid; yy++) { 2505911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_ARRAY16(p_uuid_list + yy * LEN_UUID_128, p_uuid_data); 2506911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < LEN_UUID_128; xx++) 2507911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson snprintf(buff + xx * 2, sizeof(buff) - xx * 2, "%02X", 2508911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *(p_uuid_list + yy * LEN_UUID_128 + xx)); 2509911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_DEBUG(" 0x%s", buff); 2510911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2511911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2512911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2513911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return type; 25145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 25155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2517ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2518ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_eir_get_uuid_list 2519ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2520ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function searches UUID list in EIR. 2521ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2522ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters p_eir - address of EIR 25230595ca0018ac9980d1dd7e192301f8494a01f9cbJakub Pawlowski * eir_len - EIR length 2524ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * uuid_size - size of UUID to find 2525ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_num_uuid - number of UUIDs found 2526ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_uuid_list_type - EIR data type 2527ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2528ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns NULL - if UUID list with uuid_size is not found 2529ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * beginning of UUID list in EIR - otherwise 2530ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2531ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2532cfd6525c3d30e0efec789b5ddbf25dd24e37cc15Jakub Pawlowskistatic const uint8_t* btm_eir_get_uuid_list(uint8_t* p_eir, size_t eir_len, 2533cfd6525c3d30e0efec789b5ddbf25dd24e37cc15Jakub Pawlowski uint8_t uuid_size, 2534cfd6525c3d30e0efec789b5ddbf25dd24e37cc15Jakub Pawlowski uint8_t* p_num_uuid, 2535cfd6525c3d30e0efec789b5ddbf25dd24e37cc15Jakub Pawlowski uint8_t* p_uuid_list_type) { 2536cfd6525c3d30e0efec789b5ddbf25dd24e37cc15Jakub Pawlowski const uint8_t* p_uuid_data; 2537911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t complete_type, more_type; 2538911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t uuid_len; 2539911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2540911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (uuid_size) { 25415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case LEN_UUID_16: 2542911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson complete_type = BTM_EIR_COMPLETE_16BITS_UUID_TYPE; 2543911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson more_type = BTM_EIR_MORE_16BITS_UUID_TYPE; 2544911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 25455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case LEN_UUID_32: 2546911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson complete_type = BTM_EIR_COMPLETE_32BITS_UUID_TYPE; 2547911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson more_type = BTM_EIR_MORE_32BITS_UUID_TYPE; 2548911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 25495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case LEN_UUID_128: 2550911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson complete_type = BTM_EIR_COMPLETE_128BITS_UUID_TYPE; 2551911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson more_type = BTM_EIR_MORE_128BITS_UUID_TYPE; 2552911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 25535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 2554911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_num_uuid = 0; 2555911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return NULL; 2556911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 2557911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2558911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2559cfd6525c3d30e0efec789b5ddbf25dd24e37cc15Jakub Pawlowski p_uuid_data = AdvertiseDataParser::GetFieldByType(p_eir, eir_len, 2560cfd6525c3d30e0efec789b5ddbf25dd24e37cc15Jakub Pawlowski complete_type, &uuid_len); 2561911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_uuid_data == NULL) { 2562cfd6525c3d30e0efec789b5ddbf25dd24e37cc15Jakub Pawlowski p_uuid_data = AdvertiseDataParser::GetFieldByType(p_eir, eir_len, more_type, 2563cfd6525c3d30e0efec789b5ddbf25dd24e37cc15Jakub Pawlowski &uuid_len); 2564911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_uuid_list_type = more_type; 2565911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 2566911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_uuid_list_type = complete_type; 2567911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2568911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2569911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_num_uuid = uuid_len / uuid_size; 2570911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return p_uuid_data; 25715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 25725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2574ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2575ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_convert_uuid_to_uuid16 2576ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2577ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function converts UUID to UUID 16-bit. 2578ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2579ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters p_uuid - address of UUID 2580ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * uuid_size - size of UUID 2581ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2582ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns 0 - if UUID cannot be converted to UUID 16-bit 2583ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * UUID 16-bit - otherwise 2584ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2585ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2586cfd6525c3d30e0efec789b5ddbf25dd24e37cc15Jakub Pawlowskistatic uint16_t btm_convert_uuid_to_uuid16(const uint8_t* p_uuid, 2587cfd6525c3d30e0efec789b5ddbf25dd24e37cc15Jakub Pawlowski uint8_t uuid_size) { 2588911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson static const uint8_t base_uuid[LEN_UUID_128] = { 2589911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80, 2590911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; 2591911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t uuid16 = 0; 2592911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint32_t uuid32; 2593911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson bool is_base_uuid; 2594911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t xx; 2595911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2596911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (uuid_size) { 25975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case LEN_UUID_16: 2598911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT16(uuid16, p_uuid); 2599911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 26005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case LEN_UUID_32: 2601911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT32(uuid32, p_uuid); 2602911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (uuid32 < 0x10000) uuid16 = (uint16_t)uuid32; 2603911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 26045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case LEN_UUID_128: 2605911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* See if we can compress his UUID down to 16 or 32bit UUIDs */ 2606911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson is_base_uuid = true; 2607911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (xx = 0; xx < LEN_UUID_128 - 4; xx++) { 2608911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_uuid[xx] != base_uuid[xx]) { 2609911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson is_base_uuid = false; 2610911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 26115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2612911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2613911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (is_base_uuid) { 2614911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_uuid[LEN_UUID_128 - 1] == 0) && 2615911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_uuid[LEN_UUID_128 - 2] == 0)) { 2616911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_uuid += (LEN_UUID_128 - 4); 2617911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT16(uuid16, p_uuid); 26185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2619911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2620911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 26215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 2622911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_WARNING("btm_convert_uuid_to_uuid16 invalid uuid size"); 2623911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 2624911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 26255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2626911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (uuid16); 26275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 26285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2630ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2631ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function btm_set_eir_uuid 2632ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 26339ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description This function is called to store received UUID into inquiry 26349ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * result. 2635ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2636ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Parameters p_eir - pointer of EIR significant part 2637ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * p_results - pointer of inquiry result 2638ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2639ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns None 2640ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 2641ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2642911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid btm_set_eir_uuid(uint8_t* p_eir, tBTM_INQ_RESULTS* p_results) { 2643cfd6525c3d30e0efec789b5ddbf25dd24e37cc15Jakub Pawlowski const uint8_t* p_uuid_data; 2644911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t num_uuid; 2645911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t uuid16; 2646911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t yy; 2647911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t type = BTM_EIR_MORE_16BITS_UUID_TYPE; 2648911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 26490595ca0018ac9980d1dd7e192301f8494a01f9cbJakub Pawlowski p_uuid_data = btm_eir_get_uuid_list(p_eir, HCI_EXT_INQ_RESPONSE_LEN, 26500595ca0018ac9980d1dd7e192301f8494a01f9cbJakub Pawlowski LEN_UUID_16, &num_uuid, &type); 2651911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2652911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (type == BTM_EIR_COMPLETE_16BITS_UUID_TYPE) { 2653911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_results->eir_complete_list = true; 2654911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 2655911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_results->eir_complete_list = false; 2656911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2657911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2658911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_TRACE_API("btm_set_eir_uuid eir_complete_list=0x%02X", 2659911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_results->eir_complete_list); 2660911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 2661911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_uuid_data) { 2662911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (yy = 0; yy < num_uuid; yy++) { 2663911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson STREAM_TO_UINT16(uuid16, p_uuid_data); 2664911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_AddEirService(p_results->eir_uuid, uuid16); 2665911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2666911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2667911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 26680595ca0018ac9980d1dd7e192301f8494a01f9cbJakub Pawlowski p_uuid_data = btm_eir_get_uuid_list(p_eir, HCI_EXT_INQ_RESPONSE_LEN, 26690595ca0018ac9980d1dd7e192301f8494a01f9cbJakub Pawlowski LEN_UUID_32, &num_uuid, &type); 2670911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_uuid_data) { 2671911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (yy = 0; yy < num_uuid; yy++) { 2672911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uuid16 = btm_convert_uuid_to_uuid16(p_uuid_data, LEN_UUID_32); 2673911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_uuid_data += LEN_UUID_32; 2674911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (uuid16) BTM_AddEirService(p_results->eir_uuid, uuid16); 2675911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2676911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2677911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 26780595ca0018ac9980d1dd7e192301f8494a01f9cbJakub Pawlowski p_uuid_data = btm_eir_get_uuid_list(p_eir, HCI_EXT_INQ_RESPONSE_LEN, 26790595ca0018ac9980d1dd7e192301f8494a01f9cbJakub Pawlowski LEN_UUID_128, &num_uuid, &type); 2680911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_uuid_data) { 2681911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (yy = 0; yy < num_uuid; yy++) { 2682911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uuid16 = btm_convert_uuid_to_uuid16(p_uuid_data, LEN_UUID_128); 2683911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_uuid_data += LEN_UUID_128; 2684911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (uuid16) BTM_AddEirService(p_results->eir_uuid, uuid16); 2685911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2686911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 26875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2688