16ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach/****************************************************************************** 26ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 36ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * Copyright (C) 1999-2012 Broadcom Corporation 46ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 56ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * Licensed under the Apache License, Version 2.0 (the "License"); 66ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * you may not use this file except in compliance with the License. 76ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * You may obtain a copy of the License at: 86ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 96ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * http://www.apache.org/licenses/LICENSE-2.0 106ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 116ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * Unless required by applicable law or agreed to in writing, software 126ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * distributed under the License is distributed on an "AS IS" BASIS, 136ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 146ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * See the License for the specific language governing permissions and 156ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * limitations under the License. 166ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 176ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach ******************************************************************************/ 186ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 196ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach/****************************************************************************** 206ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 216ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * This file contains functions for BLE whitelist operation. 226ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 236ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach ******************************************************************************/ 24e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 25e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include <string.h> 26e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 27e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bt_types.h" 28e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "btu.h" 29e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "btm_int.h" 30e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "l2c_int.h" 31e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "hcimsgs.h" 32e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 33e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#ifndef BTM_BLE_SCAN_PARAM_TOUT 34e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define BTM_BLE_SCAN_PARAM_TOUT 50 /* 50 seconds */ 35e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 36e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 37e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (BLE_INCLUDED == TRUE) 38e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 39e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 40e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btm_update_scanner_filter_policy 41e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 42e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function update the filter policy of scnner or advertiser. 43e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 44e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid btm_update_scanner_filter_policy(tBTM_BLE_SFP scan_policy) 45e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 46e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_BLE_INQ_CB *p_inq = &btm_cb.ble_ctr_cb.inq_var; 47e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_TRACE_EVENT0 ("btm_update_scanner_filter_policy"); 486ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach btm_cb.ble_ctr_cb.inq_var.sfp = scan_policy; 49e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 50e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btsnd_hcic_ble_set_scan_params ((UINT8)((p_inq->scan_type == BTM_BLE_SCAN_MODE_NONE) ? BTM_BLE_SCAN_MODE_ACTI: p_inq->scan_type), 516ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach (UINT16)(!p_inq->scan_interval ? BTM_BLE_GAP_DISC_SCAN_INT : p_inq->scan_interval), 52e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (UINT16)(!p_inq->scan_window ? BTM_BLE_GAP_DISC_SCAN_WIN : p_inq->scan_window), 536ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach BLE_ADDR_PUBLIC, 54e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach scan_policy); 55e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 56e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 57e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 58e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btm_update_adv_filter_policy 59e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 60e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function update the filter policy of scnner or advertiser. 61e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 62e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid btm_update_adv_filter_policy(tBTM_BLE_AFP adv_policy) 63e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 64e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var; 65e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_TRACE_EVENT0 ("btm_update_adv_filter_policy"); 66e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_cb->afp = adv_policy; 67e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 68e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 69e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 70e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btm_update_dev_to_white_list 71e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 72e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function adds a device into white list. 73e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 74e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachBOOLEAN btm_update_dev_to_white_list(BOOLEAN to_add, BD_ADDR bd_addr, tBLE_ADDR_TYPE addr_type) 75e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 76e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* look up the sec device record, and find the address */ 77e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb; 78e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_SEC_DEV_REC *p_dev_rec; 79e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BD_ADDR dummy_bda = {0}; 806ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach BOOLEAN started = FALSE, suspend = FALSE; 81e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 82e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (btm_cb.btm_inq_vars.inq_active) 83e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 84e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach suspend = TRUE; 85e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btsnd_hcic_ble_set_scan_enable (BTM_BLE_SCAN_DISABLE, BTM_BLE_DUPLICATE_ENABLE); 86e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 87e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 886ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if ((p_dev_rec = btm_find_dev (bd_addr)) != NULL && 89e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_dev_rec->device_type == BT_DEVICE_TYPE_BLE) 90e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 91e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_TRACE_DEBUG0("btm_update_dev_to_white_list 1"); 92e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 93e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((to_add && p_cb->num_empty_filter == 0) || 94e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (!to_add && p_cb->num_empty_filter == p_cb->max_filter_entries)) 95e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 96e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_TRACE_ERROR1("num_entry available in controller: %d", p_cb->num_empty_filter); 97e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return started; 98e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 99e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 100e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 101e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ( p_dev_rec->ble.ble_addr_type == BLE_ADDR_PUBLIC) 1026ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach { 103e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (to_add) 104e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach started = btsnd_hcic_ble_add_white_list (BLE_ADDR_PUBLIC, bd_addr); 105e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 106e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach started = btsnd_hcic_ble_remove_from_white_list (BLE_ADDR_PUBLIC, bd_addr); 107e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 108e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 109e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 110e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (BLE_ADDR_IS_STATIC(bd_addr)) 111e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 112e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (to_add) 113e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach started = btsnd_hcic_ble_add_white_list (BLE_ADDR_RANDOM, bd_addr); 114e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 115e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach started = btsnd_hcic_ble_remove_from_white_list (BLE_ADDR_RANDOM, bd_addr); 116e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 117e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 118e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (memcmp(p_dev_rec->ble.reconn_addr, dummy_bda, BD_ADDR_LEN) != 0) 119e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 120e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (to_add) 121e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach started = btsnd_hcic_ble_add_white_list (BLE_ADDR_RANDOM, p_dev_rec->ble.reconn_addr); 122e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 123e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach started = btsnd_hcic_ble_remove_from_white_list (BLE_ADDR_RANDOM, p_dev_rec->ble.reconn_addr); 124e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 125e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 126e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 127e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* if not a known device, shall we add it? */ 128e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 129e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 130e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (to_add) 131e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach started = btsnd_hcic_ble_add_white_list (addr_type, bd_addr); 132e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 133e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach started = btsnd_hcic_ble_remove_from_white_list (addr_type, bd_addr); 134e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 135e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 136e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (suspend) 137e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 138e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btsnd_hcic_ble_set_scan_enable (BTM_BLE_SCAN_ENABLE, BTM_BLE_DUPLICATE_DISABLE); 139e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 140e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 141e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return started; 142e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 143e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 144e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 145e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btm_ble_clear_white_list 146e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 147e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function clears the white list. 148e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 149e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid btm_ble_clear_white_list (void) 150e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 151e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_TRACE_EVENT0 ("btm_ble_clear_white_list"); 152e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btsnd_hcic_ble_clear_white_list(); 153e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 154e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 155e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 156e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 157e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btm_ble_clear_white_list_complete 158e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 159e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function clears the white list complete. 160e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 161e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid btm_ble_clear_white_list_complete(UINT8 *p_data, UINT16 evt_len) 162e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 163e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb; 164e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 status; 165e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_TRACE_EVENT0 ("btm_ble_clear_white_list_complete"); 166e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach STREAM_TO_UINT8 (status, p_data); 1676ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 168e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (status == HCI_SUCCESS) 169e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_cb->num_empty_filter = p_cb->max_filter_entries; 170e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 171e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 172e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 173e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 174e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btm_ble_add_2_white_list_complete 175e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 176e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function read the current white list size. 177e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 178e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid btm_ble_add_2_white_list_complete(UINT8 *p, UINT16 evt_len) 179e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 180e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb; 181e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_TRACE_EVENT0 ("btm_ble_add_2_white_list_complete"); 182e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 183e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (*p == HCI_SUCCESS) 184e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 185e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_cb->num_empty_filter --; 186e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 187e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 188e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 189e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 190e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btm_ble_add_2_white_list_complete 191e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 192e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function read the current white list size. 193e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 194e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid btm_ble_remove_from_white_list_complete(UINT8 *p, UINT16 evt_len) 195e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 196e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb; 197e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_TRACE_EVENT0 ("btm_ble_remove_from_white_list_complete"); 198e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (*p == HCI_SUCCESS) 199e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 200e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_cb->num_empty_filter ++; 201e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 202e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 203e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 204e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 205e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btm_ble_find_dev_in_whitelist 206e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 207e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function check if the device is in the white list 208e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 209e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachBOOLEAN btm_ble_find_dev_in_whitelist(BD_ADDR bd_addr) 210e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 211e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb; 212e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 i; 213e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 214e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_TRACE_EVENT0 ("btm_ble_find_dev_in_whitelist"); 215e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 216e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* empty wl */ 217e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_cb->num_empty_filter == p_cb->max_filter_entries) 218e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 219e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_TRACE_DEBUG0("white list empty"); 220e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return FALSE; 221e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 222e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 223e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for (i = 0; i < BTM_BLE_MAX_BG_CONN_DEV_NUM && i < p_cb->max_filter_entries; i ++) 224e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 225e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (memcmp(p_cb->bg_conn_dev_list[i], bd_addr, BD_ADDR_LEN) == 0) 226e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return TRUE; 227e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 228e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return FALSE; 229e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 230e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 231e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 232e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btm_ble_count_unconn_dev_in_whitelist 233e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 234e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function check the number of unconnected device in white list. 235e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 236e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachUINT8 btm_ble_count_unconn_dev_in_whitelist(void) 237e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 238e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb; 239e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 count = 0, i; 240e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BD_ADDR dummy_bda ={0}; 241e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 242e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_TRACE_EVENT0 ("btm_ble_find_dev_in_whitelist"); 243e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 244e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for (i = 0; i < BTM_BLE_MAX_BG_CONN_DEV_NUM && i < p_cb->max_filter_entries; i ++) 245e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 246e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (memcmp(p_cb->bg_conn_dev_list[i], dummy_bda, BD_ADDR_LEN) != 0 && 247e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach !BTM_IsAclConnectionUp(p_cb->bg_conn_dev_list[i])) 248e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 249e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach count ++; 250e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 251e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 252e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return count; 253e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 254e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 255e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 256e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btm_update_bg_conn_list 257e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 258e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function update the local background connection device list. 259e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 260e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachBOOLEAN btm_update_bg_conn_list(BOOLEAN to_add, BD_ADDR bd_addr) 261e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 262e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb; 263e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 i; 264e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BD_ADDR dummy_bda = {0}; 265e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_TRACE_EVENT0 ("btm_update_bg_conn_list"); 266e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((to_add && (p_cb->bg_conn_dev_num == BTM_BLE_MAX_BG_CONN_DEV_NUM || p_cb->num_empty_filter == 0)) || 267e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (!to_add && p_cb->num_empty_filter == p_cb->max_filter_entries)) 268e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 269e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_TRACE_DEBUG1("num_empty_filter = %d", p_cb->num_empty_filter); 270e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return FALSE; 271e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 272e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 273e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for (i = 0; i < BTM_BLE_MAX_BG_CONN_DEV_NUM && i < p_cb->max_filter_entries; i ++) 274e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 275e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* to add */ 276e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (memcmp(p_cb->bg_conn_dev_list[i], dummy_bda, BD_ADDR_LEN) == 0 && to_add) 277e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 278e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memcpy(p_cb->bg_conn_dev_list[i], bd_addr, BD_ADDR_LEN); 279e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_cb->bg_conn_dev_num ++; 280e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return TRUE; 281e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 282e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* to remove */ 283e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (!to_add && memcmp(p_cb->bg_conn_dev_list[i], bd_addr, BD_ADDR_LEN) == 0) 284e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 285e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset(p_cb->bg_conn_dev_list[i], 0, BD_ADDR_LEN); 286e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_cb->bg_conn_dev_num --; 287e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return TRUE; 288e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 289e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 290e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return FALSE; 291e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 292e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 293e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 294e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btm_write_bg_conn_wl 295e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 2966ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description This function write background connection device list into 297e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** controller. 298e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 299e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid btm_write_bg_conn_wl(void) 300e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 301e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb; 302e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 i; 303e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_TRACE_EVENT0 ("btm_write_bg_conn_wl"); 304e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btm_ble_clear_white_list(); 305e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 306e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach for (i = 0; i < p_cb->bg_conn_dev_num; i ++) 307e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 308e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (!btm_update_dev_to_white_list(TRUE, p_cb->bg_conn_dev_list[i], BLE_ADDR_PUBLIC)) 309e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 310e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 311e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 312e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 313e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 314e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 315e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btm_ble_start_auto_conn 316e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 317e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function is to start/stop auto connection procedure. 318e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3196ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Parameters start: TRUE to start; FALSE to stop. 3206ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 321e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 322e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 323e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 324e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachBOOLEAN btm_ble_start_auto_conn(BOOLEAN start) 325e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 326e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb; 327e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BD_ADDR dummy_bda = {0}; 328e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BOOLEAN exec = TRUE; 329e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 scan_int, scan_win; 330e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 331e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach scan_int = (p_cb->scan_int == BTM_BLE_CONN_PARAM_UNDEF) ? BTM_BLE_CONN_EST_SCAN_INT : p_cb->scan_int; 332e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach scan_win = (p_cb->scan_win == BTM_BLE_CONN_PARAM_UNDEF) ? BTM_BLE_CONN_EST_SCAN_WIND : p_cb->scan_win; 3336ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 334e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (start) 335e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 336e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (!l2cb.is_ble_connecting && 337e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btm_ble_count_unconn_dev_in_whitelist() > 0) 338e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 339e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_cb->bg_conn_state != BLE_BG_CONN_ACTIVE && p_cb->bg_conn_dev_num > 0) 340e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 341e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (!btsnd_hcic_ble_create_ll_conn (scan_int, /* UINT16 scan_int */ 342e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach scan_win, /* UINT16 scan_win */ 343e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 0x01, /* UINT8 white_list */ 344e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BLE_ADDR_PUBLIC, /* UINT8 addr_type_peer */ 345e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach dummy_bda, /* BD_ADDR bda_peer */ 3466ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach BLE_ADDR_PUBLIC, /* UINT8 addr_type_own */ 347e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_BLE_CONN_INT_MIN_DEF, /* UINT16 conn_int_min */ 348e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_BLE_CONN_INT_MAX_DEF, /* UINT16 conn_int_max */ 349e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_BLE_CONN_SLAVE_LATENCY_DEF, /* UINT16 conn_latency */ 350e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_BLE_CONN_TIMEOUT_DEF, /* UINT16 conn_timeout */ 351e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 0, /* UINT16 min_len */ 352e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 0)) /* UINT16 max_len */ 353e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 354e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* start auto connection failed */ 355e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach exec = FALSE; 356e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 357e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 358e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 359e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_cb->bg_conn_state = BLE_BG_CONN_ACTIVE; 360e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 361e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 362e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 363e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 3646ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach exec = FALSE; 365e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 366e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 367e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 368e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_cb->bg_conn_state == BLE_BG_CONN_ACTIVE) 369e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 370e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (!btsnd_hcic_ble_create_conn_cancel()) 371e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach exec = FALSE; 372e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 373e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_cb->bg_conn_state = BLE_BG_CONN_IDLE; 374e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 375e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 376e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return exec; 377e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 378e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 379e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 380e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 381e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btm_ble_start_select_conn 382e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 383e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function is to start/stop selective connection procedure. 384e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 3856ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Parameters start: TRUE to start; FALSE to stop. 3866ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** p_select_cback: callback function to return application 387e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** selection. 3886ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 389e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns BOOLEAN: selective connectino procedure is started. 390e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 391e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 392e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachBOOLEAN btm_ble_start_select_conn(BOOLEAN start,tBTM_BLE_SEL_CBACK *p_select_cback) 393e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 394e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb; 395e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 scan_int, scan_win; 396e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 397e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_TRACE_EVENT0 ("btm_ble_start_select_conn"); 398e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 399e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach scan_int = (p_cb->scan_int == BTM_BLE_CONN_PARAM_UNDEF) ? BTM_BLE_CONN_EST_SCAN_INT : p_cb->scan_int; 400e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach scan_win = (p_cb->scan_win == BTM_BLE_CONN_PARAM_UNDEF) ? BTM_BLE_CONN_EST_SCAN_WIND : p_cb->scan_win; 401e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 402e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (start) 4036ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach { 404e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (!btm_cb.btm_inq_vars.inq_active) 405e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 406e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btm_cb.ble_ctr_cb.p_select_cback = p_select_cback; 407e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 408e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btm_update_scanner_filter_policy(SP_ADV_WL); 409e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 410e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (!btsnd_hcic_ble_set_scan_params(BTM_BLE_SCAN_MODE_PASS, /* use passive scan by default */ 411e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach scan_int, /* scan interval */ 412e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach scan_win, /* scan window */ 413e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BLE_ADDR_PUBLIC, /* own device, DUMO always use public */ 414e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach SP_ADV_WL) /* process advertising packets only from devices in the White List */ 415e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ) 416e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return FALSE; 417e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 418e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_cb->inq_var.adv_mode == BTM_BLE_ADV_ENABLE) 419e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 420e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_TRACE_ERROR0("peripheral device cannot initiate a selective connection"); 421e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return FALSE; 422e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 4236ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach else if (p_cb->bg_conn_dev_num > 0 && btm_ble_count_unconn_dev_in_whitelist() > 0 ) 424e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 425e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 426e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (!btsnd_hcic_ble_set_scan_enable(TRUE, TRUE)) /* duplicate filtering enabled */ 427e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return FALSE; 428e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 429e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* mark up inquiry status flag */ 430e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btm_cb.btm_inq_vars.inq_active = TRUE; 431e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btm_cb.ble_ctr_cb.inq_var.proc_mode = BTM_BLE_SELECT_SCAN; 432e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 433e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_cb->bg_conn_state = BLE_BG_CONN_ACTIVE; 434e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 435e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 436e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 437e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 438e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 439e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_TRACE_ERROR0("scan active, can not start selective connection procedure"); 440e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return FALSE; 441e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 442e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 443e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else /* disable selective connection mode */ 444e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 445e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_cb->p_select_cback = NULL; 446e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btm_cb.btm_inq_vars.inq_active = FALSE; 447e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btm_cb.ble_ctr_cb.inq_var.proc_mode = BTM_BLE_INQUIRY_NONE; 448e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 449e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btm_update_scanner_filter_policy(SP_ADV_ALL); 450e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 451e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* stop scanning */ 452e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_cb->bg_conn_dev_num > 0) 453e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 454e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (!btsnd_hcic_ble_set_scan_enable(FALSE, TRUE)) /* duplicate filtering enabled */ 455e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return FALSE; 456e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 457e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 458e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return TRUE; 459e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 460e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 461e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 462e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btm_ble_initiate_select_conn 463e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 464e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function is to start/stop selective connection procedure. 465e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 4666ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Parameters start: TRUE to start; FALSE to stop. 4676ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** p_select_cback: callback function to return application 468e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** selection. 4696ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 470e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns BOOLEAN: selective connectino procedure is started. 471e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 472e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 473e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid btm_ble_initiate_select_conn(BD_ADDR bda) 474e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 475e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 addr_type; 476e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_TRACE_EVENT0 ("btm_ble_initiate_select_conn"); 477e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach addr_type = btm_ble_map_bda_to_conn_bda(bda); 478e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 479e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* use direct connection procedure to initiate connection */ 480e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (!L2CA_ConnectFixedChnl(L2CAP_ATT_CID, bda)) 481e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 482e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_TRACE_ERROR0("btm_ble_initiate_select_conn failed"); 483e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 484e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 485e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 486e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 487e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btm_ble_suspend_bg_sele_conn 488e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 489e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function is to suspend an active background connection 490e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** procedure. 491e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 492e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Parameters none. 4936ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 494e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns none. 495e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 496e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 497e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid btm_ble_suspend_bg_sele_conn(void) 498e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 499e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb; 500e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_TRACE_EVENT0 ("btm_ble_suspend_bg_sele_conn"); 501e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 502e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_cb->bg_conn_type == BTM_BLE_CONN_SELECTIVE) 503e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 504e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_cb->bg_conn_state = BLE_BG_CONN_SUSPEND; 505e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btm_ble_start_select_conn(FALSE, NULL); 506e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 507e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 508e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 509e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 510e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btm_ble_suspend_bg_conn 511e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 512e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function is to suspend an active background connection 513e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** procedure. 514e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 515e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Parameters none. 5166ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 517e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns none. 518e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 519e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 520e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid btm_ble_suspend_bg_conn(void) 521e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 522e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb; 523e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_TRACE_EVENT0 ("btm_ble_suspend_bg_conn"); 524e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 525e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_cb->bg_conn_type == BTM_BLE_CONN_AUTO) 526e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 527e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (btm_ble_start_auto_conn(FALSE)) 528e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_cb->bg_conn_state = BLE_BG_CONN_SUSPEND; 529e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 530e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 531e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 532e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 533e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btm_ble_scan_param_idle 534e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 5356ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description This function is to process the scan parameter idle timeout 536e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** timeout. 537e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach********************************************************************************/ 538e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid btm_ble_scan_param_idle(void) 539e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 540e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_BleSetConnScanParams(BTM_BLE_CONN_EST_SCAN_INT_LO, BTM_BLE_CONN_EST_SCAN_WIND_LO); 541e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 542e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 543e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 544e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btm_ble_resume_bg_conn 545e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 546e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function is to resume a background auto connection 547e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** procedure. 548e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 549e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Parameters none. 5506ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 551e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns none. 552e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 553e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 554e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachBOOLEAN btm_ble_resume_bg_conn(tBTM_BLE_SEL_CBACK *p_sele_callback, BOOLEAN def_param) 555e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 556e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb; 557e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BOOLEAN ret = FALSE; 558e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 559e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_cb->bg_conn_state != BLE_BG_CONN_ACTIVE ) 560e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 561e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (def_param) 562e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 563e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_cb->scan_int = BTM_BLE_CONN_PARAM_UNDEF; 564e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_cb->scan_win = BTM_BLE_CONN_PARAM_UNDEF; 565e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 566e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* start scan param idle timer */ 5676ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach btu_start_timer(&p_cb->scan_param_idle_timer, 5686ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach BTU_TTYPE_BLE_SCAN_PARAM_IDLE, 569e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BTM_BLE_SCAN_PARAM_TOUT); 5706ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach } 5716ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 572e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_cb->bg_conn_type == BTM_BLE_CONN_AUTO) 573e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ret = btm_ble_start_auto_conn(TRUE); 574e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 575e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_cb->bg_conn_type == BTM_BLE_CONN_SELECTIVE) 576e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 577e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* terminate selective connection mode if all devices are connected */ 578e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (btm_ble_count_unconn_dev_in_whitelist() == 0) 579e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 580e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btsnd_hcic_ble_set_scan_enable (BTM_BLE_SCAN_DISABLE, BTM_BLE_DUPLICATE_DISABLE); 581e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btm_cb.ble_ctr_cb.inq_var.proc_mode = BTM_BLE_INQUIRY_NONE; 582e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btm_cb.btm_inq_vars.inq_active = FALSE; 583e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 584e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else if (!btm_cb.btm_inq_vars.inq_active) 585e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach btm_ble_start_select_conn(TRUE, btm_cb.ble_ctr_cb.p_select_cback); 586e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 587e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 588e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (ret) 589e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_cb->bg_conn_state = BLE_BG_CONN_ACTIVE; 5906ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 591e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 592e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 593e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return ret; 594e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 595e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 596e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 597e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function btm_ble_update_bg_state 598e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 599e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function is to update the bg connection status. 600e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 601e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Parameters none. 6026ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 603e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns none. 604e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 605e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 606e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid btm_ble_update_bg_state(void) 607e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 608e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb; 609e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 610e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (!l2cb.is_ble_connecting && (p_cb->bg_conn_state != BLE_BG_CONN_SUSPEND)) 611e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_cb->bg_conn_state = BLE_BG_CONN_IDLE; 612e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 613e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 614e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 615e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 616e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 617