blob: 3b5afab976d3cd8c62c6dfd60d747e9cad8f29df [file] [log] [blame]
The Android Open Source Project5738f832012-12-12 16:00:35 -08001/******************************************************************************
2 *
Wei Wanga6ce7752014-05-20 06:30:32 +00003 * Copyright (C) 2008-2014 Broadcom Corporation
The Android Open Source Project5738f832012-12-12 16:00:35 -08004 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 ******************************************************************************/
18
19/******************************************************************************
20 *
21 * This file contains functions for BLE GAP.
22 *
23 ******************************************************************************/
24
25#include <string.h>
26#include <stdio.h>
27#include <stddef.h>
28
29#include "bt_types.h"
Mike J. Chen5cd8bff2014-01-31 18:16:59 -080030#include "bt_utils.h"
The Android Open Source Project5738f832012-12-12 16:00:35 -080031#include "btu.h"
32#include "btm_int.h"
33#include "hcimsgs.h"
34#if (GAP_INCLUDED == TRUE)
35#include "gap_api.h"
36#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -080037#if (BLE_INCLUDED == TRUE)
Wei Wanged534e32014-05-20 06:30:13 +000038#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
39#include "vendor_ble.h"
40#endif
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -080041#include "gattdefs.h"
Nitin Arora021e17a2014-01-29 19:18:39 -080042#include "gatt_int.h"
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -080043
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -070044#include "btm_ble_int.h"
45
The Android Open Source Project5738f832012-12-12 16:00:35 -080046#define BTM_BLE_NAME_SHORT 0x01
47#define BTM_BLE_NAME_CMPL 0x02
48
49#define BTM_BLE_FILTER_TARGET_UNKNOWN 0xff
50#define BTM_BLE_POLICY_UNKNOWN 0xff
51
The Android Open Source Project5738f832012-12-12 16:00:35 -080052#define BTM_EXT_BLE_RMT_NAME_TIMEOUT 30
Wei Wanga6ce7752014-05-20 06:30:32 +000053#define MIN_ADV_LENGTH 2
54
Satya Callojic4e25962014-05-10 23:46:24 -070055static tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
Ganesh Ganapathi Batta8d416912014-05-30 16:28:00 -070056static tBTM_BLE_CTRL_FEATURES_CBACK *p_ctrl_le_feature_rd_cmpl_cback = NULL;
57
The Android Open Source Project5738f832012-12-12 16:00:35 -080058/*******************************************************************************
59** Local functions
60*******************************************************************************/
61static void btm_ble_update_adv_flag(UINT8 flag);
62static void btm_ble_process_adv_pkt_cont(BD_ADDR bda, UINT8 addr_type, UINT8 evt_type, UINT8 *p);
Wei Wanga6ce7752014-05-20 06:30:32 +000063UINT8 *btm_ble_build_adv_data(tBTM_BLE_AD_MASK *p_data_mask, UINT8 **p_dst,
64 tBTM_BLE_ADV_DATA *p_data);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -080065static UINT8 btm_set_conn_mode_adv_init_addr(tBTM_BLE_INQ_CB *p_cb,
66 BD_ADDR_PTR p_addr_ptr,
67 tBLE_ADDR_TYPE *p_init_addr_type,
68 tBLE_ADDR_TYPE *p_own_addr_type);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -070069static void btm_ble_stop_observe(void);
The Android Open Source Project5738f832012-12-12 16:00:35 -080070
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -070071#define BTM_BLE_INQ_RESULT 0x01
72#define BTM_BLE_OBS_RESULT 0x02
73#define BTM_BLE_SEL_CONN_RESULT 0x04
The Android Open Source Project5738f832012-12-12 16:00:35 -080074
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -070075/* LE states combo bit to check */
76const UINT8 btm_le_state_combo_tbl[BTM_BLE_STATE_MAX][BTM_BLE_STATE_MAX][2] =
The Android Open Source Project5738f832012-12-12 16:00:35 -080077{
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -070078 {/* single state support */
79 {HCI_SUPP_LE_STATES_CONN_ADV_MASK, HCI_SUPP_LE_STATES_CONN_ADV_OFF}, /* conn_adv */
80 {HCI_SUPP_LE_STATES_INIT_MASK, HCI_SUPP_LE_STATES_INIT_OFF}, /* init */
81 {HCI_SUPP_LE_STATES_INIT_MASK, HCI_SUPP_LE_STATES_INIT_OFF}, /* master */
82 {HCI_SUPP_LE_STATES_SLAVE_MASK, HCI_SUPP_LE_STATES_SLAVE_OFF}, /* slave */
83 {0, 0}, /* todo: lo du dir adv, not covered ? */
84 {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_OFF}, /* hi duty dir adv */
85 {HCI_SUPP_LE_STATES_NON_CONN_ADV_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_OFF}, /* non connectable adv */
86 {HCI_SUPP_LE_STATES_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_OFF}, /* passive scan */
87 {HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_OFF}, /* active scan */
88 {HCI_SUPP_LE_STATES_SCAN_ADV_MASK, HCI_SUPP_LE_STATESSCAN_ADV_OFF} /* scanable adv */
89 },
90 { /* conn_adv =0 */
91 {0, 0}, /* conn_adv */
92 {HCI_SUPP_LE_STATES_CONN_ADV_INIT_MASK, HCI_SUPP_LE_STATES_CONN_ADV_INIT_OFF}, /* init: 32 */
93 {HCI_SUPP_LE_STATES_CONN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_CONN_ADV_MASTER_OFF}, /* master: 35 */
94 {HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_OFF}, /* slave: 38,*/
95 {0, 0}, /* lo du dir adv */
96 {0, 0}, /* hi duty dir adv */
97 {0, 0}, /* non connectable adv */
98 {HCI_SUPP_LE_STATES_CONN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_CONN_ADV_PASS_SCAN_OFF}, /* passive scan */
99 {HCI_SUPP_LE_STATES_CONN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_CONN_ADV_ACTIVE_SCAN_OFF}, /* active scan */
100 {0, 0} /* scanable adv */
101 },
102 { /* init */
103 {HCI_SUPP_LE_STATES_CONN_ADV_INIT_MASK, HCI_SUPP_LE_STATES_CONN_ADV_INIT_OFF}, /* conn_adv: 32 */
104 {0, 0}, /* init */
105 {HCI_SUPP_LE_STATES_INIT_MASTER_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_OFF}, /* master 28 */
106 {HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_OFF}, /* slave 41 */
107 {HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_INIT_MASK, HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_INIT_OFF} ,/* lo du dir adv 34 */
108 {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_INIT_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_INIT_OFF}, /* hi duty dir adv 33 */
109 {HCI_SUPP_LE_STATES_NON_CONN_INIT_MASK, HCI_SUPP_LE_STATES_NON_CONN_INIT_OFF}, /* non connectable adv */
110 {HCI_SUPP_LE_STATES_PASS_SCAN_INIT_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_INIT_OFF}, /* passive scan */
111 {HCI_SUPP_LE_STATES_ACTIVE_SCAN_INIT_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_INIT_OFF}, /* active scan */
112 {HCI_SUPP_LE_STATES_SCAN_ADV_INIT_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_INIT_OFF} /* scanable adv */
113
114 },
115 { /* master */
116 {HCI_SUPP_LE_STATES_CONN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_CONN_ADV_MASTER_OFF}, /* conn_adv: 35 */
117 {HCI_SUPP_LE_STATES_INIT_MASTER_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_OFF}, /* init 28 */
118 {HCI_SUPP_LE_STATES_INIT_MASTER_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_OFF}, /* master 28 */
119 {HCI_SUPP_LE_STATES_CONN_ADV_INIT_MASK, HCI_SUPP_LE_STATES_CONN_ADV_INIT_OFF}, /* slave: 32 */
120 {HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_MASTER_OFF}, /* lo duty cycle adv 37 */
121 {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASTER_OFF}, /* hi duty cycle adv 36 */
122 {HCI_SUPP_LE_STATES_NON_CONN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_MASTER_OFF}, /* non connectable adv */
123 {HCI_SUPP_LE_STATES_PASS_SCAN_MASTER_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_MASTER_OFF}, /* passive scan */
124 {HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASTER_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASTER_OFF}, /* active scan */
125 {HCI_SUPP_LE_STATES_SCAN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_MASTER_OFF} /* scanable adv */
126
127 },
128 { /* slave */
129 {HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_OFF}, /* conn_adv: 38,*/
130 {HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_OFF}, /* init 41 */
131 {HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_OFF}, /* master 41 */
132 {HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_OFF}, /* slave: 38,*/
133 {HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_SLAVE_OFF}, /* lo duty cycle adv 40 */
134 {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_SLAVE_OFF}, /* hi duty cycle adv 39 */
135 {HCI_SUPP_LE_STATES_NON_CONN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_SLAVE_OFF}, /* non connectable adv */
136 {HCI_SUPP_LE_STATES_PASS_SCAN_SLAVE_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_SLAVE_OFF}, /* passive scan */
137 {HCI_SUPP_LE_STATES_ACTIVE_SCAN_SLAVE_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_SLAVE_OFF}, /* active scan */
138 {HCI_SUPP_LE_STATES_SCAN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_SLAVE_OFF} /* scanable adv */
139
140 },
141 { /* lo duty cycle adv */
142 {0, 0}, /* conn_adv: 38,*/
143 {HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_INIT_MASK, HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_INIT_OFF} ,/* init 34 */
144 {HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_MASTER_OFF}, /* master 37 */
145 {HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_SLAVE_OFF}, /* slave: 40 */
146 {0, 0}, /* lo duty cycle adv 40 */
147 {0, 0}, /* hi duty cycle adv 39 */
148 {0, 0}, /* non connectable adv */
149 {0, 0}, /* TODO: passive scan, not covered? */
150 {0, 0}, /* TODO: active scan, not covered? */
151 {0, 0} /* scanable adv */
152 },
153 { /* hi duty cycle adv */
154 {0, 0}, /* conn_adv: 38,*/
155 {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_INIT_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_INIT_OFF}, /* init 33 */
156 {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASTER_OFF}, /* master 36 */
157 {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_SLAVE_OFF}, /* slave: 39*/
158 {0, 0}, /* lo duty cycle adv 40 */
159 {0, 0}, /* hi duty cycle adv 39 */
160 {0, 0}, /* non connectable adv */
161 {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_PASS_SCAN_OFF}, /* passive scan */
162 {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_ACTIVE_SCAN_OFF}, /* active scan */
163 {0, 0} /* scanable adv */
164 },
165 { /* non connectable adv */
166 {0, 0}, /* conn_adv: */
167 {HCI_SUPP_LE_STATES_NON_CONN_INIT_MASK, HCI_SUPP_LE_STATES_NON_CONN_INIT_OFF}, /* init */
168 {HCI_SUPP_LE_STATES_NON_CONN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_MASTER_OFF}, /* master */
169 {HCI_SUPP_LE_STATES_NON_CONN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_SLAVE_OFF}, /* slave: */
170 {0, 0}, /* lo duty cycle adv */
171 {0, 0}, /* hi duty cycle adv */
172 {0, 0}, /* non connectable adv */
173 {HCI_SUPP_LE_STATES_NON_CONN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_PASS_SCAN_OFF}, /* passive scan */
174 {HCI_SUPP_LE_STATES_NON_CONN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_ACTIVE_SCAN_OFF}, /* active scan */
175 {0, 0} /* scanable adv */
176 },
177 { /* passive scan */
178 {HCI_SUPP_LE_STATES_CONN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_CONN_ADV_PASS_SCAN_OFF}, /* conn_adv: */
179 {HCI_SUPP_LE_STATES_PASS_SCAN_INIT_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_INIT_OFF}, /* init */
180 {HCI_SUPP_LE_STATES_PASS_SCAN_MASTER_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_MASTER_OFF}, /* master */
181 {HCI_SUPP_LE_STATES_PASS_SCAN_SLAVE_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_SLAVE_OFF}, /* slave: */
182 {0, 0}, /* lo duty cycle adv */
183 {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_PASS_SCAN_OFF}, /* hi duty cycle adv */
184 {HCI_SUPP_LE_STATES_NON_CONN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_PASS_SCAN_OFF}, /* non connectable adv */
185 {0, 0}, /* passive scan */
186 {0, 0}, /* active scan */
187 {HCI_SUPP_LE_STATES_SCAN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_PASS_SCAN_OFF} /* scanable adv */
188 },
189 { /* active scan */
190 {HCI_SUPP_LE_STATES_CONN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_CONN_ADV_ACTIVE_SCAN_OFF}, /* conn_adv: */
191 {HCI_SUPP_LE_STATES_ACTIVE_SCAN_INIT_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_INIT_OFF}, /* init */
192 {HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASTER_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASTER_OFF}, /* master */
193 {HCI_SUPP_LE_STATES_ACTIVE_SCAN_SLAVE_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_SLAVE_OFF}, /* slave: */
194 {0, 0}, /* lo duty cycle adv */
195 {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_ACTIVE_SCAN_OFF}, /* hi duty cycle adv */
196 {HCI_SUPP_LE_STATES_NON_CONN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_ACTIVE_SCAN_OFF}, /* non connectable adv */
197 {0, 0}, /* TODO: passive scan */
198 {0, 0}, /* TODO: active scan */
199 {HCI_SUPP_LE_STATES_SCAN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_ACTIVE_SCAN_OFF} /* scanable adv */
200 },
201 { /* scanable adv */
202 {0, 0}, /* conn_adv: */
203 {HCI_SUPP_LE_STATES_SCAN_ADV_INIT_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_INIT_OFF}, /* init */
204 {HCI_SUPP_LE_STATES_SCAN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_MASTER_OFF}, /* master */
205 {HCI_SUPP_LE_STATES_SCAN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_SLAVE_OFF}, /* slave: */
206 {0, 0}, /* lo duty cycle adv */
207 {0, 0}, /* hi duty cycle adv */
208 {0, 0}, /* non connectable adv */
209 {HCI_SUPP_LE_STATES_SCAN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_PASS_SCAN_OFF}, /* passive scan */
210 {HCI_SUPP_LE_STATES_SCAN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_ACTIVE_SCAN_OFF}, /* active scan */
211 {0, 0} /* scanable adv */
212 }
213
214};
215/* check LE combo state supported */
216#define BTM_LE_STATES_SUPPORTED(x, y, z) ((x)[(z)] & (y))
217
218
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800219/*******************************************************************************
220**
221** Function BTM_BleUpdateAdvWhitelist
222**
223** Description Add or remove device from advertising white list
224**
225** Returns void
226**
227*******************************************************************************/
228BOOLEAN BTM_BleUpdateAdvWhitelist(BOOLEAN add_remove, BD_ADDR remote_bda)
229{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -0800230 UNUSED(add_remove);
231 UNUSED(remote_bda);
232
233 return FALSE;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800234}
The Android Open Source Project5738f832012-12-12 16:00:35 -0800235
236/*******************************************************************************
237**
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800238** Function BTM_BleUpdateAdvFilterPolicy
239**
240** Description This function update the filter policy of advertiser.
241**
242** Parameter adv_policy: advertising filter policy
243**
244** Return void
245*******************************************************************************/
246void BTM_BleUpdateAdvFilterPolicy(tBTM_BLE_AFP adv_policy)
247{
248 tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
249 tBLE_ADDR_TYPE init_addr_type = BLE_ADDR_PUBLIC;
250 BD_ADDR p_addr_ptr= {0};
251 UINT8 adv_mode = p_cb->adv_mode;
252
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -0700253 BTM_TRACE_EVENT ("BTM_BleUpdateAdvFilterPolicy");
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800254
Andre Eisenbach3aa60542013-03-22 18:00:51 -0700255 if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
256 return;
257
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800258 if (p_cb->afp != adv_policy)
259 {
260 p_cb->afp = adv_policy;
261
262 /* if adv active, stop and restart */
263 btm_ble_stop_adv ();
264
265 if (p_cb->connectable_mode & BTM_BLE_CONNECTABLE)
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700266 p_cb->evt_type = btm_set_conn_mode_adv_init_addr(p_cb, p_addr_ptr, &init_addr_type,
267 &p_cb->adv_addr_type);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800268
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700269 btsnd_hcic_ble_write_adv_params ((UINT16)(p_cb->adv_interval_min ? p_cb->adv_interval_min :
270 BTM_BLE_GAP_ADV_SLOW_INT),
271 (UINT16)(p_cb->adv_interval_max ? p_cb->adv_interval_max :
272 BTM_BLE_GAP_ADV_SLOW_INT),
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800273 p_cb->evt_type,
274 p_cb->adv_addr_type,
275 init_addr_type,
276 p_addr_ptr,
277 p_cb->adv_chnl_map,
278 p_cb->afp);
279
280 if (adv_mode == BTM_BLE_ADV_ENABLE)
281 btm_ble_start_adv ();
282
283 }
284}
285/*******************************************************************************
286**
The Android Open Source Project5738f832012-12-12 16:00:35 -0800287** Function BTM_BleObserve
288**
289** Description This procedure keep the device listening for advertising
290** events from a broadcast device.
291**
292** Parameters start: start or stop observe.
293** white_list: use white list in observer mode or not.
294**
295** Returns void
296**
297*******************************************************************************/
298tBTM_STATUS BTM_BleObserve(BOOLEAN start, UINT8 duration,
299 tBTM_INQ_RESULTS_CB *p_results_cb, tBTM_CMPL_CB *p_cmpl_cb)
300{
301 tBTM_BLE_INQ_CB *p_inq = &btm_cb.ble_ctr_cb.inq_var;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700302 tBTM_STATUS status = BTM_WRONG_MODE;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800303
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -0700304 BTM_TRACE_EVENT ("BTM_BleObserve : scan_type:%d",btm_cb.btm_inq_vars.scan_type);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800305
Andre Eisenbach3aa60542013-03-22 18:00:51 -0700306 if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
307 return BTM_ILLEGAL_VALUE;
308
The Android Open Source Project5738f832012-12-12 16:00:35 -0800309 if (start)
310 {
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800311 /* shared inquiry database, do not allow observe if any inquiry is active */
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700312 if (BTM_BLE_IS_OBS_ACTIVE(btm_cb.ble_ctr_cb.scan_activity))
Nitin Arora0830ad42014-02-21 18:20:37 -0800313 {
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -0700314 BTM_TRACE_ERROR("Observe Already Active");
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700315 return status;
Nitin Arora0830ad42014-02-21 18:20:37 -0800316 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800317
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700318 btm_cb.ble_ctr_cb.p_obs_results_cb = p_results_cb;
319 btm_cb.ble_ctr_cb.p_obs_cmpl_cb = p_cmpl_cb;
320 status = BTM_CMD_STARTED;
321
322 /* scan is not started */
323 if (!BTM_BLE_IS_SCAN_ACTIVE(btm_cb.ble_ctr_cb.scan_activity))
324 {
325 p_inq->scan_type = (p_inq->scan_type == BTM_BLE_SCAN_MODE_NONE) ? BTM_BLE_SCAN_MODE_ACTI: p_inq->scan_type;
326 /* allow config scanning type */
327 btsnd_hcic_ble_set_scan_params (p_inq->scan_type,
The Android Open Source Project5738f832012-12-12 16:00:35 -0800328 (UINT16)(!p_inq->scan_interval ? BTM_BLE_GAP_DISC_SCAN_INT : p_inq->scan_interval),
329 (UINT16)(!p_inq->scan_window ? BTM_BLE_GAP_DISC_SCAN_WIN : p_inq->scan_window),
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700330 btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type,
331 BTM_BLE_DEFAULT_SFP); /* assume observe always not using white list */
The Android Open Source Project5738f832012-12-12 16:00:35 -0800332
Adam Hampson845c2602014-05-27 13:14:30 -0700333#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
Wei Wanged534e32014-05-20 06:30:13 +0000334#if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
335 /* enable IRK list */
336 btm_ble_vendor_irk_list_known_dev (TRUE);
337#endif
Adam Hampson845c2602014-05-27 13:14:30 -0700338#endif
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700339 status = btm_ble_start_scan(BTM_BLE_DUPLICATE_DISABLE);
340 }
341 if (status == BTM_CMD_STARTED)
342 {
343 btm_cb.ble_ctr_cb.scan_activity |= BTM_LE_OBSERVE_ACTIVE;
344
345 if (duration != 0)
346 /* start observer timer */
347 btu_start_timer (&btm_cb.ble_ctr_cb.obs_timer_ent, BTU_TTYPE_BLE_OBSERVE, duration);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800348 }
349 }
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700350 else if (BTM_BLE_IS_OBS_ACTIVE(btm_cb.ble_ctr_cb.scan_activity))
The Android Open Source Project5738f832012-12-12 16:00:35 -0800351 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700352 status = BTM_CMD_STARTED;
353 btm_ble_stop_observe();
354 }
355 else
356 {
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -0700357 BTM_TRACE_ERROR("Observe not active");
The Android Open Source Project5738f832012-12-12 16:00:35 -0800358 }
359
360 return status;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700361
The Android Open Source Project5738f832012-12-12 16:00:35 -0800362}
363
364/*******************************************************************************
365**
366** Function BTM_BleBroadcast
367**
368** Description This function is to start or stop broadcasting.
369**
370** Parameters start: start or stop broadcasting.
371**
372** Returns status.
373**
374*******************************************************************************/
375tBTM_STATUS BTM_BleBroadcast(BOOLEAN start)
376{
377 tBTM_STATUS status = BTM_NO_RESOURCES;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800378 tBTM_LE_RANDOM_CB *p_addr_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800379 tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
380 UINT8 evt_type = p_cb->scan_rsp ? BTM_BLE_DISCOVER_EVT: BTM_BLE_NON_CONNECT_EVT;
381
Andre Eisenbach3aa60542013-03-22 18:00:51 -0700382 if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
383 return BTM_ILLEGAL_VALUE;
384
The Android Open Source Project5738f832012-12-12 16:00:35 -0800385#ifdef BTM_BLE_PC_ADV_TEST_MODE
386 if (BTM_BLE_PC_ADV_TEST_MODE)
387 {
388 evt_type = p_cb->scan_rsp ? BTM_BLE_CONNECT_EVT: BTM_BLE_NON_CONNECT_EVT;
389 }
390#endif
391
392 if (start && p_cb->adv_mode == BTM_BLE_ADV_DISABLE)
393 {
394 /* update adv params */
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700395 if (!btsnd_hcic_ble_write_adv_params ((UINT16)(p_cb->adv_interval_min ? p_cb->adv_interval_min :
396 BTM_BLE_GAP_ADV_INT),
397 (UINT16)(p_cb->adv_interval_max ? p_cb->adv_interval_max :
398 BTM_BLE_GAP_ADV_INT),
The Android Open Source Project5738f832012-12-12 16:00:35 -0800399 evt_type,
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800400 p_addr_cb->own_addr_type,
401 p_cb->direct_bda.type,
402 p_cb->direct_bda.bda,
The Android Open Source Project5738f832012-12-12 16:00:35 -0800403 p_cb->adv_chnl_map,
404 p_cb->afp))
405
406 status = BTM_NO_RESOURCES;
407 else
408 p_cb->evt_type = evt_type;
409
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800410 status = btm_ble_start_adv ();
The Android Open Source Project5738f832012-12-12 16:00:35 -0800411 }
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700412 else if (!start)
The Android Open Source Project5738f832012-12-12 16:00:35 -0800413 {
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800414 status = btm_ble_stop_adv();
The Android Open Source Project5738f832012-12-12 16:00:35 -0800415 }
416 else
417 {
418 status = BTM_WRONG_MODE;
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -0700419 BTM_TRACE_ERROR("Can not %s Broadcast, device %s in Broadcast mode",
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700420 (start ? "Start" : "Stop"), (start ? "already" :"not"));
The Android Open Source Project5738f832012-12-12 16:00:35 -0800421 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800422 return status;
423}
424
The Android Open Source Project5738f832012-12-12 16:00:35 -0800425/*******************************************************************************
426**
Wei Wanga6ce7752014-05-20 06:30:32 +0000427** Function btm_vsc_brcm_features_complete
428**
429** Description Command Complete callback for HCI_BLE_VENDOR_CAP_OCF
430**
431** Returns void
432**
433*******************************************************************************/
434static void btm_ble_vendor_capability_vsc_cmpl_cback (tBTM_VSC_CMPL *p_vcs_cplt_params)
435{
Satya Callojic4e25962014-05-10 23:46:24 -0700436#if BLE_VND_INCLUDED == TRUE
Wei Wanga6ce7752014-05-20 06:30:32 +0000437 UINT8 status = 0xFF, *p;
438 UINT8 rpa_offloading, max_irk_list_sz, filtering_support, max_filter;
439 UINT16 scan_result_storage;
Nitin Arora66988a02014-05-28 18:50:09 -0700440 tBTM_BLE_VENDOR_CB *p_vcb = &btm_ble_vendor_cb;
441 max_irk_list_sz = 0;
Ganesh Ganapathi Batta8d416912014-05-30 16:28:00 -0700442
443 BTM_TRACE_DEBUG("btm_ble_vendor_capability_vsc_cmpl_cback");
444
Wei Wanga6ce7752014-05-20 06:30:32 +0000445 /* Check status of command complete event */
446 if((p_vcs_cplt_params->opcode == HCI_BLE_VENDOR_CAP_OCF)
447 &&(p_vcs_cplt_params->param_len > 0 ))
448 {
449 p = p_vcs_cplt_params->p_param_buf;
450 STREAM_TO_UINT8 (status, p);
451 }
452
453 if(status == HCI_SUCCESS)
454 {
Ganesh Ganapathi Batta8d416912014-05-30 16:28:00 -0700455 STREAM_TO_UINT8 (btm_cb.cmn_ble_vsc_cb.adv_inst_max, p);
456 STREAM_TO_UINT8 (btm_cb.cmn_ble_vsc_cb.rpa_offloading, p);
457 STREAM_TO_UINT16 (btm_cb.cmn_ble_vsc_cb.tot_scan_results_strg, p);
458 STREAM_TO_UINT8 (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz, p);
459 STREAM_TO_UINT8 (btm_cb.cmn_ble_vsc_cb.filter_support, p);
460 STREAM_TO_UINT8 (btm_cb.cmn_ble_vsc_cb.max_filter, p);
Wei Wanga6ce7752014-05-20 06:30:32 +0000461 }
Satya Callojic4e25962014-05-10 23:46:24 -0700462
Nitin Arora66988a02014-05-28 18:50:09 -0700463 p_vcb->irk_avail_size = max_irk_list_sz;
Ganesh Ganapathi Batta8d416912014-05-30 16:28:00 -0700464
465 if (p_ctrl_le_feature_rd_cmpl_cback != NULL)
466 p_ctrl_le_feature_rd_cmpl_cback(status);
Satya Callojic4e25962014-05-10 23:46:24 -0700467
468 BTM_TRACE_DEBUG("btm_ble_vendor_capability_vsc_cmpl_cback: status=%d, max_irk_size=%d",
469 status, btm_ble_vendor_cb.irk_avail_size);
470#else
471 UNUSED(p_vcs_cplt_params);
472#endif
Wei Wanga6ce7752014-05-20 06:30:32 +0000473}
474
475/*******************************************************************************
476**
Ganesh Ganapathi Batta8d416912014-05-30 16:28:00 -0700477** Function BTM_BleGetVendorCapabilities
Wei Wanga6ce7752014-05-20 06:30:32 +0000478**
Ganesh Ganapathi Batta8d416912014-05-30 16:28:00 -0700479** Description This function reads local LE features
Wei Wanga6ce7752014-05-20 06:30:32 +0000480**
Ganesh Ganapathi Batta8d416912014-05-30 16:28:00 -0700481** Parameters p_cmn_vsc_cb : Locala LE capability structure
482**
483** Returns void
Wei Wanga6ce7752014-05-20 06:30:32 +0000484**
485*******************************************************************************/
Ganesh Ganapathi Batta8d416912014-05-30 16:28:00 -0700486BTM_API extern void BTM_BleGetVendorCapabilities(tBTM_BLE_VSC_CB *p_cmn_vsc_cb)
Wei Wanga6ce7752014-05-20 06:30:32 +0000487{
Satya Calloji1a9247a2014-06-05 13:15:15 -0700488 BTM_TRACE_DEBUG("BTM_BleGetVendorCapabilities");
Ganesh Ganapathi Batta8d416912014-05-30 16:28:00 -0700489
490 if(NULL != p_cmn_vsc_cb)
491 {
492 *p_cmn_vsc_cb = btm_cb.cmn_ble_vsc_cb;
493 }
494}
495
496/******************************************************************************
497**
498** Function BTM_BleReadControllerFeatures
499**
500** Description Reads BLE specific controller features
501**
502** Parameters: tBTM_BLE_CTRL_FEATURES_CBACK : Callback to notify when features are read
503**
504** Returns void
505**
506*******************************************************************************/
507BTM_API extern void BTM_BleReadControllerFeatures(tBTM_BLE_CTRL_FEATURES_CBACK *p_vsc_cback)
508{
Satya Callojic4e25962014-05-10 23:46:24 -0700509#if BLE_VND_INCLUDED == TRUE
Ganesh Ganapathi Batta8d416912014-05-30 16:28:00 -0700510 BTM_TRACE_DEBUG("BTM_BleReadControllerFeatures");
511
Nitin Arora66988a02014-05-28 18:50:09 -0700512 memset(&btm_ble_vendor_cb, 0, sizeof(tBTM_BLE_VENDOR_CB));
Ganesh Ganapathi Batta8d416912014-05-30 16:28:00 -0700513
514 p_ctrl_le_feature_rd_cmpl_cback = p_vsc_cback;
Wei Wanga6ce7752014-05-20 06:30:32 +0000515 if ( BTM_VendorSpecificCommand (HCI_BLE_VENDOR_CAP_OCF,
516 0,
517 NULL,
518 btm_ble_vendor_capability_vsc_cmpl_cback)
519 != BTM_CMD_STARTED)
520 {
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -0700521 BTM_TRACE_ERROR("LE Get_Vendor Capabilities Command Failed.");
Wei Wanga6ce7752014-05-20 06:30:32 +0000522 }
Satya Callojic4e25962014-05-10 23:46:24 -0700523#else
524 UNUSED(p_vsc_cback);
525#endif
Wei Wanga6ce7752014-05-20 06:30:32 +0000526 return ;
527}
528
529/*******************************************************************************
530**
The Android Open Source Project5738f832012-12-12 16:00:35 -0800531** Function BTM_RegisterScanReqEvt
532**
533** Description This function is called to register a scan request callback
534** on the advertiser.
535**
536** Parameters p_scan_req_cback: scan request callback. If NULL, remove the
537** registration.
538**
539** Returns void
540**
541*******************************************************************************/
542void BTM_RegisterScanReqEvt(tBTM_BLE_SCAN_REQ_CBACK *p_scan_req_cback)
543{
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800544#ifdef BTM_BLE_PC_ADV_TEST_MODE /* For general stack code (e.g. BTInsight testing), we simply do not define it to exclude or set it to TRUE to include */
545 if (BTM_BLE_PC_ADV_TEST_MODE) /* For stack component, it is always defined and maps to a global variable g_bDraculaAdvertisingMode */
The Android Open Source Project5738f832012-12-12 16:00:35 -0800546 {
547 tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
548 p_cb->p_scan_req_cback = p_scan_req_cback;
549 }
Mike J. Chen5cd8bff2014-01-31 18:16:59 -0800550#else
551 UNUSED(p_scan_req_cback);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800552#endif
553}
The Android Open Source Project5738f832012-12-12 16:00:35 -0800554
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700555#if BLE_PRIVACY_SPT == TRUE
556/*******************************************************************************
557**
558** Function BTM_BleConfigPrivacy
559**
560** Description This function is called to enable or disable the privacy in
561** LE channel of the local device.
562**
563** Parameters enable: TRUE to enable it; FALSE to disable it.
564**
565** Returns void
566**
567*******************************************************************************/
568void BTM_BleConfigPrivacy(BOOLEAN enable)
569{
570 tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
571
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -0700572 BTM_TRACE_EVENT (" BTM_BleConfigPrivacy");
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700573
574 if (p_cb->privacy != enable)
575 {
576 p_cb->privacy = enable;
577
578 if (p_cb->privacy)
579 {
580 /* generate resolvable private address */
Wei Wanga6ce7752014-05-20 06:30:32 +0000581 btm_gen_resolvable_private_addr(NULL);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700582 }
583 else /* if privacy disabled, always use public address */
584 {
585 p_cb->addr_mgnt_cb.own_addr_type = BLE_ADDR_PUBLIC;
586 }
Wei Wanged534e32014-05-20 06:30:13 +0000587 btm_ble_multi_adv_enb_privacy(p_cb->privacy);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700588 }
589}
590
Ganesh Ganapathi Batta8d416912014-05-30 16:28:00 -0700591/*******************************************************************************
592**
Zhihai Xu8b35b3f2014-03-11 15:01:45 -0700593** Function btm_ble_resolve_random_addr_on_adv
594**
595** Description resolve random address complete callback.
596**
597** Returns void
598**
599*******************************************************************************/
600static void btm_ble_resolve_random_addr_on_adv(void * p_rec, void *p)
601{
602 tBTM_SEC_DEV_REC *match_rec = (tBTM_SEC_DEV_REC *) p_rec;
603 UINT8 addr_type = BLE_ADDR_RANDOM;
604 BD_ADDR bda;
605 UINT8 *pp = (UINT8 *)p + 1;
606 UINT8 evt_type;
607
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -0700608 BTM_TRACE_EVENT ("btm_ble_resolve_random_addr_on_adv ");
Zhihai Xu8b35b3f2014-03-11 15:01:45 -0700609
610 STREAM_TO_UINT8 (evt_type, pp);
611 STREAM_TO_UINT8 (addr_type, pp);
612 STREAM_TO_BDADDR (bda, pp);
613
614 if (match_rec)
615 {
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -0700616 BTM_TRACE_ERROR("Random match");
Zhihai Xu8b35b3f2014-03-11 15:01:45 -0700617 match_rec->ble.active_addr_type = BTM_BLE_ADDR_RRA;
618 memcpy(match_rec->ble.cur_rand_addr, bda, BD_ADDR_LEN);
619 memcpy(bda, match_rec->bd_addr, BD_ADDR_LEN);
620 addr_type = match_rec->ble.ble_addr_type;
621 }
622 else
623 {
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -0700624 BTM_TRACE_ERROR("Random unmatch");
Zhihai Xu8b35b3f2014-03-11 15:01:45 -0700625 }
626
627 btm_ble_process_adv_pkt_cont(bda, addr_type, evt_type, pp);
628
629 return;
630}
631#endif
632
The Android Open Source Project5738f832012-12-12 16:00:35 -0800633/*******************************************************************************
634**
Sharvil Nanavati26112632014-06-07 00:56:14 -0700635** Function BTM_BleLocalPrivacyEnabled
636**
637** Description Checks if local device supports private address
638**
639** Returns Return TRUE if local privacy is enabled else FALSE
640**
641*******************************************************************************/
642BOOLEAN BTM_BleLocalPrivacyEnabled()
643{
644#if BLE_PRIVACY_SPT == TRUE
645 return btm_cb.ble_ctr_cb.privacy;
646#else
647 return false;
648#endif
649}
650
651/*******************************************************************************
652**
The Android Open Source Project5738f832012-12-12 16:00:35 -0800653** Function BTM_BleSetBgConnType
654**
655** Description This function is called to set BLE connectable mode for a
656** peripheral device.
657**
658** Parameters bg_conn_type: it can be auto connection, or selective connection.
659** p_select_cback: callback function when selective connection procedure
660** is being used.
661**
662** Returns void
663**
664*******************************************************************************/
665BOOLEAN BTM_BleSetBgConnType(tBTM_BLE_CONN_TYPE bg_conn_type,
666 tBTM_BLE_SEL_CBACK *p_select_cback)
667{
668 BOOLEAN started = TRUE;
669
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -0700670 BTM_TRACE_EVENT ("BTM_BleSetBgConnType ");
Andre Eisenbach3aa60542013-03-22 18:00:51 -0700671 if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
672 return FALSE;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800673
674 if (btm_cb.ble_ctr_cb.bg_conn_type != bg_conn_type)
675 {
676 switch (bg_conn_type)
677 {
678 case BTM_BLE_CONN_AUTO:
679 btm_ble_start_auto_conn(TRUE);
680 break;
681
682 case BTM_BLE_CONN_SELECTIVE:
683 if (btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_AUTO)
684 {
685 btm_ble_start_auto_conn(FALSE);
686 }
687 started = btm_ble_start_select_conn(TRUE, p_select_cback);
688 break;
689
690 case BTM_BLE_CONN_NONE:
691 if (btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_AUTO)
692 {
693 btm_ble_start_auto_conn(FALSE);
694 }
695 else if (btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_SELECTIVE)
696 {
697 btm_ble_start_select_conn(FALSE, NULL);
698 }
699 started = TRUE;
700 break;
701
702 default:
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -0700703 BTM_TRACE_ERROR("invalid bg connection type : %d ", bg_conn_type);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800704 started = FALSE;
705 break;
706 }
707
708 if (started)
709 btm_cb.ble_ctr_cb.bg_conn_type = bg_conn_type;
710 }
711 return started;
712}
713
714/*******************************************************************************
715**
Nitin Arora021e17a2014-01-29 19:18:39 -0800716** Function BTM_BleClearBgConnDev
717**
718** Description This function is called to clear the whitelist,
719** end any pending whitelist connections,
720* and reset the local bg device list.
721**
722** Parameters void
723**
724** Returns void
725**
726*******************************************************************************/
727void BTM_BleClearBgConnDev(void)
728{
729 btm_ble_start_auto_conn(FALSE);
730 btm_ble_clear_white_list();
731 gatt_reset_bgdev_list();
732}
733
734/*******************************************************************************
735**
The Android Open Source Project5738f832012-12-12 16:00:35 -0800736** Function BTM_BleUpdateBgConnDev
737**
738** Description This function is called to add or remove a device into/from
739** background connection procedure. The background connection
740* procedure is decided by the background connection type, it can be
741* auto connection, or selective connection.
742**
743** Parameters add_remove: TRUE to add; FALSE to remove.
744** remote_bda: device address to add/remove.
745**
746** Returns void
747**
748*******************************************************************************/
749BOOLEAN BTM_BleUpdateBgConnDev(BOOLEAN add_remove, BD_ADDR remote_bda)
750{
The Android Open Source Project5738f832012-12-12 16:00:35 -0800751 BOOLEAN ret = TRUE;
Andre Eisenbach6975b4d2013-08-05 16:55:38 -0700752 UINT8 dev_wl_type = 0;
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -0700753 BTM_TRACE_EVENT (" BTM_BleUpdateBgConnDev");
Andre Eisenbach946c6812013-04-04 14:53:04 -0700754
755 /* update white list */
756 ret = btm_update_bg_conn_list(add_remove, remote_bda, &dev_wl_type);
757
758 btm_update_dev_to_white_list(add_remove, remote_bda, dev_wl_type);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800759
The Android Open Source Project5738f832012-12-12 16:00:35 -0800760 return ret;
761}
762
763/*******************************************************************************
764**
765** Function BTM_BleSetConnMode
766**
767** Description This function is called to set BLE connectable mode for a
768** peripheral device.
769**
770** Parameters directed: is directed connectable mode, or non-directed.
771** p_dir_bda: connectable direct initiator's LE device address
772**
773** Returns void
774**
775*******************************************************************************/
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800776tBTM_STATUS BTM_BleSetConnMode(BOOLEAN is_directed)
The Android Open Source Project5738f832012-12-12 16:00:35 -0800777{
778 tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800779
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -0700780 BTM_TRACE_EVENT ("BTM_BleSetConnMode is_directed = %d ", is_directed);
Andre Eisenbach3aa60542013-03-22 18:00:51 -0700781 if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
782 return BTM_ILLEGAL_VALUE;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800783
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800784 p_cb->directed_conn = is_directed;
785 return btm_ble_set_connectability( p_cb->connectable_mode);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800786
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800787}
788
789/*******************************************************************************
790**
791** Function btm_set_conn_mode_adv_init_addr
792**
793** Description set initator address type and local address type based on adv
794** mode.
795**
796**
797*******************************************************************************/
798static UINT8 btm_set_conn_mode_adv_init_addr(tBTM_BLE_INQ_CB *p_cb,
799 BD_ADDR_PTR p_addr_ptr,
800 tBLE_ADDR_TYPE *p_init_addr_type,
801 tBLE_ADDR_TYPE *p_own_addr_type)
802{
803 UINT8 evt_type;
804
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700805 UNUSED(p_own_addr_type);
806
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800807 if ( p_cb->directed_conn)
The Android Open Source Project5738f832012-12-12 16:00:35 -0800808 {
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800809 /* direct adv mode does not have privacy if privacy
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700810 is not enabled or no reconn addr config */
811
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800812 *p_init_addr_type = p_cb->direct_bda.type;
813 memcpy(p_addr_ptr, p_cb->direct_bda.bda, BD_ADDR_LEN);
814 evt_type = BTM_BLE_CONNECT_DIR_EVT;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800815 }
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800816 else /* undirect adv mode */
The Android Open Source Project5738f832012-12-12 16:00:35 -0800817 {
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800818 evt_type = BTM_BLE_CONNECT_EVT;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700819
820#if BLE_PRIVACY_SPT == TRUE
821 /* may need to reset random address if privacy is enabled */
822 if (btm_cb.ble_ctr_cb.privacy && /* own addr_type is random */
823 !BTM_BLE_IS_RESOLVE_BDA(btm_cb.ble_ctr_cb.addr_mgnt_cb.private_addr))
824 {
825 /* need to generate RRA and update random addresss in controller */
Wei Wanga6ce7752014-05-20 06:30:32 +0000826 btm_gen_resolvable_private_addr((void *)btm_gen_resolve_paddr_low);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700827 }
828#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -0800829 }
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800830
831 return evt_type;
832
The Android Open Source Project5738f832012-12-12 16:00:35 -0800833}
834
835/*******************************************************************************
836**
837** Function BTM_BleSetAdvParams
838**
839** Description This function is called to set advertising parameters.
840**
841** Parameters adv_int_min: minimum advertising interval
842** adv_int_max: maximum advertising interval
843** p_dir_bda: connectable direct initiator's LE device address
844** chnl_map: advertising channel map.
845**
846** Returns void
847**
848*******************************************************************************/
849tBTM_STATUS BTM_BleSetAdvParams(UINT16 adv_int_min, UINT16 adv_int_max,
850 tBLE_BD_ADDR *p_dir_bda,
851 tBTM_BLE_ADV_CHNL_MAP chnl_map)
852{
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800853 tBTM_LE_RANDOM_CB *p_addr_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800854 tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
855 tBTM_STATUS status = BTM_SUCCESS;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800856 BD_ADDR p_addr_ptr = {0};
857 tBLE_ADDR_TYPE init_addr_type = BLE_ADDR_PUBLIC;
858 tBLE_ADDR_TYPE own_addr_type = p_addr_cb->own_addr_type;
859 UINT8 adv_mode = p_cb->adv_mode;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800860
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -0700861 BTM_TRACE_EVENT ("BTM_BleSetAdvParams");
The Android Open Source Project5738f832012-12-12 16:00:35 -0800862
Andre Eisenbach3aa60542013-03-22 18:00:51 -0700863 if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
864 return BTM_ILLEGAL_VALUE;
865
The Android Open Source Project5738f832012-12-12 16:00:35 -0800866 if (!BTM_BLE_VALID_PRAM(adv_int_min, BTM_BLE_ADV_INT_MIN, BTM_BLE_ADV_INT_MAX) ||
867 !BTM_BLE_VALID_PRAM(adv_int_max, BTM_BLE_ADV_INT_MIN, BTM_BLE_ADV_INT_MAX))
868 {
869 return BTM_ILLEGAL_VALUE;
870 }
871
872 p_cb->adv_interval_min = adv_int_min;
873 p_cb->adv_interval_max = adv_int_max;
874 p_cb->adv_chnl_map = chnl_map;
875
876 if (p_dir_bda)
877 {
878 memcpy(&p_cb->direct_bda, p_dir_bda, sizeof(tBLE_BD_ADDR));
879 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800880
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -0700881 BTM_TRACE_EVENT ("update params for an active adv");
The Android Open Source Project5738f832012-12-12 16:00:35 -0800882
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800883 btm_ble_stop_adv();
The Android Open Source Project5738f832012-12-12 16:00:35 -0800884
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800885 if (p_cb->connectable_mode & BTM_BLE_CONNECTABLE)
886 p_cb->evt_type = btm_set_conn_mode_adv_init_addr(p_cb, p_addr_ptr, &init_addr_type, &own_addr_type);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800887
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800888 /* update adv params */
889 btsnd_hcic_ble_write_adv_params (p_cb->adv_interval_min,
890 p_cb->adv_interval_max,
891 p_cb->evt_type,
892 own_addr_type,
893 init_addr_type,
894 p_addr_ptr,
895 p_cb->adv_chnl_map,
896 p_cb->afp);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800897
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800898 if (adv_mode == BTM_BLE_ADV_ENABLE)
899 btm_ble_start_adv();
The Android Open Source Project5738f832012-12-12 16:00:35 -0800900
901 return status;
902}
903
904/*******************************************************************************
905**
906** Function BTM_BleReadAdvParams
907**
908** Description This function is called to set advertising parameters.
909**
910** Parameters adv_int_min: minimum advertising interval
911** adv_int_max: maximum advertising interval
912** p_dir_bda: connectable direct initiator's LE device address
913** chnl_map: advertising channel map.
914**
915** Returns void
916**
917*******************************************************************************/
918void BTM_BleReadAdvParams (UINT16 *adv_int_min, UINT16 *adv_int_max,
919 tBLE_BD_ADDR *p_dir_bda, tBTM_BLE_ADV_CHNL_MAP *p_chnl_map)
920{
921 tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
922
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -0700923 BTM_TRACE_EVENT ("BTM_BleReadAdvParams ");
Andre Eisenbach3aa60542013-03-22 18:00:51 -0700924 if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
925 return ;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800926
927 *adv_int_min = p_cb->adv_interval_min;
928 *adv_int_max = p_cb->adv_interval_max;
929 *p_chnl_map = p_cb->adv_chnl_map;
930
931 if (p_dir_bda != NULL)
932 {
933 memcpy(p_dir_bda, &p_cb->direct_bda, sizeof(tBLE_BD_ADDR));
934 }
935}
936
The Android Open Source Project5738f832012-12-12 16:00:35 -0800937/*******************************************************************************
938**
939** Function BTM_BleSetScanParams
940**
941** Description This function is called to set Scan parameters.
942**
943** Parameters adv_int_min: minimum advertising interval
944** adv_int_max: maximum advertising interval
945** p_dir_bda: connectable direct initiator's LE device address
946** chnl_map: advertising channel map.
947** scan_type: active scan or passive scan
948**
949** Returns void
950**
951*******************************************************************************/
952void BTM_BleSetScanParams(UINT16 scan_interval, UINT16 scan_window, tBTM_BLE_SCAN_MODE scan_mode)
953{
954 tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
955
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -0700956 BTM_TRACE_EVENT (" BTM_BleSetScanParams");
Andre Eisenbach3aa60542013-03-22 18:00:51 -0700957 if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
958 return ;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800959
960 if (BTM_BLE_VALID_PRAM(scan_interval, BTM_BLE_SCAN_INT_MIN, BTM_BLE_SCAN_INT_MAX) &&
961 BTM_BLE_VALID_PRAM(scan_window, BTM_BLE_SCAN_WIN_MIN, BTM_BLE_SCAN_WIN_MAX) &&
962 (scan_mode == BTM_BLE_SCAN_MODE_ACTI || scan_mode == BTM_BLE_SCAN_MODE_PASS))
963 {
964 p_cb->scan_type = scan_mode;
965
966 if (BTM_BLE_CONN_PARAM_UNDEF != scan_interval)
967 p_cb->scan_interval = scan_interval;
968
969 if (BTM_BLE_CONN_PARAM_UNDEF != scan_window)
970 p_cb->scan_window = scan_window;
971 }
972 else
973 {
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -0700974 BTM_TRACE_ERROR("Illegal params: scan_interval = %d scan_window = %d",
The Android Open Source Project5738f832012-12-12 16:00:35 -0800975 scan_interval, scan_window);
976 }
977
978}
979
980/*******************************************************************************
981**
982** Function BTM_BleWriteScanRsp
983**
984** Description This function is called to write LE scan response.
985**
986** Parameters: p_scan_rsp: scan response information.
987**
988** Returns void
989**
990*******************************************************************************/
991tBTM_STATUS BTM_BleWriteScanRsp(tBTM_BLE_AD_MASK data_mask, tBTM_BLE_ADV_DATA *p_data)
992{
993 tBTM_STATUS status = BTM_NO_RESOURCES;
994 UINT8 rsp_data[BTM_BLE_AD_DATA_LEN],
995 *p = rsp_data;
996
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -0700997 BTM_TRACE_EVENT (" BTM_BleWriteScanRsp");
Andre Eisenbach3aa60542013-03-22 18:00:51 -0700998
999 if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
1000 return BTM_ILLEGAL_VALUE;
1001
The Android Open Source Project5738f832012-12-12 16:00:35 -08001002 memset(rsp_data, 0, BTM_BLE_AD_DATA_LEN);
1003 btm_ble_build_adv_data(&data_mask, &p, p_data);
1004
1005 if (btsnd_hcic_ble_set_scan_rsp_data((UINT8)(p - rsp_data), rsp_data))
1006 {
1007 status = BTM_SUCCESS;
1008
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001009 if (data_mask != 0)
The Android Open Source Project5738f832012-12-12 16:00:35 -08001010 btm_cb.ble_ctr_cb.inq_var.scan_rsp = TRUE;
1011 else
1012 btm_cb.ble_ctr_cb.inq_var.scan_rsp = FALSE;
1013 }
1014 else
1015 status = BTM_ILLEGAL_VALUE;
1016
1017 return status;
1018}
1019
1020/*******************************************************************************
1021**
1022** Function BTM_BleWriteAdvData
1023**
1024** Description This function is called to write advertising data.
1025**
1026** Parameters: None.
1027**
1028** Returns void
1029**
1030*******************************************************************************/
1031tBTM_STATUS BTM_BleWriteAdvData(tBTM_BLE_AD_MASK data_mask, tBTM_BLE_ADV_DATA *p_data)
1032{
1033 tBTM_BLE_LOCAL_ADV_DATA *p_cb_data = &btm_cb.ble_ctr_cb.inq_var.adv_data;
1034 UINT8 *p;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001035 tBTM_BLE_AD_MASK mask = data_mask;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001036
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07001037 BTM_TRACE_EVENT ("BTM_BleWriteAdvData ");
Andre Eisenbach3aa60542013-03-22 18:00:51 -07001038
1039 if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
1040 return BTM_ILLEGAL_VALUE;
1041
The Android Open Source Project5738f832012-12-12 16:00:35 -08001042 memset(p_cb_data, 0, sizeof(tBTM_BLE_LOCAL_ADV_DATA));
1043 p = p_cb_data->ad_data;
1044 p_cb_data->data_mask = data_mask;
1045
The Android Open Source Project5738f832012-12-12 16:00:35 -08001046 p_cb_data->p_flags = btm_ble_build_adv_data(&mask, &p, p_data);
1047
1048 p_cb_data->p_pad = p;
1049
Wei Wanga6ce7752014-05-20 06:30:32 +00001050 if (mask != 0)
The Android Open Source Project5738f832012-12-12 16:00:35 -08001051 {
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07001052 BTM_TRACE_ERROR("Partial data write into ADV");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001053 }
1054
1055 p_cb_data->data_mask &= ~mask;
1056
1057 if (btsnd_hcic_ble_set_adv_data((UINT8)(p_cb_data->p_pad - p_cb_data->ad_data),
1058 p_cb_data->ad_data))
1059 return BTM_SUCCESS;
1060 else
1061 return BTM_NO_RESOURCES;
1062
1063}
1064
1065/*******************************************************************************
1066**
1067** Function BTM_CheckAdvData
1068**
1069** Description This function is called to get ADV data for a specific type.
1070**
1071** Parameters p_adv - pointer of ADV data
1072** type - finding ADV data type
1073** p_length - return the length of ADV data not including type
1074**
1075** Returns pointer of ADV data
1076**
1077*******************************************************************************/
1078UINT8 *BTM_CheckAdvData( UINT8 *p_adv, UINT8 type, UINT8 *p_length)
1079{
1080 UINT8 *p = p_adv;
1081 UINT8 length;
1082 UINT8 adv_type;
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07001083 BTM_TRACE_API("BTM_CheckAdvData type=0x%02X", type);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001084
1085 STREAM_TO_UINT8(length, p);
1086
1087 while ( length && (p - p_adv <= BTM_BLE_CACHE_ADV_DATA_MAX))
1088 {
1089 STREAM_TO_UINT8(adv_type, p);
1090
1091 if ( adv_type == type )
1092 {
1093 /* length doesn't include itself */
1094 *p_length = length - 1; /* minus the length of type */
1095 return p;
1096 }
1097 p += length - 1; /* skip the length of data */
1098 STREAM_TO_UINT8(length, p);
1099 }
1100
1101 *p_length = 0;
1102 return NULL;
1103}
1104
1105/*******************************************************************************
1106**
1107** Function btm_ble_build_adv_data
1108**
1109** Description This function is called build the adv data and rsp data.
1110*******************************************************************************/
Wei Wanga6ce7752014-05-20 06:30:32 +00001111UINT8 *btm_ble_build_adv_data(tBTM_BLE_AD_MASK *p_data_mask, UINT8 **p_dst,
1112 tBTM_BLE_ADV_DATA *p_data)
The Android Open Source Project5738f832012-12-12 16:00:35 -08001113{
Wei Wanga6ce7752014-05-20 06:30:32 +00001114 UINT32 data_mask = *p_data_mask;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001115 UINT8 *p = *p_dst,
1116 *p_flag = NULL;
1117 UINT16 len = BTM_BLE_AD_DATA_LEN, cp_len = 0;
1118 UINT8 i = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001119 tBTM_BLE_PROP_ELEM *p_elem;
1120
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07001121 BTM_TRACE_EVENT (" btm_ble_build_adv_data");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001122
1123 /* build the adv data structure and build the data string */
1124 if (data_mask)
1125 {
1126 /* flags */
1127 if (data_mask & BTM_BLE_AD_BIT_FLAGS)
1128 {
Wei Wanga6ce7752014-05-20 06:30:32 +00001129 *p++ = MIN_ADV_LENGTH;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001130 *p++ = BTM_BLE_AD_TYPE_FLAG;
1131 p_flag = p;
1132 if (p_data)
1133 *p++ = p_data->flag;
1134 else
1135 *p++ = 0;
1136
1137 len -= 3;
1138
1139 data_mask &= ~BTM_BLE_AD_BIT_FLAGS;
1140 }
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001141 /* appearance data */
1142 if (len > 3 && data_mask & BTM_BLE_AD_BIT_APPEARANCE)
1143 {
1144 *p++ = 3; /* length */
1145 *p++ = BTM_BLE_AD_TYPE_APPEARANCE;
1146 UINT16_TO_STREAM(p, p_data->appearance);
1147 len -= 4;
1148
1149 data_mask &= ~BTM_BLE_AD_BIT_APPEARANCE;
1150 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001151 /* device name */
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001152#if BTM_MAX_LOC_BD_NAME_LEN > 0
Wei Wanga6ce7752014-05-20 06:30:32 +00001153 if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_DEV_NAME)
The Android Open Source Project5738f832012-12-12 16:00:35 -08001154 {
Wei Wanga6ce7752014-05-20 06:30:32 +00001155 if (strlen(btm_cb.cfg.bd_name) > (UINT16)(len - MIN_ADV_LENGTH))
The Android Open Source Project5738f832012-12-12 16:00:35 -08001156 {
Wei Wanga6ce7752014-05-20 06:30:32 +00001157 *p++ = len - MIN_ADV_LENGTH + 1;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001158 *p++ = BTM_BLE_AD_TYPE_NAME_SHORT;
Wei Wanga6ce7752014-05-20 06:30:32 +00001159 ARRAY_TO_STREAM(p, btm_cb.cfg.bd_name, len - MIN_ADV_LENGTH);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001160 }
1161 else
1162 {
1163 cp_len = (UINT16)strlen(btm_cb.cfg.bd_name);
1164 *p++ = cp_len + 1;
1165 *p++ = BTM_BLE_AD_TYPE_NAME_CMPL;
1166 ARRAY_TO_STREAM(p, btm_cb.cfg.bd_name, cp_len);
1167 }
Wei Wanga6ce7752014-05-20 06:30:32 +00001168 len -= (cp_len + MIN_ADV_LENGTH);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001169 data_mask &= ~BTM_BLE_AD_BIT_DEV_NAME;
1170 }
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001171#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -08001172 /* manufacturer data */
Wei Wanga6ce7752014-05-20 06:30:32 +00001173 if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_MANU &&
1174 p_data && p_data->p_manu &&
1175 p_data->p_manu->len != 0 && p_data->p_manu->p_val)
The Android Open Source Project5738f832012-12-12 16:00:35 -08001176 {
Wei Wanga6ce7752014-05-20 06:30:32 +00001177 if (p_data->p_manu->len > (len - MIN_ADV_LENGTH))
1178 cp_len = len - MIN_ADV_LENGTH;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001179 else
Wei Wanga6ce7752014-05-20 06:30:32 +00001180 cp_len = p_data->p_manu->len;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001181
1182 *p++ = cp_len + 1;
1183 *p++ = BTM_BLE_AD_TYPE_MANU;
Wei Wanga6ce7752014-05-20 06:30:32 +00001184 ARRAY_TO_STREAM(p, p_data->p_manu->p_val, cp_len);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001185
Wei Wanga6ce7752014-05-20 06:30:32 +00001186 len -= (cp_len + MIN_ADV_LENGTH);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001187 data_mask &= ~BTM_BLE_AD_BIT_MANU;
1188 }
1189 /* TX power */
Wei Wanga6ce7752014-05-20 06:30:32 +00001190 if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_TX_PWR)
The Android Open Source Project5738f832012-12-12 16:00:35 -08001191 {
Wei Wanga6ce7752014-05-20 06:30:32 +00001192 *p++ = MIN_ADV_LENGTH;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001193 *p++ = BTM_BLE_AD_TYPE_TX_PWR;
Wei Wanga6ce7752014-05-20 06:30:32 +00001194 *p++ = p_data->tx_power;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001195 len -= 3;
1196
1197 data_mask &= ~BTM_BLE_AD_BIT_TX_PWR;
1198 }
Wei Wanga6ce7752014-05-20 06:30:32 +00001199 /* 16 bits services */
1200 if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_SERVICE &&
1201 p_data && p_data->p_services &&
1202 p_data->p_services->num_service != 0 &&
1203 p_data->p_services->p_uuid)
The Android Open Source Project5738f832012-12-12 16:00:35 -08001204 {
Wei Wanga6ce7752014-05-20 06:30:32 +00001205 if (p_data->p_services->num_service * LEN_UUID_16 > (len - MIN_ADV_LENGTH))
The Android Open Source Project5738f832012-12-12 16:00:35 -08001206 {
Wei Wanga6ce7752014-05-20 06:30:32 +00001207 cp_len = (len - MIN_ADV_LENGTH)/LEN_UUID_16;
1208 *p ++ = 1 + cp_len * LEN_UUID_16;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001209 *p++ = BTM_BLE_AD_TYPE_16SRV_PART;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001210 }
1211 else
1212 {
Wei Wanga6ce7752014-05-20 06:30:32 +00001213 cp_len = p_data->p_services->num_service;
1214 *p++ = 1 + cp_len * LEN_UUID_16;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001215 *p++ = BTM_BLE_AD_TYPE_16SRV_CMPL;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001216 }
1217 for (i = 0; i < cp_len; i ++)
1218 {
Wei Wanga6ce7752014-05-20 06:30:32 +00001219 UINT16_TO_STREAM(p, *(p_data->p_services->p_uuid + i));
The Android Open Source Project5738f832012-12-12 16:00:35 -08001220 }
1221
Wei Wanga6ce7752014-05-20 06:30:32 +00001222 len -= (cp_len * MIN_ADV_LENGTH + MIN_ADV_LENGTH);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001223 data_mask &= ~BTM_BLE_AD_BIT_SERVICE;
1224 }
Wei Wanga6ce7752014-05-20 06:30:32 +00001225 /* 32 bits service uuid */
1226 if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_SERVICE_32 &&
1227 p_data && p_data->p_service_32b &&
1228 p_data->p_service_32b->num_service != 0 &&
1229 p_data->p_service_32b->p_uuid)
1230 {
1231 if ((p_data->p_service_32b->num_service * LEN_UUID_32) > (len - MIN_ADV_LENGTH))
1232 {
1233 cp_len = (len - MIN_ADV_LENGTH)/LEN_UUID_32;
1234 *p ++ = 1 + cp_len * LEN_UUID_32;
1235 *p++ = BTM_BLE_AD_TYPE_32SRV_PART;
1236 }
1237 else
1238 {
1239 cp_len = p_data->p_service_32b->num_service;
1240 *p++ = 1 + cp_len * LEN_UUID_32;
1241 *p++ = BTM_BLE_AD_TYPE_32SRV_CMPL;
1242 }
1243 for (i = 0; i < cp_len; i ++)
1244 {
1245 UINT32_TO_STREAM(p, *(p_data->p_service_32b->p_uuid + i));
1246 }
1247
1248 len -= (cp_len * LEN_UUID_32 + MIN_ADV_LENGTH);
1249 data_mask &= ~BTM_BLE_AD_BIT_SERVICE_32;
1250 }
1251 /* 128 bits services */
1252 if (len >= (MAX_UUID_SIZE + 2) && data_mask & BTM_BLE_AD_BIT_SERVICE_128 &&
1253 p_data && p_data->p_services_128b)
1254 {
1255 *p ++ = 1 + MAX_UUID_SIZE;
1256 if (!p_data->p_services_128b->list_cmpl)
1257 *p++ = BTM_BLE_AD_TYPE_128SRV_PART;
1258 else
1259 *p++ = BTM_BLE_AD_TYPE_128SRV_CMPL;
1260
1261 ARRAY_TO_STREAM(p, p_data->p_services_128b->uuid128, MAX_UUID_SIZE);
1262
1263 len -= (MAX_UUID_SIZE + MIN_ADV_LENGTH);
1264 data_mask &= ~BTM_BLE_AD_BIT_SERVICE_128;
1265 }
1266 /* 32 bits Service Solicitation UUIDs */
1267 if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_SERVICE_32SOL &&
1268 p_data && p_data->p_sol_service_32b &&
1269 p_data->p_sol_service_32b->num_service != 0 &&
1270 p_data->p_sol_service_32b->p_uuid)
1271 {
1272 if ((p_data->p_sol_service_32b->num_service * LEN_UUID_32) > (len - MIN_ADV_LENGTH))
1273 {
1274 cp_len = (len - MIN_ADV_LENGTH)/LEN_UUID_32;
1275 *p ++ = 1 + cp_len * LEN_UUID_32;
1276 }
1277 else
1278 {
1279 cp_len = p_data->p_sol_service_32b->num_service;
1280 *p++ = 1 + cp_len * LEN_UUID_32;
1281 }
1282
1283 *p++ = BTM_BLE_AD_TYPE_32SOL_SRV_UUID;
1284 for (i = 0; i < cp_len; i ++)
1285 {
1286 UINT32_TO_STREAM(p, *(p_data->p_sol_service_32b->p_uuid + i));
1287 }
1288
1289 len -= (cp_len * LEN_UUID_32 + MIN_ADV_LENGTH);
1290 data_mask &= ~BTM_BLE_AD_BIT_SERVICE_32SOL;
1291 }
1292 /* 128 bits Solicitation services UUID */
1293 if (len >= (MAX_UUID_SIZE + MIN_ADV_LENGTH) && data_mask & BTM_BLE_AD_BIT_SERVICE_128SOL &&
1294 p_data && p_data->p_sol_service_128b)
1295 {
1296 *p ++ = 1 + MAX_UUID_SIZE;
1297 *p++ = BTM_BLE_AD_TYPE_128SOL_SRV_UUID;
1298 ARRAY_TO_STREAM(p, p_data->p_sol_service_128b->uuid128, MAX_UUID_SIZE);
1299 len -= (MAX_UUID_SIZE + MIN_ADV_LENGTH);
1300 data_mask &= ~BTM_BLE_AD_BIT_SERVICE_128SOL;
1301 }
1302 /* 16bits/32bits/128bits Service Data */
1303 if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_SERVICE_DATA &&
1304 p_data && p_data->p_service_data->len != 0 && p_data->p_service_data->p_val)
1305 {
1306 if (len > (p_data->p_service_data->service_uuid.len + MIN_ADV_LENGTH))
1307 {
1308 if (p_data->p_service_data->len > (len - MIN_ADV_LENGTH))
1309 cp_len = len - MIN_ADV_LENGTH- p_data->p_service_data->service_uuid.len;
1310 else
1311 cp_len = p_data->p_service_data->len;
1312
1313 *p++ = cp_len + 1 + p_data->p_service_data->service_uuid.len;
1314 if (p_data->p_service_data->service_uuid.len == LEN_UUID_16)
1315 {
1316 *p++ = BTM_BLE_AD_TYPE_SERVICE_DATA;
1317 UINT16_TO_STREAM(p, p_data->p_service_data->service_uuid.uu.uuid16);
1318 }
1319 else if (p_data->p_service_data->service_uuid.len == LEN_UUID_32)
1320 {
1321 *p++ = BTM_BLE_AD_TYPE_32SERVICE_DATA;
1322 UINT32_TO_STREAM(p, p_data->p_service_data->service_uuid.uu.uuid32);
1323 }
1324 else
1325 {
1326 *p++ = BTM_BLE_AD_TYPE_128SERVICE_DATA;
1327 ARRAY_TO_STREAM(p, p_data->p_service_data->service_uuid.uu.uuid128,
1328 LEN_UUID_128);
1329 }
1330
1331 ARRAY_TO_STREAM(p, p_data->p_service_data->p_val, cp_len);
1332
1333 len -= (cp_len + MIN_ADV_LENGTH + p_data->p_service_data->service_uuid.len);
1334 data_mask &= ~BTM_BLE_AD_BIT_SERVICE_DATA;
1335 }
1336 else
1337 {
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07001338 BTM_TRACE_WARNING("service data does not fit");
Wei Wanga6ce7752014-05-20 06:30:32 +00001339 }
1340 }
1341
The Android Open Source Project5738f832012-12-12 16:00:35 -08001342 if (len >= 6 && data_mask & BTM_BLE_AD_BIT_INT_RANGE &&
1343 p_data)
1344 {
1345 *p++ = 5;
1346 *p++ = BTM_BLE_AD_TYPE_INT_RANGE;
1347 UINT16_TO_STREAM(p, p_data->int_range.low);
1348 UINT16_TO_STREAM(p, p_data->int_range.hi);
1349 len -= 6;
1350 data_mask &= ~BTM_BLE_AD_BIT_INT_RANGE;
1351 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001352 if (data_mask & BTM_BLE_AD_BIT_PROPRIETARY && p_data && p_data->p_proprietary)
1353 {
1354 for (i = 0; i < p_data->p_proprietary->num_elem ; i ++)
1355 {
1356 p_elem = p_data->p_proprietary->p_elem + i;
1357
Wei Wanga6ce7752014-05-20 06:30:32 +00001358 if (len >= (MIN_ADV_LENGTH + p_elem->len))/* len byte(1) + ATTR type(1) + Uuid len(2)
1359 + value length */
The Android Open Source Project5738f832012-12-12 16:00:35 -08001360 {
1361 *p ++ = p_elem->len + 1; /* Uuid len + value length */
1362 *p ++ = p_elem->adv_type;
1363 ARRAY_TO_STREAM(p, p_elem->p_val, p_elem->len);
1364
Wei Wanga6ce7752014-05-20 06:30:32 +00001365 len -= (MIN_ADV_LENGTH + p_elem->len);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001366 }
1367 else
1368 {
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07001369 BTM_TRACE_WARNING("data exceed max adv packet length");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001370 break;
1371 }
1372 }
1373 data_mask &= ~BTM_BLE_AD_BIT_PROPRIETARY;
1374 }
1375 }
1376
1377 *p_data_mask = data_mask;
1378 *p_dst = p;
1379
1380 return p_flag;
1381}
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001382/*******************************************************************************
1383**
1384** Function btm_ble_select_adv_interval
1385**
1386** Description select adv interval based on device mode
1387**
1388** Returns void
1389**
1390*******************************************************************************/
1391void btm_ble_select_adv_interval(tBTM_BLE_INQ_CB *p_cb, UINT8 evt_type, UINT16 *p_adv_int_min, UINT16 *p_adv_int_max)
1392{
1393 if (p_cb->adv_interval_min && p_cb->adv_interval_max)
1394 {
1395 *p_adv_int_min = p_cb->adv_interval_min;
1396 *p_adv_int_max = p_cb->adv_interval_max;
1397 }
1398 else
1399 {
1400 switch (evt_type)
1401 {
1402 case BTM_BLE_CONNECT_EVT:
1403 *p_adv_int_min = *p_adv_int_max = BTM_BLE_GAP_ADV_FAST_INT_1;
1404 break;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001405
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001406 case BTM_BLE_NON_CONNECT_EVT:
1407 case BTM_BLE_DISCOVER_EVT:
1408 *p_adv_int_min = *p_adv_int_max = BTM_BLE_GAP_ADV_FAST_INT_2;
1409 break;
1410 /* connectable directed event */
1411 case BTM_BLE_CONNECT_DIR_EVT:
1412 *p_adv_int_min = BTM_BLE_GAP_ADV_DIR_MIN_INT;
1413 *p_adv_int_max = BTM_BLE_GAP_ADV_DIR_MAX_INT;
1414 break;
1415
1416 default:
1417 *p_adv_int_min = *p_adv_int_max = BTM_BLE_GAP_ADV_SLOW_INT;
1418 break;
1419 }
1420 }
1421 return;
1422}
1423/*******************************************************************************
1424**
1425** Function btm_ble_set_adv_flag
1426**
1427** Description Set adv flag in adv data.
1428**
1429** Returns void
1430**
1431*******************************************************************************/
1432void btm_ble_set_adv_flag(UINT16 connect_mode, UINT16 disc_mode)
1433{
1434 UINT8 flag = 0, old_flag = 0;
1435 tBTM_BLE_LOCAL_ADV_DATA *p_adv_data = &btm_cb.ble_ctr_cb.inq_var.adv_data;
1436
1437 if (p_adv_data->p_flags != NULL)
1438 flag = old_flag = *(p_adv_data->p_flags);
1439
1440 /* BR/EDR non-discoverable , non-connectable */
1441 if ((disc_mode & BTM_DISCOVERABLE_MASK) == 0 &&
1442 (connect_mode & BTM_CONNECTABLE_MASK) == 0)
1443 flag |= BTM_BLE_BREDR_NOT_SPT;
1444 else
1445 flag &= ~BTM_BLE_BREDR_NOT_SPT;
1446
1447 /* if local controller support, mark both controller and host support in flag */
1448 if (HCI_SIMUL_LE_BREDR_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0]))
1449 flag |= (BTM_BLE_DMT_CONTROLLER_SPT|BTM_BLE_DMT_HOST_SPT);
1450 else
1451 flag &= ~(BTM_BLE_DMT_CONTROLLER_SPT|BTM_BLE_DMT_HOST_SPT);
1452
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07001453 BTM_TRACE_ERROR("disc_mode %04x", disc_mode);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001454 /* update discoverable flag */
1455 if (disc_mode & BTM_BLE_LIMITED_DISCOVERABLE)
1456 {
1457 flag &= ~BTM_BLE_GEN_DISC_FLAG;
1458 flag |= BTM_BLE_LIMIT_DISC_FLAG ;
1459 }
1460 else if (disc_mode & BTM_BLE_GENERAL_DISCOVERABLE)
1461 {
1462 flag |= BTM_BLE_GEN_DISC_FLAG;
1463 flag &= ~BTM_BLE_LIMIT_DISC_FLAG;
1464 }
1465 else /* remove all discoverable flags */
1466 {
1467 flag &= ~(BTM_BLE_LIMIT_DISC_FLAG|BTM_BLE_GEN_DISC_FLAG);
1468 }
1469
1470 if (flag != old_flag)
1471 {
1472 btm_ble_update_adv_flag(flag);
1473 }
1474}
The Android Open Source Project5738f832012-12-12 16:00:35 -08001475/*******************************************************************************
1476**
1477** Function btm_ble_set_discoverability
1478**
1479** Description This function is called to set BLE discoverable mode.
1480**
Wei Wanga6ce7752014-05-20 06:30:32 +00001481** Parameters: combined_mode: discoverability mode.
The Android Open Source Project5738f832012-12-12 16:00:35 -08001482**
Wei Wanga6ce7752014-05-20 06:30:32 +00001483** Returns BTM_SUCCESS is status set successfully; otherwise failure.
The Android Open Source Project5738f832012-12-12 16:00:35 -08001484**
1485*******************************************************************************/
1486tBTM_STATUS btm_ble_set_discoverability(UINT16 combined_mode)
1487{
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001488 tBTM_LE_RANDOM_CB *p_addr_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001489 tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
1490 UINT16 mode = (combined_mode & BTM_BLE_DISCOVERABLE_MASK);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001491 UINT8 new_mode = BTM_BLE_ADV_ENABLE;
1492 UINT8 evt_type = (p_cb->connectable_mode == BTM_BLE_NON_CONNECTABLE) ? \
1493 ((p_cb->scan_rsp) ? BTM_BLE_DISCOVER_EVT : BTM_BLE_NON_CONNECT_EVT )\
1494 : BTM_BLE_CONNECT_EVT;
1495 tBTM_STATUS status = BTM_SUCCESS;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001496 BD_ADDR p_addr_ptr= {0};
1497 tBLE_ADDR_TYPE init_addr_type = BLE_ADDR_PUBLIC,
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001498 own_addr_type = p_addr_cb->own_addr_type;
1499 UINT16 adv_int_min, adv_int_max;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001500
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07001501 BTM_TRACE_EVENT ("btm_ble_set_discoverability mode=0x%0x combined_mode=0x%x", mode, combined_mode);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001502
1503 /*** Check mode parameter ***/
1504 if (mode > BTM_BLE_MAX_DISCOVERABLE)
1505 return(BTM_ILLEGAL_VALUE);
1506
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001507 btm_ble_set_adv_flag (btm_cb.btm_inq_vars.connectable_mode, combined_mode);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001508
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001509 evt_type = btm_set_conn_mode_adv_init_addr(p_cb, p_addr_ptr, &init_addr_type, &own_addr_type);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001510
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001511 if (p_cb->connectable_mode == BTM_BLE_NON_CONNECTABLE && mode == BTM_BLE_NON_DISCOVERABLE)
1512 new_mode = BTM_BLE_ADV_DISABLE;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001513
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001514 btm_ble_select_adv_interval(p_cb, evt_type, &adv_int_min, &adv_int_max);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001515
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001516 btu_stop_timer(&p_cb->fast_adv_timer);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001517
1518 /* update adv params if start advertising */
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07001519 BTM_TRACE_EVENT ("evt_type=0x%x p-cb->evt_type=0x%x ", evt_type, p_cb->evt_type);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001520
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001521 if (new_mode == BTM_BLE_ADV_ENABLE &&
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001522 (evt_type != p_cb->evt_type ||p_cb->adv_addr_type != own_addr_type || !p_cb->fast_adv_on))
The Android Open Source Project5738f832012-12-12 16:00:35 -08001523 {
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001524 btm_ble_stop_adv();
The Android Open Source Project5738f832012-12-12 16:00:35 -08001525
1526 /* update adv params */
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001527 if (!btsnd_hcic_ble_write_adv_params (adv_int_min,
1528 adv_int_max,
The Android Open Source Project5738f832012-12-12 16:00:35 -08001529 evt_type,
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001530 own_addr_type,
1531 init_addr_type,
1532 p_addr_ptr,
The Android Open Source Project5738f832012-12-12 16:00:35 -08001533 p_cb->adv_chnl_map,
1534 p_cb->afp))
1535
1536 status = BTM_NO_RESOURCES;
1537 else
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001538 {
The Android Open Source Project5738f832012-12-12 16:00:35 -08001539 p_cb->evt_type = evt_type;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001540 p_cb->adv_addr_type = own_addr_type;
1541 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001542
1543 }
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001544
The Android Open Source Project5738f832012-12-12 16:00:35 -08001545 if (status == BTM_SUCCESS && p_cb->adv_mode != new_mode)
1546 {
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001547 if (new_mode == BTM_BLE_ADV_ENABLE)
1548 status = btm_ble_start_adv();
The Android Open Source Project5738f832012-12-12 16:00:35 -08001549 else
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001550 status = btm_ble_stop_adv();
The Android Open Source Project5738f832012-12-12 16:00:35 -08001551 }
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001552 if (p_cb->adv_mode == BTM_BLE_ADV_ENABLE)
1553 {
1554 p_cb->fast_adv_on = TRUE;
1555 /* start initial GAP mode adv timer */
1556 btu_start_timer (&p_cb->fast_adv_timer, BTU_TTYPE_BLE_GAP_FAST_ADV,
1557 BTM_BLE_GAP_FAST_ADV_TOUT);
1558 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001559
1560 /* set up stop advertising timer */
1561 if (status == BTM_SUCCESS && mode == BTM_BLE_LIMITED_DISCOVERABLE)
1562 {
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07001563 BTM_TRACE_EVENT ("start timer for limited disc mode duration=%d (180 secs)", BTM_BLE_GAP_LIM_TOUT);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001564 /* start Tgap(lim_timeout) */
1565 btu_start_timer (&p_cb->inq_timer_ent, BTU_TTYPE_BLE_GAP_LIM_DISC,
1566 BTM_BLE_GAP_LIM_TOUT);
1567 }
1568 return status;
1569}
1570
1571/*******************************************************************************
1572**
1573** Function btm_ble_set_connectability
1574**
1575** Description This function is called to set BLE connectability mode.
1576**
Wei Wanga6ce7752014-05-20 06:30:32 +00001577** Parameters: combined_mode: connectability mode.
The Android Open Source Project5738f832012-12-12 16:00:35 -08001578**
Wei Wanga6ce7752014-05-20 06:30:32 +00001579** Returns BTM_SUCCESS is status set successfully; otherwise failure.
The Android Open Source Project5738f832012-12-12 16:00:35 -08001580**
1581*******************************************************************************/
1582tBTM_STATUS btm_ble_set_connectability(UINT16 combined_mode)
1583{
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001584 tBTM_LE_RANDOM_CB *p_addr_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001585 tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
1586 UINT16 mode = (combined_mode & BTM_BLE_CONNECTABLE_MASK);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001587 UINT8 new_mode = BTM_BLE_ADV_ENABLE;
1588 UINT8 evt_type = (p_cb->scan_rsp) ? BTM_BLE_DISCOVER_EVT: BTM_BLE_NON_CONNECT_EVT;
1589 tBTM_STATUS status = BTM_SUCCESS;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001590 BD_ADDR p_addr_ptr = {0};
1591 tBLE_ADDR_TYPE init_addr_type = BLE_ADDR_PUBLIC,
1592 own_addr_type = p_addr_cb->own_addr_type;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001593 UINT16 adv_int_min, adv_int_max;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001594
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07001595 BTM_TRACE_EVENT ("btm_ble_set_connectability mode=0x%0x combined_mode=0x%x", mode, combined_mode);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001596
The Android Open Source Project5738f832012-12-12 16:00:35 -08001597 /*** Check mode parameter ***/
1598 if (mode > BTM_BLE_MAX_CONNECTABLE)
1599 return(BTM_ILLEGAL_VALUE);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001600
The Android Open Source Project5738f832012-12-12 16:00:35 -08001601 p_cb->connectable_mode = mode;
1602
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001603 btm_ble_set_adv_flag (combined_mode, btm_cb.btm_inq_vars.discoverable_mode);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001604
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001605 evt_type = btm_set_conn_mode_adv_init_addr(p_cb, p_addr_ptr, &init_addr_type, &own_addr_type);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001606
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001607 if (mode == BTM_BLE_NON_CONNECTABLE && p_cb->discoverable_mode == BTM_BLE_NON_DISCOVERABLE)
1608 new_mode = BTM_BLE_ADV_DISABLE;
1609
1610 btm_ble_select_adv_interval(p_cb, evt_type, &adv_int_min, &adv_int_max);
1611
1612 btu_stop_timer(&p_cb->fast_adv_timer);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001613 /* update adv params if needed */
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001614 if ((p_cb->evt_type != evt_type || p_cb->adv_addr_type != p_addr_cb->own_addr_type || !p_cb->fast_adv_on))
The Android Open Source Project5738f832012-12-12 16:00:35 -08001615 {
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001616 btm_ble_stop_adv();
The Android Open Source Project5738f832012-12-12 16:00:35 -08001617
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001618 if (!btsnd_hcic_ble_write_adv_params (adv_int_min,
1619 adv_int_max,
The Android Open Source Project5738f832012-12-12 16:00:35 -08001620 evt_type,
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001621 own_addr_type,
1622 init_addr_type,
1623 p_addr_ptr,
The Android Open Source Project5738f832012-12-12 16:00:35 -08001624 p_cb->adv_chnl_map,
1625 p_cb->afp))
1626 status = BTM_NO_RESOURCES;
1627 else
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001628 {
The Android Open Source Project5738f832012-12-12 16:00:35 -08001629 p_cb->evt_type = evt_type;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001630 p_cb->adv_addr_type = own_addr_type;
1631 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001632 }
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001633
The Android Open Source Project5738f832012-12-12 16:00:35 -08001634 /* update advertising mode */
1635 if (status == BTM_SUCCESS && new_mode != p_cb->adv_mode)
1636 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001637 if (new_mode == BTM_BLE_ADV_ENABLE)
1638 status = btm_ble_start_adv();
1639 else
1640 status = btm_ble_stop_adv();
The Android Open Source Project5738f832012-12-12 16:00:35 -08001641 }
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001642 if (p_cb->adv_mode == BTM_BLE_ADV_ENABLE)
1643 {
1644 p_cb->fast_adv_on = TRUE;
1645 /* start initial GAP mode adv timer */
1646 btu_start_timer (&p_cb->fast_adv_timer, BTU_TTYPE_BLE_GAP_FAST_ADV,
1647 BTM_BLE_GAP_FAST_ADV_TOUT);
1648 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001649 return status;
1650}
1651
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001652
The Android Open Source Project5738f832012-12-12 16:00:35 -08001653/*******************************************************************************
1654**
1655** Function btm_ble_start_inquiry
1656**
1657** Description This function is called to start BLE inquiry procedure.
1658** If the duration is zero, the periodic inquiry mode is cancelled.
1659**
1660** Parameters: mode - GENERAL or LIMITED inquiry
1661** p_inq_params - pointer to the BLE inquiry parameter.
1662** p_results_cb - callback returning pointer to results (tBTM_INQ_RESULTS)
1663** p_cmpl_cb - callback indicating the end of an inquiry
1664**
1665**
1666**
1667** Returns BTM_CMD_STARTED if successfully started
The Android Open Source Project5738f832012-12-12 16:00:35 -08001668** BTM_NO_RESOURCES if could not allocate a message buffer
The Android Open Source Project5738f832012-12-12 16:00:35 -08001669** BTM_BUSY - if an inquiry is already active
The Android Open Source Project5738f832012-12-12 16:00:35 -08001670**
1671*******************************************************************************/
1672tBTM_STATUS btm_ble_start_inquiry (UINT8 mode, UINT8 duration)
1673{
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001674 tBTM_STATUS status = BTM_CMD_STARTED;
1675 tBTM_BLE_CB *p_ble_cb = &btm_cb.ble_ctr_cb;
1676 tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001677
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07001678 BTM_TRACE_DEBUG("btm_ble_start_inquiry: mode = %02x inq_active = 0x%02x", mode, btm_cb.btm_inq_vars.inq_active);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001679
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001680 /* if selective connection is active, or inquiry is already active, reject it */
1681 if (BTM_BLE_IS_INQ_ACTIVE(p_ble_cb->scan_activity) ||
1682 BTM_BLE_IS_SEL_CONN_ACTIVE (p_ble_cb->scan_activity))
The Android Open Source Project5738f832012-12-12 16:00:35 -08001683 {
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07001684 BTM_TRACE_ERROR("LE Inquiry is active, can not start inquiry");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001685 return(BTM_BUSY);
1686 }
1687
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001688 if (!BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity))
The Android Open Source Project5738f832012-12-12 16:00:35 -08001689 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001690 btm_update_scanner_filter_policy(SP_ADV_ALL);
Wei Wanged534e32014-05-20 06:30:13 +00001691
1692#if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
1693#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
1694 /* enable IRK list */
1695 btm_ble_vendor_irk_list_known_dev (TRUE);
1696#endif
1697#endif
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001698 status = btm_ble_start_scan(BTM_BLE_DUPLICATE_DISABLE);
1699 }
1700
1701 if (status == BTM_CMD_STARTED)
1702 {
1703 p_inq->inq_active |= mode;
1704 p_ble_cb->scan_activity |= mode;
1705
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07001706 BTM_TRACE_DEBUG("btm_ble_start_inquiry inq_active = 0x%02x", p_inq->inq_active);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001707
1708 if (duration != 0)
1709 {
1710 /* start inquiry timer */
1711 btu_start_timer (&p_inq->inq_timer_ent, BTU_TTYPE_BLE_INQUIRY, duration);
1712 }
1713 }
1714
1715 return status;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001716
The Android Open Source Project5738f832012-12-12 16:00:35 -08001717}
1718
1719/*******************************************************************************
1720**
1721** Function btm_ble_read_remote_name_cmpl
1722**
1723** Description This function is called when BLE remote name is received.
1724**
1725** Returns void
1726**
1727*******************************************************************************/
1728void btm_ble_read_remote_name_cmpl(BOOLEAN status, BD_ADDR bda, UINT16 length, char *p_name)
1729{
1730 UINT8 hci_status = HCI_SUCCESS;
1731 BD_NAME bd_name;
1732
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001733 memset(bd_name, 0, (BD_NAME_LEN + 1));
Zhihai Xu7f9bcf82014-01-15 15:49:21 -08001734 if (length > BD_NAME_LEN)
1735 {
1736 length = BD_NAME_LEN;
1737 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001738 memcpy((UINT8*)bd_name, p_name, length);
1739
1740 if ((!status) || (length==0))
1741 {
1742 hci_status = HCI_ERR_HOST_TIMEOUT;
1743 }
1744
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001745 btm_process_remote_name(bda, bd_name, length +1, hci_status);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001746 btm_sec_rmt_name_request_complete (bda, (UINT8 *)p_name, hci_status);
1747}
1748
1749/*******************************************************************************
1750**
1751** Function btm_ble_read_remote_name
1752**
1753** Description This function read remote LE device name using GATT read
1754** procedure.
1755**
1756** Parameters: None.
1757**
1758** Returns void
1759**
1760*******************************************************************************/
1761tBTM_STATUS btm_ble_read_remote_name(BD_ADDR remote_bda, tBTM_INQ_INFO *p_cur, tBTM_CMPL_CB *p_cb)
1762{
1763 tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
1764
Andre Eisenbach3aa60542013-03-22 18:00:51 -07001765 if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
1766 return BTM_ERR_PROCESSING;
1767
The Android Open Source Project5738f832012-12-12 16:00:35 -08001768 if (p_cur &&
1769 p_cur->results.ble_evt_type != BTM_BLE_EVT_CONN_ADV &&
1770 p_cur->results.ble_evt_type != BTM_BLE_EVT_CONN_DIR_ADV)
1771 {
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07001772 BTM_TRACE_DEBUG("name request to non-connectable device failed.");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001773 return BTM_ERR_PROCESSING;
1774 }
1775
1776 /* read remote device name using GATT procedure */
1777 if (p_inq->remname_active)
1778 return BTM_BUSY;
1779
1780 if (!GAP_BleReadPeerDevName(remote_bda, btm_ble_read_remote_name_cmpl))
1781 return BTM_BUSY;
1782
1783 p_inq->p_remname_cmpl_cb = p_cb;
1784 p_inq->remname_active = TRUE;
1785
1786 memcpy(p_inq->remname_bda, remote_bda, BD_ADDR_LEN);
1787
1788 btu_start_timer (&p_inq->rmt_name_timer_ent,
1789 BTU_TTYPE_BTM_RMT_NAME,
1790 BTM_EXT_BLE_RMT_NAME_TIMEOUT);
1791
1792 return BTM_CMD_STARTED;
1793}
1794
1795/*******************************************************************************
1796**
1797** Function btm_ble_cancel_remote_name
1798**
1799** Description This function cancel read remote LE device name.
1800**
1801** Parameters: None.
1802**
1803** Returns void
1804**
1805*******************************************************************************/
1806BOOLEAN btm_ble_cancel_remote_name(BD_ADDR remote_bda)
1807{
1808 tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
1809 BOOLEAN status;
1810
1811 status = GAP_BleCancelReadPeerDevName(remote_bda);
1812
1813 p_inq->remname_active = FALSE;
1814 memset(p_inq->remname_bda, 0, BD_ADDR_LEN);
1815 btu_stop_timer(&p_inq->rmt_name_timer_ent);
1816
1817 return status;
1818}
1819
1820/*******************************************************************************
1821**
1822** Function btm_ble_update_adv_flag
1823**
1824** Description This function update the limited discoverable flag in the adv
1825** data.
1826**
1827** Parameters: None.
1828**
1829** Returns void
1830**
1831*******************************************************************************/
1832static void btm_ble_update_adv_flag(UINT8 flag)
1833{
1834 tBTM_BLE_LOCAL_ADV_DATA *p_adv_data = &btm_cb.ble_ctr_cb.inq_var.adv_data;
1835 UINT8 *p;
1836
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07001837 BTM_TRACE_DEBUG ("btm_ble_update_adv_flag new=0x%x", flag);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001838
1839 if (p_adv_data->p_flags != NULL)
1840 {
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07001841 BTM_TRACE_DEBUG ("btm_ble_update_adv_flag old=0x%x", *p_adv_data->p_flags);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001842 *p_adv_data->p_flags = flag;
1843 }
1844 else /* no FLAGS in ADV data*/
1845 {
1846 p = (p_adv_data->p_pad == NULL) ? p_adv_data->ad_data : p_adv_data->p_pad;
1847 /* need 3 bytes space to stuff in the flags, if not */
1848 /* erase all written data, just for flags */
1849 if ((BTM_BLE_AD_DATA_LEN - (p - p_adv_data->ad_data)) < 3)
1850 {
1851 p = p_adv_data->p_pad = p_adv_data->ad_data;
1852 memset(p_adv_data->ad_data, 0, BTM_BLE_AD_DATA_LEN);
1853 }
1854
1855 *p++ = 2;
1856 *p++ = BTM_BLE_AD_TYPE_FLAG;
1857 p_adv_data->p_flags = p;
1858 *p++ = flag;
1859 p_adv_data->p_pad = p;
1860 }
1861
1862 if (btsnd_hcic_ble_set_adv_data((UINT8)(p_adv_data->p_pad - p_adv_data->ad_data),
1863 p_adv_data->ad_data))
1864 p_adv_data->data_mask |= BTM_BLE_AD_BIT_FLAGS;
1865
1866}
1867
1868#if 0
1869/*******************************************************************************
1870**
1871** Function btm_ble_parse_adv_data
1872**
1873** Description This function parse the adv data into a structure.
1874**
1875** Returns pointer to entry, or NULL if not found
1876**
1877*******************************************************************************/
1878static void btm_ble_parse_adv_data(tBTM_INQ_INFO *p_info, UINT8 *p_data,
1879 UINT8 len, tBTM_BLE_INQ_DATA *p_adv_data, UINT8 *p_buf)
1880{
1881 UINT8 *p_cur = p_data;
1882 UINT8 ad_len, ad_type, ad_flag;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001883
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07001884 BTM_TRACE_EVENT (" btm_ble_parse_adv_data");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001885
1886 while (len > 0)
1887 {
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07001888 BTM_TRACE_DEBUG("btm_ble_parse_adv_data: len = %d", len);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001889 if ((ad_len = *p_cur ++) == 0)
1890 break;
1891
1892 ad_type = *p_cur ++;
1893
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07001894 BTM_TRACE_DEBUG(" ad_type = %02x ad_len = %d", ad_type, ad_len);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001895
1896 switch (ad_type)
1897 {
1898 case BTM_BLE_AD_TYPE_NAME_SHORT:
1899
1900 case BTM_BLE_AD_TYPE_NAME_CMPL:
1901 p_adv_data->ad_mask |= BTM_BLE_AD_BIT_DEV_NAME;
1902 if (p_info)
1903 {
1904 p_info->remote_name_type =(ad_type == BTM_BLE_AD_TYPE_NAME_SHORT) ?
1905 BTM_BLE_NAME_SHORT: BTM_BLE_NAME_CMPL;
1906 memcpy(p_info->remote_name, p_cur, ad_len -1);
1907 p_info->remote_name[ad_len] = 0;
1908 p_adv_data->p_remote_name = p_info->remote_name;
1909 p_info->remote_name_len = p_adv_data->remote_name_len = ad_len - 1;
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07001910 BTM_TRACE_DEBUG("BTM_BLE_AD_TYPE_NAME name = %s",p_adv_data->p_remote_name);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001911 }
1912 p_cur += (ad_len -1);
1913
1914 break;
1915
1916 case BTM_BLE_AD_TYPE_FLAG:
1917 p_adv_data->ad_mask |= BTM_BLE_AD_BIT_FLAGS;
1918 ad_flag = *p_cur ++;
1919 p_adv_data->flag = (UINT8)(ad_flag & BTM_BLE_ADV_FLAG_MASK) ;
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07001920 BTM_TRACE_DEBUG("BTM_BLE_AD_TYPE_FLAG flag = %s | %s | %s",
The Android Open Source Project5738f832012-12-12 16:00:35 -08001921 (p_adv_data->flag & BTM_BLE_LIMIT_DISC_FLAG)? "LE_LIMIT_DISC" : "",
1922 (p_adv_data->flag & BTM_BLE_GEN_DISC_FLAG)? "LE_GENERAL_DISC" : "",
1923 (p_adv_data->flag & BTM_BLE_BREDR_NOT_SPT)? "LE Only device" : "");
1924 break;
1925
1926 case BTM_BLE_AD_TYPE_TX_PWR:
1927 p_adv_data->ad_mask |= BTM_BLE_AD_BIT_TX_PWR;
1928 p_adv_data->tx_power_level = (INT8)*p_cur ++;
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07001929 BTM_TRACE_DEBUG("BTM_BLE_AD_TYPE_TX_PWR tx_level = %d", p_adv_data->tx_power_level);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001930 break;
1931
The Android Open Source Project5738f832012-12-12 16:00:35 -08001932 case BTM_BLE_AD_TYPE_MANU:
1933
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001934 case BTM_BLE_AD_TYPE_16SRV_PART:
1935 case BTM_BLE_AD_TYPE_16SRV_CMPL:
1936 p_adv_data->ad_mask |= BTM_BLE_AD_BIT_SERVICE;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001937 /* need allocate memory to store UUID list */
1938 p_adv_data->service.num_service = (ad_len - 1)/2;
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07001939 BTM_TRACE_DEBUG("service UUID list, num = %d", p_adv_data->service.num_service);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001940 p_cur += (ad_len - 1);
1941 break;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001942
1943 case BTM_BLE_AD_TYPE_SOL_SRV_UUID:
1944 p_adv_data->ad_mask |= BTM_BLE_AD_BIT_SERVICE_SOL;
1945 /* need allocate memory to store UUID list */
1946 p_adv_data->service.num_service = (ad_len - 1)/2;
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07001947 BTM_TRACE_DEBUG("service UUID list, num = %d", p_adv_data->service.num_service);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001948 p_cur += (ad_len - 1);
1949 break;
1950
1951 case BTM_BLE_AD_TYPE_128SOL_SRV_UUID:
1952 p_adv_data->ad_mask |= BTM_BLE_AD_BIT_SERVICE_128SOL;
1953 /* need allocate memory to store UUID list */
1954 p_adv_data->service.num_service = (ad_len - 1)/16;
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07001955 BTM_TRACE_DEBUG("service UUID list, num = %d", p_adv_data->service.num_service);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001956 p_cur += (ad_len - 1);
1957 break;
1958
1959 case BTM_BLE_AD_TYPE_APPEARANCE:
1960 case BTM_BLE_AD_TYPE_PUBLIC_TARGET:
1961 case BTM_BLE_AD_TYPE_RANDOM_TARGET:
1962 default:
1963 break;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001964 }
1965 len -= (ad_len + 1);
1966 }
1967}
1968#endif
1969
1970/*******************************************************************************
1971**
1972** Function btm_ble_cache_adv_data
1973**
1974** Description Update advertising cache data.
1975**
1976** Returns void
1977**
1978*******************************************************************************/
1979void btm_ble_cache_adv_data(tBTM_INQ_RESULTS *p_cur, UINT8 data_len, UINT8 *p, UINT8 evt_type)
1980{
1981 tBTM_BLE_INQ_CB *p_le_inq_cb = &btm_cb.ble_ctr_cb.inq_var;
1982 UINT8 *p_cache;
1983 UINT8 length;
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08001984 UNUSED(p_cur);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001985
1986 /* cache adv report/scan response data */
1987 if (evt_type != BTM_BLE_SCAN_RSP_EVT)
1988 {
1989 p_le_inq_cb->adv_len = 0;
1990 memset(p_le_inq_cb->adv_data_cache, 0, BTM_BLE_CACHE_ADV_DATA_MAX);
1991 }
1992
1993 if (data_len > 0)
1994 {
1995 p_cache = &p_le_inq_cb->adv_data_cache[p_le_inq_cb->adv_len];
1996 STREAM_TO_UINT8(length, p);
1997 while ( length && ((p_le_inq_cb->adv_len + length + 1) <= BTM_BLE_CACHE_ADV_DATA_MAX))
1998 {
1999 /* copy from the length byte & data into cache */
2000 memcpy(p_cache, p-1, length+1);
2001 /* advance the cache pointer past data */
2002 p_cache += length+1;
2003 /* increment cache length */
2004 p_le_inq_cb->adv_len += length+1;
2005 /* skip the length of data */
2006 p += length;
2007 STREAM_TO_UINT8(length, p);
2008 }
2009 }
2010
2011 /* parse service UUID from adv packet and save it in inq db eir_uuid */
2012 /* TODO */
2013}
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002014
The Android Open Source Project5738f832012-12-12 16:00:35 -08002015/*******************************************************************************
2016**
2017** Function btm_ble_is_discoverable
2018**
2019** Description check ADV flag to make sure device is discoverable and match
2020** the search condition
2021**
2022** Parameters
2023**
2024** Returns void
2025**
2026*******************************************************************************/
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002027UINT8 btm_ble_is_discoverable(BD_ADDR bda, UINT8 evt_type, UINT8 *p)
The Android Open Source Project5738f832012-12-12 16:00:35 -08002028{
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002029 UINT8 *p_flag, flag = 0, rt = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002030 UINT8 data_len;
2031 tBTM_INQ_PARMS *p_cond = &btm_cb.btm_inq_vars.inqparms;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002032 tBTM_BLE_INQ_CB *p_le_inq_cb = &btm_cb.ble_ctr_cb.inq_var;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002033
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002034 UNUSED(p);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002035
2036 /* for observer, always "discoverable */
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002037 if (BTM_BLE_IS_OBS_ACTIVE(btm_cb.ble_ctr_cb.scan_activity))
2038 rt |= BTM_BLE_OBS_RESULT;
2039
2040 if (BTM_BLE_IS_SEL_CONN_ACTIVE(btm_cb.ble_ctr_cb.scan_activity) &&
2041 (evt_type == BTM_BLE_CONNECT_EVT || evt_type == BTM_BLE_CONNECT_DIR_EVT))
2042 rt |= BTM_BLE_SEL_CONN_RESULT;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002043
2044 /* does not match filter condition */
2045 if (p_cond->filter_cond_type == BTM_FILTER_COND_BD_ADDR &&
2046 memcmp(bda, p_cond->filter_cond.bdaddr_cond, BD_ADDR_LEN) != 0)
2047 {
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07002048 BTM_TRACE_DEBUG("BD ADDR does not meet filter condition");
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002049 return rt;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002050 }
2051
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002052 if (p_le_inq_cb->adv_len != 0)
The Android Open Source Project5738f832012-12-12 16:00:35 -08002053 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002054 if ((p_flag = BTM_CheckAdvData(p_le_inq_cb->adv_data_cache,
2055 BTM_BLE_AD_TYPE_FLAG, &data_len)) != NULL)
The Android Open Source Project5738f832012-12-12 16:00:35 -08002056 {
2057 flag = * p_flag;
2058
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002059 if ((btm_cb.btm_inq_vars.inq_active & BTM_BLE_GENERAL_INQUIRY) &&
The Android Open Source Project5738f832012-12-12 16:00:35 -08002060 (flag & (BTM_BLE_LIMIT_DISC_FLAG|BTM_BLE_GEN_DISC_FLAG)) != 0)
2061 {
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07002062 BTM_TRACE_DEBUG("Find Generable Discoverable device");
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002063 rt |= BTM_BLE_INQ_RESULT;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002064 }
2065
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002066 else if (btm_cb.btm_inq_vars.inq_active & BTM_BLE_LIMITED_INQUIRY &&
The Android Open Source Project5738f832012-12-12 16:00:35 -08002067 (flag & BTM_BLE_LIMIT_DISC_FLAG) != 0)
2068 {
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07002069 BTM_TRACE_DEBUG("Find limited discoverable device");
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002070 rt |= BTM_BLE_INQ_RESULT;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002071 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08002072 }
2073 }
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002074 return rt;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002075}
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002076
Adam Hampsone6c74502014-05-30 15:07:08 -07002077static void btm_ble_appearance_to_cod(UINT16 appearance, UINT8 *dev_class)
2078{
2079 dev_class[0] = 0;
2080
2081 switch (appearance)
2082 {
2083 case BTM_BLE_APPEARANCE_GENERIC_PHONE:
2084 dev_class[1] = BTM_COD_MAJOR_PHONE;
2085 dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED;
2086 break;
2087 case BTM_BLE_APPEARANCE_GENERIC_COMPUTER:
2088 dev_class[1] = BTM_COD_MAJOR_COMPUTER;
2089 dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED;
2090 break;
2091 case BTM_BLE_APPEARANCE_GENERIC_REMOTE:
2092 dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
2093 dev_class[2] = BTM_COD_MINOR_REMOTE_CONTROL;
2094 break;
2095 case BTM_BLE_APPEARANCE_GENERIC_THERMOMETER:
2096 case BTM_BLE_APPEARANCE_THERMOMETER_EAR:
2097 dev_class[1] = BTM_COD_MAJOR_HEALTH;
2098 dev_class[2] = BTM_COD_MINOR_THERMOMETER;
2099 break;
2100 case BTM_BLE_APPEARANCE_GENERIC_HEART_RATE:
2101 case BTM_BLE_APPEARANCE_HEART_RATE_BELT:
2102 dev_class[1] = BTM_COD_MAJOR_HEALTH;
2103 dev_class[2] = BTM_COD_MINOR_HEART_PULSE_MONITOR;
2104 break;
2105 case BTM_BLE_APPEARANCE_GENERIC_BLOOD_PRESSURE:
2106 case BTM_BLE_APPEARANCE_BLOOD_PRESSURE_ARM:
2107 case BTM_BLE_APPEARANCE_BLOOD_PRESSURE_WRIST:
2108 dev_class[1] = BTM_COD_MAJOR_HEALTH;
2109 dev_class[2] = BTM_COD_MINOR_BLOOD_MONITOR;
2110 break;
2111 case BTM_BLE_APPEARANCE_GENERIC_PULSE_OXIMETER:
2112 case BTM_BLE_APPEARANCE_PULSE_OXIMETER_FINGERTIP:
2113 case BTM_BLE_APPEARANCE_PULSE_OXIMETER_WRIST:
2114 dev_class[1] = BTM_COD_MAJOR_HEALTH;
2115 dev_class[2] = BTM_COD_MINOR_PULSE_OXIMETER;
2116 break;
2117 case BTM_BLE_APPEARANCE_GENERIC_GLUCOSE:
2118 dev_class[1] = BTM_COD_MAJOR_HEALTH;
2119 dev_class[2] = BTM_COD_MINOR_GLUCOSE_METER;
2120 break;
2121 case BTM_BLE_APPEARANCE_GENERIC_WEIGHT:
2122 dev_class[1] = BTM_COD_MAJOR_HEALTH;
2123 dev_class[2] = BTM_COD_MINOR_WEIGHING_SCALE;
2124 break;
2125 case BTM_BLE_APPEARANCE_GENERIC_WALKING:
2126 case BTM_BLE_APPEARANCE_WALKING_IN_SHOE:
2127 case BTM_BLE_APPEARANCE_WALKING_ON_SHOE:
2128 case BTM_BLE_APPEARANCE_WALKING_ON_HIP:
2129 dev_class[1] = BTM_COD_MAJOR_HEALTH;
2130 dev_class[2] = BTM_COD_MINOR_STEP_COUNTER;
2131 break;
2132 case BTM_BLE_APPEARANCE_GENERIC_WATCH:
2133 case BTM_BLE_APPEARANCE_SPORTS_WATCH:
2134 dev_class[1] = BTM_COD_MAJOR_WEARABLE;
2135 dev_class[2] = BTM_COD_MINOR_WRIST_WATCH;
2136 break;
2137 case BTM_BLE_APPEARANCE_GENERIC_EYEGLASSES:
2138 dev_class[1] = BTM_COD_MAJOR_WEARABLE;
2139 dev_class[2] = BTM_COD_MINOR_GLASSES;
2140 break;
2141 case BTM_BLE_APPEARANCE_GENERIC_DISPLAY:
2142 dev_class[1] = BTM_COD_MAJOR_IMAGING;
2143 dev_class[2] = BTM_COD_MINOR_DISPLAY;
2144 break;
2145 case BTM_BLE_APPEARANCE_GENERIC_MEDIA_PLAYER:
2146 dev_class[1] = BTM_COD_MAJOR_AUDIO;
2147 dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED;
2148 break;
2149 case BTM_BLE_APPEARANCE_GENERIC_BARCODE_SCANNER:
2150 case BTM_BLE_APPEARANCE_HID_BARCODE_SCANNER:
2151 case BTM_BLE_APPEARANCE_GENERIC_HID:
2152 dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
2153 dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED;
2154 break;
2155 case BTM_BLE_APPEARANCE_HID_KEYBOARD:
2156 dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
2157 dev_class[2] = BTM_COD_MINOR_KEYBOARD;
2158 break;
2159 case BTM_BLE_APPEARANCE_HID_MOUSE:
2160 dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
2161 dev_class[2] = BTM_COD_MINOR_POINTING;
2162 break;
2163 case BTM_BLE_APPEARANCE_HID_JOYSTICK:
2164 dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
2165 dev_class[2] = BTM_COD_MINOR_JOYSTICK;
2166 break;
2167 case BTM_BLE_APPEARANCE_HID_GAMEPAD:
2168 dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
2169 dev_class[2] = BTM_COD_MINOR_GAMEPAD;
2170 break;
2171 case BTM_BLE_APPEARANCE_HID_DIGITIZER_TABLET:
2172 dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
2173 dev_class[2] = BTM_COD_MINOR_DIGITIZING_TABLET;
2174 break;
2175 case BTM_BLE_APPEARANCE_HID_CARD_READER:
2176 dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
2177 dev_class[2] = BTM_COD_MINOR_CARD_READER;
2178 break;
2179 case BTM_BLE_APPEARANCE_HID_DIGITAL_PEN:
2180 dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
2181 dev_class[2] = BTM_COD_MINOR_DIGITAL_PAN;
2182 break;
2183 case BTM_BLE_APPEARANCE_UKNOWN:
2184 case BTM_BLE_APPEARANCE_GENERIC_CLOCK:
2185 case BTM_BLE_APPEARANCE_GENERIC_TAG:
2186 case BTM_BLE_APPEARANCE_GENERIC_KEYRING:
2187 case BTM_BLE_APPEARANCE_GENERIC_CYCLING:
2188 case BTM_BLE_APPEARANCE_CYCLING_COMPUTER:
2189 case BTM_BLE_APPEARANCE_CYCLING_SPEED:
2190 case BTM_BLE_APPEARANCE_CYCLING_CADENCE:
2191 case BTM_BLE_APPEARANCE_CYCLING_POWER:
2192 case BTM_BLE_APPEARANCE_CYCLING_SPEED_CADENCE:
2193 case BTM_BLE_APPEARANCE_GENERIC_OUTDOOR_SPORTS:
2194 case BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION:
2195 case BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_AND_NAV:
2196 case BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_POD:
2197 case BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_POD_AND_NAV:
2198 default:
2199 dev_class[1] = BTM_COD_MAJOR_UNCLASSIFIED;
2200 dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED;
2201 };
2202}
2203
The Android Open Source Project5738f832012-12-12 16:00:35 -08002204/*******************************************************************************
2205**
2206** Function btm_ble_update_inq_result
2207**
2208** Description Update adv packet information into inquiry result.
2209**
2210** Parameters
2211**
2212** Returns void
2213**
2214*******************************************************************************/
2215BOOLEAN btm_ble_update_inq_result(tINQ_DB_ENT *p_i, UINT8 addr_type, UINT8 evt_type, UINT8 *p)
2216{
2217 BOOLEAN to_report = TRUE;
2218 tBTM_INQ_RESULTS *p_cur = &p_i->inq_info.results;
2219 UINT8 len;
2220 UINT8 *p_flag;
2221 tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
2222 UINT8 data_len, rssi;
2223 tBTM_BLE_INQ_CB *p_le_inq_cb = &btm_cb.ble_ctr_cb.inq_var;
2224 UINT8 *p1;
Zhihai Xu1237ee32013-11-26 18:18:29 -08002225 UINT8 *p_uuid16;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002226
2227 STREAM_TO_UINT8 (data_len, p);
2228
2229 if (data_len > BTM_BLE_ADV_DATA_LEN_MAX)
2230 {
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07002231 BTM_TRACE_WARNING("EIR data too long %d. discard", data_len);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002232 return FALSE;
2233 }
2234 btm_ble_cache_adv_data(p_cur, data_len, p, evt_type);
2235
2236 p1 = (p + data_len);
2237 STREAM_TO_UINT8 (rssi, p1);
2238
2239 /* Save the info */
2240 p_cur->inq_result_type = BTM_INQ_RESULT_BLE;
2241 p_cur->ble_addr_type = addr_type;
2242 p_cur->rssi = rssi;
2243
2244 /* active scan, always wait until get scan_rsp to report the result */
2245 if ((btm_cb.ble_ctr_cb.inq_var.scan_type == BTM_BLE_SCAN_MODE_ACTI &&
2246 (evt_type == BTM_BLE_CONNECT_EVT || evt_type == BTM_BLE_DISCOVER_EVT)))
2247 {
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07002248 BTM_TRACE_DEBUG("btm_ble_update_inq_result scan_rsp=false, to_report=false,\
Nitin Arora0830ad42014-02-21 18:20:37 -08002249 scan_type_active=%d", btm_cb.ble_ctr_cb.inq_var.scan_type);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002250 p_i->scan_rsp = FALSE;
2251 to_report = FALSE;
2252 }
2253 else
2254 p_i->scan_rsp = TRUE;
2255
2256 if (p_i->inq_count != p_inq->inq_counter)
2257 p_cur->device_type = BT_DEVICE_TYPE_BLE;
2258 else
2259 p_cur->device_type |= BT_DEVICE_TYPE_BLE;
2260
2261 if (evt_type != BTM_BLE_SCAN_RSP_EVT)
2262 p_cur->ble_evt_type = evt_type;
2263
2264 p_i->inq_count = p_inq->inq_counter; /* Mark entry for current inquiry */
2265
2266 if (p_le_inq_cb->adv_len != 0)
2267 {
2268 if ((p_flag = BTM_CheckAdvData(p_le_inq_cb->adv_data_cache, BTM_BLE_AD_TYPE_FLAG, &len)) != NULL)
2269 p_cur->flag = * p_flag;
2270 }
2271
Zhihai Xu1237ee32013-11-26 18:18:29 -08002272 if (p_le_inq_cb->adv_len != 0)
2273 {
Adam Hampsone6c74502014-05-30 15:07:08 -07002274 /* Check to see the BLE device has the Appearance UUID in the advertising data. If it does
2275 * then try to convert the appearance value to a class of device value Bluedroid can use.
2276 * Otherwise fall back to trying to infer if it is a HID device based on the service class.
2277 */
2278 p_uuid16 = BTM_CheckAdvData(p_le_inq_cb->adv_data_cache, BTM_BLE_AD_TYPE_APPEARANCE, &len);
2279 if (p_uuid16 && len == 2)
Zhihai Xu1237ee32013-11-26 18:18:29 -08002280 {
Adam Hampsone6c74502014-05-30 15:07:08 -07002281 btm_ble_appearance_to_cod((UINT16)p_uuid16[0] | (p_uuid16[1] << 8), p_cur->dev_class);
2282 }
2283 else
2284 {
2285 if ((p_uuid16 = BTM_CheckAdvData(p_le_inq_cb->adv_data_cache,
2286 BTM_BLE_AD_TYPE_16SRV_CMPL, &len)) != NULL)
Zhihai Xu1237ee32013-11-26 18:18:29 -08002287 {
Adam Hampsone6c74502014-05-30 15:07:08 -07002288 UINT8 i;
2289 for (i = 0; i + 2 <= len; i = i + 2)
Zhihai Xu1237ee32013-11-26 18:18:29 -08002290 {
Adam Hampsone6c74502014-05-30 15:07:08 -07002291 /* if this BLE device support HID over LE, set HID Major in class of device */
2292 if ((p_uuid16[i] | (p_uuid16[i+1] << 8)) == UUID_SERVCLASS_LE_HID)
2293 {
2294 p_cur->dev_class[0] = 0;
2295 p_cur->dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
2296 p_cur->dev_class[2] = 0;
2297 break;
2298 }
Zhihai Xu1237ee32013-11-26 18:18:29 -08002299 }
2300 }
2301 }
2302 }
2303
The Android Open Source Project5738f832012-12-12 16:00:35 -08002304 /* if BR/EDR not supported is not set, assume is a DUMO device */
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002305 if ((p_cur->flag & BTM_BLE_BREDR_NOT_SPT) == 0 &&
2306 evt_type != BTM_BLE_CONNECT_DIR_EVT)
The Android Open Source Project5738f832012-12-12 16:00:35 -08002307 {
Andre Eisenbachbf68ac72013-10-25 16:17:45 -07002308 if (p_cur->ble_addr_type != BLE_ADDR_RANDOM)
2309 {
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07002310 BTM_TRACE_DEBUG("BR/EDR NOT support bit not set, treat as DUMO");
Andre Eisenbachbf68ac72013-10-25 16:17:45 -07002311 p_cur->device_type |= BT_DEVICE_TYPE_DUMO;
2312 } else {
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07002313 BTM_TRACE_DEBUG("Random address, treating device as LE only");
Andre Eisenbachbf68ac72013-10-25 16:17:45 -07002314 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08002315 }
2316 else
2317 {
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07002318 BTM_TRACE_DEBUG("BR/EDR NOT SUPPORT bit set, LE only device");
The Android Open Source Project5738f832012-12-12 16:00:35 -08002319 }
2320
2321 return to_report;
2322
2323}
2324
2325/*******************************************************************************
2326**
2327** Function btm_send_sel_conn_callback
2328**
2329** Description send selection connection request callback.
2330**
2331** Parameters
2332**
2333** Returns void
2334**
2335*******************************************************************************/
2336void btm_send_sel_conn_callback(BD_ADDR remote_bda, UINT8 evt_type, UINT8 *p_data, UINT8 addr_type)
2337{
2338 UINT8 data_len, len;
2339 UINT8 *p_dev_name, remname[31] = {0};
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08002340 UNUSED(addr_type);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002341
2342 if (btm_cb.ble_ctr_cb.p_select_cback == NULL ||
2343 /* non-connectable device */
2344 (evt_type != BTM_BLE_EVT_CONN_ADV && evt_type != BTM_BLE_EVT_CONN_DIR_ADV))
2345 return;
2346
2347 STREAM_TO_UINT8 (data_len, p_data);
2348
2349 /* get the device name if exist in ADV data */
2350 if (data_len != 0)
2351 {
2352 p_dev_name = BTM_CheckAdvData(p_data, BTM_BLE_AD_TYPE_NAME_CMPL, &len);
2353
2354 if (p_dev_name == NULL)
2355 p_dev_name = BTM_CheckAdvData(p_data, BTM_BLE_AD_TYPE_NAME_SHORT, &len);
2356
2357 if (p_dev_name)
2358 memcpy(remname, p_dev_name, len);
2359 }
2360 /* allow connection */
2361 if ((* btm_cb.ble_ctr_cb.p_select_cback)(remote_bda, remname))
2362 {
2363 /* terminate selective connection, initiate connection */
2364 btm_ble_initiate_select_conn(remote_bda);
2365 }
2366}
2367
2368/*******************************************************************************
2369**
The Android Open Source Project5738f832012-12-12 16:00:35 -08002370** Function btm_ble_process_adv_pkt
2371**
2372** Description This function is called when adv packet report events are
2373** received from the device. It updates the inquiry database.
2374** If the inquiry database is full, the oldest entry is discarded.
2375**
2376** Parameters
2377**
2378** Returns void
2379**
2380*******************************************************************************/
2381void btm_ble_process_adv_pkt (UINT8 *p_data)
2382{
2383 BD_ADDR bda;
2384 UINT8 evt_type = 0, *p = p_data;
2385 UINT8 addr_type = 0;
Adam Hampson186cddb2014-05-27 10:48:19 -07002386 UINT8 num_reports;
2387 UINT8 data_len;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002388#if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
Zhihai Xu8b35b3f2014-03-11 15:01:45 -07002389 BOOLEAN match = FALSE;
2390#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -08002391
Adam Hampson186cddb2014-05-27 10:48:19 -07002392 /* Extract the number of reports in this event. */
2393 STREAM_TO_UINT8(num_reports, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002394
Adam Hampson186cddb2014-05-27 10:48:19 -07002395 while (num_reports--)
2396 {
2397 /* Extract inquiry results */
2398 STREAM_TO_UINT8 (evt_type, p);
2399 STREAM_TO_UINT8 (addr_type, p);
2400 STREAM_TO_BDADDR (bda, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002401
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002402#ifdef BTM_BLE_PC_ADV_TEST_MODE /* For general stack code (e.g. BTInsight testing), we simply do not define it to exclude or set it to TRUE to include */
Adam Hampson186cddb2014-05-27 10:48:19 -07002403 if (BTM_BLE_PC_ADV_TEST_MODE) /* For stack component, it is always defined and maps to a global variable g_bDraculaAdvertisingMode */
2404 {
2405 if (btm_cb.ble_ctr_cb.p_scan_req_cback)
2406 (*btm_cb.ble_ctr_cb.p_scan_req_cback)(bda, addr_type, evt_type);
2407 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08002408#endif
2409
Wei Wanged534e32014-05-20 06:30:13 +00002410#if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
2411#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07002412 /* map address to security record */
2413 btm_public_addr_to_random_pseudo(bda, &addr_type);
2414 BTM_TRACE_ERROR("new address: %02x:%02x:%02x:%02x:%02x:%02x",
Wei Wanged534e32014-05-20 06:30:13 +00002415 bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);
2416#endif
2417#endif
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002418
Adam Hampson186cddb2014-05-27 10:48:19 -07002419 /* Only process the results if the inquiry is still active */
2420 if (!BTM_BLE_IS_SCAN_ACTIVE(btm_cb.ble_ctr_cb.scan_activity))
2421 return;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002422
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07002423 BTM_TRACE_DEBUG("btm_ble_process_adv_pkt:bda= %0x:%0x:%0x:%0x:%0x:%0x",
Nitin Arora0830ad42014-02-21 18:20:37 -08002424 bda[0],bda[1],bda[2],bda[3],bda[4],bda[5]);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002425#if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
Zhihai Xu8b35b3f2014-03-11 15:01:45 -07002426#if SMP_INCLUDED == TRUE
Adam Hampson186cddb2014-05-27 10:48:19 -07002427 /* always do RRA resolution on host */
2428 if (!match && BTM_BLE_IS_RESOLVE_BDA(bda))
2429 {
2430 btm_ble_resolve_random_addr(bda, btm_ble_resolve_random_addr_on_adv, p_data);
2431 }
2432 else
Zhihai Xu8b35b3f2014-03-11 15:01:45 -07002433#endif
2434#endif
Adam Hampson186cddb2014-05-27 10:48:19 -07002435 {
2436 btm_ble_process_adv_pkt_cont(bda, addr_type, evt_type, p);
2437 }
2438
2439 STREAM_TO_UINT8(data_len, p);
2440
2441 /* Advance to the next event data_len + rssi byte */
2442 p += data_len + 1;
Zhihai Xu8b35b3f2014-03-11 15:01:45 -07002443 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08002444}
2445
2446/*******************************************************************************
2447**
2448** Function btm_ble_process_adv_pkt_cont
2449**
2450** Description This function is called after random address resolution is
2451** done, and proceed to process adv packet.
2452**
2453** Parameters
2454**
2455** Returns void
2456**
2457*******************************************************************************/
2458static void btm_ble_process_adv_pkt_cont(BD_ADDR bda, UINT8 addr_type, UINT8 evt_type, UINT8 *p)
2459{
2460 tINQ_DB_ENT *p_i;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002461 tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
2462 tBTM_INQ_RESULTS_CB *p_inq_results_cb = p_inq->p_inq_results_cb;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002463 tBTM_INQ_RESULTS_CB *p_obs_results_cb = btm_cb.ble_ctr_cb.p_obs_results_cb;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002464 tBTM_BLE_INQ_CB *p_le_inq_cb = &btm_cb.ble_ctr_cb.inq_var;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002465 BOOLEAN update = TRUE;
2466 UINT8 result = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002467
2468 p_i = btm_inq_db_find (bda);
2469
2470 /* Check if this address has already been processed for this inquiry */
2471 if (btm_inq_find_bdaddr(bda))
2472 {
2473 /* never been report as an LE device */
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002474 if (p_i &&
The Android Open Source Project5738f832012-12-12 16:00:35 -08002475 (!(p_i->inq_info.results.device_type & BT_DEVICE_TYPE_BLE) ||
2476 /* scan repsonse to be updated */
2477 (!p_i->scan_rsp)))
The Android Open Source Project5738f832012-12-12 16:00:35 -08002478 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002479 update = TRUE;
2480 }
2481 else if (BTM_BLE_IS_OBS_ACTIVE(btm_cb.ble_ctr_cb.scan_activity))
2482 {
2483 update = FALSE;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002484 }
2485 else
2486 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002487 /* if yes, skip it */
2488 return; /* assumption: one result per event */
The Android Open Source Project5738f832012-12-12 16:00:35 -08002489 }
2490 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08002491 /* If existing entry, use that, else get a new one (possibly reusing the oldest) */
2492 if (p_i == NULL)
2493 {
Nitin Arora0830ad42014-02-21 18:20:37 -08002494 if ((p_i = btm_inq_db_new (bda)) != NULL)
The Android Open Source Project5738f832012-12-12 16:00:35 -08002495 {
Nitin Arora0830ad42014-02-21 18:20:37 -08002496 p_inq->inq_cmpl_info.num_resp++;
2497 }
2498 else
2499 return;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002500 }
2501 else if (p_i->inq_count != p_inq->inq_counter) /* first time seen in this inquiry */
2502 {
2503 p_inq->inq_cmpl_info.num_resp++;
2504 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08002505 /* update the LE device information in inquiry database */
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002506 if (!btm_ble_update_inq_result(p_i, addr_type, evt_type, p))
2507 return;
2508
2509 if ((result = btm_ble_is_discoverable(bda, evt_type, p)) == 0)
2510 {
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07002511 BTM_TRACE_ERROR("discard adv pkt");
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002512 return;
2513 }
2514 if (!update)
2515 result &= ~BTM_BLE_INQ_RESULT;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002516#if BTM_USE_INQ_RESULTS_FILTER == TRUE
2517 /* If the number of responses found and limited, issue a cancel inquiry */
2518 if (p_inq->inqparms.max_resps &&
2519 p_inq->inq_cmpl_info.num_resp == p_inq->inqparms.max_resps)
2520 {
2521 /* new device */
2522 if (p_i == NULL ||
2523 (/* assume a DUMO device, BR/EDR inquiry is always active */
2524 p_i && p_i->inq_info.results.device_type == BT_DEVICE_TYPE_BLE && p_i->scan_rsp))
2525 {
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07002526 BTM_TRACE_WARNING("INQ RES: Extra Response Received...cancelling inquiry..");
The Android Open Source Project5738f832012-12-12 16:00:35 -08002527
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002528 /* if is non-periodic inquiry active, cancel now */
2529 if ((p_inq->inq_active & BTM_BR_INQ_ACTIVE_MASK) != 0 &&
2530 (p_inq->inq_active & BTM_PERIODIC_INQUIRY_ACTIVE) == 0)
The Android Open Source Project5738f832012-12-12 16:00:35 -08002531 btsnd_hcic_inq_cancel();
2532
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002533 btm_ble_stop_inquiry();
The Android Open Source Project5738f832012-12-12 16:00:35 -08002534
2535#if BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE
2536 btm_acl_update_busy_level (BTM_BLI_INQ_DONE_EVT);
2537#endif
2538 }
2539 }
2540#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -08002541 /* background connection in selective connection mode */
2542 if (btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_SELECTIVE)
2543 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002544 if (result & BTM_BLE_SEL_CONN_RESULT)
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002545 btm_send_sel_conn_callback(bda, evt_type, p, addr_type);
2546 else
2547 {
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07002548 BTM_TRACE_DEBUG("None LE device, can not initiate selective connection");
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002549 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08002550 }
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002551 else
The Android Open Source Project5738f832012-12-12 16:00:35 -08002552 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002553 if (p_inq_results_cb && (result & BTM_BLE_INQ_RESULT))
2554 {
Nitin Arora0830ad42014-02-21 18:20:37 -08002555 (p_inq_results_cb)((tBTM_INQ_RESULTS *) &p_i->inq_info.results, p_le_inq_cb->adv_data_cache);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002556 }
2557 if (p_obs_results_cb && (result & BTM_BLE_OBS_RESULT))
2558 {
2559 (p_obs_results_cb)((tBTM_INQ_RESULTS *) &p_i->inq_info.results, p_le_inq_cb->adv_data_cache);
2560 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08002561 }
2562}
2563
2564/*******************************************************************************
2565**
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002566** Function btm_ble_start_scan
2567**
2568** Description Start the BLE scan.
2569**
2570** Returns void
2571**
2572*******************************************************************************/
2573tBTM_STATUS btm_ble_start_scan (UINT8 filter_enable)
2574{
2575 tBTM_BLE_INQ_CB *p_inq = &btm_cb.ble_ctr_cb.inq_var;
2576 tBTM_STATUS status = BTM_CMD_STARTED;
2577
2578 /* start scan, disable duplicate filtering */
2579 if (!btsnd_hcic_ble_set_scan_enable (BTM_BLE_SCAN_ENABLE, filter_enable))
2580 status = BTM_NO_RESOURCES;
2581 else
2582 {
2583 if (p_inq->scan_type == BTM_BLE_SCAN_MODE_ACTI)
2584 btm_ble_set_topology_mask(BTM_BLE_STATE_ACTIVE_SCAN_BIT);
2585 else
2586 btm_ble_set_topology_mask(BTM_BLE_STATE_PASSIVE_SCAN_BIT);
2587 }
2588 return status;
2589}
2590
2591/*******************************************************************************
2592**
The Android Open Source Project5738f832012-12-12 16:00:35 -08002593** Function btm_ble_stop_scan
2594**
2595** Description Stop the BLE scan.
2596**
2597** Returns void
2598**
2599*******************************************************************************/
2600void btm_ble_stop_scan(void)
2601{
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07002602 BTM_TRACE_EVENT ("btm_ble_stop_scan ");
The Android Open Source Project5738f832012-12-12 16:00:35 -08002603
The Android Open Source Project5738f832012-12-12 16:00:35 -08002604 /* Clear the inquiry callback if set */
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002605 btm_cb.ble_ctr_cb.inq_var.scan_type = BTM_BLE_SCAN_MODE_NONE;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002606
2607 /* stop discovery now */
2608 btsnd_hcic_ble_set_scan_enable (BTM_BLE_SCAN_DISABLE, BTM_BLE_DUPLICATE_ENABLE);
2609
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002610 btm_update_scanner_filter_policy(SP_ADV_ALL);
2611}
2612/*******************************************************************************
2613**
2614** Function btm_ble_stop_inquiry
2615**
2616** Description Stop the BLE Inquiry.
2617**
2618** Returns void
2619**
2620*******************************************************************************/
2621void btm_ble_stop_inquiry(void)
2622{
2623 tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
2624 tBTM_BLE_CB *p_ble_cb = &btm_cb.ble_ctr_cb;
2625
2626 btu_stop_timer (&p_ble_cb->inq_var.inq_timer_ent);
2627
2628 p_ble_cb->scan_activity &= ~BTM_BLE_INQUIRY_MASK;
2629
2630 /* If no more scan activity, stop LE scan now */
2631 if (!BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity))
2632 btm_ble_stop_scan();
2633
The Android Open Source Project5738f832012-12-12 16:00:35 -08002634 /* If we have a callback registered for inquiry complete, call it */
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07002635 BTM_TRACE_DEBUG ("BTM Inq Compl Callback: status 0x%02x, num results %d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08002636 p_inq->inq_cmpl_info.status, p_inq->inq_cmpl_info.num_resp);
2637
The Android Open Source Project5738f832012-12-12 16:00:35 -08002638 btm_process_inq_complete(HCI_SUCCESS, (UINT8)(p_inq->inqparms.mode & BTM_BLE_INQUIRY_MASK));
The Android Open Source Project5738f832012-12-12 16:00:35 -08002639}
2640
2641/*******************************************************************************
2642**
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002643** Function btm_ble_stop_observe
2644**
2645** Description Stop the BLE Observe.
2646**
2647** Returns void
2648**
2649*******************************************************************************/
2650static void btm_ble_stop_observe(void)
2651{
2652 tBTM_BLE_CB *p_ble_cb = & btm_cb.ble_ctr_cb;
2653 tBTM_CMPL_CB *p_obs_cb = p_ble_cb->p_obs_cmpl_cb;
2654
2655 btu_stop_timer (&p_ble_cb->obs_timer_ent);
2656
2657 p_ble_cb->scan_activity &= ~BTM_LE_OBSERVE_ACTIVE;
2658
2659 p_ble_cb->p_obs_results_cb = NULL;
2660 p_ble_cb->p_obs_cmpl_cb = NULL;
2661
2662 if (!BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity))
2663 btm_ble_stop_scan();
2664
2665 if (p_obs_cb)
2666 (p_obs_cb)((tBTM_INQUIRY_CMPL *) &btm_cb.btm_inq_vars.inq_cmpl_info);
2667}
2668/*******************************************************************************
2669**
2670** Function btm_ble_adv_states_operation
2671**
2672** Description Set or clear adv states in topology mask
2673**
2674** Returns operation status. TRUE if sucessful, FALSE otherwise.
2675**
2676*******************************************************************************/
2677typedef BOOLEAN (BTM_TOPOLOGY_FUNC_PTR)(tBTM_BLE_STATE_MASK);
2678static BOOLEAN btm_ble_adv_states_operation(BTM_TOPOLOGY_FUNC_PTR *p_handler, UINT8 adv_evt)
2679{
2680 BOOLEAN rt = FALSE;
2681
2682 switch (adv_evt)
2683 {
2684 case BTM_BLE_CONNECT_EVT:
2685 rt = (*p_handler)(BTM_BLE_STATE_CONN_ADV_BIT);
2686 break;
2687
2688 case BTM_BLE_NON_CONNECT_EVT:
2689 rt = (*p_handler) (BTM_BLE_STATE_NON_CONN_ADV_BIT);
2690 break;
2691 case BTM_BLE_CONNECT_DIR_EVT:
2692 rt = (*p_handler) (BTM_BLE_STATE_HI_DUTY_DIR_ADV_BIT);
2693 break;
2694
2695 case BTM_BLE_DISCOVER_EVT:
2696 rt = (*p_handler) (BTM_BLE_STATE_SCAN_ADV_BIT);
2697 break;
2698
2699 default:
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07002700 BTM_TRACE_ERROR("unknown adv event : %d", adv_evt);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002701 break;
2702 }
2703
2704 return rt;
2705}
2706
2707
2708/*******************************************************************************
2709**
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002710** Function btm_ble_start_adv
2711**
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002712** Description start the BLE advertising.
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002713**
2714** Returns void
2715**
2716*******************************************************************************/
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002717tBTM_STATUS btm_ble_start_adv(void)
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002718{
2719 tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
2720 tBTM_STATUS rt = BTM_NO_RESOURCES;
2721
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002722 if (!btm_ble_adv_states_operation (btm_ble_topology_check, p_cb->evt_type))
2723 return BTM_WRONG_MODE;
2724
2725 if (p_cb->afp != AP_SCAN_CONN_ALL)
2726 {
2727 btm_execute_wl_dev_operation();
2728 btm_cb.ble_ctr_cb.wl_state |= BTM_BLE_WL_ADV;
2729 }
2730
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002731 if (btsnd_hcic_ble_set_adv_enable (BTM_BLE_ADV_ENABLE))
2732 {
2733 if (p_cb->afp != AP_SCAN_CONN_ALL)
2734 btm_cb.ble_ctr_cb.wl_state |= BTM_BLE_WL_ADV;
2735
2736 p_cb->adv_mode = BTM_BLE_ADV_ENABLE;
2737
2738 rt = BTM_SUCCESS;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002739 }
2740 else
2741 {
2742 p_cb->adv_mode = BTM_BLE_ADV_DISABLE;
2743 btm_cb.ble_ctr_cb.wl_state &= ~BTM_BLE_WL_ADV;
2744 }
2745 return rt;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002746}
2747/*******************************************************************************
2748**
The Android Open Source Project5738f832012-12-12 16:00:35 -08002749** Function btm_ble_stop_adv
2750**
2751** Description Stop the BLE advertising.
2752**
2753** Returns void
2754**
2755*******************************************************************************/
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002756tBTM_STATUS btm_ble_stop_adv(void)
The Android Open Source Project5738f832012-12-12 16:00:35 -08002757{
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002758 tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
2759 tBTM_STATUS rt = BTM_SUCCESS;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002760
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002761 if (p_cb->adv_mode == BTM_BLE_ADV_ENABLE)
The Android Open Source Project5738f832012-12-12 16:00:35 -08002762 {
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002763 if (btsnd_hcic_ble_set_adv_enable (BTM_BLE_ADV_DISABLE))
2764 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002765 p_cb->fast_adv_on = FALSE;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002766 p_cb->adv_mode = BTM_BLE_ADV_DISABLE;
2767 btm_cb.ble_ctr_cb.wl_state &= ~BTM_BLE_WL_ADV;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002768
2769 /* clear all adv states */
2770 btm_ble_clear_topology_mask (BTM_BLE_STATE_ALL_ADV_MASK);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002771 }
2772 else
2773 rt = BTM_NO_RESOURCES;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002774 }
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002775 return rt;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002776}
2777
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002778
2779/*******************************************************************************
2780**
2781** Function btm_ble_set_topology_mask
2782**
2783** Description set BLE topology mask
2784**
2785** Returns TRUE is request is allowed, FALSE otherwise.
2786**
2787*******************************************************************************/
2788BOOLEAN btm_ble_set_topology_mask(tBTM_BLE_STATE_MASK request_state_mask)
2789{
2790 BOOLEAN rt = TRUE;
2791
2792 request_state_mask &= BTM_BLE_STATE_ALL_MASK;
2793
2794 btm_cb.ble_ctr_cb.cur_states |= request_state_mask;
2795
2796 return rt;
2797}
2798/*******************************************************************************
2799**
2800** Function btm_ble_clear_topology_mask
2801**
2802** Description Clear BLE topology bit mask
2803**
2804** Returns TRUE is request is allowed, FALSE otherwise.
2805**
2806*******************************************************************************/
2807BOOLEAN btm_ble_clear_topology_mask (tBTM_BLE_STATE_MASK request_state_mask)
2808{
2809 request_state_mask &= BTM_BLE_STATE_ALL_MASK;
2810
2811 btm_cb.ble_ctr_cb.cur_states &= ~request_state_mask;
2812
2813 return TRUE;
2814}
2815/*******************************************************************************
2816**
2817** Function btm_ble_update_mode_operation
2818**
2819** Description This function update the GAP role operation when a link status
2820** is updated.
2821**
2822** Returns void
2823**
2824*******************************************************************************/
2825void btm_ble_update_mode_operation(UINT8 link_role, BD_ADDR bd_addr, BOOLEAN conn_cancel)
2826{
2827 tACL_CONN *pa = &btm_cb.acl_db[0];
2828 UINT16 xx;
2829 UINT16 mask = BTM_BLE_STATE_ALL_CONN_MASK;
2830
2831 UNUSED(bd_addr);
2832 UNUSED (conn_cancel);
2833
2834 if (link_role == HCI_ROLE_SLAVE)
2835 {
2836 btm_cb.ble_ctr_cb.inq_var.adv_mode = BTM_BLE_ADV_DISABLE;
2837 /* clear all adv states */
2838 mask |= BTM_BLE_STATE_ALL_ADV_MASK;
2839 }
2840
2841 btm_ble_clear_topology_mask (mask);
2842
2843 /* check the device link role maps */
2844 for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, pa++)
2845 {
2846 if (pa->in_use && pa->transport == BT_TRANSPORT_LE)
2847 {
2848 if (pa->link_role == HCI_ROLE_MASTER)
2849 btm_ble_set_topology_mask (BTM_BLE_STATE_MASTER_BIT);
2850 else
2851 btm_ble_set_topology_mask (BTM_BLE_STATE_SLAVE_BIT);
2852 }
2853 }
2854
Satya Callojic4e25962014-05-10 23:46:24 -07002855 if (btm_cb.cmn_ble_vsc_cb.adv_inst_max == 0 &&
Wei Wanga6ce7752014-05-20 06:30:32 +00002856 btm_cb.ble_ctr_cb.inq_var.connectable_mode == BTM_BLE_CONNECTABLE)
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002857 {
2858 btm_ble_set_connectability ( btm_cb.ble_ctr_cb.inq_var.connectable_mode );
2859 }
2860
2861 if (btm_ble_get_conn_st() == BLE_CONN_IDLE)
2862 {
2863 if (!btm_send_pending_direct_conn())
2864 {
2865 btm_ble_resume_bg_conn();
2866 }
2867 }
2868}
2869
2870/*******************************************************************************
2871**
2872** Function btm_ble_start_slow_adv
2873**
2874** Description Restart adv with slow adv interval
2875**
2876** Returns void
2877**
2878*******************************************************************************/
2879static void btm_ble_start_slow_adv (void)
2880{
2881 tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
2882 BD_ADDR p_addr_ptr= {0};
2883
2884 if (p_cb->adv_mode == BTM_BLE_ADV_ENABLE)
2885 {
2886 btm_ble_stop_adv();
2887
2888 btsnd_hcic_ble_write_adv_params (BTM_BLE_GAP_ADV_SLOW_INT,
2889 BTM_BLE_GAP_ADV_SLOW_INT,
2890 p_cb->evt_type,
2891 p_cb->adv_addr_type,
2892 btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type,/* slow adv
2893 mode never goes into directed adv */
2894 p_addr_ptr,
2895 p_cb->adv_chnl_map,
2896 p_cb->afp);
2897
2898 btm_ble_start_adv();
2899 }
2900}
The Android Open Source Project5738f832012-12-12 16:00:35 -08002901/*******************************************************************************
2902**
2903** Function btm_ble_timeout
2904**
2905** Description Called when BTM BLE inquiry timer expires
2906**
2907** Returns void
2908**
2909*******************************************************************************/
2910void btm_ble_timeout(TIMER_LIST_ENT *p_tle)
2911{
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07002912 BTM_TRACE_EVENT ("btm_ble_timeout");
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002913
The Android Open Source Project5738f832012-12-12 16:00:35 -08002914 switch (p_tle->event)
2915 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002916 case BTU_TTYPE_BLE_OBSERVE:
2917 btm_ble_stop_observe();
2918 break;
2919
The Android Open Source Project5738f832012-12-12 16:00:35 -08002920 case BTU_TTYPE_BLE_INQUIRY:
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002921 btm_ble_stop_inquiry();
The Android Open Source Project5738f832012-12-12 16:00:35 -08002922 break;
2923
2924 case BTU_TTYPE_BLE_GAP_LIM_DISC:
2925 /* lim_timeout expiried, limited discovery should exit now */
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002926 btm_cb.btm_inq_vars.discoverable_mode &= ~BTM_BLE_LIMITED_DISCOVERABLE;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002927 btm_ble_set_adv_flag(btm_cb.btm_inq_vars.connectable_mode, btm_cb.btm_inq_vars.discoverable_mode);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002928 break;
2929
2930 case BTU_TTYPE_BLE_RANDOM_ADDR:
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002931 if (btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type == BLE_ADDR_RANDOM)
The Android Open Source Project5738f832012-12-12 16:00:35 -08002932 {
Wei Wanga6ce7752014-05-20 06:30:32 +00002933 if ((void *)(p_tle->param) == NULL)
The Android Open Source Project5738f832012-12-12 16:00:35 -08002934 /* refresh the random addr */
Wei Wanga6ce7752014-05-20 06:30:32 +00002935 btm_gen_resolvable_private_addr((void *)btm_gen_resolve_paddr_low);
2936 else
2937 {
2938#if BLE_MULTI_ADV_INCLUDED == TRUE
Wei Wanged534e32014-05-20 06:30:13 +00002939 btm_ble_multi_adv_configure_rpa((tBTM_BLE_MULTI_ADV_INST*)p_tle->param);
Wei Wanga6ce7752014-05-20 06:30:32 +00002940#endif
2941 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08002942 }
2943 break;
2944
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002945 case BTU_TTYPE_BLE_GAP_FAST_ADV:
2946 /* fast adv is completed, fall back to slow adv interval */
2947 btm_ble_start_slow_adv();
2948 break;
2949
2950 default:
2951 break;
2952
The Android Open Source Project5738f832012-12-12 16:00:35 -08002953 }
2954}
2955
The Android Open Source Project5738f832012-12-12 16:00:35 -08002956
2957/*******************************************************************************
2958**
2959** Function btm_ble_read_remote_features_complete
2960**
2961** Description This function is called when the command complete message
2962** is received from the HCI for the read LE remote feature supported
2963** complete event.
2964**
2965** Returns void
2966**
2967*******************************************************************************/
2968void btm_ble_read_remote_features_complete(UINT8 *p)
2969{
2970 tACL_CONN *p_acl_cb = &btm_cb.acl_db[0];
The Android Open Source Project5738f832012-12-12 16:00:35 -08002971 UINT16 handle;
Andre Eisenbach3aa60542013-03-22 18:00:51 -07002972 int xx;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002973
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07002974 BTM_TRACE_EVENT ("btm_ble_read_remote_features_complete ");
The Android Open Source Project5738f832012-12-12 16:00:35 -08002975
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002976 /* Skip status */
2977 p++;
Andre Eisenbach3aa60542013-03-22 18:00:51 -07002978 STREAM_TO_UINT16 (handle, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002979
2980 /* Look up the connection by handle and copy features */
2981 for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_acl_cb++)
2982 {
2983 if ((p_acl_cb->in_use) && (p_acl_cb->hci_handle == handle))
2984 {
Andre Eisenbach3aa60542013-03-22 18:00:51 -07002985 STREAM_TO_ARRAY(p_acl_cb->peer_le_features, p, BD_FEATURES_LEN);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002986 break;
2987 }
2988 }
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002989
The Android Open Source Project5738f832012-12-12 16:00:35 -08002990}
2991
2992/*******************************************************************************
2993**
2994** Function btm_ble_write_adv_enable_complete
2995**
2996** Description This function process the write adv enable command complete.
2997**
2998** Returns void
2999**
3000*******************************************************************************/
3001void btm_ble_write_adv_enable_complete(UINT8 * p)
3002{
3003 tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
3004
3005 /* if write adv enable/disbale not succeed */
3006 if (*p != HCI_SUCCESS)
3007 {
3008 /* toggle back the adv mode */
3009 p_cb->adv_mode = !p_cb->adv_mode;
3010 }
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08003011
Wei Wanged534e32014-05-20 06:30:13 +00003012#if (BLE_VND_INCLUDED == TRUE && BLE_PRIVACY_SPT == TRUE)
3013 if (p_cb->adv_mode == BTM_BLE_ADV_DISABLE)
3014 btm_ble_vendor_disable_irk_list();
3015#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -08003016}
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08003017
3018/*******************************************************************************
3019**
3020** Function btm_ble_dir_adv_tout
3021**
3022** Description when directed adv time out
3023**
3024** Returns void
3025**
3026*******************************************************************************/
3027void btm_ble_dir_adv_tout(void)
3028{
3029 btm_cb.ble_ctr_cb.inq_var.adv_mode = BTM_BLE_ADV_DISABLE;
3030
3031 /* make device fall back into undirected adv mode by default */
3032 btm_cb.ble_ctr_cb.inq_var.directed_conn = FALSE;
3033}
3034
3035/*******************************************************************************
3036**
The Android Open Source Project5738f832012-12-12 16:00:35 -08003037** Function btm_ble_init
3038**
3039** Description Initialize the control block variable values.
3040**
3041** Returns void
3042**
3043*******************************************************************************/
3044void btm_ble_init (void)
3045{
3046 tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
3047
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07003048 BTM_TRACE_EVENT ("btm_ble_init ");
The Android Open Source Project5738f832012-12-12 16:00:35 -08003049
3050 memset(p_cb, 0, sizeof(tBTM_BLE_CB));
Satya Callojic4e25962014-05-10 23:46:24 -07003051 memset(&btm_cb.cmn_ble_vsc_cb, 0 , sizeof(tBTM_BLE_VSC_CB));
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003052 p_cb->cur_states = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08003053
3054 p_cb->inq_var.adv_mode = BTM_BLE_ADV_DISABLE;
3055 p_cb->inq_var.scan_type = BTM_BLE_SCAN_MODE_NONE;
3056 p_cb->inq_var.adv_chnl_map = BTM_BLE_DEFAULT_ADV_CHNL_MAP;
3057 p_cb->inq_var.afp = BTM_BLE_DEFAULT_AFP;
3058 p_cb->inq_var.sfp = BTM_BLE_DEFAULT_SFP;
3059 p_cb->inq_var.connectable_mode = BTM_BLE_NON_CONNECTABLE;
3060 p_cb->inq_var.discoverable_mode = BTM_BLE_NON_DISCOVERABLE;
3061
3062 /* for background connection, reset connection params to be undefined */
3063 p_cb->scan_int = p_cb->scan_win = BTM_BLE_CONN_PARAM_UNDEF;
3064
Andre Eisenbach6975b4d2013-08-05 16:55:38 -07003065 p_cb->inq_var.evt_type = BTM_BLE_NON_CONNECT_EVT;
Wei Wanga6ce7752014-05-20 06:30:32 +00003066#if BLE_MULTI_ADV_INCLUDED == TRUE
3067 btm_ble_multi_adv_init();
3068#endif
Satya Callojic4e25962014-05-10 23:46:24 -07003069
3070#if BLE_BATCH_SCAN_INCLUDED == TRUE
3071 btm_ble_batchscan_init();
3072#endif
3073
Satya Calloji1a9247a2014-06-05 13:15:15 -07003074#if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE
3075 btm_ble_adv_filter_init();
3076#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -08003077}
3078
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003079/*******************************************************************************
3080**
3081** Function btm_ble_topology_check
3082**
3083** Description check to see requested state is supported. One state check at
3084** a time is supported
3085**
3086** Returns TRUE is request is allowed, FALSE otherwise.
3087**
3088*******************************************************************************/
3089BOOLEAN btm_ble_topology_check(tBTM_BLE_STATE_MASK request_state_mask)
3090{
3091 BOOLEAN rt = FALSE;
3092 UINT32 llt_mask = 0;
3093 UINT8 *p;
3094
3095 UINT8 state_offset = 0;
3096 UINT16 cur_states = btm_cb.ble_ctr_cb.cur_states;
3097 UINT8 mask, offset;
3098 UINT8 request_state = 0;
3099
3100 /* check only one bit is set and within valid range */
3101 if (request_state_mask == BTM_BLE_STATE_INVALID ||
3102 request_state_mask > BTM_BLE_STATE_SCAN_ADV_BIT ||
3103 (request_state_mask & (request_state_mask -1 )) != 0)
3104 {
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07003105 BTM_TRACE_ERROR("illegal state requested: %d", request_state_mask);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003106 return rt;
3107 }
3108
3109 while (request_state_mask)
3110 {
3111 request_state_mask >>= 1;
3112 request_state ++;
3113 }
3114
3115 /* check if the requested state is supported or not */
3116 mask = btm_le_state_combo_tbl[0][request_state - 1][0];
3117 offset = btm_le_state_combo_tbl[0][request_state-1][1];
3118
3119 if (!BTM_LE_STATES_SUPPORTED(btm_cb.devcb.le_supported_states, mask, offset))
3120 {
Sharvil Nanavati5344d6d2014-05-04 00:46:57 -07003121 BTM_TRACE_ERROR("state requested not supported: %d", request_state);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07003122 return rt;
3123 }
3124
3125 rt = TRUE;
3126 /* make sure currently active states are all supported in conjunction with the requested
3127 state. If the bit in table is not set, the combination is not supported */
3128 while (cur_states != 0)
3129 {
3130 if (cur_states & 0x01)
3131 {
3132 mask = btm_le_state_combo_tbl[request_state][state_offset][0];
3133 offset = btm_le_state_combo_tbl[request_state][state_offset][1];
3134
3135 if (mask != 0 && offset != 0)
3136 {
3137 if (!BTM_LE_STATES_SUPPORTED(btm_cb.devcb.le_supported_states, mask, offset))
3138 {
3139 rt = FALSE;
3140 break;
3141 }
3142 }
3143 }
3144 cur_states >>= 1;
3145 state_offset ++;
3146 }
3147 return rt;
3148}
3149
3150
The Android Open Source Project5738f832012-12-12 16:00:35 -08003151#endif /* BLE_INCLUDED */