15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 2008-2012 Broadcom Corporation
45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  you may not use this file except in compliance with the License.
75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  You may obtain a copy of the License at:
85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  See the License for the specific language governing permissions and
155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  limitations under the License.
165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  This file contains functions for BLE GAP.
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdio.h>
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stddef.h>
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_types.h"
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btu.h"
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h"
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcimsgs.h"
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (GAP_INCLUDED == TRUE)
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gap_api.h"
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BLE_INCLUDED == TRUE)
37ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include "gattdefs.h"
38ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTM_BLE_NAME_SHORT                  0x01
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTM_BLE_NAME_CMPL                   0x02
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTM_BLE_FILTER_TARGET_UNKNOWN       0xff
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTM_BLE_POLICY_UNKNOWN              0xff
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTM_EXT_BLE_RMT_NAME_TIMEOUT        30
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Local functions
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_ble_update_adv_flag(UINT8 flag);
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_ble_process_adv_pkt_cont(BD_ADDR bda, UINT8 addr_type, UINT8 evt_type, UINT8 *p);
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 *btm_ble_build_adv_data(tBTM_BLE_AD_MASK *p_data_mask, UINT8 **p_dst, tBTM_BLE_ADV_DATA *p_data);
53ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic UINT8 btm_set_conn_mode_adv_init_addr(tBTM_BLE_INQ_CB *p_cb,
54ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                     BD_ADDR_PTR p_addr_ptr,
55ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                     tBLE_ADDR_TYPE *p_init_addr_type,
56ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                     tBLE_ADDR_TYPE *p_own_addr_type);
57ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic BOOLEAN btm_ble_start_adv(void);
58ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic tBTM_STATUS btm_ble_stop_adv(void);
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_BleReset
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to reset ULP controller.
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       None.
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_BleReset(void)
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btsnd_hcic_ble_reset();
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
77ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
78ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
79ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         BTM_BleUpdateAdvWhitelist
80ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
81ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      Add or remove device from advertising white list
82ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
83ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          void
84ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
85ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
86ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattaBOOLEAN BTM_BleUpdateAdvWhitelist(BOOLEAN add_remove, BD_ADDR remote_bda)
87ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
88ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        return FALSE;
89ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
93ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         BTM_BleUpdateAdvFilterPolicy
94ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
95ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      This function update the filter policy of advertiser.
96ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
97ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Parameter        adv_policy: advertising filter policy
98ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
99ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Return           void
100ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
101ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid BTM_BleUpdateAdvFilterPolicy(tBTM_BLE_AFP adv_policy)
102ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
103ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
104ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBLE_ADDR_TYPE   init_addr_type = BLE_ADDR_PUBLIC;
105ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BD_ADDR          p_addr_ptr= {0};
106ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8            adv_mode = p_cb->adv_mode;
107ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
108ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BTM_TRACE_EVENT0 ("BTM_BleUpdateAdvFilterPolicy");
109ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1103aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
1113aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        return;
1123aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach
113ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (p_cb->afp != adv_policy)
114ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
115ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        p_cb->afp = adv_policy;
116ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
117ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /* if adv active, stop and restart */
118ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        btm_ble_stop_adv ();
119ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
120ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (p_cb->connectable_mode & BTM_BLE_CONNECTABLE)
121ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_cb->evt_type = btm_set_conn_mode_adv_init_addr(p_cb, p_addr_ptr, &init_addr_type, &p_cb->adv_addr_type);
122ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
123ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        btsnd_hcic_ble_write_adv_params (p_cb->adv_interval_min,
124ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                         p_cb->adv_interval_max,
125ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                         p_cb->evt_type,
126ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                         p_cb->adv_addr_type,
127ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                         init_addr_type,
128ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                         p_addr_ptr,
129ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                         p_cb->adv_chnl_map,
130ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                         p_cb->afp);
131ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
132ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (adv_mode == BTM_BLE_ADV_ENABLE)
133ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            btm_ble_start_adv ();
134ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
135ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
136ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
137ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
138ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_BleObserve
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This procedure keep the device listening for advertising
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  events from a broadcast device.
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       start: start or stop observe.
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  white_list: use white list in observer mode or not.
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_BleObserve(BOOLEAN start, UINT8 duration,
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           tBTM_INQ_RESULTS_CB *p_results_cb, tBTM_CMPL_CB *p_cmpl_cb)
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_INQ_CB *p_inq = &btm_cb.ble_ctr_cb.inq_var;
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS     status = BTM_NO_RESOURCES;
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_EVENT0 ("BTM_BleObserve ");
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1583aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
1593aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        return BTM_ILLEGAL_VALUE;
1603aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (start)
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
163ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /* shared inquiry database, do not allow observe if any inquiry is active */
164ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (btm_cb.btm_inq_vars.inq_active || p_inq->proc_mode != BTM_BLE_INQUIRY_NONE)
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return BTM_BUSY;
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.btm_inq_vars.p_inq_results_cb = p_results_cb;
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.btm_inq_vars.p_inq_cmpl_cb = p_cmpl_cb;
169ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        p_inq->scan_type = (p_inq->scan_type == BTM_BLE_SCAN_MODE_NONE) ? BTM_BLE_SCAN_MODE_ACTI: p_inq->scan_type;
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* allow config scanning type */
172ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (btsnd_hcic_ble_set_scan_params (p_inq->scan_type,
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            (UINT16)(!p_inq->scan_interval ? BTM_BLE_GAP_DISC_SCAN_INT : p_inq->scan_interval),
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            (UINT16)(!p_inq->scan_window ? BTM_BLE_GAP_DISC_SCAN_WIN : p_inq->scan_window),
1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            BLE_ADDR_PUBLIC,
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                            BTM_BLE_DEFAULT_SFP)) /* assume observe always not using white list */
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* start scan, disable duplicate filtering */
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btsnd_hcic_ble_set_scan_enable (BTM_BLE_SCAN_ENABLE, BTM_BLE_DUPLICATE_DISABLE))
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                status = BTM_SUCCESS;
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_inq->proc_mode = BTM_BLE_OBSERVE;
183ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                btm_cb.btm_inq_vars.inq_active |= BTM_LE_OBSERVE_ACTIVE;
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (duration != 0)
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /* start inquiry timer */
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    btu_start_timer (&p_inq->inq_timer_ent, BTU_TTYPE_BLE_INQUIRY, duration);
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (p_inq->proc_mode == BTM_BLE_OBSERVE)
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
195ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        btm_cb.btm_inq_vars.inq_active &= ~BTM_LE_OBSERVE_ACTIVE;
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_ble_stop_scan();
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_BleBroadcast
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is to start or stop broadcasting.
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       start: start or stop broadcasting.
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          status.
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_BleBroadcast(BOOLEAN start)
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS status = BTM_NO_RESOURCES;
216ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_LE_RANDOM_CB *p_addr_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 evt_type = p_cb->scan_rsp ? BTM_BLE_DISCOVER_EVT: BTM_BLE_NON_CONNECT_EVT;
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2203aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
2213aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        return BTM_ILLEGAL_VALUE;
2223aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef  BTM_BLE_PC_ADV_TEST_MODE
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (BTM_BLE_PC_ADV_TEST_MODE)
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        evt_type = p_cb->scan_rsp ? BTM_BLE_CONNECT_EVT: BTM_BLE_NON_CONNECT_EVT;
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (start && p_cb->adv_mode == BTM_BLE_ADV_DISABLE)
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* update adv params */
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!btsnd_hcic_ble_write_adv_params ((UINT16)(p_cb->adv_interval_min ? p_cb->adv_interval_min : BTM_BLE_GAP_ADV_INT),
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                              (UINT16)(p_cb->adv_interval_max ? p_cb->adv_interval_max : BTM_BLE_GAP_ADV_INT),
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                              evt_type,
236ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                              p_addr_cb->own_addr_type,
237ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                              p_cb->direct_bda.type,
238ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                              p_cb->direct_bda.bda,
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                              p_cb->adv_chnl_map,
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                              p_cb->afp))
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = BTM_NO_RESOURCES;
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->evt_type = evt_type;
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
246ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        status = btm_ble_start_adv ();
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (!start && p_cb->adv_mode == BTM_BLE_ADV_ENABLE)
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
250ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        status = btm_ble_stop_adv();
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = BTM_WRONG_MODE;
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_ERROR2("Can not %s Broadcast, device %s in Broadcast mode",
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (start ? "Start" : "Stop"), (start ? "alerady" :"not"));
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_RegisterScanReqEvt
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to register a scan request callback
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  on the advertiser.
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       p_scan_req_cback: scan request callback.  If NULL, remove the
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                    registration.
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_RegisterScanReqEvt(tBTM_BLE_SCAN_REQ_CBACK   *p_scan_req_cback)
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
276ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#ifdef BTM_BLE_PC_ADV_TEST_MODE /* For general stack code (e.g. BTInsight testing), we simply do not define it to exclude or set it to TRUE to include */
277ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (BTM_BLE_PC_ADV_TEST_MODE)   /* For stack component, it is always defined and maps to a global variable g_bDraculaAdvertisingMode */
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cb->p_scan_req_cback = p_scan_req_cback;
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_BleSetBgConnType
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to set BLE connectable mode for a
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  peripheral device.
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       bg_conn_type: it can be auto connection, or selective connection.
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_select_cback: callback function when selective connection procedure
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                              is being used.
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_BleSetBgConnType(tBTM_BLE_CONN_TYPE   bg_conn_type,
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                             tBTM_BLE_SEL_CBACK   *p_select_cback)
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN started = TRUE;
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_EVENT0 ("BTM_BleSetBgConnType ");
3053aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
3063aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        return FALSE;
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.ble_ctr_cb.bg_conn_type != bg_conn_type)
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch (bg_conn_type)
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTM_BLE_CONN_AUTO:
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_ble_start_auto_conn(TRUE);
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTM_BLE_CONN_SELECTIVE:
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_AUTO)
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    btm_ble_start_auto_conn(FALSE);
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                started = btm_ble_start_select_conn(TRUE, p_select_cback);
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTM_BLE_CONN_NONE:
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_AUTO)
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    btm_ble_start_auto_conn(FALSE);
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else if (btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_SELECTIVE)
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    btm_ble_start_select_conn(FALSE, NULL);
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                started = TRUE;
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            default:
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BTM_TRACE_ERROR1("invalid bg connection type : %d ", bg_conn_type);
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                started = FALSE;
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (started)
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.ble_ctr_cb.bg_conn_type = bg_conn_type;
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return started;
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_BleUpdateBgConnDev
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to add or remove a device into/from
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  background connection procedure. The background connection
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*                   procedure is decided by the background connection type, it can be
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*                   auto connection, or selective connection.
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       add_remove: TRUE to add; FALSE to remove.
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  remote_bda: device address to add/remove.
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_BleUpdateBgConnDev(BOOLEAN add_remove, BD_ADDR   remote_bda)
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN ret = TRUE;
3666975b4d711142b885af479721cada448952c6b41Andre Eisenbach    UINT8   dev_wl_type = 0;
367946c681e59451164b343b7ab9415aa73b0d176bcAndre Eisenbach    BTM_TRACE_EVENT0 (" BTM_BleUpdateBgConnDev");
368946c681e59451164b343b7ab9415aa73b0d176bcAndre Eisenbach
369946c681e59451164b343b7ab9415aa73b0d176bcAndre Eisenbach    /* update white list */
370946c681e59451164b343b7ab9415aa73b0d176bcAndre Eisenbach    ret = btm_update_bg_conn_list(add_remove, remote_bda, &dev_wl_type);
371946c681e59451164b343b7ab9415aa73b0d176bcAndre Eisenbach
372946c681e59451164b343b7ab9415aa73b0d176bcAndre Eisenbach    btm_update_dev_to_white_list(add_remove, remote_bda, dev_wl_type);
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return ret;
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_BleSetConnMode
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to set BLE connectable mode for a
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  peripheral device.
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       directed: is directed connectable mode, or non-directed.
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_dir_bda: connectable direct initiator's LE device address
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
390ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi BattatBTM_STATUS BTM_BleSetConnMode(BOOLEAN is_directed)
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
394ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BTM_TRACE_EVENT1 ("BTM_BleSetConnMode is_directed = %d ", is_directed);
3953aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
3963aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        return BTM_ILLEGAL_VALUE;
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
398ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    p_cb->directed_conn = is_directed;
399ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    return btm_ble_set_connectability( p_cb->connectable_mode);
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
401ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
403ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
404ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
405ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         btm_set_conn_mode_adv_init_addr
406ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
407ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      set initator address type and local address type based on adv
408ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**                  mode.
409ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
410ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
411ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
412ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic UINT8 btm_set_conn_mode_adv_init_addr(tBTM_BLE_INQ_CB *p_cb,
413ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                     BD_ADDR_PTR p_addr_ptr,
414ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                     tBLE_ADDR_TYPE *p_init_addr_type,
415ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                     tBLE_ADDR_TYPE *p_own_addr_type)
416ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
417ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8 evt_type;
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
419ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if ( p_cb->directed_conn)
420ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
421ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /*  direct adv mode does not have privacy if privacy
422ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            is not enabled or no reconn addr config */
423ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        *p_own_addr_type   = BLE_ADDR_PUBLIC;
424ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        *p_init_addr_type  = p_cb->direct_bda.type;
425ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         memcpy(p_addr_ptr, p_cb->direct_bda.bda, BD_ADDR_LEN);
426ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        evt_type = BTM_BLE_CONNECT_DIR_EVT;
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
428ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    else /* undirect adv mode */
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
430ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        evt_type = BTM_BLE_CONNECT_EVT;
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
432ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
433ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    return evt_type;
434ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_BleSetAdvParams
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to set advertising parameters.
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       adv_int_min: minimum advertising interval
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  adv_int_max: maximum advertising interval
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_dir_bda: connectable direct initiator's LE device address
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  chnl_map: advertising channel map.
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_BleSetAdvParams(UINT16 adv_int_min, UINT16 adv_int_max,
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                tBLE_BD_ADDR *p_dir_bda,
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                tBTM_BLE_ADV_CHNL_MAP chnl_map)
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
455ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_LE_RANDOM_CB *p_addr_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS status = BTM_SUCCESS;
458ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BD_ADDR     p_addr_ptr =  {0};
459ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBLE_ADDR_TYPE   init_addr_type = BLE_ADDR_PUBLIC;
460ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBLE_ADDR_TYPE   own_addr_type = p_addr_cb->own_addr_type;
461ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8            adv_mode = p_cb->adv_mode;
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_EVENT0 ("BTM_BleSetAdvParams");
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4653aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
4663aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        return BTM_ILLEGAL_VALUE;
4673aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!BTM_BLE_VALID_PRAM(adv_int_min, BTM_BLE_ADV_INT_MIN, BTM_BLE_ADV_INT_MAX) ||
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        !BTM_BLE_VALID_PRAM(adv_int_max, BTM_BLE_ADV_INT_MIN, BTM_BLE_ADV_INT_MAX))
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_ILLEGAL_VALUE;
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->adv_interval_min = adv_int_min;
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->adv_interval_max = adv_int_max;
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->adv_chnl_map = chnl_map;
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dir_bda)
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(&p_cb->direct_bda, p_dir_bda, sizeof(tBLE_BD_ADDR));
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
483ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BTM_TRACE_EVENT0 ("update params for an active adv");
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
485ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    btm_ble_stop_adv();
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
487ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (p_cb->connectable_mode & BTM_BLE_CONNECTABLE)
488ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        p_cb->evt_type = btm_set_conn_mode_adv_init_addr(p_cb, p_addr_ptr, &init_addr_type, &own_addr_type);
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
490ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* update adv params */
491ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    btsnd_hcic_ble_write_adv_params (p_cb->adv_interval_min,
492ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                     p_cb->adv_interval_max,
493ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                     p_cb->evt_type,
494ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                     own_addr_type,
495ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                     init_addr_type,
496ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                     p_addr_ptr,
497ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                     p_cb->adv_chnl_map,
498ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                     p_cb->afp);
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
500ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (adv_mode == BTM_BLE_ADV_ENABLE)
501ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        btm_ble_start_adv();
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_BleReadAdvParams
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to set advertising parameters.
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       adv_int_min: minimum advertising interval
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  adv_int_max: maximum advertising interval
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_dir_bda: connectable direct initiator's LE device address
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  chnl_map: advertising channel map.
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_BleReadAdvParams (UINT16 *adv_int_min, UINT16 *adv_int_max,
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           tBLE_BD_ADDR *p_dir_bda, tBTM_BLE_ADV_CHNL_MAP *p_chnl_map)
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_EVENT0 ("BTM_BleReadAdvParams ");
5263aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
5273aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        return ;
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *adv_int_min = p_cb->adv_interval_min;
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *adv_int_max = p_cb->adv_interval_max;
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *p_chnl_map = p_cb->adv_chnl_map;
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_dir_bda != NULL)
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(p_dir_bda, &p_cb->direct_bda, sizeof(tBLE_BD_ADDR));
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_BleSetScanParams
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to set Scan parameters.
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       adv_int_min: minimum advertising interval
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  adv_int_max: maximum advertising interval
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_dir_bda: connectable direct initiator's LE device address
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  chnl_map: advertising channel map.
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  scan_type: active scan or passive scan
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_BleSetScanParams(UINT16 scan_interval, UINT16 scan_window, tBTM_BLE_SCAN_MODE scan_mode)
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_EVENT0 (" BTM_BleSetScanParams");
5593aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
5603aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        return ;
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (BTM_BLE_VALID_PRAM(scan_interval, BTM_BLE_SCAN_INT_MIN, BTM_BLE_SCAN_INT_MAX) &&
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_BLE_VALID_PRAM(scan_window, BTM_BLE_SCAN_WIN_MIN, BTM_BLE_SCAN_WIN_MAX) &&
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (scan_mode == BTM_BLE_SCAN_MODE_ACTI || scan_mode == BTM_BLE_SCAN_MODE_PASS))
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cb->scan_type     = scan_mode;
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (BTM_BLE_CONN_PARAM_UNDEF != scan_interval)
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->scan_interval = scan_interval;
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (BTM_BLE_CONN_PARAM_UNDEF != scan_window)
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->scan_window   = scan_window;
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_ERROR2("Illegal params: scan_interval = %d scan_window = %d",
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        scan_interval, scan_window);
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_BleWriteScanRsp
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to write LE scan response.
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      p_scan_rsp: scan response information.
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_BleWriteScanRsp(tBTM_BLE_AD_MASK data_mask, tBTM_BLE_ADV_DATA *p_data)
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS     status = BTM_NO_RESOURCES;
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   rsp_data[BTM_BLE_AD_DATA_LEN],
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p = rsp_data;
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_EVENT0 (" BTM_BleWriteScanRsp");
6003aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach
6013aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
6023aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        return BTM_ILLEGAL_VALUE;
6033aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(rsp_data, 0, BTM_BLE_AD_DATA_LEN);
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_ble_build_adv_data(&data_mask, &p, p_data);
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btsnd_hcic_ble_set_scan_rsp_data((UINT8)(p - rsp_data), rsp_data))
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = BTM_SUCCESS;
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
611ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (data_mask != 0)
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.ble_ctr_cb.inq_var.scan_rsp = TRUE;
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.ble_ctr_cb.inq_var.scan_rsp = FALSE;
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = BTM_ILLEGAL_VALUE;
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_BleWriteAdvData
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to write advertising data.
6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:       None.
6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_BleWriteAdvData(tBTM_BLE_AD_MASK data_mask, tBTM_BLE_ADV_DATA *p_data)
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_LOCAL_ADV_DATA *p_cb_data = &btm_cb.ble_ctr_cb.inq_var.adv_data;
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8  *p;
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16   mask = data_mask;
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6393aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    BTM_TRACE_EVENT0 ("BTM_BleWriteAdvData ");
6403aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach
6413aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
6423aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        return BTM_ILLEGAL_VALUE;
6433aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(p_cb_data, 0, sizeof(tBTM_BLE_LOCAL_ADV_DATA));
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p = p_cb_data->ad_data;
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb_data->data_mask = data_mask;
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb_data->p_flags = btm_ble_build_adv_data(&mask, &p, p_data);
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb_data->p_pad = p;
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (data_mask != 0)
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_ERROR0("Partial data write into ADV");
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb_data->data_mask &= ~mask;
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btsnd_hcic_ble_set_adv_data((UINT8)(p_cb_data->p_pad - p_cb_data->ad_data),
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    p_cb_data->ad_data))
6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_SUCCESS;
6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_NO_RESOURCES;
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_CheckAdvData
6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to get ADV data for a specific type.
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       p_adv - pointer of ADV data
6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  type   - finding ADV data type
6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_length - return the length of ADV data not including type
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          pointer of ADV data
6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 *BTM_CheckAdvData( UINT8 *p_adv, UINT8 type, UINT8 *p_length)
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *p = p_adv;
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 length;
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 adv_type;
6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_API1("BTM_CheckAdvData type=0x%02X", type);
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8(length, p);
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while ( length && (p - p_adv <= BTM_BLE_CACHE_ADV_DATA_MAX))
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_UINT8(adv_type, p);
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ( adv_type == type )
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* length doesn't include itself */
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p_length = length - 1; /* minus the length of type */
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return p;
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p += length - 1; /* skip the length of data */
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_UINT8(length, p);
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *p_length = 0;
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return NULL;
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_build_adv_data
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called build the adv data and rsp data.
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 *btm_ble_build_adv_data(tBTM_BLE_AD_MASK *p_data_mask, UINT8 **p_dst, tBTM_BLE_ADV_DATA *p_data)
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 data_mask = *p_data_mask;
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p = *p_dst,
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *p_flag = NULL;
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  len = BTM_BLE_AD_DATA_LEN, cp_len = 0;
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   i = 0;
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_PROP_ELEM      *p_elem;
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_EVENT0 (" btm_ble_build_adv_data");
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* build the adv data structure and build the data string */
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (data_mask)
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* flags */
7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (data_mask & BTM_BLE_AD_BIT_FLAGS)
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = 2;
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = BTM_BLE_AD_TYPE_FLAG;
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_flag = p;
7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_data)
7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                *p++ = p_data->flag;
7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                *p++ = 0;
7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len -= 3;
7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            data_mask &= ~BTM_BLE_AD_BIT_FLAGS;
7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
742ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /* appearance data */
743ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (len > 3 && data_mask & BTM_BLE_AD_BIT_APPEARANCE)
744ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
745ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            *p++ = 3; /* length */
746ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            *p++ = BTM_BLE_AD_TYPE_APPEARANCE;
747ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            UINT16_TO_STREAM(p, p_data->appearance);
748ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            len -= 4;
749ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
750ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            data_mask &= ~BTM_BLE_AD_BIT_APPEARANCE;
751ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* device name */
753ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if BTM_MAX_LOC_BD_NAME_LEN > 0
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (len > 2 && data_mask & BTM_BLE_AD_BIT_DEV_NAME)
7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (strlen(btm_cb.cfg.bd_name) > (UINT16)(len - 2))
7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                *p++ = len - 2 + 1;
7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                *p++ = BTM_BLE_AD_TYPE_NAME_SHORT;
7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ARRAY_TO_STREAM(p, btm_cb.cfg.bd_name, len - 2);
7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                cp_len = (UINT16)strlen(btm_cb.cfg.bd_name);
7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                *p++ = cp_len + 1;
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                *p++ = BTM_BLE_AD_TYPE_NAME_CMPL;
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ARRAY_TO_STREAM(p, btm_cb.cfg.bd_name, cp_len);
7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len -= (cp_len + 2);
7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            data_mask &= ~BTM_BLE_AD_BIT_DEV_NAME;
7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
772ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif
7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* manufacturer data */
7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (len > 2 && data_mask & BTM_BLE_AD_BIT_MANU &&
7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_data && p_data->manu.len != 0 && p_data->manu.p_val)
7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_data->manu.len > (len - 2))
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                cp_len = len - 2;
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                cp_len = p_data->manu.len;
7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = cp_len + 1;
7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = BTM_BLE_AD_TYPE_MANU;
7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ARRAY_TO_STREAM(p, p_data->manu.p_val, cp_len);
7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len -= (cp_len + 2);
7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            data_mask &= ~BTM_BLE_AD_BIT_MANU;
7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* TX power */
7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (len > 2 && data_mask & BTM_BLE_AD_BIT_TX_PWR)
7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = 2;
7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = BTM_BLE_AD_TYPE_TX_PWR;
7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = btm_cb.ble_ctr_cb.inq_var.tx_power;
7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len -= 3;
7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            data_mask &= ~BTM_BLE_AD_BIT_TX_PWR;
7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* services */
8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (len > 2 && data_mask & BTM_BLE_AD_BIT_SERVICE &&
8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_data && p_data->services.num_service != 0 &&
8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_data->services.p_uuid)
8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_data->services.num_service * 2 > (len - 2))
8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                cp_len = (len - 2)/2;
8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                *p ++ = 1 + cp_len * 2;
808ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                *p++ = BTM_BLE_AD_TYPE_16SRV_PART;
8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                cp_len = p_data->services.num_service;
8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                *p++ = 1 + cp_len * 2;
814ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                *p++ = BTM_BLE_AD_TYPE_16SRV_CMPL;
8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            for (i = 0; i < cp_len; i ++)
8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                UINT16_TO_STREAM(p, *(p_data->services.p_uuid + i));
8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len -= (cp_len * 2 + 2);
8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            data_mask &= ~BTM_BLE_AD_BIT_SERVICE;
8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (len >= 6 && data_mask & BTM_BLE_AD_BIT_INT_RANGE &&
8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_data)
8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = 5;
8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p++ = BTM_BLE_AD_TYPE_INT_RANGE;
8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT16_TO_STREAM(p, p_data->int_range.low);
8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UINT16_TO_STREAM(p, p_data->int_range.hi);
8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            len -= 6;
8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            data_mask &= ~BTM_BLE_AD_BIT_INT_RANGE;
8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (data_mask & BTM_BLE_AD_BIT_PROPRIETARY && p_data && p_data->p_proprietary)
8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            for (i = 0; i < p_data->p_proprietary->num_elem ; i ++)
8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_elem = p_data->p_proprietary->p_elem  + i;
8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (len >= (2 + p_elem->len))/* len byte(1) + ATTR type(1) + Uuid len(2) + value length */
8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    *p ++ = p_elem->len + 1; /* Uuid len + value length */
8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    *p ++ = p_elem->adv_type;
8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    ARRAY_TO_STREAM(p, p_elem->p_val, p_elem->len);
8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    len -= (2 + p_elem->len);
8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    BTM_TRACE_WARNING0("data exceed max adv packet length");
8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    break;
8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            data_mask &= ~BTM_BLE_AD_BIT_PROPRIETARY;
8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *p_data_mask = data_mask;
8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *p_dst = p;
8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_flag;
8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_set_discoverability
8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to set BLE discoverable mode.
8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      mode: discoverability mode.
8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS btm_ble_set_discoverability(UINT16 combined_mode)
8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
877ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_LE_RANDOM_CB   *p_addr_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_INQ_CB     *p_cb = &btm_cb.ble_ctr_cb.inq_var;
8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16              mode = (combined_mode &  BTM_BLE_DISCOVERABLE_MASK);
8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               flag = 0;
8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               new_mode = BTM_BLE_ADV_ENABLE;
8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               evt_type = (p_cb->connectable_mode == BTM_BLE_NON_CONNECTABLE) ? \
8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                   ((p_cb->scan_rsp) ? BTM_BLE_DISCOVER_EVT : BTM_BLE_NON_CONNECT_EVT )\
8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                   : BTM_BLE_CONNECT_EVT;
8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS         status = BTM_SUCCESS;
886ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BD_ADDR             p_addr_ptr= {0};
887ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBLE_ADDR_TYPE      init_addr_type = BLE_ADDR_PUBLIC,
888ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                        own_addr_type = p_addr_cb->own_addr_type;;
8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_EVENT2 ("btm_ble_set_discoverability mode=0x%0x combined_mode=0x%x", mode, combined_mode);
8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /*** Check mode parameter ***/
8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (mode > BTM_BLE_MAX_DISCOVERABLE)
8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_ILLEGAL_VALUE);
8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->br_edr_supported_flag |= (combined_mode & BTM_DISCOVERABLE_MASK);
8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->discoverable_mode = mode;
8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_cb->br_edr_supported_flag)
9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        flag = BTM_BLE_BREDR_NOT_SPT;
9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_DEBUG1("btm_ble_set_discoverability (BREDR not sup)flag=0x%x",flag);
9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG1 ("br_edr_supported=0x%x", p_cb->br_edr_supported_flag);
9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (mode == BTM_BLE_LIMITED_DISCOVERABLE || mode == BTM_BLE_GENERAL_DISCOVERABLE)
9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_EVENT0 ("mode == BTM_BLE_LIMITED_DISCOVERABLE ");
9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* write ADV data with limited disc flag */
9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (mode == BTM_BLE_LIMITED_DISCOVERABLE)
9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            flag |= BTM_BLE_LIMIT_DISC_FLAG ;
9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            flag |= BTM_BLE_GEN_DISC_FLAG;
9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else  /* non-discoverable */
9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_EVENT0 ("mode == BTM_BLE_NON_DISCOVERABLE ");
9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cb->connectable_mode == BTM_BLE_NON_CONNECTABLE)
9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->br_edr_supported_flag = 0;
9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_TRACE_EVENT0 ("always disable adv in non-discoverable non-connectable mode if no scan rsp ");
9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!p_cb->scan_rsp )
9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project	            new_mode = BTM_BLE_ADV_DISABLE;
927ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
931ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_cb->evt_type = btm_set_conn_mode_adv_init_addr(p_cb, p_addr_ptr, &init_addr_type, &own_addr_type);
9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_ble_update_adv_flag(flag);
9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* update adv params if start advertising */
9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_EVENT2 ("evt_type=0x%x p-cb->evt_type=0x%x ", evt_type, p_cb->evt_type);
938ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (new_mode == BTM_BLE_ADV_ENABLE &&
939ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        (evt_type != p_cb->evt_type ||p_cb->adv_addr_type != own_addr_type))
9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
941ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        btm_ble_stop_adv();
9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* update adv params */
9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!btsnd_hcic_ble_write_adv_params ((UINT16)(p_cb->adv_interval_min ? p_cb->adv_interval_min : BTM_BLE_GAP_ADV_INT),
9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                              (UINT16)(p_cb->adv_interval_max ? p_cb->adv_interval_max : BTM_BLE_GAP_ADV_INT),
9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                              evt_type,
947ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                              own_addr_type,
948ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                              init_addr_type,
949ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                              p_addr_ptr,
9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                              p_cb->adv_chnl_map,
9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                              p_cb->afp))
9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = BTM_NO_RESOURCES;
9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
955ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->evt_type = evt_type;
957ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_cb->adv_addr_type = own_addr_type;
958ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
961ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status == BTM_SUCCESS && p_cb->adv_mode != new_mode)
9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
964ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (new_mode == BTM_BLE_ADV_ENABLE)
965ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            status = btm_ble_start_adv();
9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
967ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            status = btm_ble_stop_adv();
9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* set up stop advertising timer */
9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status == BTM_SUCCESS && mode == BTM_BLE_LIMITED_DISCOVERABLE)
9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_EVENT1 ("start timer for limited disc mode duration=%d (30 secs)", BTM_BLE_GAP_LIM_TOUT);
9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* start Tgap(lim_timeout) */
9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btu_start_timer (&p_cb->inq_timer_ent, BTU_TTYPE_BLE_GAP_LIM_DISC,
9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                         BTM_BLE_GAP_LIM_TOUT);
9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_set_connectability
9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to set BLE connectability mode.
9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      mode: connectability mode.
9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS btm_ble_set_connectability(UINT16 combined_mode)
9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
994ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_LE_RANDOM_CB       *p_addr_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_INQ_CB         *p_cb = &btm_cb.ble_ctr_cb.inq_var;
9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16                  mode = (combined_mode & BTM_BLE_CONNECTABLE_MASK);
9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8                   cur_flag = 0;
9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8                   cur_br_edr_not_sup_flag;
9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8                   new_flag;
10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8                   new_mode = BTM_BLE_ADV_ENABLE;
10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8                   evt_type = (p_cb->scan_rsp) ? BTM_BLE_DISCOVER_EVT: BTM_BLE_NON_CONNECT_EVT;
10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS             status = BTM_SUCCESS;
1003ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BD_ADDR                 p_addr_ptr =  {0};
1004ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBLE_ADDR_TYPE          init_addr_type = BLE_ADDR_PUBLIC,
1005ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                            own_addr_type = p_addr_cb->own_addr_type;
10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_EVENT2 ("btm_ble_set_connectability mode=0x%0x combined_mode=0x%x", mode, combined_mode);
10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /*** Check mode parameter ***/
10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (mode > BTM_BLE_MAX_CONNECTABLE)
10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_ILLEGAL_VALUE);
10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.ble_ctr_cb.inq_var.adv_data.p_flags)
10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cur_flag = *btm_cb.ble_ctr_cb.inq_var.adv_data.p_flags ;
10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cur_br_edr_not_sup_flag = (cur_flag & ((UINT8) BTM_BLE_BREDR_NOT_SPT));
10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->br_edr_supported_flag |= ((combined_mode & BTM_CONNECTABLE_MASK) << 4);
10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cb->br_edr_supported_flag && cur_br_edr_not_sup_flag)
10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        new_flag = cur_flag & ((UINT8) (~BTM_BLE_BREDR_NOT_SPT));
10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_EVENT2 ("new flag=0x%x cur flag=0x%x",new_flag,  cur_flag);
10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_ble_update_adv_flag(new_flag);
10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->connectable_mode = mode;
10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (mode == BTM_BLE_NON_CONNECTABLE)
10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cb->discoverable_mode == BTM_BLE_NON_DISCOVERABLE)
10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->br_edr_supported_flag = 0;
10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_TRACE_EVENT0 ("always disable adv in non-discoverable non-connectable mode with no scan rsp");
10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(!p_cb->scan_rsp)
10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project	            new_mode = BTM_BLE_ADV_DISABLE;
1032ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else /* connectable */
10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1037ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        evt_type = btm_set_conn_mode_adv_init_addr(p_cb, p_addr_ptr, &init_addr_type, &own_addr_type);
10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* update adv params if needed */
1041ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if ((p_cb->evt_type != evt_type || p_cb->adv_addr_type != p_addr_cb->own_addr_type)
1042ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        && new_mode == BTM_BLE_ADV_ENABLE)
10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1044ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        btm_ble_stop_adv();
10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!btsnd_hcic_ble_write_adv_params ((UINT16)(p_cb->adv_interval_min ? p_cb->adv_interval_min : BTM_BLE_GAP_ADV_INT),
10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                              (UINT16)(p_cb->adv_interval_max ? p_cb->adv_interval_max : BTM_BLE_GAP_ADV_INT),
10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                              evt_type,
1049ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                              own_addr_type,
1050ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                              init_addr_type,
1051ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                                              p_addr_ptr,
10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                              p_cb->adv_chnl_map,
10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                              p_cb->afp))
10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = BTM_NO_RESOURCES;
10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
1056ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->evt_type = evt_type;
1058ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_cb->adv_addr_type = own_addr_type;
1059ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1061ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* update advertising mode */
10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (status == BTM_SUCCESS && new_mode != p_cb->adv_mode)
10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btsnd_hcic_ble_set_adv_enable (new_mode))
10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = BTM_SUCCESS;
10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cb->adv_mode = new_mode;
1070ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1071ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if (p_cb->adv_mode == BTM_BLE_ADV_ENABLE &&
1072ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                p_cb->afp != AP_SCAN_CONN_ALL)
1073ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                btm_cb.ble_ctr_cb.wl_state |= BTM_BLE_WL_ADV;
1074ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            else
1075ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                btm_cb.ble_ctr_cb.wl_state &= ~BTM_BLE_WL_ADV;
1076ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_start_inquiry
10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to start BLE inquiry procedure.
10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  If the duration is zero, the periodic inquiry mode is cancelled.
10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      mode - GENERAL or LIMITED inquiry
10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_inq_params - pointer to the BLE inquiry parameter.
10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_results_cb - callback returning pointer to results (tBTM_INQ_RESULTS)
10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_cmpl_cb - callback indicating the end of an inquiry
10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BTM_CMD_STARTED if successfully started
10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_NO_RESOURCES if could not allocate a message buffer
10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_BUSY - if an inquiry is already active
11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS btm_ble_start_inquiry (UINT8 mode, UINT8   duration)
11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS status = BTM_NO_RESOURCES;
11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_INQ_CB *p_inq = &btm_cb.ble_ctr_cb.inq_var;
11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG2("btm_ble_start_inquiry: mode = %02x inq_active = %d", mode, btm_cb.btm_inq_vars.inq_active);
11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_inq->proc_mode != BTM_BLE_INQUIRY_NONE)
11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_ERROR0("LE scan is active, can not start inquiry");
11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return(BTM_BUSY);
11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_update_scanner_filter_policy(SP_ADV_ALL);
11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* start scan, already enable duplicate filtering */
11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btsnd_hcic_ble_set_scan_enable (BTM_BLE_SCAN_ENABLE, BTM_BLE_DUPLICATE_DISABLE))
11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1120ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        status = BTM_CMD_STARTED;
11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_inq->proc_mode = mode;
11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (duration != 0)
11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* start inquiry timer */
11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btu_start_timer (&p_inq->inq_timer_ent, BTU_TTYPE_BLE_INQUIRY, duration);
11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_read_remote_name_cmpl
11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when BLE remote name is received.
11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_read_remote_name_cmpl(BOOLEAN status, BD_ADDR bda, UINT16 length, char *p_name)
11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   hci_status = HCI_SUCCESS;
11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BD_NAME bd_name;
11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1147ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    memset(bd_name, 0, (BD_NAME_LEN + 1));
11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy((UINT8*)bd_name, p_name, length);
11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((!status) || (length==0))
11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        hci_status = HCI_ERR_HOST_TIMEOUT;
11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1155ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    btm_process_remote_name(bda, bd_name, length +1, hci_status);
11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_rmt_name_request_complete (bda, (UINT8 *)p_name, hci_status);
11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_read_remote_name
11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function read remote LE device name using GATT read
11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  procedure.
11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:       None.
11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS btm_ble_read_remote_name(BD_ADDR remote_bda, tBTM_INQ_INFO *p_cur, tBTM_CMPL_CB *p_cb)
11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQUIRY_VAR_ST      *p_inq = &btm_cb.btm_inq_vars;
11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11753aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
11763aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        return BTM_ERR_PROCESSING;
11773aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach
11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cur &&
11795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cur->results.ble_evt_type != BTM_BLE_EVT_CONN_ADV &&
11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cur->results.ble_evt_type != BTM_BLE_EVT_CONN_DIR_ADV)
11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_DEBUG0("name request to non-connectable device failed.");
11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_ERR_PROCESSING;
11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* read remote device name using GATT procedure */
11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_inq->remname_active)
11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_BUSY;
11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!GAP_BleReadPeerDevName(remote_bda, btm_ble_read_remote_name_cmpl))
11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_BUSY;
11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_inq->p_remname_cmpl_cb = p_cb;
11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_inq->remname_active = TRUE;
11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy(p_inq->remname_bda, remote_bda, BD_ADDR_LEN);
11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_start_timer (&p_inq->rmt_name_timer_ent,
11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     BTU_TTYPE_BTM_RMT_NAME,
12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     BTM_EXT_BLE_RMT_NAME_TIMEOUT);
12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return BTM_CMD_STARTED;
12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_cancel_remote_name
12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function cancel read remote LE device name.
12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:       None.
12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_ble_cancel_remote_name(BD_ADDR remote_bda)
12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQUIRY_VAR_ST      *p_inq = &btm_cb.btm_inq_vars;
12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN     status;
12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    status = GAP_BleCancelReadPeerDevName(remote_bda);
12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_inq->remname_active = FALSE;
12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(p_inq->remname_bda, 0, BD_ADDR_LEN);
12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_stop_timer(&p_inq->rmt_name_timer_ent);
12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return status;
12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_update_adv_flag
12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function update the limited discoverable flag in the adv
12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  data.
12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:       None.
12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_ble_update_adv_flag(UINT8 flag)
12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_LOCAL_ADV_DATA *p_adv_data = &btm_cb.ble_ctr_cb.inq_var.adv_data;
12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p;
12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG1 ("btm_ble_update_adv_flag new=0x%x", flag);
12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_adv_data->p_flags != NULL)
12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_DEBUG1 ("btm_ble_update_adv_flag old=0x%x",   *p_adv_data->p_flags);
12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_adv_data->p_flags = flag;
12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else /* no FLAGS in ADV data*/
12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p = (p_adv_data->p_pad == NULL) ? p_adv_data->ad_data : p_adv_data->p_pad;
12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* need 3 bytes space to stuff in the flags, if not */
12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* erase all written data, just for flags */
12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((BTM_BLE_AD_DATA_LEN - (p - p_adv_data->ad_data)) < 3)
12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p = p_adv_data->p_pad = p_adv_data->ad_data;
12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset(p_adv_data->ad_data, 0, BTM_BLE_AD_DATA_LEN);
12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p++ = 2;
12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p++ = BTM_BLE_AD_TYPE_FLAG;
12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_adv_data->p_flags = p;
12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p++ = flag;
12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_adv_data->p_pad = p;
12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btsnd_hcic_ble_set_adv_data((UINT8)(p_adv_data->p_pad - p_adv_data->ad_data),
12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    p_adv_data->ad_data))
12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_adv_data->data_mask |= BTM_BLE_AD_BIT_FLAGS;
12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if 0
12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_parse_adv_data
12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function parse the adv data into a structure.
12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          pointer to entry, or NULL if not found
12865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_ble_parse_adv_data(tBTM_INQ_INFO *p_info, UINT8 *p_data,
12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                   UINT8 len, tBTM_BLE_INQ_DATA *p_adv_data, UINT8 *p_buf)
12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p_cur = p_data;
12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   ad_len, ad_type, ad_flag;
12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_EVENT0 (" btm_ble_parse_adv_data");
12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while (len > 0)
12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_DEBUG1("btm_ble_parse_adv_data: len = %d", len);
12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((ad_len = *p_cur ++) == 0)
13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ad_type = *p_cur ++;
13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_DEBUG2("     ad_type = %02x ad_len = %d", ad_type, ad_len);
13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        switch (ad_type)
13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTM_BLE_AD_TYPE_NAME_SHORT:
13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTM_BLE_AD_TYPE_NAME_CMPL:
13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_adv_data->ad_mask |= BTM_BLE_AD_BIT_DEV_NAME;
13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (p_info)
13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_info->remote_name_type =(ad_type == BTM_BLE_AD_TYPE_NAME_SHORT) ?
13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                              BTM_BLE_NAME_SHORT: BTM_BLE_NAME_CMPL;
13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    memcpy(p_info->remote_name, p_cur, ad_len -1);
13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_info->remote_name[ad_len] = 0;
13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_adv_data->p_remote_name = p_info->remote_name;
13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_info->remote_name_len = p_adv_data->remote_name_len = ad_len - 1;
13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    BTM_TRACE_DEBUG1("BTM_BLE_AD_TYPE_NAME name = %s",p_adv_data->p_remote_name);
13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cur += (ad_len -1);
13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTM_BLE_AD_TYPE_FLAG:
13275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_adv_data->ad_mask |= BTM_BLE_AD_BIT_FLAGS;
13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ad_flag = *p_cur ++;
13295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_adv_data->flag = (UINT8)(ad_flag & BTM_BLE_ADV_FLAG_MASK) ;
13305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BTM_TRACE_DEBUG3("BTM_BLE_AD_TYPE_FLAG flag = %s | %s | %s",
13315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 (p_adv_data->flag & BTM_BLE_LIMIT_DISC_FLAG)? "LE_LIMIT_DISC" : "",
13325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 (p_adv_data->flag & BTM_BLE_GEN_DISC_FLAG)? "LE_GENERAL_DISC" : "",
13335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                 (p_adv_data->flag & BTM_BLE_BREDR_NOT_SPT)? "LE Only device" : "");
13345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
13355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            case BTM_BLE_AD_TYPE_TX_PWR:
13375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_adv_data->ad_mask |= BTM_BLE_AD_BIT_TX_PWR;
13385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_adv_data->tx_power_level = (INT8)*p_cur ++;
13395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BTM_TRACE_DEBUG1("BTM_BLE_AD_TYPE_TX_PWR tx_level = %d", p_adv_data->tx_power_level);
13405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
13415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1342ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            case BTM_BLE_AD_TYPE_MANU:
13435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1344ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            case BTM_BLE_AD_TYPE_16SRV_PART:
1345ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            case BTM_BLE_AD_TYPE_16SRV_CMPL:
1346ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                p_adv_data->ad_mask |= BTM_BLE_AD_BIT_SERVICE;
1347ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                /* need allocate memory to store UUID list */
1348ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                p_adv_data->service.num_service = (ad_len - 1)/2;
1349ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                BTM_TRACE_DEBUG1("service UUID list, num = %d", p_adv_data->service.num_service);
1350ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                p_cur += (ad_len - 1);
13515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
13525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1353ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            case BTM_BLE_AD_TYPE_SOL_SRV_UUID:
1354ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                p_adv_data->ad_mask |= BTM_BLE_AD_BIT_SERVICE_SOL;
13555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* need allocate memory to store UUID list */
13565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_adv_data->service.num_service = (ad_len - 1)/2;
13575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BTM_TRACE_DEBUG1("service UUID list, num = %d", p_adv_data->service.num_service);
1358ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                p_cur += (ad_len - 1);
1359ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                break;
13605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1361ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            case BTM_BLE_AD_TYPE_128SOL_SRV_UUID:
1362ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                p_adv_data->ad_mask |= BTM_BLE_AD_BIT_SERVICE_128SOL;
1363ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                /* need allocate memory to store UUID list */
1364ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                p_adv_data->service.num_service = (ad_len - 1)/16;
1365ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                BTM_TRACE_DEBUG1("service UUID list, num = %d", p_adv_data->service.num_service);
13665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cur += (ad_len - 1);
13675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
1368ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1369ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            case BTM_BLE_AD_TYPE_APPEARANCE:
1370ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            case BTM_BLE_AD_TYPE_PUBLIC_TARGET:
1371ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            case BTM_BLE_AD_TYPE_RANDOM_TARGET:
1372ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            default:
1373ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                break;
13745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
13755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        len -= (ad_len + 1);
13765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
13795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
13815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_cache_adv_data
13835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Update advertising cache data.
13855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
13875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
13895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_cache_adv_data(tBTM_INQ_RESULTS *p_cur, UINT8 data_len, UINT8 *p, UINT8 evt_type)
13905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
13915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_INQ_CB     *p_le_inq_cb = &btm_cb.ble_ctr_cb.inq_var;
13925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *p_cache;
13935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 length;
13945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* cache adv report/scan response data */
13965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (evt_type != BTM_BLE_SCAN_RSP_EVT)
13975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
13985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_le_inq_cb->adv_len = 0;
13995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset(p_le_inq_cb->adv_data_cache, 0, BTM_BLE_CACHE_ADV_DATA_MAX);
14005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (data_len > 0)
14035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
14045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cache = &p_le_inq_cb->adv_data_cache[p_le_inq_cb->adv_len];
14055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_UINT8(length, p);
14065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        while ( length && ((p_le_inq_cb->adv_len + length + 1) <= BTM_BLE_CACHE_ADV_DATA_MAX))
14075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
14085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* copy from the length byte & data into cache */
14095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy(p_cache, p-1, length+1);
14105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* advance the cache pointer past data */
14115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cache += length+1;
14125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* increment cache length */
14135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_le_inq_cb->adv_len += length+1;
14145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* skip the length of data */
14155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p += length;
14165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            STREAM_TO_UINT8(length, p);
14175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
14185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* parse service UUID from adv packet and save it in inq db eir_uuid */
14215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* TODO */
14225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1423ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
14245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
14255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_is_discoverable
14275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      check ADV flag to make sure device is discoverable and match
14295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the search condition
14305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters
14325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
14345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
14365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_ble_is_discoverable(BD_ADDR bda, UINT8 evt_type, UINT8 *p)
14375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
14385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN             is_discoverable = FALSE;
14395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               *p_flag, flag = 0;
14405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8                data_len;
14415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQ_PARMS      *p_cond = &btm_cb.btm_inq_vars.inqparms;
14425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8    (data_len, p);
14445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* for observer, always "discoverable */
14465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.ble_ctr_cb.inq_var.proc_mode == BTM_BLE_OBSERVE ||
14475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (btm_cb.ble_ctr_cb.inq_var.proc_mode == BTM_BLE_SELECT_SCAN &&
14485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_SELECTIVE))
14495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return TRUE;
14505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* does not match filter condition */
14525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cond->filter_cond_type == BTM_FILTER_COND_BD_ADDR &&
14535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcmp(bda, p_cond->filter_cond.bdaddr_cond, BD_ADDR_LEN) != 0)
14545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
14555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_DEBUG0("BD ADDR does not meet filter condition");
14565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return FALSE;
14575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* scan response does not include the flag */
14605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (evt_type == BTM_BLE_SCAN_RSP_EVT)
14615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return FALSE;
14625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (data_len > BTM_BLE_ADV_DATA_LEN_MAX)
14645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
14655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_WARNING1("ADV data too long %d. discard", data_len);
14665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return FALSE;
14675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (data_len != 0)
14705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
14715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_flag = BTM_CheckAdvData(p, BTM_BLE_AD_TYPE_FLAG, &data_len)) != NULL)
14725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
14735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            flag = * p_flag;
14745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((btm_cb.ble_ctr_cb.inq_var.proc_mode == BTM_BLE_GENERAL_INQUIRY) &&
14765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (flag & (BTM_BLE_LIMIT_DISC_FLAG|BTM_BLE_GEN_DISC_FLAG)) != 0)
14775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
14785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BTM_TRACE_DEBUG0("Find Generable Discoverable device");
14795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                is_discoverable = TRUE;
14805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
14815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else if (btm_cb.ble_ctr_cb.inq_var.proc_mode == BTM_BLE_LIMITED_INQUIRY &&
14835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     (flag & BTM_BLE_LIMIT_DISC_FLAG) != 0)
14845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
14855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BTM_TRACE_DEBUG0("Find limited discoverable device");
14865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                is_discoverable = TRUE;
14875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
14885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
14905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!is_discoverable)
14935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
14945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_ERROR1("discoverable flag not desired: %d", flag);
14955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return is_discoverable;
14985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1499ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
15005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
15015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_update_inq_result
15035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Update adv packet information into inquiry result.
15055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters
15075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
15095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
15115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_ble_update_inq_result(tINQ_DB_ENT *p_i, UINT8 addr_type, UINT8 evt_type, UINT8 *p)
15125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
15135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN             to_report = TRUE;
15145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQ_RESULTS     *p_cur = &p_i->inq_info.results;
15155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               len;
15165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               *p_flag;
15175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQUIRY_VAR_ST  *p_inq = &btm_cb.btm_inq_vars;
15185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8                data_len, rssi;
15195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_INQ_CB     *p_le_inq_cb = &btm_cb.ble_ctr_cb.inq_var;
15205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *p1;
15215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8    (data_len, p);
15235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (data_len > BTM_BLE_ADV_DATA_LEN_MAX)
15255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_WARNING1("EIR data too long %d. discard", data_len);
15275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return FALSE;
15285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_ble_cache_adv_data(p_cur, data_len, p, evt_type);
15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p1 = (p + data_len);
15325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8 (rssi, p1);
15335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Save the info */
15355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cur->inq_result_type = BTM_INQ_RESULT_BLE;
15365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cur->ble_addr_type    = addr_type;
15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cur->rssi = rssi;
15385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* active scan, always wait until get scan_rsp to report the result */
15405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((btm_cb.ble_ctr_cb.inq_var.scan_type == BTM_BLE_SCAN_MODE_ACTI &&
15415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         (evt_type == BTM_BLE_CONNECT_EVT || evt_type == BTM_BLE_DISCOVER_EVT)))
15425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_i->scan_rsp = FALSE;
15445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        to_report = FALSE;
15455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
15475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_i->scan_rsp = TRUE;
15485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_i->inq_count != p_inq->inq_counter)
15505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cur->device_type = BT_DEVICE_TYPE_BLE;
15515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
15525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cur->device_type |= BT_DEVICE_TYPE_BLE;
15535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (evt_type != BTM_BLE_SCAN_RSP_EVT)
15555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cur->ble_evt_type     = evt_type;
15565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_i->inq_count = p_inq->inq_counter;   /* Mark entry for current inquiry */
15585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_le_inq_cb->adv_len != 0)
15605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_flag = BTM_CheckAdvData(p_le_inq_cb->adv_data_cache, BTM_BLE_AD_TYPE_FLAG, &len)) != NULL)
15625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cur->flag = * p_flag;
15635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if BR/EDR not supported is not set, assume is a DUMO device */
1566ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if ((p_cur->flag & BTM_BLE_BREDR_NOT_SPT) == 0 &&
1567ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         evt_type != BTM_BLE_CONNECT_DIR_EVT)
15685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1569ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        BTM_TRACE_DEBUG0("BR/EDR NOT support bit not set, treat as DUMO");
15705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cur->device_type |= BT_DEVICE_TYPE_DUMO;
15715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
15735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_TRACE_DEBUG0("BR/EDR NOT SUPPORT bit set, LE only device");
15755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return to_report;
15785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
15825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_send_sel_conn_callback
15845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      send selection connection request callback.
15865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters
15885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
15905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
15925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_send_sel_conn_callback(BD_ADDR remote_bda, UINT8 evt_type, UINT8 *p_data, UINT8 addr_type)
15935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
15945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   data_len, len;
15955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p_dev_name, remname[31] = {0};
15965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.ble_ctr_cb.p_select_cback == NULL ||
15985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* non-connectable device */
15995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (evt_type != BTM_BLE_EVT_CONN_ADV && evt_type != BTM_BLE_EVT_CONN_DIR_ADV))
16005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
16015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8    (data_len, p_data);
16035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* get the device name if exist in ADV data */
16055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (data_len != 0)
16065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
16075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev_name = BTM_CheckAdvData(p_data, BTM_BLE_AD_TYPE_NAME_CMPL, &len);
16085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_name == NULL)
16105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev_name = BTM_CheckAdvData(p_data, BTM_BLE_AD_TYPE_NAME_SHORT, &len);
16115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_dev_name)
16135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy(remname, p_dev_name, len);
16145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
16155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* allow connection */
16165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((* btm_cb.ble_ctr_cb.p_select_cback)(remote_bda, remname))
16175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
16185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* terminate selective connection, initiate connection */
16195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_ble_initiate_select_conn(remote_bda);
16205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
16215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
16245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_process_adv_pkt
16265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when adv packet report events are
16285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  received from the device. It updates the inquiry database.
16295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  If the inquiry database is full, the oldest entry is discarded.
16305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters
16325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
16345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
16365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_process_adv_pkt (UINT8 *p_data)
16375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
16385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BD_ADDR             bda;
16395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               evt_type = 0, *p = p_data;
16405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               addr_type = 0;
16415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* always get one device at a time */
16435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p ++;
16445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Extract inquiry results */
16465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8    (evt_type, p);
16475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8    (addr_type, p);
16485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_BDADDR   (bda, p);
16495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1650ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#ifdef BTM_BLE_PC_ADV_TEST_MODE /* For general stack code (e.g. BTInsight testing), we simply do not define it to exclude or set it to TRUE to include */
1651ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (BTM_BLE_PC_ADV_TEST_MODE)   /* For stack component, it is always defined and maps to a global variable g_bDraculaAdvertisingMode */
16525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
16535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.ble_ctr_cb.p_scan_req_cback)
16545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*btm_cb.ble_ctr_cb.p_scan_req_cback)(bda, addr_type, evt_type);
16555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
16565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
16575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1658ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1659ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
16605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Only process the results if the inquiry is still active */
1661ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if ((btm_cb.btm_inq_vars.inq_active & BTM_LE_SCAN_ACTIVE_MASK) == 0 &&
16625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (btm_cb.ble_ctr_cb.bg_conn_type != BTM_BLE_CONN_SELECTIVE ||
16635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         /* or selective auto connection is active */
16645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         btm_cb.ble_ctr_cb.p_select_cback == NULL))
16655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
16665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1667ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    btm_ble_process_adv_pkt_cont(bda, addr_type, evt_type, p);
16685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
16715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_process_adv_pkt_cont
16735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called after random address resolution is
16755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  done, and proceed to process adv packet.
16765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters
16785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
16805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
16825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_ble_process_adv_pkt_cont(BD_ADDR bda, UINT8 addr_type, UINT8 evt_type, UINT8 *p)
16835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
16845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tINQ_DB_ENT          *p_i;
16855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN              to_report = FALSE;
16865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQUIRY_VAR_ST  *p_inq = &btm_cb.btm_inq_vars;
16875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQ_RESULTS_CB  *p_inq_results_cb = p_inq->p_inq_results_cb;
16885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_INQ_CB      *p_le_inq_cb = &btm_cb.ble_ctr_cb.inq_var;
16895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_i = btm_inq_db_find (bda);
16915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check if this address has already been processed for this inquiry */
16935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_inq_find_bdaddr(bda))
16945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
16955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* never been report as an LE device */
16965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_i &&
16975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (!(p_i->inq_info.results.device_type & BT_DEVICE_TYPE_BLE) ||
16985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project              /* scan repsonse to be updated */
16995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project              (!p_i->scan_rsp)))
17005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ||
17015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.ble_ctr_cb.inq_var.proc_mode == BTM_BLE_OBSERVE)
17025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
17035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_TRACE_DEBUG0("update new BLE information ");
17045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            to_report = TRUE;
17055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
17065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
17075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
17085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if yes, skip it */
17095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return; /* assumption: one result per event */
17105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
17115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else /* not been processed int his round */
17135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        to_report = TRUE;
17155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If existing entry, use that, else get  a new one (possibly reusing the oldest) */
17185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_i == NULL)
17195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_ble_is_discoverable(bda, evt_type, p))
17215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
17225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_i = btm_inq_db_new (bda)) != NULL)
17235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
17245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_inq->inq_cmpl_info.num_resp++;
17255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                to_report = TRUE;
17265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
17275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
17285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
17295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
17305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
17315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
17325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_TRACE_ERROR0("discard adv pkt");
17335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
17345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
17355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (p_i->inq_count != p_inq->inq_counter) /* first time seen in this inquiry */
17375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_inq->inq_cmpl_info.num_resp++;
17395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* update the LE device information in inquiry database */
17425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (to_report)
17435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        to_report = btm_ble_update_inq_result(p_i, addr_type, evt_type, p);
17455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_USE_INQ_RESULTS_FILTER == TRUE
17485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If the number of responses found and limited, issue a cancel inquiry */
17495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_inq->inqparms.max_resps &&
17505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_inq->inq_cmpl_info.num_resp == p_inq->inqparms.max_resps)
17515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* new device */
17535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_i == NULL ||
17545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (/* assume a DUMO device, BR/EDR inquiry is always active */
17555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             p_i && p_i->inq_info.results.device_type == BT_DEVICE_TYPE_BLE && p_i->scan_rsp))
17565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
17575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_TRACE_WARNING0("INQ RES: Extra Response Received...cancelling inquiry..");
17585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1759ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            /* if is non-periodic inquiry active, cancel now */
1760ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if ((p_inq->inq_active & BTM_BR_INQ_ACTIVE_MASK) != 0 &&
1761ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                (p_inq->inq_active & BTM_PERIODIC_INQUIRY_ACTIVE) == 0)
17625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btsnd_hcic_inq_cancel();
17635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* stop LE scan now */
17655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_ble_stop_scan();
17665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BTM_BUSY_LEVEL_CHANGE_INCLUDED == TRUE
17685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_acl_update_busy_level (BTM_BLI_INQ_DONE_EVT);
17695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
17705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
17715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
17735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* background connection in selective connection mode */
17755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.ble_ctr_cb.bg_conn_type == BTM_BLE_CONN_SELECTIVE)
17765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1777ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (p_i->inq_info.results.device_type == BT_DEVICE_TYPE_BLE &&
1778ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            (evt_type == BTM_BLE_CONNECT_EVT || evt_type == BTM_BLE_CONNECT_DIR_EVT))
1779ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            btm_send_sel_conn_callback(bda, evt_type, p, addr_type);
1780ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        else
1781ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
1782ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            BTM_TRACE_DEBUG0("None LE device, can not initiate selective connection");
1783ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
17845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (p_inq_results_cb && to_report)
17865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1787ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        (p_inq_results_cb)((tBTM_INQ_RESULTS *) &p_i->inq_info.results, p_le_inq_cb->adv_data_cache);
17885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
17905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
17925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_stop_scan
17945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Stop the BLE scan.
17965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
17985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
18005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_stop_scan(void)
18015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
18025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
18035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
18045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_EVENT0 ("btm_ble_stop_scan ");
18065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btu_stop_timer (&p_cb->inq_timer_ent);
18085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Clear the inquiry callback if set */
18105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->scan_type = BTM_BLE_SCAN_MODE_NONE;
18115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->proc_mode = BTM_BLE_INQUIRY_NONE;
18125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* stop discovery now */
18145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btsnd_hcic_ble_set_scan_enable (BTM_BLE_SCAN_DISABLE, BTM_BLE_DUPLICATE_ENABLE);
18155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If we have a callback registered for inquiry complete, call it */
18175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_DEBUG2 ("BTM Inq Compl Callback: status 0x%02x, num results %d",
18185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                      p_inq->inq_cmpl_info.status, p_inq->inq_cmpl_info.num_resp);
18195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_update_scanner_filter_policy(SP_ADV_ALL);
18215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_process_inq_complete(HCI_SUCCESS, (UINT8)(p_inq->inqparms.mode & BTM_BLE_INQUIRY_MASK));
18235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
18255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
18275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1828ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         btm_ble_start_adv
1829ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
1830ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      Stop the BLE advertising.
1831ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
1832ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          void
1833ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
1834ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
1835ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic tBTM_STATUS btm_ble_start_adv(void)
1836ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
1837ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
1838ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_STATUS     rt = BTM_NO_RESOURCES;
1839ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1840ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (btsnd_hcic_ble_set_adv_enable (BTM_BLE_ADV_ENABLE))
1841ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
1842ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (p_cb->afp != AP_SCAN_CONN_ALL)
1843ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta             btm_cb.ble_ctr_cb.wl_state |= BTM_BLE_WL_ADV;
1844ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1845ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         p_cb->adv_mode = BTM_BLE_ADV_ENABLE;
1846ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1847ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         rt = BTM_SUCCESS;
1848ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta     }
1849ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta     else
1850ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta     {
1851ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         p_cb->adv_mode = BTM_BLE_ADV_DISABLE;
1852ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta         btm_cb.ble_ctr_cb.wl_state &= ~BTM_BLE_WL_ADV;
1853ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta     }
1854ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta     return rt;
1855ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
1856ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
1857ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
18585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_stop_adv
18595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Stop the BLE advertising.
18615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
18635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1865ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battastatic tBTM_STATUS btm_ble_stop_adv(void)
18665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1867ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
1868ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_STATUS rt = BTM_SUCCESS;
18695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1870ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (p_cb->adv_mode == BTM_BLE_ADV_ENABLE)
18715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1872ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (btsnd_hcic_ble_set_adv_enable (BTM_BLE_ADV_DISABLE))
1873ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
1874ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            p_cb->adv_mode = BTM_BLE_ADV_DISABLE;
1875ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            btm_cb.ble_ctr_cb.wl_state &= ~BTM_BLE_WL_ADV;
1876ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
1877ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        else
1878ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            rt = BTM_NO_RESOURCES;
18795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1880ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    return rt;
1881ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
18825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
18835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
18855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_timeout
18875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Called when BTM BLE inquiry timer expires
18895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
18915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
18935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_timeout(TIMER_LIST_ENT *p_tle)
18945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
18955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (p_tle->event)
18965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
18975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTU_TTYPE_BLE_INQUIRY:
18985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_ble_stop_scan();
18995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
19005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTU_TTYPE_BLE_GAP_LIM_DISC:
19025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* lim_timeout expiried, limited discovery should exit now */
19035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_ble_update_adv_flag(BTM_BLE_NON_LIMIT_DISC_FLAG);
19045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_ble_stop_adv();
19065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
19075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTU_TTYPE_BLE_RANDOM_ADDR:
1909ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if (btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type == BLE_ADDR_RANDOM)
19105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
19115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* refresh the random addr */
19125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_gen_resolvable_private_addr();
19135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
19145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
19155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
19175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
19185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
19215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_read_remote_features_complete
19235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when the command complete message
19255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  is received from the HCI for the read LE remote feature supported
19265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  complete event.
19275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
19295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
19315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_read_remote_features_complete(UINT8 *p)
19325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
19335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tACL_CONN        *p_acl_cb = &btm_cb.acl_db[0];
19343aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    UINT8             status;
19355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16            handle;
19363aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    int               xx;
19375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_EVENT0 ("btm_ble_read_remote_features_complete ");
19395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19403aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    STREAM_TO_UINT8  (status, p);
19413aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach    STREAM_TO_UINT16 (handle, p);
19425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Look up the connection by handle and copy features */
19445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, p_acl_cb++)
19455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
19465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_acl_cb->in_use) && (p_acl_cb->hci_handle == handle))
19475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
19483aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach            STREAM_TO_ARRAY(p_acl_cb->peer_le_features, p, BD_FEATURES_LEN);
19495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
19505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
19515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
19525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
19535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
19555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_write_adv_enable_complete
19575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function process the write adv enable command complete.
19595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
19615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
19625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
19635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_write_adv_enable_complete(UINT8 * p)
19645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
19655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
19665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if write adv enable/disbale not succeed */
19685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (*p != HCI_SUCCESS)
19695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
19705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* toggle back the adv mode */
19715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cb->adv_mode = !p_cb->adv_mode;
19725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1973ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1974ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1975ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
1976ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1977ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
1978ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
1979ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         btm_ble_dir_adv_tout
1980ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
1981ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      when directed adv time out
1982ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
1983ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          void
1984ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
1985ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
1986ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid btm_ble_dir_adv_tout(void)
1987ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
1988ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    btm_cb.ble_ctr_cb.inq_var.adv_mode = BTM_BLE_ADV_DISABLE;
1989ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1990ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* make device fall back into undirected adv mode by default */
1991ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    btm_cb.ble_ctr_cb.inq_var.directed_conn = FALSE;
1992ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta}
1993ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
1994ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/*******************************************************************************
1995ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
1996ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function         btm_ble_update_mode_operation
1997ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
1998ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description      This function update the GAP role operation when a link status
1999ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**                  is updated.
2000ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
2001ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns          void
2002ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**
2003ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/
2004ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Battavoid btm_ble_update_mode_operation(UINT8 link_role, BD_ADDR bd_addr, BOOLEAN conn_cancel)
2005ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{
2006ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tACL_CONN   *pa = &btm_cb.acl_db[0];
2007ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT16       xx;
2008ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    UINT8        dev_role = link_role;
2009ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
2010ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    BTM_TRACE_DEBUG1("btm_ble_update_mode_operation adv_mode = %d", btm_cb.ble_ctr_cb.inq_var.adv_mode );
2011ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
2012ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* update periphera role operation */
2013ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* If we are LE connectable, check if we need to start advertising again */
2014ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (link_role == HCI_ROLE_UNKNOWN)
2015ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /* && btm_cb.ble_ctr_cb.inq_var.connectable_mode != BTM_BLE_NON_CONNECTABLE) */
2016ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
2017ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        for (xx = 0; xx < MAX_L2CAP_LINKS; xx++, pa++)
2018ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
2019ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            /* If any other LE link is up, we are still not connectable */
2020ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if (pa->in_use && pa->is_le_link)
2021ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            {
2022ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                dev_role = pa->link_role;
2023ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                break;
2024ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            }
2025ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
2026ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
2027ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
2028ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (btm_cb.ble_ctr_cb.inq_var.connectable_mode == BTM_BLE_CONNECTABLE  &&
2029ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        (dev_role == HCI_ROLE_UNKNOWN )) /* when device has no connection, update adv here */
2030ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        /* if already in connection, no connectable adv is allowed unless scatternet is enabled */
2031ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
2032ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        btm_ble_set_connectability ( btm_cb.ble_ctr_cb.inq_var.connectable_mode );
2033ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
2034ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
2035ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (btm_ble_get_conn_st() == BLE_CONN_IDLE)
2036ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    {
2037ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        if (!btm_send_pending_direct_conn())
2038ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        {
2039ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            btm_ble_resume_bg_conn();
2040ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        }
2041ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    }
20425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2043ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
20445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
20455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_ble_init
20475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Initialize the control block variable values.
20495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
20515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
20535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_ble_init (void)
20545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
20555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
20565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_TRACE_EVENT0 ("btm_ble_init ");
20585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(p_cb, 0, sizeof(tBTM_BLE_CB));
20605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->inq_var.adv_mode = BTM_BLE_ADV_DISABLE;
20625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->inq_var.scan_type = BTM_BLE_SCAN_MODE_NONE;
20635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->inq_var.adv_chnl_map = BTM_BLE_DEFAULT_ADV_CHNL_MAP;
20645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->inq_var.afp = BTM_BLE_DEFAULT_AFP;
20655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->inq_var.sfp = BTM_BLE_DEFAULT_SFP;
20665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->inq_var.connectable_mode = BTM_BLE_NON_CONNECTABLE;
20675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->inq_var.discoverable_mode = BTM_BLE_NON_DISCOVERABLE;
20685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* for background connection, reset connection params to be undefined */
20705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cb->scan_int = p_cb->scan_win = BTM_BLE_CONN_PARAM_UNDEF;
20715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20726975b4d711142b885af479721cada448952c6b41Andre Eisenbach    p_cb->inq_var.evt_type = BTM_BLE_NON_CONNECT_EVT;
20735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
20745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif  /* BLE_INCLUDED */
2076