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