blob: 6d53a6cf1eaede9da4cb5ae64568fb2f7831f047 [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"
42
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -070043#include "btm_ble_int.h"
44
The Android Open Source Project5738f832012-12-12 16:00:35 -080045#define BTM_BLE_NAME_SHORT 0x01
46#define BTM_BLE_NAME_CMPL 0x02
47
48#define BTM_BLE_FILTER_TARGET_UNKNOWN 0xff
49#define BTM_BLE_POLICY_UNKNOWN 0xff
50
The Android Open Source Project5738f832012-12-12 16:00:35 -080051#define BTM_EXT_BLE_RMT_NAME_TIMEOUT 30
Wei Wanga6ce7752014-05-20 06:30:32 +000052#define MIN_ADV_LENGTH 2
53
54extern tBTM_BLE_MULTI_ADV_CB btm_multi_adv_cb;
The Android Open Source Project5738f832012-12-12 16:00:35 -080055
56/*******************************************************************************
57** Local functions
58*******************************************************************************/
59static void btm_ble_update_adv_flag(UINT8 flag);
60static 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 +000061UINT8 *btm_ble_build_adv_data(tBTM_BLE_AD_MASK *p_data_mask, UINT8 **p_dst,
62 tBTM_BLE_ADV_DATA *p_data);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -080063static UINT8 btm_set_conn_mode_adv_init_addr(tBTM_BLE_INQ_CB *p_cb,
64 BD_ADDR_PTR p_addr_ptr,
65 tBLE_ADDR_TYPE *p_init_addr_type,
66 tBLE_ADDR_TYPE *p_own_addr_type);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -070067static void btm_ble_stop_observe(void);
The Android Open Source Project5738f832012-12-12 16:00:35 -080068
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -070069#define BTM_BLE_INQ_RESULT 0x01
70#define BTM_BLE_OBS_RESULT 0x02
71#define BTM_BLE_SEL_CONN_RESULT 0x04
The Android Open Source Project5738f832012-12-12 16:00:35 -080072
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -070073/* LE states combo bit to check */
74const 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 -080075{
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -070076 {/* single state support */
77 {HCI_SUPP_LE_STATES_CONN_ADV_MASK, HCI_SUPP_LE_STATES_CONN_ADV_OFF}, /* conn_adv */
78 {HCI_SUPP_LE_STATES_INIT_MASK, HCI_SUPP_LE_STATES_INIT_OFF}, /* init */
79 {HCI_SUPP_LE_STATES_INIT_MASK, HCI_SUPP_LE_STATES_INIT_OFF}, /* master */
80 {HCI_SUPP_LE_STATES_SLAVE_MASK, HCI_SUPP_LE_STATES_SLAVE_OFF}, /* slave */
81 {0, 0}, /* todo: lo du dir adv, not covered ? */
82 {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_OFF}, /* hi duty dir adv */
83 {HCI_SUPP_LE_STATES_NON_CONN_ADV_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_OFF}, /* non connectable adv */
84 {HCI_SUPP_LE_STATES_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_OFF}, /* passive scan */
85 {HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_OFF}, /* active scan */
86 {HCI_SUPP_LE_STATES_SCAN_ADV_MASK, HCI_SUPP_LE_STATESSCAN_ADV_OFF} /* scanable adv */
87 },
88 { /* conn_adv =0 */
89 {0, 0}, /* conn_adv */
90 {HCI_SUPP_LE_STATES_CONN_ADV_INIT_MASK, HCI_SUPP_LE_STATES_CONN_ADV_INIT_OFF}, /* init: 32 */
91 {HCI_SUPP_LE_STATES_CONN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_CONN_ADV_MASTER_OFF}, /* master: 35 */
92 {HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_OFF}, /* slave: 38,*/
93 {0, 0}, /* lo du dir adv */
94 {0, 0}, /* hi duty dir adv */
95 {0, 0}, /* non connectable adv */
96 {HCI_SUPP_LE_STATES_CONN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_CONN_ADV_PASS_SCAN_OFF}, /* passive scan */
97 {HCI_SUPP_LE_STATES_CONN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_CONN_ADV_ACTIVE_SCAN_OFF}, /* active scan */
98 {0, 0} /* scanable adv */
99 },
100 { /* init */
101 {HCI_SUPP_LE_STATES_CONN_ADV_INIT_MASK, HCI_SUPP_LE_STATES_CONN_ADV_INIT_OFF}, /* conn_adv: 32 */
102 {0, 0}, /* init */
103 {HCI_SUPP_LE_STATES_INIT_MASTER_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_OFF}, /* master 28 */
104 {HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_OFF}, /* slave 41 */
105 {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 */
106 {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 */
107 {HCI_SUPP_LE_STATES_NON_CONN_INIT_MASK, HCI_SUPP_LE_STATES_NON_CONN_INIT_OFF}, /* non connectable adv */
108 {HCI_SUPP_LE_STATES_PASS_SCAN_INIT_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_INIT_OFF}, /* passive scan */
109 {HCI_SUPP_LE_STATES_ACTIVE_SCAN_INIT_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_INIT_OFF}, /* active scan */
110 {HCI_SUPP_LE_STATES_SCAN_ADV_INIT_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_INIT_OFF} /* scanable adv */
111
112 },
113 { /* master */
114 {HCI_SUPP_LE_STATES_CONN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_CONN_ADV_MASTER_OFF}, /* conn_adv: 35 */
115 {HCI_SUPP_LE_STATES_INIT_MASTER_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_OFF}, /* init 28 */
116 {HCI_SUPP_LE_STATES_INIT_MASTER_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_OFF}, /* master 28 */
117 {HCI_SUPP_LE_STATES_CONN_ADV_INIT_MASK, HCI_SUPP_LE_STATES_CONN_ADV_INIT_OFF}, /* slave: 32 */
118 {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 */
119 {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 */
120 {HCI_SUPP_LE_STATES_NON_CONN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_MASTER_OFF}, /* non connectable adv */
121 {HCI_SUPP_LE_STATES_PASS_SCAN_MASTER_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_MASTER_OFF}, /* passive scan */
122 {HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASTER_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASTER_OFF}, /* active scan */
123 {HCI_SUPP_LE_STATES_SCAN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_MASTER_OFF} /* scanable adv */
124
125 },
126 { /* slave */
127 {HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_OFF}, /* conn_adv: 38,*/
128 {HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_OFF}, /* init 41 */
129 {HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_OFF}, /* master 41 */
130 {HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_OFF}, /* slave: 38,*/
131 {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 */
132 {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 */
133 {HCI_SUPP_LE_STATES_NON_CONN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_SLAVE_OFF}, /* non connectable adv */
134 {HCI_SUPP_LE_STATES_PASS_SCAN_SLAVE_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_SLAVE_OFF}, /* passive scan */
135 {HCI_SUPP_LE_STATES_ACTIVE_SCAN_SLAVE_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_SLAVE_OFF}, /* active scan */
136 {HCI_SUPP_LE_STATES_SCAN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_SLAVE_OFF} /* scanable adv */
137
138 },
139 { /* lo duty cycle adv */
140 {0, 0}, /* conn_adv: 38,*/
141 {HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_INIT_MASK, HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_INIT_OFF} ,/* init 34 */
142 {HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_MASTER_OFF}, /* master 37 */
143 {HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_SLAVE_OFF}, /* slave: 40 */
144 {0, 0}, /* lo duty cycle adv 40 */
145 {0, 0}, /* hi duty cycle adv 39 */
146 {0, 0}, /* non connectable adv */
147 {0, 0}, /* TODO: passive scan, not covered? */
148 {0, 0}, /* TODO: active scan, not covered? */
149 {0, 0} /* scanable adv */
150 },
151 { /* hi duty cycle adv */
152 {0, 0}, /* conn_adv: 38,*/
153 {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_INIT_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_INIT_OFF}, /* init 33 */
154 {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASTER_OFF}, /* master 36 */
155 {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_SLAVE_OFF}, /* slave: 39*/
156 {0, 0}, /* lo duty cycle adv 40 */
157 {0, 0}, /* hi duty cycle adv 39 */
158 {0, 0}, /* non connectable adv */
159 {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_PASS_SCAN_OFF}, /* passive scan */
160 {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_ACTIVE_SCAN_OFF}, /* active scan */
161 {0, 0} /* scanable adv */
162 },
163 { /* non connectable adv */
164 {0, 0}, /* conn_adv: */
165 {HCI_SUPP_LE_STATES_NON_CONN_INIT_MASK, HCI_SUPP_LE_STATES_NON_CONN_INIT_OFF}, /* init */
166 {HCI_SUPP_LE_STATES_NON_CONN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_MASTER_OFF}, /* master */
167 {HCI_SUPP_LE_STATES_NON_CONN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_SLAVE_OFF}, /* slave: */
168 {0, 0}, /* lo duty cycle adv */
169 {0, 0}, /* hi duty cycle adv */
170 {0, 0}, /* non connectable adv */
171 {HCI_SUPP_LE_STATES_NON_CONN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_PASS_SCAN_OFF}, /* passive scan */
172 {HCI_SUPP_LE_STATES_NON_CONN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_ACTIVE_SCAN_OFF}, /* active scan */
173 {0, 0} /* scanable adv */
174 },
175 { /* passive scan */
176 {HCI_SUPP_LE_STATES_CONN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_CONN_ADV_PASS_SCAN_OFF}, /* conn_adv: */
177 {HCI_SUPP_LE_STATES_PASS_SCAN_INIT_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_INIT_OFF}, /* init */
178 {HCI_SUPP_LE_STATES_PASS_SCAN_MASTER_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_MASTER_OFF}, /* master */
179 {HCI_SUPP_LE_STATES_PASS_SCAN_SLAVE_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_SLAVE_OFF}, /* slave: */
180 {0, 0}, /* lo duty cycle adv */
181 {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 */
182 {HCI_SUPP_LE_STATES_NON_CONN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_PASS_SCAN_OFF}, /* non connectable adv */
183 {0, 0}, /* passive scan */
184 {0, 0}, /* active scan */
185 {HCI_SUPP_LE_STATES_SCAN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_PASS_SCAN_OFF} /* scanable adv */
186 },
187 { /* active scan */
188 {HCI_SUPP_LE_STATES_CONN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_CONN_ADV_ACTIVE_SCAN_OFF}, /* conn_adv: */
189 {HCI_SUPP_LE_STATES_ACTIVE_SCAN_INIT_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_INIT_OFF}, /* init */
190 {HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASTER_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASTER_OFF}, /* master */
191 {HCI_SUPP_LE_STATES_ACTIVE_SCAN_SLAVE_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_SLAVE_OFF}, /* slave: */
192 {0, 0}, /* lo duty cycle adv */
193 {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 */
194 {HCI_SUPP_LE_STATES_NON_CONN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_ACTIVE_SCAN_OFF}, /* non connectable adv */
195 {0, 0}, /* TODO: passive scan */
196 {0, 0}, /* TODO: active scan */
197 {HCI_SUPP_LE_STATES_SCAN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_ACTIVE_SCAN_OFF} /* scanable adv */
198 },
199 { /* scanable adv */
200 {0, 0}, /* conn_adv: */
201 {HCI_SUPP_LE_STATES_SCAN_ADV_INIT_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_INIT_OFF}, /* init */
202 {HCI_SUPP_LE_STATES_SCAN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_MASTER_OFF}, /* master */
203 {HCI_SUPP_LE_STATES_SCAN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_SLAVE_OFF}, /* slave: */
204 {0, 0}, /* lo duty cycle adv */
205 {0, 0}, /* hi duty cycle adv */
206 {0, 0}, /* non connectable adv */
207 {HCI_SUPP_LE_STATES_SCAN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_PASS_SCAN_OFF}, /* passive scan */
208 {HCI_SUPP_LE_STATES_SCAN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_ACTIVE_SCAN_OFF}, /* active scan */
209 {0, 0} /* scanable adv */
210 }
211
212};
213/* check LE combo state supported */
214#define BTM_LE_STATES_SUPPORTED(x, y, z) ((x)[(z)] & (y))
215
216
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800217/*******************************************************************************
218**
219** Function BTM_BleUpdateAdvWhitelist
220**
221** Description Add or remove device from advertising white list
222**
223** Returns void
224**
225*******************************************************************************/
226BOOLEAN BTM_BleUpdateAdvWhitelist(BOOLEAN add_remove, BD_ADDR remote_bda)
227{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -0800228 UNUSED(add_remove);
229 UNUSED(remote_bda);
230
231 return FALSE;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800232}
The Android Open Source Project5738f832012-12-12 16:00:35 -0800233
234/*******************************************************************************
235**
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800236** Function BTM_BleUpdateAdvFilterPolicy
237**
238** Description This function update the filter policy of advertiser.
239**
240** Parameter adv_policy: advertising filter policy
241**
242** Return void
243*******************************************************************************/
244void BTM_BleUpdateAdvFilterPolicy(tBTM_BLE_AFP adv_policy)
245{
246 tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
247 tBLE_ADDR_TYPE init_addr_type = BLE_ADDR_PUBLIC;
248 BD_ADDR p_addr_ptr= {0};
249 UINT8 adv_mode = p_cb->adv_mode;
250
251 BTM_TRACE_EVENT0 ("BTM_BleUpdateAdvFilterPolicy");
252
Andre Eisenbach3aa60542013-03-22 18:00:51 -0700253 if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
254 return;
255
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800256 if (p_cb->afp != adv_policy)
257 {
258 p_cb->afp = adv_policy;
259
260 /* if adv active, stop and restart */
261 btm_ble_stop_adv ();
262
263 if (p_cb->connectable_mode & BTM_BLE_CONNECTABLE)
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700264 p_cb->evt_type = btm_set_conn_mode_adv_init_addr(p_cb, p_addr_ptr, &init_addr_type,
265 &p_cb->adv_addr_type);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800266
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700267 btsnd_hcic_ble_write_adv_params ((UINT16)(p_cb->adv_interval_min ? p_cb->adv_interval_min :
268 BTM_BLE_GAP_ADV_SLOW_INT),
269 (UINT16)(p_cb->adv_interval_max ? p_cb->adv_interval_max :
270 BTM_BLE_GAP_ADV_SLOW_INT),
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800271 p_cb->evt_type,
272 p_cb->adv_addr_type,
273 init_addr_type,
274 p_addr_ptr,
275 p_cb->adv_chnl_map,
276 p_cb->afp);
277
278 if (adv_mode == BTM_BLE_ADV_ENABLE)
279 btm_ble_start_adv ();
280
281 }
282}
283/*******************************************************************************
284**
The Android Open Source Project5738f832012-12-12 16:00:35 -0800285** Function BTM_BleObserve
286**
287** Description This procedure keep the device listening for advertising
288** events from a broadcast device.
289**
290** Parameters start: start or stop observe.
291** white_list: use white list in observer mode or not.
292**
293** Returns void
294**
295*******************************************************************************/
296tBTM_STATUS BTM_BleObserve(BOOLEAN start, UINT8 duration,
297 tBTM_INQ_RESULTS_CB *p_results_cb, tBTM_CMPL_CB *p_cmpl_cb)
298{
299 tBTM_BLE_INQ_CB *p_inq = &btm_cb.ble_ctr_cb.inq_var;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700300 tBTM_STATUS status = BTM_WRONG_MODE;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800301
Nitin Arora0830ad42014-02-21 18:20:37 -0800302 BTM_TRACE_EVENT1 ("BTM_BleObserve : scan_type:%d",btm_cb.btm_inq_vars.scan_type);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800303
Andre Eisenbach3aa60542013-03-22 18:00:51 -0700304 if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
305 return BTM_ILLEGAL_VALUE;
306
The Android Open Source Project5738f832012-12-12 16:00:35 -0800307 if (start)
308 {
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800309 /* shared inquiry database, do not allow observe if any inquiry is active */
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700310 if (BTM_BLE_IS_OBS_ACTIVE(btm_cb.ble_ctr_cb.scan_activity))
Nitin Arora0830ad42014-02-21 18:20:37 -0800311 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700312 BTM_TRACE_ERROR0("Observe Already Active");
313 return status;
Nitin Arora0830ad42014-02-21 18:20:37 -0800314 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800315
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700316 btm_cb.ble_ctr_cb.p_obs_results_cb = p_results_cb;
317 btm_cb.ble_ctr_cb.p_obs_cmpl_cb = p_cmpl_cb;
318 status = BTM_CMD_STARTED;
319
320 /* scan is not started */
321 if (!BTM_BLE_IS_SCAN_ACTIVE(btm_cb.ble_ctr_cb.scan_activity))
322 {
323 p_inq->scan_type = (p_inq->scan_type == BTM_BLE_SCAN_MODE_NONE) ? BTM_BLE_SCAN_MODE_ACTI: p_inq->scan_type;
324 /* allow config scanning type */
325 btsnd_hcic_ble_set_scan_params (p_inq->scan_type,
The Android Open Source Project5738f832012-12-12 16:00:35 -0800326 (UINT16)(!p_inq->scan_interval ? BTM_BLE_GAP_DISC_SCAN_INT : p_inq->scan_interval),
327 (UINT16)(!p_inq->scan_window ? BTM_BLE_GAP_DISC_SCAN_WIN : p_inq->scan_window),
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700328 btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type,
329 BTM_BLE_DEFAULT_SFP); /* assume observe always not using white list */
The Android Open Source Project5738f832012-12-12 16:00:35 -0800330
Wei Wanged534e32014-05-20 06:30:13 +0000331#if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
332 /* enable IRK list */
333 btm_ble_vendor_irk_list_known_dev (TRUE);
334#endif
335
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700336 status = btm_ble_start_scan(BTM_BLE_DUPLICATE_DISABLE);
337 }
338 if (status == BTM_CMD_STARTED)
339 {
340 btm_cb.ble_ctr_cb.scan_activity |= BTM_LE_OBSERVE_ACTIVE;
341
342 if (duration != 0)
343 /* start observer timer */
344 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 -0800345 }
346 }
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700347 else if (BTM_BLE_IS_OBS_ACTIVE(btm_cb.ble_ctr_cb.scan_activity))
The Android Open Source Project5738f832012-12-12 16:00:35 -0800348 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700349 status = BTM_CMD_STARTED;
350 btm_ble_stop_observe();
351 }
352 else
353 {
354 BTM_TRACE_ERROR0("Observe not active");
The Android Open Source Project5738f832012-12-12 16:00:35 -0800355 }
356
357 return status;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700358
The Android Open Source Project5738f832012-12-12 16:00:35 -0800359}
360
361/*******************************************************************************
362**
363** Function BTM_BleBroadcast
364**
365** Description This function is to start or stop broadcasting.
366**
367** Parameters start: start or stop broadcasting.
368**
369** Returns status.
370**
371*******************************************************************************/
372tBTM_STATUS BTM_BleBroadcast(BOOLEAN start)
373{
374 tBTM_STATUS status = BTM_NO_RESOURCES;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800375 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 -0800376 tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
377 UINT8 evt_type = p_cb->scan_rsp ? BTM_BLE_DISCOVER_EVT: BTM_BLE_NON_CONNECT_EVT;
378
Andre Eisenbach3aa60542013-03-22 18:00:51 -0700379 if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
380 return BTM_ILLEGAL_VALUE;
381
The Android Open Source Project5738f832012-12-12 16:00:35 -0800382#ifdef BTM_BLE_PC_ADV_TEST_MODE
383 if (BTM_BLE_PC_ADV_TEST_MODE)
384 {
385 evt_type = p_cb->scan_rsp ? BTM_BLE_CONNECT_EVT: BTM_BLE_NON_CONNECT_EVT;
386 }
387#endif
388
389 if (start && p_cb->adv_mode == BTM_BLE_ADV_DISABLE)
390 {
391 /* update adv params */
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700392 if (!btsnd_hcic_ble_write_adv_params ((UINT16)(p_cb->adv_interval_min ? p_cb->adv_interval_min :
393 BTM_BLE_GAP_ADV_INT),
394 (UINT16)(p_cb->adv_interval_max ? p_cb->adv_interval_max :
395 BTM_BLE_GAP_ADV_INT),
The Android Open Source Project5738f832012-12-12 16:00:35 -0800396 evt_type,
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800397 p_addr_cb->own_addr_type,
398 p_cb->direct_bda.type,
399 p_cb->direct_bda.bda,
The Android Open Source Project5738f832012-12-12 16:00:35 -0800400 p_cb->adv_chnl_map,
401 p_cb->afp))
402
403 status = BTM_NO_RESOURCES;
404 else
405 p_cb->evt_type = evt_type;
406
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800407 status = btm_ble_start_adv ();
The Android Open Source Project5738f832012-12-12 16:00:35 -0800408 }
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700409 else if (!start)
The Android Open Source Project5738f832012-12-12 16:00:35 -0800410 {
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800411 status = btm_ble_stop_adv();
The Android Open Source Project5738f832012-12-12 16:00:35 -0800412 }
413 else
414 {
415 status = BTM_WRONG_MODE;
416 BTM_TRACE_ERROR2("Can not %s Broadcast, device %s in Broadcast mode",
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700417 (start ? "Start" : "Stop"), (start ? "already" :"not"));
The Android Open Source Project5738f832012-12-12 16:00:35 -0800418 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800419 return status;
420}
421
The Android Open Source Project5738f832012-12-12 16:00:35 -0800422/*******************************************************************************
423**
Wei Wanga6ce7752014-05-20 06:30:32 +0000424** Function btm_vsc_brcm_features_complete
425**
426** Description Command Complete callback for HCI_BLE_VENDOR_CAP_OCF
427**
428** Returns void
429**
430*******************************************************************************/
431static void btm_ble_vendor_capability_vsc_cmpl_cback (tBTM_VSC_CMPL *p_vcs_cplt_params)
432{
433 UINT8 status = 0xFF, *p;
434 UINT8 rpa_offloading, max_irk_list_sz, filtering_support, max_filter;
435 UINT16 scan_result_storage;
436
437 /* Check status of command complete event */
438 if((p_vcs_cplt_params->opcode == HCI_BLE_VENDOR_CAP_OCF)
439 &&(p_vcs_cplt_params->param_len > 0 ))
440 {
441 p = p_vcs_cplt_params->p_param_buf;
442 STREAM_TO_UINT8 (status, p);
443 }
444
445 if(status == HCI_SUCCESS)
446 {
447 STREAM_TO_UINT8 (btm_multi_adv_cb.adv_inst_max, p);
448 STREAM_TO_UINT8 (rpa_offloading, p);
449 STREAM_TO_UINT16 (scan_result_storage, p);
450 STREAM_TO_UINT8 (max_irk_list_sz, p);
451 STREAM_TO_UINT8 (filtering_support, p);
452 STREAM_TO_UINT8 (max_filter, p);
453 }
454}
455
456/*******************************************************************************
457**
458** Function btm_ble_vendor_capability_init
459**
460** Description LE Get_Vendor Capabilities
461**
462** Returns None.
463**
464*******************************************************************************/
465void btm_ble_vendor_capability_init(void)
466{
467 if ( BTM_VendorSpecificCommand (HCI_BLE_VENDOR_CAP_OCF,
468 0,
469 NULL,
470 btm_ble_vendor_capability_vsc_cmpl_cback)
471 != BTM_CMD_STARTED)
472 {
473 BTM_TRACE_ERROR0("LE Get_Vendor Capabilities Command Failed.");
474 }
475 return ;
476}
477
478/*******************************************************************************
479**
The Android Open Source Project5738f832012-12-12 16:00:35 -0800480** Function BTM_RegisterScanReqEvt
481**
482** Description This function is called to register a scan request callback
483** on the advertiser.
484**
485** Parameters p_scan_req_cback: scan request callback. If NULL, remove the
486** registration.
487**
488** Returns void
489**
490*******************************************************************************/
491void BTM_RegisterScanReqEvt(tBTM_BLE_SCAN_REQ_CBACK *p_scan_req_cback)
492{
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800493#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 */
494 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 -0800495 {
496 tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
497 p_cb->p_scan_req_cback = p_scan_req_cback;
498 }
Mike J. Chen5cd8bff2014-01-31 18:16:59 -0800499#else
500 UNUSED(p_scan_req_cback);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800501#endif
502}
The Android Open Source Project5738f832012-12-12 16:00:35 -0800503
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700504#if BLE_PRIVACY_SPT == TRUE
505/*******************************************************************************
506**
507** Function BTM_BleConfigPrivacy
508**
509** Description This function is called to enable or disable the privacy in
510** LE channel of the local device.
511**
512** Parameters enable: TRUE to enable it; FALSE to disable it.
513**
514** Returns void
515**
516*******************************************************************************/
517void BTM_BleConfigPrivacy(BOOLEAN enable)
518{
519 tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
520
521 BTM_TRACE_EVENT0 (" BTM_BleConfigPrivacy");
522
523 if (p_cb->privacy != enable)
524 {
525 p_cb->privacy = enable;
526
527 if (p_cb->privacy)
528 {
529 /* generate resolvable private address */
Wei Wanga6ce7752014-05-20 06:30:32 +0000530 btm_gen_resolvable_private_addr(NULL);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700531 }
532 else /* if privacy disabled, always use public address */
533 {
534 p_cb->addr_mgnt_cb.own_addr_type = BLE_ADDR_PUBLIC;
535 }
Wei Wanged534e32014-05-20 06:30:13 +0000536 btm_ble_multi_adv_enb_privacy(p_cb->privacy);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700537 }
538}
539
540
Zhihai Xu8b35b3f2014-03-11 15:01:45 -0700541/*******************************************************************************
542**
543** Function btm_ble_resolve_random_addr_on_adv
544**
545** Description resolve random address complete callback.
546**
547** Returns void
548**
549*******************************************************************************/
550static void btm_ble_resolve_random_addr_on_adv(void * p_rec, void *p)
551{
552 tBTM_SEC_DEV_REC *match_rec = (tBTM_SEC_DEV_REC *) p_rec;
553 UINT8 addr_type = BLE_ADDR_RANDOM;
554 BD_ADDR bda;
555 UINT8 *pp = (UINT8 *)p + 1;
556 UINT8 evt_type;
557
558 BTM_TRACE_EVENT0 ("btm_ble_resolve_random_addr_on_adv ");
559
560 STREAM_TO_UINT8 (evt_type, pp);
561 STREAM_TO_UINT8 (addr_type, pp);
562 STREAM_TO_BDADDR (bda, pp);
563
564 if (match_rec)
565 {
566 BTM_TRACE_ERROR0("Random match");
567 match_rec->ble.active_addr_type = BTM_BLE_ADDR_RRA;
568 memcpy(match_rec->ble.cur_rand_addr, bda, BD_ADDR_LEN);
569 memcpy(bda, match_rec->bd_addr, BD_ADDR_LEN);
570 addr_type = match_rec->ble.ble_addr_type;
571 }
572 else
573 {
574 BTM_TRACE_ERROR0("Random unmatch");
575 }
576
577 btm_ble_process_adv_pkt_cont(bda, addr_type, evt_type, pp);
578
579 return;
580}
581#endif
582
The Android Open Source Project5738f832012-12-12 16:00:35 -0800583/*******************************************************************************
584**
585** Function BTM_BleSetBgConnType
586**
587** Description This function is called to set BLE connectable mode for a
588** peripheral device.
589**
590** Parameters bg_conn_type: it can be auto connection, or selective connection.
591** p_select_cback: callback function when selective connection procedure
592** is being used.
593**
594** Returns void
595**
596*******************************************************************************/
597BOOLEAN BTM_BleSetBgConnType(tBTM_BLE_CONN_TYPE bg_conn_type,
598 tBTM_BLE_SEL_CBACK *p_select_cback)
599{
600 BOOLEAN started = TRUE;
601
602 BTM_TRACE_EVENT0 ("BTM_BleSetBgConnType ");
Andre Eisenbach3aa60542013-03-22 18:00:51 -0700603 if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
604 return FALSE;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800605
606 if (btm_cb.ble_ctr_cb.bg_conn_type != bg_conn_type)
607 {
608 switch (bg_conn_type)
609 {
610 case BTM_BLE_CONN_AUTO:
611 btm_ble_start_auto_conn(TRUE);
612 break;
613
614 case BTM_BLE_CONN_SELECTIVE:
615 if (btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_AUTO)
616 {
617 btm_ble_start_auto_conn(FALSE);
618 }
619 started = btm_ble_start_select_conn(TRUE, p_select_cback);
620 break;
621
622 case BTM_BLE_CONN_NONE:
623 if (btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_AUTO)
624 {
625 btm_ble_start_auto_conn(FALSE);
626 }
627 else if (btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_SELECTIVE)
628 {
629 btm_ble_start_select_conn(FALSE, NULL);
630 }
631 started = TRUE;
632 break;
633
634 default:
635 BTM_TRACE_ERROR1("invalid bg connection type : %d ", bg_conn_type);
636 started = FALSE;
637 break;
638 }
639
640 if (started)
641 btm_cb.ble_ctr_cb.bg_conn_type = bg_conn_type;
642 }
643 return started;
644}
645
646/*******************************************************************************
647**
648** Function BTM_BleUpdateBgConnDev
649**
650** Description This function is called to add or remove a device into/from
651** background connection procedure. The background connection
652* procedure is decided by the background connection type, it can be
653* auto connection, or selective connection.
654**
655** Parameters add_remove: TRUE to add; FALSE to remove.
656** remote_bda: device address to add/remove.
657**
658** Returns void
659**
660*******************************************************************************/
661BOOLEAN BTM_BleUpdateBgConnDev(BOOLEAN add_remove, BD_ADDR remote_bda)
662{
The Android Open Source Project5738f832012-12-12 16:00:35 -0800663 BOOLEAN ret = TRUE;
Andre Eisenbach6975b4d2013-08-05 16:55:38 -0700664 UINT8 dev_wl_type = 0;
Andre Eisenbach946c6812013-04-04 14:53:04 -0700665 BTM_TRACE_EVENT0 (" BTM_BleUpdateBgConnDev");
666
667 /* update white list */
668 ret = btm_update_bg_conn_list(add_remove, remote_bda, &dev_wl_type);
669
670 btm_update_dev_to_white_list(add_remove, remote_bda, dev_wl_type);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800671
The Android Open Source Project5738f832012-12-12 16:00:35 -0800672 return ret;
673}
674
675/*******************************************************************************
676**
677** Function BTM_BleSetConnMode
678**
679** Description This function is called to set BLE connectable mode for a
680** peripheral device.
681**
682** Parameters directed: is directed connectable mode, or non-directed.
683** p_dir_bda: connectable direct initiator's LE device address
684**
685** Returns void
686**
687*******************************************************************************/
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800688tBTM_STATUS BTM_BleSetConnMode(BOOLEAN is_directed)
The Android Open Source Project5738f832012-12-12 16:00:35 -0800689{
690 tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800691
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800692 BTM_TRACE_EVENT1 ("BTM_BleSetConnMode is_directed = %d ", is_directed);
Andre Eisenbach3aa60542013-03-22 18:00:51 -0700693 if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
694 return BTM_ILLEGAL_VALUE;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800695
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800696 p_cb->directed_conn = is_directed;
697 return btm_ble_set_connectability( p_cb->connectable_mode);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800698
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800699}
700
701/*******************************************************************************
702**
703** Function btm_set_conn_mode_adv_init_addr
704**
705** Description set initator address type and local address type based on adv
706** mode.
707**
708**
709*******************************************************************************/
710static UINT8 btm_set_conn_mode_adv_init_addr(tBTM_BLE_INQ_CB *p_cb,
711 BD_ADDR_PTR p_addr_ptr,
712 tBLE_ADDR_TYPE *p_init_addr_type,
713 tBLE_ADDR_TYPE *p_own_addr_type)
714{
715 UINT8 evt_type;
716
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700717 UNUSED(p_own_addr_type);
718
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800719 if ( p_cb->directed_conn)
The Android Open Source Project5738f832012-12-12 16:00:35 -0800720 {
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800721 /* direct adv mode does not have privacy if privacy
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700722 is not enabled or no reconn addr config */
723
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800724 *p_init_addr_type = p_cb->direct_bda.type;
725 memcpy(p_addr_ptr, p_cb->direct_bda.bda, BD_ADDR_LEN);
726 evt_type = BTM_BLE_CONNECT_DIR_EVT;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800727 }
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800728 else /* undirect adv mode */
The Android Open Source Project5738f832012-12-12 16:00:35 -0800729 {
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800730 evt_type = BTM_BLE_CONNECT_EVT;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700731
732#if BLE_PRIVACY_SPT == TRUE
733 /* may need to reset random address if privacy is enabled */
734 if (btm_cb.ble_ctr_cb.privacy && /* own addr_type is random */
735 !BTM_BLE_IS_RESOLVE_BDA(btm_cb.ble_ctr_cb.addr_mgnt_cb.private_addr))
736 {
737 /* need to generate RRA and update random addresss in controller */
Wei Wanga6ce7752014-05-20 06:30:32 +0000738 btm_gen_resolvable_private_addr((void *)btm_gen_resolve_paddr_low);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700739 }
740#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -0800741 }
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800742
743 return evt_type;
744
The Android Open Source Project5738f832012-12-12 16:00:35 -0800745}
746
747/*******************************************************************************
748**
749** Function BTM_BleSetAdvParams
750**
751** Description This function is called to set advertising parameters.
752**
753** Parameters adv_int_min: minimum advertising interval
754** adv_int_max: maximum advertising interval
755** p_dir_bda: connectable direct initiator's LE device address
756** chnl_map: advertising channel map.
757**
758** Returns void
759**
760*******************************************************************************/
761tBTM_STATUS BTM_BleSetAdvParams(UINT16 adv_int_min, UINT16 adv_int_max,
762 tBLE_BD_ADDR *p_dir_bda,
763 tBTM_BLE_ADV_CHNL_MAP chnl_map)
764{
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800765 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 -0800766 tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
767 tBTM_STATUS status = BTM_SUCCESS;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800768 BD_ADDR p_addr_ptr = {0};
769 tBLE_ADDR_TYPE init_addr_type = BLE_ADDR_PUBLIC;
770 tBLE_ADDR_TYPE own_addr_type = p_addr_cb->own_addr_type;
771 UINT8 adv_mode = p_cb->adv_mode;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800772
773 BTM_TRACE_EVENT0 ("BTM_BleSetAdvParams");
774
Andre Eisenbach3aa60542013-03-22 18:00:51 -0700775 if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
776 return BTM_ILLEGAL_VALUE;
777
The Android Open Source Project5738f832012-12-12 16:00:35 -0800778 if (!BTM_BLE_VALID_PRAM(adv_int_min, BTM_BLE_ADV_INT_MIN, BTM_BLE_ADV_INT_MAX) ||
779 !BTM_BLE_VALID_PRAM(adv_int_max, BTM_BLE_ADV_INT_MIN, BTM_BLE_ADV_INT_MAX))
780 {
781 return BTM_ILLEGAL_VALUE;
782 }
783
784 p_cb->adv_interval_min = adv_int_min;
785 p_cb->adv_interval_max = adv_int_max;
786 p_cb->adv_chnl_map = chnl_map;
787
788 if (p_dir_bda)
789 {
790 memcpy(&p_cb->direct_bda, p_dir_bda, sizeof(tBLE_BD_ADDR));
791 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800792
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800793 BTM_TRACE_EVENT0 ("update params for an active adv");
The Android Open Source Project5738f832012-12-12 16:00:35 -0800794
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800795 btm_ble_stop_adv();
The Android Open Source Project5738f832012-12-12 16:00:35 -0800796
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800797 if (p_cb->connectable_mode & BTM_BLE_CONNECTABLE)
798 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 -0800799
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800800 /* update adv params */
801 btsnd_hcic_ble_write_adv_params (p_cb->adv_interval_min,
802 p_cb->adv_interval_max,
803 p_cb->evt_type,
804 own_addr_type,
805 init_addr_type,
806 p_addr_ptr,
807 p_cb->adv_chnl_map,
808 p_cb->afp);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800809
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800810 if (adv_mode == BTM_BLE_ADV_ENABLE)
811 btm_ble_start_adv();
The Android Open Source Project5738f832012-12-12 16:00:35 -0800812
813 return status;
814}
815
816/*******************************************************************************
817**
818** Function BTM_BleReadAdvParams
819**
820** Description This function is called to set advertising parameters.
821**
822** Parameters adv_int_min: minimum advertising interval
823** adv_int_max: maximum advertising interval
824** p_dir_bda: connectable direct initiator's LE device address
825** chnl_map: advertising channel map.
826**
827** Returns void
828**
829*******************************************************************************/
830void BTM_BleReadAdvParams (UINT16 *adv_int_min, UINT16 *adv_int_max,
831 tBLE_BD_ADDR *p_dir_bda, tBTM_BLE_ADV_CHNL_MAP *p_chnl_map)
832{
833 tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
834
835 BTM_TRACE_EVENT0 ("BTM_BleReadAdvParams ");
Andre Eisenbach3aa60542013-03-22 18:00:51 -0700836 if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
837 return ;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800838
839 *adv_int_min = p_cb->adv_interval_min;
840 *adv_int_max = p_cb->adv_interval_max;
841 *p_chnl_map = p_cb->adv_chnl_map;
842
843 if (p_dir_bda != NULL)
844 {
845 memcpy(p_dir_bda, &p_cb->direct_bda, sizeof(tBLE_BD_ADDR));
846 }
847}
848
The Android Open Source Project5738f832012-12-12 16:00:35 -0800849/*******************************************************************************
850**
851** Function BTM_BleSetScanParams
852**
853** Description This function is called to set Scan parameters.
854**
855** Parameters adv_int_min: minimum advertising interval
856** adv_int_max: maximum advertising interval
857** p_dir_bda: connectable direct initiator's LE device address
858** chnl_map: advertising channel map.
859** scan_type: active scan or passive scan
860**
861** Returns void
862**
863*******************************************************************************/
864void BTM_BleSetScanParams(UINT16 scan_interval, UINT16 scan_window, tBTM_BLE_SCAN_MODE scan_mode)
865{
866 tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
867
868 BTM_TRACE_EVENT0 (" BTM_BleSetScanParams");
Andre Eisenbach3aa60542013-03-22 18:00:51 -0700869 if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
870 return ;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800871
872 if (BTM_BLE_VALID_PRAM(scan_interval, BTM_BLE_SCAN_INT_MIN, BTM_BLE_SCAN_INT_MAX) &&
873 BTM_BLE_VALID_PRAM(scan_window, BTM_BLE_SCAN_WIN_MIN, BTM_BLE_SCAN_WIN_MAX) &&
874 (scan_mode == BTM_BLE_SCAN_MODE_ACTI || scan_mode == BTM_BLE_SCAN_MODE_PASS))
875 {
876 p_cb->scan_type = scan_mode;
877
878 if (BTM_BLE_CONN_PARAM_UNDEF != scan_interval)
879 p_cb->scan_interval = scan_interval;
880
881 if (BTM_BLE_CONN_PARAM_UNDEF != scan_window)
882 p_cb->scan_window = scan_window;
883 }
884 else
885 {
886 BTM_TRACE_ERROR2("Illegal params: scan_interval = %d scan_window = %d",
887 scan_interval, scan_window);
888 }
889
890}
891
892/*******************************************************************************
893**
894** Function BTM_BleWriteScanRsp
895**
896** Description This function is called to write LE scan response.
897**
898** Parameters: p_scan_rsp: scan response information.
899**
900** Returns void
901**
902*******************************************************************************/
903tBTM_STATUS BTM_BleWriteScanRsp(tBTM_BLE_AD_MASK data_mask, tBTM_BLE_ADV_DATA *p_data)
904{
905 tBTM_STATUS status = BTM_NO_RESOURCES;
906 UINT8 rsp_data[BTM_BLE_AD_DATA_LEN],
907 *p = rsp_data;
908
909 BTM_TRACE_EVENT0 (" BTM_BleWriteScanRsp");
Andre Eisenbach3aa60542013-03-22 18:00:51 -0700910
911 if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
912 return BTM_ILLEGAL_VALUE;
913
The Android Open Source Project5738f832012-12-12 16:00:35 -0800914 memset(rsp_data, 0, BTM_BLE_AD_DATA_LEN);
915 btm_ble_build_adv_data(&data_mask, &p, p_data);
916
917 if (btsnd_hcic_ble_set_scan_rsp_data((UINT8)(p - rsp_data), rsp_data))
918 {
919 status = BTM_SUCCESS;
920
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -0800921 if (data_mask != 0)
The Android Open Source Project5738f832012-12-12 16:00:35 -0800922 btm_cb.ble_ctr_cb.inq_var.scan_rsp = TRUE;
923 else
924 btm_cb.ble_ctr_cb.inq_var.scan_rsp = FALSE;
925 }
926 else
927 status = BTM_ILLEGAL_VALUE;
928
929 return status;
930}
931
932/*******************************************************************************
933**
934** Function BTM_BleWriteAdvData
935**
936** Description This function is called to write advertising data.
937**
938** Parameters: None.
939**
940** Returns void
941**
942*******************************************************************************/
943tBTM_STATUS BTM_BleWriteAdvData(tBTM_BLE_AD_MASK data_mask, tBTM_BLE_ADV_DATA *p_data)
944{
945 tBTM_BLE_LOCAL_ADV_DATA *p_cb_data = &btm_cb.ble_ctr_cb.inq_var.adv_data;
946 UINT8 *p;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -0700947 tBTM_BLE_AD_MASK mask = data_mask;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800948
Andre Eisenbach3aa60542013-03-22 18:00:51 -0700949 BTM_TRACE_EVENT0 ("BTM_BleWriteAdvData ");
950
951 if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
952 return BTM_ILLEGAL_VALUE;
953
The Android Open Source Project5738f832012-12-12 16:00:35 -0800954 memset(p_cb_data, 0, sizeof(tBTM_BLE_LOCAL_ADV_DATA));
955 p = p_cb_data->ad_data;
956 p_cb_data->data_mask = data_mask;
957
The Android Open Source Project5738f832012-12-12 16:00:35 -0800958 p_cb_data->p_flags = btm_ble_build_adv_data(&mask, &p, p_data);
959
960 p_cb_data->p_pad = p;
961
Wei Wanga6ce7752014-05-20 06:30:32 +0000962 if (mask != 0)
The Android Open Source Project5738f832012-12-12 16:00:35 -0800963 {
964 BTM_TRACE_ERROR0("Partial data write into ADV");
965 }
966
967 p_cb_data->data_mask &= ~mask;
968
969 if (btsnd_hcic_ble_set_adv_data((UINT8)(p_cb_data->p_pad - p_cb_data->ad_data),
970 p_cb_data->ad_data))
971 return BTM_SUCCESS;
972 else
973 return BTM_NO_RESOURCES;
974
975}
976
977/*******************************************************************************
978**
979** Function BTM_CheckAdvData
980**
981** Description This function is called to get ADV data for a specific type.
982**
983** Parameters p_adv - pointer of ADV data
984** type - finding ADV data type
985** p_length - return the length of ADV data not including type
986**
987** Returns pointer of ADV data
988**
989*******************************************************************************/
990UINT8 *BTM_CheckAdvData( UINT8 *p_adv, UINT8 type, UINT8 *p_length)
991{
992 UINT8 *p = p_adv;
993 UINT8 length;
994 UINT8 adv_type;
995 BTM_TRACE_API1("BTM_CheckAdvData type=0x%02X", type);
996
997 STREAM_TO_UINT8(length, p);
998
999 while ( length && (p - p_adv <= BTM_BLE_CACHE_ADV_DATA_MAX))
1000 {
1001 STREAM_TO_UINT8(adv_type, p);
1002
1003 if ( adv_type == type )
1004 {
1005 /* length doesn't include itself */
1006 *p_length = length - 1; /* minus the length of type */
1007 return p;
1008 }
1009 p += length - 1; /* skip the length of data */
1010 STREAM_TO_UINT8(length, p);
1011 }
1012
1013 *p_length = 0;
1014 return NULL;
1015}
1016
1017/*******************************************************************************
1018**
1019** Function btm_ble_build_adv_data
1020**
1021** Description This function is called build the adv data and rsp data.
1022*******************************************************************************/
Wei Wanga6ce7752014-05-20 06:30:32 +00001023UINT8 *btm_ble_build_adv_data(tBTM_BLE_AD_MASK *p_data_mask, UINT8 **p_dst,
1024 tBTM_BLE_ADV_DATA *p_data)
The Android Open Source Project5738f832012-12-12 16:00:35 -08001025{
Wei Wanga6ce7752014-05-20 06:30:32 +00001026 UINT32 data_mask = *p_data_mask;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001027 UINT8 *p = *p_dst,
1028 *p_flag = NULL;
1029 UINT16 len = BTM_BLE_AD_DATA_LEN, cp_len = 0;
1030 UINT8 i = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001031 tBTM_BLE_PROP_ELEM *p_elem;
1032
1033 BTM_TRACE_EVENT0 (" btm_ble_build_adv_data");
1034
1035 /* build the adv data structure and build the data string */
1036 if (data_mask)
1037 {
1038 /* flags */
1039 if (data_mask & BTM_BLE_AD_BIT_FLAGS)
1040 {
Wei Wanga6ce7752014-05-20 06:30:32 +00001041 *p++ = MIN_ADV_LENGTH;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001042 *p++ = BTM_BLE_AD_TYPE_FLAG;
1043 p_flag = p;
1044 if (p_data)
1045 *p++ = p_data->flag;
1046 else
1047 *p++ = 0;
1048
1049 len -= 3;
1050
1051 data_mask &= ~BTM_BLE_AD_BIT_FLAGS;
1052 }
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001053 /* appearance data */
1054 if (len > 3 && data_mask & BTM_BLE_AD_BIT_APPEARANCE)
1055 {
1056 *p++ = 3; /* length */
1057 *p++ = BTM_BLE_AD_TYPE_APPEARANCE;
1058 UINT16_TO_STREAM(p, p_data->appearance);
1059 len -= 4;
1060
1061 data_mask &= ~BTM_BLE_AD_BIT_APPEARANCE;
1062 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001063 /* device name */
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001064#if BTM_MAX_LOC_BD_NAME_LEN > 0
Wei Wanga6ce7752014-05-20 06:30:32 +00001065 if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_DEV_NAME)
The Android Open Source Project5738f832012-12-12 16:00:35 -08001066 {
Wei Wanga6ce7752014-05-20 06:30:32 +00001067 if (strlen(btm_cb.cfg.bd_name) > (UINT16)(len - MIN_ADV_LENGTH))
The Android Open Source Project5738f832012-12-12 16:00:35 -08001068 {
Wei Wanga6ce7752014-05-20 06:30:32 +00001069 *p++ = len - MIN_ADV_LENGTH + 1;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001070 *p++ = BTM_BLE_AD_TYPE_NAME_SHORT;
Wei Wanga6ce7752014-05-20 06:30:32 +00001071 ARRAY_TO_STREAM(p, btm_cb.cfg.bd_name, len - MIN_ADV_LENGTH);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001072 }
1073 else
1074 {
1075 cp_len = (UINT16)strlen(btm_cb.cfg.bd_name);
1076 *p++ = cp_len + 1;
1077 *p++ = BTM_BLE_AD_TYPE_NAME_CMPL;
1078 ARRAY_TO_STREAM(p, btm_cb.cfg.bd_name, cp_len);
1079 }
Wei Wanga6ce7752014-05-20 06:30:32 +00001080 len -= (cp_len + MIN_ADV_LENGTH);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001081 data_mask &= ~BTM_BLE_AD_BIT_DEV_NAME;
1082 }
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001083#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -08001084 /* manufacturer data */
Wei Wanga6ce7752014-05-20 06:30:32 +00001085 if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_MANU &&
1086 p_data && p_data->p_manu &&
1087 p_data->p_manu->len != 0 && p_data->p_manu->p_val)
The Android Open Source Project5738f832012-12-12 16:00:35 -08001088 {
Wei Wanga6ce7752014-05-20 06:30:32 +00001089 if (p_data->p_manu->len > (len - MIN_ADV_LENGTH))
1090 cp_len = len - MIN_ADV_LENGTH;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001091 else
Wei Wanga6ce7752014-05-20 06:30:32 +00001092 cp_len = p_data->p_manu->len;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001093
1094 *p++ = cp_len + 1;
1095 *p++ = BTM_BLE_AD_TYPE_MANU;
Wei Wanga6ce7752014-05-20 06:30:32 +00001096 ARRAY_TO_STREAM(p, p_data->p_manu->p_val, cp_len);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001097
Wei Wanga6ce7752014-05-20 06:30:32 +00001098 len -= (cp_len + MIN_ADV_LENGTH);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001099 data_mask &= ~BTM_BLE_AD_BIT_MANU;
1100 }
1101 /* TX power */
Wei Wanga6ce7752014-05-20 06:30:32 +00001102 if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_TX_PWR)
The Android Open Source Project5738f832012-12-12 16:00:35 -08001103 {
Wei Wanga6ce7752014-05-20 06:30:32 +00001104 *p++ = MIN_ADV_LENGTH;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001105 *p++ = BTM_BLE_AD_TYPE_TX_PWR;
Wei Wanga6ce7752014-05-20 06:30:32 +00001106 *p++ = p_data->tx_power;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001107 len -= 3;
1108
1109 data_mask &= ~BTM_BLE_AD_BIT_TX_PWR;
1110 }
Wei Wanga6ce7752014-05-20 06:30:32 +00001111 /* 16 bits services */
1112 if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_SERVICE &&
1113 p_data && p_data->p_services &&
1114 p_data->p_services->num_service != 0 &&
1115 p_data->p_services->p_uuid)
The Android Open Source Project5738f832012-12-12 16:00:35 -08001116 {
Wei Wanga6ce7752014-05-20 06:30:32 +00001117 if (p_data->p_services->num_service * LEN_UUID_16 > (len - MIN_ADV_LENGTH))
The Android Open Source Project5738f832012-12-12 16:00:35 -08001118 {
Wei Wanga6ce7752014-05-20 06:30:32 +00001119 cp_len = (len - MIN_ADV_LENGTH)/LEN_UUID_16;
1120 *p ++ = 1 + cp_len * LEN_UUID_16;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001121 *p++ = BTM_BLE_AD_TYPE_16SRV_PART;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001122 }
1123 else
1124 {
Wei Wanga6ce7752014-05-20 06:30:32 +00001125 cp_len = p_data->p_services->num_service;
1126 *p++ = 1 + cp_len * LEN_UUID_16;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001127 *p++ = BTM_BLE_AD_TYPE_16SRV_CMPL;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001128 }
1129 for (i = 0; i < cp_len; i ++)
1130 {
Wei Wanga6ce7752014-05-20 06:30:32 +00001131 UINT16_TO_STREAM(p, *(p_data->p_services->p_uuid + i));
The Android Open Source Project5738f832012-12-12 16:00:35 -08001132 }
1133
Wei Wanga6ce7752014-05-20 06:30:32 +00001134 len -= (cp_len * MIN_ADV_LENGTH + MIN_ADV_LENGTH);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001135 data_mask &= ~BTM_BLE_AD_BIT_SERVICE;
1136 }
Wei Wanga6ce7752014-05-20 06:30:32 +00001137 /* 32 bits service uuid */
1138 if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_SERVICE_32 &&
1139 p_data && p_data->p_service_32b &&
1140 p_data->p_service_32b->num_service != 0 &&
1141 p_data->p_service_32b->p_uuid)
1142 {
1143 if ((p_data->p_service_32b->num_service * LEN_UUID_32) > (len - MIN_ADV_LENGTH))
1144 {
1145 cp_len = (len - MIN_ADV_LENGTH)/LEN_UUID_32;
1146 *p ++ = 1 + cp_len * LEN_UUID_32;
1147 *p++ = BTM_BLE_AD_TYPE_32SRV_PART;
1148 }
1149 else
1150 {
1151 cp_len = p_data->p_service_32b->num_service;
1152 *p++ = 1 + cp_len * LEN_UUID_32;
1153 *p++ = BTM_BLE_AD_TYPE_32SRV_CMPL;
1154 }
1155 for (i = 0; i < cp_len; i ++)
1156 {
1157 UINT32_TO_STREAM(p, *(p_data->p_service_32b->p_uuid + i));
1158 }
1159
1160 len -= (cp_len * LEN_UUID_32 + MIN_ADV_LENGTH);
1161 data_mask &= ~BTM_BLE_AD_BIT_SERVICE_32;
1162 }
1163 /* 128 bits services */
1164 if (len >= (MAX_UUID_SIZE + 2) && data_mask & BTM_BLE_AD_BIT_SERVICE_128 &&
1165 p_data && p_data->p_services_128b)
1166 {
1167 *p ++ = 1 + MAX_UUID_SIZE;
1168 if (!p_data->p_services_128b->list_cmpl)
1169 *p++ = BTM_BLE_AD_TYPE_128SRV_PART;
1170 else
1171 *p++ = BTM_BLE_AD_TYPE_128SRV_CMPL;
1172
1173 ARRAY_TO_STREAM(p, p_data->p_services_128b->uuid128, MAX_UUID_SIZE);
1174
1175 len -= (MAX_UUID_SIZE + MIN_ADV_LENGTH);
1176 data_mask &= ~BTM_BLE_AD_BIT_SERVICE_128;
1177 }
1178 /* 32 bits Service Solicitation UUIDs */
1179 if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_SERVICE_32SOL &&
1180 p_data && p_data->p_sol_service_32b &&
1181 p_data->p_sol_service_32b->num_service != 0 &&
1182 p_data->p_sol_service_32b->p_uuid)
1183 {
1184 if ((p_data->p_sol_service_32b->num_service * LEN_UUID_32) > (len - MIN_ADV_LENGTH))
1185 {
1186 cp_len = (len - MIN_ADV_LENGTH)/LEN_UUID_32;
1187 *p ++ = 1 + cp_len * LEN_UUID_32;
1188 }
1189 else
1190 {
1191 cp_len = p_data->p_sol_service_32b->num_service;
1192 *p++ = 1 + cp_len * LEN_UUID_32;
1193 }
1194
1195 *p++ = BTM_BLE_AD_TYPE_32SOL_SRV_UUID;
1196 for (i = 0; i < cp_len; i ++)
1197 {
1198 UINT32_TO_STREAM(p, *(p_data->p_sol_service_32b->p_uuid + i));
1199 }
1200
1201 len -= (cp_len * LEN_UUID_32 + MIN_ADV_LENGTH);
1202 data_mask &= ~BTM_BLE_AD_BIT_SERVICE_32SOL;
1203 }
1204 /* 128 bits Solicitation services UUID */
1205 if (len >= (MAX_UUID_SIZE + MIN_ADV_LENGTH) && data_mask & BTM_BLE_AD_BIT_SERVICE_128SOL &&
1206 p_data && p_data->p_sol_service_128b)
1207 {
1208 *p ++ = 1 + MAX_UUID_SIZE;
1209 *p++ = BTM_BLE_AD_TYPE_128SOL_SRV_UUID;
1210 ARRAY_TO_STREAM(p, p_data->p_sol_service_128b->uuid128, MAX_UUID_SIZE);
1211 len -= (MAX_UUID_SIZE + MIN_ADV_LENGTH);
1212 data_mask &= ~BTM_BLE_AD_BIT_SERVICE_128SOL;
1213 }
1214 /* 16bits/32bits/128bits Service Data */
1215 if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_SERVICE_DATA &&
1216 p_data && p_data->p_service_data->len != 0 && p_data->p_service_data->p_val)
1217 {
1218 if (len > (p_data->p_service_data->service_uuid.len + MIN_ADV_LENGTH))
1219 {
1220 if (p_data->p_service_data->len > (len - MIN_ADV_LENGTH))
1221 cp_len = len - MIN_ADV_LENGTH- p_data->p_service_data->service_uuid.len;
1222 else
1223 cp_len = p_data->p_service_data->len;
1224
1225 *p++ = cp_len + 1 + p_data->p_service_data->service_uuid.len;
1226 if (p_data->p_service_data->service_uuid.len == LEN_UUID_16)
1227 {
1228 *p++ = BTM_BLE_AD_TYPE_SERVICE_DATA;
1229 UINT16_TO_STREAM(p, p_data->p_service_data->service_uuid.uu.uuid16);
1230 }
1231 else if (p_data->p_service_data->service_uuid.len == LEN_UUID_32)
1232 {
1233 *p++ = BTM_BLE_AD_TYPE_32SERVICE_DATA;
1234 UINT32_TO_STREAM(p, p_data->p_service_data->service_uuid.uu.uuid32);
1235 }
1236 else
1237 {
1238 *p++ = BTM_BLE_AD_TYPE_128SERVICE_DATA;
1239 ARRAY_TO_STREAM(p, p_data->p_service_data->service_uuid.uu.uuid128,
1240 LEN_UUID_128);
1241 }
1242
1243 ARRAY_TO_STREAM(p, p_data->p_service_data->p_val, cp_len);
1244
1245 len -= (cp_len + MIN_ADV_LENGTH + p_data->p_service_data->service_uuid.len);
1246 data_mask &= ~BTM_BLE_AD_BIT_SERVICE_DATA;
1247 }
1248 else
1249 {
1250 BTM_TRACE_WARNING0("service data does not fit");
1251 }
1252 }
1253
The Android Open Source Project5738f832012-12-12 16:00:35 -08001254 if (len >= 6 && data_mask & BTM_BLE_AD_BIT_INT_RANGE &&
1255 p_data)
1256 {
1257 *p++ = 5;
1258 *p++ = BTM_BLE_AD_TYPE_INT_RANGE;
1259 UINT16_TO_STREAM(p, p_data->int_range.low);
1260 UINT16_TO_STREAM(p, p_data->int_range.hi);
1261 len -= 6;
1262 data_mask &= ~BTM_BLE_AD_BIT_INT_RANGE;
1263 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001264 if (data_mask & BTM_BLE_AD_BIT_PROPRIETARY && p_data && p_data->p_proprietary)
1265 {
1266 for (i = 0; i < p_data->p_proprietary->num_elem ; i ++)
1267 {
1268 p_elem = p_data->p_proprietary->p_elem + i;
1269
Wei Wanga6ce7752014-05-20 06:30:32 +00001270 if (len >= (MIN_ADV_LENGTH + p_elem->len))/* len byte(1) + ATTR type(1) + Uuid len(2)
1271 + value length */
The Android Open Source Project5738f832012-12-12 16:00:35 -08001272 {
1273 *p ++ = p_elem->len + 1; /* Uuid len + value length */
1274 *p ++ = p_elem->adv_type;
1275 ARRAY_TO_STREAM(p, p_elem->p_val, p_elem->len);
1276
Wei Wanga6ce7752014-05-20 06:30:32 +00001277 len -= (MIN_ADV_LENGTH + p_elem->len);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001278 }
1279 else
1280 {
1281 BTM_TRACE_WARNING0("data exceed max adv packet length");
1282 break;
1283 }
1284 }
1285 data_mask &= ~BTM_BLE_AD_BIT_PROPRIETARY;
1286 }
1287 }
1288
1289 *p_data_mask = data_mask;
1290 *p_dst = p;
1291
1292 return p_flag;
1293}
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001294/*******************************************************************************
1295**
1296** Function btm_ble_select_adv_interval
1297**
1298** Description select adv interval based on device mode
1299**
1300** Returns void
1301**
1302*******************************************************************************/
1303void btm_ble_select_adv_interval(tBTM_BLE_INQ_CB *p_cb, UINT8 evt_type, UINT16 *p_adv_int_min, UINT16 *p_adv_int_max)
1304{
1305 if (p_cb->adv_interval_min && p_cb->adv_interval_max)
1306 {
1307 *p_adv_int_min = p_cb->adv_interval_min;
1308 *p_adv_int_max = p_cb->adv_interval_max;
1309 }
1310 else
1311 {
1312 switch (evt_type)
1313 {
1314 case BTM_BLE_CONNECT_EVT:
1315 *p_adv_int_min = *p_adv_int_max = BTM_BLE_GAP_ADV_FAST_INT_1;
1316 break;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001317
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001318 case BTM_BLE_NON_CONNECT_EVT:
1319 case BTM_BLE_DISCOVER_EVT:
1320 *p_adv_int_min = *p_adv_int_max = BTM_BLE_GAP_ADV_FAST_INT_2;
1321 break;
1322 /* connectable directed event */
1323 case BTM_BLE_CONNECT_DIR_EVT:
1324 *p_adv_int_min = BTM_BLE_GAP_ADV_DIR_MIN_INT;
1325 *p_adv_int_max = BTM_BLE_GAP_ADV_DIR_MAX_INT;
1326 break;
1327
1328 default:
1329 *p_adv_int_min = *p_adv_int_max = BTM_BLE_GAP_ADV_SLOW_INT;
1330 break;
1331 }
1332 }
1333 return;
1334}
1335/*******************************************************************************
1336**
1337** Function btm_ble_set_adv_flag
1338**
1339** Description Set adv flag in adv data.
1340**
1341** Returns void
1342**
1343*******************************************************************************/
1344void btm_ble_set_adv_flag(UINT16 connect_mode, UINT16 disc_mode)
1345{
1346 UINT8 flag = 0, old_flag = 0;
1347 tBTM_BLE_LOCAL_ADV_DATA *p_adv_data = &btm_cb.ble_ctr_cb.inq_var.adv_data;
1348
1349 if (p_adv_data->p_flags != NULL)
1350 flag = old_flag = *(p_adv_data->p_flags);
1351
1352 /* BR/EDR non-discoverable , non-connectable */
1353 if ((disc_mode & BTM_DISCOVERABLE_MASK) == 0 &&
1354 (connect_mode & BTM_CONNECTABLE_MASK) == 0)
1355 flag |= BTM_BLE_BREDR_NOT_SPT;
1356 else
1357 flag &= ~BTM_BLE_BREDR_NOT_SPT;
1358
1359 /* if local controller support, mark both controller and host support in flag */
1360 if (HCI_SIMUL_LE_BREDR_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_0]))
1361 flag |= (BTM_BLE_DMT_CONTROLLER_SPT|BTM_BLE_DMT_HOST_SPT);
1362 else
1363 flag &= ~(BTM_BLE_DMT_CONTROLLER_SPT|BTM_BLE_DMT_HOST_SPT);
1364
1365 BTM_TRACE_ERROR1("disc_mode %04x", disc_mode);
1366 /* update discoverable flag */
1367 if (disc_mode & BTM_BLE_LIMITED_DISCOVERABLE)
1368 {
1369 flag &= ~BTM_BLE_GEN_DISC_FLAG;
1370 flag |= BTM_BLE_LIMIT_DISC_FLAG ;
1371 }
1372 else if (disc_mode & BTM_BLE_GENERAL_DISCOVERABLE)
1373 {
1374 flag |= BTM_BLE_GEN_DISC_FLAG;
1375 flag &= ~BTM_BLE_LIMIT_DISC_FLAG;
1376 }
1377 else /* remove all discoverable flags */
1378 {
1379 flag &= ~(BTM_BLE_LIMIT_DISC_FLAG|BTM_BLE_GEN_DISC_FLAG);
1380 }
1381
1382 if (flag != old_flag)
1383 {
1384 btm_ble_update_adv_flag(flag);
1385 }
1386}
The Android Open Source Project5738f832012-12-12 16:00:35 -08001387/*******************************************************************************
1388**
1389** Function btm_ble_set_discoverability
1390**
1391** Description This function is called to set BLE discoverable mode.
1392**
Wei Wanga6ce7752014-05-20 06:30:32 +00001393** Parameters: combined_mode: discoverability mode.
The Android Open Source Project5738f832012-12-12 16:00:35 -08001394**
Wei Wanga6ce7752014-05-20 06:30:32 +00001395** Returns BTM_SUCCESS is status set successfully; otherwise failure.
The Android Open Source Project5738f832012-12-12 16:00:35 -08001396**
1397*******************************************************************************/
1398tBTM_STATUS btm_ble_set_discoverability(UINT16 combined_mode)
1399{
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001400 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 -08001401 tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
1402 UINT16 mode = (combined_mode & BTM_BLE_DISCOVERABLE_MASK);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001403 UINT8 new_mode = BTM_BLE_ADV_ENABLE;
1404 UINT8 evt_type = (p_cb->connectable_mode == BTM_BLE_NON_CONNECTABLE) ? \
1405 ((p_cb->scan_rsp) ? BTM_BLE_DISCOVER_EVT : BTM_BLE_NON_CONNECT_EVT )\
1406 : BTM_BLE_CONNECT_EVT;
1407 tBTM_STATUS status = BTM_SUCCESS;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001408 BD_ADDR p_addr_ptr= {0};
1409 tBLE_ADDR_TYPE init_addr_type = BLE_ADDR_PUBLIC,
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001410 own_addr_type = p_addr_cb->own_addr_type;
1411 UINT16 adv_int_min, adv_int_max;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001412
1413 BTM_TRACE_EVENT2 ("btm_ble_set_discoverability mode=0x%0x combined_mode=0x%x", mode, combined_mode);
1414
1415 /*** Check mode parameter ***/
1416 if (mode > BTM_BLE_MAX_DISCOVERABLE)
1417 return(BTM_ILLEGAL_VALUE);
1418
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001419 btm_ble_set_adv_flag (btm_cb.btm_inq_vars.connectable_mode, combined_mode);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001420
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001421 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 -08001422
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001423 if (p_cb->connectable_mode == BTM_BLE_NON_CONNECTABLE && mode == BTM_BLE_NON_DISCOVERABLE)
1424 new_mode = BTM_BLE_ADV_DISABLE;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001425
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001426 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 -08001427
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001428 btu_stop_timer(&p_cb->fast_adv_timer);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001429
1430 /* update adv params if start advertising */
1431 BTM_TRACE_EVENT2 ("evt_type=0x%x p-cb->evt_type=0x%x ", evt_type, p_cb->evt_type);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001432
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001433 if (new_mode == BTM_BLE_ADV_ENABLE &&
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001434 (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 -08001435 {
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001436 btm_ble_stop_adv();
The Android Open Source Project5738f832012-12-12 16:00:35 -08001437
1438 /* update adv params */
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001439 if (!btsnd_hcic_ble_write_adv_params (adv_int_min,
1440 adv_int_max,
The Android Open Source Project5738f832012-12-12 16:00:35 -08001441 evt_type,
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001442 own_addr_type,
1443 init_addr_type,
1444 p_addr_ptr,
The Android Open Source Project5738f832012-12-12 16:00:35 -08001445 p_cb->adv_chnl_map,
1446 p_cb->afp))
1447
1448 status = BTM_NO_RESOURCES;
1449 else
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001450 {
The Android Open Source Project5738f832012-12-12 16:00:35 -08001451 p_cb->evt_type = evt_type;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001452 p_cb->adv_addr_type = own_addr_type;
1453 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001454
1455 }
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001456
The Android Open Source Project5738f832012-12-12 16:00:35 -08001457 if (status == BTM_SUCCESS && p_cb->adv_mode != new_mode)
1458 {
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001459 if (new_mode == BTM_BLE_ADV_ENABLE)
1460 status = btm_ble_start_adv();
The Android Open Source Project5738f832012-12-12 16:00:35 -08001461 else
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001462 status = btm_ble_stop_adv();
The Android Open Source Project5738f832012-12-12 16:00:35 -08001463 }
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001464 if (p_cb->adv_mode == BTM_BLE_ADV_ENABLE)
1465 {
1466 p_cb->fast_adv_on = TRUE;
1467 /* start initial GAP mode adv timer */
1468 btu_start_timer (&p_cb->fast_adv_timer, BTU_TTYPE_BLE_GAP_FAST_ADV,
1469 BTM_BLE_GAP_FAST_ADV_TOUT);
1470 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001471
1472 /* set up stop advertising timer */
1473 if (status == BTM_SUCCESS && mode == BTM_BLE_LIMITED_DISCOVERABLE)
1474 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001475 BTM_TRACE_EVENT1 ("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 -08001476 /* start Tgap(lim_timeout) */
1477 btu_start_timer (&p_cb->inq_timer_ent, BTU_TTYPE_BLE_GAP_LIM_DISC,
1478 BTM_BLE_GAP_LIM_TOUT);
1479 }
1480 return status;
1481}
1482
1483/*******************************************************************************
1484**
1485** Function btm_ble_set_connectability
1486**
1487** Description This function is called to set BLE connectability mode.
1488**
Wei Wanga6ce7752014-05-20 06:30:32 +00001489** Parameters: combined_mode: connectability mode.
The Android Open Source Project5738f832012-12-12 16:00:35 -08001490**
Wei Wanga6ce7752014-05-20 06:30:32 +00001491** Returns BTM_SUCCESS is status set successfully; otherwise failure.
The Android Open Source Project5738f832012-12-12 16:00:35 -08001492**
1493*******************************************************************************/
1494tBTM_STATUS btm_ble_set_connectability(UINT16 combined_mode)
1495{
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001496 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 -08001497 tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
1498 UINT16 mode = (combined_mode & BTM_BLE_CONNECTABLE_MASK);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001499 UINT8 new_mode = BTM_BLE_ADV_ENABLE;
1500 UINT8 evt_type = (p_cb->scan_rsp) ? BTM_BLE_DISCOVER_EVT: BTM_BLE_NON_CONNECT_EVT;
1501 tBTM_STATUS status = BTM_SUCCESS;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001502 BD_ADDR p_addr_ptr = {0};
1503 tBLE_ADDR_TYPE init_addr_type = BLE_ADDR_PUBLIC,
1504 own_addr_type = p_addr_cb->own_addr_type;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001505 UINT16 adv_int_min, adv_int_max;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001506
1507 BTM_TRACE_EVENT2 ("btm_ble_set_connectability mode=0x%0x combined_mode=0x%x", mode, combined_mode);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001508
The Android Open Source Project5738f832012-12-12 16:00:35 -08001509 /*** Check mode parameter ***/
1510 if (mode > BTM_BLE_MAX_CONNECTABLE)
1511 return(BTM_ILLEGAL_VALUE);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001512
The Android Open Source Project5738f832012-12-12 16:00:35 -08001513 p_cb->connectable_mode = mode;
1514
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001515 btm_ble_set_adv_flag (combined_mode, btm_cb.btm_inq_vars.discoverable_mode);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001516
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001517 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 -08001518
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001519 if (mode == BTM_BLE_NON_CONNECTABLE && p_cb->discoverable_mode == BTM_BLE_NON_DISCOVERABLE)
1520 new_mode = BTM_BLE_ADV_DISABLE;
1521
1522 btm_ble_select_adv_interval(p_cb, evt_type, &adv_int_min, &adv_int_max);
1523
1524 btu_stop_timer(&p_cb->fast_adv_timer);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001525 /* update adv params if needed */
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001526 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 -08001527 {
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001528 btm_ble_stop_adv();
The Android Open Source Project5738f832012-12-12 16:00:35 -08001529
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001530 if (!btsnd_hcic_ble_write_adv_params (adv_int_min,
1531 adv_int_max,
The Android Open Source Project5738f832012-12-12 16:00:35 -08001532 evt_type,
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001533 own_addr_type,
1534 init_addr_type,
1535 p_addr_ptr,
The Android Open Source Project5738f832012-12-12 16:00:35 -08001536 p_cb->adv_chnl_map,
1537 p_cb->afp))
1538 status = BTM_NO_RESOURCES;
1539 else
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001540 {
The Android Open Source Project5738f832012-12-12 16:00:35 -08001541 p_cb->evt_type = evt_type;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001542 p_cb->adv_addr_type = own_addr_type;
1543 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001544 }
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001545
The Android Open Source Project5738f832012-12-12 16:00:35 -08001546 /* update advertising mode */
1547 if (status == BTM_SUCCESS && new_mode != p_cb->adv_mode)
1548 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001549 if (new_mode == BTM_BLE_ADV_ENABLE)
1550 status = btm_ble_start_adv();
1551 else
1552 status = btm_ble_stop_adv();
The Android Open Source Project5738f832012-12-12 16:00:35 -08001553 }
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001554 if (p_cb->adv_mode == BTM_BLE_ADV_ENABLE)
1555 {
1556 p_cb->fast_adv_on = TRUE;
1557 /* start initial GAP mode adv timer */
1558 btu_start_timer (&p_cb->fast_adv_timer, BTU_TTYPE_BLE_GAP_FAST_ADV,
1559 BTM_BLE_GAP_FAST_ADV_TOUT);
1560 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001561 return status;
1562}
1563
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001564
The Android Open Source Project5738f832012-12-12 16:00:35 -08001565/*******************************************************************************
1566**
1567** Function btm_ble_start_inquiry
1568**
1569** Description This function is called to start BLE inquiry procedure.
1570** If the duration is zero, the periodic inquiry mode is cancelled.
1571**
1572** Parameters: mode - GENERAL or LIMITED inquiry
1573** p_inq_params - pointer to the BLE inquiry parameter.
1574** p_results_cb - callback returning pointer to results (tBTM_INQ_RESULTS)
1575** p_cmpl_cb - callback indicating the end of an inquiry
1576**
1577**
1578**
1579** Returns BTM_CMD_STARTED if successfully started
The Android Open Source Project5738f832012-12-12 16:00:35 -08001580** BTM_NO_RESOURCES if could not allocate a message buffer
The Android Open Source Project5738f832012-12-12 16:00:35 -08001581** BTM_BUSY - if an inquiry is already active
The Android Open Source Project5738f832012-12-12 16:00:35 -08001582**
1583*******************************************************************************/
1584tBTM_STATUS btm_ble_start_inquiry (UINT8 mode, UINT8 duration)
1585{
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001586 tBTM_STATUS status = BTM_CMD_STARTED;
1587 tBTM_BLE_CB *p_ble_cb = &btm_cb.ble_ctr_cb;
1588 tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001589
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001590 BTM_TRACE_DEBUG2("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 -08001591
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001592 /* if selective connection is active, or inquiry is already active, reject it */
1593 if (BTM_BLE_IS_INQ_ACTIVE(p_ble_cb->scan_activity) ||
1594 BTM_BLE_IS_SEL_CONN_ACTIVE (p_ble_cb->scan_activity))
The Android Open Source Project5738f832012-12-12 16:00:35 -08001595 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001596 BTM_TRACE_ERROR0("LE Inquiry is active, can not start inquiry");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001597 return(BTM_BUSY);
1598 }
1599
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001600 if (!BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity))
The Android Open Source Project5738f832012-12-12 16:00:35 -08001601 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001602 btm_update_scanner_filter_policy(SP_ADV_ALL);
Wei Wanged534e32014-05-20 06:30:13 +00001603
1604#if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
1605#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
1606 /* enable IRK list */
1607 btm_ble_vendor_irk_list_known_dev (TRUE);
1608#endif
1609#endif
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001610 status = btm_ble_start_scan(BTM_BLE_DUPLICATE_DISABLE);
1611 }
1612
1613 if (status == BTM_CMD_STARTED)
1614 {
1615 p_inq->inq_active |= mode;
1616 p_ble_cb->scan_activity |= mode;
1617
1618 BTM_TRACE_DEBUG1("btm_ble_start_inquiry inq_active = 0x%02x", p_inq->inq_active);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001619
1620 if (duration != 0)
1621 {
1622 /* start inquiry timer */
1623 btu_start_timer (&p_inq->inq_timer_ent, BTU_TTYPE_BLE_INQUIRY, duration);
1624 }
1625 }
1626
1627 return status;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001628
The Android Open Source Project5738f832012-12-12 16:00:35 -08001629}
1630
1631/*******************************************************************************
1632**
1633** Function btm_ble_read_remote_name_cmpl
1634**
1635** Description This function is called when BLE remote name is received.
1636**
1637** Returns void
1638**
1639*******************************************************************************/
1640void btm_ble_read_remote_name_cmpl(BOOLEAN status, BD_ADDR bda, UINT16 length, char *p_name)
1641{
1642 UINT8 hci_status = HCI_SUCCESS;
1643 BD_NAME bd_name;
1644
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001645 memset(bd_name, 0, (BD_NAME_LEN + 1));
Zhihai Xu7f9bcf82014-01-15 15:49:21 -08001646 if (length > BD_NAME_LEN)
1647 {
1648 length = BD_NAME_LEN;
1649 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001650 memcpy((UINT8*)bd_name, p_name, length);
1651
1652 if ((!status) || (length==0))
1653 {
1654 hci_status = HCI_ERR_HOST_TIMEOUT;
1655 }
1656
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001657 btm_process_remote_name(bda, bd_name, length +1, hci_status);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001658 btm_sec_rmt_name_request_complete (bda, (UINT8 *)p_name, hci_status);
1659}
1660
1661/*******************************************************************************
1662**
1663** Function btm_ble_read_remote_name
1664**
1665** Description This function read remote LE device name using GATT read
1666** procedure.
1667**
1668** Parameters: None.
1669**
1670** Returns void
1671**
1672*******************************************************************************/
1673tBTM_STATUS btm_ble_read_remote_name(BD_ADDR remote_bda, tBTM_INQ_INFO *p_cur, tBTM_CMPL_CB *p_cb)
1674{
1675 tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
1676
Andre Eisenbach3aa60542013-03-22 18:00:51 -07001677 if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
1678 return BTM_ERR_PROCESSING;
1679
The Android Open Source Project5738f832012-12-12 16:00:35 -08001680 if (p_cur &&
1681 p_cur->results.ble_evt_type != BTM_BLE_EVT_CONN_ADV &&
1682 p_cur->results.ble_evt_type != BTM_BLE_EVT_CONN_DIR_ADV)
1683 {
1684 BTM_TRACE_DEBUG0("name request to non-connectable device failed.");
1685 return BTM_ERR_PROCESSING;
1686 }
1687
1688 /* read remote device name using GATT procedure */
1689 if (p_inq->remname_active)
1690 return BTM_BUSY;
1691
1692 if (!GAP_BleReadPeerDevName(remote_bda, btm_ble_read_remote_name_cmpl))
1693 return BTM_BUSY;
1694
1695 p_inq->p_remname_cmpl_cb = p_cb;
1696 p_inq->remname_active = TRUE;
1697
1698 memcpy(p_inq->remname_bda, remote_bda, BD_ADDR_LEN);
1699
1700 btu_start_timer (&p_inq->rmt_name_timer_ent,
1701 BTU_TTYPE_BTM_RMT_NAME,
1702 BTM_EXT_BLE_RMT_NAME_TIMEOUT);
1703
1704 return BTM_CMD_STARTED;
1705}
1706
1707/*******************************************************************************
1708**
1709** Function btm_ble_cancel_remote_name
1710**
1711** Description This function cancel read remote LE device name.
1712**
1713** Parameters: None.
1714**
1715** Returns void
1716**
1717*******************************************************************************/
1718BOOLEAN btm_ble_cancel_remote_name(BD_ADDR remote_bda)
1719{
1720 tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
1721 BOOLEAN status;
1722
1723 status = GAP_BleCancelReadPeerDevName(remote_bda);
1724
1725 p_inq->remname_active = FALSE;
1726 memset(p_inq->remname_bda, 0, BD_ADDR_LEN);
1727 btu_stop_timer(&p_inq->rmt_name_timer_ent);
1728
1729 return status;
1730}
1731
1732/*******************************************************************************
1733**
1734** Function btm_ble_update_adv_flag
1735**
1736** Description This function update the limited discoverable flag in the adv
1737** data.
1738**
1739** Parameters: None.
1740**
1741** Returns void
1742**
1743*******************************************************************************/
1744static void btm_ble_update_adv_flag(UINT8 flag)
1745{
1746 tBTM_BLE_LOCAL_ADV_DATA *p_adv_data = &btm_cb.ble_ctr_cb.inq_var.adv_data;
1747 UINT8 *p;
1748
1749 BTM_TRACE_DEBUG1 ("btm_ble_update_adv_flag new=0x%x", flag);
1750
1751 if (p_adv_data->p_flags != NULL)
1752 {
1753 BTM_TRACE_DEBUG1 ("btm_ble_update_adv_flag old=0x%x", *p_adv_data->p_flags);
1754 *p_adv_data->p_flags = flag;
1755 }
1756 else /* no FLAGS in ADV data*/
1757 {
1758 p = (p_adv_data->p_pad == NULL) ? p_adv_data->ad_data : p_adv_data->p_pad;
1759 /* need 3 bytes space to stuff in the flags, if not */
1760 /* erase all written data, just for flags */
1761 if ((BTM_BLE_AD_DATA_LEN - (p - p_adv_data->ad_data)) < 3)
1762 {
1763 p = p_adv_data->p_pad = p_adv_data->ad_data;
1764 memset(p_adv_data->ad_data, 0, BTM_BLE_AD_DATA_LEN);
1765 }
1766
1767 *p++ = 2;
1768 *p++ = BTM_BLE_AD_TYPE_FLAG;
1769 p_adv_data->p_flags = p;
1770 *p++ = flag;
1771 p_adv_data->p_pad = p;
1772 }
1773
1774 if (btsnd_hcic_ble_set_adv_data((UINT8)(p_adv_data->p_pad - p_adv_data->ad_data),
1775 p_adv_data->ad_data))
1776 p_adv_data->data_mask |= BTM_BLE_AD_BIT_FLAGS;
1777
1778}
1779
1780#if 0
1781/*******************************************************************************
1782**
1783** Function btm_ble_parse_adv_data
1784**
1785** Description This function parse the adv data into a structure.
1786**
1787** Returns pointer to entry, or NULL if not found
1788**
1789*******************************************************************************/
1790static void btm_ble_parse_adv_data(tBTM_INQ_INFO *p_info, UINT8 *p_data,
1791 UINT8 len, tBTM_BLE_INQ_DATA *p_adv_data, UINT8 *p_buf)
1792{
1793 UINT8 *p_cur = p_data;
1794 UINT8 ad_len, ad_type, ad_flag;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001795
1796 BTM_TRACE_EVENT0 (" btm_ble_parse_adv_data");
1797
1798 while (len > 0)
1799 {
1800 BTM_TRACE_DEBUG1("btm_ble_parse_adv_data: len = %d", len);
1801 if ((ad_len = *p_cur ++) == 0)
1802 break;
1803
1804 ad_type = *p_cur ++;
1805
1806 BTM_TRACE_DEBUG2(" ad_type = %02x ad_len = %d", ad_type, ad_len);
1807
1808 switch (ad_type)
1809 {
1810 case BTM_BLE_AD_TYPE_NAME_SHORT:
1811
1812 case BTM_BLE_AD_TYPE_NAME_CMPL:
1813 p_adv_data->ad_mask |= BTM_BLE_AD_BIT_DEV_NAME;
1814 if (p_info)
1815 {
1816 p_info->remote_name_type =(ad_type == BTM_BLE_AD_TYPE_NAME_SHORT) ?
1817 BTM_BLE_NAME_SHORT: BTM_BLE_NAME_CMPL;
1818 memcpy(p_info->remote_name, p_cur, ad_len -1);
1819 p_info->remote_name[ad_len] = 0;
1820 p_adv_data->p_remote_name = p_info->remote_name;
1821 p_info->remote_name_len = p_adv_data->remote_name_len = ad_len - 1;
1822 BTM_TRACE_DEBUG1("BTM_BLE_AD_TYPE_NAME name = %s",p_adv_data->p_remote_name);
1823 }
1824 p_cur += (ad_len -1);
1825
1826 break;
1827
1828 case BTM_BLE_AD_TYPE_FLAG:
1829 p_adv_data->ad_mask |= BTM_BLE_AD_BIT_FLAGS;
1830 ad_flag = *p_cur ++;
1831 p_adv_data->flag = (UINT8)(ad_flag & BTM_BLE_ADV_FLAG_MASK) ;
1832 BTM_TRACE_DEBUG3("BTM_BLE_AD_TYPE_FLAG flag = %s | %s | %s",
1833 (p_adv_data->flag & BTM_BLE_LIMIT_DISC_FLAG)? "LE_LIMIT_DISC" : "",
1834 (p_adv_data->flag & BTM_BLE_GEN_DISC_FLAG)? "LE_GENERAL_DISC" : "",
1835 (p_adv_data->flag & BTM_BLE_BREDR_NOT_SPT)? "LE Only device" : "");
1836 break;
1837
1838 case BTM_BLE_AD_TYPE_TX_PWR:
1839 p_adv_data->ad_mask |= BTM_BLE_AD_BIT_TX_PWR;
1840 p_adv_data->tx_power_level = (INT8)*p_cur ++;
1841 BTM_TRACE_DEBUG1("BTM_BLE_AD_TYPE_TX_PWR tx_level = %d", p_adv_data->tx_power_level);
1842 break;
1843
The Android Open Source Project5738f832012-12-12 16:00:35 -08001844 case BTM_BLE_AD_TYPE_MANU:
1845
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001846 case BTM_BLE_AD_TYPE_16SRV_PART:
1847 case BTM_BLE_AD_TYPE_16SRV_CMPL:
1848 p_adv_data->ad_mask |= BTM_BLE_AD_BIT_SERVICE;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001849 /* need allocate memory to store UUID list */
1850 p_adv_data->service.num_service = (ad_len - 1)/2;
1851 BTM_TRACE_DEBUG1("service UUID list, num = %d", p_adv_data->service.num_service);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001852 p_cur += (ad_len - 1);
1853 break;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001854
1855 case BTM_BLE_AD_TYPE_SOL_SRV_UUID:
1856 p_adv_data->ad_mask |= BTM_BLE_AD_BIT_SERVICE_SOL;
1857 /* need allocate memory to store UUID list */
1858 p_adv_data->service.num_service = (ad_len - 1)/2;
1859 BTM_TRACE_DEBUG1("service UUID list, num = %d", p_adv_data->service.num_service);
1860 p_cur += (ad_len - 1);
1861 break;
1862
1863 case BTM_BLE_AD_TYPE_128SOL_SRV_UUID:
1864 p_adv_data->ad_mask |= BTM_BLE_AD_BIT_SERVICE_128SOL;
1865 /* need allocate memory to store UUID list */
1866 p_adv_data->service.num_service = (ad_len - 1)/16;
1867 BTM_TRACE_DEBUG1("service UUID list, num = %d", p_adv_data->service.num_service);
1868 p_cur += (ad_len - 1);
1869 break;
1870
1871 case BTM_BLE_AD_TYPE_APPEARANCE:
1872 case BTM_BLE_AD_TYPE_PUBLIC_TARGET:
1873 case BTM_BLE_AD_TYPE_RANDOM_TARGET:
1874 default:
1875 break;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001876 }
1877 len -= (ad_len + 1);
1878 }
1879}
1880#endif
1881
1882/*******************************************************************************
1883**
1884** Function btm_ble_cache_adv_data
1885**
1886** Description Update advertising cache data.
1887**
1888** Returns void
1889**
1890*******************************************************************************/
1891void btm_ble_cache_adv_data(tBTM_INQ_RESULTS *p_cur, UINT8 data_len, UINT8 *p, UINT8 evt_type)
1892{
1893 tBTM_BLE_INQ_CB *p_le_inq_cb = &btm_cb.ble_ctr_cb.inq_var;
1894 UINT8 *p_cache;
1895 UINT8 length;
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08001896 UNUSED(p_cur);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001897
1898 /* cache adv report/scan response data */
1899 if (evt_type != BTM_BLE_SCAN_RSP_EVT)
1900 {
1901 p_le_inq_cb->adv_len = 0;
1902 memset(p_le_inq_cb->adv_data_cache, 0, BTM_BLE_CACHE_ADV_DATA_MAX);
1903 }
1904
1905 if (data_len > 0)
1906 {
1907 p_cache = &p_le_inq_cb->adv_data_cache[p_le_inq_cb->adv_len];
1908 STREAM_TO_UINT8(length, p);
1909 while ( length && ((p_le_inq_cb->adv_len + length + 1) <= BTM_BLE_CACHE_ADV_DATA_MAX))
1910 {
1911 /* copy from the length byte & data into cache */
1912 memcpy(p_cache, p-1, length+1);
1913 /* advance the cache pointer past data */
1914 p_cache += length+1;
1915 /* increment cache length */
1916 p_le_inq_cb->adv_len += length+1;
1917 /* skip the length of data */
1918 p += length;
1919 STREAM_TO_UINT8(length, p);
1920 }
1921 }
1922
1923 /* parse service UUID from adv packet and save it in inq db eir_uuid */
1924 /* TODO */
1925}
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001926
The Android Open Source Project5738f832012-12-12 16:00:35 -08001927/*******************************************************************************
1928**
1929** Function btm_ble_is_discoverable
1930**
1931** Description check ADV flag to make sure device is discoverable and match
1932** the search condition
1933**
1934** Parameters
1935**
1936** Returns void
1937**
1938*******************************************************************************/
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001939UINT8 btm_ble_is_discoverable(BD_ADDR bda, UINT8 evt_type, UINT8 *p)
The Android Open Source Project5738f832012-12-12 16:00:35 -08001940{
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001941 UINT8 *p_flag, flag = 0, rt = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001942 UINT8 data_len;
1943 tBTM_INQ_PARMS *p_cond = &btm_cb.btm_inq_vars.inqparms;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001944 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 -08001945
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001946 UNUSED(p);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001947
1948 /* for observer, always "discoverable */
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001949 if (BTM_BLE_IS_OBS_ACTIVE(btm_cb.ble_ctr_cb.scan_activity))
1950 rt |= BTM_BLE_OBS_RESULT;
1951
1952 if (BTM_BLE_IS_SEL_CONN_ACTIVE(btm_cb.ble_ctr_cb.scan_activity) &&
1953 (evt_type == BTM_BLE_CONNECT_EVT || evt_type == BTM_BLE_CONNECT_DIR_EVT))
1954 rt |= BTM_BLE_SEL_CONN_RESULT;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001955
1956 /* does not match filter condition */
1957 if (p_cond->filter_cond_type == BTM_FILTER_COND_BD_ADDR &&
1958 memcmp(bda, p_cond->filter_cond.bdaddr_cond, BD_ADDR_LEN) != 0)
1959 {
1960 BTM_TRACE_DEBUG0("BD ADDR does not meet filter condition");
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001961 return rt;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001962 }
1963
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001964 if (p_le_inq_cb->adv_len != 0)
The Android Open Source Project5738f832012-12-12 16:00:35 -08001965 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001966 if ((p_flag = BTM_CheckAdvData(p_le_inq_cb->adv_data_cache,
1967 BTM_BLE_AD_TYPE_FLAG, &data_len)) != NULL)
The Android Open Source Project5738f832012-12-12 16:00:35 -08001968 {
1969 flag = * p_flag;
1970
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001971 if ((btm_cb.btm_inq_vars.inq_active & BTM_BLE_GENERAL_INQUIRY) &&
The Android Open Source Project5738f832012-12-12 16:00:35 -08001972 (flag & (BTM_BLE_LIMIT_DISC_FLAG|BTM_BLE_GEN_DISC_FLAG)) != 0)
1973 {
1974 BTM_TRACE_DEBUG0("Find Generable Discoverable device");
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001975 rt |= BTM_BLE_INQ_RESULT;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001976 }
1977
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001978 else if (btm_cb.btm_inq_vars.inq_active & BTM_BLE_LIMITED_INQUIRY &&
The Android Open Source Project5738f832012-12-12 16:00:35 -08001979 (flag & BTM_BLE_LIMIT_DISC_FLAG) != 0)
1980 {
1981 BTM_TRACE_DEBUG0("Find limited discoverable device");
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001982 rt |= BTM_BLE_INQ_RESULT;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001983 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001984 }
1985 }
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07001986 return rt;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001987}
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08001988
Adam Hampsone6c74502014-05-30 15:07:08 -07001989static void btm_ble_appearance_to_cod(UINT16 appearance, UINT8 *dev_class)
1990{
1991 dev_class[0] = 0;
1992
1993 switch (appearance)
1994 {
1995 case BTM_BLE_APPEARANCE_GENERIC_PHONE:
1996 dev_class[1] = BTM_COD_MAJOR_PHONE;
1997 dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED;
1998 break;
1999 case BTM_BLE_APPEARANCE_GENERIC_COMPUTER:
2000 dev_class[1] = BTM_COD_MAJOR_COMPUTER;
2001 dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED;
2002 break;
2003 case BTM_BLE_APPEARANCE_GENERIC_REMOTE:
2004 dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
2005 dev_class[2] = BTM_COD_MINOR_REMOTE_CONTROL;
2006 break;
2007 case BTM_BLE_APPEARANCE_GENERIC_THERMOMETER:
2008 case BTM_BLE_APPEARANCE_THERMOMETER_EAR:
2009 dev_class[1] = BTM_COD_MAJOR_HEALTH;
2010 dev_class[2] = BTM_COD_MINOR_THERMOMETER;
2011 break;
2012 case BTM_BLE_APPEARANCE_GENERIC_HEART_RATE:
2013 case BTM_BLE_APPEARANCE_HEART_RATE_BELT:
2014 dev_class[1] = BTM_COD_MAJOR_HEALTH;
2015 dev_class[2] = BTM_COD_MINOR_HEART_PULSE_MONITOR;
2016 break;
2017 case BTM_BLE_APPEARANCE_GENERIC_BLOOD_PRESSURE:
2018 case BTM_BLE_APPEARANCE_BLOOD_PRESSURE_ARM:
2019 case BTM_BLE_APPEARANCE_BLOOD_PRESSURE_WRIST:
2020 dev_class[1] = BTM_COD_MAJOR_HEALTH;
2021 dev_class[2] = BTM_COD_MINOR_BLOOD_MONITOR;
2022 break;
2023 case BTM_BLE_APPEARANCE_GENERIC_PULSE_OXIMETER:
2024 case BTM_BLE_APPEARANCE_PULSE_OXIMETER_FINGERTIP:
2025 case BTM_BLE_APPEARANCE_PULSE_OXIMETER_WRIST:
2026 dev_class[1] = BTM_COD_MAJOR_HEALTH;
2027 dev_class[2] = BTM_COD_MINOR_PULSE_OXIMETER;
2028 break;
2029 case BTM_BLE_APPEARANCE_GENERIC_GLUCOSE:
2030 dev_class[1] = BTM_COD_MAJOR_HEALTH;
2031 dev_class[2] = BTM_COD_MINOR_GLUCOSE_METER;
2032 break;
2033 case BTM_BLE_APPEARANCE_GENERIC_WEIGHT:
2034 dev_class[1] = BTM_COD_MAJOR_HEALTH;
2035 dev_class[2] = BTM_COD_MINOR_WEIGHING_SCALE;
2036 break;
2037 case BTM_BLE_APPEARANCE_GENERIC_WALKING:
2038 case BTM_BLE_APPEARANCE_WALKING_IN_SHOE:
2039 case BTM_BLE_APPEARANCE_WALKING_ON_SHOE:
2040 case BTM_BLE_APPEARANCE_WALKING_ON_HIP:
2041 dev_class[1] = BTM_COD_MAJOR_HEALTH;
2042 dev_class[2] = BTM_COD_MINOR_STEP_COUNTER;
2043 break;
2044 case BTM_BLE_APPEARANCE_GENERIC_WATCH:
2045 case BTM_BLE_APPEARANCE_SPORTS_WATCH:
2046 dev_class[1] = BTM_COD_MAJOR_WEARABLE;
2047 dev_class[2] = BTM_COD_MINOR_WRIST_WATCH;
2048 break;
2049 case BTM_BLE_APPEARANCE_GENERIC_EYEGLASSES:
2050 dev_class[1] = BTM_COD_MAJOR_WEARABLE;
2051 dev_class[2] = BTM_COD_MINOR_GLASSES;
2052 break;
2053 case BTM_BLE_APPEARANCE_GENERIC_DISPLAY:
2054 dev_class[1] = BTM_COD_MAJOR_IMAGING;
2055 dev_class[2] = BTM_COD_MINOR_DISPLAY;
2056 break;
2057 case BTM_BLE_APPEARANCE_GENERIC_MEDIA_PLAYER:
2058 dev_class[1] = BTM_COD_MAJOR_AUDIO;
2059 dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED;
2060 break;
2061 case BTM_BLE_APPEARANCE_GENERIC_BARCODE_SCANNER:
2062 case BTM_BLE_APPEARANCE_HID_BARCODE_SCANNER:
2063 case BTM_BLE_APPEARANCE_GENERIC_HID:
2064 dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
2065 dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED;
2066 break;
2067 case BTM_BLE_APPEARANCE_HID_KEYBOARD:
2068 dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
2069 dev_class[2] = BTM_COD_MINOR_KEYBOARD;
2070 break;
2071 case BTM_BLE_APPEARANCE_HID_MOUSE:
2072 dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
2073 dev_class[2] = BTM_COD_MINOR_POINTING;
2074 break;
2075 case BTM_BLE_APPEARANCE_HID_JOYSTICK:
2076 dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
2077 dev_class[2] = BTM_COD_MINOR_JOYSTICK;
2078 break;
2079 case BTM_BLE_APPEARANCE_HID_GAMEPAD:
2080 dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
2081 dev_class[2] = BTM_COD_MINOR_GAMEPAD;
2082 break;
2083 case BTM_BLE_APPEARANCE_HID_DIGITIZER_TABLET:
2084 dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
2085 dev_class[2] = BTM_COD_MINOR_DIGITIZING_TABLET;
2086 break;
2087 case BTM_BLE_APPEARANCE_HID_CARD_READER:
2088 dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
2089 dev_class[2] = BTM_COD_MINOR_CARD_READER;
2090 break;
2091 case BTM_BLE_APPEARANCE_HID_DIGITAL_PEN:
2092 dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
2093 dev_class[2] = BTM_COD_MINOR_DIGITAL_PAN;
2094 break;
2095 case BTM_BLE_APPEARANCE_UKNOWN:
2096 case BTM_BLE_APPEARANCE_GENERIC_CLOCK:
2097 case BTM_BLE_APPEARANCE_GENERIC_TAG:
2098 case BTM_BLE_APPEARANCE_GENERIC_KEYRING:
2099 case BTM_BLE_APPEARANCE_GENERIC_CYCLING:
2100 case BTM_BLE_APPEARANCE_CYCLING_COMPUTER:
2101 case BTM_BLE_APPEARANCE_CYCLING_SPEED:
2102 case BTM_BLE_APPEARANCE_CYCLING_CADENCE:
2103 case BTM_BLE_APPEARANCE_CYCLING_POWER:
2104 case BTM_BLE_APPEARANCE_CYCLING_SPEED_CADENCE:
2105 case BTM_BLE_APPEARANCE_GENERIC_OUTDOOR_SPORTS:
2106 case BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION:
2107 case BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_AND_NAV:
2108 case BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_POD:
2109 case BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_POD_AND_NAV:
2110 default:
2111 dev_class[1] = BTM_COD_MAJOR_UNCLASSIFIED;
2112 dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED;
2113 };
2114}
2115
The Android Open Source Project5738f832012-12-12 16:00:35 -08002116/*******************************************************************************
2117**
2118** Function btm_ble_update_inq_result
2119**
2120** Description Update adv packet information into inquiry result.
2121**
2122** Parameters
2123**
2124** Returns void
2125**
2126*******************************************************************************/
2127BOOLEAN btm_ble_update_inq_result(tINQ_DB_ENT *p_i, UINT8 addr_type, UINT8 evt_type, UINT8 *p)
2128{
2129 BOOLEAN to_report = TRUE;
2130 tBTM_INQ_RESULTS *p_cur = &p_i->inq_info.results;
2131 UINT8 len;
2132 UINT8 *p_flag;
2133 tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
2134 UINT8 data_len, rssi;
2135 tBTM_BLE_INQ_CB *p_le_inq_cb = &btm_cb.ble_ctr_cb.inq_var;
2136 UINT8 *p1;
Zhihai Xu1237ee32013-11-26 18:18:29 -08002137 UINT8 *p_uuid16;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002138
2139 STREAM_TO_UINT8 (data_len, p);
2140
2141 if (data_len > BTM_BLE_ADV_DATA_LEN_MAX)
2142 {
2143 BTM_TRACE_WARNING1("EIR data too long %d. discard", data_len);
2144 return FALSE;
2145 }
2146 btm_ble_cache_adv_data(p_cur, data_len, p, evt_type);
2147
2148 p1 = (p + data_len);
2149 STREAM_TO_UINT8 (rssi, p1);
2150
2151 /* Save the info */
2152 p_cur->inq_result_type = BTM_INQ_RESULT_BLE;
2153 p_cur->ble_addr_type = addr_type;
2154 p_cur->rssi = rssi;
2155
2156 /* active scan, always wait until get scan_rsp to report the result */
2157 if ((btm_cb.ble_ctr_cb.inq_var.scan_type == BTM_BLE_SCAN_MODE_ACTI &&
2158 (evt_type == BTM_BLE_CONNECT_EVT || evt_type == BTM_BLE_DISCOVER_EVT)))
2159 {
Nitin Arora0830ad42014-02-21 18:20:37 -08002160 BTM_TRACE_DEBUG1("btm_ble_update_inq_result scan_rsp=false, to_report=false,\
2161 scan_type_active=%d", btm_cb.ble_ctr_cb.inq_var.scan_type);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002162 p_i->scan_rsp = FALSE;
2163 to_report = FALSE;
2164 }
2165 else
2166 p_i->scan_rsp = TRUE;
2167
2168 if (p_i->inq_count != p_inq->inq_counter)
2169 p_cur->device_type = BT_DEVICE_TYPE_BLE;
2170 else
2171 p_cur->device_type |= BT_DEVICE_TYPE_BLE;
2172
2173 if (evt_type != BTM_BLE_SCAN_RSP_EVT)
2174 p_cur->ble_evt_type = evt_type;
2175
2176 p_i->inq_count = p_inq->inq_counter; /* Mark entry for current inquiry */
2177
2178 if (p_le_inq_cb->adv_len != 0)
2179 {
2180 if ((p_flag = BTM_CheckAdvData(p_le_inq_cb->adv_data_cache, BTM_BLE_AD_TYPE_FLAG, &len)) != NULL)
2181 p_cur->flag = * p_flag;
2182 }
2183
Zhihai Xu1237ee32013-11-26 18:18:29 -08002184 if (p_le_inq_cb->adv_len != 0)
2185 {
Adam Hampsone6c74502014-05-30 15:07:08 -07002186 /* Check to see the BLE device has the Appearance UUID in the advertising data. If it does
2187 * then try to convert the appearance value to a class of device value Bluedroid can use.
2188 * Otherwise fall back to trying to infer if it is a HID device based on the service class.
2189 */
2190 p_uuid16 = BTM_CheckAdvData(p_le_inq_cb->adv_data_cache, BTM_BLE_AD_TYPE_APPEARANCE, &len);
2191 if (p_uuid16 && len == 2)
Zhihai Xu1237ee32013-11-26 18:18:29 -08002192 {
Adam Hampsone6c74502014-05-30 15:07:08 -07002193 btm_ble_appearance_to_cod((UINT16)p_uuid16[0] | (p_uuid16[1] << 8), p_cur->dev_class);
2194 }
2195 else
2196 {
2197 if ((p_uuid16 = BTM_CheckAdvData(p_le_inq_cb->adv_data_cache,
2198 BTM_BLE_AD_TYPE_16SRV_CMPL, &len)) != NULL)
Zhihai Xu1237ee32013-11-26 18:18:29 -08002199 {
Adam Hampsone6c74502014-05-30 15:07:08 -07002200 UINT8 i;
2201 for (i = 0; i + 2 <= len; i = i + 2)
Zhihai Xu1237ee32013-11-26 18:18:29 -08002202 {
Adam Hampsone6c74502014-05-30 15:07:08 -07002203 /* if this BLE device support HID over LE, set HID Major in class of device */
2204 if ((p_uuid16[i] | (p_uuid16[i+1] << 8)) == UUID_SERVCLASS_LE_HID)
2205 {
2206 p_cur->dev_class[0] = 0;
2207 p_cur->dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
2208 p_cur->dev_class[2] = 0;
2209 break;
2210 }
Zhihai Xu1237ee32013-11-26 18:18:29 -08002211 }
2212 }
2213 }
2214 }
2215
The Android Open Source Project5738f832012-12-12 16:00:35 -08002216 /* if BR/EDR not supported is not set, assume is a DUMO device */
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002217 if ((p_cur->flag & BTM_BLE_BREDR_NOT_SPT) == 0 &&
2218 evt_type != BTM_BLE_CONNECT_DIR_EVT)
The Android Open Source Project5738f832012-12-12 16:00:35 -08002219 {
Andre Eisenbachbf68ac72013-10-25 16:17:45 -07002220 if (p_cur->ble_addr_type != BLE_ADDR_RANDOM)
2221 {
2222 BTM_TRACE_DEBUG0("BR/EDR NOT support bit not set, treat as DUMO");
2223 p_cur->device_type |= BT_DEVICE_TYPE_DUMO;
2224 } else {
2225 BTM_TRACE_DEBUG0("Random address, treating device as LE only");
2226 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08002227 }
2228 else
2229 {
2230 BTM_TRACE_DEBUG0("BR/EDR NOT SUPPORT bit set, LE only device");
2231 }
2232
2233 return to_report;
2234
2235}
2236
2237/*******************************************************************************
2238**
2239** Function btm_send_sel_conn_callback
2240**
2241** Description send selection connection request callback.
2242**
2243** Parameters
2244**
2245** Returns void
2246**
2247*******************************************************************************/
2248void btm_send_sel_conn_callback(BD_ADDR remote_bda, UINT8 evt_type, UINT8 *p_data, UINT8 addr_type)
2249{
2250 UINT8 data_len, len;
2251 UINT8 *p_dev_name, remname[31] = {0};
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08002252 UNUSED(addr_type);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002253
2254 if (btm_cb.ble_ctr_cb.p_select_cback == NULL ||
2255 /* non-connectable device */
2256 (evt_type != BTM_BLE_EVT_CONN_ADV && evt_type != BTM_BLE_EVT_CONN_DIR_ADV))
2257 return;
2258
2259 STREAM_TO_UINT8 (data_len, p_data);
2260
2261 /* get the device name if exist in ADV data */
2262 if (data_len != 0)
2263 {
2264 p_dev_name = BTM_CheckAdvData(p_data, BTM_BLE_AD_TYPE_NAME_CMPL, &len);
2265
2266 if (p_dev_name == NULL)
2267 p_dev_name = BTM_CheckAdvData(p_data, BTM_BLE_AD_TYPE_NAME_SHORT, &len);
2268
2269 if (p_dev_name)
2270 memcpy(remname, p_dev_name, len);
2271 }
2272 /* allow connection */
2273 if ((* btm_cb.ble_ctr_cb.p_select_cback)(remote_bda, remname))
2274 {
2275 /* terminate selective connection, initiate connection */
2276 btm_ble_initiate_select_conn(remote_bda);
2277 }
2278}
2279
2280/*******************************************************************************
2281**
The Android Open Source Project5738f832012-12-12 16:00:35 -08002282** Function btm_ble_process_adv_pkt
2283**
2284** Description This function is called when adv packet report events are
2285** received from the device. It updates the inquiry database.
2286** If the inquiry database is full, the oldest entry is discarded.
2287**
2288** Parameters
2289**
2290** Returns void
2291**
2292*******************************************************************************/
2293void btm_ble_process_adv_pkt (UINT8 *p_data)
2294{
2295 BD_ADDR bda;
2296 UINT8 evt_type = 0, *p = p_data;
2297 UINT8 addr_type = 0;
Adam Hampson186cddb2014-05-27 10:48:19 -07002298 UINT8 num_reports;
2299 UINT8 data_len;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002300#if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
Zhihai Xu8b35b3f2014-03-11 15:01:45 -07002301 BOOLEAN match = FALSE;
2302#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -08002303
Adam Hampson186cddb2014-05-27 10:48:19 -07002304 /* Extract the number of reports in this event. */
2305 STREAM_TO_UINT8(num_reports, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002306
Adam Hampson186cddb2014-05-27 10:48:19 -07002307 while (num_reports--)
2308 {
2309 /* Extract inquiry results */
2310 STREAM_TO_UINT8 (evt_type, p);
2311 STREAM_TO_UINT8 (addr_type, p);
2312 STREAM_TO_BDADDR (bda, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002313
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002314#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 -07002315 if (BTM_BLE_PC_ADV_TEST_MODE) /* For stack component, it is always defined and maps to a global variable g_bDraculaAdvertisingMode */
2316 {
2317 if (btm_cb.ble_ctr_cb.p_scan_req_cback)
2318 (*btm_cb.ble_ctr_cb.p_scan_req_cback)(bda, addr_type, evt_type);
2319 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08002320#endif
2321
Wei Wanged534e32014-05-20 06:30:13 +00002322#if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
2323#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
Adam Hampson186cddb2014-05-27 10:48:19 -07002324 /* map address to security record */
2325 btm_public_addr_to_random_pseudo(bda, &addr_type);
2326 BTM_TRACE_ERROR6("new address: %02x:%02x:%02x:%02x:%02x:%02x",
Wei Wanged534e32014-05-20 06:30:13 +00002327 bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);
2328#endif
2329#endif
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002330
Adam Hampson186cddb2014-05-27 10:48:19 -07002331 /* Only process the results if the inquiry is still active */
2332 if (!BTM_BLE_IS_SCAN_ACTIVE(btm_cb.ble_ctr_cb.scan_activity))
2333 return;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002334
Adam Hampson186cddb2014-05-27 10:48:19 -07002335 BTM_TRACE_DEBUG6("btm_ble_process_adv_pkt:bda= %0x:%0x:%0x:%0x:%0x:%0x",
Nitin Arora0830ad42014-02-21 18:20:37 -08002336 bda[0],bda[1],bda[2],bda[3],bda[4],bda[5]);
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002337#if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
Zhihai Xu8b35b3f2014-03-11 15:01:45 -07002338#if SMP_INCLUDED == TRUE
Adam Hampson186cddb2014-05-27 10:48:19 -07002339 /* always do RRA resolution on host */
2340 if (!match && BTM_BLE_IS_RESOLVE_BDA(bda))
2341 {
2342 btm_ble_resolve_random_addr(bda, btm_ble_resolve_random_addr_on_adv, p_data);
2343 }
2344 else
Zhihai Xu8b35b3f2014-03-11 15:01:45 -07002345#endif
2346#endif
Adam Hampson186cddb2014-05-27 10:48:19 -07002347 {
2348 btm_ble_process_adv_pkt_cont(bda, addr_type, evt_type, p);
2349 }
2350
2351 STREAM_TO_UINT8(data_len, p);
2352
2353 /* Advance to the next event data_len + rssi byte */
2354 p += data_len + 1;
Zhihai Xu8b35b3f2014-03-11 15:01:45 -07002355 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08002356}
2357
2358/*******************************************************************************
2359**
2360** Function btm_ble_process_adv_pkt_cont
2361**
2362** Description This function is called after random address resolution is
2363** done, and proceed to process adv packet.
2364**
2365** Parameters
2366**
2367** Returns void
2368**
2369*******************************************************************************/
2370static void btm_ble_process_adv_pkt_cont(BD_ADDR bda, UINT8 addr_type, UINT8 evt_type, UINT8 *p)
2371{
2372 tINQ_DB_ENT *p_i;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002373 tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
2374 tBTM_INQ_RESULTS_CB *p_inq_results_cb = p_inq->p_inq_results_cb;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002375 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 -08002376 tBTM_BLE_INQ_CB *p_le_inq_cb = &btm_cb.ble_ctr_cb.inq_var;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002377 BOOLEAN update = TRUE;
2378 UINT8 result = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002379
2380 p_i = btm_inq_db_find (bda);
2381
2382 /* Check if this address has already been processed for this inquiry */
2383 if (btm_inq_find_bdaddr(bda))
2384 {
2385 /* never been report as an LE device */
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002386 if (p_i &&
The Android Open Source Project5738f832012-12-12 16:00:35 -08002387 (!(p_i->inq_info.results.device_type & BT_DEVICE_TYPE_BLE) ||
2388 /* scan repsonse to be updated */
2389 (!p_i->scan_rsp)))
The Android Open Source Project5738f832012-12-12 16:00:35 -08002390 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002391 update = TRUE;
2392 }
2393 else if (BTM_BLE_IS_OBS_ACTIVE(btm_cb.ble_ctr_cb.scan_activity))
2394 {
2395 update = FALSE;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002396 }
2397 else
2398 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002399 /* if yes, skip it */
2400 return; /* assumption: one result per event */
The Android Open Source Project5738f832012-12-12 16:00:35 -08002401 }
2402 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08002403 /* If existing entry, use that, else get a new one (possibly reusing the oldest) */
2404 if (p_i == NULL)
2405 {
Nitin Arora0830ad42014-02-21 18:20:37 -08002406 if ((p_i = btm_inq_db_new (bda)) != NULL)
The Android Open Source Project5738f832012-12-12 16:00:35 -08002407 {
Nitin Arora0830ad42014-02-21 18:20:37 -08002408 p_inq->inq_cmpl_info.num_resp++;
2409 }
2410 else
2411 return;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002412 }
2413 else if (p_i->inq_count != p_inq->inq_counter) /* first time seen in this inquiry */
2414 {
2415 p_inq->inq_cmpl_info.num_resp++;
2416 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08002417 /* update the LE device information in inquiry database */
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002418 if (!btm_ble_update_inq_result(p_i, addr_type, evt_type, p))
2419 return;
2420
2421 if ((result = btm_ble_is_discoverable(bda, evt_type, p)) == 0)
2422 {
2423 BTM_TRACE_ERROR0("discard adv pkt");
2424 return;
2425 }
2426 if (!update)
2427 result &= ~BTM_BLE_INQ_RESULT;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002428#if BTM_USE_INQ_RESULTS_FILTER == TRUE
2429 /* If the number of responses found and limited, issue a cancel inquiry */
2430 if (p_inq->inqparms.max_resps &&
2431 p_inq->inq_cmpl_info.num_resp == p_inq->inqparms.max_resps)
2432 {
2433 /* new device */
2434 if (p_i == NULL ||
2435 (/* assume a DUMO device, BR/EDR inquiry is always active */
2436 p_i && p_i->inq_info.results.device_type == BT_DEVICE_TYPE_BLE && p_i->scan_rsp))
2437 {
2438 BTM_TRACE_WARNING0("INQ RES: Extra Response Received...cancelling inquiry..");
2439
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002440 /* if is non-periodic inquiry active, cancel now */
2441 if ((p_inq->inq_active & BTM_BR_INQ_ACTIVE_MASK) != 0 &&
2442 (p_inq->inq_active & BTM_PERIODIC_INQUIRY_ACTIVE) == 0)
The Android Open Source Project5738f832012-12-12 16:00:35 -08002443 btsnd_hcic_inq_cancel();
2444
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002445 btm_ble_stop_inquiry();
The Android Open Source Project5738f832012-12-12 16:00:35 -08002446
2447#if BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE
2448 btm_acl_update_busy_level (BTM_BLI_INQ_DONE_EVT);
2449#endif
2450 }
2451 }
2452#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -08002453 /* background connection in selective connection mode */
2454 if (btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_SELECTIVE)
2455 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002456 if (result & BTM_BLE_SEL_CONN_RESULT)
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002457 btm_send_sel_conn_callback(bda, evt_type, p, addr_type);
2458 else
2459 {
2460 BTM_TRACE_DEBUG0("None LE device, can not initiate selective connection");
2461 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08002462 }
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002463 else
The Android Open Source Project5738f832012-12-12 16:00:35 -08002464 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002465 if (p_inq_results_cb && (result & BTM_BLE_INQ_RESULT))
2466 {
Nitin Arora0830ad42014-02-21 18:20:37 -08002467 (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 -07002468 }
2469 if (p_obs_results_cb && (result & BTM_BLE_OBS_RESULT))
2470 {
2471 (p_obs_results_cb)((tBTM_INQ_RESULTS *) &p_i->inq_info.results, p_le_inq_cb->adv_data_cache);
2472 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08002473 }
2474}
2475
2476/*******************************************************************************
2477**
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002478** Function btm_ble_start_scan
2479**
2480** Description Start the BLE scan.
2481**
2482** Returns void
2483**
2484*******************************************************************************/
2485tBTM_STATUS btm_ble_start_scan (UINT8 filter_enable)
2486{
2487 tBTM_BLE_INQ_CB *p_inq = &btm_cb.ble_ctr_cb.inq_var;
2488 tBTM_STATUS status = BTM_CMD_STARTED;
2489
2490 /* start scan, disable duplicate filtering */
2491 if (!btsnd_hcic_ble_set_scan_enable (BTM_BLE_SCAN_ENABLE, filter_enable))
2492 status = BTM_NO_RESOURCES;
2493 else
2494 {
2495 if (p_inq->scan_type == BTM_BLE_SCAN_MODE_ACTI)
2496 btm_ble_set_topology_mask(BTM_BLE_STATE_ACTIVE_SCAN_BIT);
2497 else
2498 btm_ble_set_topology_mask(BTM_BLE_STATE_PASSIVE_SCAN_BIT);
2499 }
2500 return status;
2501}
2502
2503/*******************************************************************************
2504**
The Android Open Source Project5738f832012-12-12 16:00:35 -08002505** Function btm_ble_stop_scan
2506**
2507** Description Stop the BLE scan.
2508**
2509** Returns void
2510**
2511*******************************************************************************/
2512void btm_ble_stop_scan(void)
2513{
The Android Open Source Project5738f832012-12-12 16:00:35 -08002514 BTM_TRACE_EVENT0 ("btm_ble_stop_scan ");
2515
The Android Open Source Project5738f832012-12-12 16:00:35 -08002516 /* Clear the inquiry callback if set */
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002517 btm_cb.ble_ctr_cb.inq_var.scan_type = BTM_BLE_SCAN_MODE_NONE;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002518
2519 /* stop discovery now */
2520 btsnd_hcic_ble_set_scan_enable (BTM_BLE_SCAN_DISABLE, BTM_BLE_DUPLICATE_ENABLE);
2521
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002522 btm_update_scanner_filter_policy(SP_ADV_ALL);
2523}
2524/*******************************************************************************
2525**
2526** Function btm_ble_stop_inquiry
2527**
2528** Description Stop the BLE Inquiry.
2529**
2530** Returns void
2531**
2532*******************************************************************************/
2533void btm_ble_stop_inquiry(void)
2534{
2535 tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
2536 tBTM_BLE_CB *p_ble_cb = &btm_cb.ble_ctr_cb;
2537
2538 btu_stop_timer (&p_ble_cb->inq_var.inq_timer_ent);
2539
2540 p_ble_cb->scan_activity &= ~BTM_BLE_INQUIRY_MASK;
2541
2542 /* If no more scan activity, stop LE scan now */
2543 if (!BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity))
2544 btm_ble_stop_scan();
2545
The Android Open Source Project5738f832012-12-12 16:00:35 -08002546 /* If we have a callback registered for inquiry complete, call it */
2547 BTM_TRACE_DEBUG2 ("BTM Inq Compl Callback: status 0x%02x, num results %d",
2548 p_inq->inq_cmpl_info.status, p_inq->inq_cmpl_info.num_resp);
2549
The Android Open Source Project5738f832012-12-12 16:00:35 -08002550 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 -08002551}
2552
2553/*******************************************************************************
2554**
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002555** Function btm_ble_stop_observe
2556**
2557** Description Stop the BLE Observe.
2558**
2559** Returns void
2560**
2561*******************************************************************************/
2562static void btm_ble_stop_observe(void)
2563{
2564 tBTM_BLE_CB *p_ble_cb = & btm_cb.ble_ctr_cb;
2565 tBTM_CMPL_CB *p_obs_cb = p_ble_cb->p_obs_cmpl_cb;
2566
2567 btu_stop_timer (&p_ble_cb->obs_timer_ent);
2568
2569 p_ble_cb->scan_activity &= ~BTM_LE_OBSERVE_ACTIVE;
2570
2571 p_ble_cb->p_obs_results_cb = NULL;
2572 p_ble_cb->p_obs_cmpl_cb = NULL;
2573
2574 if (!BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity))
2575 btm_ble_stop_scan();
2576
2577 if (p_obs_cb)
2578 (p_obs_cb)((tBTM_INQUIRY_CMPL *) &btm_cb.btm_inq_vars.inq_cmpl_info);
2579}
2580/*******************************************************************************
2581**
2582** Function btm_ble_adv_states_operation
2583**
2584** Description Set or clear adv states in topology mask
2585**
2586** Returns operation status. TRUE if sucessful, FALSE otherwise.
2587**
2588*******************************************************************************/
2589typedef BOOLEAN (BTM_TOPOLOGY_FUNC_PTR)(tBTM_BLE_STATE_MASK);
2590static BOOLEAN btm_ble_adv_states_operation(BTM_TOPOLOGY_FUNC_PTR *p_handler, UINT8 adv_evt)
2591{
2592 BOOLEAN rt = FALSE;
2593
2594 switch (adv_evt)
2595 {
2596 case BTM_BLE_CONNECT_EVT:
2597 rt = (*p_handler)(BTM_BLE_STATE_CONN_ADV_BIT);
2598 break;
2599
2600 case BTM_BLE_NON_CONNECT_EVT:
2601 rt = (*p_handler) (BTM_BLE_STATE_NON_CONN_ADV_BIT);
2602 break;
2603 case BTM_BLE_CONNECT_DIR_EVT:
2604 rt = (*p_handler) (BTM_BLE_STATE_HI_DUTY_DIR_ADV_BIT);
2605 break;
2606
2607 case BTM_BLE_DISCOVER_EVT:
2608 rt = (*p_handler) (BTM_BLE_STATE_SCAN_ADV_BIT);
2609 break;
2610
2611 default:
2612 BTM_TRACE_ERROR1("unknown adv event : %d", adv_evt);
2613 break;
2614 }
2615
2616 return rt;
2617}
2618
2619
2620/*******************************************************************************
2621**
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002622** Function btm_ble_start_adv
2623**
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002624** Description start the BLE advertising.
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002625**
2626** Returns void
2627**
2628*******************************************************************************/
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002629tBTM_STATUS btm_ble_start_adv(void)
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002630{
2631 tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
2632 tBTM_STATUS rt = BTM_NO_RESOURCES;
2633
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002634 if (!btm_ble_adv_states_operation (btm_ble_topology_check, p_cb->evt_type))
2635 return BTM_WRONG_MODE;
2636
2637 if (p_cb->afp != AP_SCAN_CONN_ALL)
2638 {
2639 btm_execute_wl_dev_operation();
2640 btm_cb.ble_ctr_cb.wl_state |= BTM_BLE_WL_ADV;
2641 }
2642
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002643 if (btsnd_hcic_ble_set_adv_enable (BTM_BLE_ADV_ENABLE))
2644 {
2645 if (p_cb->afp != AP_SCAN_CONN_ALL)
2646 btm_cb.ble_ctr_cb.wl_state |= BTM_BLE_WL_ADV;
2647
2648 p_cb->adv_mode = BTM_BLE_ADV_ENABLE;
2649
2650 rt = BTM_SUCCESS;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002651 }
2652 else
2653 {
2654 p_cb->adv_mode = BTM_BLE_ADV_DISABLE;
2655 btm_cb.ble_ctr_cb.wl_state &= ~BTM_BLE_WL_ADV;
2656 }
2657 return rt;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002658}
2659/*******************************************************************************
2660**
The Android Open Source Project5738f832012-12-12 16:00:35 -08002661** Function btm_ble_stop_adv
2662**
2663** Description Stop the BLE advertising.
2664**
2665** Returns void
2666**
2667*******************************************************************************/
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002668tBTM_STATUS btm_ble_stop_adv(void)
The Android Open Source Project5738f832012-12-12 16:00:35 -08002669{
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002670 tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
2671 tBTM_STATUS rt = BTM_SUCCESS;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002672
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002673 if (p_cb->adv_mode == BTM_BLE_ADV_ENABLE)
The Android Open Source Project5738f832012-12-12 16:00:35 -08002674 {
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002675 if (btsnd_hcic_ble_set_adv_enable (BTM_BLE_ADV_DISABLE))
2676 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002677 p_cb->fast_adv_on = FALSE;
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002678 p_cb->adv_mode = BTM_BLE_ADV_DISABLE;
2679 btm_cb.ble_ctr_cb.wl_state &= ~BTM_BLE_WL_ADV;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002680
2681 /* clear all adv states */
2682 btm_ble_clear_topology_mask (BTM_BLE_STATE_ALL_ADV_MASK);
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002683 }
2684 else
2685 rt = BTM_NO_RESOURCES;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002686 }
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002687 return rt;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002688}
2689
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002690
2691/*******************************************************************************
2692**
2693** Function btm_ble_set_topology_mask
2694**
2695** Description set BLE topology mask
2696**
2697** Returns TRUE is request is allowed, FALSE otherwise.
2698**
2699*******************************************************************************/
2700BOOLEAN btm_ble_set_topology_mask(tBTM_BLE_STATE_MASK request_state_mask)
2701{
2702 BOOLEAN rt = TRUE;
2703
2704 request_state_mask &= BTM_BLE_STATE_ALL_MASK;
2705
2706 btm_cb.ble_ctr_cb.cur_states |= request_state_mask;
2707
2708 return rt;
2709}
2710/*******************************************************************************
2711**
2712** Function btm_ble_clear_topology_mask
2713**
2714** Description Clear BLE topology bit mask
2715**
2716** Returns TRUE is request is allowed, FALSE otherwise.
2717**
2718*******************************************************************************/
2719BOOLEAN btm_ble_clear_topology_mask (tBTM_BLE_STATE_MASK request_state_mask)
2720{
2721 request_state_mask &= BTM_BLE_STATE_ALL_MASK;
2722
2723 btm_cb.ble_ctr_cb.cur_states &= ~request_state_mask;
2724
2725 return TRUE;
2726}
2727/*******************************************************************************
2728**
2729** Function btm_ble_update_mode_operation
2730**
2731** Description This function update the GAP role operation when a link status
2732** is updated.
2733**
2734** Returns void
2735**
2736*******************************************************************************/
2737void btm_ble_update_mode_operation(UINT8 link_role, BD_ADDR bd_addr, BOOLEAN conn_cancel)
2738{
2739 tACL_CONN *pa = &btm_cb.acl_db[0];
2740 UINT16 xx;
2741 UINT16 mask = BTM_BLE_STATE_ALL_CONN_MASK;
2742
2743 UNUSED(bd_addr);
2744 UNUSED (conn_cancel);
2745
2746 if (link_role == HCI_ROLE_SLAVE)
2747 {
2748 btm_cb.ble_ctr_cb.inq_var.adv_mode = BTM_BLE_ADV_DISABLE;
2749 /* clear all adv states */
2750 mask |= BTM_BLE_STATE_ALL_ADV_MASK;
2751 }
2752
2753 btm_ble_clear_topology_mask (mask);
2754
2755 /* check the device link role maps */
2756 for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, pa++)
2757 {
2758 if (pa->in_use && pa->transport == BT_TRANSPORT_LE)
2759 {
2760 if (pa->link_role == HCI_ROLE_MASTER)
2761 btm_ble_set_topology_mask (BTM_BLE_STATE_MASTER_BIT);
2762 else
2763 btm_ble_set_topology_mask (BTM_BLE_STATE_SLAVE_BIT);
2764 }
2765 }
2766
Wei Wanga6ce7752014-05-20 06:30:32 +00002767 if (btm_multi_adv_cb.adv_inst_max == 0 &&
2768 btm_cb.ble_ctr_cb.inq_var.connectable_mode == BTM_BLE_CONNECTABLE)
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002769 {
2770 btm_ble_set_connectability ( btm_cb.ble_ctr_cb.inq_var.connectable_mode );
2771 }
2772
2773 if (btm_ble_get_conn_st() == BLE_CONN_IDLE)
2774 {
2775 if (!btm_send_pending_direct_conn())
2776 {
2777 btm_ble_resume_bg_conn();
2778 }
2779 }
2780}
2781
2782/*******************************************************************************
2783**
2784** Function btm_ble_start_slow_adv
2785**
2786** Description Restart adv with slow adv interval
2787**
2788** Returns void
2789**
2790*******************************************************************************/
2791static void btm_ble_start_slow_adv (void)
2792{
2793 tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
2794 BD_ADDR p_addr_ptr= {0};
2795
2796 if (p_cb->adv_mode == BTM_BLE_ADV_ENABLE)
2797 {
2798 btm_ble_stop_adv();
2799
2800 btsnd_hcic_ble_write_adv_params (BTM_BLE_GAP_ADV_SLOW_INT,
2801 BTM_BLE_GAP_ADV_SLOW_INT,
2802 p_cb->evt_type,
2803 p_cb->adv_addr_type,
2804 btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type,/* slow adv
2805 mode never goes into directed adv */
2806 p_addr_ptr,
2807 p_cb->adv_chnl_map,
2808 p_cb->afp);
2809
2810 btm_ble_start_adv();
2811 }
2812}
The Android Open Source Project5738f832012-12-12 16:00:35 -08002813/*******************************************************************************
2814**
2815** Function btm_ble_timeout
2816**
2817** Description Called when BTM BLE inquiry timer expires
2818**
2819** Returns void
2820**
2821*******************************************************************************/
2822void btm_ble_timeout(TIMER_LIST_ENT *p_tle)
2823{
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002824 BTM_TRACE_EVENT0 ("btm_ble_timeout");
2825
The Android Open Source Project5738f832012-12-12 16:00:35 -08002826 switch (p_tle->event)
2827 {
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002828 case BTU_TTYPE_BLE_OBSERVE:
2829 btm_ble_stop_observe();
2830 break;
2831
The Android Open Source Project5738f832012-12-12 16:00:35 -08002832 case BTU_TTYPE_BLE_INQUIRY:
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002833 btm_ble_stop_inquiry();
The Android Open Source Project5738f832012-12-12 16:00:35 -08002834 break;
2835
2836 case BTU_TTYPE_BLE_GAP_LIM_DISC:
2837 /* lim_timeout expiried, limited discovery should exit now */
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002838 btm_cb.btm_inq_vars.discoverable_mode &= ~BTM_BLE_LIMITED_DISCOVERABLE;
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002839 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 -08002840 break;
2841
2842 case BTU_TTYPE_BLE_RANDOM_ADDR:
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002843 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 -08002844 {
Wei Wanga6ce7752014-05-20 06:30:32 +00002845 if ((void *)(p_tle->param) == NULL)
The Android Open Source Project5738f832012-12-12 16:00:35 -08002846 /* refresh the random addr */
Wei Wanga6ce7752014-05-20 06:30:32 +00002847 btm_gen_resolvable_private_addr((void *)btm_gen_resolve_paddr_low);
2848 else
2849 {
2850#if BLE_MULTI_ADV_INCLUDED == TRUE
Wei Wanged534e32014-05-20 06:30:13 +00002851 btm_ble_multi_adv_configure_rpa((tBTM_BLE_MULTI_ADV_INST*)p_tle->param);
Wei Wanga6ce7752014-05-20 06:30:32 +00002852#endif
2853 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08002854 }
2855 break;
2856
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002857 case BTU_TTYPE_BLE_GAP_FAST_ADV:
2858 /* fast adv is completed, fall back to slow adv interval */
2859 btm_ble_start_slow_adv();
2860 break;
2861
2862 default:
2863 break;
2864
The Android Open Source Project5738f832012-12-12 16:00:35 -08002865 }
2866}
2867
The Android Open Source Project5738f832012-12-12 16:00:35 -08002868
2869/*******************************************************************************
2870**
2871** Function btm_ble_read_remote_features_complete
2872**
2873** Description This function is called when the command complete message
2874** is received from the HCI for the read LE remote feature supported
2875** complete event.
2876**
2877** Returns void
2878**
2879*******************************************************************************/
2880void btm_ble_read_remote_features_complete(UINT8 *p)
2881{
2882 tACL_CONN *p_acl_cb = &btm_cb.acl_db[0];
The Android Open Source Project5738f832012-12-12 16:00:35 -08002883 UINT16 handle;
Andre Eisenbach3aa60542013-03-22 18:00:51 -07002884 int xx;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002885
2886 BTM_TRACE_EVENT0 ("btm_ble_read_remote_features_complete ");
2887
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002888 /* Skip status */
2889 p++;
Andre Eisenbach3aa60542013-03-22 18:00:51 -07002890 STREAM_TO_UINT16 (handle, p);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002891
2892 /* Look up the connection by handle and copy features */
2893 for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_acl_cb++)
2894 {
2895 if ((p_acl_cb->in_use) && (p_acl_cb->hci_handle == handle))
2896 {
Andre Eisenbach3aa60542013-03-22 18:00:51 -07002897 STREAM_TO_ARRAY(p_acl_cb->peer_le_features, p, BD_FEATURES_LEN);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002898 break;
2899 }
2900 }
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002901
The Android Open Source Project5738f832012-12-12 16:00:35 -08002902}
2903
2904/*******************************************************************************
2905**
2906** Function btm_ble_write_adv_enable_complete
2907**
2908** Description This function process the write adv enable command complete.
2909**
2910** Returns void
2911**
2912*******************************************************************************/
2913void btm_ble_write_adv_enable_complete(UINT8 * p)
2914{
2915 tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
2916
2917 /* if write adv enable/disbale not succeed */
2918 if (*p != HCI_SUCCESS)
2919 {
2920 /* toggle back the adv mode */
2921 p_cb->adv_mode = !p_cb->adv_mode;
2922 }
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002923
Wei Wanged534e32014-05-20 06:30:13 +00002924#if (BLE_VND_INCLUDED == TRUE && BLE_PRIVACY_SPT == TRUE)
2925 if (p_cb->adv_mode == BTM_BLE_ADV_DISABLE)
2926 btm_ble_vendor_disable_irk_list();
2927#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -08002928}
Ganesh Ganapathi Battaead3cde2013-02-05 15:22:31 -08002929
2930/*******************************************************************************
2931**
2932** Function btm_ble_dir_adv_tout
2933**
2934** Description when directed adv time out
2935**
2936** Returns void
2937**
2938*******************************************************************************/
2939void btm_ble_dir_adv_tout(void)
2940{
2941 btm_cb.ble_ctr_cb.inq_var.adv_mode = BTM_BLE_ADV_DISABLE;
2942
2943 /* make device fall back into undirected adv mode by default */
2944 btm_cb.ble_ctr_cb.inq_var.directed_conn = FALSE;
2945}
2946
2947/*******************************************************************************
2948**
The Android Open Source Project5738f832012-12-12 16:00:35 -08002949** Function btm_ble_init
2950**
2951** Description Initialize the control block variable values.
2952**
2953** Returns void
2954**
2955*******************************************************************************/
2956void btm_ble_init (void)
2957{
2958 tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
2959
2960 BTM_TRACE_EVENT0 ("btm_ble_init ");
2961
2962 memset(p_cb, 0, sizeof(tBTM_BLE_CB));
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002963 p_cb->cur_states = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002964
2965 p_cb->inq_var.adv_mode = BTM_BLE_ADV_DISABLE;
2966 p_cb->inq_var.scan_type = BTM_BLE_SCAN_MODE_NONE;
2967 p_cb->inq_var.adv_chnl_map = BTM_BLE_DEFAULT_ADV_CHNL_MAP;
2968 p_cb->inq_var.afp = BTM_BLE_DEFAULT_AFP;
2969 p_cb->inq_var.sfp = BTM_BLE_DEFAULT_SFP;
2970 p_cb->inq_var.connectable_mode = BTM_BLE_NON_CONNECTABLE;
2971 p_cb->inq_var.discoverable_mode = BTM_BLE_NON_DISCOVERABLE;
2972
2973 /* for background connection, reset connection params to be undefined */
2974 p_cb->scan_int = p_cb->scan_win = BTM_BLE_CONN_PARAM_UNDEF;
2975
Andre Eisenbach6975b4d2013-08-05 16:55:38 -07002976 p_cb->inq_var.evt_type = BTM_BLE_NON_CONNECT_EVT;
Wei Wanga6ce7752014-05-20 06:30:32 +00002977#if BLE_MULTI_ADV_INCLUDED == TRUE
2978 btm_ble_multi_adv_init();
2979#endif
2980
2981 btm_ble_vendor_capability_init();
The Android Open Source Project5738f832012-12-12 16:00:35 -08002982}
2983
Ganesh Ganapathi Batta7fa4fba2014-04-16 16:50:09 -07002984/*******************************************************************************
2985**
2986** Function btm_ble_topology_check
2987**
2988** Description check to see requested state is supported. One state check at
2989** a time is supported
2990**
2991** Returns TRUE is request is allowed, FALSE otherwise.
2992**
2993*******************************************************************************/
2994BOOLEAN btm_ble_topology_check(tBTM_BLE_STATE_MASK request_state_mask)
2995{
2996 BOOLEAN rt = FALSE;
2997 UINT32 llt_mask = 0;
2998 UINT8 *p;
2999
3000 UINT8 state_offset = 0;
3001 UINT16 cur_states = btm_cb.ble_ctr_cb.cur_states;
3002 UINT8 mask, offset;
3003 UINT8 request_state = 0;
3004
3005 /* check only one bit is set and within valid range */
3006 if (request_state_mask == BTM_BLE_STATE_INVALID ||
3007 request_state_mask > BTM_BLE_STATE_SCAN_ADV_BIT ||
3008 (request_state_mask & (request_state_mask -1 )) != 0)
3009 {
3010 BTM_TRACE_ERROR1("illegal state requested: %d", request_state_mask);
3011 return rt;
3012 }
3013
3014 while (request_state_mask)
3015 {
3016 request_state_mask >>= 1;
3017 request_state ++;
3018 }
3019
3020 /* check if the requested state is supported or not */
3021 mask = btm_le_state_combo_tbl[0][request_state - 1][0];
3022 offset = btm_le_state_combo_tbl[0][request_state-1][1];
3023
3024 if (!BTM_LE_STATES_SUPPORTED(btm_cb.devcb.le_supported_states, mask, offset))
3025 {
3026 BTM_TRACE_ERROR1("state requested not supported: %d", request_state);
3027 return rt;
3028 }
3029
3030 rt = TRUE;
3031 /* make sure currently active states are all supported in conjunction with the requested
3032 state. If the bit in table is not set, the combination is not supported */
3033 while (cur_states != 0)
3034 {
3035 if (cur_states & 0x01)
3036 {
3037 mask = btm_le_state_combo_tbl[request_state][state_offset][0];
3038 offset = btm_le_state_combo_tbl[request_state][state_offset][1];
3039
3040 if (mask != 0 && offset != 0)
3041 {
3042 if (!BTM_LE_STATES_SUPPORTED(btm_cb.devcb.le_supported_states, mask, offset))
3043 {
3044 rt = FALSE;
3045 break;
3046 }
3047 }
3048 }
3049 cur_states >>= 1;
3050 state_offset ++;
3051 }
3052 return rt;
3053}
3054
3055
The Android Open Source Project5738f832012-12-12 16:00:35 -08003056#endif /* BLE_INCLUDED */