Commit 9546abf9 authored by Ganesh Ganapathi Batta's avatar Ganesh Ganapathi Batta
Browse files

Support for reading LE specific controller features

Support for reading LE specific controller features via get adapter properties
API

Change-Id: Ia0b813be45fb826ce27d1d7a31ca41650d7286dd
parent 83c5256f
......@@ -111,6 +111,7 @@ static void bta_dm_gattc_callback(tBTA_GATTC_EVT event, tBTA_GATTC *p_data);
#endif
static void bta_dm_observe_results_cb (tBTM_INQ_RESULTS *p_inq, UINT8 *p_eir);
static void bta_dm_observe_cmpl_cb (void * p_result);
static void bta_dm_ctrl_features_rd_cmpl_cback(tBTM_STATUS result);
#ifndef BTA_DM_BLE_ADV_CHNL_MAP
#define BTA_DM_BLE_ADV_CHNL_MAP (BTM_BLE_ADV_CHNL_37|BTM_BLE_ADV_CHNL_38|BTM_BLE_ADV_CHNL_39)
......@@ -3166,6 +3167,10 @@ static void bta_dm_local_name_cback(UINT8 *p_name)
if(bta_dm_cb.p_sec_cback)
bta_dm_cb.p_sec_cback(BTA_DM_ENABLE_EVT, &sec_event);
#if ( BLE_INCLUDED == TRUE)
BTM_BleReadControllerFeatures (bta_dm_ctrl_features_rd_cmpl_cback);
#endif
}
/*******************************************************************************
......@@ -5696,4 +5701,30 @@ void bta_dm_cfg_filter_cond (tBTA_DM_MSG *p_data)
bta_sys_vs_hdl(BTA_VS_BLE_SCAN_PF_COND_EVT, (void *)&param);
}
#endif /* BLE_ANDROID_CONTROLLER_SCAN_FILTER */
/*******************************************************************************
**
** Function bta_dm_ctrl_features_rd_cmpl_cback
**
** Description callback to handle controller feature read complete
**
** Parameters:
**
*******************************************************************************/
static void bta_dm_ctrl_features_rd_cmpl_cback(tBTM_STATUS result)
{
APPL_TRACE_DEBUG2("%s status = %d ", __FUNCTION__, result);
if (result == BTM_SUCCESS)
{
if(bta_dm_cb.p_sec_cback)
bta_dm_cb.p_sec_cback(BTA_DM_LE_FEATURES_READ, NULL);
}
else
{
APPL_TRACE_ERROR2("%s Ctrl BLE feature read failed: status :%d",__FUNCTION__, result);
}
}
#endif /* BLE_INCLUDED */
......@@ -591,6 +591,7 @@ typedef UINT8 tBTA_SIG_STRENGTH_MASK;
// btla-specific --
#define BTA_DM_DEV_UNPAIRED_EVT 23
#define BTA_DM_HW_ERROR_EVT 24 /* BT Chip H/W error */
#define BTA_DM_LE_FEATURES_READ 25 /* Cotroller specific LE features are read */
typedef UINT8 tBTA_DM_SEC_EVT;
/* Structure associated with BTA_DM_ENABLE_EVT */
......
......@@ -608,7 +608,7 @@ void btif_enable_bluetooth_evt(tBTA_STATUS status, BD_ADDR local_bd)
/* callback to HAL */
if (status == BTA_SUCCESS)
{
#if (BLE_INCLUDED == TRUE && BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE)
#if (BLE_INCLUDED == TRUE )
BTA_BrcmInit();
#endif
/* initialize a2dp service */
......@@ -1026,7 +1026,30 @@ static void execute_storage_request(UINT16 event, char *p_param)
prop.type = p_req->read_req.type;
prop.val = (void*)buf;
prop.len = sizeof(buf);
status = btif_storage_get_adapter_property(&prop);
if (prop.type == BT_PROPERTY_LOCAL_LE_FEATURES)
{
tBTM_BLE_VSC_CB cmn_vsc_cb;
bt_local_le_features_t local_le_features;
/* LE features are not stored in storage. Should be retrived from stack */
BTM_BleGetVendorCapabilities(&cmn_vsc_cb);
local_le_features.local_privacy_enabled = BTM_BleLocalPrivacyEnabled();
prop.len = sizeof (bt_local_le_features_t);
if (cmn_vsc_cb.filter_support == 1)
local_le_features.max_adv_filter_supported = cmn_vsc_cb.max_filter;
else
local_le_features.max_adv_filter_supported = 0;
local_le_features.max_adv_instance = cmn_vsc_cb.adv_inst_max;
local_le_features.max_irk_list_size = cmn_vsc_cb.max_irk_list_sz;
local_le_features.rpa_offload_supported = cmn_vsc_cb.rpa_offloading;
local_le_features.scan_result_storage_size = cmn_vsc_cb.tot_scan_results_strg;
memcpy(prop.val, &local_le_features, prop.len);
}
else
{
status = btif_storage_get_adapter_property(&prop);
}
HAL_CBACK(bt_hal_cbacks, adapter_properties_cb, status, 1, &prop);
} break;
......
......@@ -1360,6 +1360,7 @@ static void btif_dm_upstreams_evt(UINT16 event, char* p_param)
#if (defined(BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
/* Enable local privacy */
/*TODO Should this call be exposed to JAVA...? */
BTA_DmBleConfigLocalPrivacy(TRUE);
#endif
}
......@@ -1611,6 +1612,34 @@ static void btif_dm_upstreams_evt(UINT16 event, char* p_param)
BTIF_TRACE_DEBUG0("BTA_DM_BLE_KEY_EVT. ");
btif_dm_ble_auth_cmpl_evt(&p_data->auth_cmpl);
break;
case BTA_DM_LE_FEATURES_READ:
{
tBTM_BLE_VSC_CB cmn_vsc_cb;
bt_local_le_features_t local_le_features;
char buf[512];
bt_property_t prop;
prop.type = BT_PROPERTY_LOCAL_LE_FEATURES;
prop.val = (void*)buf;
prop.len = sizeof(buf);
/* LE features are not stored in storage. Should be retrived from stack */
BTM_BleGetVendorCapabilities(&cmn_vsc_cb);
local_le_features.local_privacy_enabled = BTM_BleLocalPrivacyEnabled();
prop.len = sizeof (bt_local_le_features_t);
if (cmn_vsc_cb.filter_support == 1)
local_le_features.max_adv_filter_supported = cmn_vsc_cb.max_filter;
else
local_le_features.max_adv_filter_supported = 0;
local_le_features.max_adv_instance = cmn_vsc_cb.adv_inst_max;
local_le_features.max_irk_list_size = cmn_vsc_cb.max_irk_list_sz;
local_le_features.rpa_offload_supported = cmn_vsc_cb.rpa_offloading;
local_le_features.scan_result_storage_size = cmn_vsc_cb.tot_scan_results_strg;
memcpy(prop.val, &local_le_features, prop.len);
HAL_CBACK(bt_hal_cbacks, adapter_properties_cb, BT_STATUS_SUCCESS, 1, &prop);
break;
}
#endif
case BTA_DM_AUTHORIZE_EVT:
......
......@@ -52,6 +52,8 @@
#define MIN_ADV_LENGTH 2
extern tBTM_BLE_MULTI_ADV_CB btm_multi_adv_cb;
static tBTM_BLE_CTRL_FEATURES_CBACK *p_ctrl_le_feature_rd_cmpl_cback = NULL;
/*******************************************************************************
** Local functions
......@@ -430,12 +432,14 @@ tBTM_STATUS BTM_BleBroadcast(BOOLEAN start)
*******************************************************************************/
static void btm_ble_vendor_capability_vsc_cmpl_cback (tBTM_VSC_CMPL *p_vcs_cplt_params)
{
BTM_TRACE_EVENT ("btm_ble_vendor_capability_vsc_cmpl_cback");
UINT8 status = 0xFF, *p;
UINT8 rpa_offloading, max_irk_list_sz, filtering_support, max_filter;
UINT16 scan_result_storage;
tBTM_BLE_VENDOR_CB *p_vcb = &btm_ble_vendor_cb;
max_irk_list_sz = 0;
BTM_TRACE_DEBUG("btm_ble_vendor_capability_vsc_cmpl_cback");
/* Check status of command complete event */
if((p_vcs_cplt_params->opcode == HCI_BLE_VENDOR_CAP_OCF)
&&(p_vcs_cplt_params->param_len > 0 ))
......@@ -446,30 +450,61 @@ static void btm_ble_vendor_capability_vsc_cmpl_cback (tBTM_VSC_CMPL *p_vcs_cplt_
if(status == HCI_SUCCESS)
{
STREAM_TO_UINT8 (btm_multi_adv_cb.adv_inst_max, p);
STREAM_TO_UINT8 (rpa_offloading, p);
STREAM_TO_UINT16 (scan_result_storage, p);
STREAM_TO_UINT8 (max_irk_list_sz, p);
STREAM_TO_UINT8 (filtering_support, p);
STREAM_TO_UINT8 (max_filter, p);
STREAM_TO_UINT8 (btm_cb.cmn_ble_vsc_cb.adv_inst_max, p);
STREAM_TO_UINT8 (btm_cb.cmn_ble_vsc_cb.rpa_offloading, p);
STREAM_TO_UINT16 (btm_cb.cmn_ble_vsc_cb.tot_scan_results_strg, p);
STREAM_TO_UINT8 (btm_cb.cmn_ble_vsc_cb.max_irk_list_sz, p);
STREAM_TO_UINT8 (btm_cb.cmn_ble_vsc_cb.filter_support, p);
STREAM_TO_UINT8 (btm_cb.cmn_ble_vsc_cb.max_filter, p);
}
p_vcb->irk_avail_size = max_irk_list_sz;
BTM_TRACE_EVENT ("btm_ble_vendor_capability_vsc_cmpl_cback:%d, status=%d, max_irk_size=%d", btm_multi_adv_cb.adv_inst_max, status,btm_ble_vendor_cb.irk_avail_size);
if (p_ctrl_le_feature_rd_cmpl_cback != NULL)
p_ctrl_le_feature_rd_cmpl_cback(status);
BTM_TRACE_DEBUG("btm_ble_vendor_capability_vsc_cmpl_cback:%d, status=%d, max_irk_size=%d",
btm_multi_adv_cb.adv_inst_max, status,btm_ble_vendor_cb.irk_avail_size);
}
/*******************************************************************************
**
** Function btm_ble_vendor_capability_init
** Function BTM_BleGetVendorCapabilities
**
** Description LE Get_Vendor Capabilities
** Description This function reads local LE features
**
** Returns None.
** Parameters p_cmn_vsc_cb : Locala LE capability structure
**
** Returns void
**
*******************************************************************************/
void btm_ble_vendor_capability_init(void)
BTM_API extern void BTM_BleGetVendorCapabilities(tBTM_BLE_VSC_CB *p_cmn_vsc_cb)
{
BTM_TRACE_ERROR("btm_ble_vendor_capability_init");
BTM_TRACE_DEBUG("btm_ble_vendor_capability_init");
if(NULL != p_cmn_vsc_cb)
{
*p_cmn_vsc_cb = btm_cb.cmn_ble_vsc_cb;
}
}
/******************************************************************************
**
** Function BTM_BleReadControllerFeatures
**
** Description Reads BLE specific controller features
**
** Parameters: tBTM_BLE_CTRL_FEATURES_CBACK : Callback to notify when features are read
**
** Returns void
**
*******************************************************************************/
BTM_API extern void BTM_BleReadControllerFeatures(tBTM_BLE_CTRL_FEATURES_CBACK *p_vsc_cback)
{
BTM_TRACE_DEBUG("BTM_BleReadControllerFeatures");
memset(&btm_ble_vendor_cb, 0, sizeof(tBTM_BLE_VENDOR_CB));
p_ctrl_le_feature_rd_cmpl_cback = p_vsc_cback;
if ( BTM_VendorSpecificCommand (HCI_BLE_VENDOR_CAP_OCF,
0,
NULL,
......@@ -544,6 +579,20 @@ void BTM_BleConfigPrivacy(BOOLEAN enable)
}
/*******************************************************************************
**
** Function BTM_BleLocalPrivacyEnabled
**
** Description Checks if local device supports private address
**
** Returns Return TRUE if local privacy is enabled else FALSE
**
*******************************************************************************/
BOOLEAN BTM_BleLocalPrivacyEnabled()
{
return btm_cb.ble_ctr_cb.privacy;
}
/*******************************************************************************
**
** Function btm_ble_resolve_random_addr_on_adv
......@@ -2834,8 +2883,6 @@ void btm_ble_init (void)
#if BLE_MULTI_ADV_INCLUDED == TRUE
btm_ble_multi_adv_init();
#endif
btm_ble_vendor_capability_init();
}
/*******************************************************************************
......
......@@ -672,7 +672,6 @@ void btm_reset_complete (void)
memset(&btm_cb.ble_ctr_cb.bg_dev_list, 0, (sizeof(tBTM_LE_BG_CONN_DEV)*BTM_BLE_MAX_BG_CONN_DEV_NUM));
gatt_reset_bgdev_list();
btm_ble_multi_adv_init();
btm_ble_vendor_capability_init();
#endif
}
}
......
......@@ -848,6 +848,7 @@ typedef struct
BT_OCTET8 enc_rand; /* received rand value from LTK request*/
UINT16 ediv; /* received ediv value from LTK request */
UINT8 key_size;
tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
#endif
/* Packet types supported by the local device */
......
......@@ -252,6 +252,17 @@ typedef UINT8 tBTM_BLE_AD_TYPE;
#define BTM_BLE_ADV_TX_POWER_MAX 4 /* maximum tx power */
typedef UINT8 tBTM_BLE_ADV_TX_POWER;
typedef struct
{
UINT8 adv_inst_max; /* max adv instance supported in controller */
UINT8 rpa_offloading;
UINT16 tot_scan_results_strg;
UINT8 max_irk_list_sz;
UINT8 filter_support;
UINT8 max_filter;
}tBTM_BLE_VSC_CB;
/* slave preferred connection interval range */
typedef struct
{
......@@ -404,6 +415,7 @@ enum
typedef UINT8 tBTM_BLE_CONN_TYPE;
typedef BOOLEAN (tBTM_BLE_SEL_CBACK)(BD_ADDR random_bda, UINT8 *p_remote_name);
typedef void (tBTM_BLE_CTRL_FEATURES_CBACK)(tBTM_STATUS status);
/* callback function for SMP signing algorithm, signed data in little endian order with tlen bits long */
typedef void (tBTM_BLE_SIGN_CBACK)(void *p_ref_data, UINT8 *p_signing_data);
......@@ -517,7 +529,18 @@ BTM_API extern void BTM_BleReadAdvParams (UINT16 *adv_int_min, UINT16 *adv_int_m
*******************************************************************************/
BTM_API extern void BTM_BleSetScanParams(UINT16 scan_interval, UINT16 scan_window,
tBTM_BLE_SCAN_MODE scan_type);
/*******************************************************************************
**
** Function BTM_BleGetVendorCapabilities
**
** Description This function reads local LE features
**
** Parameters p_cmn_vsc_cb : Locala LE capability structure
**
** Returns void
**
*******************************************************************************/
BTM_API extern void BTM_BleGetVendorCapabilities(tBTM_BLE_VSC_CB *p_cmn_vsc_cb);
/*******************************************************************************
**
** Function BTM_BleWriteScanRsp
......@@ -784,7 +807,19 @@ BTM_API extern void BTM_BleSetPrefConnParams (BD_ADDR bd_addr,
**
*******************************************************************************/
BTM_API extern void BTM_BleSetConnScanParams (UINT16 scan_interval, UINT16 scan_window);
BTM_API extern void btm_ble_vendor_capability_init(void);
/******************************************************************************
**
** Function BTM_BleReadControllerFeatures
**
** Description Reads BLE specific controller features
**
** Parameters: tBTM_BLE_CTRL_FEATURES_CBACK : Callback to notify when features are read
**
** Returns void
**
*******************************************************************************/
BTM_API extern void BTM_BleReadControllerFeatures(tBTM_BLE_CTRL_FEATURES_CBACK *p_vsc_cback);
/*******************************************************************************
**
......@@ -858,6 +893,19 @@ BTM_API extern void BTM_RegisterScanReqEvt(tBTM_BLE_SCAN_REQ_CBACK *p_scan_req_c
*******************************************************************************/
BTM_API extern void BTM_BleConfigPrivacy(BOOLEAN enable);
/*******************************************************************************
**
** Function BTM_BleLocalPrivacyEnabled
**
** Description Checks if local device supports private address
**
** Returns Return TRUE if local privacy is enabled else FALSE
**
*******************************************************************************/
BTM_API extern BOOLEAN BTM_BleLocalPrivacyEnabled();
/*******************************************************************************
**
** Function BTM_BleSetConnMode
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment