]> granicus.if.org Git - esp-idf/blob - components/bt/bluedroid/stack/btm/btm_ble_gap.c
component/bt: free timer resources after using them
[esp-idf] / components / bt / bluedroid / stack / btm / btm_ble_gap.c
1 /******************************************************************************
2  *
3  *  Copyright (C) 2008-2014 Broadcom Corporation
4  *
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"
30 //#include "bt_utils.h"
31 #include "btm_int.h"
32 #include "btm_ble_api.h"
33 #include "btu.h"
34 #include "controller.h"
35 #include "hcimsgs.h"
36 #include "gap_api.h"
37
38 #if BLE_INCLUDED == TRUE
39 #include "l2c_int.h"
40
41 #include "gattdefs.h"
42 #include "gatt_int.h"
43
44 #include "btm_ble_int.h"
45 //#define LOG_TAG "bt_btm_ble"
46 //#include "osi/include/log.h"
47
48 #define BTM_BLE_NAME_SHORT                  0x01
49 #define BTM_BLE_NAME_CMPL                   0x02
50
51 #define BTM_BLE_FILTER_TARGET_UNKNOWN       0xff
52 #define BTM_BLE_POLICY_UNKNOWN              0xff
53
54 #define BTM_EXT_BLE_RMT_NAME_TIMEOUT        30
55 #define MIN_ADV_LENGTH                       2
56 #define BTM_VSC_CHIP_CAPABILITY_RSP_LEN_L_RELEASE 9
57
58 static tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
59
60 #if BLE_VND_INCLUDED == TRUE
61 static tBTM_BLE_CTRL_FEATURES_CBACK    *p_ctrl_le_feature_rd_cmpl_cback = NULL;
62 #endif
63
64 tBTM_CallbackFunc conn_param_update_cb;
65 /*******************************************************************************
66 **  Local functions
67 *******************************************************************************/
68 static void btm_ble_update_adv_flag(UINT8 flag);
69 static void btm_ble_process_adv_pkt_cont(BD_ADDR bda, UINT8 addr_type, UINT8 evt_type, UINT8 *p);
70 UINT8 *btm_ble_build_adv_data(tBTM_BLE_AD_MASK *p_data_mask, UINT8 **p_dst,
71                               tBTM_BLE_ADV_DATA *p_data);
72 static UINT8 btm_set_conn_mode_adv_init_addr(tBTM_BLE_INQ_CB *p_cb,
73         BD_ADDR_PTR p_peer_addr_ptr,
74         tBLE_ADDR_TYPE *p_peer_addr_type,
75         tBLE_ADDR_TYPE *p_own_addr_type);
76 static void btm_ble_stop_observe(void);
77 static void btm_ble_stop_discover(void);
78
79 #define BTM_BLE_INQ_RESULT          0x01
80 #define BTM_BLE_OBS_RESULT          0x02
81 #define BTM_BLE_SEL_CONN_RESULT     0x04
82 #define BTM_BLE_DISCO_RESULT        0x08
83
84 /* LE states combo bit to check */
85 const UINT8 btm_le_state_combo_tbl[BTM_BLE_STATE_MAX][BTM_BLE_STATE_MAX][2] = {
86     {/* single state support */
87         {HCI_SUPP_LE_STATES_CONN_ADV_MASK, HCI_SUPP_LE_STATES_CONN_ADV_OFF},  /* conn_adv */
88         {HCI_SUPP_LE_STATES_INIT_MASK, HCI_SUPP_LE_STATES_INIT_OFF}, /* init */
89         {HCI_SUPP_LE_STATES_INIT_MASK, HCI_SUPP_LE_STATES_INIT_OFF}, /* master */
90         {HCI_SUPP_LE_STATES_SLAVE_MASK, HCI_SUPP_LE_STATES_SLAVE_OFF}, /* slave */
91         {0, 0},                   /* todo: lo du dir adv, not covered ? */
92         {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_OFF}, /* hi duty dir adv */
93         {HCI_SUPP_LE_STATES_NON_CONN_ADV_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_OFF},  /* non connectable adv */
94         {HCI_SUPP_LE_STATES_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_OFF},   /*  passive scan */
95         {HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_OFF},  /*   active scan */
96         {HCI_SUPP_LE_STATES_SCAN_ADV_MASK, HCI_SUPP_LE_STATESSCAN_ADV_OFF}   /* scanable adv */
97     },
98     {    /* conn_adv =0 */
99         {0, 0},                                                                           /* conn_adv */
100         {HCI_SUPP_LE_STATES_CONN_ADV_INIT_MASK, HCI_SUPP_LE_STATES_CONN_ADV_INIT_OFF},      /* init: 32 */
101         {HCI_SUPP_LE_STATES_CONN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_CONN_ADV_MASTER_OFF},  /* master: 35 */
102         {HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_OFF}, /* slave: 38,*/
103         {0, 0},                                                                           /* lo du dir adv */
104         {0, 0},                                                                            /* hi duty dir adv */
105         {0, 0},  /* non connectable adv */
106         {HCI_SUPP_LE_STATES_CONN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_CONN_ADV_PASS_SCAN_OFF},   /*  passive scan */
107         {HCI_SUPP_LE_STATES_CONN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_CONN_ADV_ACTIVE_SCAN_OFF},  /*   active scan */
108         {0, 0}   /* scanable adv */
109     },
110     {   /* init */
111         {HCI_SUPP_LE_STATES_CONN_ADV_INIT_MASK, HCI_SUPP_LE_STATES_CONN_ADV_INIT_OFF},      /* conn_adv: 32 */
112         {0, 0},                                                                             /* init */
113         {HCI_SUPP_LE_STATES_INIT_MASTER_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_OFF},          /* master 28 */
114         {HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_OFF}, /* slave 41 */
115         {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 */
116         {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 */
117         {HCI_SUPP_LE_STATES_NON_CONN_INIT_MASK, HCI_SUPP_LE_STATES_NON_CONN_INIT_OFF},  /*  non connectable adv */
118         {HCI_SUPP_LE_STATES_PASS_SCAN_INIT_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_INIT_OFF},   /* passive scan */
119         {HCI_SUPP_LE_STATES_ACTIVE_SCAN_INIT_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_INIT_OFF},  /*  active scan */
120         {HCI_SUPP_LE_STATES_SCAN_ADV_INIT_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_INIT_OFF}   /* scanable adv */
121
122     },
123     {   /* master */
124         {HCI_SUPP_LE_STATES_CONN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_CONN_ADV_MASTER_OFF},  /* conn_adv: 35 */
125         {HCI_SUPP_LE_STATES_INIT_MASTER_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_OFF},          /* init 28 */
126         {HCI_SUPP_LE_STATES_INIT_MASTER_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_OFF},          /* master 28 */
127         {HCI_SUPP_LE_STATES_CONN_ADV_INIT_MASK, HCI_SUPP_LE_STATES_CONN_ADV_INIT_OFF},      /* slave: 32 */
128         {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 */
129         {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 */
130         {HCI_SUPP_LE_STATES_NON_CONN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_MASTER_OFF},  /*  non connectable adv */
131         {HCI_SUPP_LE_STATES_PASS_SCAN_MASTER_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_MASTER_OFF},   /*  passive scan */
132         {HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASTER_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASTER_OFF},  /*   active scan */
133         {HCI_SUPP_LE_STATES_SCAN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_MASTER_OFF}   /*  scanable adv */
134
135     },
136     { /* slave */
137         {HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_OFF}, /* conn_adv: 38,*/
138         {HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_OFF}, /* init 41 */
139         {HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_MASK, HCI_SUPP_LE_STATES_INIT_MASTER_SLAVE_OFF}, /* master 41 */
140         {HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_CONN_ADV_SLAVE_OFF},        /* slave: 38,*/
141         {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 */
142         {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 */
143         {HCI_SUPP_LE_STATES_NON_CONN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_SLAVE_OFF},  /* non connectable adv */
144         {HCI_SUPP_LE_STATES_PASS_SCAN_SLAVE_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_SLAVE_OFF},   /* passive scan */
145         {HCI_SUPP_LE_STATES_ACTIVE_SCAN_SLAVE_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_SLAVE_OFF},  /*  active scan */
146         {HCI_SUPP_LE_STATES_SCAN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_SLAVE_OFF}   /* scanable adv */
147
148     },
149     { /* lo duty cycle adv */
150         {0, 0}, /* conn_adv: 38,*/
151         {HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_INIT_MASK, HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_INIT_OFF} ,/* init 34 */
152         {HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_MASTER_OFF}, /* master 37 */
153         {HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_LO_DUTY_DIR_ADV_SLAVE_OFF}, /* slave: 40 */
154         {0, 0},  /* lo duty cycle adv 40 */
155         {0, 0},   /* hi duty cycle adv 39 */
156         {0, 0},  /*  non connectable adv */
157         {0, 0},   /* TODO: passive scan, not covered? */
158         {0, 0},  /* TODO:  active scan, not covered? */
159         {0, 0}   /*  scanable adv */
160     },
161     { /* hi duty cycle adv */
162         {0, 0}, /* conn_adv: 38,*/
163         {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_INIT_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_INIT_OFF}, /* init 33 */
164         {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_MASTER_OFF}, /* master 36 */
165         {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_SLAVE_OFF},   /* slave: 39*/
166         {0, 0},  /* lo duty cycle adv 40 */
167         {0, 0},   /* hi duty cycle adv 39 */
168         {0, 0},  /* non connectable adv */
169         {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_PASS_SCAN_OFF},   /* passive scan */
170         {HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_HI_DUTY_DIR_ADV_ACTIVE_SCAN_OFF},  /* active scan */
171         {0, 0}   /* scanable adv */
172     },
173     { /* non connectable adv */
174         {0, 0}, /* conn_adv: */
175         {HCI_SUPP_LE_STATES_NON_CONN_INIT_MASK, HCI_SUPP_LE_STATES_NON_CONN_INIT_OFF}, /* init  */
176         {HCI_SUPP_LE_STATES_NON_CONN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_MASTER_OFF}, /* master  */
177         {HCI_SUPP_LE_STATES_NON_CONN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_SLAVE_OFF},   /* slave: */
178         {0, 0},  /* lo duty cycle adv */
179         {0, 0},   /* hi duty cycle adv */
180         {0, 0},  /* non connectable adv */
181         {HCI_SUPP_LE_STATES_NON_CONN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_PASS_SCAN_OFF},   /* passive scan */
182         {HCI_SUPP_LE_STATES_NON_CONN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_ACTIVE_SCAN_OFF},  /*  active scan */
183         {0, 0}   /* scanable adv */
184     },
185     { /* passive scan */
186         {HCI_SUPP_LE_STATES_CONN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_CONN_ADV_PASS_SCAN_OFF}, /* conn_adv: */
187         {HCI_SUPP_LE_STATES_PASS_SCAN_INIT_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_INIT_OFF}, /* init  */
188         {HCI_SUPP_LE_STATES_PASS_SCAN_MASTER_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_MASTER_OFF}, /* master  */
189         {HCI_SUPP_LE_STATES_PASS_SCAN_SLAVE_MASK, HCI_SUPP_LE_STATES_PASS_SCAN_SLAVE_OFF},   /* slave: */
190         {0, 0},  /* lo duty cycle adv */
191         {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 */
192         {HCI_SUPP_LE_STATES_NON_CONN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_PASS_SCAN_OFF},  /*  non connectable adv */
193         {0, 0},   /* passive scan */
194         {0, 0},  /* active scan */
195         {HCI_SUPP_LE_STATES_SCAN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_PASS_SCAN_OFF}   /* scanable adv */
196     },
197     { /* active scan */
198         {HCI_SUPP_LE_STATES_CONN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_CONN_ADV_ACTIVE_SCAN_OFF}, /* conn_adv: */
199         {HCI_SUPP_LE_STATES_ACTIVE_SCAN_INIT_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_INIT_OFF}, /* init  */
200         {HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASTER_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_MASTER_OFF}, /* master  */
201         {HCI_SUPP_LE_STATES_ACTIVE_SCAN_SLAVE_MASK, HCI_SUPP_LE_STATES_ACTIVE_SCAN_SLAVE_OFF},   /* slave: */
202         {0, 0},  /* lo duty cycle adv */
203         {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 */
204         {HCI_SUPP_LE_STATES_NON_CONN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_NON_CONN_ADV_ACTIVE_SCAN_OFF},  /*  non connectable adv */
205         {0, 0},   /* TODO: passive scan */
206         {0, 0},  /* TODO:  active scan */
207         {HCI_SUPP_LE_STATES_SCAN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_ACTIVE_SCAN_OFF}   /*  scanable adv */
208     },
209     { /* scanable adv */
210         {0, 0}, /* conn_adv: */
211         {HCI_SUPP_LE_STATES_SCAN_ADV_INIT_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_INIT_OFF}, /* init  */
212         {HCI_SUPP_LE_STATES_SCAN_ADV_MASTER_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_MASTER_OFF}, /* master  */
213         {HCI_SUPP_LE_STATES_SCAN_ADV_SLAVE_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_SLAVE_OFF},   /* slave: */
214         {0, 0},  /* lo duty cycle adv */
215         {0, 0},   /* hi duty cycle adv */
216         {0, 0},  /* non connectable adv */
217         {HCI_SUPP_LE_STATES_SCAN_ADV_PASS_SCAN_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_PASS_SCAN_OFF},   /*  passive scan */
218         {HCI_SUPP_LE_STATES_SCAN_ADV_ACTIVE_SCAN_MASK, HCI_SUPP_LE_STATES_SCAN_ADV_ACTIVE_SCAN_OFF},  /*  active scan */
219         {0, 0}   /* scanable adv */
220     }
221
222 };
223 /* check LE combo state supported */
224 #define BTM_LE_STATES_SUPPORTED(x, y, z)      ((x)[(z)] & (y))
225
226 /*******************************************************************************
227 **
228 ** Function         BTM_BleRegiseterConnParamCallback
229 **
230 ** Description      register connection parameters update callback func
231 **
232 ** Returns          void
233 **
234 *******************************************************************************/
235 void BTM_BleRegiseterConnParamCallback(tBTM_UPDATE_CONN_PARAM_CBACK *update_conn_param_cb)
236 {
237     conn_param_update_cb.update_conn_param_cb = update_conn_param_cb;
238 }
239
240 /*******************************************************************************
241 **
242 ** Function         BTM_BleUpdateAdvWhitelist
243 **
244 ** Description      Add or remove device from advertising white list
245 **
246 ** Returns          void
247 **
248 *******************************************************************************/
249 BOOLEAN BTM_BleUpdateAdvWhitelist(BOOLEAN add_remove, BD_ADDR remote_bda, tBTM_ADD_WHITELIST_CBACK *add_wl_cb)
250 {
251     return btm_update_dev_to_white_list(add_remove, remote_bda, add_wl_cb);
252 }
253
254 /*******************************************************************************
255 **
256 ** Function         BTM_BleUpdateAdvFilterPolicy
257 **
258 ** Description      This function update the filter policy of advertiser.
259 **
260 ** Parameter        adv_policy: advertising filter policy
261 **
262 ** Return           void
263 *******************************************************************************/
264 void BTM_BleUpdateAdvFilterPolicy(tBTM_BLE_AFP adv_policy)
265 {
266     tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
267     tBLE_ADDR_TYPE   init_addr_type = BLE_ADDR_PUBLIC;
268     BD_ADDR          p_addr_ptr = {0};
269     UINT8            adv_mode = p_cb->adv_mode;
270
271     BTM_TRACE_EVENT ("BTM_BleUpdateAdvFilterPolicy\n");
272
273     if (!controller_get_interface()->supports_ble()) {
274         return;
275     }
276
277     if (p_cb->afp != adv_policy) {
278         p_cb->afp = adv_policy;
279
280         /* if adv active, stop and restart */
281         btm_ble_stop_adv ();
282
283         if (p_cb->connectable_mode & BTM_BLE_CONNECTABLE)
284             p_cb->evt_type = btm_set_conn_mode_adv_init_addr(p_cb, p_addr_ptr, &init_addr_type,
285                              &p_cb->adv_addr_type);
286
287         btsnd_hcic_ble_write_adv_params ((UINT16)(p_cb->adv_interval_min ? p_cb->adv_interval_min :
288                                          BTM_BLE_GAP_ADV_SLOW_INT),
289                                          (UINT16)(p_cb->adv_interval_max ? p_cb->adv_interval_max :
290                                                  BTM_BLE_GAP_ADV_SLOW_INT),
291                                          p_cb->evt_type,
292                                          p_cb->adv_addr_type,
293                                          init_addr_type,
294                                          p_addr_ptr,
295                                          p_cb->adv_chnl_map,
296                                          p_cb->afp);
297
298         if (adv_mode == BTM_BLE_ADV_ENABLE) {
299             btm_ble_start_adv ();
300         }
301
302     }
303 }
304
305 /*******************************************************************************
306 **
307 ** Function         btm_ble_send_extended_scan_params
308 **
309 ** Description      This function sends out the extended scan parameters command to the controller
310 **
311 ** Parameters       scan_type - Scan type
312 **                  scan_int - Scan interval
313 **                  scan_win - Scan window
314 **                  addr_type_own - Own address type
315 **                  scan_filter_policy - Scan filter policy
316 **
317 ** Returns          TRUE or FALSE
318 **
319 *******************************************************************************/
320 BOOLEAN btm_ble_send_extended_scan_params(UINT8 scan_type, UINT32 scan_int,
321         UINT32 scan_win, UINT8 addr_type_own,
322         UINT8 scan_filter_policy)
323 {
324     UINT8 scan_param[HCIC_PARAM_SIZE_BLE_WRITE_EXTENDED_SCAN_PARAM];
325     UINT8 *pp_scan = scan_param;
326
327     memset(scan_param, 0, HCIC_PARAM_SIZE_BLE_WRITE_EXTENDED_SCAN_PARAM);
328
329     UINT8_TO_STREAM(pp_scan, scan_type);
330     UINT32_TO_STREAM(pp_scan, scan_int);
331     UINT32_TO_STREAM(pp_scan, scan_win);
332     UINT8_TO_STREAM(pp_scan, addr_type_own);
333     UINT8_TO_STREAM(pp_scan, scan_filter_policy);
334
335     BTM_TRACE_DEBUG("%s, %d, %d", __func__, scan_int, scan_win);
336     if ((BTM_VendorSpecificCommand(HCI_BLE_EXTENDED_SCAN_PARAMS_OCF,
337                                    HCIC_PARAM_SIZE_BLE_WRITE_EXTENDED_SCAN_PARAM, scan_param, NULL)) != BTM_SUCCESS) {
338         BTM_TRACE_ERROR("%s error sending extended scan parameters", __func__);
339         return FALSE;
340     }
341     return TRUE;
342 }
343
344 /*******************************************************************************
345 **
346 ** Function         BTM_BleObserve
347 **
348 ** Description      This procedure keep the device listening for advertising
349 **                  events from a broadcast device.
350 **
351 ** Parameters       start: start or stop observe.
352 **                  white_list: use white list in observer mode or not.
353 **
354 ** Returns          void
355 **
356 *******************************************************************************/
357 tBTM_STATUS BTM_BleObserve(BOOLEAN start, UINT32 duration,
358                            tBTM_INQ_RESULTS_CB *p_results_cb, tBTM_CMPL_CB *p_cmpl_cb)
359 {
360     tBTM_BLE_INQ_CB *p_inq = &btm_cb.ble_ctr_cb.inq_var;
361     tBTM_STATUS status = BTM_WRONG_MODE;
362
363     UINT32 scan_interval = !p_inq->scan_interval ? BTM_BLE_GAP_DISC_SCAN_INT : p_inq->scan_interval;
364     UINT32 scan_window = !p_inq->scan_window ? BTM_BLE_GAP_DISC_SCAN_WIN : p_inq->scan_window;
365
366     BTM_TRACE_EVENT ("%s : scan_type:%d, %d, %d\n", __func__, btm_cb.btm_inq_vars.scan_type,
367                      p_inq->scan_interval, p_inq->scan_window);
368
369     if (!controller_get_interface()->supports_ble()) {
370         return BTM_ILLEGAL_VALUE;
371     }
372
373     if (start) {
374         /* shared inquiry database, do not allow observe if any inquiry is active */
375         if (BTM_BLE_IS_OBS_ACTIVE(btm_cb.ble_ctr_cb.scan_activity)) {
376             BTM_TRACE_ERROR("%s Observe Already Active", __func__);
377             return status;
378         }
379
380         btm_cb.ble_ctr_cb.p_obs_results_cb = p_results_cb;
381         btm_cb.ble_ctr_cb.p_obs_cmpl_cb = p_cmpl_cb;
382         status = BTM_CMD_STARTED;
383
384         /* scan is not started */
385         if (!BTM_BLE_IS_SCAN_ACTIVE(btm_cb.ble_ctr_cb.scan_activity)) {
386             /* allow config of scan type */
387             p_inq->scan_type = (p_inq->scan_type == BTM_BLE_SCAN_MODE_NONE) ?
388                                BTM_BLE_SCAN_MODE_ACTI : p_inq->scan_type;
389             /* assume observe always not using white list */
390 #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
391             /* enable resolving list */
392             btm_ble_enable_resolving_list_for_platform(BTM_BLE_RL_SCAN);
393 #endif
394
395             if (cmn_ble_vsc_cb.extended_scan_support == 0) {
396                 btsnd_hcic_ble_set_scan_params(p_inq->scan_type, (UINT16)scan_interval,
397                                                (UINT16)scan_window,
398                                                btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type,
399                                                BTM_BLE_DEFAULT_SFP);
400             } else {
401                 btm_ble_send_extended_scan_params(p_inq->scan_type, scan_interval, scan_window,
402                                                   btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type,
403                                                   BTM_BLE_DEFAULT_SFP);
404             }
405
406             p_inq->scan_duplicate_filter = BTM_BLE_DUPLICATE_DISABLE;
407             status = btm_ble_start_scan();
408         }
409
410         if (status == BTM_CMD_STARTED) {
411             btm_cb.ble_ctr_cb.scan_activity |= BTM_LE_OBSERVE_ACTIVE;
412             if (duration != 0)
413                 /* start observer timer */
414             {
415                 btu_start_timer (&btm_cb.ble_ctr_cb.obs_timer_ent, BTU_TTYPE_BLE_OBSERVE, duration);
416             }
417         }
418     } else if (BTM_BLE_IS_OBS_ACTIVE(btm_cb.ble_ctr_cb.scan_activity)) {
419         status = BTM_CMD_STARTED;
420         btm_ble_stop_observe();
421     } else {
422         BTM_TRACE_ERROR("%s Observe not active\n", __func__);
423     }
424
425     return status;
426
427 }
428
429 /*******************************************************************************
430 **
431 ** Function         BTM_BleScan
432 **
433 ** Description      This procedure keep the device listening for advertising
434 **                  events from a broadcast device.
435 **
436 ** Parameters       start: start or stop scan.
437 **                  white_list: use white list in observer mode or not.
438 **
439 ** Returns          void
440 **
441 *******************************************************************************/
442 tBTM_STATUS BTM_BleScan(BOOLEAN start, UINT32 duration,
443                            tBTM_INQ_RESULTS_CB *p_results_cb, tBTM_CMPL_CB *p_cmpl_cb)
444 {
445     tBTM_BLE_INQ_CB *p_inq = &btm_cb.ble_ctr_cb.inq_var;
446     tBTM_STATUS status = BTM_WRONG_MODE;
447
448     if (!controller_get_interface()->supports_ble()) {
449         return BTM_ILLEGAL_VALUE;
450     }
451
452     if (start) {
453         /* shared inquiry database, do not allow scan if any inquiry is active */
454         if (BTM_BLE_IS_DISCO_ACTIVE(btm_cb.ble_ctr_cb.scan_activity)) {
455             BTM_TRACE_ERROR("%s scan already active", __func__);
456             return status;
457         }
458
459         btm_cb.ble_ctr_cb.p_scan_results_cb = p_results_cb;
460         btm_cb.ble_ctr_cb.p_scan_cmpl_cb = p_cmpl_cb;
461         status = BTM_CMD_STARTED;
462
463         /* scan is not started */
464         if (!BTM_BLE_IS_SCAN_ACTIVE(btm_cb.ble_ctr_cb.scan_activity)) {
465             /* assume observe always not using white list */
466 #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
467             /* enable resolving list */
468             btm_ble_enable_resolving_list_for_platform(BTM_BLE_RL_SCAN);
469 #endif
470             p_inq->scan_duplicate_filter = BTM_BLE_DUPLICATE_DISABLE;
471             status = btm_ble_start_scan();
472         }
473
474         if (status == BTM_CMD_STARTED) {
475             btm_cb.ble_ctr_cb.scan_activity |= BTM_LE_DISCOVER_ACTIVE;
476             if (duration != 0)
477                 /* start observer timer */
478             {
479                 btu_start_timer (&btm_cb.ble_ctr_cb.scan_timer_ent, BTU_TTYPE_BLE_SCAN, duration);
480             }
481         }
482     } else if (BTM_BLE_IS_DISCO_ACTIVE(btm_cb.ble_ctr_cb.scan_activity)) {
483         status = BTM_CMD_STARTED;
484         btm_ble_stop_discover();
485     } else {
486         BTM_TRACE_ERROR("%s scan not active\n", __func__);
487     }
488
489     return status;
490
491 }
492
493 /*******************************************************************************
494 **
495 ** Function         BTM_BleBroadcast
496 **
497 ** Description      This function is to start or stop broadcasting.
498 **
499 ** Parameters       start: start or stop broadcasting.
500 **
501 ** Returns          status.
502 **
503 *******************************************************************************/
504 tBTM_STATUS BTM_BleBroadcast(BOOLEAN start, tBTM_START_STOP_ADV_CMPL_CBACK  *p_stop_adv_cback)
505 {
506     tBTM_STATUS status = BTM_NO_RESOURCES;
507     tBTM_LE_RANDOM_CB *p_addr_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
508     tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
509     UINT8 evt_type = p_cb->scan_rsp ? BTM_BLE_DISCOVER_EVT : BTM_BLE_NON_CONNECT_EVT;
510
511     if (!controller_get_interface()->supports_ble()) {
512         return BTM_ILLEGAL_VALUE;
513     }
514
515 #ifdef  BTM_BLE_PC_ADV_TEST_MODE
516     if (BTM_BLE_PC_ADV_TEST_MODE) {
517         evt_type = p_cb->scan_rsp ? BTM_BLE_CONNECT_EVT : BTM_BLE_NON_CONNECT_EVT;
518     }
519 #endif
520     // if adv state is BTM_BLE_ADV_PENDING, return immediately
521     if (p_cb->state == BTM_BLE_ADV_PENDING) {
522         if (p_stop_adv_cback) {
523             (*p_stop_adv_cback)(HCI_ERR_ILLEGAL_COMMAND);
524         }
525         return BTM_BUSY;
526     }
527     if (start && p_cb->adv_mode == BTM_BLE_ADV_DISABLE) {
528         /* update adv params */
529         if (!btsnd_hcic_ble_write_adv_params ((UINT16)(p_cb->adv_interval_min ? p_cb->adv_interval_min :
530                                               BTM_BLE_GAP_ADV_INT),
531                                               (UINT16)(p_cb->adv_interval_max ? p_cb->adv_interval_max :
532                                                       BTM_BLE_GAP_ADV_INT),
533                                               evt_type,
534                                               p_addr_cb->own_addr_type,
535                                               p_cb->direct_bda.type,
536                                               p_cb->direct_bda.bda,
537                                               p_cb->adv_chnl_map,
538                                               p_cb->afp))
539
540         {
541             status = BTM_NO_RESOURCES;
542         } else {
543             p_cb->evt_type = evt_type;
544         }
545
546         status = btm_ble_start_adv ();
547     } else if (!start && p_cb->adv_mode == BTM_BLE_ADV_ENABLE) {
548         //save the stop adv callback to the BTM env.
549         p_cb->p_stop_adv_cb = p_stop_adv_cback;
550         status = btm_ble_stop_adv();
551 #if BLE_PRIVACY_SPT == TRUE
552         btm_ble_disable_resolving_list(BTM_BLE_RL_ADV, TRUE);
553 #endif
554     } else {
555         /*
556             1. start adv when adv has already started (not used)
557             2. stop adv shen adv has already stoped
558         */
559         status = BTM_SUCCESS;
560         if (p_stop_adv_cback) {
561             (*p_stop_adv_cback)(status);
562         }
563     }
564     return status;
565 }
566
567 #if BLE_VND_INCLUDED == TRUE
568 /*******************************************************************************
569 **
570 ** Function         btm_vsc_brcm_features_complete
571 **
572 ** Description      Command Complete callback for HCI_BLE_VENDOR_CAP_OCF
573 **
574 ** Returns          void
575 **
576 *******************************************************************************/
577 static void btm_ble_vendor_capability_vsc_cmpl_cback (tBTM_VSC_CMPL *p_vcs_cplt_params)
578 {
579     UINT8 status = 0xFF;
580     UINT8 *p;
581
582     BTM_TRACE_DEBUG("%s", __func__);
583
584     /* Check status of command complete event */
585     if ((p_vcs_cplt_params->opcode == HCI_BLE_VENDOR_CAP_OCF) &&
586             (p_vcs_cplt_params->param_len > 0)) {
587         p = p_vcs_cplt_params->p_param_buf;
588         STREAM_TO_UINT8(status, p);
589     }
590
591     if (status == HCI_SUCCESS) {
592         STREAM_TO_UINT8(btm_cb.cmn_ble_vsc_cb.adv_inst_max, p);
593         STREAM_TO_UINT8(btm_cb.cmn_ble_vsc_cb.rpa_offloading, p);
594         STREAM_TO_UINT16(btm_cb.cmn_ble_vsc_cb.tot_scan_results_strg, p);
595         STREAM_TO_UINT8(btm_cb.cmn_ble_vsc_cb.max_irk_list_sz, p);
596         STREAM_TO_UINT8(btm_cb.cmn_ble_vsc_cb.filter_support, p);
597         STREAM_TO_UINT8(btm_cb.cmn_ble_vsc_cb.max_filter, p);
598         STREAM_TO_UINT8(btm_cb.cmn_ble_vsc_cb.energy_support, p);
599
600         if (p_vcs_cplt_params->param_len > BTM_VSC_CHIP_CAPABILITY_RSP_LEN_L_RELEASE) {
601             STREAM_TO_UINT16(btm_cb.cmn_ble_vsc_cb.version_supported, p);
602         } else {
603             btm_cb.cmn_ble_vsc_cb.version_supported = BTM_VSC_CHIP_CAPABILITY_L_VERSION;
604         }
605
606         if (btm_cb.cmn_ble_vsc_cb.version_supported >= BTM_VSC_CHIP_CAPABILITY_M_VERSION) {
607             STREAM_TO_UINT16(btm_cb.cmn_ble_vsc_cb.total_trackable_advertisers, p);
608             STREAM_TO_UINT16(btm_cb.cmn_ble_vsc_cb.extended_scan_support, p);
609             STREAM_TO_UINT16(btm_cb.cmn_ble_vsc_cb.debug_logging_supported, p);
610         }
611         btm_cb.cmn_ble_vsc_cb.values_read = TRUE;
612     }
613
614     BTM_TRACE_DEBUG("%s: stat=%d, irk=%d, ADV ins:%d, rpa=%d, ener=%d, ext_scan=%d",
615                     __func__, status, btm_cb.cmn_ble_vsc_cb.max_irk_list_sz,
616                     btm_cb.cmn_ble_vsc_cb.adv_inst_max, btm_cb.cmn_ble_vsc_cb.rpa_offloading,
617                     btm_cb.cmn_ble_vsc_cb.energy_support, btm_cb.cmn_ble_vsc_cb.extended_scan_support);
618
619     if (BTM_BleMaxMultiAdvInstanceCount() > 0) {
620         btm_ble_multi_adv_init();
621     }
622
623     if (btm_cb.cmn_ble_vsc_cb.max_filter > 0) {
624         btm_ble_adv_filter_init();
625     }
626
627 #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
628     /* VS capability included and non-4.2 device */
629     if (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz > 0 &&
630             controller_get_interface()->get_ble_resolving_list_max_size() == 0) {
631         btm_ble_resolving_list_init(btm_cb.cmn_ble_vsc_cb.max_irk_list_sz);
632     }
633 #endif
634
635     if (btm_cb.cmn_ble_vsc_cb.tot_scan_results_strg > 0) {
636         btm_ble_batchscan_init();
637     }
638
639     if (p_ctrl_le_feature_rd_cmpl_cback != NULL) {
640         p_ctrl_le_feature_rd_cmpl_cback(status);
641     }
642 }
643 #endif
644
645 /*******************************************************************************
646 **
647 ** Function         BTM_BleGetVendorCapabilities
648 **
649 ** Description      This function reads local LE features
650 **
651 ** Parameters       p_cmn_vsc_cb : Locala LE capability structure
652 **
653 ** Returns          void
654 **
655 *******************************************************************************/
656 extern void BTM_BleGetVendorCapabilities(tBTM_BLE_VSC_CB *p_cmn_vsc_cb)
657 {
658     BTM_TRACE_DEBUG("BTM_BleGetVendorCapabilities");
659
660     if (NULL != p_cmn_vsc_cb) {
661         *p_cmn_vsc_cb = btm_cb.cmn_ble_vsc_cb;
662     }
663 }
664
665 /******************************************************************************
666 **
667 ** Function         BTM_BleReadControllerFeatures
668 **
669 ** Description      Reads BLE specific controller features
670 **
671 ** Parameters:      tBTM_BLE_CTRL_FEATURES_CBACK : Callback to notify when features are read
672 **
673 ** Returns          void
674 **
675 *******************************************************************************/
676 extern void BTM_BleReadControllerFeatures(tBTM_BLE_CTRL_FEATURES_CBACK  *p_vsc_cback)
677 {
678     if (TRUE == btm_cb.cmn_ble_vsc_cb.values_read) {
679         return;
680     }
681
682 #if BLE_VND_INCLUDED == TRUE
683     BTM_TRACE_DEBUG("BTM_BleReadControllerFeatures");
684
685     p_ctrl_le_feature_rd_cmpl_cback = p_vsc_cback;
686     if ( BTM_VendorSpecificCommand (HCI_BLE_VENDOR_CAP_OCF,
687                                     0,
688                                     NULL,
689                                     btm_ble_vendor_capability_vsc_cmpl_cback)
690             != BTM_CMD_STARTED) {
691         BTM_TRACE_ERROR("LE Get_Vendor Capabilities Command Failed.");
692     }
693 #else
694     UNUSED(p_vsc_cback);
695 #endif
696     return ;
697 }
698
699 /*******************************************************************************
700 **
701 ** Function         BTM_BleEnableMixedPrivacyMode
702 **
703 ** Description      This function is called to enabled Mixed mode if privacy 1.2
704 **                  is applicable in controller.
705 **
706 ** Parameters       mixed_on:  mixed mode to be used or not.
707 **
708 ** Returns          void
709 **
710 *******************************************************************************/
711 void BTM_BleEnableMixedPrivacyMode(BOOLEAN mixed_on)
712 {
713
714 #if BLE_PRIVACY_SPT == TRUE
715     btm_cb.ble_ctr_cb.mixed_mode = mixed_on;
716
717     /* TODO: send VSC to enabled mixed mode */
718 #endif
719 }
720
721 /*******************************************************************************
722 **
723 ** Function         BTM_BleConfigPrivacy
724 **
725 ** Description      This function is called to enable or disable the privacy in
726 **                   LE channel of the local device.
727 **
728 ** Parameters       privacy_mode:  privacy mode on or off.
729 **
730 ** Returns          BOOLEAN privacy mode set success; otherwise failed.
731 **
732 *******************************************************************************/
733 BOOLEAN BTM_BleConfigPrivacy(BOOLEAN privacy_mode, tBTM_SET_LOCAL_PRIVACY_CBACK *set_local_privacy_cback)
734 {
735 #if BLE_PRIVACY_SPT == TRUE
736     tBTM_BLE_CB  *p_cb = &btm_cb.ble_ctr_cb;
737     tBTM_LE_RANDOM_CB *random_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
738     if (random_cb){
739         random_cb->set_local_privacy_cback = set_local_privacy_cback;
740     }else{
741         BTM_TRACE_ERROR("%s,random_cb = NULL", __func__);
742     }
743
744     BTM_TRACE_EVENT ("%s\n", __func__);
745
746     /* if LE is not supported, return error */
747     if (!controller_get_interface()->supports_ble()) {
748         return FALSE;
749     }
750
751 /*
752  *  Temporary solutions for pair with random address:
753  *  can't set privacy when advertising, scaning or using static random address
754  *  We will do futher work here
755  */
756     if (p_cb->privacy_mode == BTM_PRIVACY_NONE
757         && random_cb->own_addr_type == BLE_ADDR_RANDOM) {
758         BTM_TRACE_ERROR("Have set random adress, can't set privacy ");
759         return FALSE;
760     }
761     if (!(p_cb->inq_var.state != BTM_BLE_STOP_SCAN && p_cb->inq_var.state != BTM_BLE_STOP_ADV)) {
762         BTM_TRACE_ERROR("Advertising or scaning now, can't set privacy ");
763         return FALSE;
764     }
765
766 #if (defined(GAP_INCLUDED) && GAP_INCLUDED == TRUE && GATTS_INCLUDED == TRUE)
767     uint8_t addr_resolution = 0;
768 #endif  /* defined(GAP_INCLUDED) && GAP_INCLUDED == TRUE && GATTS_INCLUDED == TRUE */
769     if (!privacy_mode) { /* if privacy disabled, always use public address */
770         p_cb->addr_mgnt_cb.own_addr_type = BLE_ADDR_PUBLIC;
771         p_cb->privacy_mode = BTM_PRIVACY_NONE;
772         if (random_cb && random_cb->set_local_privacy_cback){
773             (*random_cb->set_local_privacy_cback)(BTM_SET_PRIVACY_SUCCESS);
774             random_cb->set_local_privacy_cback = NULL;
775         }
776     } else { /* privacy is turned on*/
777         /* always set host random address, used when privacy 1.1 or priavcy 1.2 is disabled */
778         p_cb->addr_mgnt_cb.own_addr_type = BLE_ADDR_RANDOM;
779         btm_gen_resolvable_private_addr((void *)btm_gen_resolve_paddr_low);
780
781         if (BTM_BleMaxMultiAdvInstanceCount() > 0) {
782             btm_ble_multi_adv_enb_privacy(privacy_mode);
783         }
784
785         /* 4.2 controller only allow privacy 1.2 or mixed mode, resolvable private address in controller */
786         if (controller_get_interface()->supports_ble_privacy()) {
787 #if (defined(GAP_INCLUDED) && GAP_INCLUDED == TRUE && GATTS_INCLUDED == TRUE)
788             addr_resolution = 1;
789 #endif  /* defined(GAP_INCLUDED) && GAP_INCLUDED == TRUE && GATTS_INCLUDED == TRUE */
790             /* check vendor specific capability */
791             p_cb->privacy_mode = btm_cb.ble_ctr_cb.mixed_mode ? BTM_PRIVACY_MIXED : BTM_PRIVACY_1_2;
792         } else { /* 4.1/4.0 controller */
793             p_cb->privacy_mode = BTM_PRIVACY_1_1;
794         }
795     }
796
797 #if (defined(GAP_INCLUDED) && GAP_INCLUDED == TRUE && GATTS_INCLUDED == TRUE)
798     GAP_BleAttrDBUpdate (GATT_UUID_GAP_CENTRAL_ADDR_RESOL, (tGAP_BLE_ATTR_VALUE *)&addr_resolution);
799 #endif
800
801     return TRUE;
802 #else
803     return FALSE;
804 #endif
805 }
806
807 /*******************************************************************************
808 **
809 ** Function          BTM_BleMaxMultiAdvInstanceCount
810 **
811 ** Description        Returns max number of multi adv instances supported by controller
812 **
813 ** Returns          Max multi adv instance count
814 **
815 *******************************************************************************/
816 extern UINT8  BTM_BleMaxMultiAdvInstanceCount(void)
817 {
818     return btm_cb.cmn_ble_vsc_cb.adv_inst_max < BTM_BLE_MULTI_ADV_MAX ?
819            btm_cb.cmn_ble_vsc_cb.adv_inst_max : BTM_BLE_MULTI_ADV_MAX;
820 }
821
822 #if BLE_PRIVACY_SPT == TRUE
823 /*******************************************************************************
824 **
825 ** Function         btm_ble_resolve_random_addr_on_adv
826 **
827 ** Description      resolve random address complete callback.
828 **
829 ** Returns          void
830 **
831 *******************************************************************************/
832 static void btm_ble_resolve_random_addr_on_adv(void *p_rec, void *p)
833 {
834     tBTM_SEC_DEV_REC    *match_rec = (tBTM_SEC_DEV_REC *) p_rec;
835     UINT8       addr_type = BLE_ADDR_RANDOM;
836     BD_ADDR     bda;
837     UINT8       *pp = (UINT8 *)p + 1;
838     UINT8           evt_type;
839
840     BTM_TRACE_EVENT ("btm_ble_resolve_random_addr_on_adv ");
841
842     STREAM_TO_UINT8    (evt_type, pp);
843     STREAM_TO_UINT8    (addr_type, pp);
844     STREAM_TO_BDADDR   (bda, pp);
845
846     if (match_rec) {
847         BTM_TRACE_DEBUG("Random match");
848         match_rec->ble.active_addr_type = BTM_BLE_ADDR_RRA;
849         memcpy(match_rec->ble.cur_rand_addr, bda, BD_ADDR_LEN);
850
851         if (btm_ble_init_pseudo_addr(match_rec, bda)) {
852             memcpy(bda, match_rec->bd_addr, BD_ADDR_LEN);
853         } else {
854             // Assign the original address to be the current report address
855             memcpy(bda, match_rec->ble.pseudo_addr, BD_ADDR_LEN);
856         }
857     }
858
859     btm_ble_process_adv_pkt_cont(bda, addr_type, evt_type, pp);
860
861     return;
862 }
863 #endif
864
865 /*******************************************************************************
866 **
867 ** Function         BTM_BleLocalPrivacyEnabled
868 **
869 ** Description        Checks if local device supports private address
870 **
871 ** Returns          Return TRUE if local privacy is enabled else FALSE
872 **
873 *******************************************************************************/
874 BOOLEAN BTM_BleLocalPrivacyEnabled(void)
875 {
876 #if BLE_PRIVACY_SPT == TRUE
877     return (btm_cb.ble_ctr_cb.privacy_mode != BTM_PRIVACY_NONE);
878 #else
879     return false;
880 #endif
881 }
882
883 /*******************************************************************************
884 **
885 ** Function         BTM_BleSetBgConnType
886 **
887 ** Description      This function is called to set BLE connectable mode for a
888 **                  peripheral device.
889 **
890 ** Parameters       bg_conn_type: it can be auto connection, or selective connection.
891 **                  p_select_cback: callback function when selective connection procedure
892 **                              is being used.
893 **
894 ** Returns          void
895 **
896 *******************************************************************************/
897 BOOLEAN BTM_BleSetBgConnType(tBTM_BLE_CONN_TYPE   bg_conn_type,
898                              tBTM_BLE_SEL_CBACK   *p_select_cback)
899 {
900     BOOLEAN started = TRUE;
901
902     BTM_TRACE_EVENT ("BTM_BleSetBgConnType ");
903     if (!controller_get_interface()->supports_ble()) {
904         return FALSE;
905     }
906
907     if (btm_cb.ble_ctr_cb.bg_conn_type != bg_conn_type) {
908         switch (bg_conn_type) {
909         case BTM_BLE_CONN_AUTO:
910             btm_ble_start_auto_conn(TRUE);
911             break;
912
913         case BTM_BLE_CONN_SELECTIVE:
914             if (btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_AUTO) {
915                 btm_ble_start_auto_conn(FALSE);
916             }
917             btm_ble_start_select_conn(TRUE, p_select_cback);
918             break;
919
920         case BTM_BLE_CONN_NONE:
921             if (btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_AUTO) {
922                 btm_ble_start_auto_conn(FALSE);
923             } else if (btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_SELECTIVE) {
924                 btm_ble_start_select_conn(FALSE, NULL);
925             }
926             started = TRUE;
927             break;
928
929         default:
930             BTM_TRACE_ERROR("invalid bg connection type : %d ", bg_conn_type);
931             started = FALSE;
932             break;
933         }
934
935         if (started) {
936             btm_cb.ble_ctr_cb.bg_conn_type = bg_conn_type;
937         }
938     }
939     return started;
940 }
941
942 /*******************************************************************************
943 **
944 ** Function         BTM_BleClearBgConnDev
945 **
946 ** Description      This function is called to clear the whitelist,
947 **                  end any pending whitelist connections,
948 *                   and reset the local bg device list.
949 **
950 ** Parameters       void
951 **
952 ** Returns          void
953 **
954 *******************************************************************************/
955 void BTM_BleClearBgConnDev(void)
956 {
957     btm_ble_start_auto_conn(FALSE);
958     btm_ble_clear_white_list();
959     gatt_reset_bgdev_list();
960 }
961
962 /*******************************************************************************
963 **
964 ** Function         BTM_BleUpdateBgConnDev
965 **
966 ** Description      This function is called to add or remove a device into/from
967 **                  background connection procedure. The background connection
968 *                   procedure is decided by the background connection type, it can be
969 *                   auto connection, or selective connection.
970 **
971 ** Parameters       add_remove: TRUE to add; FALSE to remove.
972 **                  remote_bda: device address to add/remove.
973 **
974 ** Returns          void
975 **
976 *******************************************************************************/
977 BOOLEAN BTM_BleUpdateBgConnDev(BOOLEAN add_remove, BD_ADDR   remote_bda)
978 {
979     BTM_TRACE_EVENT("%s() add=%d", __func__, add_remove);
980     return btm_update_dev_to_white_list(add_remove, remote_bda, NULL);
981 }
982
983 /*******************************************************************************
984 **
985 ** Function         BTM_BleSetConnectableMode
986 **
987 ** Description      This function is called to set BLE connectable mode for a
988 **                  peripheral device.
989 **
990 ** Parameters       conn_mode:  directed connectable mode, or non-directed.It can
991 **                              be BTM_BLE_CONNECT_EVT, BTM_BLE_CONNECT_DIR_EVT or
992 **                              BTM_BLE_CONNECT_LO_DUTY_DIR_EVT
993 **
994 ** Returns          BTM_ILLEGAL_VALUE if controller does not support BLE.
995 **                  BTM_SUCCESS is status set successfully; otherwise failure.
996 **
997 *******************************************************************************/
998 tBTM_STATUS BTM_BleSetConnectableMode(tBTM_BLE_CONN_MODE connectable_mode)
999 {
1000     tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
1001
1002     BTM_TRACE_EVENT ("%s connectable_mode = %d ", __func__, connectable_mode);
1003     if (!controller_get_interface()->supports_ble()) {
1004         return BTM_ILLEGAL_VALUE;
1005     }
1006
1007     p_cb->directed_conn = connectable_mode;
1008     return btm_ble_set_connectability( p_cb->connectable_mode);
1009 }
1010
1011 /*******************************************************************************
1012 **
1013 ** Function         btm_set_conn_mode_adv_init_addr
1014 **
1015 ** Description      set initator address type and local address type based on adv
1016 **                  mode.
1017 **
1018 **
1019 *******************************************************************************/
1020 static UINT8 btm_set_conn_mode_adv_init_addr(tBTM_BLE_INQ_CB *p_cb,
1021         BD_ADDR_PTR p_peer_addr_ptr,
1022         tBLE_ADDR_TYPE *p_peer_addr_type,
1023         tBLE_ADDR_TYPE *p_own_addr_type)
1024 {
1025     UINT8 evt_type;
1026 #if BLE_PRIVACY_SPT == TRUE
1027     UINT8 i = BTM_SEC_MAX_DEVICE_RECORDS;
1028     tBTM_SEC_DEV_REC    *p_dev_rec;
1029 #endif  ///BLE_PRIVACY_SPT == TRUE
1030     evt_type = (p_cb->connectable_mode == BTM_BLE_NON_CONNECTABLE) ? \
1031                ((p_cb->scan_rsp) ? BTM_BLE_DISCOVER_EVT : BTM_BLE_NON_CONNECT_EVT )\
1032                : BTM_BLE_CONNECT_EVT;
1033
1034     if (evt_type == BTM_BLE_CONNECT_EVT) {
1035         evt_type = p_cb->directed_conn;
1036
1037         if ( p_cb->directed_conn == BTM_BLE_CONNECT_DIR_EVT ||
1038                 p_cb->directed_conn == BTM_BLE_CONNECT_LO_DUTY_DIR_EVT) {
1039
1040 #if BLE_PRIVACY_SPT == TRUE
1041             /* for privacy 1.2, convert peer address as static, own address set as ID addr */
1042             if (btm_cb.ble_ctr_cb.privacy_mode ==  BTM_PRIVACY_1_2 ||
1043                     btm_cb.ble_ctr_cb.privacy_mode ==  BTM_PRIVACY_MIXED) {
1044                 /* only do so for bonded device */
1045                 if ((p_dev_rec = btm_find_or_alloc_dev (p_cb->direct_bda.bda)) != NULL &&
1046                         p_dev_rec->ble.in_controller_list & BTM_RESOLVING_LIST_BIT) {
1047                     btm_ble_enable_resolving_list(BTM_BLE_RL_ADV);
1048                     memcpy(p_peer_addr_ptr, p_dev_rec->ble.static_addr, BD_ADDR_LEN);
1049                     *p_peer_addr_type = p_dev_rec->ble.static_addr_type;
1050                     *p_own_addr_type = BLE_ADDR_RANDOM_ID;
1051                     return evt_type;
1052                 }
1053                 /* otherwise fall though as normal directed adv */
1054                 else {
1055                     btm_ble_disable_resolving_list(BTM_BLE_RL_ADV, TRUE);
1056                 }
1057             }
1058 #endif
1059             /* direct adv mode does not have privacy, if privacy is not enabled  */
1060             *p_peer_addr_type  = p_cb->direct_bda.type;
1061             memcpy(p_peer_addr_ptr, p_cb->direct_bda.bda, BD_ADDR_LEN);
1062             return evt_type;
1063         }
1064     }
1065
1066     /* undirect adv mode or non-connectable mode*/
1067 #if BLE_PRIVACY_SPT == TRUE
1068     /* when privacy 1.2 privacy only mode is used, or mixed mode */
1069     if ((btm_cb.ble_ctr_cb.privacy_mode ==  BTM_PRIVACY_1_2 && p_cb->afp != AP_SCAN_CONN_ALL) ||
1070             btm_cb.ble_ctr_cb.privacy_mode ==  BTM_PRIVACY_MIXED) {
1071         /* if enhanced privacy is required, set Identity address and matching IRK peer */
1072         for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i ++) {
1073             if ((btm_cb.sec_dev_rec[i].sec_flags & BTM_SEC_IN_USE) != 0 &&
1074                     (btm_cb.sec_dev_rec[i].ble.in_controller_list & BTM_RESOLVING_LIST_BIT) != 0) {
1075                 memcpy(p_peer_addr_ptr, btm_cb.sec_dev_rec[i].ble.static_addr, BD_ADDR_LEN);
1076                 *p_peer_addr_type = btm_cb.sec_dev_rec[i].ble.static_addr_type;
1077                 break;
1078             }
1079         }
1080
1081         if (i != BTM_SEC_MAX_DEVICE_RECORDS) {
1082             *p_own_addr_type = BLE_ADDR_RANDOM_ID;
1083         } else
1084             /* resolving list is empty, not enabled */
1085         {
1086             *p_own_addr_type = BLE_ADDR_RANDOM;
1087         }
1088     }
1089     /* privacy 1.1, or privacy 1.2, general discoverable/connectable mode, disable privacy in */
1090     /* controller fall back to host based privacy */
1091     else if (btm_cb.ble_ctr_cb.privacy_mode !=  BTM_PRIVACY_NONE) {
1092         *p_own_addr_type = BLE_ADDR_RANDOM;
1093     }
1094 #endif
1095
1096     /* if no privacy,do not set any peer address,*/
1097     /* local address type go by global privacy setting */
1098     return evt_type;
1099 }
1100
1101 /*******************************************************************************
1102 **
1103 ** Function         BTM_BleSetAdvParams
1104 **
1105 ** Description      This function is called to set advertising parameters.
1106 **
1107 ** Parameters       adv_int_min: minimum advertising interval
1108 **                  adv_int_max: maximum advertising interval
1109 **                  p_dir_bda: connectable direct initiator's LE device address
1110 **                  chnl_map: advertising channel map.
1111 **
1112 ** Returns          void
1113 **
1114 *******************************************************************************/
1115 tBTM_STATUS BTM_BleSetAdvParams(UINT16 adv_int_min, UINT16 adv_int_max,
1116                                 tBLE_BD_ADDR *p_dir_bda,
1117                                 tBTM_BLE_ADV_CHNL_MAP chnl_map)
1118 {
1119     tBTM_LE_RANDOM_CB *p_addr_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
1120     tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
1121     tBTM_STATUS status = BTM_SUCCESS;
1122     BD_ADDR     p_addr_ptr =  {0};
1123     tBLE_ADDR_TYPE   init_addr_type = BLE_ADDR_PUBLIC;
1124     tBLE_ADDR_TYPE   own_addr_type = p_addr_cb->own_addr_type;
1125     UINT8            adv_mode = p_cb->adv_mode;
1126
1127     BTM_TRACE_EVENT ("BTM_BleSetAdvParams");
1128
1129     if (!controller_get_interface()->supports_ble()) {
1130         return BTM_ILLEGAL_VALUE;
1131     }
1132
1133     if (!BTM_BLE_ISVALID_PARAM(adv_int_min, BTM_BLE_ADV_INT_MIN, BTM_BLE_ADV_INT_MAX) ||
1134             !BTM_BLE_ISVALID_PARAM(adv_int_max, BTM_BLE_ADV_INT_MIN, BTM_BLE_ADV_INT_MAX)) {
1135         return BTM_ILLEGAL_VALUE;
1136     }
1137
1138     p_cb->adv_interval_min = adv_int_min;
1139     p_cb->adv_interval_max = adv_int_max;
1140     p_cb->adv_chnl_map = chnl_map;
1141
1142     if (p_dir_bda) {
1143         memcpy(&p_cb->direct_bda, p_dir_bda, sizeof(tBLE_BD_ADDR));
1144     }
1145
1146     BTM_TRACE_EVENT ("update params for an active adv\n");
1147
1148     btm_ble_stop_adv();
1149
1150     p_cb->evt_type = btm_set_conn_mode_adv_init_addr(p_cb, p_addr_ptr, &init_addr_type,
1151                      &own_addr_type);
1152
1153     /* update adv params */
1154     btsnd_hcic_ble_write_adv_params (p_cb->adv_interval_min,
1155                                      p_cb->adv_interval_max,
1156                                      p_cb->evt_type,
1157                                      own_addr_type,
1158                                      init_addr_type,
1159                                      p_addr_ptr,
1160                                      p_cb->adv_chnl_map,
1161                                      p_cb->afp);
1162
1163     if (adv_mode == BTM_BLE_ADV_ENABLE) {
1164         btm_ble_start_adv();
1165     }
1166
1167     return status;
1168 }
1169
1170
1171 /*******************************************************************************
1172 **
1173 ** Function         BTM_BleSetAdvParamsStartAdv
1174 **
1175 ** Description      This function is called to set all of the advertising parameters.
1176 **
1177 ** Parameters:       None.
1178 **
1179 ** Returns          void
1180 **
1181 *******************************************************************************/
1182 tBTM_STATUS BTM_BleSetAdvParamsStartAdv(UINT16 adv_int_min, UINT16 adv_int_max, UINT8 adv_type,
1183                                         tBLE_ADDR_TYPE own_bda_type, tBLE_BD_ADDR *p_dir_bda,
1184                                         tBTM_BLE_ADV_CHNL_MAP chnl_map, tBTM_BLE_AFP afp, tBTM_START_ADV_CMPL_CBACK *adv_cb)
1185 {
1186     tBTM_LE_RANDOM_CB *p_addr_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
1187     tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
1188
1189     BTM_TRACE_EVENT ("BTM_BleSetAdvParamsStartAdv\n");
1190
1191     if (!controller_get_interface()->supports_ble()) {
1192         return BTM_ILLEGAL_VALUE;
1193     }
1194
1195 /*
1196  *  Temporary solutions for pair with random address:
1197  *  can't set advertising with BLE_ADDR_PUBLIC when having set random adress or in privacy mode
1198  *  We will do futher work here
1199  */
1200     if (btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type == BLE_ADDR_RANDOM && own_bda_type == BLE_ADDR_PUBLIC) {
1201         BTM_TRACE_ERROR ("own_addr_type is BLE_ADDR_RANDOM but use BLE_ADDR_PUBLIC\n");
1202         return BTM_ILLEGAL_VALUE;
1203     }
1204
1205     if (!BTM_BLE_ISVALID_PARAM(adv_int_min, BTM_BLE_ADV_INT_MIN, BTM_BLE_ADV_INT_MAX) ||
1206             !BTM_BLE_ISVALID_PARAM(adv_int_max, BTM_BLE_ADV_INT_MIN, BTM_BLE_ADV_INT_MAX)) {
1207         return BTM_ILLEGAL_VALUE;
1208     }
1209
1210     if(adv_type == BTM_BLE_CONNECT_DIR_EVT){
1211         btm_ble_set_topology_mask(BTM_BLE_STATE_HI_DUTY_DIR_ADV_BIT);
1212     }else if(adv_type == BTM_BLE_CONNECT_LO_DUTY_DIR_EVT){
1213         btm_ble_set_topology_mask(BTM_BLE_STATE_LO_DUTY_DIR_ADV_BIT);
1214     }else if(adv_type == BTM_BLE_NON_CONNECT_EVT){
1215         btm_ble_set_topology_mask(BTM_BLE_STATE_NON_CONN_ADV_BIT);
1216     }
1217
1218     p_cb->adv_interval_min = adv_int_min;
1219     p_cb->adv_interval_max = adv_int_max;
1220     p_cb->adv_chnl_map = chnl_map;
1221     p_addr_cb->own_addr_type = own_bda_type;
1222     p_cb->evt_type = adv_type;
1223     p_cb->afp = afp;
1224     p_cb->p_adv_cb = adv_cb;
1225
1226     if (p_dir_bda) {
1227         memcpy(&p_cb->direct_bda, p_dir_bda, sizeof(tBLE_BD_ADDR));
1228     }
1229
1230     BTM_TRACE_EVENT ("update params for an active adv\n");
1231     // if adv state is BTM_BLE_ADV_PENDING, return immediately
1232     if (p_cb->state == BTM_BLE_ADV_PENDING) {
1233         if (p_cb->p_adv_cb) {
1234             (*p_cb->p_adv_cb)(HCI_ERR_ILLEGAL_COMMAND);
1235         }
1236         return BTM_BUSY;
1237     }
1238     /* host will stop adv first and then  start adv again if adv has already started
1239        it will get callback twice.
1240     */
1241     if (p_cb->adv_mode == BTM_BLE_ADV_ENABLE) {
1242         p_cb->adv_callback_twice = TRUE;
1243     }
1244     tBTM_STATUS status = btm_ble_stop_adv();
1245     if (status != BTM_SUCCESS) {
1246         p_cb->adv_callback_twice = FALSE;
1247     }
1248
1249     /* update adv params */
1250     btsnd_hcic_ble_write_adv_params (adv_int_min,
1251                                      adv_int_max,
1252                                      adv_type,
1253                                      own_bda_type,
1254                                      p_dir_bda->type,
1255                                      p_dir_bda->bda,
1256                                      chnl_map,
1257                                      p_cb->afp);
1258
1259     return btm_ble_start_adv();
1260 }
1261
1262
1263
1264
1265 /*******************************************************************************
1266 **
1267 ** Function         BTM_BleReadAdvParams
1268 **
1269 ** Description      This function is called to set advertising parameters.
1270 **
1271 ** Parameters       adv_int_min: minimum advertising interval
1272 **                  adv_int_max: maximum advertising interval
1273 **                  p_dir_bda: connectable direct initiator's LE device address
1274 **                  chnl_map: advertising channel map.
1275 **
1276 ** Returns          void
1277 **
1278 *******************************************************************************/
1279 void BTM_BleReadAdvParams (UINT16 *adv_int_min, UINT16 *adv_int_max,
1280                            tBLE_BD_ADDR *p_dir_bda, tBTM_BLE_ADV_CHNL_MAP *p_chnl_map)
1281 {
1282     tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
1283
1284     BTM_TRACE_EVENT ("BTM_BleReadAdvParams ");
1285     if (!controller_get_interface()->supports_ble()) {
1286         return ;
1287     }
1288
1289     *adv_int_min = p_cb->adv_interval_min;
1290     *adv_int_max = p_cb->adv_interval_max;
1291     *p_chnl_map = p_cb->adv_chnl_map;
1292
1293     if (p_dir_bda != NULL) {
1294         memcpy(p_dir_bda, &p_cb->direct_bda, sizeof(tBLE_BD_ADDR));
1295     }
1296 }
1297
1298 /*******************************************************************************
1299 **
1300 ** Function         BTM_BleSetScanParams
1301 **
1302 ** Description      This function is called to set scan parameters.
1303 **
1304 ** Parameters       client_if - Client IF
1305 **                  scan_interval - Scan interval
1306 **                  scan_window - Scan window
1307 **                  scan_mode -    Scan mode
1308 **                  scan_setup_status_cback - Scan param setup status callback
1309 **
1310 ** Returns          void
1311 **
1312 *******************************************************************************/
1313 void BTM_BleSetScanParams(tGATT_IF client_if, UINT32 scan_interval, UINT32 scan_window,
1314                           tBLE_SCAN_MODE scan_mode,
1315                           tBLE_SCAN_PARAM_SETUP_CBACK scan_setup_status_cback)
1316 {
1317     tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
1318     UINT32 max_scan_interval;
1319     UINT32 max_scan_window;
1320
1321     BTM_TRACE_EVENT ("%s\n", __func__);
1322     if (!controller_get_interface()->supports_ble()) {
1323         return;
1324     }
1325
1326     /* If not supporting extended scan support, use the older range for checking */
1327     if (btm_cb.cmn_ble_vsc_cb.extended_scan_support == 0) {
1328         max_scan_interval = BTM_BLE_SCAN_INT_MAX;
1329         max_scan_window = BTM_BLE_SCAN_WIN_MAX;
1330     } else {
1331         /* If supporting extended scan support, use the new extended range for checking */
1332         max_scan_interval = BTM_BLE_EXT_SCAN_INT_MAX;
1333         max_scan_window = BTM_BLE_EXT_SCAN_WIN_MAX;
1334     }
1335
1336     if (BTM_BLE_ISVALID_PARAM(scan_interval, BTM_BLE_SCAN_INT_MIN, max_scan_interval) &&
1337             BTM_BLE_ISVALID_PARAM(scan_window, BTM_BLE_SCAN_WIN_MIN, max_scan_window) &&
1338             (scan_mode == BTM_BLE_SCAN_MODE_ACTI || scan_mode == BTM_BLE_SCAN_MODE_PASS)) {
1339         p_cb->scan_type = scan_mode;
1340         p_cb->scan_interval = scan_interval;
1341         p_cb->scan_window = scan_window;
1342
1343         if (scan_setup_status_cback != NULL) {
1344             scan_setup_status_cback(client_if, BTM_SUCCESS);
1345         }
1346     } else {
1347         if (scan_setup_status_cback != NULL) {
1348             scan_setup_status_cback(client_if, BTM_ILLEGAL_VALUE);
1349         }
1350
1351         BTM_TRACE_ERROR("Illegal params: scan_interval = %d scan_window = %d\n",
1352                         scan_interval, scan_window);
1353     }
1354
1355 }
1356
1357 void BTM_BleSetScanFilterParams(tGATT_IF client_if, UINT32 scan_interval, UINT32 scan_window,
1358                                 tBLE_SCAN_MODE scan_mode, UINT8 addr_type_own, tBTM_BLE_SFP scan_filter_policy,
1359                                 tBLE_SCAN_PARAM_SETUP_CBACK scan_setup_status_cback)
1360 {
1361     tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
1362     UINT32 max_scan_interval;
1363     UINT32 max_scan_window;
1364
1365     BTM_TRACE_EVENT ("%s\n", __func__);
1366     if (!controller_get_interface()->supports_ble()) {
1367         return;
1368     }
1369
1370 /*
1371  *  Temporary solutions for pair with random address:
1372  *  can't set scan with BLE_ADDR_PUBLIC when having set random adress or in privacy mode
1373  *  We will do futher work here
1374  */
1375     if (btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type == BLE_ADDR_RANDOM && addr_type_own == BLE_ADDR_PUBLIC) {
1376         BTM_TRACE_ERROR ("own_addr_type is BLE_ADDR_RANDOM but use BLE_ADDR_PUBLIC\n");
1377         if (scan_setup_status_cback != NULL) {
1378             scan_setup_status_cback(client_if, BTM_ILLEGAL_VALUE);
1379         }
1380         return;
1381     }
1382
1383     /* If not supporting extended scan support, use the older range for checking */
1384     if (btm_cb.cmn_ble_vsc_cb.extended_scan_support == 0) {
1385         max_scan_interval = BTM_BLE_SCAN_INT_MAX;
1386         max_scan_window = BTM_BLE_SCAN_WIN_MAX;
1387     } else {
1388         /* If supporting extended scan support, use the new extended range for checking */
1389         max_scan_interval = BTM_BLE_EXT_SCAN_INT_MAX;
1390         max_scan_window = BTM_BLE_EXT_SCAN_WIN_MAX;
1391     }
1392
1393     if (BTM_BLE_ISVALID_PARAM(scan_interval, BTM_BLE_SCAN_INT_MIN, max_scan_interval) &&
1394             BTM_BLE_ISVALID_PARAM(scan_window, BTM_BLE_SCAN_WIN_MIN, max_scan_window) &&
1395             (scan_mode == BTM_BLE_SCAN_MODE_ACTI || scan_mode == BTM_BLE_SCAN_MODE_PASS)) {
1396         p_cb->scan_type = scan_mode;
1397         p_cb->scan_interval = scan_interval;
1398         p_cb->scan_window = scan_window;
1399         p_cb->sfp = scan_filter_policy;
1400         p_cb->scan_params_set = TRUE;
1401
1402         btsnd_hcic_ble_set_scan_params(p_cb->scan_type, (UINT16)scan_interval,
1403                                        (UINT16)scan_window,
1404                                        addr_type_own,
1405                                        scan_filter_policy);
1406
1407         if (scan_setup_status_cback != NULL) {
1408             scan_setup_status_cback(client_if, BTM_SUCCESS);
1409         }
1410     } else {
1411         if (scan_setup_status_cback != NULL) {
1412             scan_setup_status_cback(client_if, BTM_ILLEGAL_VALUE);
1413         }
1414
1415         BTM_TRACE_ERROR("Illegal params: scan_interval = %d scan_window = %d\n",
1416                         scan_interval, scan_window);
1417     }
1418 }
1419
1420
1421 /*******************************************************************************
1422 **
1423 ** Function         BTM_BleWriteScanRsp
1424 **
1425 ** Description      This function is called to write LE scan response.
1426 **
1427 ** Parameters:      p_scan_rsp: scan response information.
1428 **
1429 ** Returns          void
1430 **
1431 *******************************************************************************/
1432 tBTM_STATUS BTM_BleWriteScanRsp(tBTM_BLE_AD_MASK data_mask, tBTM_BLE_ADV_DATA *p_data)
1433 {
1434     tBTM_STATUS     status = BTM_NO_RESOURCES;
1435     UINT8   rsp_data[BTM_BLE_AD_DATA_LEN],
1436             *p = rsp_data;
1437
1438     BTM_TRACE_EVENT (" BTM_BleWriteScanRsp");
1439
1440     if (!controller_get_interface()->supports_ble()) {
1441         return BTM_ILLEGAL_VALUE;
1442     }
1443
1444     memset(rsp_data, 0, BTM_BLE_AD_DATA_LEN);
1445     btm_ble_build_adv_data(&data_mask, &p, p_data);
1446
1447     if (btsnd_hcic_ble_set_scan_rsp_data((UINT8)(p - rsp_data), rsp_data)) {
1448         status = BTM_SUCCESS;
1449
1450         if (data_mask != 0) {
1451             btm_cb.ble_ctr_cb.inq_var.scan_rsp = TRUE;
1452         } else {
1453             btm_cb.ble_ctr_cb.inq_var.scan_rsp = FALSE;
1454         }
1455     } else {
1456         status = BTM_ILLEGAL_VALUE;
1457     }
1458
1459     return status;
1460 }
1461
1462 /*******************************************************************************
1463 **
1464 ** Function         BTM_BleWriteScanRspRaw
1465 **
1466 ** Description      This function is called to write raw scan response data
1467 **
1468 ** Parameters:      None.
1469 **
1470 ** Returns          void
1471 **
1472 *******************************************************************************/
1473 tBTM_STATUS BTM_BleWriteScanRspRaw(UINT8 *p_raw_scan_rsp, UINT32 raw_scan_rsp_len)
1474 {
1475     if (btsnd_hcic_ble_set_scan_rsp_data((UINT8)raw_scan_rsp_len, p_raw_scan_rsp)) {
1476         return BTM_SUCCESS;
1477     } else {
1478         return BTM_NO_RESOURCES;
1479     }
1480 }
1481
1482 /*******************************************************************************
1483 **
1484 ** Function         BTM_BleWriteAdvData
1485 **
1486 ** Description      This function is called to write advertising data.
1487 **
1488 ** Parameters:       None.
1489 **
1490 ** Returns          void
1491 **
1492 *******************************************************************************/
1493 tBTM_STATUS BTM_BleWriteAdvData(tBTM_BLE_AD_MASK data_mask, tBTM_BLE_ADV_DATA *p_data)
1494 {
1495     tBTM_BLE_LOCAL_ADV_DATA *p_cb_data = &btm_cb.ble_ctr_cb.inq_var.adv_data;
1496     UINT8  *p;
1497     tBTM_BLE_AD_MASK   mask = data_mask;
1498
1499     BTM_TRACE_EVENT ("BTM_BleWriteAdvData ");
1500
1501     if (!controller_get_interface()->supports_ble()) {
1502         return BTM_ILLEGAL_VALUE;
1503     }
1504
1505     memset(p_cb_data, 0, sizeof(tBTM_BLE_LOCAL_ADV_DATA));
1506     p = p_cb_data->ad_data;
1507     p_cb_data->data_mask = data_mask;
1508
1509     p_cb_data->p_flags = btm_ble_build_adv_data(&mask, &p, p_data);
1510
1511     p_cb_data->p_pad = p;
1512
1513     if (mask != 0) {
1514         BTM_TRACE_DEBUG("Partial data write into ADV");
1515     }
1516
1517     p_cb_data->data_mask &= ~mask;
1518
1519     if (btsnd_hcic_ble_set_adv_data((UINT8)(p_cb_data->p_pad - p_cb_data->ad_data),
1520                                     p_cb_data->ad_data)) {
1521         return BTM_SUCCESS;
1522     } else {
1523         return BTM_NO_RESOURCES;
1524     }
1525
1526 }
1527
1528
1529 /*******************************************************************************
1530 **
1531 ** Function         BTM_BleWriteAdvDataRaw
1532 **
1533 ** Description      This function is called to write raw advertising data.
1534 **
1535 ** Parameters:       None.
1536 **
1537 ** Returns          void
1538 **
1539 *******************************************************************************/
1540 tBTM_STATUS BTM_BleWriteAdvDataRaw(UINT8 *p_raw_adv, UINT32 raw_adv_len)
1541 {
1542     if (btsnd_hcic_ble_set_adv_data((UINT8)raw_adv_len, p_raw_adv)) {
1543         return BTM_SUCCESS;
1544     } else {
1545         return BTM_NO_RESOURCES;
1546     }
1547 }
1548
1549
1550 /*******************************************************************************
1551 **
1552 ** Function         BTM_BleSetRandAddress
1553 **
1554 ** Description      This function is called to set the LE random address.
1555 **
1556 ** Parameters:       None.
1557 **
1558 ** Returns          void
1559 **
1560 *******************************************************************************/
1561 BOOLEAN BTM_BleSetRandAddress(BD_ADDR rand_addr)
1562 {
1563     BOOLEAN set_flag = false;
1564
1565         if (rand_addr == NULL)
1566                 return set_flag;
1567
1568 /*
1569  *  Temporary solutions for pair with random address:
1570  *  can't set rand address when advertising, scaning or in privacy mode
1571  *  We will do futher work here
1572  */
1573 #if BLE_PRIVACY_SPT == TRUE
1574     if (btm_cb.ble_ctr_cb.privacy_mode != BTM_PRIVACY_NONE) {
1575         BTM_TRACE_ERROR("privacy_mode is not BTM_PRIVACY_NONE ");
1576         return set_flag;
1577     }
1578
1579 #endif
1580     if (!(btm_cb.ble_ctr_cb.inq_var.state != BTM_BLE_STOP_SCAN && btm_cb.ble_ctr_cb.inq_var.state != BTM_BLE_STOP_ADV)) {
1581         BTM_TRACE_ERROR("Advertising or scaning now, can't set randaddress ");
1582         return FALSE;
1583     }
1584     memcpy(btm_cb.ble_ctr_cb.addr_mgnt_cb.private_addr, rand_addr, BD_ADDR_LEN);
1585     btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type = BLE_ADDR_RANDOM;
1586     //send the set random address to the controller
1587     set_flag = btsnd_hcic_ble_set_random_addr(rand_addr);
1588     return set_flag;
1589 }
1590
1591 /*******************************************************************************
1592 **
1593 ** Function         BTM_CheckAdvData
1594 **
1595 ** Description      This function is called to get ADV data for a specific type.
1596 **
1597 ** Parameters       p_adv - pointer of ADV data
1598 **                  type   - finding ADV data type
1599 **                  p_length - return the length of ADV data not including type
1600 **
1601 ** Returns          pointer of ADV data
1602 **
1603 *******************************************************************************/
1604 UINT8 *BTM_CheckAdvData( UINT8 *p_adv, UINT8 type, UINT8 *p_length)
1605 {
1606     UINT8 *p = p_adv;
1607     UINT8 length;
1608     UINT8 adv_type;
1609     BTM_TRACE_API("BTM_CheckAdvData type=0x%02X", type);
1610
1611     STREAM_TO_UINT8(length, p);
1612
1613     while ( length && (p - p_adv <= BTM_BLE_CACHE_ADV_DATA_MAX)) {
1614         STREAM_TO_UINT8(adv_type, p);
1615
1616         if ( adv_type == type ) {
1617             /* length doesn't include itself */
1618             *p_length = length - 1; /* minus the length of type */
1619             return p;
1620         }
1621         p += length - 1; /* skip the length of data */
1622         STREAM_TO_UINT8(length, p);
1623     }
1624
1625     *p_length = 0;
1626     return NULL;
1627 }
1628
1629 /*******************************************************************************
1630 **
1631 ** Function         BTM__BLEReadDiscoverability
1632 **
1633 ** Description      This function is called to read the current LE discoverability
1634 **                  mode of the device.
1635 **
1636 ** Returns          BTM_BLE_NON_DISCOVERABLE ,BTM_BLE_LIMITED_DISCOVERABLE or
1637 **                     BTM_BLE_GENRAL_DISCOVERABLE
1638 **
1639 *******************************************************************************/
1640 UINT16 BTM_BleReadDiscoverability()
1641 {
1642     BTM_TRACE_API("%s\n", __FUNCTION__);
1643
1644     return (btm_cb.ble_ctr_cb.inq_var.discoverable_mode);
1645 }
1646
1647 /*******************************************************************************
1648 **
1649 ** Function         BTM__BLEReadConnectability
1650 **
1651 ** Description      This function is called to read the current LE connectibility
1652 **                  mode of the device.
1653 **
1654 ** Returns          BTM_BLE_NON_CONNECTABLE or BTM_BLE_CONNECTABLE
1655 **
1656 *******************************************************************************/
1657 UINT16 BTM_BleReadConnectability()
1658 {
1659     BTM_TRACE_API ("%s\n", __FUNCTION__);
1660
1661     return (btm_cb.ble_ctr_cb.inq_var.connectable_mode);
1662 }
1663
1664 void BTM_Recovery_Pre_State(void)
1665 {
1666     tBTM_BLE_INQ_CB *ble_inq_cb = &btm_cb.ble_ctr_cb.inq_var;
1667
1668     if (ble_inq_cb->state == BTM_BLE_ADVERTISING) {
1669         btm_ble_stop_adv();
1670         btm_ble_start_adv();
1671     } else if (ble_inq_cb->state == BTM_BLE_SCANNING) {
1672         btm_ble_start_scan();
1673     }
1674
1675     return;
1676 }
1677
1678 /*******************************************************************************
1679 **
1680 ** Function         btm_ble_build_adv_data
1681 **
1682 ** Description      This function is called build the adv data and rsp data.
1683 *******************************************************************************/
1684 UINT8 *btm_ble_build_adv_data(tBTM_BLE_AD_MASK *p_data_mask, UINT8 **p_dst,
1685                               tBTM_BLE_ADV_DATA *p_data)
1686 {
1687     UINT32 data_mask = *p_data_mask;
1688     UINT8   *p = *p_dst,
1689              *p_flag = NULL;
1690     UINT16  len = BTM_BLE_AD_DATA_LEN, cp_len = 0;
1691     UINT8   i = 0;
1692     tBTM_BLE_PROP_ELEM      *p_elem;
1693
1694     BTM_TRACE_EVENT (" btm_ble_build_adv_data");
1695
1696     /* build the adv data structure and build the data string */
1697     if (data_mask) {
1698         /* flags */
1699         if (data_mask & BTM_BLE_AD_BIT_FLAGS) {
1700             *p++ = MIN_ADV_LENGTH;
1701             *p++ = BTM_BLE_AD_TYPE_FLAG;
1702             p_flag = p;
1703             if (p_data) {
1704                 *p++ = p_data->flag;
1705             } else {
1706                 *p++ = 0;
1707             }
1708
1709             len -= 3;
1710
1711             data_mask &= ~BTM_BLE_AD_BIT_FLAGS;
1712         }
1713         /* appearance data */
1714         if (len > 3 && data_mask & BTM_BLE_AD_BIT_APPEARANCE) {
1715             *p++ = 3; /* length */
1716             *p++ = BTM_BLE_AD_TYPE_APPEARANCE;
1717             UINT16_TO_STREAM(p, p_data->appearance);
1718             len -= 4;
1719
1720             data_mask &= ~BTM_BLE_AD_BIT_APPEARANCE;
1721         }
1722         /* device name */
1723 #if BTM_MAX_LOC_BD_NAME_LEN > 0
1724         if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_DEV_NAME) {
1725             if (strlen(btm_cb.cfg.bd_name) > (UINT16)(len - MIN_ADV_LENGTH)) {
1726                 *p++ = len - MIN_ADV_LENGTH + 1;
1727                 *p++ = BTM_BLE_AD_TYPE_NAME_SHORT;
1728                 ARRAY_TO_STREAM(p, btm_cb.cfg.bd_name, len - MIN_ADV_LENGTH);
1729             } else {
1730                 cp_len = (UINT16)strlen(btm_cb.cfg.bd_name);
1731                 *p++ = cp_len + 1;
1732                 *p++ = BTM_BLE_AD_TYPE_NAME_CMPL;
1733                 ARRAY_TO_STREAM(p, btm_cb.cfg.bd_name, cp_len);
1734             }
1735             len -= (cp_len + MIN_ADV_LENGTH);
1736             data_mask &= ~BTM_BLE_AD_BIT_DEV_NAME;
1737         }
1738 #endif
1739         /* manufacturer data */
1740         if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_MANU &&
1741                 p_data && p_data->p_manu &&
1742                 p_data->p_manu->len != 0 && p_data->p_manu->p_val) {
1743             if (p_data->p_manu->len > (len - MIN_ADV_LENGTH)) {
1744                 cp_len = len - MIN_ADV_LENGTH;
1745             } else {
1746                 cp_len = p_data->p_manu->len;
1747             }
1748             LOG_DEBUG("cp_len = %d\n,p_data->p_manu->len=%d\n", cp_len, p_data->p_manu->len);
1749             for (int i = 0; i < p_data->p_manu->len; i++) {
1750                 LOG_DEBUG("p_data->p_manu->p_val[%d] = %x\n", i, p_data->p_manu->p_val[i]);
1751             }
1752             *p++ = cp_len + 1;
1753             *p++ = BTM_BLE_AD_TYPE_MANU;
1754             ARRAY_TO_STREAM(p, p_data->p_manu->p_val, cp_len);
1755             LOG_DEBUG("p_addr = %p\n,p_data->p_manu->p_val = %p\n", p, p_data->p_manu->p_val);
1756             len -= (cp_len + MIN_ADV_LENGTH);
1757             data_mask &= ~BTM_BLE_AD_BIT_MANU;
1758         }
1759         /* TX power */
1760         if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_TX_PWR) {
1761             *p++ = MIN_ADV_LENGTH;
1762             *p++ = BTM_BLE_AD_TYPE_TX_PWR;
1763             if (p_data->tx_power > BTM_BLE_ADV_TX_POWER_MAX) {
1764                 p_data->tx_power = BTM_BLE_ADV_TX_POWER_MAX;
1765             }
1766             *p++ = btm_ble_map_adv_tx_power(p_data->tx_power);
1767             len -= 3;
1768             data_mask &= ~BTM_BLE_AD_BIT_TX_PWR;
1769         }
1770         /* 16 bits services */
1771         if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_SERVICE &&
1772                 p_data && p_data->p_services &&
1773                 p_data->p_services->num_service != 0 &&
1774                 p_data->p_services->p_uuid) {
1775             if (p_data->p_services->num_service * LEN_UUID_16 > (len - MIN_ADV_LENGTH)) {
1776                 cp_len = (len - MIN_ADV_LENGTH) / LEN_UUID_16;
1777                 *p ++ = 1 + cp_len * LEN_UUID_16;
1778                 *p++ = BTM_BLE_AD_TYPE_16SRV_PART;
1779             } else {
1780                 cp_len = p_data->p_services->num_service;
1781                 *p++ = 1 + cp_len * LEN_UUID_16;
1782                 *p++ = BTM_BLE_AD_TYPE_16SRV_CMPL;
1783             }
1784             for (i = 0; i < cp_len; i ++) {
1785                 UINT16_TO_STREAM(p, *(p_data->p_services->p_uuid + i));
1786             }
1787
1788             len -= (cp_len * MIN_ADV_LENGTH + MIN_ADV_LENGTH);
1789             data_mask &= ~BTM_BLE_AD_BIT_SERVICE;
1790         }
1791         /* 32 bits service uuid */
1792         if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_SERVICE_32 &&
1793                 p_data && p_data->p_service_32b &&
1794                 p_data->p_service_32b->num_service != 0 &&
1795                 p_data->p_service_32b->p_uuid) {
1796             if ((p_data->p_service_32b->num_service * LEN_UUID_32) > (len - MIN_ADV_LENGTH)) {
1797                 cp_len = (len - MIN_ADV_LENGTH) / LEN_UUID_32;
1798                 *p ++ = 1 + cp_len * LEN_UUID_32;
1799                 *p++ = BTM_BLE_AD_TYPE_32SRV_PART;
1800             } else {
1801                 cp_len = p_data->p_service_32b->num_service;
1802                 *p++ = 1 + cp_len * LEN_UUID_32;
1803                 *p++ = BTM_BLE_AD_TYPE_32SRV_CMPL;
1804             }
1805             for (i = 0; i < cp_len; i ++) {
1806                 UINT32_TO_STREAM(p, *(p_data->p_service_32b->p_uuid + i));
1807             }
1808
1809             len -= (cp_len * LEN_UUID_32 + MIN_ADV_LENGTH);
1810             data_mask &= ~BTM_BLE_AD_BIT_SERVICE_32;
1811         }
1812         /* 128 bits services */
1813         if (len >= (MAX_UUID_SIZE + 2) && data_mask & BTM_BLE_AD_BIT_SERVICE_128 &&
1814                 p_data && p_data->p_services_128b) {
1815             *p ++ = 1 + MAX_UUID_SIZE;
1816             if (!p_data->p_services_128b->list_cmpl) {
1817                 *p++ = BTM_BLE_AD_TYPE_128SRV_PART;
1818             } else {
1819                 *p++ = BTM_BLE_AD_TYPE_128SRV_CMPL;
1820             }
1821
1822             ARRAY_TO_STREAM(p, p_data->p_services_128b->uuid128, MAX_UUID_SIZE);
1823
1824             len -= (MAX_UUID_SIZE + MIN_ADV_LENGTH);
1825             data_mask &= ~BTM_BLE_AD_BIT_SERVICE_128;
1826         }
1827         /* 32 bits Service Solicitation UUIDs */
1828         if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_SERVICE_32SOL &&
1829                 p_data && p_data->p_sol_service_32b &&
1830                 p_data->p_sol_service_32b->num_service != 0 &&
1831                 p_data->p_sol_service_32b->p_uuid) {
1832             if ((p_data->p_sol_service_32b->num_service * LEN_UUID_32) > (len - MIN_ADV_LENGTH)) {
1833                 cp_len = (len - MIN_ADV_LENGTH) / LEN_UUID_32;
1834                 *p ++ = 1 + cp_len * LEN_UUID_32;
1835             } else {
1836                 cp_len = p_data->p_sol_service_32b->num_service;
1837                 *p++ = 1 + cp_len * LEN_UUID_32;
1838             }
1839
1840             *p++ = BTM_BLE_AD_TYPE_32SOL_SRV_UUID;
1841             for (i = 0; i < cp_len; i ++) {
1842                 UINT32_TO_STREAM(p, *(p_data->p_sol_service_32b->p_uuid + i));
1843             }
1844
1845             len -= (cp_len * LEN_UUID_32 + MIN_ADV_LENGTH);
1846             data_mask &= ~BTM_BLE_AD_BIT_SERVICE_32SOL;
1847         }
1848         /* 128 bits Solicitation services UUID */
1849         if (len >= (MAX_UUID_SIZE + MIN_ADV_LENGTH) && data_mask & BTM_BLE_AD_BIT_SERVICE_128SOL &&
1850                 p_data && p_data->p_sol_service_128b) {
1851             *p ++ = 1 + MAX_UUID_SIZE;
1852             *p++ = BTM_BLE_AD_TYPE_128SOL_SRV_UUID;
1853             ARRAY_TO_STREAM(p, p_data->p_sol_service_128b->uuid128, MAX_UUID_SIZE);
1854             len -= (MAX_UUID_SIZE + MIN_ADV_LENGTH);
1855             data_mask &= ~BTM_BLE_AD_BIT_SERVICE_128SOL;
1856         }
1857         /* 16bits/32bits/128bits Service Data */
1858         if (len > MIN_ADV_LENGTH && data_mask & BTM_BLE_AD_BIT_SERVICE_DATA &&
1859                 p_data && p_data->p_service_data->len != 0 && p_data->p_service_data->p_val) {
1860             if (len  > (p_data->p_service_data->service_uuid.len + MIN_ADV_LENGTH)) {
1861                 if (p_data->p_service_data->len > (len - MIN_ADV_LENGTH)) {
1862                     cp_len = len - MIN_ADV_LENGTH - p_data->p_service_data->service_uuid.len;
1863                 } else {
1864                     cp_len = p_data->p_service_data->len;
1865                 }
1866
1867                 *p++ = cp_len + 1 + p_data->p_service_data->service_uuid.len;
1868                 if (p_data->p_service_data->service_uuid.len == LEN_UUID_16) {
1869                     *p++ = BTM_BLE_AD_TYPE_SERVICE_DATA;
1870                     UINT16_TO_STREAM(p, p_data->p_service_data->service_uuid.uu.uuid16);
1871                 } else if (p_data->p_service_data->service_uuid.len == LEN_UUID_32) {
1872                     *p++ = BTM_BLE_AD_TYPE_32SERVICE_DATA;
1873                     UINT32_TO_STREAM(p, p_data->p_service_data->service_uuid.uu.uuid32);
1874                 } else {
1875                     *p++ = BTM_BLE_AD_TYPE_128SERVICE_DATA;
1876                     ARRAY_TO_STREAM(p, p_data->p_service_data->service_uuid.uu.uuid128,
1877                                     LEN_UUID_128);
1878                 }
1879
1880                 ARRAY_TO_STREAM(p, p_data->p_service_data->p_val, cp_len);
1881
1882                 len -= (cp_len + MIN_ADV_LENGTH + p_data->p_service_data->service_uuid.len);
1883                 data_mask &= ~BTM_BLE_AD_BIT_SERVICE_DATA;
1884             } else {
1885                 BTM_TRACE_WARNING("service data does not fit");
1886             }
1887         }
1888
1889         if (len >= 6 && data_mask & BTM_BLE_AD_BIT_INT_RANGE &&
1890                 p_data) {
1891             *p++ = 5;
1892             *p++ = BTM_BLE_AD_TYPE_INT_RANGE;
1893             UINT16_TO_STREAM(p, p_data->int_range.low);
1894             UINT16_TO_STREAM(p, p_data->int_range.hi);
1895             len -= 6;
1896             data_mask &= ~BTM_BLE_AD_BIT_INT_RANGE;
1897         }
1898         if (data_mask & BTM_BLE_AD_BIT_PROPRIETARY && p_data && p_data->p_proprietary) {
1899             for (i = 0; i < p_data->p_proprietary->num_elem ; i ++) {
1900                 p_elem = p_data->p_proprietary->p_elem  + i;
1901
1902                 if (len >= (MIN_ADV_LENGTH + p_elem->len))/* len byte(1) + ATTR type(1) + Uuid len(2)
1903                                                           + value length */
1904                 {
1905                     *p ++ = p_elem->len + 1; /* Uuid len + value length */
1906                     *p ++ = p_elem->adv_type;
1907                     ARRAY_TO_STREAM(p, p_elem->p_val, p_elem->len);
1908
1909                     len -= (MIN_ADV_LENGTH + p_elem->len);
1910                 } else {
1911                     BTM_TRACE_WARNING("data exceed max adv packet length");
1912                     break;
1913                 }
1914             }
1915             data_mask &= ~BTM_BLE_AD_BIT_PROPRIETARY;
1916         }
1917     }
1918
1919     *p_data_mask = data_mask;
1920     *p_dst = p;
1921
1922     return p_flag;
1923 }
1924 /*******************************************************************************
1925 **
1926 ** Function         btm_ble_select_adv_interval
1927 **
1928 ** Description      select adv interval based on device mode
1929 **
1930 ** Returns          void
1931 **
1932 *******************************************************************************/
1933 void btm_ble_select_adv_interval(tBTM_BLE_INQ_CB *p_cb, UINT8 evt_type, UINT16 *p_adv_int_min, UINT16 *p_adv_int_max)
1934 {
1935     if (p_cb->adv_interval_min && p_cb->adv_interval_max) {
1936         *p_adv_int_min = p_cb->adv_interval_min;
1937         *p_adv_int_max = p_cb->adv_interval_max;
1938     } else {
1939         switch (evt_type) {
1940         case BTM_BLE_CONNECT_EVT:
1941         case BTM_BLE_CONNECT_LO_DUTY_DIR_EVT:
1942             *p_adv_int_min = *p_adv_int_max = BTM_BLE_GAP_ADV_FAST_INT_1;
1943             break;
1944
1945         case BTM_BLE_NON_CONNECT_EVT:
1946         case BTM_BLE_DISCOVER_EVT:
1947             *p_adv_int_min = *p_adv_int_max = BTM_BLE_GAP_ADV_FAST_INT_2;
1948             break;
1949
1950         /* connectable directed event */
1951         case BTM_BLE_CONNECT_DIR_EVT:
1952             *p_adv_int_min = BTM_BLE_GAP_ADV_DIR_MIN_INT;
1953             *p_adv_int_max = BTM_BLE_GAP_ADV_DIR_MAX_INT;
1954             break;
1955
1956         default:
1957             *p_adv_int_min = *p_adv_int_max = BTM_BLE_GAP_ADV_SLOW_INT;
1958             break;
1959         }
1960     }
1961     return;
1962 }
1963
1964 /*******************************************************************************
1965 **
1966 ** Function         btm_ble_update_dmt_flag_bits
1967 **
1968 ** Description      Obtain updated adv flag value based on connect and discoverability mode.
1969 **                  Also, setup DMT support value in the flag based on whether the controller
1970 **                  supports both LE and BR/EDR.
1971 **
1972 ** Parameters:      flag_value (Input / Output) - flag value
1973 **                  connect_mode (Input) - Connect mode value
1974 **                  disc_mode (Input) - discoverability mode
1975 **
1976 ** Returns          void
1977 **
1978 *******************************************************************************/
1979 void btm_ble_update_dmt_flag_bits(UINT8 *adv_flag_value, const UINT16 connect_mode,
1980                                   const UINT16 disc_mode)
1981 {
1982     /* BR/EDR non-discoverable , non-connectable */
1983     if ((disc_mode & BTM_DISCOVERABLE_MASK) == 0 &&
1984             (connect_mode & BTM_CONNECTABLE_MASK) == 0) {
1985         *adv_flag_value |= BTM_BLE_BREDR_NOT_SPT;
1986     } else {
1987         *adv_flag_value &= ~BTM_BLE_BREDR_NOT_SPT;
1988     }
1989
1990     /* if local controller support, mark both controller and host support in flag */
1991     if (controller_get_interface()->supports_simultaneous_le_bredr()) {
1992         *adv_flag_value |= (BTM_BLE_DMT_CONTROLLER_SPT | BTM_BLE_DMT_HOST_SPT);
1993     } else {
1994         *adv_flag_value &= ~(BTM_BLE_DMT_CONTROLLER_SPT | BTM_BLE_DMT_HOST_SPT);
1995     }
1996 }
1997
1998 /*******************************************************************************
1999 **
2000 ** Function         btm_ble_set_adv_flag
2001 **
2002 ** Description      Set adv flag in adv data.
2003 **
2004 ** Parameters:      connect_mode (Input)- Connect mode value
2005 **                  disc_mode (Input) - discoverability mode
2006 **
2007 ** Returns          void
2008 **
2009 *******************************************************************************/
2010 void btm_ble_set_adv_flag(UINT16 connect_mode, UINT16 disc_mode)
2011 {
2012     UINT8 flag = 0, old_flag = 0;
2013     tBTM_BLE_LOCAL_ADV_DATA *p_adv_data = &btm_cb.ble_ctr_cb.inq_var.adv_data;
2014
2015     if (p_adv_data->p_flags != NULL) {
2016         flag = old_flag = *(p_adv_data->p_flags);
2017     }
2018
2019     btm_ble_update_dmt_flag_bits (&flag, connect_mode, disc_mode);
2020
2021     LOG_DEBUG("disc_mode %04x", disc_mode);
2022     /* update discoverable flag */
2023     if (disc_mode & BTM_BLE_LIMITED_DISCOVERABLE) {
2024         flag &= ~BTM_BLE_GEN_DISC_FLAG;
2025         flag |= BTM_BLE_LIMIT_DISC_FLAG;
2026     } else if (disc_mode & BTM_BLE_GENERAL_DISCOVERABLE) {
2027         flag |= BTM_BLE_GEN_DISC_FLAG;
2028         flag &= ~BTM_BLE_LIMIT_DISC_FLAG;
2029     } else { /* remove all discoverable flags */
2030         flag &= ~(BTM_BLE_LIMIT_DISC_FLAG | BTM_BLE_GEN_DISC_FLAG);
2031     }
2032
2033     if (flag != old_flag) {
2034         LOG_ERROR("flag = 0x%x,old_flag = 0x%x", flag, old_flag);
2035         btm_ble_update_adv_flag(flag);
2036     }
2037 }
2038 /*******************************************************************************
2039 **
2040 ** Function         btm_ble_set_discoverability
2041 **
2042 ** Description      This function is called to set BLE discoverable mode.
2043 **
2044 ** Parameters:      combined_mode: discoverability mode.
2045 **
2046 ** Returns          BTM_SUCCESS is status set successfully; otherwise failure.
2047 **
2048 *******************************************************************************/
2049 tBTM_STATUS btm_ble_set_discoverability(UINT16 combined_mode)
2050 {
2051     tBTM_LE_RANDOM_CB   *p_addr_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
2052     tBTM_BLE_INQ_CB     *p_cb = &btm_cb.ble_ctr_cb.inq_var;
2053     UINT16              mode = (combined_mode &  BTM_BLE_DISCOVERABLE_MASK);
2054     UINT8               new_mode = BTM_BLE_ADV_ENABLE;
2055     UINT8               evt_type;
2056     tBTM_STATUS         status = BTM_SUCCESS;
2057     BD_ADDR             p_addr_ptr = {0};
2058     tBLE_ADDR_TYPE      init_addr_type = BLE_ADDR_PUBLIC,
2059                         own_addr_type = p_addr_cb->own_addr_type;
2060     UINT16              adv_int_min, adv_int_max;
2061
2062     BTM_TRACE_EVENT ("%s mode=0x%0x combined_mode=0x%x\n", __FUNCTION__, mode, combined_mode);
2063
2064     /*** Check mode parameter ***/
2065     if (mode > BTM_BLE_MAX_DISCOVERABLE) {
2066         return (BTM_ILLEGAL_VALUE);
2067     }
2068
2069     p_cb->discoverable_mode = mode;
2070
2071     evt_type = btm_set_conn_mode_adv_init_addr(p_cb, p_addr_ptr, &init_addr_type, &own_addr_type);
2072
2073     if (p_cb->connectable_mode == BTM_BLE_NON_CONNECTABLE && mode == BTM_BLE_NON_DISCOVERABLE) {
2074         new_mode = BTM_BLE_ADV_DISABLE;
2075     }
2076
2077     btm_ble_select_adv_interval(p_cb, evt_type, &adv_int_min, &adv_int_max);
2078
2079     btu_stop_timer(&p_cb->fast_adv_timer);
2080
2081     /* update adv params if start advertising */
2082     BTM_TRACE_EVENT ("evt_type=0x%x p-cb->evt_type=0x%x\n ", evt_type, p_cb->evt_type);
2083
2084     if (new_mode == BTM_BLE_ADV_ENABLE) {
2085         btm_ble_set_adv_flag (btm_cb.btm_inq_vars.connectable_mode, combined_mode);
2086
2087         if (evt_type != p_cb->evt_type || p_cb->adv_addr_type != own_addr_type
2088                 || !p_cb->fast_adv_on) {
2089             btm_ble_stop_adv();
2090
2091             /* update adv params */
2092             if (!btsnd_hcic_ble_write_adv_params (adv_int_min,
2093                                                   adv_int_max,
2094                                                   evt_type,
2095                                                   own_addr_type,
2096                                                   init_addr_type,
2097                                                   p_addr_ptr,
2098                                                   p_cb->adv_chnl_map,
2099                                                   p_cb->afp)) {
2100                 status = BTM_NO_RESOURCES;
2101             } else {
2102                 p_cb->evt_type = evt_type;
2103                 p_cb->adv_addr_type = own_addr_type;
2104             }
2105         }
2106     }
2107
2108     if (status == BTM_SUCCESS && p_cb->adv_mode != new_mode) {
2109         if (new_mode == BTM_BLE_ADV_ENABLE) {
2110             status = btm_ble_start_adv();
2111         } else {
2112             status = btm_ble_stop_adv();
2113         }
2114     }
2115
2116     if (p_cb->adv_mode == BTM_BLE_ADV_ENABLE) {
2117         p_cb->fast_adv_on = TRUE;
2118         /* start initial GAP mode adv timer */
2119         btu_start_timer (&p_cb->fast_adv_timer, BTU_TTYPE_BLE_GAP_FAST_ADV,
2120                          BTM_BLE_GAP_FAST_ADV_TOUT);
2121     } else {
2122 #if BLE_PRIVACY_SPT == TRUE
2123         btm_ble_disable_resolving_list(BTM_BLE_RL_ADV, TRUE);
2124 #endif
2125     }
2126
2127     /* set up stop advertising timer */
2128     if (status == BTM_SUCCESS && mode == BTM_BLE_LIMITED_DISCOVERABLE) {
2129         BTM_TRACE_EVENT ("start timer for limited disc mode duration=%d (180 secs)", BTM_BLE_GAP_LIM_TOUT);
2130         /* start Tgap(lim_timeout) */
2131         btu_start_timer (&p_cb->inq_timer_ent, BTU_TTYPE_BLE_GAP_LIM_DISC,
2132                          BTM_BLE_GAP_LIM_TOUT);
2133     }
2134     return status;
2135 }
2136
2137 /*******************************************************************************
2138 **
2139 ** Function         btm_ble_set_connectability
2140 **
2141 ** Description      This function is called to set BLE connectability mode.
2142 **
2143 ** Parameters:      combined_mode: connectability mode.
2144 **
2145 ** Returns          BTM_SUCCESS is status set successfully; otherwise failure.
2146 **
2147 *******************************************************************************/
2148 tBTM_STATUS btm_ble_set_connectability(UINT16 combined_mode)
2149 {
2150     tBTM_LE_RANDOM_CB       *p_addr_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
2151     tBTM_BLE_INQ_CB         *p_cb = &btm_cb.ble_ctr_cb.inq_var;
2152     UINT16                  mode = (combined_mode & BTM_BLE_CONNECTABLE_MASK);
2153     UINT8                   new_mode = BTM_BLE_ADV_ENABLE;
2154     UINT8                   evt_type;
2155     tBTM_STATUS             status = BTM_SUCCESS;
2156     BD_ADDR                 p_addr_ptr =  {0};
2157     tBLE_ADDR_TYPE          peer_addr_type = BLE_ADDR_PUBLIC,
2158                             own_addr_type = p_addr_cb->own_addr_type;
2159     UINT16                  adv_int_min, adv_int_max;
2160
2161     BTM_TRACE_EVENT ("%s mode=0x%0x combined_mode=0x%x\n", __FUNCTION__, mode, combined_mode);
2162
2163     /*** Check mode parameter ***/
2164     if (mode > BTM_BLE_MAX_CONNECTABLE) {
2165         return (BTM_ILLEGAL_VALUE);
2166     }
2167
2168     p_cb->connectable_mode = mode;
2169
2170     evt_type = btm_set_conn_mode_adv_init_addr(p_cb, p_addr_ptr, &peer_addr_type, &own_addr_type);
2171
2172     if (mode == BTM_BLE_NON_CONNECTABLE && p_cb->discoverable_mode == BTM_BLE_NON_DISCOVERABLE) {
2173         new_mode = BTM_BLE_ADV_DISABLE;
2174     }
2175
2176     btm_ble_select_adv_interval(p_cb, evt_type, &adv_int_min, &adv_int_max);
2177
2178     btu_stop_timer(&p_cb->fast_adv_timer);
2179     /* update adv params if needed */
2180     if (new_mode == BTM_BLE_ADV_ENABLE) {
2181         btm_ble_set_adv_flag (combined_mode, btm_cb.btm_inq_vars.discoverable_mode);
2182         if (p_cb->evt_type != evt_type || p_cb->adv_addr_type != p_addr_cb->own_addr_type
2183                 || !p_cb->fast_adv_on) {
2184             btm_ble_stop_adv();
2185
2186             if (!btsnd_hcic_ble_write_adv_params (adv_int_min,
2187                                                   adv_int_max,
2188                                                   evt_type,
2189                                                   own_addr_type,
2190                                                   peer_addr_type,
2191                                                   p_addr_ptr,
2192                                                   p_cb->adv_chnl_map,
2193                                                   p_cb->afp)) {
2194                 status = BTM_NO_RESOURCES;
2195             } else {
2196                 p_cb->evt_type = evt_type;
2197                 p_cb->adv_addr_type = own_addr_type;
2198             }
2199         }
2200     }
2201
2202     /* update advertising mode */
2203     if (status == BTM_SUCCESS && new_mode != p_cb->adv_mode) {
2204         if (new_mode == BTM_BLE_ADV_ENABLE) {
2205             status = btm_ble_start_adv();
2206         } else {
2207             status = btm_ble_stop_adv();
2208         }
2209     }
2210
2211     if (p_cb->adv_mode == BTM_BLE_ADV_ENABLE) {
2212         p_cb->fast_adv_on = TRUE;
2213         /* start initial GAP mode adv timer */
2214         btu_start_timer (&p_cb->fast_adv_timer, BTU_TTYPE_BLE_GAP_FAST_ADV,
2215                          BTM_BLE_GAP_FAST_ADV_TOUT);
2216     } else {
2217 #if BLE_PRIVACY_SPT == TRUE
2218         btm_ble_disable_resolving_list(BTM_BLE_RL_ADV, TRUE);
2219 #endif
2220     }
2221     return status;
2222 }
2223
2224
2225 /*******************************************************************************
2226 **
2227 ** Function         btm_ble_start_inquiry
2228 **
2229 ** Description      This function is called to start BLE inquiry procedure.
2230 **                  If the duration is zero, the periodic inquiry mode is cancelled.
2231 **
2232 ** Parameters:      mode - GENERAL or LIMITED inquiry
2233 **                  p_inq_params - pointer to the BLE inquiry parameter.
2234 **                  p_results_cb - callback returning pointer to results (tBTM_INQ_RESULTS)
2235 **                  p_cmpl_cb - callback indicating the end of an inquiry
2236 **
2237 **
2238 **
2239 ** Returns          BTM_CMD_STARTED if successfully started
2240 **                  BTM_NO_RESOURCES if could not allocate a message buffer
2241 **                  BTM_BUSY - if an inquiry is already active
2242 **
2243 *******************************************************************************/
2244 tBTM_STATUS btm_ble_start_inquiry (UINT8 mode, UINT8   duration)
2245 {
2246     tBTM_STATUS status = BTM_CMD_STARTED;
2247     tBTM_BLE_CB *p_ble_cb = &btm_cb.ble_ctr_cb;
2248     tBTM_INQUIRY_VAR_ST      *p_inq = &btm_cb.btm_inq_vars;
2249
2250     BTM_TRACE_DEBUG("btm_ble_start_inquiry: mode = %02x inq_active = 0x%02x", mode, btm_cb.btm_inq_vars.inq_active);
2251
2252     /* if selective connection is active, or inquiry is already active, reject it */
2253     if (BTM_BLE_IS_INQ_ACTIVE(p_ble_cb->scan_activity) ||
2254             BTM_BLE_IS_SEL_CONN_ACTIVE (p_ble_cb->scan_activity)) {
2255         BTM_TRACE_ERROR("LE Inquiry is active, can not start inquiry");
2256         return (BTM_BUSY);
2257     }
2258
2259     if (!BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity)) {
2260         btsnd_hcic_ble_set_scan_params(BTM_BLE_SCAN_MODE_ACTI,
2261                                        BTM_BLE_LOW_LATENCY_SCAN_INT,
2262                                        BTM_BLE_LOW_LATENCY_SCAN_WIN,
2263                                        btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type,
2264                                        SP_ADV_ALL);
2265 #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
2266         /* enable IRK list */
2267         btm_ble_enable_resolving_list_for_platform(BTM_BLE_RL_SCAN);
2268 #endif
2269         p_ble_cb->inq_var.scan_duplicate_filter  = BTM_BLE_DUPLICATE_DISABLE;
2270         status = btm_ble_start_scan();
2271     } else if ((p_ble_cb->inq_var.scan_interval != BTM_BLE_LOW_LATENCY_SCAN_INT) ||
2272                (p_ble_cb->inq_var.scan_window != BTM_BLE_LOW_LATENCY_SCAN_WIN)) {
2273         BTM_TRACE_DEBUG("%s, restart LE scan with low latency scan params", __FUNCTION__);
2274         btsnd_hcic_ble_set_scan_enable(BTM_BLE_SCAN_DISABLE, BTM_BLE_DUPLICATE_ENABLE);
2275         btsnd_hcic_ble_set_scan_params(BTM_BLE_SCAN_MODE_ACTI,
2276                                        BTM_BLE_LOW_LATENCY_SCAN_INT,
2277                                        BTM_BLE_LOW_LATENCY_SCAN_WIN,
2278                                        btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type,
2279                                        SP_ADV_ALL);
2280         btsnd_hcic_ble_set_scan_enable(BTM_BLE_SCAN_ENABLE, BTM_BLE_DUPLICATE_DISABLE);
2281     }
2282
2283     if (status == BTM_CMD_STARTED) {
2284         p_inq->inq_active |= mode;
2285         p_ble_cb->scan_activity |= mode;
2286
2287         BTM_TRACE_DEBUG("btm_ble_start_inquiry inq_active = 0x%02x", p_inq->inq_active);
2288
2289         if (duration != 0) {
2290             /* start inquiry timer */
2291             btu_start_timer (&p_ble_cb->inq_var.inq_timer_ent, BTU_TTYPE_BLE_INQUIRY, duration);
2292         }
2293     }
2294
2295     return status;
2296
2297 }
2298
2299 /*******************************************************************************
2300 **
2301 ** Function         btm_ble_read_remote_name_cmpl
2302 **
2303 ** Description      This function is called when BLE remote name is received.
2304 **
2305 ** Returns          void
2306 **
2307 *******************************************************************************/
2308 void btm_ble_read_remote_name_cmpl(BOOLEAN status, BD_ADDR bda, UINT16 length, char *p_name)
2309 {
2310     UINT8   hci_status = HCI_SUCCESS;
2311     BD_NAME bd_name;
2312
2313     memset(bd_name, 0, (BD_NAME_LEN + 1));
2314     if (length > BD_NAME_LEN) {
2315         length = BD_NAME_LEN;
2316     }
2317     memcpy((UINT8 *)bd_name, p_name, length);
2318
2319     if ((!status) || (length == 0)) {
2320         hci_status = HCI_ERR_HOST_TIMEOUT;
2321     }
2322
2323     btm_process_remote_name(bda, bd_name, length + 1, hci_status);
2324 #if (SMP_INCLUDED == TRUE)
2325     btm_sec_rmt_name_request_complete (bda, (UINT8 *)p_name, hci_status);
2326 #endif  ///SMP_INCLUDED == TRUE
2327 }
2328
2329 /*******************************************************************************
2330 **
2331 ** Function         btm_ble_read_remote_name
2332 **
2333 ** Description      This function read remote LE device name using GATT read
2334 **                  procedure.
2335 **
2336 ** Parameters:       None.
2337 **
2338 ** Returns          void
2339 **
2340 *******************************************************************************/
2341 tBTM_STATUS btm_ble_read_remote_name(BD_ADDR remote_bda, tBTM_INQ_INFO *p_cur, tBTM_CMPL_CB *p_cb)
2342 {
2343     tBTM_INQUIRY_VAR_ST      *p_inq = &btm_cb.btm_inq_vars;
2344
2345     if (!controller_get_interface()->supports_ble()) {
2346         return BTM_ERR_PROCESSING;
2347     }
2348
2349     if (p_cur &&
2350             p_cur->results.ble_evt_type != BTM_BLE_EVT_CONN_ADV &&
2351             p_cur->results.ble_evt_type != BTM_BLE_EVT_CONN_DIR_ADV) {
2352         BTM_TRACE_DEBUG("name request to non-connectable device failed.");
2353         return BTM_ERR_PROCESSING;
2354     }
2355
2356     /* read remote device name using GATT procedure */
2357     if (p_inq->remname_active) {
2358         return BTM_BUSY;
2359     }
2360
2361 #if (defined(GAP_INCLUDED) && GAP_INCLUDED == TRUE && GATTS_INCLUDED == TRUE)
2362     if (!GAP_BleReadPeerDevName(remote_bda, btm_ble_read_remote_name_cmpl)) {
2363         return BTM_BUSY;
2364     }
2365 #endif
2366
2367     p_inq->p_remname_cmpl_cb = p_cb;
2368     p_inq->remname_active = TRUE;
2369
2370     memcpy(p_inq->remname_bda, remote_bda, BD_ADDR_LEN);
2371
2372     btu_start_timer (&p_inq->rmt_name_timer_ent,
2373                      BTU_TTYPE_BTM_RMT_NAME,
2374                      BTM_EXT_BLE_RMT_NAME_TIMEOUT);
2375
2376     return BTM_CMD_STARTED;
2377 }
2378
2379 /*******************************************************************************
2380 **
2381 ** Function         btm_ble_cancel_remote_name
2382 **
2383 ** Description      This function cancel read remote LE device name.
2384 **
2385 ** Parameters:       None.
2386 **
2387 ** Returns          void
2388 **
2389 *******************************************************************************/
2390 BOOLEAN btm_ble_cancel_remote_name(BD_ADDR remote_bda)
2391 {
2392     tBTM_INQUIRY_VAR_ST      *p_inq = &btm_cb.btm_inq_vars;
2393     BOOLEAN     status = TRUE;
2394
2395 #if (defined(GAP_INCLUDED) && GAP_INCLUDED == TRUE && GATTS_INCLUDED == TRUE)
2396     status = GAP_BleCancelReadPeerDevName(remote_bda);
2397 #endif
2398
2399     p_inq->remname_active = FALSE;
2400     memset(p_inq->remname_bda, 0, BD_ADDR_LEN);
2401     btu_stop_timer(&p_inq->rmt_name_timer_ent);
2402
2403     return status;
2404 }
2405
2406 /*******************************************************************************
2407 **
2408 ** Function         btm_ble_update_adv_flag
2409 **
2410 ** Description      This function update the limited discoverable flag in the adv
2411 **                  data.
2412 **
2413 ** Parameters:       None.
2414 **
2415 ** Returns          void
2416 **
2417 *******************************************************************************/
2418 static void btm_ble_update_adv_flag(UINT8 flag)
2419 {
2420     tBTM_BLE_LOCAL_ADV_DATA *p_adv_data = &btm_cb.ble_ctr_cb.inq_var.adv_data;
2421     UINT8   *p;
2422
2423     BTM_TRACE_DEBUG ("btm_ble_update_adv_flag new=0x%x", flag);
2424
2425     if (p_adv_data->p_flags != NULL) {
2426         BTM_TRACE_DEBUG ("btm_ble_update_adv_flag old=0x%x",   *p_adv_data->p_flags);
2427         *p_adv_data->p_flags = flag;
2428     } else { /* no FLAGS in ADV data*/
2429         p = (p_adv_data->p_pad == NULL) ? p_adv_data->ad_data : p_adv_data->p_pad;
2430         /* need 3 bytes space to stuff in the flags, if not */
2431         /* erase all written data, just for flags */
2432         if ((BTM_BLE_AD_DATA_LEN - (p - p_adv_data->ad_data)) < 3) {
2433             p = p_adv_data->p_pad = p_adv_data->ad_data;
2434             memset(p_adv_data->ad_data, 0, BTM_BLE_AD_DATA_LEN);
2435         }
2436
2437         *p++ = 2;
2438         *p++ = BTM_BLE_AD_TYPE_FLAG;
2439         p_adv_data->p_flags = p;
2440         *p++ = flag;
2441         p_adv_data->p_pad = p;
2442     }
2443
2444     if (btsnd_hcic_ble_set_adv_data((UINT8)(p_adv_data->p_pad - p_adv_data->ad_data),
2445                                     p_adv_data->ad_data)) {
2446         p_adv_data->data_mask |= BTM_BLE_AD_BIT_FLAGS;
2447     }
2448
2449 }
2450
2451 #if 0
2452 /*******************************************************************************
2453 **
2454 ** Function         btm_ble_parse_adv_data
2455 **
2456 ** Description      This function parse the adv data into a structure.
2457 **
2458 ** Returns          pointer to entry, or NULL if not found
2459 **
2460 *******************************************************************************/
2461 static void btm_ble_parse_adv_data(tBTM_INQ_INFO *p_info, UINT8 *p_data,
2462                                    UINT8 len, tBTM_BLE_INQ_DATA *p_adv_data, UINT8 *p_buf)
2463 {
2464     UINT8   *p_cur = p_data;
2465     UINT8   ad_len, ad_type, ad_flag;
2466
2467     BTM_TRACE_EVENT (" btm_ble_parse_adv_data");
2468
2469     while (len > 0) {
2470         BTM_TRACE_DEBUG("btm_ble_parse_adv_data: len = %d", len);
2471         if ((ad_len = *p_cur ++) == 0) {
2472             break;
2473         }
2474
2475         ad_type = *p_cur ++;
2476
2477         BTM_TRACE_DEBUG("     ad_type = %02x ad_len = %d", ad_type, ad_len);
2478
2479         switch (ad_type) {
2480         case BTM_BLE_AD_TYPE_NAME_SHORT:
2481
2482         case BTM_BLE_AD_TYPE_NAME_CMPL:
2483             p_adv_data->ad_mask |= BTM_BLE_AD_BIT_DEV_NAME;
2484             if (p_info) {
2485                 p_info->remote_name_type = (ad_type == BTM_BLE_AD_TYPE_NAME_SHORT) ?
2486                                            BTM_BLE_NAME_SHORT : BTM_BLE_NAME_CMPL;
2487                 memcpy(p_info->remote_name, p_cur, ad_len - 1);
2488                 p_info->remote_name[ad_len] = 0;
2489                 p_adv_data->p_remote_name = p_info->remote_name;
2490                 p_info->remote_name_len = p_adv_data->remote_name_len = ad_len - 1;
2491                 BTM_TRACE_DEBUG("BTM_BLE_AD_TYPE_NAME name = %s", p_adv_data->p_remote_name);
2492             }
2493             p_cur += (ad_len - 1);
2494
2495             break;
2496
2497         case BTM_BLE_AD_TYPE_FLAG:
2498             p_adv_data->ad_mask |= BTM_BLE_AD_BIT_FLAGS;
2499             ad_flag = *p_cur ++;
2500             p_adv_data->flag = (UINT8)(ad_flag & BTM_BLE_ADV_FLAG_MASK) ;
2501             BTM_TRACE_DEBUG("BTM_BLE_AD_TYPE_FLAG flag = %s | %s | %s",
2502                             (p_adv_data->flag & BTM_BLE_LIMIT_DISC_FLAG) ? "LE_LIMIT_DISC" : "",
2503                             (p_adv_data->flag & BTM_BLE_GEN_DISC_FLAG) ? "LE_GENERAL_DISC" : "",
2504                             (p_adv_data->flag & BTM_BLE_BREDR_NOT_SPT) ? "LE Only device" : "");
2505             break;
2506
2507         case BTM_BLE_AD_TYPE_TX_PWR:
2508             p_adv_data->ad_mask |= BTM_BLE_AD_BIT_TX_PWR;
2509             p_adv_data->tx_power_level = (INT8) * p_cur ++;
2510             BTM_TRACE_DEBUG("BTM_BLE_AD_TYPE_TX_PWR tx_level = %d", p_adv_data->tx_power_level);
2511             break;
2512
2513         case BTM_BLE_AD_TYPE_MANU:
2514
2515         case BTM_BLE_AD_TYPE_16SRV_PART:
2516         case BTM_BLE_AD_TYPE_16SRV_CMPL:
2517             p_adv_data->ad_mask |= BTM_BLE_AD_BIT_SERVICE;
2518             /* need allocate memory to store UUID list */
2519             p_adv_data->service.num_service = (ad_len - 1) / 2;
2520             BTM_TRACE_DEBUG("service UUID list, num = %d", p_adv_data->service.num_service);
2521             p_cur += (ad_len - 1);
2522             break;
2523
2524         case BTM_BLE_AD_TYPE_SOL_SRV_UUID:
2525             p_adv_data->ad_mask |= BTM_BLE_AD_BIT_SERVICE_SOL;
2526             /* need allocate memory to store UUID list */
2527             p_adv_data->service.num_service = (ad_len - 1) / 2;
2528             BTM_TRACE_DEBUG("service UUID list, num = %d", p_adv_data->service.num_service);
2529             p_cur += (ad_len - 1);
2530             break;
2531
2532         case BTM_BLE_AD_TYPE_128SOL_SRV_UUID:
2533             p_adv_data->ad_mask |= BTM_BLE_AD_BIT_SERVICE_128SOL;
2534             /* need allocate memory to store UUID list */
2535             p_adv_data->service.num_service = (ad_len - 1) / 16;
2536             BTM_TRACE_DEBUG("service UUID list, num = %d", p_adv_data->service.num_service);
2537             p_cur += (ad_len - 1);
2538             break;
2539
2540         case BTM_BLE_AD_TYPE_APPEARANCE:
2541         case BTM_BLE_AD_TYPE_PUBLIC_TARGET:
2542         case BTM_BLE_AD_TYPE_RANDOM_TARGET:
2543         default:
2544             break;
2545         }
2546         len -= (ad_len + 1);
2547     }
2548 }
2549 #endif
2550
2551 /*******************************************************************************
2552 **
2553 ** Function         btm_ble_cache_adv_data
2554 **
2555 ** Description      Update advertising cache data.
2556 **
2557 ** Returns          void
2558 **
2559 *******************************************************************************/
2560 void btm_ble_cache_adv_data(tBTM_INQ_RESULTS *p_cur, UINT8 data_len, UINT8 *p, UINT8 evt_type)
2561 {
2562     tBTM_BLE_INQ_CB     *p_le_inq_cb = &btm_cb.ble_ctr_cb.inq_var;
2563     UINT8 *p_cache;
2564     UINT8 length;
2565
2566     /* cache adv report/scan response data */
2567     if (evt_type != BTM_BLE_SCAN_RSP_EVT) {
2568         p_le_inq_cb->adv_len = 0;
2569         memset(p_le_inq_cb->adv_data_cache, 0, BTM_BLE_CACHE_ADV_DATA_MAX);
2570         p_cur->adv_data_len = 0;
2571         p_cur->scan_rsp_len = 0;
2572     }
2573
2574     if (data_len > 0) {
2575         p_cache = &p_le_inq_cb->adv_data_cache[p_le_inq_cb->adv_len];
2576         STREAM_TO_UINT8(length, p);
2577         while ( length && ((p_le_inq_cb->adv_len + length + 1) <= BTM_BLE_CACHE_ADV_DATA_MAX)) {
2578             /* copy from the length byte & data into cache */
2579             memcpy(p_cache, p - 1, length + 1);
2580             /* advance the cache pointer past data */
2581             p_cache += length + 1;
2582             /* increment cache length */
2583             p_le_inq_cb->adv_len += length + 1;
2584             /* skip the length of data */
2585             p += length;
2586             STREAM_TO_UINT8(length, p);
2587         }
2588     }
2589
2590     if (evt_type != BTM_BLE_SCAN_RSP_EVT) {
2591         p_cur->adv_data_len = p_le_inq_cb->adv_len;
2592     }
2593     else {
2594         p_cur->scan_rsp_len = p_le_inq_cb->adv_len - p_cur->adv_data_len;
2595     }
2596
2597     /* parse service UUID from adv packet and save it in inq db eir_uuid */
2598     /* TODO */
2599 }
2600
2601 /*******************************************************************************
2602 **
2603 ** Function         btm_ble_is_discoverable
2604 **
2605 ** Description      check ADV flag to make sure device is discoverable and match
2606 **                  the search condition
2607 **
2608 ** Parameters
2609 **
2610 ** Returns          void
2611 **
2612 *******************************************************************************/
2613 UINT8 btm_ble_is_discoverable(BD_ADDR bda, UINT8 evt_type, UINT8 *p)
2614 {
2615     UINT8               *p_flag, flag = 0, rt = 0;
2616     UINT8                data_len;
2617     tBTM_INQ_PARMS      *p_cond = &btm_cb.btm_inq_vars.inqparms;
2618     tBTM_BLE_INQ_CB     *p_le_inq_cb = &btm_cb.ble_ctr_cb.inq_var;
2619
2620     UNUSED(p);
2621
2622     /* for observer, always "discoverable */
2623     if (BTM_BLE_IS_OBS_ACTIVE(btm_cb.ble_ctr_cb.scan_activity)) {
2624         rt |= BTM_BLE_OBS_RESULT;
2625     }
2626     /* for discover, always "discoverable */
2627     if (BTM_BLE_IS_DISCO_ACTIVE(btm_cb.ble_ctr_cb.scan_activity)) {
2628         rt |= BTM_BLE_DISCO_RESULT;
2629     }
2630
2631     if (BTM_BLE_IS_SEL_CONN_ACTIVE(btm_cb.ble_ctr_cb.scan_activity) &&
2632             (evt_type == BTM_BLE_CONNECT_EVT || evt_type == BTM_BLE_CONNECT_DIR_EVT)) {
2633         rt |= BTM_BLE_SEL_CONN_RESULT;
2634     }
2635
2636     /* does not match filter condition */
2637     if (p_cond->filter_cond_type == BTM_FILTER_COND_BD_ADDR &&
2638             memcmp(bda, p_cond->filter_cond.bdaddr_cond, BD_ADDR_LEN) != 0) {
2639         BTM_TRACE_DEBUG("BD ADDR does not meet filter condition");
2640         return rt;
2641     }
2642
2643     if (p_le_inq_cb->adv_len != 0) {
2644         if ((p_flag = BTM_CheckAdvData(p_le_inq_cb->adv_data_cache,
2645                                        BTM_BLE_AD_TYPE_FLAG, &data_len)) != NULL) {
2646             flag = * p_flag;
2647
2648             if ((btm_cb.btm_inq_vars.inq_active & BTM_BLE_GENERAL_INQUIRY) &&
2649                     (flag & (BTM_BLE_LIMIT_DISC_FLAG | BTM_BLE_GEN_DISC_FLAG)) != 0) {
2650                 BTM_TRACE_DEBUG("Find Generable Discoverable device");
2651                 rt |= BTM_BLE_INQ_RESULT;
2652             }
2653
2654             else if (btm_cb.btm_inq_vars.inq_active & BTM_BLE_LIMITED_INQUIRY &&
2655                      (flag & BTM_BLE_LIMIT_DISC_FLAG) != 0) {
2656                 BTM_TRACE_DEBUG("Find limited discoverable device");
2657                 rt |= BTM_BLE_INQ_RESULT;
2658             }
2659         }
2660     }
2661     return rt;
2662 }
2663
2664 static void btm_ble_appearance_to_cod(UINT16 appearance, UINT8 *dev_class)
2665 {
2666     dev_class[0] = 0;
2667
2668     switch (appearance) {
2669     case BTM_BLE_APPEARANCE_GENERIC_PHONE:
2670         dev_class[1] = BTM_COD_MAJOR_PHONE;
2671         dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED;
2672         break;
2673     case BTM_BLE_APPEARANCE_GENERIC_COMPUTER:
2674         dev_class[1] = BTM_COD_MAJOR_COMPUTER;
2675         dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED;
2676         break;
2677     case BTM_BLE_APPEARANCE_GENERIC_REMOTE:
2678         dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
2679         dev_class[2] = BTM_COD_MINOR_REMOTE_CONTROL;
2680         break;
2681     case BTM_BLE_APPEARANCE_GENERIC_THERMOMETER:
2682     case BTM_BLE_APPEARANCE_THERMOMETER_EAR:
2683         dev_class[1] = BTM_COD_MAJOR_HEALTH;
2684         dev_class[2] = BTM_COD_MINOR_THERMOMETER;
2685         break;
2686     case BTM_BLE_APPEARANCE_GENERIC_HEART_RATE:
2687     case BTM_BLE_APPEARANCE_HEART_RATE_BELT:
2688         dev_class[1] = BTM_COD_MAJOR_HEALTH;
2689         dev_class[2] = BTM_COD_MINOR_HEART_PULSE_MONITOR;
2690         break;
2691     case BTM_BLE_APPEARANCE_GENERIC_BLOOD_PRESSURE:
2692     case BTM_BLE_APPEARANCE_BLOOD_PRESSURE_ARM:
2693     case BTM_BLE_APPEARANCE_BLOOD_PRESSURE_WRIST:
2694         dev_class[1] = BTM_COD_MAJOR_HEALTH;
2695         dev_class[2] = BTM_COD_MINOR_BLOOD_MONITOR;
2696         break;
2697     case BTM_BLE_APPEARANCE_GENERIC_PULSE_OXIMETER:
2698     case BTM_BLE_APPEARANCE_PULSE_OXIMETER_FINGERTIP:
2699     case BTM_BLE_APPEARANCE_PULSE_OXIMETER_WRIST:
2700         dev_class[1] = BTM_COD_MAJOR_HEALTH;
2701         dev_class[2] = BTM_COD_MINOR_PULSE_OXIMETER;
2702         break;
2703     case BTM_BLE_APPEARANCE_GENERIC_GLUCOSE:
2704         dev_class[1] = BTM_COD_MAJOR_HEALTH;
2705         dev_class[2] = BTM_COD_MINOR_GLUCOSE_METER;
2706         break;
2707     case BTM_BLE_APPEARANCE_GENERIC_WEIGHT:
2708         dev_class[1] = BTM_COD_MAJOR_HEALTH;
2709         dev_class[2] = BTM_COD_MINOR_WEIGHING_SCALE;
2710         break;
2711     case BTM_BLE_APPEARANCE_GENERIC_WALKING:
2712     case BTM_BLE_APPEARANCE_WALKING_IN_SHOE:
2713     case BTM_BLE_APPEARANCE_WALKING_ON_SHOE:
2714     case BTM_BLE_APPEARANCE_WALKING_ON_HIP:
2715         dev_class[1] = BTM_COD_MAJOR_HEALTH;
2716         dev_class[2] = BTM_COD_MINOR_STEP_COUNTER;
2717         break;
2718     case BTM_BLE_APPEARANCE_GENERIC_WATCH:
2719     case BTM_BLE_APPEARANCE_SPORTS_WATCH:
2720         dev_class[1] = BTM_COD_MAJOR_WEARABLE;
2721         dev_class[2] = BTM_COD_MINOR_WRIST_WATCH;
2722         break;
2723     case BTM_BLE_APPEARANCE_GENERIC_EYEGLASSES:
2724         dev_class[1] = BTM_COD_MAJOR_WEARABLE;
2725         dev_class[2] = BTM_COD_MINOR_GLASSES;
2726         break;
2727     case BTM_BLE_APPEARANCE_GENERIC_DISPLAY:
2728         dev_class[1] = BTM_COD_MAJOR_IMAGING;
2729         dev_class[2] = BTM_COD_MINOR_DISPLAY;
2730         break;
2731     case BTM_BLE_APPEARANCE_GENERIC_MEDIA_PLAYER:
2732         dev_class[1] = BTM_COD_MAJOR_AUDIO;
2733         dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED;
2734         break;
2735     case BTM_BLE_APPEARANCE_GENERIC_BARCODE_SCANNER:
2736     case BTM_BLE_APPEARANCE_HID_BARCODE_SCANNER:
2737     case BTM_BLE_APPEARANCE_GENERIC_HID:
2738         dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
2739         dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED;
2740         break;
2741     case BTM_BLE_APPEARANCE_HID_KEYBOARD:
2742         dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
2743         dev_class[2] = BTM_COD_MINOR_KEYBOARD;
2744         break;
2745     case BTM_BLE_APPEARANCE_HID_MOUSE:
2746         dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
2747         dev_class[2] = BTM_COD_MINOR_POINTING;
2748         break;
2749     case BTM_BLE_APPEARANCE_HID_JOYSTICK:
2750         dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
2751         dev_class[2] = BTM_COD_MINOR_JOYSTICK;
2752         break;
2753     case BTM_BLE_APPEARANCE_HID_GAMEPAD:
2754         dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
2755         dev_class[2] = BTM_COD_MINOR_GAMEPAD;
2756         break;
2757     case BTM_BLE_APPEARANCE_HID_DIGITIZER_TABLET:
2758         dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
2759         dev_class[2] = BTM_COD_MINOR_DIGITIZING_TABLET;
2760         break;
2761     case BTM_BLE_APPEARANCE_HID_CARD_READER:
2762         dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
2763         dev_class[2] = BTM_COD_MINOR_CARD_READER;
2764         break;
2765     case BTM_BLE_APPEARANCE_HID_DIGITAL_PEN:
2766         dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
2767         dev_class[2] = BTM_COD_MINOR_DIGITAL_PAN;
2768         break;
2769     case BTM_BLE_APPEARANCE_UKNOWN:
2770     case BTM_BLE_APPEARANCE_GENERIC_CLOCK:
2771     case BTM_BLE_APPEARANCE_GENERIC_TAG:
2772     case BTM_BLE_APPEARANCE_GENERIC_KEYRING:
2773     case BTM_BLE_APPEARANCE_GENERIC_CYCLING:
2774     case BTM_BLE_APPEARANCE_CYCLING_COMPUTER:
2775     case BTM_BLE_APPEARANCE_CYCLING_SPEED:
2776     case BTM_BLE_APPEARANCE_CYCLING_CADENCE:
2777     case BTM_BLE_APPEARANCE_CYCLING_POWER:
2778     case BTM_BLE_APPEARANCE_CYCLING_SPEED_CADENCE:
2779     case BTM_BLE_APPEARANCE_GENERIC_OUTDOOR_SPORTS:
2780     case BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION:
2781     case BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_AND_NAV:
2782     case BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_POD:
2783     case BTM_BLE_APPEARANCE_OUTDOOR_SPORTS_LOCATION_POD_AND_NAV:
2784     default:
2785         dev_class[1] = BTM_COD_MAJOR_UNCLASSIFIED;
2786         dev_class[2] = BTM_COD_MINOR_UNCLASSIFIED;
2787     };
2788 }
2789
2790 /*******************************************************************************
2791 **
2792 ** Function         btm_ble_update_inq_result
2793 **
2794 ** Description      Update adv packet information into inquiry result.
2795 **
2796 ** Parameters
2797 **
2798 ** Returns          void
2799 **
2800 *******************************************************************************/
2801 BOOLEAN btm_ble_update_inq_result(tINQ_DB_ENT *p_i, UINT8 addr_type, UINT8 evt_type, UINT8 *p)
2802 {
2803     BOOLEAN             to_report = TRUE;
2804     tBTM_INQ_RESULTS     *p_cur = &p_i->inq_info.results;
2805     UINT8               len;
2806     UINT8               *p_flag;
2807     tBTM_INQUIRY_VAR_ST  *p_inq = &btm_cb.btm_inq_vars;
2808     UINT8                data_len, rssi;
2809     tBTM_BLE_INQ_CB     *p_le_inq_cb = &btm_cb.ble_ctr_cb.inq_var;
2810     UINT8 *p1;
2811     UINT8               *p_uuid16;
2812
2813     STREAM_TO_UINT8    (data_len, p);
2814
2815     if (data_len > BTM_BLE_ADV_DATA_LEN_MAX) {
2816         BTM_TRACE_WARNING("EIR data too long %d. discard", data_len);
2817         return FALSE;
2818     }
2819     btm_ble_cache_adv_data(p_cur, data_len, p, evt_type);
2820
2821     p1 = (p + data_len);
2822     STREAM_TO_UINT8 (rssi, p1);
2823
2824     /* Save the info */
2825     p_cur->inq_result_type = BTM_INQ_RESULT_BLE;
2826     p_cur->ble_addr_type    = addr_type;
2827     p_cur->rssi = rssi;
2828
2829     /* active scan, always wait until get scan_rsp to report the result */
2830     if ((btm_cb.ble_ctr_cb.inq_var.scan_type == BTM_BLE_SCAN_MODE_ACTI &&
2831             (evt_type == BTM_BLE_CONNECT_EVT || evt_type == BTM_BLE_DISCOVER_EVT))) {
2832         BTM_TRACE_DEBUG("btm_ble_update_inq_result scan_rsp=false, to_report=false,\
2833                               scan_type_active=%d", btm_cb.ble_ctr_cb.inq_var.scan_type);
2834         p_i->scan_rsp = FALSE;
2835         to_report = FALSE;
2836     } else {
2837         p_i->scan_rsp = TRUE;
2838     }
2839
2840     if (p_i->inq_count != p_inq->inq_counter) {
2841         p_cur->device_type = BT_DEVICE_TYPE_BLE;
2842     } else {
2843         p_cur->device_type |= BT_DEVICE_TYPE_BLE;
2844     }
2845
2846     if (evt_type != BTM_BLE_SCAN_RSP_EVT) {
2847         p_cur->ble_evt_type     = evt_type;
2848     }
2849
2850     p_i->inq_count = p_inq->inq_counter;   /* Mark entry for current inquiry */
2851
2852     if (p_le_inq_cb->adv_len != 0) {
2853         if ((p_flag = BTM_CheckAdvData(p_le_inq_cb->adv_data_cache, BTM_BLE_AD_TYPE_FLAG, &len)) != NULL) {
2854             p_cur->flag = * p_flag;
2855         }
2856     }
2857
2858     if (p_le_inq_cb->adv_len != 0) {
2859         /* Check to see the BLE device has the Appearance UUID in the advertising data.  If it does
2860          * then try to convert the appearance value to a class of device value Bluedroid can use.
2861          * Otherwise fall back to trying to infer if it is a HID device based on the service class.
2862          */
2863         p_uuid16 = BTM_CheckAdvData(p_le_inq_cb->adv_data_cache, BTM_BLE_AD_TYPE_APPEARANCE, &len);
2864         if (p_uuid16 && len == 2) {
2865             btm_ble_appearance_to_cod((UINT16)p_uuid16[0] | (p_uuid16[1] << 8), p_cur->dev_class);
2866         } else {
2867             if ((p_uuid16 = BTM_CheckAdvData(p_le_inq_cb->adv_data_cache,
2868                                              BTM_BLE_AD_TYPE_16SRV_CMPL, &len)) != NULL) {
2869                 UINT8 i;
2870                 for (i = 0; i + 2 <= len; i = i + 2) {
2871 #if BTA_HH_LE_INCLUDED == TRUE
2872                                         /* if this BLE device support HID over LE, set HID Major in class of device */
2873                     if ((p_uuid16[i] | (p_uuid16[i + 1] << 8)) == UUID_SERVCLASS_LE_HID) {
2874                         p_cur->dev_class[0] = 0;
2875                         p_cur->dev_class[1] = BTM_COD_MAJOR_PERIPHERAL;
2876                         p_cur->dev_class[2] = 0;
2877                         break;
2878                     }
2879 #endif /* BTA_HH_LE_INCLUDED */
2880                 }
2881             }
2882         }
2883     }
2884
2885     /* if BR/EDR not supported is not set, assume is a DUMO device */
2886     if ((p_cur->flag & BTM_BLE_BREDR_NOT_SPT) == 0 &&
2887             evt_type != BTM_BLE_CONNECT_DIR_EVT) {
2888         if (p_cur->ble_addr_type != BLE_ADDR_RANDOM) {
2889             BTM_TRACE_DEBUG("BR/EDR NOT support bit not set, treat as DUMO");
2890             p_cur->device_type |= BT_DEVICE_TYPE_DUMO;
2891         } else {
2892             BTM_TRACE_DEBUG("Random address, treating device as LE only");
2893         }
2894     } else {
2895         BTM_TRACE_DEBUG("BR/EDR NOT SUPPORT bit set, LE only device");
2896     }
2897
2898     return to_report;
2899
2900 }
2901
2902 /*******************************************************************************
2903 **
2904 ** Function         btm_clear_all_pending_le_entry
2905 **
2906 ** Description      This function is called to clear all LE pending entry in
2907 **                  inquiry database.
2908 **
2909 ** Returns          void
2910 **
2911 *******************************************************************************/
2912 void btm_clear_all_pending_le_entry(void)
2913 {
2914     UINT16       xx;
2915     tINQ_DB_ENT  *p_ent = btm_cb.btm_inq_vars.inq_db;
2916
2917     for (xx = 0; xx < BTM_INQ_DB_SIZE; xx++, p_ent++) {
2918         /* mark all pending LE entry as unused if an LE only device has scan response outstanding */
2919         if ((p_ent->in_use) &&
2920                 (p_ent->inq_info.results.device_type == BT_DEVICE_TYPE_BLE) &&
2921                 !p_ent->scan_rsp) {
2922             p_ent->in_use = FALSE;
2923         }
2924     }
2925 }
2926
2927 /*******************************************************************************
2928 **
2929 ** Function         btm_send_sel_conn_callback
2930 **
2931 ** Description      send selection connection request callback.
2932 **
2933 ** Parameters
2934 **
2935 ** Returns          void
2936 **
2937 *******************************************************************************/
2938 void btm_send_sel_conn_callback(BD_ADDR remote_bda, UINT8 evt_type, UINT8 *p_data, UINT8 addr_type)
2939 {
2940     UINT8   data_len, len;
2941     UINT8   *p_dev_name, remname[31] = {0};
2942     UNUSED(addr_type);
2943
2944     if (btm_cb.ble_ctr_cb.p_select_cback == NULL ||
2945             /* non-connectable device */
2946             (evt_type != BTM_BLE_EVT_CONN_ADV && evt_type != BTM_BLE_EVT_CONN_DIR_ADV)) {
2947         return;
2948     }
2949
2950     STREAM_TO_UINT8    (data_len, p_data);
2951
2952     /* get the device name if exist in ADV data */
2953     if (data_len != 0) {
2954         p_dev_name = BTM_CheckAdvData(p_data, BTM_BLE_AD_TYPE_NAME_CMPL, &len);
2955
2956         if (p_dev_name == NULL) {
2957             p_dev_name = BTM_CheckAdvData(p_data, BTM_BLE_AD_TYPE_NAME_SHORT, &len);
2958         }
2959
2960         if (p_dev_name) {
2961             memcpy(remname, p_dev_name, len);
2962         }
2963     }
2964     /* allow connection */
2965     if ((* btm_cb.ble_ctr_cb.p_select_cback)(remote_bda, remname)) {
2966         /* terminate selective connection, initiate connection */
2967         btm_ble_initiate_select_conn(remote_bda);
2968     }
2969 }
2970
2971 /*******************************************************************************
2972 **
2973 ** Function         btm_ble_process_adv_pkt
2974 **
2975 ** Description      This function is called when adv packet report events are
2976 **                  received from the device. It updates the inquiry database.
2977 **                  If the inquiry database is full, the oldest entry is discarded.
2978 **
2979 ** Parameters
2980 **
2981 ** Returns          void
2982 **
2983 *******************************************************************************/
2984 void btm_ble_process_adv_pkt (UINT8 *p_data)
2985 {
2986     BD_ADDR             bda;
2987     UINT8               evt_type = 0, *p = p_data;
2988     UINT8               addr_type = 0;
2989     UINT8               num_reports;
2990     UINT8               data_len;
2991 #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
2992     BOOLEAN             match = FALSE;
2993 #endif
2994
2995     /* Only process the results if the inquiry is still active */
2996     if (!BTM_BLE_IS_SCAN_ACTIVE(btm_cb.ble_ctr_cb.scan_activity)) {
2997         return;
2998     }
2999
3000     /* Extract the number of reports in this event. */
3001     STREAM_TO_UINT8(num_reports, p);
3002
3003     while (num_reports--) {
3004         /* Extract inquiry results */
3005         STREAM_TO_UINT8    (evt_type, p);
3006         STREAM_TO_UINT8    (addr_type, p);
3007         STREAM_TO_BDADDR   (bda, p);
3008         //BTM_TRACE_ERROR("btm_ble_process_adv_pkt:bda= %0x:%0x:%0x:%0x:%0x:%0x\n",
3009         //                              bda[0],bda[1],bda[2],bda[3],bda[4],bda[5]);
3010 #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
3011         /* map address to security record */
3012         match = btm_identity_addr_to_random_pseudo(bda, &addr_type, FALSE);
3013
3014         // BTM_TRACE_ERROR("btm_ble_process_adv_pkt:bda= %0x:%0x:%0x:%0x:%0x:%0x\n",
3015         //                             bda[0],bda[1],bda[2],bda[3],bda[4],bda[5]);
3016         /* always do RRA resolution on host */
3017         if (!match && BTM_BLE_IS_RESOLVE_BDA(bda)) {
3018             btm_ble_resolve_random_addr(bda, btm_ble_resolve_random_addr_on_adv, p_data);
3019         } else
3020 #endif
3021             btm_ble_process_adv_pkt_cont(bda, addr_type, evt_type, p);
3022
3023         STREAM_TO_UINT8(data_len, p);
3024
3025         /* Advance to the next event data_len + rssi byte */
3026         p += data_len + 1;
3027     }
3028 }
3029
3030 /*******************************************************************************
3031 **
3032 ** Function         btm_ble_process_adv_pkt_cont
3033 **
3034 ** Description      This function is called after random address resolution is
3035 **                  done, and proceed to process adv packet.
3036 **
3037 ** Parameters
3038 **
3039 ** Returns          void
3040 **
3041 *******************************************************************************/
3042 static void btm_ble_process_adv_pkt_cont(BD_ADDR bda, UINT8 addr_type, UINT8 evt_type, UINT8 *p)
3043 {
3044
3045     tINQ_DB_ENT          *p_i;
3046     tBTM_INQUIRY_VAR_ST  *p_inq = &btm_cb.btm_inq_vars;
3047     tBTM_INQ_RESULTS_CB  *p_inq_results_cb = p_inq->p_inq_results_cb;
3048     tBTM_INQ_RESULTS_CB  *p_obs_results_cb = btm_cb.ble_ctr_cb.p_obs_results_cb;
3049     tBTM_INQ_RESULTS_CB  *p_scan_results_cb = btm_cb.ble_ctr_cb.p_scan_results_cb;
3050     tBTM_BLE_INQ_CB      *p_le_inq_cb = &btm_cb.ble_ctr_cb.inq_var;
3051     BOOLEAN     update = TRUE;
3052     UINT8       result = 0;
3053
3054     p_i = btm_inq_db_find (bda);
3055
3056     /* Check if this address has already been processed for this inquiry */
3057     if (btm_inq_find_bdaddr(bda)) {
3058         /* never been report as an LE device */
3059         if (p_i &&
3060                 (!(p_i->inq_info.results.device_type & BT_DEVICE_TYPE_BLE) ||
3061                  /* scan repsonse to be updated */
3062                  (!p_i->scan_rsp))) {
3063             update = TRUE;
3064         } else if (BTM_BLE_IS_DISCO_ACTIVE(btm_cb.ble_ctr_cb.scan_activity)) {
3065             update = FALSE;
3066         } else {
3067             /* if yes, skip it */
3068             return; /* assumption: one result per event */
3069         }
3070     }
3071     /* If existing entry, use that, else get  a new one (possibly reusing the oldest) */
3072     if (p_i == NULL) {
3073         if ((p_i = btm_inq_db_new (bda)) != NULL) {
3074             p_inq->inq_cmpl_info.num_resp++;
3075         } else {
3076             return;
3077         }
3078     } else if (p_i->inq_count != p_inq->inq_counter) { /* first time seen in this inquiry */
3079         p_inq->inq_cmpl_info.num_resp++;
3080     }
3081     /* update the LE device information in inquiry database */
3082     if (!btm_ble_update_inq_result(p_i, addr_type, evt_type, p)) {
3083         return;
3084     }
3085
3086     if ((result = btm_ble_is_discoverable(bda, evt_type, p)) == 0) {
3087         LOG_WARN("%s device is no longer discoverable so discarding advertising packet pkt",
3088                  __func__);
3089         return;
3090     }
3091     if (!update) {
3092         result &= ~BTM_BLE_INQ_RESULT;
3093     }
3094     /* If the number of responses found and limited, issue a cancel inquiry */
3095     if (p_inq->inqparms.max_resps &&
3096             p_inq->inq_cmpl_info.num_resp == p_inq->inqparms.max_resps) {
3097         /* new device */
3098         if (p_i == NULL ||
3099                 /* assume a DUMO device, BR/EDR inquiry is always active */
3100                 (p_i &&
3101                  (p_i->inq_info.results.device_type & BT_DEVICE_TYPE_BLE) == BT_DEVICE_TYPE_BLE &&
3102                  p_i->scan_rsp)) {
3103             BTM_TRACE_WARNING("INQ RES: Extra Response Received...cancelling inquiry..");
3104
3105             /* if is non-periodic inquiry active, cancel now */
3106             if ((p_inq->inq_active & BTM_BR_INQ_ACTIVE_MASK) != 0 &&
3107                     (p_inq->inq_active & BTM_PERIODIC_INQUIRY_ACTIVE) == 0) {
3108                 btsnd_hcic_inq_cancel();
3109             }
3110
3111             btm_ble_stop_inquiry();
3112
3113             btm_acl_update_busy_level (BTM_BLI_INQ_DONE_EVT);
3114         }
3115     }
3116     /* background connection in selective connection mode */
3117     if (btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_SELECTIVE) {
3118         if (result & BTM_BLE_SEL_CONN_RESULT) {
3119             btm_send_sel_conn_callback(bda, evt_type, p, addr_type);
3120         } else {
3121             BTM_TRACE_DEBUG("None LE device, can not initiate selective connection\n");
3122         }
3123     } else {
3124         if (p_inq_results_cb && (result & BTM_BLE_INQ_RESULT)) {
3125             (p_inq_results_cb)((tBTM_INQ_RESULTS *) &p_i->inq_info.results, p_le_inq_cb->adv_data_cache);
3126         }
3127         if (p_obs_results_cb && (result & BTM_BLE_OBS_RESULT)) {
3128             (p_obs_results_cb)((tBTM_INQ_RESULTS *) &p_i->inq_info.results, p_le_inq_cb->adv_data_cache);
3129         }
3130         if (p_scan_results_cb && (result & BTM_BLE_DISCO_RESULT)) {
3131             (p_scan_results_cb)((tBTM_INQ_RESULTS *) &p_i->inq_info.results, p_le_inq_cb->adv_data_cache);
3132         }
3133     }
3134 }
3135
3136 static void btm_ble_recover_scan_params(void)
3137 {
3138     tBTM_BLE_INQ_CB *p_inq = &btm_cb.ble_ctr_cb.inq_var;
3139
3140     if (p_inq->scan_params_set) {
3141         /// set back the scan params to the controller after stop the scan
3142         btsnd_hcic_ble_set_scan_params(p_inq->scan_type, p_inq->scan_interval,
3143                                        p_inq->scan_window,
3144                                        btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type,
3145                                        p_inq->sfp);
3146     } else {
3147         /// set the default value if the scan params not set yet
3148         btm_update_scanner_filter_policy(SP_ADV_ALL);
3149
3150         btm_cb.ble_ctr_cb.wl_state &= ~BTM_BLE_WL_SCAN;
3151     }
3152
3153 }
3154
3155 /*******************************************************************************
3156 **
3157 ** Function         btm_ble_start_scan
3158 **
3159 ** Description      Start the BLE scan.
3160 **
3161 ** Returns          void
3162 **
3163 *******************************************************************************/
3164 tBTM_STATUS btm_ble_start_scan(void)
3165 {
3166     tBTM_BLE_INQ_CB *p_inq = &btm_cb.ble_ctr_cb.inq_var;
3167     tBTM_STATUS status = BTM_CMD_STARTED;
3168     // recoverly the scan parameters to the controller before start scan
3169     btm_ble_recover_scan_params();
3170     /* start scan, disable duplicate filtering */
3171     if (!btsnd_hcic_ble_set_scan_enable (BTM_BLE_SCAN_ENABLE, p_inq->scan_duplicate_filter)) {
3172         status = BTM_NO_RESOURCES;
3173     } else {
3174         btm_cb.ble_ctr_cb.inq_var.state = BTM_BLE_SCANNING;
3175         if (p_inq->scan_type == BTM_BLE_SCAN_MODE_ACTI) {
3176             btm_ble_set_topology_mask(BTM_BLE_STATE_ACTIVE_SCAN_BIT);
3177         } else {
3178             btm_ble_set_topology_mask(BTM_BLE_STATE_PASSIVE_SCAN_BIT);
3179         }
3180     }
3181
3182     return status;
3183 }
3184
3185 /*******************************************************************************
3186 **
3187 ** Function         btm_ble_stop_scan
3188 **
3189 ** Description      Stop the BLE scan.
3190 **
3191 ** Returns          void
3192 **
3193 *******************************************************************************/
3194 void btm_ble_stop_scan(void)
3195 {
3196     BTM_TRACE_EVENT ("btm_ble_stop_scan ");
3197
3198     /* Clear the inquiry callback if set */
3199     btm_cb.ble_ctr_cb.inq_var.scan_type = BTM_BLE_SCAN_MODE_NONE;
3200     btm_cb.ble_ctr_cb.inq_var.state = BTM_BLE_STOP_SCAN;
3201     /* stop discovery now */
3202     btsnd_hcic_ble_set_scan_enable (BTM_BLE_SCAN_DISABLE, BTM_BLE_DUPLICATE_ENABLE);
3203
3204     btm_update_scanner_filter_policy(SP_ADV_ALL);
3205
3206     btm_cb.ble_ctr_cb.wl_state &= ~BTM_BLE_WL_SCAN;
3207 }
3208
3209 /*******************************************************************************
3210 **
3211 ** Function         btm_ble_stop_inquiry
3212 **
3213 ** Description      Stop the BLE Inquiry.
3214 **
3215 ** Returns          void
3216 **
3217 *******************************************************************************/
3218 void btm_ble_stop_inquiry(void)
3219 {
3220     tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
3221     tBTM_BLE_CB *p_ble_cb = &btm_cb.ble_ctr_cb;
3222
3223     btu_stop_timer (&p_ble_cb->inq_var.inq_timer_ent);
3224
3225     p_ble_cb->scan_activity &=  ~BTM_BLE_INQUIRY_MASK;
3226
3227     /* If no more scan activity, stop LE scan now */
3228     if (!BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity)) {
3229         btm_ble_stop_scan();
3230     } else if ((p_ble_cb->inq_var.scan_interval != BTM_BLE_LOW_LATENCY_SCAN_INT) ||
3231                (p_ble_cb->inq_var.scan_window != BTM_BLE_LOW_LATENCY_SCAN_WIN)) {
3232         BTM_TRACE_DEBUG("%s: setting default params for ongoing observe", __FUNCTION__);
3233         btm_ble_stop_scan();
3234         btm_ble_start_scan();
3235     }
3236
3237     /* If we have a callback registered for inquiry complete, call it */
3238     BTM_TRACE_DEBUG ("BTM Inq Compl Callback: status 0x%02x, num results %d",
3239                      p_inq->inq_cmpl_info.status, p_inq->inq_cmpl_info.num_resp);
3240
3241     btm_process_inq_complete(HCI_SUCCESS, (UINT8)(p_inq->inqparms.mode & BTM_BLE_INQUIRY_MASK));
3242 }
3243
3244 /*******************************************************************************
3245 **
3246 ** Function         btm_ble_stop_observe
3247 **
3248 ** Description      Stop the BLE Observe.
3249 **
3250 ** Returns          void
3251 **
3252 *******************************************************************************/
3253 static void btm_ble_stop_observe(void)
3254 {
3255     tBTM_BLE_CB *p_ble_cb = & btm_cb.ble_ctr_cb;
3256     tBTM_CMPL_CB *p_obs_cb = p_ble_cb->p_obs_cmpl_cb;
3257
3258     btu_stop_timer (&p_ble_cb->obs_timer_ent);
3259
3260     p_ble_cb->scan_activity &= ~BTM_LE_OBSERVE_ACTIVE;
3261
3262     p_ble_cb->p_obs_results_cb = NULL;
3263     p_ble_cb->p_obs_cmpl_cb = NULL;
3264
3265     if (!BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity)) {
3266         btm_ble_stop_scan();
3267     }
3268
3269     if (p_obs_cb) {
3270         (p_obs_cb)((tBTM_INQUIRY_CMPL *) &btm_cb.btm_inq_vars.inq_cmpl_info);
3271     }
3272 }
3273
3274 /*******************************************************************************
3275 **
3276 ** Function         btm_ble_stop_observe
3277 **
3278 ** Description      Stop the BLE Observe.
3279 **
3280 ** Returns          void
3281 **
3282 *******************************************************************************/
3283 static void btm_ble_stop_discover(void)
3284 {
3285     tBTM_BLE_CB *p_ble_cb = & btm_cb.ble_ctr_cb;
3286     tBTM_CMPL_CB *p_scan_cb = p_ble_cb->p_scan_cmpl_cb;
3287     btu_stop_timer (&p_ble_cb->scan_timer_ent);
3288
3289     p_ble_cb->scan_activity &= ~BTM_LE_DISCOVER_ACTIVE;
3290
3291     p_ble_cb->p_scan_results_cb = NULL;
3292     p_ble_cb->p_scan_cmpl_cb = NULL;
3293
3294     if (!BTM_BLE_IS_SCAN_ACTIVE(p_ble_cb->scan_activity)) {
3295         /* Clear the inquiry callback if set */
3296         btm_cb.ble_ctr_cb.inq_var.scan_type = BTM_BLE_SCAN_MODE_NONE;
3297         btm_cb.ble_ctr_cb.inq_var.state = BTM_BLE_STOP_SCAN;
3298         /* stop discovery now */
3299         btsnd_hcic_ble_set_scan_enable (BTM_BLE_SCAN_DISABLE, BTM_BLE_DUPLICATE_ENABLE);
3300         // recoverly the scan parameters to the controller after stop scan
3301         btm_ble_recover_scan_params();
3302     }
3303
3304     if (p_scan_cb) {
3305         (p_scan_cb)((tBTM_INQUIRY_CMPL *) &btm_cb.btm_inq_vars.inq_cmpl_info);
3306     }
3307 }
3308
3309 /*******************************************************************************
3310 **
3311 ** Function         btm_ble_adv_states_operation
3312 **
3313 ** Description      Set or clear adv states in topology mask
3314 **
3315 ** Returns          operation status. TRUE if sucessful, FALSE otherwise.
3316 **
3317 *******************************************************************************/
3318 typedef BOOLEAN (BTM_TOPOLOGY_FUNC_PTR)(tBTM_BLE_STATE_MASK);
3319 static BOOLEAN btm_ble_adv_states_operation(BTM_TOPOLOGY_FUNC_PTR *p_handler, UINT8 adv_evt)
3320 {
3321     BOOLEAN rt = FALSE;
3322
3323     switch (adv_evt) {
3324     case BTM_BLE_CONNECT_EVT:
3325         rt  = (*p_handler)(BTM_BLE_STATE_CONN_ADV_BIT);
3326         break;
3327
3328     case  BTM_BLE_NON_CONNECT_EVT:
3329         rt  = (*p_handler) (BTM_BLE_STATE_NON_CONN_ADV_BIT);
3330         break;
3331     case BTM_BLE_CONNECT_DIR_EVT:
3332         rt  =  (*p_handler) (BTM_BLE_STATE_HI_DUTY_DIR_ADV_BIT);
3333         break;
3334
3335     case BTM_BLE_DISCOVER_EVT:
3336         rt  =  (*p_handler) (BTM_BLE_STATE_SCAN_ADV_BIT);
3337         break;
3338
3339     case BTM_BLE_CONNECT_LO_DUTY_DIR_EVT:
3340         rt = (*p_handler) (BTM_BLE_STATE_LO_DUTY_DIR_ADV_BIT);
3341         break;
3342
3343     default:
3344         BTM_TRACE_ERROR("unknown adv event : %d", adv_evt);
3345         break;
3346     }
3347
3348     return rt;
3349 }
3350
3351
3352 /*******************************************************************************
3353 **
3354 ** Function         btm_ble_start_adv
3355 **
3356 ** Description      start the BLE advertising.
3357 **
3358 ** Returns          void
3359 **
3360 *******************************************************************************/
3361 tBTM_STATUS btm_ble_start_adv(void)
3362 {
3363     tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
3364     tBTM_STATUS     rt = BTM_NO_RESOURCES;
3365     BTM_TRACE_EVENT ("btm_ble_start_adv\n");
3366
3367
3368     if (!btm_ble_adv_states_operation (btm_ble_topology_check, p_cb->evt_type)) {
3369         return BTM_WRONG_MODE;
3370     }
3371
3372 #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
3373     /* To relax resolving list,  always have resolving list enabled, unless directed adv */
3374     if (p_cb->evt_type != BTM_BLE_CONNECT_LO_DUTY_DIR_EVT &&
3375             p_cb->evt_type != BTM_BLE_CONNECT_DIR_EVT)
3376         /* enable resolving list is desired */
3377     {
3378         btm_ble_enable_resolving_list_for_platform(BTM_BLE_RL_ADV);
3379     }
3380 #endif
3381     if (p_cb->afp != AP_SCAN_CONN_ALL) {
3382         //find the device in the btm dev buffer and write it to the controller white list
3383         btm_execute_wl_dev_operation();
3384         btm_cb.ble_ctr_cb.wl_state |= BTM_BLE_WL_ADV;
3385     }
3386
3387     if (btsnd_hcic_ble_set_adv_enable (BTM_BLE_ADV_ENABLE)) {
3388         p_cb->adv_mode = BTM_BLE_ADV_ENABLE;
3389         p_cb->state = BTM_BLE_ADV_PENDING;
3390         btm_ble_adv_states_operation(btm_ble_set_topology_mask, p_cb->evt_type);
3391         rt = BTM_SUCCESS;
3392         BTM_TRACE_EVENT ("BTM_SUCCESS\n");
3393     } else {
3394         p_cb->adv_mode = BTM_BLE_ADV_DISABLE;
3395         btm_cb.ble_ctr_cb.wl_state &= ~BTM_BLE_WL_ADV;
3396     }
3397     return rt;
3398 }
3399
3400 /*******************************************************************************
3401 **
3402 ** Function         btm_ble_stop_adv
3403 **
3404 ** Description      Stop the BLE advertising.
3405 **
3406 ** Returns          void
3407 **
3408 *******************************************************************************/
3409 tBTM_STATUS btm_ble_stop_adv(void)
3410 {
3411     tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
3412     tBTM_STATUS rt = BTM_SUCCESS;
3413
3414     if (p_cb->adv_mode == BTM_BLE_ADV_ENABLE) {
3415         if (btsnd_hcic_ble_set_adv_enable (BTM_BLE_ADV_DISABLE)) {
3416             p_cb->fast_adv_on = FALSE;
3417             p_cb->adv_mode = BTM_BLE_ADV_DISABLE;
3418             p_cb->state = BTM_BLE_ADV_PENDING;
3419             btm_cb.ble_ctr_cb.wl_state &= ~BTM_BLE_WL_ADV;
3420
3421             /* clear all adv states */
3422             btm_ble_clear_topology_mask (BTM_BLE_STATE_ALL_ADV_MASK);
3423         } else {
3424             rt = BTM_NO_RESOURCES;
3425         }
3426     }
3427     return rt;
3428 }
3429
3430
3431 /*******************************************************************************
3432 **
3433 ** Function         btm_ble_start_slow_adv
3434 **
3435 ** Description      Restart adv with slow adv interval
3436 **
3437 ** Returns          void
3438 **
3439 *******************************************************************************/
3440 static void btm_ble_start_slow_adv (void)
3441 {
3442     tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
3443
3444     if (p_cb->adv_mode == BTM_BLE_ADV_ENABLE) {
3445         tBTM_LE_RANDOM_CB *p_addr_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
3446         BD_ADDR p_addr_ptr = {0};
3447         tBLE_ADDR_TYPE init_addr_type = BLE_ADDR_PUBLIC;
3448         tBLE_ADDR_TYPE own_addr_type = p_addr_cb->own_addr_type;
3449
3450         btm_ble_stop_adv();
3451
3452         p_cb->evt_type = btm_set_conn_mode_adv_init_addr(p_cb, p_addr_ptr, &init_addr_type,
3453                          &own_addr_type);
3454
3455         /* slow adv mode never goes into directed adv */
3456         btsnd_hcic_ble_write_adv_params (BTM_BLE_GAP_ADV_SLOW_INT, BTM_BLE_GAP_ADV_SLOW_INT,
3457                                          p_cb->evt_type, own_addr_type,
3458                                          init_addr_type, p_addr_ptr,
3459                                          p_cb->adv_chnl_map, p_cb->afp);
3460
3461         btm_ble_start_adv();
3462     }
3463 }
3464 /*******************************************************************************
3465 **
3466 ** Function         btm_ble_timeout
3467 **
3468 ** Description      Called when BTM BLE inquiry timer expires
3469 **
3470 ** Returns          void
3471 **
3472 *******************************************************************************/
3473 void btm_ble_timeout(TIMER_LIST_ENT *p_tle)
3474 {
3475     BTM_TRACE_EVENT ("btm_ble_timeout");
3476
3477     switch (p_tle->event) {
3478     case BTU_TTYPE_BLE_OBSERVE:
3479         btm_ble_stop_observe();
3480         break;
3481     case BTU_TTYPE_BLE_SCAN:
3482         btm_ble_stop_discover();
3483         break;
3484     case BTU_TTYPE_BLE_INQUIRY:
3485         btm_ble_stop_inquiry();
3486         break;
3487
3488     case BTU_TTYPE_BLE_GAP_LIM_DISC:
3489         /* lim_timeout expiried, limited discovery should exit now */
3490         btm_cb.btm_inq_vars.discoverable_mode &= ~BTM_BLE_LIMITED_DISCOVERABLE;
3491         btm_ble_set_adv_flag(btm_cb.btm_inq_vars.connectable_mode, btm_cb.btm_inq_vars.discoverable_mode);
3492         break;
3493
3494     case BTU_TTYPE_BLE_RANDOM_ADDR:
3495         if (btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type == BLE_ADDR_RANDOM) {
3496             if (NULL == (void *)(p_tle->param)) {
3497                 /* refresh the random addr */
3498                 btm_gen_resolvable_private_addr((void *)btm_gen_resolve_paddr_low);
3499             } else {
3500                 if (BTM_BleMaxMultiAdvInstanceCount() > 0) {
3501                     btm_ble_multi_adv_configure_rpa((tBTM_BLE_MULTI_ADV_INST *)p_tle->param);
3502                 }
3503             }
3504         }
3505         break;
3506
3507     case BTU_TTYPE_BLE_GAP_FAST_ADV:
3508         /* fast adv is completed, fall back to slow adv interval */
3509         btm_ble_start_slow_adv();
3510         break;
3511
3512     default:
3513         break;
3514
3515     }
3516 }
3517
3518
3519 /*******************************************************************************
3520 **
3521 ** Function         btm_ble_read_remote_features_complete
3522 **
3523 ** Description      This function is called when the command complete message
3524 **                  is received from the HCI for the read LE remote feature supported
3525 **                  complete event.
3526 **
3527 ** Returns          void
3528 **
3529 *******************************************************************************/
3530 void btm_ble_read_remote_features_complete(UINT8 *p)
3531 {
3532     tACL_CONN        *p_acl_cb = &btm_cb.acl_db[0];
3533     UINT16            handle;
3534     UINT8             status;
3535     int               xx;
3536
3537     BTM_TRACE_EVENT ("btm_ble_read_remote_features_complete ");
3538
3539     STREAM_TO_UINT8(status, p);
3540
3541     // if LE read remote feature failed for HCI_ERR_CONN_FAILED_ESTABLISHMENT,
3542     // expect disconnect complete to be received
3543     if (status != HCI_ERR_CONN_FAILED_ESTABLISHMENT) {
3544         STREAM_TO_UINT16 (handle, p);
3545
3546         /* Look up the connection by handle and copy features */
3547         for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_acl_cb++) {
3548             if ((p_acl_cb->in_use) && (p_acl_cb->hci_handle == handle)) {
3549                 STREAM_TO_ARRAY(p_acl_cb->peer_le_features, p, BD_FEATURES_LEN);
3550 #if BLE_INCLUDED == TRUE
3551                 /* In the original Bluedroid version, slave need to send LL_VERSION_IND(call btsnd_hcic_rmt_ver_req)
3552                  * to remote device if it has not received ll_version_ind.
3553                  * Delete it to resolve Android 7.0 incompatible problem. But it may cause that slave host
3554                  * can't get remote device's version.*/
3555                 if (p_acl_cb->link_role == HCI_ROLE_MASTER){
3556                     btsnd_hcic_rmt_ver_req (p_acl_cb->hci_handle);
3557                 }
3558                 else{
3559                     if (p_acl_cb->transport == BT_TRANSPORT_LE) {
3560                         if (HCI_LE_DATA_LEN_EXT_SUPPORTED(p_acl_cb->peer_le_features)) {
3561                             uint16_t data_length = controller_get_interface()->get_ble_default_data_packet_length();
3562                             uint16_t data_txtime = controller_get_interface()->get_ble_default_data_packet_txtime();
3563                             btsnd_hcic_ble_set_data_length(p_acl_cb->hci_handle, data_length, data_txtime);
3564                         }
3565                         l2cble_notify_le_connection (p_acl_cb->remote_addr);
3566                     }
3567                 }
3568 #endif
3569                 break;
3570             }
3571         }
3572     }
3573
3574 }
3575
3576 /*******************************************************************************
3577 **
3578 ** Function         btm_ble_write_adv_enable_complete
3579 **
3580 ** Description      This function process the write adv enable command complete.
3581 **
3582 ** Returns          void
3583 **
3584 *******************************************************************************/
3585 void btm_ble_write_adv_enable_complete(UINT8 *p)
3586 {
3587     tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
3588     UINT8 status = *p;
3589
3590     // callback to the APP after receive the adv complete from the controller.
3591     if (p_cb->p_adv_cb && p_cb->adv_mode == BTM_BLE_ADV_ENABLE) {
3592         if (p_cb->adv_callback_twice) {
3593             p_cb->adv_callback_twice = FALSE;
3594         }else {
3595             p_cb->state = BTM_BLE_ADVERTISING;
3596             (*p_cb->p_adv_cb)(status);
3597         }
3598     } else if (p_cb->p_stop_adv_cb && p_cb->adv_mode == BTM_BLE_ADV_DISABLE) {
3599         p_cb->state = BTM_BLE_STOP_ADV;
3600         (*p_cb->p_stop_adv_cb)(status);
3601     }
3602     /* if write adv enable/disbale not succeed */
3603     if (*p != HCI_SUCCESS) {
3604         /* toggle back the adv mode */
3605         p_cb->adv_mode = !p_cb->adv_mode;
3606     }
3607 }
3608
3609 /*******************************************************************************
3610 **
3611 ** Function         btm_ble_dir_adv_tout
3612 **
3613 ** Description      when directed adv time out
3614 **
3615 ** Returns          void
3616 **
3617 *******************************************************************************/
3618 void btm_ble_dir_adv_tout(void)
3619 {
3620     btm_cb.ble_ctr_cb.inq_var.adv_mode = BTM_BLE_ADV_DISABLE;
3621
3622     /* make device fall back into undirected adv mode by default */
3623     btm_cb.ble_ctr_cb.inq_var.directed_conn = FALSE;
3624 }
3625
3626 /*******************************************************************************
3627 **
3628 ** Function         btm_ble_set_topology_mask
3629 **
3630 ** Description      set BLE topology mask
3631 **
3632 ** Returns          TRUE is request is allowed, FALSE otherwise.
3633 **
3634 *******************************************************************************/
3635 BOOLEAN btm_ble_set_topology_mask(tBTM_BLE_STATE_MASK request_state_mask)
3636 {
3637     request_state_mask &= BTM_BLE_STATE_ALL_MASK;
3638     btm_cb.ble_ctr_cb.cur_states |= (request_state_mask & BTM_BLE_STATE_ALL_MASK);
3639     return TRUE;
3640 }
3641
3642 /*******************************************************************************
3643 **
3644 ** Function         btm_ble_clear_topology_mask
3645 **
3646 ** Description      Clear BLE topology bit mask
3647 **
3648 ** Returns          TRUE is request is allowed, FALSE otherwise.
3649 **
3650 *******************************************************************************/
3651 BOOLEAN btm_ble_clear_topology_mask (tBTM_BLE_STATE_MASK request_state_mask)
3652 {
3653     request_state_mask &= BTM_BLE_STATE_ALL_MASK;
3654     btm_cb.ble_ctr_cb.cur_states &= ~request_state_mask;
3655     return TRUE;
3656 }
3657
3658 /*******************************************************************************
3659 **
3660 ** Function         btm_ble_update_link_topology_mask
3661 **
3662 ** Description      This function update the link topology mask
3663 **
3664 ** Returns          void
3665 **
3666 *******************************************************************************/
3667 void btm_ble_update_link_topology_mask(UINT8 link_role, BOOLEAN increase)
3668 {
3669     btm_ble_clear_topology_mask (BTM_BLE_STATE_ALL_CONN_MASK);
3670
3671     if (increase) {
3672         btm_cb.ble_ctr_cb.link_count[link_role]++;
3673     } else if (btm_cb.ble_ctr_cb.link_count[link_role] > 0) {
3674         btm_cb.ble_ctr_cb.link_count[link_role]--;
3675     }
3676
3677     if (btm_cb.ble_ctr_cb.link_count[HCI_ROLE_MASTER]) {
3678         btm_ble_set_topology_mask (BTM_BLE_STATE_MASTER_BIT);
3679     }
3680
3681     if (btm_cb.ble_ctr_cb.link_count[HCI_ROLE_SLAVE]) {
3682         btm_ble_set_topology_mask(BTM_BLE_STATE_SLAVE_BIT);
3683     }
3684
3685     if (link_role == HCI_ROLE_SLAVE && increase) {
3686         btm_cb.ble_ctr_cb.inq_var.adv_mode = BTM_BLE_ADV_DISABLE;
3687         /* make device fall back into undirected adv mode by default */
3688         btm_cb.ble_ctr_cb.inq_var.directed_conn = BTM_BLE_CONNECT_EVT;
3689         /* clear all adv states */
3690         btm_ble_clear_topology_mask(BTM_BLE_STATE_ALL_ADV_MASK);
3691     }
3692 }
3693
3694 /*******************************************************************************
3695 **
3696 ** Function         btm_ble_update_mode_operation
3697 **
3698 ** Description      This function update the GAP role operation when a link status
3699 **                  is updated.
3700 **
3701 ** Returns          void
3702 **
3703 *******************************************************************************/
3704 void btm_ble_update_mode_operation(UINT8 link_role, BD_ADDR bd_addr, UINT8 status)
3705 {
3706     if (status == HCI_ERR_DIRECTED_ADVERTISING_TIMEOUT) {
3707         btm_cb.ble_ctr_cb.inq_var.adv_mode  = BTM_BLE_ADV_DISABLE;
3708         /* make device fall back into undirected adv mode by default */
3709         btm_cb.ble_ctr_cb.inq_var.directed_conn = BTM_BLE_CONNECT_EVT;
3710         /* clear all adv states */
3711         btm_ble_clear_topology_mask (BTM_BLE_STATE_ALL_ADV_MASK);
3712     }
3713
3714     if (btm_cb.ble_ctr_cb.inq_var.connectable_mode == BTM_BLE_CONNECTABLE) {
3715         btm_ble_set_connectability(btm_cb.btm_inq_vars.connectable_mode |
3716                                    btm_cb.ble_ctr_cb.inq_var.connectable_mode);
3717     }
3718
3719     /* when no connection is attempted, and controller is not rejecting last request
3720        due to resource limitation, start next direct connection or background connection
3721        now in order */
3722     if (btm_ble_get_conn_st() == BLE_CONN_IDLE && status != HCI_ERR_HOST_REJECT_RESOURCES &&
3723             !btm_send_pending_direct_conn()) {
3724         btm_ble_resume_bg_conn();
3725     }
3726 }
3727
3728 /*******************************************************************************
3729 **
3730 ** Function         btm_ble_init
3731 **
3732 ** Description      Initialize the control block variable values.
3733 **
3734 ** Returns          void
3735 **
3736 *******************************************************************************/
3737 void btm_ble_init (void)
3738 {
3739     tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
3740
3741     BTM_TRACE_DEBUG("%s", __func__);
3742
3743     btu_free_timer(&p_cb->obs_timer_ent);
3744     btu_free_timer(&p_cb->scan_timer_ent);
3745     btu_free_timer(&p_cb->inq_var.fast_adv_timer);
3746     memset(p_cb, 0, sizeof(tBTM_BLE_CB));
3747     memset(&(btm_cb.cmn_ble_vsc_cb), 0 , sizeof(tBTM_BLE_VSC_CB));
3748     btm_cb.cmn_ble_vsc_cb.values_read = FALSE;
3749     p_cb->cur_states       = 0;
3750
3751     p_cb->conn_pending_q = fixed_queue_new(SIZE_MAX);
3752
3753     p_cb->inq_var.adv_mode = BTM_BLE_ADV_DISABLE;
3754     p_cb->inq_var.scan_type = BTM_BLE_SCAN_MODE_NONE;
3755     p_cb->inq_var.adv_chnl_map = BTM_BLE_DEFAULT_ADV_CHNL_MAP;
3756     p_cb->inq_var.afp = BTM_BLE_DEFAULT_AFP;
3757     p_cb->inq_var.sfp = BTM_BLE_DEFAULT_SFP;
3758     p_cb->inq_var.connectable_mode = BTM_BLE_NON_CONNECTABLE;
3759     p_cb->inq_var.discoverable_mode = BTM_BLE_NON_DISCOVERABLE;
3760
3761     /* for background connection, reset connection params to be undefined */
3762     p_cb->scan_int = p_cb->scan_win = BTM_BLE_SCAN_PARAM_UNDEF;
3763
3764     p_cb->inq_var.evt_type = BTM_BLE_NON_CONNECT_EVT;
3765
3766 #if BLE_VND_INCLUDED == FALSE
3767     btm_ble_adv_filter_init();
3768 #endif
3769 }
3770
3771 /*******************************************************************************
3772 **
3773 ** Function         btm_ble_free
3774 **
3775 ** Description      free the control block variable values.
3776 **
3777 ** Returns          void
3778 **
3779 *******************************************************************************/
3780 void btm_ble_free (void)
3781 {
3782     tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
3783
3784     BTM_TRACE_DEBUG("%s", __func__);
3785
3786     fixed_queue_free(p_cb->conn_pending_q, osi_free_func);
3787 }
3788
3789 /*******************************************************************************
3790 **
3791 ** Function         btm_ble_topology_check
3792 **
3793 ** Description      check to see requested state is supported. One state check at
3794 **                  a time is supported
3795 **
3796 ** Returns          TRUE is request is allowed, FALSE otherwise.
3797 **
3798 *******************************************************************************/
3799 BOOLEAN btm_ble_topology_check(tBTM_BLE_STATE_MASK request_state_mask)
3800 {
3801     BOOLEAN rt = FALSE;
3802
3803     UINT8   state_offset = 0;
3804     UINT16  cur_states = btm_cb.ble_ctr_cb.cur_states;
3805     UINT8   mask, offset;
3806     UINT8   request_state = 0;
3807
3808     /* check only one bit is set and within valid range */
3809     if (request_state_mask == BTM_BLE_STATE_INVALID ||
3810             request_state_mask > BTM_BLE_STATE_SCAN_ADV_BIT ||
3811             (request_state_mask & (request_state_mask - 1 )) != 0) {
3812         BTM_TRACE_ERROR("illegal state requested: %d", request_state_mask);
3813         return rt;
3814     }
3815
3816     while (request_state_mask) {
3817         request_state_mask >>= 1;
3818         request_state ++;
3819     }
3820
3821     /* check if the requested state is supported or not */
3822     mask = btm_le_state_combo_tbl[0][request_state - 1][0];
3823     offset = btm_le_state_combo_tbl[0][request_state - 1][1];
3824
3825     const uint8_t *ble_supported_states = controller_get_interface()->get_ble_supported_states();
3826
3827     if (!BTM_LE_STATES_SUPPORTED(ble_supported_states, mask, offset)) {
3828         BTM_TRACE_ERROR("state requested not supported: %d", request_state);
3829         return rt;
3830     }
3831
3832     rt = TRUE;
3833     /* make sure currently active states are all supported in conjunction with the requested
3834        state. If the bit in table is not set, the combination is not supported */
3835     while (cur_states != 0) {
3836         if (cur_states & 0x01) {
3837             mask = btm_le_state_combo_tbl[request_state][state_offset][0];
3838             offset = btm_le_state_combo_tbl[request_state][state_offset][1];
3839
3840             if (mask != 0 && offset != 0) {
3841                 if (!BTM_LE_STATES_SUPPORTED(ble_supported_states, mask, offset)) {
3842                     rt = FALSE;
3843                     break;
3844                 }
3845             }
3846         }
3847         cur_states >>= 1;
3848         state_offset ++;
3849     }
3850     return rt;
3851 }
3852
3853
3854 #endif  /* BLE_INCLUDED */