OSDN Git Service

Use run time parameters to control LE features
authorPrerepa Viswanadham <dham@google.com>
Thu, 7 Aug 2014 18:38:06 +0000 (11:38 -0700)
committerPrerepa Viswanadham <dham@google.com>
Thu, 7 Aug 2014 19:42:40 +0000 (19:42 +0000)
Use values read from controller to enable and control LE features such as
multi advertising, RPA offload, maximum irk size etc

bug 15393216

Change-Id: I193e2b9a0dc61b86f667e986803571440e390160

31 files changed:
bta/dm/bta_dm_act.c
bta/dm/bta_dm_api.c
bta/dm/bta_dm_int.h
bta/dm/bta_dm_main.c
bta/gatt/bta_gatts_act.c
bta/include/bta_api.h
btif/include/btif_gatt_multi_adv_util.h
btif/src/btif_core.c
btif/src/btif_gatt_client.c
btif/src/btif_gatt_multi_adv_util.c
include/bt_target.h
main/bte_init.c
stack/btm/btm_acl.c
stack/btm/btm_ble.c
stack/btm/btm_ble_addr.c
stack/btm/btm_ble_adv_filter.c
stack/btm/btm_ble_batchscan.c
stack/btm/btm_ble_bgconn.c
stack/btm/btm_ble_gap.c
stack/btm/btm_ble_int.h
stack/btm/btm_ble_multi_adv.c
stack/btm/btm_devctl.c
stack/btu/btu_hcif.c
stack/include/btm_ble_api.h
stack/include/gap_api.h
stack/l2cap/l2c_ble.c
stack/smp/aes.c
vnd/ble/bta_vendor.c [deleted file]
vnd/ble/vendor_ble.c
vnd/include/bta_vendor_api.h [deleted file]
vnd/include/vendor_ble.h

index 2652058..a1a49f3 100644 (file)
@@ -3173,7 +3173,7 @@ 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)
+#if BLE_VND_INCLUDED == TRUE
     BTM_BleReadControllerFeatures (bta_dm_ctrl_features_rd_cmpl_cback);
 #endif
 }
@@ -5126,7 +5126,7 @@ void bta_dm_ble_update_conn_params (tBTA_DM_MSG *p_data)
 {
     if (!L2CA_UpdateBleConnParams(p_data->ble_update_conn_params.bd_addr,
                                  p_data->ble_update_conn_params.min_int,
-                                 p_data-> ble_update_conn_params.max_int,
+                                 p_data->ble_update_conn_params.max_int,
                                  p_data->ble_update_conn_params.latency,
                                  p_data->ble_update_conn_params.timeout))
     {
@@ -5149,7 +5149,6 @@ void bta_dm_ble_config_local_privacy (tBTA_DM_MSG *p_data)
     BTM_BleConfigPrivacy (p_data->ble_local_privacy.privacy_enable);
 }
 #endif
-
 /*******************************************************************************
 **
 ** Function         bta_dm_ble_observe
@@ -5161,7 +5160,6 @@ void bta_dm_ble_config_local_privacy (tBTA_DM_MSG *p_data)
 *******************************************************************************/
 void bta_dm_ble_observe (tBTA_DM_MSG *p_data)
 {
-
     tBTM_STATUS status;
     if (p_data->ble_observe.start)
     {
@@ -5273,10 +5271,23 @@ void bta_dm_ble_broadcast (tBTA_DM_MSG *p_data)
 *******************************************************************************/
 void bta_dm_ble_multi_adv_enb(tBTA_DM_MSG *p_data)
 {
-#if BLE_MULTI_ADV_INCLUDED == TRUE
-    BTM_BleEnableAdvInstance((tBTM_BLE_ADV_PARAMS*)p_data->ble_multi_adv_enb.p_params,
-        p_data->ble_multi_adv_enb.p_cback,p_data->ble_multi_adv_enb.p_ref);
-#endif
+    tBTM_STATUS btm_status = 0;
+    void *p_ref = NULL;
+
+    bta_dm_cb.p_multi_adv_cback = p_data->ble_multi_adv_enb.p_cback;
+    if(BTM_BleMaxMultiAdvInstanceCount() > 0 && NULL != p_data->ble_multi_adv_enb.p_ref)
+    {
+        btm_status = BTM_BleEnableAdvInstance((tBTM_BLE_ADV_PARAMS*)
+                                            p_data->ble_multi_adv_enb.p_params,
+                                            p_data->ble_multi_adv_enb.p_cback,
+                                            p_data->ble_multi_adv_enb.p_ref);
+    }
+
+    if(BTM_CMD_STARTED != btm_status)
+    {
+        bta_dm_cb.p_multi_adv_cback(BTA_BLE_MULTI_ADV_ENB_EVT, 0xFF,
+                                    p_data->ble_multi_adv_enb.p_ref, BTA_FAILURE);
+    }
 }
 /*******************************************************************************
 **
@@ -5289,10 +5300,22 @@ void bta_dm_ble_multi_adv_enb(tBTA_DM_MSG *p_data)
 *******************************************************************************/
 void bta_dm_ble_multi_adv_upd_param(tBTA_DM_MSG *p_data)
 {
-#if BLE_MULTI_ADV_INCLUDED == TRUE
-    BTM_BleUpdateAdvInstParam(p_data->ble_multi_adv_param.inst_id,
-        (tBTM_BLE_ADV_PARAMS*)p_data->ble_multi_adv_param.p_params);
-#endif
+    tBTM_STATUS btm_status = 0;
+    void *p_ref = NULL;
+
+    if(BTM_BleMaxMultiAdvInstanceCount() > 0 && p_data->ble_multi_adv_param.inst_id > 0
+        && p_data->ble_multi_adv_param.inst_id < BTM_BleMaxMultiAdvInstanceCount())
+    {
+        btm_status = BTM_BleUpdateAdvInstParam(p_data->ble_multi_adv_param.inst_id,
+                         (tBTM_BLE_ADV_PARAMS*)p_data->ble_multi_adv_param.p_params);
+    }
+
+    if(BTM_CMD_STARTED != btm_status)
+    {
+       p_ref = btm_ble_multi_adv_get_ref(p_data->ble_multi_adv_param.inst_id);
+       bta_dm_cb.p_multi_adv_cback(BTA_BLE_MULTI_ADV_PARAM_EVT,
+                                   p_data->ble_multi_adv_param.inst_id, p_ref, BTA_FAILURE);
+    }
 }
 /*******************************************************************************
 **
@@ -5306,10 +5329,25 @@ void bta_dm_ble_multi_adv_upd_param(tBTA_DM_MSG *p_data)
 *******************************************************************************/
 void bta_dm_ble_multi_adv_data(tBTA_DM_MSG *p_data)
 {
-#if BLE_MULTI_ADV_INCLUDED == TRUE
-    BTM_BleCfgAdvInstData(p_data->ble_multi_adv_data.inst_id,p_data->ble_multi_adv_data.is_scan_rsp,
-        p_data->ble_multi_adv_data.data_mask,(tBTM_BLE_ADV_DATA*)p_data->ble_multi_adv_data.p_data);
-#endif
+    tBTM_STATUS btm_status = 0;
+    void *p_ref = NULL;
+
+    if(BTM_BleMaxMultiAdvInstanceCount() > 0 && p_data->ble_multi_adv_data.inst_id > 0
+        && p_data->ble_multi_adv_data.inst_id < BTM_BleMaxMultiAdvInstanceCount())
+    {
+        btm_status = BTM_BleCfgAdvInstData(p_data->ble_multi_adv_data.inst_id,
+                        p_data->ble_multi_adv_data.is_scan_rsp,
+                        p_data->ble_multi_adv_data.data_mask,
+                        (tBTM_BLE_ADV_DATA*)p_data->ble_multi_adv_data.p_data);
+    }
+
+    if(BTM_CMD_STARTED != btm_status)
+    {
+       p_ref = btm_ble_multi_adv_get_ref(p_data->ble_multi_adv_data.inst_id);
+       bta_dm_cb.p_multi_adv_cback(BTA_BLE_MULTI_ADV_DATA_EVT,
+                                   p_data->ble_multi_adv_data.inst_id, p_ref, BTA_FAILURE);
+    }
+
 }
 /*******************************************************************************
 **
@@ -5322,9 +5360,21 @@ void bta_dm_ble_multi_adv_data(tBTA_DM_MSG *p_data)
 *******************************************************************************/
 void btm_dm_ble_multi_adv_disable(tBTA_DM_MSG *p_data)
 {
-#if BLE_MULTI_ADV_INCLUDED == TRUE
-    BTM_BleDisableAdvInstance(p_data->ble_multi_adv_disable.inst_id);
-#endif
+    tBTM_STATUS btm_status = 0;
+    void *p_ref = NULL;
+
+    if(BTM_BleMaxMultiAdvInstanceCount() > 0 && p_data->ble_multi_adv_disable.inst_id > 0
+        && p_data->ble_multi_adv_disable.inst_id < BTM_BleMaxMultiAdvInstanceCount())
+    {
+        btm_status = BTM_BleDisableAdvInstance(p_data->ble_multi_adv_disable.inst_id);
+    }
+
+    if(BTM_CMD_STARTED != btm_status)
+    {
+       p_ref = btm_ble_multi_adv_get_ref(p_data->ble_multi_adv_disable.inst_id);
+       bta_dm_cb.p_multi_adv_cback(BTA_BLE_MULTI_ADV_DISABLE_EVT,
+                                   p_data->ble_multi_adv_disable.inst_id, p_ref, BTA_FAILURE);
+    }
 }
 
 /*******************************************************************************
@@ -5338,21 +5388,25 @@ void btm_dm_ble_multi_adv_disable(tBTA_DM_MSG *p_data)
 *******************************************************************************/
 void bta_dm_ble_setup_storage (tBTA_DM_MSG *p_data)
 {
-#if BLE_BATCH_SCAN_INCLUDED == TRUE
     tBTM_STATUS btm_status = 0;
+    tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
 
-    btm_status = BTM_BleSetStorageConfig(p_data->ble_set_storage.batch_scan_full_max,
-                            p_data->ble_set_storage.batch_scan_trunc_max,
-                            p_data->ble_set_storage.batch_scan_notify_threshold,
-                            p_data->ble_set_storage.p_setup_cback,
-                            p_data->ble_set_storage.p_thres_cback,
-                            p_data->ble_set_storage.p_read_rep_cback,
-                            p_data->ble_set_storage.ref_value);
+    BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+
+    if (0 != cmn_ble_vsc_cb.tot_scan_results_strg)
+    {
+        btm_status = BTM_BleSetStorageConfig(p_data->ble_set_storage.batch_scan_full_max,
+                                             p_data->ble_set_storage.batch_scan_trunc_max,
+                                             p_data->ble_set_storage.batch_scan_notify_threshold,
+                                             p_data->ble_set_storage.p_setup_cback,
+                                             p_data->ble_set_storage.p_thres_cback,
+                                             p_data->ble_set_storage.p_read_rep_cback,
+                                             p_data->ble_set_storage.ref_value);
+    }
 
     if(BTM_CMD_STARTED != btm_status)
        bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_CFG_STRG_EVT, p_data->ble_set_storage.ref_value,
                              btm_status);
-#endif
 }
 
 /*******************************************************************************
@@ -5366,20 +5420,24 @@ void bta_dm_ble_setup_storage (tBTA_DM_MSG *p_data)
 *******************************************************************************/
 void bta_dm_ble_enable_batch_scan (tBTA_DM_MSG *p_data)
 {
-#if BLE_BATCH_SCAN_INCLUDED == TRUE
     tBTM_STATUS btm_status = 0;
+    tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+
+    BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
 
-    btm_status = BTM_BleEnableBatchScan(p_data->ble_enable_scan.scan_mode,
-                           p_data->ble_enable_scan.scan_int,p_data->ble_enable_scan.scan_window,
-                           p_data->ble_enable_scan.addr_type,
-                           p_data->ble_enable_scan.discard_rule,
-                           p_data->ble_enable_scan.ref_value);
+    if (0 != cmn_ble_vsc_cb.tot_scan_results_strg)
+    {
+        btm_status = BTM_BleEnableBatchScan(p_data->ble_enable_scan.scan_mode,
+                                            p_data->ble_enable_scan.scan_int,
+                                            p_data->ble_enable_scan.scan_window,
+                                            p_data->ble_enable_scan.discard_rule,
+                                            p_data->ble_enable_scan.addr_type,
+                                            p_data->ble_enable_scan.ref_value);
+    }
 
     if(BTM_CMD_STARTED != btm_status)
        bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_ENABLE_EVT, p_data->ble_enable_scan.ref_value,
-                                btm_status);
-
-#endif
+                             btm_status);
 }
 
 /*******************************************************************************
@@ -5394,15 +5452,19 @@ void bta_dm_ble_enable_batch_scan (tBTA_DM_MSG *p_data)
 void bta_dm_ble_disable_batch_scan (tBTA_DM_MSG *p_data)
 {
     UNUSED(p_data);
-#if BLE_BATCH_SCAN_INCLUDED == TRUE
     tBTM_STATUS btm_status = 0;
+    tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
 
-    btm_status = BTM_BleDisableBatchScan(p_data->ble_disable_scan.ref_value);
+    BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+
+    if (0 != cmn_ble_vsc_cb.tot_scan_results_strg)
+    {
+        btm_status = BTM_BleDisableBatchScan(p_data->ble_disable_scan.ref_value);
+    }
 
     if(BTM_CMD_STARTED != btm_status)
        bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_DISABLE_EVT, p_data->ble_enable_scan.ref_value,
                              btm_status);
-#endif
 }
 
 /*******************************************************************************
@@ -5416,16 +5478,20 @@ void bta_dm_ble_disable_batch_scan (tBTA_DM_MSG *p_data)
 *******************************************************************************/
 void bta_dm_ble_read_scan_reports(tBTA_DM_MSG *p_data)
 {
-#if BLE_BATCH_SCAN_INCLUDED == TRUE
     tBTM_STATUS btm_status = 0;
+    tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
 
-    btm_status = BTM_BleReadScanReports(p_data->ble_read_reports.scan_type,
-                                        p_data->ble_read_reports.ref_value);
+    BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+
+    if (0 != cmn_ble_vsc_cb.tot_scan_results_strg)
+    {
+        btm_status = BTM_BleReadScanReports(p_data->ble_read_reports.scan_type,
+                                            p_data->ble_read_reports.ref_value);
+    }
 
     if(BTM_CMD_STARTED != btm_status)
        bta_ble_scan_setup_cb(BTM_BLE_BATCH_SCAN_READ_REPTS_EVT, p_data->ble_enable_scan.ref_value,
                              btm_status);
-#endif
 }
 
 /*******************************************************************************
@@ -5439,8 +5505,21 @@ void bta_dm_ble_read_scan_reports(tBTA_DM_MSG *p_data)
 *******************************************************************************/
 void bta_dm_ble_track_advertiser(tBTA_DM_MSG *p_data)
 {
-    BTM_BleTrackAdvertiser(p_data->ble_track_advert.p_track_adv_cback,
-                           p_data->ble_track_advert.ref_value);
+    tBTM_STATUS btm_status = 0;
+    BD_ADDR bda;
+    memset(&bda, 0 , sizeof(BD_ADDR));
+    tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+
+    BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+
+    if (0 != cmn_ble_vsc_cb.tot_scan_results_strg)
+    {
+        btm_status = BTM_BleTrackAdvertiser(p_data->ble_track_advert.p_track_adv_cback,
+                                            p_data->ble_track_advert.ref_value);
+    }
+
+    if(BTM_CMD_STARTED != btm_status)
+       p_data->ble_track_advert.p_track_adv_cback(0, 0, bda, 0, p_data->ble_track_advert.ref_value);
 }
 
 /*******************************************************************************
@@ -5529,51 +5608,6 @@ static void bta_ble_status_cmpl(tBTM_BLE_PF_ACTION action, tBTM_BLE_REF_VALUE re
 
 /*******************************************************************************
 **
-** Function         bta_ble_enable_scan_cmpl
-**
-** Description      ADV payload filtering enable / disable complete callback
-**
-**
-** Returns          None
-**
-*******************************************************************************/
-static void bta_ble_energy_info_cmpl(tBTM_BLE_TX_TIME_MS tx_time,
-                                        tBTM_BLE_RX_TIME_MS rx_time,
-                                        tBTM_BLE_IDLE_TIME_MS idle_time,
-                                        tBTM_BLE_ENERGY_USED  energy_used,
-                                        tBTM_STATUS status)
-{
-    tBTA_STATUS st = (status == BTM_SUCCESS) ? BTA_SUCCESS: BTA_FAILURE;
-    tBTA_DM_CONTRL_STATE ctrl_state = 0;
-
-    if (BTA_SUCCESS == st)
-       ctrl_state = bta_dm_pm_obtain_controller_state();
-
-    if (bta_dm_cb.p_energy_info_cback)
-        bta_dm_cb.p_energy_info_cback(tx_time, rx_time, idle_time, energy_used, ctrl_state, st);
-}
-
-/*******************************************************************************
-**
-** Function         bta_dm_ble_get_energy_info
-**
-** Description      This function obtains the energy info
-**
-** Parameters:
-**
-*******************************************************************************/
-void bta_dm_ble_get_energy_info(tBTA_DM_MSG *p_data)
-{
-    tBTM_STATUS btm_status = 0;
-
-    bta_dm_cb.p_energy_info_cback = p_data->ble_energy_info.p_energy_info_cback;
-    btm_status = BTM_BleGetEnergyInfo(bta_ble_energy_info_cmpl);
-    if (BTM_CMD_STARTED != btm_status)
-        bta_ble_energy_info_cmpl(0, 0, 0, 0, btm_status);
-}
-
-/*******************************************************************************
-**
 ** Function         bta_dm_cfg_filter_cond
 **
 ** Description      This function configure adv payload filtering condition
@@ -5684,6 +5718,51 @@ void bta_dm_scan_filter_param_setup (tBTA_DM_MSG *p_data)
 }
 #endif
 
+/*******************************************************************************
+**
+** Function         bta_ble_enable_scan_cmpl
+**
+** Description      ADV payload filtering enable / disable complete callback
+**
+**
+** Returns          None
+**
+*******************************************************************************/
+static void bta_ble_energy_info_cmpl(tBTM_BLE_TX_TIME_MS tx_time,
+                                        tBTM_BLE_RX_TIME_MS rx_time,
+                                        tBTM_BLE_IDLE_TIME_MS idle_time,
+                                        tBTM_BLE_ENERGY_USED  energy_used,
+                                        tBTM_STATUS status)
+{
+    tBTA_STATUS st = (status == BTM_SUCCESS) ? BTA_SUCCESS: BTA_FAILURE;
+    tBTA_DM_CONTRL_STATE ctrl_state = 0;
+
+    if (BTA_SUCCESS == st)
+       ctrl_state = bta_dm_pm_obtain_controller_state();
+
+    if (bta_dm_cb.p_energy_info_cback)
+        bta_dm_cb.p_energy_info_cback(tx_time, rx_time, idle_time, energy_used, ctrl_state, st);
+}
+
+/*******************************************************************************
+**
+** Function         bta_dm_ble_get_energy_info
+**
+** Description      This function obtains the energy info
+**
+** Parameters:
+**
+*******************************************************************************/
+void bta_dm_ble_get_energy_info(tBTA_DM_MSG *p_data)
+{
+    tBTM_STATUS btm_status = 0;
+
+    bta_dm_cb.p_energy_info_cback = p_data->ble_energy_info.p_energy_info_cback;
+    btm_status = BTM_BleGetEnergyInfo(bta_ble_energy_info_cmpl);
+    if (BTM_CMD_STARTED != btm_status)
+        bta_ble_energy_info_cmpl(0, 0, 0, 0, btm_status);
+}
+
 #if ((defined BTA_GATT_INCLUDED) &&  (BTA_GATT_INCLUDED == TRUE))
 #ifndef BTA_DM_GATT_CLOSE_DELAY_TOUT
 #define BTA_DM_GATT_CLOSE_DELAY_TOUT    1000
index d8fb934..2e4d966 100644 (file)
@@ -32,6 +32,7 @@
 #include "btm_int.h"
 #include <string.h>
 #include "utl.h"
+#include "vendor_ble.h"
 
 /*****************************************************************************
 **  Constants
@@ -1260,8 +1261,6 @@ void bta_dmexecutecallback (tBTA_DM_EXEC_CBACK* p_callback, void * p_param)
     }
 }
 
-#if BLE_INCLUDED == TRUE
-
 /*******************************************************************************
 **
 ** Function         BTA_DmAddBleKey
@@ -1807,7 +1806,7 @@ static void bta_dm_discover_send_msg(BD_ADDR bd_addr, tBTA_SERVICE_MASK_EXT *p_s
                     tBTA_TRANSPORT transport)
 {
     tBTA_DM_API_DISCOVER    *p_msg;
-    UINT16  len = p_services ? (sizeof(tBTA_DM_API_DISCOVER) + 
+    UINT16  len = p_services ? (sizeof(tBTA_DM_API_DISCOVER) +
                                 sizeof(tBT_UUID) * p_services->num_uuid) :
                                 sizeof(tBTA_DM_API_DISCOVER);
 
@@ -1984,7 +1983,6 @@ void BTA_DmBleEnableRemotePrivacy(BD_ADDR bd_addr, BOOLEAN privacy_enable)
 void BTA_DmBleConfigLocalPrivacy(BOOLEAN privacy_enable)
 {
 #if BLE_INCLUDED == TRUE
-#if BLE_VND_INCLUDED == TRUE && BLE_PRIVACY_SPT == TRUE
     tBTA_DM_API_LOCAL_PRIVACY *p_msg;
 
     if ((p_msg = (tBTA_DM_API_LOCAL_PRIVACY *) GKI_getbuf(sizeof(tBTA_DM_API_ENABLE_PRIVACY))) != NULL)
@@ -1996,12 +1994,10 @@ void BTA_DmBleConfigLocalPrivacy(BOOLEAN privacy_enable)
 
         bta_sys_sendmsg(p_msg);
     }
-#endif
 #else
-    UNUSED(privacy_enable);
+    UNUSED (privacy_enable);
 #endif
 }
-#endif
 
 #if BLE_INCLUDED == TRUE
 /*******************************************************************************
@@ -2018,7 +2014,7 @@ void BTA_DmBleConfigLocalPrivacy(BOOLEAN privacy_enable)
 ** Returns          BTA_SUCCESS if command started sucessfully; otherwise failure.
 **
 *******************************************************************************/
-tBTA_STATUS BTA_BleEnableAdvInstance (tBTA_BLE_ADV_PARAMS *p_params,
+void BTA_BleEnableAdvInstance (tBTA_BLE_ADV_PARAMS *p_params,
                                 tBTA_BLE_MULTI_ADV_CBACK *p_cback,
                                 void *p_ref)
 {
@@ -2041,10 +2037,7 @@ tBTA_STATUS BTA_BleEnableAdvInstance (tBTA_BLE_ADV_PARAMS *p_params,
         p_msg->p_ref        = p_ref;
 
         bta_sys_sendmsg(p_msg);
-
-        return BTA_SUCCESS;
     }
-    return BTA_FAILURE;
 }
 
 /*******************************************************************************
@@ -2060,29 +2053,22 @@ tBTA_STATUS BTA_BleEnableAdvInstance (tBTA_BLE_ADV_PARAMS *p_params,
 ** Returns          BTA_SUCCESS if command started sucessfully; otherwise failure.
 **
 *******************************************************************************/
-tBTA_STATUS BTA_BleUpdateAdvInstParam (UINT8 inst_id, tBTA_BLE_ADV_PARAMS *p_params)
+void BTA_BleUpdateAdvInstParam (UINT8 inst_id, tBTA_BLE_ADV_PARAMS *p_params)
 {
     tBTA_DM_API_BLE_MULTI_ADV_PARAM    *p_msg;
     UINT16      len = sizeof(tBTA_BLE_ADV_PARAMS) + sizeof(tBTA_DM_API_BLE_MULTI_ADV_PARAM);
 
     APPL_TRACE_API ("BTA_BleUpdateAdvInstParam");
-    if (inst_id <= BTM_BLE_MULTI_ADV_MAX && inst_id != BTA_BLE_MULTI_ADV_ILLEGAL)
-    {
-        if ((p_msg = (tBTA_DM_API_BLE_MULTI_ADV_PARAM *) GKI_getbuf(len)) != NULL)
-        {
-             memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_MULTI_ADV_PARAM));
+     if ((p_msg = (tBTA_DM_API_BLE_MULTI_ADV_PARAM *) GKI_getbuf(len)) != NULL)
+     {
+          memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_MULTI_ADV_PARAM));
+          p_msg->hdr.event     = BTA_DM_API_BLE_MULTI_ADV_PARAM_UPD_EVT;
+          p_msg->inst_id        = inst_id;
+          p_msg->p_params =  (void *)(p_msg + 1);
+          memcpy(p_msg->p_params, p_params, sizeof(tBTA_BLE_ADV_PARAMS));
 
-             p_msg->hdr.event     = BTA_DM_API_BLE_MULTI_ADV_PARAM_UPD_EVT;
-             p_msg->inst_id        = inst_id;
-             p_msg->p_params =  (void *)(p_msg + 1);
-             memcpy(p_msg->p_params, p_params, sizeof(tBTA_BLE_ADV_PARAMS));
-
-             bta_sys_sendmsg(p_msg);
-
-             return BTA_SUCCESS;
-        }
+          bta_sys_sendmsg(p_msg);
     }
-    return BTA_FAILURE;
 }
 
 /*******************************************************************************
@@ -2102,7 +2088,7 @@ tBTA_STATUS BTA_BleUpdateAdvInstParam (UINT8 inst_id, tBTA_BLE_ADV_PARAMS *p_par
 ** Returns          BTA_SUCCESS if command started sucessfully; otherwise failure.
 **
 *******************************************************************************/
-tBTA_STATUS BTA_BleCfgAdvInstData (UINT8 inst_id, BOOLEAN is_scan_rsp,
+void BTA_BleCfgAdvInstData (UINT8 inst_id, BOOLEAN is_scan_rsp,
                             tBTA_BLE_AD_MASK data_mask,
                             tBTA_BLE_ADV_DATA *p_data)
 {
@@ -2111,24 +2097,17 @@ tBTA_STATUS BTA_BleCfgAdvInstData (UINT8 inst_id, BOOLEAN is_scan_rsp,
 
     APPL_TRACE_API ("BTA_BleCfgAdvInstData");
 
-    if (inst_id <= BTM_BLE_MULTI_ADV_MAX && inst_id != BTA_BLE_MULTI_ADV_ILLEGAL)
-    {
     if ((p_msg = (tBTA_DM_API_BLE_MULTI_ADV_DATA *) GKI_getbuf(len)) != NULL)
     {
-            memset(p_msg, 0, len);
-
-            p_msg->hdr.event     = BTA_DM_API_BLE_MULTI_ADV_DATA_EVT;
-            p_msg->inst_id      = inst_id;
-            p_msg->is_scan_rsp  = is_scan_rsp;
-            p_msg->data_mask     = data_mask;
-            p_msg->p_data        = p_data;
+          memset(p_msg, 0, len);
+          p_msg->hdr.event     = BTA_DM_API_BLE_MULTI_ADV_DATA_EVT;
+          p_msg->inst_id      = inst_id;
+          p_msg->is_scan_rsp  = is_scan_rsp;
+          p_msg->data_mask     = data_mask;
+          p_msg->p_data        = p_data;
 
-            bta_sys_sendmsg(p_msg);
-
-            return BTA_SUCCESS;
-        }
+          bta_sys_sendmsg(p_msg);
     }
-    return BTA_FAILURE;
 }
 
 /*******************************************************************************
@@ -2142,25 +2121,19 @@ tBTA_STATUS BTA_BleCfgAdvInstData (UINT8 inst_id, BOOLEAN is_scan_rsp,
 ** Returns          BTA_SUCCESS if command started sucessfully; otherwise failure.
 **
 *******************************************************************************/
-tBTA_STATUS BTA_BleDisableAdvInstance (UINT8  inst_id)
+void BTA_BleDisableAdvInstance (UINT8  inst_id)
 {
     tBTA_DM_API_BLE_MULTI_ADV_DISABLE    *p_msg;
 
     APPL_TRACE_API ("BTA_BleDisableAdvInstance: %d", inst_id);
-
-    if (inst_id <= BTM_BLE_MULTI_ADV_MAX && inst_id != BTA_BLE_MULTI_ADV_ILLEGAL)
+    if ((p_msg = (tBTA_DM_API_BLE_MULTI_ADV_DISABLE *)
+          GKI_getbuf(sizeof(tBTA_DM_API_BLE_MULTI_ADV_DISABLE))) != NULL)
     {
-        if ((p_msg = (tBTA_DM_API_BLE_MULTI_ADV_DISABLE *)
-            GKI_getbuf(sizeof(tBTA_DM_API_BLE_MULTI_ADV_DISABLE))) != NULL)
-        {
-            memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_MULTI_ADV_DISABLE));
-            p_msg->hdr.event    = BTA_DM_API_BLE_MULTI_ADV_DISABLE_EVT;
-            p_msg->inst_id      = inst_id;
-            bta_sys_sendmsg(p_msg);
-            return BTA_SUCCESS;
-        }
+         memset(p_msg, 0, sizeof(tBTA_DM_API_BLE_MULTI_ADV_DISABLE));
+         p_msg->hdr.event    = BTA_DM_API_BLE_MULTI_ADV_DISABLE_EVT;
+         p_msg->inst_id      = inst_id;
+         bta_sys_sendmsg(p_msg);
     }
-    return BTA_FAILURE;
 }
 
 /*******************************************************************************
@@ -2543,4 +2516,43 @@ BTA_API extern void BTA_DmBleObserve(BOOLEAN start, UINT8 duration,
         bta_sys_sendmsg(p_msg);
     }
 }
+
+/*******************************************************************************
+**
+** Function         BTA_VendorInit
+**
+** Description      This function initializes vendor specific
+**
+** Returns          void
+**
+*******************************************************************************/
+void BTA_VendorInit (void)
+{
+    APPL_TRACE_API("BTA_VendorInit");
+}
+
+/*******************************************************************************
+**
+** Function         BTA_VendorCleanup
+**
+** Description      This function frees up Broadcom specific VS specific dynamic memory
+**
+** Returns          void
+**
+*******************************************************************************/
+void BTA_VendorCleanup (void)
+{
+    tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+
+#if (BLE_INCLUDED == TRUE && BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE)
+    btm_ble_adv_filter_cleanup();
+    btm_ble_vendor_cleanup();
+#endif
+
+   BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+
+   if(cmn_ble_vsc_cb.adv_inst_max > 0)
+      btm_ble_multi_adv_cleanup();
+}
+
 #endif
index a16ebab..311ac5f 100644 (file)
@@ -100,11 +100,9 @@ enum
     BTA_DM_API_BLE_SCAN_PARAM_EVT,
     BTA_DM_API_BLE_OBSERVE_EVT,
     BTA_DM_API_UPDATE_CONN_PARAM_EVT,
-
 #if BLE_PRIVACY_SPT == TRUE
     BTA_DM_API_LOCAL_PRIVACY_EVT,
 #endif
-
     BTA_DM_API_BLE_ADV_PARAM_EVT,
     BTA_DM_API_BLE_SET_ADV_CONFIG_EVT,
     BTA_DM_API_BLE_SET_SCAN_RSP_EVT,
@@ -564,7 +562,7 @@ typedef struct
 typedef struct
 {
     BT_HDR                      hdr;
-    void                        *p_cback;
+    tBTA_BLE_MULTI_ADV_CBACK    *p_cback;
     void                        *p_ref;
     tBTA_BLE_ADV_PARAMS         *p_params;
 }tBTA_DM_API_BLE_MULTI_ADV_ENB;
@@ -922,13 +920,12 @@ typedef struct
     tBTA_DM_SEC_CBACK           *p_sec_cback;
 #if ((defined BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
     tBTA_BLE_SCAN_SETUP_CBACK   *p_setup_cback;
-#endif
     tBTA_DM_BLE_PF_CFG_CBACK     *p_scan_filt_cfg_cback;
     tBTA_DM_BLE_PF_STATUS_CBACK  *p_scan_filt_status_cback;
     tBTA_DM_BLE_PF_PARAM_CBACK   *p_scan_filt_param_cback;
-#if ((defined BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
-    tBTA_BLE_ENERGY_INFO_CBACK   *p_energy_info_cback;
+    tBTA_BLE_MULTI_ADV_CBACK     *p_multi_adv_cback;
 #endif
+    tBTA_BLE_ENERGY_INFO_CBACK   *p_energy_info_cback;
     TIMER_LIST_ENT              signal_strength_timer;
     tBTA_SIG_STRENGTH_MASK      signal_strength_mask;
     UINT16                      state;
@@ -1186,9 +1183,7 @@ extern void bta_dm_ble_set_scan_params (tBTA_DM_MSG *p_data);
 extern void bta_dm_close_gatt_conn(tBTA_DM_MSG *p_data);
 extern void bta_dm_ble_observe (tBTA_DM_MSG *p_data);
 extern void bta_dm_ble_update_conn_params (tBTA_DM_MSG *p_data);
-#if BLE_PRIVACY_SPT == TRUE
 extern void bta_dm_ble_config_local_privacy (tBTA_DM_MSG *p_data);
-#endif
 extern void bta_dm_ble_set_adv_params (tBTA_DM_MSG *p_data);
 extern void bta_dm_ble_set_adv_config (tBTA_DM_MSG *p_data);
 extern void bta_dm_ble_set_scan_rsp (tBTA_DM_MSG *p_data);
@@ -1245,9 +1240,7 @@ extern void bta_dm_search_cancel_transac_cmpl(tBTA_DM_MSG *p_data);
 extern void bta_dm_disc_rmt_name (tBTA_DM_MSG *p_data);
 extern tBTA_DM_PEER_DEVICE * bta_dm_find_peer_device(BD_ADDR peer_addr);
 
-#if BLE_PRIVACY_SPT == TRUE
 extern void bta_dm_ble_config_local_privacy (tBTA_DM_MSG *p_data);
-#endif
 
 extern void bta_dm_pm_active(BD_ADDR peer_addr);
 
index 35835c7..92bc812 100644 (file)
@@ -118,8 +118,8 @@ const tBTA_DM_ACTION bta_dm_action[] =
     bta_dm_ble_disable_batch_scan, /* BTA_DM_API_BLE_DISABLE_BATCH_SCAN_EVT */
     bta_dm_ble_read_scan_reports,  /* BTA_DM_API_BLE_READ_SCAN_REPORTS_EVT */
     bta_dm_ble_track_advertiser,   /* BTA_DM_API_BLE_TRACK_ADVERTISER_EVT */
-    bta_dm_ble_get_energy_info,    /* BTA_DM_API_BLE_ENERGY_INFO_EVT */
 #endif
+    bta_dm_ble_get_energy_info,    /* BTA_DM_API_BLE_ENERGY_INFO_EVT */
 
 #if ( BTM_EIR_SERVER_INCLUDED == TRUE )&&( BTA_EIR_CANNED_UUID_LIST != TRUE )&&(BTA_EIR_SERVER_NUM_CUSTOM_UUID > 0)
     bta_dm_update_eir_uuid,     /*  BTA_DM_API_UPDATE_EIR_UUID_EVT      */
index 8f927fd..20faa62 100644 (file)
@@ -230,7 +230,7 @@ void bta_gatts_register(tBTA_GATTS_CB *p_cb, tBTA_GATTS_DATA *p_msg)
             p_cb->rcb[first_unuse].p_cback = p_msg->api_reg.p_cback;
             memcpy(&p_cb->rcb[first_unuse].app_uuid, &p_msg->api_reg.app_uuid, sizeof(tBT_UUID));
             cb_data.reg_oper.server_if      =
-            p_cb->rcb[first_unuse].gatt_if  = 
+            p_cb->rcb[first_unuse].gatt_if  =
             GATT_Register(&p_msg->api_reg.app_uuid, &bta_gatts_cback);
             if ( !p_cb->rcb[first_unuse].gatt_if)
             {
index d205e9f..b9403e9 100644 (file)
@@ -944,7 +944,6 @@ typedef union
 /* Security callback */
 typedef void (tBTA_DM_SEC_CBACK)(tBTA_DM_SEC_EVT event, tBTA_DM_SEC *p_data);
 
-#define BTA_BLE_MULTI_ADV_MAX BTM_BLE_MULTI_ADV_MAX
 #define BTA_BLE_MULTI_ADV_ILLEGAL 0
 
 /* multi adv callback event */
@@ -2373,7 +2372,7 @@ BTA_API extern void BTA_DmBleBroadcast (BOOLEAN start);
 ** Returns          None
 **
 *******************************************************************************/
-BTA_API extern tBTA_STATUS BTA_BleEnableAdvInstance (tBTA_BLE_ADV_PARAMS *p_params,
+BTA_API extern void BTA_BleEnableAdvInstance (tBTA_BLE_ADV_PARAMS *p_params,
                                 tBTA_BLE_MULTI_ADV_CBACK *p_cback,void *p_ref);
 
 /*******************************************************************************
@@ -2388,7 +2387,7 @@ BTA_API extern tBTA_STATUS BTA_BleEnableAdvInstance (tBTA_BLE_ADV_PARAMS *p_para
 ** Returns          None
 **
 *******************************************************************************/
-BTA_API extern tBTA_STATUS BTA_BleUpdateAdvInstParam (UINT8 inst_id,
+BTA_API extern void BTA_BleUpdateAdvInstParam (UINT8 inst_id,
                                 tBTA_BLE_ADV_PARAMS *p_params);
 
 /*******************************************************************************
@@ -2403,7 +2402,7 @@ BTA_API extern tBTA_STATUS BTA_BleUpdateAdvInstParam (UINT8 inst_id,
 ** Returns          None
 **
 *******************************************************************************/
-BTA_API extern tBTA_STATUS BTA_BleCfgAdvInstData (UINT8 inst_id, BOOLEAN is_scan_rsp,
+BTA_API extern void BTA_BleCfgAdvInstData (UINT8 inst_id, BOOLEAN is_scan_rsp,
                                 tBTA_BLE_AD_MASK data_mask, tBTA_BLE_ADV_DATA *p_data);
 
 /*******************************************************************************
@@ -2417,7 +2416,7 @@ BTA_API extern tBTA_STATUS BTA_BleCfgAdvInstData (UINT8 inst_id, BOOLEAN is_scan
 ** Returns          None
 **
 *******************************************************************************/
-BTA_API extern tBTA_STATUS BTA_BleDisableAdvInstance(UINT8 inst_id);
+BTA_API extern void BTA_BleDisableAdvInstance(UINT8 inst_id);
 
 /*******************************************************************************
 **
@@ -2606,6 +2605,28 @@ BTA_API extern void BTA_DmBleTrackAdvertiser(tBTA_DM_BLE_REF_VALUE ref_value,
 *******************************************************************************/
 BTA_API extern void BTA_DmBleGetEnergyInfo(tBTA_BLE_ENERGY_INFO_CBACK *p_cmpl_cback);
 
+/*******************************************************************************
+**
+** Function         BTA_BrcmInit
+**
+** Description      This function initializes Broadcom specific VS handler in BTA
+**
+** Returns          void
+**
+*******************************************************************************/
+BTA_API extern void BTA_VendorInit  (void);
+
+/*******************************************************************************
+**
+** Function         BTA_BrcmCleanup
+**
+** Description      This function frees up Broadcom specific VS specific dynamic memory
+**
+** Returns          void
+**
+*******************************************************************************/
+BTA_API extern void BTA_VendorCleanup (void);
+
 #endif
 
 #ifdef __cplusplus
index 2fef449..a67893c 100644 (file)
@@ -25,6 +25,7 @@
 
 #define CLNT_IF_IDX 0
 #define INST_ID_IDX 1
+#define INST_ID_IDX_MAX INST_ID_IDX + 1
 #define INVALID_ADV_INST -1
 #define STD_ADV_INSTID 0
 #define ADV_FLAGS 0x02
@@ -59,9 +60,10 @@ typedef struct
 
 typedef struct
 {
-    INT8 clntif_map[BTM_BLE_MULTI_ADV_MAX][INST_ID_IDX+1];
+     INT8 *clntif_map;
     // Includes the stored data for standard LE instance
-    btgatt_multi_adv_inst_cb inst_cb[BTM_BLE_MULTI_ADV_MAX+1];
+    btgatt_multi_adv_inst_cb *inst_cb;
+
 } btgatt_multi_adv_common_data;
 
 extern btgatt_multi_adv_common_data *btif_obtain_multi_adv_data_cb();
@@ -70,7 +72,7 @@ extern void btif_gattc_destroy_multi_adv_cb();
 extern int btif_multi_adv_add_instid_map(int client_if, int inst_id,
         BOOLEAN gen_temp_instid);
 extern int btif_multi_adv_instid_for_clientif(int client_if);
-extern int btif_gattc_obtain_idx_for_datacb(int value, int arrindex);
+extern int btif_gattc_obtain_idx_for_datacb(int value, int clnt_inst_index);
 extern void btif_gattc_clear_clientif(int client_if);
 extern void btif_gattc_cleanup_inst_cb(int inst_id);
 extern void btif_gattc_cleanup_multi_inst_cb(btgatt_multi_adv_inst_cb *p_inst_cb);
index bd2f4ec..4f7e908 100644 (file)
@@ -678,6 +678,10 @@ bt_status_t btif_disable_bluetooth(void)
 
     btif_config_flush();
 
+#if (BLE_INCLUDED == TRUE)
+     BTA_VendorCleanup();
+#endif
+
     if (status != BTA_SUCCESS)
     {
         BTIF_TRACE_ERROR("disable bt failed (%d)", status);
index d549ce3..ef53c14 100644 (file)
@@ -349,7 +349,7 @@ static void btif_gattc_add_remote_bdaddr (BD_ADDR p_bda, uint8_t addr_type)
         p_dev_cb->remote_dev[i].in_use = TRUE;
         BTIF_TRACE_DEBUG("%s device overwrite idx=%d", __FUNCTION__, i  );
         p_dev_cb->next_storage_idx++;
-        if(p_dev_cb->next_storage_idx >= BTIF_GATT_MAX_OBSERVED_DEV)
+        if (p_dev_cb->next_storage_idx >= BTIF_GATT_MAX_OBSERVED_DEV)
                p_dev_cb->next_storage_idx = 0;
     }
 }
@@ -377,13 +377,13 @@ static void btif_gattc_update_properties ( btif_gattc_cb_t *p_btif_cb )
     p_eir_remote_name = BTA_CheckEirData(p_btif_cb->value,
                                          BTM_EIR_COMPLETE_LOCAL_NAME_TYPE, &remote_name_len);
 
-    if(p_eir_remote_name == NULL)
+    if (p_eir_remote_name == NULL)
     {
         p_eir_remote_name = BTA_CheckEirData(p_btif_cb->value,
                                 BT_EIR_SHORTENED_LOCAL_NAME_TYPE, &remote_name_len);
     }
 
-    if(p_eir_remote_name)
+    if (p_eir_remote_name)
     {
         memcpy(bdname.name, p_eir_remote_name, remote_name_len);
         bdname.name[remote_name_len]='\0';
@@ -559,7 +559,7 @@ static void btif_gattc_upstreams_evt(uint16_t event, char* p_param)
             p_eir_remote_name = BTA_CheckEirData(p_btif_cb->value,
                                          BTM_EIR_COMPLETE_LOCAL_NAME_TYPE, &remote_name_len);
 
-            if(p_eir_remote_name == NULL)
+            if (p_eir_remote_name == NULL)
             {
                 p_eir_remote_name = BTA_CheckEirData(p_btif_cb->value,
                                 BT_EIR_SHORTENED_LOCAL_NAME_TYPE, &remote_name_len);
@@ -624,8 +624,8 @@ static void btif_gattc_upstreams_evt(uint16_t event, char* p_param)
         case BTA_GATTC_MULT_ADV_ENB_EVT:
         {
             btif_gattc_cb_t *p_btif_cb = (btif_gattc_cb_t*) p_param;
-            btif_multi_adv_add_instid_map(p_btif_cb->client_if,
-                p_btif_cb->inst_id,false);
+            if (0xFF != p_btif_cb->inst_id)
+                btif_multi_adv_add_instid_map(p_btif_cb->client_if, p_btif_cb->inst_id, false);
             HAL_CBACK(bt_gatt_callbacks, client->multi_adv_enable_cb
                     , p_btif_cb->client_if
                     , p_btif_cb->status
@@ -722,7 +722,7 @@ static void btif_gattc_upstreams_evt(uint16_t event, char* p_param)
             btgatt_batch_track_cb_t *p_data = (btgatt_batch_track_cb_t*) p_param;
             uint8_t *p_rep_data = NULL;
 
-            if(p_data->read_reports.data_len > 0)
+            if (p_data->read_reports.data_len > 0)
             {
                 p_rep_data = GKI_getbuf(p_data->read_reports.data_len);
                 memcpy(p_rep_data, p_data->read_reports.p_rep_data, p_data->read_reports.data_len);
@@ -795,19 +795,19 @@ static void bta_gattc_multi_adv_cback(tBTA_BLE_MULTI_ADV_EVT event, UINT8 inst_i
     tBTA_GATTC_EVT upevt;
     uint8_t client_if = 0;
 
-    if(NULL == p_ref)
+    if (NULL == p_ref)
     {
-        BTIF_TRACE_ERROR("%s Invalid p_ref received",__FUNCTION__);
-        return;
+        BTIF_TRACE_WARNING("%s Invalid p_ref received",__FUNCTION__);
+    }
+    else
+    {
+        client_if = *(UINT8 *) p_ref;
     }
 
-    client_if = *(UINT8 *) p_ref;
     BTIF_TRACE_DEBUG("%s -Inst ID %d, Status:%x, client_if:%d",__FUNCTION__,inst_id, call_status,
                        client_if);
-
     btif_cb.status = call_status;
     btif_cb.client_if = client_if;
-    // Store the inst_id obtained from stack layer now
     btif_cb.inst_id = inst_id;
 
     switch(event)
@@ -926,7 +926,7 @@ static void bta_batch_scan_reports_cb(tBTA_DM_BLE_REF_VALUE ref_value, UINT8 rep
     btif_scan_track_cb.read_reports.data_len = data_len;
     btif_scan_track_cb.read_reports.num_records = num_records;
 
-    if(data_len > 0)
+    if (data_len > 0)
     {
         btif_scan_track_cb.read_reports.p_rep_data = GKI_getbuf(data_len);
         memcpy(btif_scan_track_cb.read_reports.p_rep_data, p_rep_data, data_len);
@@ -936,7 +936,7 @@ static void bta_batch_scan_reports_cb(tBTA_DM_BLE_REF_VALUE ref_value, UINT8 rep
     btif_transfer_context(btif_gattc_upstreams_evt, BTA_GATTC_BTH_SCAN_RD_EVT,
         (char*) &btif_scan_track_cb, sizeof(btgatt_batch_track_cb_t), NULL);
 
-    if(data_len > 0)
+    if (data_len > 0)
         GKI_freebuf(btif_scan_track_cb.read_reports.p_rep_data);
 }
 
@@ -1336,7 +1336,7 @@ static void btgattc_handle_event(uint16_t event, char* p_param)
         case BTIF_GATTC_SCAN_FILTER_PARAM_SETUP:
         {
             btgatt_adv_filter_cb_t *p_adv_filt_cb = (btgatt_adv_filter_cb_t *) p_param;
-            if(1 == p_adv_filt_cb->adv_filt_param.dely_mode)
+            if (1 == p_adv_filt_cb->adv_filt_param.dely_mode)
                BTA_DmBleTrackAdvertiser(p_adv_filt_cb->client_if, bta_track_adv_event_cb);
             BTA_DmBleScanFilterSetup(p_adv_filt_cb->action, p_adv_filt_cb->filt_index,
                 &p_adv_filt_cb->adv_filt_param, NULL, bta_scan_filt_param_setup_cb,
@@ -1473,10 +1473,10 @@ static void btgattc_handle_event(uint16_t event, char* p_param)
         {
             btif_adv_data_t *p_adv_data = (btif_adv_data_t*) p_param;
             int cbindex = CLNT_IF_IDX;
-            if(cbindex >= 0 && NULL != p_adv_data)
+            if (cbindex >= 0 && NULL != p_adv_data)
             {
                 btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
-                if(!btif_gattc_copy_datacb(cbindex, p_adv_data, false))
+                if (!btif_gattc_copy_datacb(cbindex, p_adv_data, false))
                     return;
 
                 if (!p_adv_data->set_scan_rsp)
@@ -1496,21 +1496,30 @@ static void btgattc_handle_event(uint16_t event, char* p_param)
         case BTIF_GATTC_ADV_INSTANCE_ENABLE:
         {
             btgatt_multi_adv_inst_cb *p_inst_cb = (btgatt_multi_adv_inst_cb*) p_param;
-            int arrindex = btif_multi_adv_add_instid_map(p_inst_cb->client_if,INVALID_ADV_INST,
-                                                        true);
-            int cbindex = btif_gattc_obtain_idx_for_datacb(p_inst_cb->client_if, CLNT_IF_IDX);
-            if(cbindex >= 0 && arrindex >= 0)
+
+            int cbindex = -1, arrindex = -1;
+
+            arrindex = btif_multi_adv_add_instid_map(p_inst_cb->client_if,INVALID_ADV_INST, true);
+            if (arrindex >= 0)
+                cbindex = btif_gattc_obtain_idx_for_datacb(p_inst_cb->client_if, CLNT_IF_IDX);
+
+            if (cbindex >= 0 && arrindex >= 0)
             {
                 btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
                 memcpy(&p_multi_adv_data_cb->inst_cb[cbindex].param,
                        &p_inst_cb->param, sizeof(tBTA_BLE_ADV_PARAMS));
-
+                BTIF_TRACE_DEBUG("%s, client_if value: %d", __FUNCTION__,
+                            p_multi_adv_data_cb->clntif_map[arrindex + arrindex]);
                 BTA_BleEnableAdvInstance(&(p_multi_adv_data_cb->inst_cb[cbindex].param),
                     bta_gattc_multi_adv_cback,
-                    &(p_multi_adv_data_cb->clntif_map[arrindex][CLNT_IF_IDX]));
+                    &(p_multi_adv_data_cb->clntif_map[arrindex + arrindex]));
             }
             else
+            {
+                /* let the error propagate up from BTA layer */
                 BTIF_TRACE_ERROR("%s invalid index in BTIF_GATTC_ENABLE_ADV",__FUNCTION__);
+                BTA_BleEnableAdvInstance(&p_inst_cb->param, bta_gattc_multi_adv_cback, NULL);
+            }
             break;
         }
 
@@ -1519,7 +1528,7 @@ static void btgattc_handle_event(uint16_t event, char* p_param)
             btgatt_multi_adv_inst_cb *p_inst_cb = (btgatt_multi_adv_inst_cb*) p_param;
             int inst_id = btif_multi_adv_instid_for_clientif(p_inst_cb->client_if);
             int cbindex = btif_gattc_obtain_idx_for_datacb(p_inst_cb->client_if, CLNT_IF_IDX);
-            if(inst_id >= 0 && cbindex >= 0 && NULL != p_inst_cb)
+            if (inst_id >= 0 && cbindex >= 0 && NULL != p_inst_cb)
             {
                 btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
                 memcpy(&p_multi_adv_data_cb->inst_cb[cbindex].param, &p_inst_cb->param,
@@ -1537,13 +1546,13 @@ static void btgattc_handle_event(uint16_t event, char* p_param)
             btif_adv_data_t *p_adv_data = (btif_adv_data_t*) p_param;
             int cbindex = btif_gattc_obtain_idx_for_datacb(p_adv_data->client_if, CLNT_IF_IDX);
             int inst_id = btif_multi_adv_instid_for_clientif(p_adv_data->client_if);
-            if(inst_id < 0 || cbindex < 0)
+            if (inst_id < 0 || cbindex < 0)
             {
                BTIF_TRACE_ERROR("%s invalid index in BTIF_GATTC_SETADV_INST_DATA", __FUNCTION__);
                return;
             }
 
-            if(!btif_gattc_copy_datacb(cbindex, p_adv_data, true))
+            if (!btif_gattc_copy_datacb(cbindex, p_adv_data, true))
                 return;
 
             btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
@@ -1557,7 +1566,7 @@ static void btgattc_handle_event(uint16_t event, char* p_param)
         {
             btgatt_multi_adv_inst_cb *p_inst_cb = (btgatt_multi_adv_inst_cb*) p_param;
             int inst_id = btif_multi_adv_instid_for_clientif(p_inst_cb->client_if);
-            if(inst_id >=0)
+            if (inst_id >=0)
                 BTA_BleDisableAdvInstance((UINT8)inst_id);
             else
                 BTIF_TRACE_ERROR("%s invalid instance ID in BTIF_GATTC_DISABLE_ADV",__FUNCTION__);
@@ -1971,7 +1980,7 @@ static bt_status_t btif_gattc_scan_filter_add_remove(int client_if, int action,
     BTIF_TRACE_DEBUG("%s, %d, %d", __FUNCTION__, action, filt_type);
 
     /* If data is passed, both mask and data have to be the same length */
-    if(data_len != mask_len && NULL != p_data && NULL != p_mask)
+    if (data_len != mask_len && NULL != p_data && NULL != p_mask)
         return BT_STATUS_PARM_INVALID;
 
     btif_filt_cb.client_if = client_if;
@@ -1980,8 +1989,8 @@ static bt_status_t btif_gattc_scan_filter_add_remove(int client_if, int action,
     btif_filt_cb.filt_type = filt_type;
     btif_filt_cb.conn_id = company_id;
     btif_filt_cb.company_id_mask = company_id_mask ? company_id_mask : 0xFFFF;
-    if(bd_addr)
-      bdcpy(btif_filt_cb.bd_addr.address, bd_addr->address);
+    if (bd_addr)
+        bdcpy(btif_filt_cb.bd_addr.address, bd_addr->address);
 
     btif_filt_cb.addr_type = addr_type;
     btif_filt_cb.has_mask = (p_uuid_mask != NULL);
@@ -2022,7 +2031,7 @@ static bt_status_t btif_gattc_scan_filter_enable(int client_if, bool enable)
 
     btgatt_adv_filter_cb_t btif_filt_cb;
     btif_filt_cb.client_if = client_if;
-    if(true == enable)
+    if (true == enable)
         action = 1;
     btif_filt_cb.action = action;
     return btif_transfer_context(btgattc_handle_event, BTIF_GATTC_SCAN_FILTER_ENABLE,
index e40ccf6..8f1ca9b 100644 (file)
@@ -46,8 +46,34 @@ static btgatt_multi_adv_common_data *p_multi_adv_com_data_cb = NULL;
 
 btgatt_multi_adv_common_data *btif_obtain_multi_adv_data_cb()
 {
-    if(p_multi_adv_com_data_cb == NULL)
-       p_multi_adv_com_data_cb = GKI_getbuf(sizeof(btgatt_multi_adv_common_data));
+    if(0 == BTM_BleMaxMultiAdvInstanceCount())
+    {
+        BTIF_TRACE_WARNING("%s - No instances found", __FUNCTION__);
+        return NULL;
+    }
+
+    BTIF_TRACE_DEBUG("%s, Count:%d", __FUNCTION__, BTM_BleMaxMultiAdvInstanceCount());
+    if (NULL == p_multi_adv_com_data_cb)
+    {
+        BTIF_TRACE_DEBUG("Initializing in %s", __FUNCTION__);
+        p_multi_adv_com_data_cb = GKI_getbuf(sizeof(btgatt_multi_adv_common_data));
+        if (NULL != p_multi_adv_com_data_cb)
+        {
+           memset(p_multi_adv_com_data_cb, 0, sizeof(btgatt_multi_adv_common_data));
+
+           /* Storing both client_if and inst_id details */
+           p_multi_adv_com_data_cb->clntif_map =
+                  GKI_getbuf(( BTM_BleMaxMultiAdvInstanceCount() * INST_ID_IDX_MAX)* sizeof(INT8));
+           memset(p_multi_adv_com_data_cb->clntif_map, 0 ,
+                  ( BTM_BleMaxMultiAdvInstanceCount() * INST_ID_IDX_MAX)* sizeof(INT8));
+
+           p_multi_adv_com_data_cb->inst_cb = GKI_getbuf(( BTM_BleMaxMultiAdvInstanceCount() + 1 )
+                                              * sizeof(btgatt_multi_adv_inst_cb));
+           memset(p_multi_adv_com_data_cb->inst_cb, 0 ,
+                 ( BTM_BleMaxMultiAdvInstanceCount() + 1) * sizeof(btgatt_multi_adv_inst_cb));
+        }
+    }
+
     return p_multi_adv_com_data_cb;
 }
 
@@ -56,17 +82,15 @@ void btif_gattc_init_multi_adv_cb(void)
     int i;
     btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
 
-    if(NULL == p_multi_adv_data_cb)
+    if (NULL == p_multi_adv_data_cb)
         return;
 
-    if(multi_adv_enable_count == 0)
+    if (0 == multi_adv_enable_count)
     {
-        memset(p_multi_adv_data_cb,0,sizeof(btgatt_multi_adv_common_data));
-
-        for (i=0; i < BTM_BLE_MULTI_ADV_MAX; i++)
+        for (i=0; i <  BTM_BleMaxMultiAdvInstanceCount(); i++)
         {
-           p_multi_adv_data_cb->clntif_map[i][CLNT_IF_IDX] = INVALID_ADV_INST;
-           p_multi_adv_data_cb->clntif_map[i][INST_ID_IDX] = INVALID_ADV_INST;
+           p_multi_adv_data_cb->clntif_map[i + i] = INVALID_ADV_INST;
+           p_multi_adv_data_cb->clntif_map[i + (i + 1)] = INVALID_ADV_INST;
         }
     }
     multi_adv_enable_count++;
@@ -74,119 +98,125 @@ void btif_gattc_init_multi_adv_cb(void)
 
 void btif_gattc_destroy_multi_adv_cb()
 {
-    if(multi_adv_enable_count > 0)
+    if (multi_adv_enable_count > 0)
         multi_adv_enable_count --;
-    if(multi_adv_enable_count == 0)
+
+    if (0 == multi_adv_enable_count)
     {
-        GKI_freebuf(p_multi_adv_com_data_cb);
-        p_multi_adv_com_data_cb = NULL;
+        if (NULL != p_multi_adv_com_data_cb)
+        {
+            GKI_freebuf (p_multi_adv_com_data_cb->clntif_map);
+            GKI_freebuf (p_multi_adv_com_data_cb->inst_cb);
+            GKI_freebuf(p_multi_adv_com_data_cb);
+            p_multi_adv_com_data_cb = NULL;
+        }
     }
 }
 
 int btif_multi_adv_add_instid_map(int client_if, int inst_id, BOOLEAN gen_temp_instid)
 {
-    int i=0;
+    int i=1;
 
     btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
 
-    if(NULL == p_multi_adv_data_cb)
+    if (NULL == p_multi_adv_data_cb)
         return INVALID_ADV_INST;
 
-    for(i=0; i < BTM_BLE_MULTI_ADV_MAX; i++)
+    for (i=1; i <  BTM_BleMaxMultiAdvInstanceCount(); i++)
     {
-       if(client_if == p_multi_adv_data_cb->clntif_map[i][CLNT_IF_IDX])
+       if (client_if == p_multi_adv_data_cb->clntif_map[i + i])
        {
-          if(!gen_temp_instid)
+          if (!gen_temp_instid)
           {
              // Write the final inst_id value obtained from stack layer
-             p_multi_adv_data_cb->clntif_map[i][INST_ID_IDX] = inst_id;
+             p_multi_adv_data_cb->clntif_map[i + (i + 1)] = inst_id;
              BTIF_TRACE_DEBUG("%s -Index: %d, Found client_if: %d", __FUNCTION__,
-                i, p_multi_adv_data_cb->clntif_map[i][CLNT_IF_IDX]);
+                i, p_multi_adv_data_cb->clntif_map[i + i]);
              break;
           }
           else
           {
               //Store the passed in inst_id value
-             if(inst_id != INVALID_ADV_INST)
-                 p_multi_adv_data_cb->clntif_map[i][INST_ID_IDX] = inst_id;
+             if (inst_id != INVALID_ADV_INST)
+                 p_multi_adv_data_cb->clntif_map[i + (i + 1)] = inst_id;
              else
-                 p_multi_adv_data_cb->clntif_map[i][INST_ID_IDX] = (i + 1);
+                 p_multi_adv_data_cb->clntif_map[i + (i + 1)] = (i + 1);
+
              BTIF_TRACE_DEBUG("%s - Index:%d,Found client_if: %d", __FUNCTION__,
-                i, p_multi_adv_data_cb->clntif_map[i][CLNT_IF_IDX]);
+                i, p_multi_adv_data_cb->clntif_map[i + i]);
              break;
           }
        }
     }
 
-    if(i < BTM_BLE_MULTI_ADV_MAX)
+    if (i <  BTM_BleMaxMultiAdvInstanceCount())
         return i;
 
     // If client ID if is not found, then write both values
-    for(i=0; i < BTM_BLE_MULTI_ADV_MAX; i++)
+    for (i=1; i <  BTM_BleMaxMultiAdvInstanceCount(); i++)
     {
-        if(INVALID_ADV_INST == p_multi_adv_data_cb->clntif_map[i][CLNT_IF_IDX])
+        if (INVALID_ADV_INST == p_multi_adv_data_cb->clntif_map[i + i])
         {
-             p_multi_adv_data_cb->clntif_map[i][CLNT_IF_IDX] = client_if;
-             if(inst_id != INVALID_ADV_INST)
-                p_multi_adv_data_cb->clntif_map[i][INST_ID_IDX] = inst_id;
-             else
-                p_multi_adv_data_cb->clntif_map[i][INST_ID_IDX] = (i + 1);
-             BTIF_TRACE_DEBUG("%s -Not found - Index:%d, client_if: %d, Inst ID: %d",
+            p_multi_adv_data_cb->clntif_map[i + i] = client_if;
+            if (inst_id != INVALID_ADV_INST)
+               p_multi_adv_data_cb->clntif_map[i + (i + 1)] = inst_id;
+            else
+                p_multi_adv_data_cb->clntif_map[i + (i + 1)] = (i + 1);
+            BTIF_TRACE_DEBUG("%s -Not found - Index:%d, client_if: %d, Inst ID: %d",
                             __FUNCTION__,i,
-                            p_multi_adv_data_cb->clntif_map[i][CLNT_IF_IDX],
-                            p_multi_adv_data_cb->clntif_map[i][INST_ID_IDX]);
-             break;
+                            p_multi_adv_data_cb->clntif_map[i + i],
+                            p_multi_adv_data_cb->clntif_map[i + (i + 1)]);
+            break;
         }
     }
 
-    if(i < BTM_BLE_MULTI_ADV_MAX)
+    if (i <  BTM_BleMaxMultiAdvInstanceCount())
         return i;
     return INVALID_ADV_INST;
 }
 
 int btif_multi_adv_instid_for_clientif(int client_if)
 {
-    int i=0, ret = INVALID_ADV_INST;
+    int i=1, ret = INVALID_ADV_INST;
 
     btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
 
-    if(NULL == p_multi_adv_data_cb)
+    if (NULL == p_multi_adv_data_cb)
         return INVALID_ADV_INST;
 
     // Retrieve the existing inst_id for the client_if value
-    for(i=0; i < BTM_BLE_MULTI_ADV_MAX; i++)
+    for (i=1; i <  BTM_BleMaxMultiAdvInstanceCount(); i++)
     {
-       if(client_if == p_multi_adv_data_cb->clntif_map[i][CLNT_IF_IDX])
-          ret = p_multi_adv_data_cb->clntif_map[i][INST_ID_IDX];
+       if (client_if == p_multi_adv_data_cb->clntif_map[i + i])
+       {
+           BTIF_TRACE_DEBUG("%s - Client if found", __FUNCTION__, client_if);
+           ret = p_multi_adv_data_cb->clntif_map[i + (i + 1)];
+       }
     }
 
-    if(ret != INVALID_ADV_INST)
-        return ret;
-
-    return INVALID_ADV_INST;
+    return ret;
 }
 
-
-int btif_gattc_obtain_idx_for_datacb(int value, int arrindex)
+int btif_gattc_obtain_idx_for_datacb(int value, int clnt_inst_index)
 {
-    int i=0;
+    int i=1;
 
     btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
 
-    if(NULL == p_multi_adv_data_cb)
+    if (NULL == p_multi_adv_data_cb)
         return INVALID_ADV_INST;
 
     // Retrieve the array index for the inst_id value
-    for(i=0; i < BTM_BLE_MULTI_ADV_MAX; i++)
+    for (i=1; i <  BTM_BleMaxMultiAdvInstanceCount(); i++)
     {
-       if(value == p_multi_adv_data_cb->clntif_map[i][arrindex])
+       if (value == p_multi_adv_data_cb->clntif_map[i + (i + clnt_inst_index)])
            break;
     }
 
-    if(i < BTM_BLE_MULTI_ADV_MAX)
+    if (i <  BTM_BleMaxMultiAdvInstanceCount())
     {
-        BTIF_TRACE_DEBUG("%s, %d",__FUNCTION__,i+1);
-        return (i + 1);
+        BTIF_TRACE_DEBUG("%s, %d",__FUNCTION__,i);
+        return i;
     }
 
     BTIF_TRACE_DEBUG("%s Invalid instance",__FUNCTION__);
@@ -211,21 +241,21 @@ void btif_gattc_adv_data_packager(int client_if, bool set_scan_rsp,
     p_multi_adv_inst->appearance = appearance;
     p_multi_adv_inst->manufacturer_len = manufacturer_len;
 
-    if(manufacturer_len > 0)
+    if (manufacturer_len > 0)
     {
         p_multi_adv_inst->p_manufacturer_data = GKI_getbuf(manufacturer_len);
         memcpy(p_multi_adv_inst->p_manufacturer_data, manufacturer_data, manufacturer_len);
     }
 
     p_multi_adv_inst->service_data_len = service_data_len;
-    if(service_data_len > 0)
+    if (service_data_len > 0)
     {
         p_multi_adv_inst->p_service_data = GKI_getbuf(service_data_len);
         memcpy(p_multi_adv_inst->p_service_data, service_data, service_data_len);
     }
 
     p_multi_adv_inst->service_uuid_len = service_uuid_len;
-    if(service_uuid_len > 0)
+    if (service_uuid_len > 0)
     {
         p_multi_adv_inst->p_service_uuid = GKI_getbuf(service_uuid_len);
         memcpy(p_multi_adv_inst->p_service_uuid, service_uuid, service_uuid_len);
@@ -236,7 +266,7 @@ BOOLEAN btif_gattc_copy_datacb(int cbindex, btif_adv_data_t *p_adv_data, BOOLEAN
 {
     int i=0;
     btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
-    if(NULL == p_multi_adv_data_cb || cbindex < 0)
+    if (NULL == p_multi_adv_data_cb || cbindex < 0)
        return false;
 
     BTIF_TRACE_DEBUG("%s", __FUNCTION__);
@@ -265,7 +295,7 @@ BOOLEAN btif_gattc_copy_datacb(int cbindex, btif_adv_data_t *p_adv_data, BOOLEAN
                                         p_adv_data->max_interval;
     }
     else
-    if(true == bInstData)
+    if (true == bInstData)
     {
         if (p_multi_adv_data_cb->inst_cb[cbindex].param.adv_int_min > 0 &&
             p_multi_adv_data_cb->inst_cb[cbindex].param.adv_int_max > 0 &&
@@ -295,7 +325,7 @@ BOOLEAN btif_gattc_copy_datacb(int cbindex, btif_adv_data_t *p_adv_data, BOOLEAN
     {
          p_multi_adv_data_cb->inst_cb[cbindex].data.p_manu =
                             GKI_getbuf(sizeof(tBTA_BLE_MANU));
-         if(p_multi_adv_data_cb->inst_cb[cbindex].data.p_manu != NULL)
+         if (p_multi_adv_data_cb->inst_cb[cbindex].data.p_manu != NULL)
          {
             p_multi_adv_data_cb->inst_cb[cbindex].data.p_manu->p_val =
                             GKI_getbuf(p_adv_data->manufacturer_len);
@@ -423,16 +453,16 @@ void btif_gattc_clear_clientif(int client_if)
 
     btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
 
-    if(NULL == p_multi_adv_data_cb)
+    if (NULL == p_multi_adv_data_cb)
         return;
 
     // Clear both the inst_id and client_if values
-    for(i=0; i < BTM_BLE_MULTI_ADV_MAX; i++)
+    for (i=0; i <  BTM_BleMaxMultiAdvInstanceCount(); i++)
     {
-       if(client_if == p_multi_adv_data_cb->clntif_map[i][CLNT_IF_IDX])
+       if (client_if == p_multi_adv_data_cb->clntif_map[i + i])
        {
-          p_multi_adv_data_cb->clntif_map[i][INST_ID_IDX] = INVALID_ADV_INST;
-          p_multi_adv_data_cb->clntif_map[i][CLNT_IF_IDX] = INVALID_ADV_INST;
+          p_multi_adv_data_cb->clntif_map[i + (i + 1)] = INVALID_ADV_INST;
+          p_multi_adv_data_cb->clntif_map[i + i] = INVALID_ADV_INST;
           BTIF_TRACE_DEBUG("Cleaning up index %d for clnt_if :%d,", i, client_if);
           break;
        }
@@ -443,23 +473,23 @@ void btif_gattc_cleanup_inst_cb(int inst_id)
 {
     int cbindex = 0;
     // Check for invalid instance id
-    if (inst_id < 0 || inst_id > BTM_BLE_MULTI_ADV_MAX)
+    if (inst_id < 0 || inst_id >= BTM_BleMaxMultiAdvInstanceCount())
         return;
 
     btgatt_multi_adv_common_data *p_multi_adv_data_cb = btif_obtain_multi_adv_data_cb();
 
-    if(NULL == p_multi_adv_data_cb)
+    if (NULL == p_multi_adv_data_cb)
         return;
 
-    if(inst_id > 0)
+    if (inst_id > 0)
     {
         cbindex = btif_gattc_obtain_idx_for_datacb(inst_id, INST_ID_IDX);
         if (cbindex < 0)
             return;
     }
     else
-    if(STD_ADV_INSTID == inst_id)
-      cbindex = STD_ADV_INSTID;
+    if (STD_ADV_INSTID == inst_id)
+       cbindex = STD_ADV_INSTID;
 
     BTIF_TRACE_DEBUG("Cleaning up multi_inst_cb for inst_id %d, cbindex %d", inst_id, cbindex);
     btif_gattc_cleanup_multi_inst_cb(&p_multi_adv_data_cb->inst_cb[cbindex]);
@@ -533,7 +563,7 @@ void btif_gattc_cleanup_multi_inst_cb(btgatt_multi_adv_inst_cb *p_multi_inst_cb)
         GKI_freebuf(p_multi_inst_cb->data.p_sol_service_32b);
     }
 
-    if(p_multi_inst_cb->data.p_sol_service_128b != NULL)
+    if (p_multi_inst_cb->data.p_sol_service_128b != NULL)
         GKI_freebuf(p_multi_inst_cb->data.p_sol_service_128b);
 }
 
index b92e7ce..4be917e 100644 (file)
@@ -1308,18 +1308,9 @@ and USER_HW_DISABLE_API macros */
 #define BLE_PRIVACY_SPT         TRUE
 #endif
 
-#ifndef BLE_MULTI_ADV_INCLUDED
-#define BLE_MULTI_ADV_INCLUDED  TRUE
-#endif
-
 #ifndef BLE_VND_INCLUDED
-#define BLE_VND_INCLUDED        TRUE
+#define BLE_VND_INCLUDED        FALSE
 #endif
-
-#ifndef BLE_BATCH_SCAN_INCLUDED
-#define BLE_BATCH_SCAN_INCLUDED  TRUE
-#endif
-
 /******************************************************************************
 **
 ** ATT/GATT Protocol/Profile Settings
index b189281..3e3c1ad 100644 (file)
@@ -18,7 +18,7 @@
 
 /******************************************************************************
  *
- *  This module contains the routines that initialize the stack components. 
+ *  This module contains the routines that initialize the stack components.
  *  It must be called before the BTU task is started.
  *
  ******************************************************************************/
index e7fda01..3b10622 100644 (file)
@@ -294,7 +294,6 @@ void btm_acl_created (BD_ADDR bda, DEV_CLASS dc, BD_NAME bdn,
             p->transport = transport;
             if (transport == BT_TRANSPORT_LE)
             {
-#if ( BLE_PRIVACY_SPT == TRUE )
                 /*allow central device to use random address for now by skipping the role check */
                 if (btm_cb.ble_ctr_cb.privacy /* && p->link_role == HCI_ROLE_SLAVE */)
                 {
@@ -302,7 +301,6 @@ void btm_acl_created (BD_ADDR bda, DEV_CLASS dc, BD_NAME bdn,
                     memcpy(p->conn_addr, btm_cb.ble_ctr_cb.addr_mgnt_cb.private_addr, BD_ADDR_LEN);
                 }
                 else
-#endif
                 {
                     p->conn_addr_type = BLE_ADDR_PUBLIC;
                     BTM_GetLocalDeviceAddr(p->conn_addr);
index 0036d92..9ba0584 100644 (file)
@@ -38,9 +38,7 @@
 #include "gap_api.h"
 #include "bt_utils.h"
 
-#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
 #include "vendor_ble.h"
-#endif
 
 #if SMP_INCLUDED == TRUE
 extern BOOLEAN AES_CMAC ( BT_OCTET16 key, UINT8 *input, UINT16 length, UINT16 tlen, UINT8 *p_signature);
@@ -48,7 +46,6 @@ extern void smp_link_encrypted(BD_ADDR bda, UINT8 encr_enable);
 extern BOOLEAN smp_proc_ltk_request(BD_ADDR bda);
 #endif
 extern void gatt_notify_enc_cmpl(BD_ADDR bd_addr);
-
 /*******************************************************************************/
 /* External Function to be called by other modules                             */
 /*******************************************************************************/
@@ -1619,9 +1616,8 @@ void btm_ble_connected (UINT8 *bda, UINT16 handle, UINT8 enc_mode, UINT8 role,
     if (p_dev_rec->ble.ble_addr_type == BLE_ADDR_RANDOM && !addr_matched)
         memcpy(p_dev_rec->ble.cur_rand_addr, bda, BD_ADDR_LEN);
 
-#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
-    btm_ble_vendor_disable_irk_list();
-#endif
+    if (btm_cb.cmn_ble_vsc_cb.rpa_offloading == TRUE)
+        btm_ble_vendor_disable_irk_list();
 #endif
 
     if (role == HCI_ROLE_SLAVE)
@@ -1658,12 +1654,13 @@ void btm_ble_conn_complete(UINT8 *p, UINT16 evt_len)
     if (status == 0)
     {
 #if (BLE_PRIVACY_SPT == TRUE )
-#if (BLE_VND_INCLUDED == TRUE)
-        match = btm_public_addr_to_random_pseudo (bda, &bda_type);
-#endif
-        /* Possibly receiving connection complete with a resolvable random address
-           for a device that has been paired */
-        if (!match && BTM_BLE_IS_RESOLVE_BDA(bda))
+
+        if (btm_cb.cmn_ble_vsc_cb.rpa_offloading == TRUE)
+            match = btm_public_addr_to_random_pseudo (bda, &bda_type);
+
+        /* possiblly receive connection complete with resolvable random on
+           slave role while the device has been paired */
+        if (!match && role == HCI_ROLE_SLAVE && BTM_BLE_IS_RESOLVE_BDA(bda))
         {
             btm_ble_resolve_random_addr(bda, btm_ble_resolve_random_addr_on_conn_cmpl, p_data);
         }
index 1f5654a..e560ee7 100644 (file)
@@ -34,9 +34,7 @@
 #include "btm_ble_int.h"
 #include "smp_api.h"
 
-#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
 #include "vendor_ble.h"
-#endif
 
 /*******************************************************************************
 **
@@ -348,7 +346,7 @@ void btm_ble_resolve_random_addr(BD_ADDR random_bda, tBTM_BLE_RESOLVE_CBACK * p_
                 /* atch found or went through the list */
                 break;
             }
-               p_mgnt_cb->index ++;
+            p_mgnt_cb->index ++;
         }
     }
     else
@@ -382,8 +380,6 @@ tBLE_ADDR_TYPE btm_ble_map_bda_to_conn_bda(BD_ADDR bd_addr)
         return BLE_ADDR_PUBLIC;
 }
 
-#if BLE_PRIVACY_SPT == TRUE
-#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
 /*******************************************************************************
 **
 ** Function         btm_find_dev_by_public_static_addr
@@ -395,7 +391,7 @@ tBTM_SEC_DEV_REC* btm_find_dev_by_public_static_addr(BD_ADDR bd_addr)
 {
     UINT8               i;
     tBTM_SEC_DEV_REC    *p_dev_rec = &btm_cb.sec_dev_rec[0];
-
+#if BLE_PRIVACY_SPT == TRUE
     for (i = 0; i < BTM_SEC_MAX_DEVICE_RECORDS; i ++, p_dev_rec ++)
     {
         if (p_dev_rec->ble.ble_addr_type == BLE_ADDR_RANDOM &&
@@ -409,6 +405,7 @@ tBTM_SEC_DEV_REC* btm_find_dev_by_public_static_addr(BD_ADDR bd_addr)
             }
         }
     }
+#endif
     return NULL;
 }
 
@@ -422,6 +419,7 @@ tBTM_SEC_DEV_REC* btm_find_dev_by_public_static_addr(BD_ADDR bd_addr)
 *******************************************************************************/
 BOOLEAN btm_public_addr_to_random_pseudo(BD_ADDR bd_addr, UINT8 *p_addr_type)
 {
+#if BLE_PRIVACY_SPT == TRUE
     tBTM_SEC_DEV_REC    *p_dev_rec = btm_find_dev_by_public_static_addr(bd_addr);
 
     BTM_TRACE_EVENT ("btm_public_addr_to_random_pseudo");
@@ -443,7 +441,7 @@ BOOLEAN btm_public_addr_to_random_pseudo(BD_ADDR bd_addr, UINT8 *p_addr_type)
 
         return TRUE;
     }
-
+#endif
     return FALSE;
 }
 
@@ -457,6 +455,7 @@ BOOLEAN btm_public_addr_to_random_pseudo(BD_ADDR bd_addr, UINT8 *p_addr_type)
 *******************************************************************************/
 BOOLEAN btm_random_pseudo_to_public(BD_ADDR random_pseudo, UINT8 *p_static_addr_type)
 {
+#if BLE_PRIVACY_SPT == TRUE
     tBTM_SEC_DEV_REC    *p_dev_rec = btm_find_dev (random_pseudo);
 
     if (p_dev_rec != NULL)
@@ -471,7 +470,7 @@ BOOLEAN btm_random_pseudo_to_public(BD_ADDR random_pseudo, UINT8 *p_static_addr_
             return TRUE;
         }
     }
-
+#endif
     return FALSE;
 }
 
@@ -485,6 +484,7 @@ BOOLEAN btm_random_pseudo_to_public(BD_ADDR random_pseudo, UINT8 *p_static_addr_
 *******************************************************************************/
 void btm_ble_refresh_rra(BD_ADDR static_bda, BD_ADDR rra)
 {
+#if BLE_PRIVACY_SPT == TRUE
     tBTM_SEC_DEV_REC    *p_sec_rec = btm_find_dev_by_public_static_addr(static_bda);
     tACL_CONN           *p_acl = btm_bda_to_acl (p_sec_rec->bd_addr, BT_TRANSPORT_LE);
     UINT8               rra_dummy = FALSE;
@@ -520,10 +520,8 @@ void btm_ble_refresh_rra(BD_ADDR static_bda, BD_ADDR rra)
     {
         BTM_TRACE_ERROR("No matching known device in record");
     }
-
+#endif
 }
-#endif /* CS support */
-#endif  /* privacy support */
 #endif
 
 
index e11c924..4efaf8b 100644 (file)
@@ -20,7 +20,6 @@
 #include "bt_target.h"
 
 #if (BLE_INCLUDED == TRUE)
-#if BLE_BATCH_SCAN_INCLUDED == TRUE
 #include "bt_types.h"
 #include "hcimsgs.h"
 #include "btu.h"
@@ -59,6 +58,33 @@ static UINT8 btm_ble_cs_update_pf_counter(tBTM_BLE_SCAN_COND_OP action,
 #define BTM_BLE_ADV_FILT_CB_EVT_MASK       0xF0
 #define BTM_BLE_ADV_FILT_SUBCODE_MASK      0x0F
 
+/*******************************************************************************
+**
+** Function         btm_ble_obtain_vsc_details
+**
+** Description      This function obtains the VSC details
+**
+** Parameters
+**
+** Returns          status
+**
+*******************************************************************************/
+tBTM_STATUS btm_ble_obtain_vsc_details()
+{
+    tBTM_STATUS st = BTM_SUCCESS;
+
+#if BLE_VND_INCLUDED == TRUE
+    BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+    if (0 == cmn_ble_vsc_cb.max_filter)
+    {
+        st = BTM_MODE_UNSUPPORTED;
+        return st;
+    }
+#else
+    cmn_ble_vsc_cb.max_filter = BTM_BLE_MAX_FILTER_COUNTER;
+#endif
+    return st;
+}
 
 /*******************************************************************************
 **
@@ -241,7 +267,7 @@ void btm_ble_scan_pf_cmpl_cback(tBTM_VSC_CMPL *p_params)
     STREAM_TO_UINT8(action, p);
 
     /* Ignore the event, if it is not the same one expected */
-    if(3 == evt_len)
+    if (3 == evt_len)
     {
         if(ocf != op_subcode)
         {
@@ -329,10 +355,10 @@ void btm_ble_scan_pf_cmpl_cback(tBTM_VSC_CMPL *p_params)
 tBTM_BLE_PF_COUNT* btm_ble_find_addr_filter_counter(tBLE_BD_ADDR *p_le_bda)
 {
     UINT8               i;
-    tBTM_BLE_PF_COUNT   *p_addr_filter = &btm_ble_adv_filt_cb.addr_filter_count[1];
+    tBTM_BLE_PF_COUNT   *p_addr_filter = &btm_ble_adv_filt_cb.p_addr_filter_count[1];
 
     if (p_le_bda == NULL)
-        return &btm_ble_adv_filt_cb.addr_filter_count[0];
+        return &btm_ble_adv_filt_cb.p_addr_filter_count[0];
 
     for (i = 0; i < cmn_ble_vsc_cb.max_filter; i ++, p_addr_filter ++)
     {
@@ -357,7 +383,7 @@ tBTM_BLE_PF_COUNT* btm_ble_find_addr_filter_counter(tBLE_BD_ADDR *p_le_bda)
 tBTM_BLE_PF_COUNT * btm_ble_alloc_addr_filter_counter(BD_ADDR bd_addr)
 {
     UINT8               i;
-    tBTM_BLE_PF_COUNT   *p_addr_filter = &btm_ble_adv_filt_cb.addr_filter_count[1];
+    tBTM_BLE_PF_COUNT   *p_addr_filter = &btm_ble_adv_filt_cb.p_addr_filter_count[1];
 
     for (i = 0; i < cmn_ble_vsc_cb.max_filter; i ++, p_addr_filter ++)
     {
@@ -382,11 +408,11 @@ tBTM_BLE_PF_COUNT * btm_ble_alloc_addr_filter_counter(BD_ADDR bd_addr)
 BOOLEAN btm_ble_dealloc_addr_filter_counter(tBLE_BD_ADDR *p_bd_addr, UINT8 filter_type)
 {
     UINT8               i;
-    tBTM_BLE_PF_COUNT   *p_addr_filter = &btm_ble_adv_filt_cb.addr_filter_count[1];
+    tBTM_BLE_PF_COUNT   *p_addr_filter = &btm_ble_adv_filt_cb.p_addr_filter_count[1];
     BOOLEAN             found = FALSE;
 
     if (BTM_BLE_PF_TYPE_ALL == filter_type && NULL == p_bd_addr)
-        memset(&btm_ble_adv_filt_cb.addr_filter_count[0], 0, sizeof(tBTM_BLE_PF_COUNT));
+        memset(&btm_ble_adv_filt_cb.p_addr_filter_count[0], 0, sizeof(tBTM_BLE_PF_COUNT));
 
     for (i = 0; i < cmn_ble_vsc_cb.max_filter; i ++, p_addr_filter ++)
     {
@@ -516,7 +542,7 @@ tBTM_STATUS btm_ble_update_pf_manu_data(tBTM_BLE_SCAN_COND_OP action,
           len = BTM_BLE_ADV_FILT_META_HDR_LENGTH;
     tBTM_STATUS st = BTM_ILLEGAL_VALUE;
 
-    if(NULL!= p_data && 0 == p_data->manu_data.data_len && 0 == p_data->srvc_data.data_len)
+    if (NULL!= p_data && 0 == p_data->manu_data.data_len && 0 == p_data->srvc_data.data_len)
         return st;
 
     memset(param, 0, BTM_BLE_PF_STR_LEN_MAX + BTM_BLE_PF_STR_LEN_MAX
@@ -546,7 +572,7 @@ tBTM_STATUS btm_ble_update_pf_manu_data(tBTM_BLE_SCAN_COND_OP action,
             if (p_srvc_data->data_len > (BTM_BLE_PF_STR_LEN_MAX - 2))
                 p_srvc_data->data_len = (BTM_BLE_PF_STR_LEN_MAX - 2);
 
-            if(p_srvc_data->data_len > 0)
+            if (p_srvc_data->data_len > 0)
             {
                 ARRAY_TO_STREAM(p, p_srvc_data->p_pattern, p_srvc_data->data_len);
                 len += (p_srvc_data->data_len);
@@ -565,7 +591,7 @@ tBTM_STATUS btm_ble_update_pf_manu_data(tBTM_BLE_SCAN_COND_OP action,
 
            UINT16_TO_STREAM(p, p_manu_data->company_id);
 
-           if(p_manu_data->data_len > 0)
+           if (p_manu_data->data_len > 0)
                 ARRAY_TO_STREAM(p, p_manu_data->p_pattern, p_manu_data->data_len);
            len += (p_manu_data->data_len + 2);
 
@@ -579,7 +605,7 @@ tBTM_STATUS btm_ble_update_pf_manu_data(tBTM_BLE_SCAN_COND_OP action,
                p += 2;
            }
 
-           if(p_manu_data->data_len > 0)
+           if (p_manu_data->data_len > 0)
               ARRAY_TO_STREAM(p, p_manu_data->p_pattern_mask, p_manu_data->data_len);
            len += (p_manu_data->data_len + 2);
 
@@ -620,7 +646,7 @@ UINT8 btm_ble_cs_update_pf_counter(tBTM_BLE_SCAN_COND_OP action,
     tBTM_BLE_PF_COUNT   *p_addr_filter = NULL;
     UINT8               *p_counter = NULL;
 
-    BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
+    btm_ble_obtain_vsc_details();
 
     if (cond_type > BTM_BLE_PF_TYPE_ALL)
     {
@@ -655,18 +681,11 @@ UINT8 btm_ble_cs_update_pf_counter(tBTM_BLE_SCAN_COND_OP action,
         else if (cond_type != BTM_BLE_PF_TYPE_ALL)
         {
             p_counter = p_addr_filter->pf_counter;
-            if(num_available > 0)
-               p_counter[cond_type] += 1;
-
-            /* update corresponding feature mask */
             if (num_available > 0)
-                p_addr_filter->feat_mask |= (BTM_BLE_PF_BIT_TO_MASK(cond_type));
-            else
-                p_addr_filter->feat_mask &= ~(BTM_BLE_PF_BIT_TO_MASK(cond_type));
+                p_counter[cond_type] += 1;
 
-            BTM_TRACE_DEBUG("counter = %d, maxfilt = %d, num_avbl=%d, feat_mask = %d",
-                p_counter[cond_type], cmn_ble_vsc_cb.max_filter, num_available,
-                p_addr_filter->feat_mask);
+            BTM_TRACE_DEBUG("counter = %d, maxfilt = %d, num_avbl=%d",
+                p_counter[cond_type], cmn_ble_vsc_cb.max_filter, num_available);
             return p_counter[cond_type];
         }
     }
@@ -918,8 +937,8 @@ tBTM_STATUS btm_ble_clear_scan_pf_filter(tBTM_BLE_SCAN_COND_OP action,
     p_bda_filter = btm_ble_find_addr_filter_counter(p_target);
 
     if (NULL == p_bda_filter ||
-        /* not a generic filter, and feature selection is empty */
-        (p_target != NULL && p_bda_filter && 0 == p_bda_filter->feat_mask))
+        /* not a generic filter */
+        (p_target != NULL && p_bda_filter))
     {
         BTM_TRACE_ERROR("Error: Can not clear filter, No PF filter has been configured!");
         return st;
@@ -982,9 +1001,6 @@ tBTM_STATUS btm_ble_clear_scan_pf_filter(tBTM_BLE_SCAN_COND_OP action,
                                 btm_ble_scan_pf_cmpl_cback))
             != BTM_NO_RESOURCES)
     {
-        if (p_bda_filter)
-            p_bda_filter->feat_mask = BTM_BLE_PF_SELECT_NONE;
-
         if (p_target)
             memcpy(&btm_ble_adv_filt_cb.cur_filter_target, p_target, sizeof(tBLE_BD_ADDR));
         else
@@ -1020,17 +1036,13 @@ tBTM_STATUS BTM_BleAdvFilterParamSetup(int action, tBTM_BLE_PF_FILT_INDEX filt_i
     tBTM_BLE_PF_COUNT *p_bda_filter = NULL;
     UINT8 len =0;
 
+    if (BTM_SUCCESS  != btm_ble_obtain_vsc_details())
+        return st;
+
     p = param;
     memset(param, 0, 20);
     BTM_TRACE_EVENT (" BTM_BleAdvFilterParamSetup");
 
-    BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
-    if (0 == cmn_ble_vsc_cb.max_filter)
-    {
-        st = BTM_MODE_UNSUPPORTED;
-        return st;
-    }
-
     if (BTM_BLE_SCAN_COND_ADD == action)
     {
         p_bda_filter = btm_ble_find_addr_filter_counter(p_target);
@@ -1040,7 +1052,7 @@ tBTM_STATUS BTM_BleAdvFilterParamSetup(int action, tBTM_BLE_PF_FILT_INDEX filt_i
            return st;
         }
 
-        BTM_TRACE_DEBUG("BTM_BleAdvFilterParamSetup : Feat mask:%d", p_bda_filter->feat_mask);
+        BTM_TRACE_DEBUG("BTM_BleAdvFilterParamSetup : Feat mask:%d", p_filt_params->feat_seln);
         /* select feature based on control block settings */
         UINT8_TO_STREAM(p, BTM_BLE_META_PF_FEAT_SEL);
         UINT8_TO_STREAM(p, BTM_BLE_SCAN_COND_ADD);
@@ -1059,7 +1071,7 @@ tBTM_STATUS BTM_BleAdvFilterParamSetup(int action, tBTM_BLE_PF_FILT_INDEX filt_i
         /* set delivery mode */
         UINT8_TO_STREAM(p, p_filt_params->dely_mode);
 
-        if(0x01 == p_filt_params->dely_mode)
+        if (0x01 == p_filt_params->dely_mode)
         {
             /* set onfound timeout */
             UINT16_TO_STREAM(p, p_filt_params->found_timeout);
@@ -1085,7 +1097,7 @@ tBTM_STATUS BTM_BleAdvFilterParamSetup(int action, tBTM_BLE_PF_FILT_INDEX filt_i
                                  ref_value, NULL, p_cmpl_cback);
     }
     else
-    if(BTM_BLE_SCAN_COND_DELETE == action)
+    if (BTM_BLE_SCAN_COND_DELETE == action)
     {
         /* select feature based on control block settings */
         UINT8_TO_STREAM(p, BTM_BLE_META_PF_FEAT_SEL);
@@ -1105,7 +1117,7 @@ tBTM_STATUS BTM_BleAdvFilterParamSetup(int action, tBTM_BLE_PF_FILT_INDEX filt_i
                                  ref_value, NULL, p_cmpl_cback);
     }
     else
-    if(BTM_BLE_SCAN_COND_CLEAR == action)
+    if (BTM_BLE_SCAN_COND_CLEAR == action)
     {
         /* Deallocate all filters here */
         btm_ble_dealloc_addr_filter_counter(NULL, BTM_BLE_PF_TYPE_ALL);
@@ -1149,12 +1161,8 @@ tBTM_STATUS BTM_BleEnableDisableFilterFeature(UINT8 enable,
     UINT8           param[20], *p;
     tBTM_STATUS     st = BTM_WRONG_MODE;
 
-    BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
-    if (0 == cmn_ble_vsc_cb.max_filter)
-    {
-        st = BTM_MODE_UNSUPPORTED;
-        return st;
-    }
+    if (BTM_SUCCESS  != btm_ble_obtain_vsc_details())
+       return st;
 
     p = param;
     memset(param, 0, 20);
@@ -1205,12 +1213,8 @@ tBTM_STATUS BTM_BleCfgFilterCondition(tBTM_BLE_SCAN_COND_OP action,
     BTM_TRACE_EVENT (" BTM_BleCfgFilterCondition action:%d, cond_type:%d, index:%d", action,
                         cond_type, filt_index);
 
-    BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
-    if (0 == cmn_ble_vsc_cb.max_filter)
-    {
-        st = BTM_MODE_UNSUPPORTED;
+    if (BTM_SUCCESS  != btm_ble_obtain_vsc_details())
         return st;
-    }
 
     switch (cond_type)
     {
@@ -1279,9 +1283,34 @@ tBTM_STATUS BTM_BleCfgFilterCondition(tBTM_BLE_SCAN_COND_OP action,
 void btm_ble_adv_filter_init(void)
 {
     memset(&btm_ble_adv_filt_cb, 0, sizeof(tBTM_BLE_MULTI_ADV_CB));
+    if (BTM_SUCCESS != btm_ble_obtain_vsc_details())
+       return;
+
+    if (cmn_ble_vsc_cb.max_filter > 0)
+    {
+        btm_ble_adv_filt_cb.p_addr_filter_count =
+            (tBTM_BLE_PF_COUNT*) GKI_getbuf( sizeof(tBTM_BLE_PF_COUNT) * cmn_ble_vsc_cb.max_filter);
+    }
+
     if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
         return;
 }
 
-#endif
+/*******************************************************************************
+**
+** Function         btm_ble_adv_filter_cleanup
+**
+** Description      This function de-initializes the adv filter control block
+**
+** Parameters
+**
+** Returns          status
+**
+*******************************************************************************/
+void btm_ble_adv_filter_cleanup(void)
+{
+    if (btm_ble_adv_filt_cb.p_addr_filter_count)
+        GKI_freebuf (btm_ble_adv_filt_cb.p_addr_filter_count);
+}
+
 #endif
index b38e015..8947e1d 100644 (file)
@@ -27,7 +27,7 @@
 #include "btm_int.h"
 #include "hcimsgs.h"
 
-#if (BLE_INCLUDED == TRUE && BLE_BATCH_SCAN_INCLUDED == TRUE)
+#if (BLE_INCLUDED == TRUE)
 
 tBTM_BLE_BATCH_SCAN_CB ble_batchscan_cb;
 tBTM_BLE_ADV_TRACK_CB ble_advtrack_cb;
@@ -352,52 +352,28 @@ void btm_ble_batchscan_vsc_cmpl_cback (tBTM_VSC_CMPL *p_params)
     {
         case BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEATURE:
         {
-            if (BTM_SUCCESS == status && BTM_BLE_SCAN_ENABLE_CALLED == cur_state)
-                ble_batchscan_cb.cur_state = BTM_BLE_SCAN_ENABLED_STATE;
-            else
-            if (BTM_BLE_SCAN_ENABLE_CALLED == cur_state)
-            {
-                BTM_TRACE_ERROR("SCAN_ENB_DISAB_CUST_FEATURE - Invalid state after enb");
-                ble_batchscan_cb.cur_state = BTM_BLE_SCAN_INVALID_STATE;
-            }
-
-            if (BTM_SUCCESS == status && BTM_BLE_SCAN_DISABLE_CALLED == cur_state)
-                ble_batchscan_cb.cur_state = BTM_BLE_SCAN_DISABLED_STATE;
-            else
-            if (BTM_BLE_SCAN_DISABLE_CALLED == cur_state)
-            {
-                 BTM_TRACE_ERROR("SCAN_ENB_DISAB_CUST_FEATURE - Invalid state after disabled");
+             if (BTM_SUCCESS == status && BTM_BLE_SCAN_ENABLE_CALLED == cur_state)
+                 ble_batchscan_cb.cur_state = BTM_BLE_SCAN_ENABLED_STATE;
+             else
+             if (BTM_BLE_SCAN_ENABLE_CALLED == cur_state)
+             {
+                 BTM_TRACE_ERROR("SCAN_ENB_DISAB_CUST_FEATURE - Invalid state after enb");
                  ble_batchscan_cb.cur_state = BTM_BLE_SCAN_INVALID_STATE;
-            }
-            BTM_TRACE_DEBUG("BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEAT status = %d, state: %d,evt=%d",
-                status, ble_batchscan_cb.cur_state, cb_evt);
+             }
 
-            /* Clear the queues here */
-            if(BTM_SUCCESS == status && BTM_BLE_SCAN_DISABLE_CALLED == cur_state)
-            {
-                for (index = 0; index < BTM_BLE_BATCH_REP_MAIN_Q_SIZE; index++)
-                {
-                    ble_batchscan_cb.main_rep_q.rep_mode[index] = 0;
-                    if (NULL != ble_batchscan_cb.main_rep_q.p_data[index])
-                        GKI_freebuf(ble_batchscan_cb.main_rep_q.p_data[index]);
-                    ble_batchscan_cb.main_rep_q.p_data[index] = NULL;
-                    ble_batchscan_cb.main_rep_q.ref_value[index] = 0;
-                    ble_batchscan_cb.main_rep_q.num_records[index] = 0;
-                }
-
-                for (index = 0; index < BTM_BLE_BATCH_SCAN_MAX; index++)
-                {
-                    ble_batchscan_cb.op_q.sub_code[index] = 0;
-                    ble_batchscan_cb.op_q.ref_value[index] = 0;
-                    ble_batchscan_cb.op_q.cur_state[index] = 0;
-                }
-                ble_batchscan_cb.op_q.pending_idx = 0;
-                ble_batchscan_cb.op_q.next_idx = 0;
-            }
-
-            if (cb_evt != 0 && NULL != ble_batchscan_cb.p_setup_cback)
+             if (BTM_SUCCESS == status && BTM_BLE_SCAN_DISABLE_CALLED == cur_state)
+                ble_batchscan_cb.cur_state = BTM_BLE_SCAN_DISABLED_STATE;
+             else
+             if (BTM_BLE_SCAN_DISABLE_CALLED == cur_state)
+             {
+                BTM_TRACE_ERROR("SCAN_ENB_DISAB_CUST_FEATURE - Invalid state after disabled");
+                ble_batchscan_cb.cur_state = BTM_BLE_SCAN_INVALID_STATE;
+             }
+             BTM_TRACE_DEBUG("BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEAT status = %d, state: %d,evt=%d",
+                                status, ble_batchscan_cb.cur_state, cb_evt);
+             if (cb_evt != 0 && NULL != ble_batchscan_cb.p_setup_cback)
                 ble_batchscan_cb.p_setup_cback(cb_evt, ref_value, status);
-            break;
+             break;
         }
 
         case BTM_BLE_BATCH_SCAN_SET_STORAGE_PARAM:
@@ -413,7 +389,7 @@ void btm_ble_batchscan_vsc_cmpl_cback (tBTM_VSC_CMPL *p_params)
         {
             BTM_TRACE_DEBUG("BTM_BLE_BATCH_SCAN_SET_PARAMS status = %d,evt=%d", status, cb_evt);
             if (cb_evt != 0 && NULL != ble_batchscan_cb.p_setup_cback)
-                ble_batchscan_cb.p_setup_cback(cb_evt, ref_value, status);
+               ble_batchscan_cb.p_setup_cback(cb_evt, ref_value, status);
             break;
         }
 
@@ -647,8 +623,8 @@ tBTM_STATUS BTM_BleSetStorageConfig(UINT8 batch_scan_full_max, UINT8 batch_scan_
          BTM_BLE_SCAN_DISABLE_CALLED == ble_batchscan_cb.cur_state)
     {
          status = btm_ble_enable_disable_batchscan(TRUE);
-         if (BTM_CMD_STARTED != status)
-             return status;
+        if (BTM_CMD_STARTED != status)
+            return status;
          ble_batchscan_cb.cur_state = BTM_BLE_SCAN_ENABLE_CALLED;
          btm_ble_batchscan_enq_op_q(BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEATURE,
                                     BTM_BLE_SCAN_ENABLE_CALLED, 0, ref_value);
@@ -657,8 +633,8 @@ tBTM_STATUS BTM_BleSetStorageConfig(UINT8 batch_scan_full_max, UINT8 batch_scan_
     status = btm_ble_set_storage_config(batch_scan_full_max, batch_scan_trunc_max,
                                         batch_scan_notify_threshold);
     if (BTM_CMD_STARTED != status)
-        return status;
-     /* The user needs to be provided scan config storage event */
+       return status;
+            /* The user needs to be provided scan config storage event */
      btm_ble_batchscan_enq_op_q(BTM_BLE_BATCH_SCAN_SET_STORAGE_PARAM, ble_batchscan_cb.cur_state,
                                    BTM_BLE_BATCH_SCAN_CFG_STRG_EVT, ref_value);
 
@@ -717,11 +693,11 @@ tBTM_STATUS BTM_BleEnableBatchScan(tBTM_BLE_BATCH_SCAN_MODE scan_mode,
             || BTM_BLE_SCAN_DISABLED_STATE == ble_batchscan_cb.cur_state ||
             BTM_BLE_SCAN_DISABLE_CALLED == ble_batchscan_cb.cur_state)
         {
-        status = btm_ble_enable_disable_batchscan(TRUE);
-        if (BTM_CMD_STARTED != status)
-            return status;
-        btm_ble_batchscan_enq_op_q(BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEATURE,
-                                   BTM_BLE_SCAN_ENABLE_CALLED, 0, ref_value);
+            status = btm_ble_enable_disable_batchscan(TRUE);
+            if (BTM_CMD_STARTED != status)
+               return status;
+            btm_ble_batchscan_enq_op_q(BTM_BLE_BATCH_SCAN_ENB_DISAB_CUST_FEATURE,
+                                       BTM_BLE_SCAN_ENABLE_CALLED, 0, ref_value);
         }
 
         ble_batchscan_cb.scan_mode = scan_mode;
@@ -820,17 +796,16 @@ tBTM_STATUS BTM_BleReadScanReports(tBTM_BLE_BATCH_SCAN_MODE scan_mode,
     /*  Check if the requested scan mode has already been setup by the user */
     read_scan_mode = ble_batchscan_cb.scan_mode & BTM_BLE_BATCH_SCAN_MODE_ACTI;
     if (0 == read_scan_mode)
-       read_scan_mode = ble_batchscan_cb.scan_mode & BTM_BLE_BATCH_SCAN_MODE_PASS;
+        read_scan_mode = ble_batchscan_cb.scan_mode & BTM_BLE_BATCH_SCAN_MODE_PASS;
 
     if (read_scan_mode > 0 && (BTM_BLE_BATCH_SCAN_MODE_PASS == scan_mode ||
         BTM_BLE_BATCH_SCAN_MODE_ACTI == scan_mode)
         && (BTM_BLE_SCAN_ENABLED_STATE == ble_batchscan_cb.cur_state ||
             BTM_BLE_SCAN_ENABLE_CALLED == ble_batchscan_cb.cur_state))
     {
-        status = btm_ble_batchscan_enq_rep_q(scan_mode, ref_value);
-        if (BTM_SUCCESS == status)
+        status = btm_ble_read_batchscan_reports(scan_mode, ref_value);
+        if (BTM_CMD_STARTED == status)
         {
-            status = btm_ble_read_batchscan_reports(scan_mode, ref_value);
             if (BTM_CMD_STARTED != status)
                 btm_ble_batchscan_deq_rep_data(scan_mode, &ref_value,
                                                &num_records, &p_data, &data_len);
index 30c4877..f6e2297 100644 (file)
@@ -30,9 +30,7 @@
 #include "l2c_int.h"
 #include "hcimsgs.h"
 #include "bt_utils.h"
-#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
 #include "vendor_ble.h"
-#endif
 
 #ifndef BTM_BLE_SCAN_PARAM_TOUT
 #define BTM_BLE_SCAN_PARAM_TOUT      50    /* 50 seconds */
@@ -86,12 +84,10 @@ BOOLEAN btm_add_dev_to_controller (BOOLEAN to_add, BD_ADDR bd_addr, UINT8 attr)
         {
             if (p_dev_rec->ble.ble_addr_type == BLE_ADDR_PUBLIC || !BTM_BLE_IS_RESOLVE_BDA(bd_addr))
             {
-#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
 #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
                 /* add device into IRK list */
                 btm_ble_vendor_irk_list_load_dev(p_dev_rec);
 #endif
-#endif
                 started = btsnd_hcic_ble_add_white_list (p_dev_rec->ble.ble_addr_type, bd_addr);
             }
             if (memcmp(p_dev_rec->ble.static_addr, bd_addr, BD_ADDR_LEN) != 0 &&
@@ -426,10 +422,9 @@ BOOLEAN btm_ble_start_auto_conn(BOOLEAN start)
             btsnd_hcic_ble_create_conn_cancel();
             btm_ble_set_conn_st (BLE_CONN_CANCEL);
 
-#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
 #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
-            btm_ble_vendor_disable_irk_list();
-#endif
+            if (btm_cb.cmn_ble_vsc_cb.rpa_offloading == TRUE)
+                btm_ble_vendor_disable_irk_list();
 #endif
         }
         else
@@ -513,9 +508,8 @@ BOOLEAN btm_ble_start_select_conn(BOOLEAN start,tBTM_BLE_SEL_CBACK   *p_select_c
         p_cb->p_select_cback = NULL;
 
 #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
-#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
-        btm_ble_vendor_disable_irk_list();
-#endif
+        if (btm_cb.cmn_ble_vsc_cb.rpa_offloading == TRUE)
+            btm_ble_vendor_disable_irk_list();
 #endif
 
         /* stop scanning */
index 51a34c0..83444e7 100644 (file)
 #if (GAP_INCLUDED == TRUE)
 #include "gap_api.h"
 #endif
-#if (BLE_INCLUDED == TRUE)
-#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
+
+#if BLE_INCLUDED == TRUE
+
 #include "vendor_ble.h"
-#endif
+
 #include "gattdefs.h"
 #include "gatt_int.h"
 
@@ -330,12 +331,10 @@ tBTM_STATUS BTM_BleObserve(BOOLEAN start, UINT8 duration,
                                             btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type,
                                             BTM_BLE_DEFAULT_SFP); /* assume observe always not using white list */
 
-#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
 #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
             /* enable IRK list */
             btm_ble_vendor_irk_list_known_dev (TRUE);
 #endif
-#endif
             status = btm_ble_start_scan(BTM_BLE_DUPLICATE_DISABLE);
         }
         if (status == BTM_CMD_STARTED)
@@ -435,22 +434,17 @@ static void btm_ble_vendor_capability_vsc_cmpl_cback (tBTM_VSC_CMPL *p_vcs_cplt_
 {
 #if BLE_VND_INCLUDED == TRUE
     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 ))
+    if ((p_vcs_cplt_params->opcode == HCI_BLE_VENDOR_CAP_OCF) &&(p_vcs_cplt_params->param_len > 0))
     {
         p = p_vcs_cplt_params->p_param_buf;
         STREAM_TO_UINT8  (status, p);
     }
 
-    if(status == HCI_SUCCESS)
+    if (status == HCI_SUCCESS)
     {
         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);
@@ -461,13 +455,25 @@ static void btm_ble_vendor_capability_vsc_cmpl_cback (tBTM_VSC_CMPL *p_vcs_cplt_
         STREAM_TO_UINT8  (btm_cb.cmn_ble_vsc_cb.energy_support, p);
     }
 
-    p_vcb->irk_avail_size = max_irk_list_sz;
+    BTM_TRACE_DEBUG("btm_ble_vnd_cap_vsc_cmpl_cback: stat=%d, irk=%d, ADV ins:%d, rpa=%d, ener=%d",
+         status, btm_ble_vendor_cb.irk_avail_size, btm_cb.cmn_ble_vsc_cb.adv_inst_max,
+         btm_cb.cmn_ble_vsc_cb.rpa_offloading, btm_cb.cmn_ble_vsc_cb.energy_support);
+
+    if (BTM_BleMaxMultiAdvInstanceCount() > 0)
+        btm_ble_multi_adv_init();
+
+    if (btm_cb.cmn_ble_vsc_cb.max_filter > 0)
+    {
+        btm_ble_adv_filter_init();
+        btm_ble_vendor_init(btm_cb.cmn_ble_vsc_cb.max_irk_list_sz);
+    }
+
+    if (btm_cb.cmn_ble_vsc_cb.tot_scan_results_strg > 0)
+        btm_ble_batchscan_init();
 
     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: status=%d, max_irk_size=%d",
-         status, btm_ble_vendor_cb.irk_avail_size);
 #else
     UNUSED(p_vcs_cplt_params);
 #endif
@@ -488,7 +494,7 @@ BTM_API extern void BTM_BleGetVendorCapabilities(tBTM_BLE_VSC_CB *p_cmn_vsc_cb)
 {
     BTM_TRACE_DEBUG("BTM_BleGetVendorCapabilities");
 
-    if(NULL != p_cmn_vsc_cb)
+    if (NULL != p_cmn_vsc_cb)
     {
         *p_cmn_vsc_cb = btm_cb.cmn_ble_vsc_cb;
     }
@@ -510,8 +516,6 @@ BTM_API extern void BTM_BleReadControllerFeatures(tBTM_BLE_CTRL_FEATURES_CBACK
 #if BLE_VND_INCLUDED == TRUE
     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,
@@ -553,7 +557,6 @@ void BTM_RegisterScanReqEvt(tBTM_BLE_SCAN_REQ_CBACK   *p_scan_req_cback)
 #endif
 }
 
-#if BLE_PRIVACY_SPT == TRUE
 /*******************************************************************************
 **
 ** Function         BTM_BleConfigPrivacy
@@ -585,12 +588,29 @@ void BTM_BleConfigPrivacy(BOOLEAN enable)
         {
             p_cb->addr_mgnt_cb.own_addr_type = BLE_ADDR_PUBLIC;
         }
-        btm_ble_multi_adv_enb_privacy(p_cb->privacy);
+
+        if (BTM_BleMaxMultiAdvInstanceCount() > 0)
+            btm_ble_multi_adv_enb_privacy(p_cb->privacy);
     }
 }
 
 /*******************************************************************************
 **
+** Function          BTM_BleMaxMultiAdvInstanceCount
+**
+** Description        Returns max number of multi adv instances supported by controller
+**
+** Returns          Max multi adv instance count
+**
+*******************************************************************************/
+BTM_API extern UINT8  BTM_BleMaxMultiAdvInstanceCount()
+{
+    return btm_cb.cmn_ble_vsc_cb.adv_inst_max;
+}
+
+#if BLE_PRIVACY_SPT == TRUE
+/*******************************************************************************
+**
 ** Function         btm_ble_resolve_random_addr_on_adv
 **
 ** Description      resolve random address complete callback.
@@ -818,7 +838,6 @@ static UINT8 btm_set_conn_mode_adv_init_addr(tBTM_BLE_INQ_CB *p_cb,
     {
         evt_type = BTM_BLE_CONNECT_EVT;
 
-#if BLE_PRIVACY_SPT == TRUE
         /* may need to reset random address if privacy is enabled */
         if (btm_cb.ble_ctr_cb.privacy && /* own addr_type is random */
             !BTM_BLE_IS_RESOLVE_BDA(btm_cb.ble_ctr_cb.addr_mgnt_cb.private_addr))
@@ -826,7 +845,6 @@ static UINT8 btm_set_conn_mode_adv_init_addr(tBTM_BLE_INQ_CB *p_cb,
             /* need to generate RRA and update random addresss in controller */
             btm_gen_resolvable_private_addr((void *)btm_gen_resolve_paddr_low);
         }
-#endif
     }
 
     return evt_type;
@@ -1692,10 +1710,9 @@ tBTM_STATUS btm_ble_start_inquiry (UINT8 mode, UINT8   duration)
         btm_update_scanner_filter_policy(SP_ADV_ALL);
 
 #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
-#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
         /* enable IRK list */
-        btm_ble_vendor_irk_list_known_dev (TRUE);
-#endif
+        if (btm_cb.cmn_ble_vsc_cb.rpa_offloading == TRUE)
+            btm_ble_vendor_irk_list_known_dev (TRUE);
 #endif
         status = btm_ble_start_scan(BTM_BLE_DUPLICATE_DISABLE);
     }
@@ -2410,13 +2427,11 @@ void btm_ble_process_adv_pkt (UINT8 *p_data)
 #endif
 
 #if (defined BLE_PRIVACY_SPT && BLE_PRIVACY_SPT == TRUE)
-#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
     /* map address to security record */
     btm_public_addr_to_random_pseudo(bda, &addr_type);
     BTM_TRACE_ERROR("new address: %02x:%02x:%02x:%02x:%02x:%02x",
                      bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);
 #endif
-#endif
 
         /* Only process the results if the inquiry is still active */
         if (!BTM_BLE_IS_SCAN_ACTIVE(btm_cb.ble_ctr_cb.scan_activity))
@@ -2937,14 +2952,15 @@ void btm_ble_timeout(TIMER_LIST_ENT *p_tle)
         case BTU_TTYPE_BLE_RANDOM_ADDR:
             if (btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type == BLE_ADDR_RANDOM)
             {
-                if ((void *)(p_tle->param) == NULL)
-                /* refresh the random addr */
-                btm_gen_resolvable_private_addr((void *)btm_gen_resolve_paddr_low);
+                if (NULL == (void *)(p_tle->param))
+                {
+                    /* refresh the random addr */
+                    btm_gen_resolvable_private_addr((void *)btm_gen_resolve_paddr_low);
+                }
                 else
                 {
-#if BLE_MULTI_ADV_INCLUDED == TRUE
-                  btm_ble_multi_adv_configure_rpa((tBTM_BLE_MULTI_ADV_INST*)p_tle->param);
-#endif
+                    if (BTM_BleMaxMultiAdvInstanceCount() > 0)
+                       btm_ble_multi_adv_configure_rpa((tBTM_BLE_MULTI_ADV_INST*)p_tle->param);
                 }
             }
             break;
@@ -3016,8 +3032,9 @@ void btm_ble_write_adv_enable_complete(UINT8 * p)
         p_cb->adv_mode = !p_cb->adv_mode;
     }
 
-#if (BLE_VND_INCLUDED == TRUE && BLE_PRIVACY_SPT == TRUE)
-    if (p_cb->adv_mode == BTM_BLE_ADV_DISABLE)
+#if (BLE_PRIVACY_SPT == TRUE)
+    if ((p_cb->adv_mode == BTM_BLE_ADV_DISABLE) &&
+        (btm_cb.cmn_ble_vsc_cb.rpa_offloading == TRUE))
         btm_ble_vendor_disable_irk_list();
 #endif
 }
@@ -3055,7 +3072,7 @@ void btm_ble_init (void)
     BTM_TRACE_EVENT ("btm_ble_init ");
 
     memset(p_cb, 0, sizeof(tBTM_BLE_CB));
-    memset(&btm_cb.cmn_ble_vsc_cb, 0 , sizeof(tBTM_BLE_VSC_CB));
+    memset(&(btm_cb.cmn_ble_vsc_cb), 0 , sizeof(tBTM_BLE_VSC_CB));
     p_cb->cur_states       = 0;
 
     p_cb->inq_var.adv_mode = BTM_BLE_ADV_DISABLE;
@@ -3070,15 +3087,9 @@ void btm_ble_init (void)
     p_cb->scan_int = p_cb->scan_win = BTM_BLE_CONN_PARAM_UNDEF;
 
     p_cb->inq_var.evt_type = BTM_BLE_NON_CONNECT_EVT;
-#if BLE_MULTI_ADV_INCLUDED == TRUE
-    btm_ble_multi_adv_init();
-#endif
-
-#if BLE_BATCH_SCAN_INCLUDED == TRUE
-    btm_ble_batchscan_init();
-#endif
 
-#if BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE
+#if BLE_VND_INCLUDED == FALSE
+    btm_ble_vendor_init(BTM_CS_IRK_LIST_MAX);
     btm_ble_adv_filter_init();
 #endif
 }
index 822f09d..b8e33a2 100644 (file)
@@ -292,9 +292,7 @@ typedef struct
     tBTM_LE_RANDOM_CB   addr_mgnt_cb;
 
     BOOLEAN          enabled;
-#if BLE_PRIVACY_SPT == TRUE
-        BOOLEAN          privacy;               /* privacy enabled or disabled */
-#endif
+    BOOLEAN          privacy;               /* local privacy enabled or disabled */
     tBTM_BLE_WL_OP  wl_op_q[BTM_BLE_MAX_BG_CONN_DEV_NUM];
 
 #ifdef BTM_BLE_PC_ADV_TEST_MODE
@@ -359,6 +357,7 @@ extern BOOLEAN btm_ble_get_enc_key_type(BD_ADDR bd_addr, UINT8 *p_key_types);
 
 extern void btm_ble_test_command_complete(UINT8 *p);
 extern void btm_ble_rand_enc_complete (UINT8 *p, UINT16 op_code, tBTM_RAND_ENC_CB *p_enc_cplt_cback);
+
 extern void btm_sec_save_le_key(BD_ADDR bd_addr, tBTM_LE_KEY_TYPE key_type, tBTM_LE_KEY_VALUE *p_keys, BOOLEAN pass_to_application);
 extern void btm_ble_update_sec_key_size(BD_ADDR bd_addr, UINT8 enc_key_size);
 extern UINT8 btm_ble_read_sec_key_size(BD_ADDR bd_addr);
@@ -395,21 +394,22 @@ extern void btm_gen_resolve_paddr_low(tBTM_RAND_ENC *p);
 
 extern void btm_ble_multi_adv_configure_rpa (tBTM_BLE_MULTI_ADV_INST *p_inst);
 extern void btm_ble_multi_adv_init(void);
-extern void btm_ble_batchscan_init(void);
+extern void* btm_ble_multi_adv_get_ref(UINT8 inst_id);
+extern void btm_ble_multi_adv_cleanup(void);
 extern void btm_ble_multi_adv_reenable(UINT8 inst_id);
 extern void btm_ble_multi_adv_enb_privacy(BOOLEAN enable);
 extern char btm_ble_map_adv_tx_power(int tx_power_index);
+extern void btm_ble_batchscan_init(void);
 extern void btm_ble_adv_filter_init(void);
+extern void btm_ble_adv_filter_cleanup(void);
 extern BOOLEAN btm_ble_topology_check(tBTM_BLE_STATE_MASK request);
 extern BOOLEAN btm_ble_clear_topology_mask(tBTM_BLE_STATE_MASK request_state);
 extern BOOLEAN btm_ble_set_topology_mask(tBTM_BLE_STATE_MASK request_state);
 
-#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
 /* BLE address mapping with CS feature */
 extern BOOLEAN btm_public_addr_to_random_pseudo(BD_ADDR bd_addr, UINT8 *p_addr_type);
 extern BOOLEAN btm_random_pseudo_to_public(BD_ADDR random_pseudo, UINT8 *p_static_addr_type);
 extern void btm_ble_refresh_rra(BD_ADDR pseudo_bda, BD_ADDR rra);
-#endif
 
 #if BTM_BLE_CONFORMANCE_TESTING == TRUE
 BT_API extern void btm_ble_set_no_disc_if_pair_fail (BOOLEAN disble_disc);
index 6c0a8a7..359367e 100644 (file)
@@ -20,7 +20,6 @@
 #include "bt_target.h"
 
 #if (BLE_INCLUDED == TRUE)
-#if BLE_MULTI_ADV_INCLUDED == TRUE
 #include "bt_types.h"
 #include "hcimsgs.h"
 #include "btu.h"
 #define BTM_BLE_MULTI_ADV_WRITE_DATA_LEN                (BTM_BLE_AD_DATA_LEN + 3)
 #define BTM_BLE_MULTI_ADV_SET_RANDOM_ADDR_LEN           8
 
-#ifndef BTM_BLE_MULTI_ADV_INST_MAX
-#define BTM_BLE_MULTI_ADV_INST_MAX                      5
-#endif
-
 tBTM_BLE_MULTI_ADV_CB  btm_multi_adv_cb;
-
-static void btm_ble_multi_adv_gen_rpa_cmpl_1(tBTM_RAND_ENC *p);
-static void btm_ble_multi_adv_gen_rpa_cmpl_2(tBTM_RAND_ENC *p);
-static void btm_ble_multi_adv_gen_rpa_cmpl_3(tBTM_RAND_ENC *p);
-static void btm_ble_multi_adv_gen_rpa_cmpl_4(tBTM_RAND_ENC *p);
-
-typedef void (*tBTM_MULTI_ADV_RPA_CMPL)(tBTM_RAND_ENC *p);
-const tBTM_MULTI_ADV_RPA_CMPL btm_ble_multi_adv_rpa_cmpl [] =
-{
-    btm_ble_multi_adv_gen_rpa_cmpl_1,
-    btm_ble_multi_adv_gen_rpa_cmpl_2,
-    btm_ble_multi_adv_gen_rpa_cmpl_3,
-    btm_ble_multi_adv_gen_rpa_cmpl_4
-};
+tBTM_BLE_MULTI_ADV_INST_IDX_Q btm_multi_adv_idx_q;
 
 #define BTM_BLE_MULTI_ADV_CB_EVT_MASK   0xF0
 #define BTM_BLE_MULTI_ADV_SUBCODE_MASK  0x0F
@@ -72,11 +54,11 @@ void btm_ble_multi_adv_enq_op_q(UINT8 opcode, UINT8 inst_id, UINT8 cb_evt)
 {
     tBTM_BLE_MULTI_ADV_OPQ  *p_op_q = &btm_multi_adv_cb.op_q;
 
-    p_op_q->inst_id[p_op_q->next_idx] = inst_id;
+    p_op_q->p_inst_id[p_op_q->next_idx] = inst_id;
 
-    p_op_q->sub_code[p_op_q->next_idx] = (opcode |(cb_evt << 4));
+    p_op_q->p_sub_code[p_op_q->next_idx] = (opcode |(cb_evt << 4));
 
-    p_op_q->next_idx = (p_op_q->next_idx + 1) % BTM_BLE_MULTI_ADV_MAX;
+    p_op_q->next_idx = (p_op_q->next_idx + 1) %  BTM_BleMaxMultiAdvInstanceCount();
 }
 
 /*******************************************************************************
@@ -93,11 +75,11 @@ void btm_ble_multi_adv_deq_op_q(UINT8 *p_opcode, UINT8 *p_inst_id, UINT8 *p_cb_e
 {
     tBTM_BLE_MULTI_ADV_OPQ  *p_op_q = &btm_multi_adv_cb.op_q;
 
-    *p_inst_id = p_op_q->inst_id[p_op_q->pending_idx] & 0x7F;
-    *p_cb_evt = (p_op_q->sub_code[p_op_q->pending_idx] >> 4);
-    *p_opcode = (p_op_q->sub_code[p_op_q->pending_idx] & BTM_BLE_MULTI_ADV_SUBCODE_MASK);
+    *p_inst_id = p_op_q->p_inst_id[p_op_q->pending_idx] & 0x7F;
+    *p_cb_evt = (p_op_q->p_sub_code[p_op_q->pending_idx] >> 4);
+    *p_opcode = (p_op_q->p_sub_code[p_op_q->pending_idx] & BTM_BLE_MULTI_ADV_SUBCODE_MASK);
 
-    p_op_q->pending_idx = (p_op_q->pending_idx + 1) % BTM_BLE_MULTI_ADV_MAX;
+    p_op_q->pending_idx = (p_op_q->pending_idx + 1) %  BTM_BleMaxMultiAdvInstanceCount();
 }
 
 /*******************************************************************************
@@ -138,7 +120,7 @@ void btm_ble_multi_adv_vsc_cmpl_cback (tBTM_VSC_CMPL *p_params)
         return;
     }
 
-    p_inst = &btm_multi_adv_cb.adv_inst[inst_id - 1];
+    p_inst = &btm_multi_adv_cb.p_adv_inst[inst_id - 1];
 
     switch (subcode)
     {
@@ -146,7 +128,7 @@ void btm_ble_multi_adv_vsc_cmpl_cback (tBTM_VSC_CMPL *p_params)
         BTM_TRACE_DEBUG("BTM_BLE_MULTI_ADV_ENB status = %d", status);
         if (status != HCI_SUCCESS)
         {
-            btm_multi_adv_cb.adv_inst[inst_id-1].inst_id = 0;
+            btm_multi_adv_cb.p_adv_inst[inst_id-1].inst_id = 0;
         }
         break;
 
@@ -377,11 +359,35 @@ tBTM_STATUS btm_ble_multi_adv_write_rpa (tBTM_BLE_MULTI_ADV_INST *p_inst, BD_ADD
 ** Returns          none.
 **
 *******************************************************************************/
-void btm_ble_multi_adv_gen_rpa_cmpl(tBTM_RAND_ENC *p, tBTM_BLE_MULTI_ADV_INST *p_inst )
+void btm_ble_multi_adv_gen_rpa_cmpl(tBTM_RAND_ENC *p)
 {
 #if (SMP_INCLUDED == TRUE)
     tBTM_LE_RANDOM_CB *p_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
     tSMP_ENC    output;
+    UINT8 index = 0;
+    tBTM_BLE_MULTI_ADV_INST *p_inst = NULL;
+
+     /* Retrieve the index of adv instance from stored Q */
+    if (btm_multi_adv_idx_q.front == -1)
+    {
+        BTM_TRACE_ERROR(" %s can't locate advertise instance", __FUNCTION__);
+        return;
+    }
+    else
+    {
+        index = btm_multi_adv_idx_q.inst_index_queue[btm_multi_adv_idx_q.front];
+        if (btm_multi_adv_idx_q.front == btm_multi_adv_idx_q.rear)
+        {
+            btm_multi_adv_idx_q.front = -1;
+            btm_multi_adv_idx_q.rear = -1;
+        }
+        else
+        {
+            btm_multi_adv_idx_q.front = btm_multi_adv_idx_q.front +1 % BTM_BLE_MULTI_ADV_MAX;
+        }
+    }
+
+    p_inst = &(btm_multi_adv_cb.p_adv_inst[index]);
 
     BTM_TRACE_EVENT ("btm_ble_multi_adv_gen_rpa_cmpl inst_id = %d", p_inst->inst_id);
     if (p)
@@ -404,7 +410,7 @@ void btm_ble_multi_adv_gen_rpa_cmpl(tBTM_RAND_ENC *p, tBTM_BLE_MULTI_ADV_INST *p
             p_inst->rpa[4] = output.param_buf[1];
             p_inst->rpa[3] = output.param_buf[2];
 
-            if (p_inst->inst_id != 0)
+            if (p_inst->inst_id != 0 && (p_inst->inst_id < BTM_BleMaxMultiAdvInstanceCount()))
             {
                 /* set it to controller */
                 btm_ble_multi_adv_write_rpa(p_inst, p_inst->rpa);
@@ -416,65 +422,6 @@ void btm_ble_multi_adv_gen_rpa_cmpl(tBTM_RAND_ENC *p, tBTM_BLE_MULTI_ADV_INST *p
 
 /*******************************************************************************
 **
-** Function         btm_ble_multi_adv_gen_rpa_cmpl1
-**
-** Description      RPA generation completion callback for each adv instance. Will
-**                  continue write the new RPA into controller.
-**
-** Returns          none.
-**
-*******************************************************************************/
-static void btm_ble_multi_adv_gen_rpa_cmpl_1(tBTM_RAND_ENC *p)
-{
-    btm_ble_multi_adv_gen_rpa_cmpl(p, &btm_multi_adv_cb.adv_inst[0]);
-}
-
-/*******************************************************************************
-**
-** Function         btm_ble_multi_adv_gen_rpa_cmpl2
-**
-** Description      RPA generation completion callback for each adv instance. Will
-**                  continue write the new RPA into controller.
-**
-** Returns          none.
-**
-*******************************************************************************/
-static void btm_ble_multi_adv_gen_rpa_cmpl_2(tBTM_RAND_ENC *p)
-{
-    btm_ble_multi_adv_gen_rpa_cmpl(p, &btm_multi_adv_cb.adv_inst[1]);
-}
-
-/*******************************************************************************
-**
-** Function         btm_ble_multi_adv_gen_rpa_cmpl3
-**
-** Description      RPA generation completion callback for each adv instance. Will
-**                  continue write the new RPA into controller.
-**
-** Returns          none.
-**
-*******************************************************************************/
-static void btm_ble_multi_adv_gen_rpa_cmpl_3(tBTM_RAND_ENC *p)
-{
-    btm_ble_multi_adv_gen_rpa_cmpl(p, &btm_multi_adv_cb.adv_inst[2]);
-}
-
-/*******************************************************************************
-**
-** Function         btm_ble_multi_adv_gen_rpa_cmpl4
-**
-** Description      RPA generation completion callback for each adv instance. Will
-**                  continue write the new RPA into controller.
-**
-** Returns          none.
-**
-*******************************************************************************/
-static void btm_ble_multi_adv_gen_rpa_cmpl_4(tBTM_RAND_ENC *p)
-{
-    btm_ble_multi_adv_gen_rpa_cmpl(p, &btm_multi_adv_cb.adv_inst[3]);
-}
-/*******************************************************************************
-**
 ** Function         btm_ble_multi_adv_configure_rpa
 **
 ** Description      This function set the random address for the adv instance
@@ -486,7 +433,25 @@ static void btm_ble_multi_adv_gen_rpa_cmpl_4(tBTM_RAND_ENC *p)
 *******************************************************************************/
 void btm_ble_multi_adv_configure_rpa (tBTM_BLE_MULTI_ADV_INST *p_inst)
 {
-    btm_gen_resolvable_private_addr((void *)p_inst->p_rpa_cback);
+    if (btm_multi_adv_idx_q.front == btm_multi_adv_idx_q.rear +1 % BTM_BLE_MULTI_ADV_MAX)
+    {
+        BTM_TRACE_ERROR("outstanding rand generation exceeded max allowed ");
+        return;
+    }
+    else
+    {
+        if (btm_multi_adv_idx_q.front == -1)
+        {
+            btm_multi_adv_idx_q.front = 0;
+            btm_multi_adv_idx_q.rear = 0;
+        }
+        else
+        {
+            btm_multi_adv_idx_q.rear = btm_multi_adv_idx_q.rear +1 % BTM_BLE_MULTI_ADV_MAX;
+        }
+        btm_multi_adv_idx_q.inst_index_queue[btm_multi_adv_idx_q.rear] = p_inst->index;
+    }
+    btm_gen_resolvable_private_addr((void *)btm_ble_multi_adv_gen_rpa_cmpl);
 }
 
 /*******************************************************************************
@@ -502,7 +467,7 @@ void btm_ble_multi_adv_configure_rpa (tBTM_BLE_MULTI_ADV_INST *p_inst)
 *******************************************************************************/
 void btm_ble_multi_adv_reenable(UINT8 inst_id)
 {
-    tBTM_BLE_MULTI_ADV_INST *p_inst = &btm_multi_adv_cb.adv_inst[inst_id - 1];
+    tBTM_BLE_MULTI_ADV_INST *p_inst = &btm_multi_adv_cb.p_adv_inst[inst_id - 1];
 
     if (p_inst->inst_id != 0)
     {
@@ -531,9 +496,9 @@ void btm_ble_multi_adv_reenable(UINT8 inst_id)
 void btm_ble_multi_adv_enb_privacy(BOOLEAN enable)
 {
     UINT8 i;
-    tBTM_BLE_MULTI_ADV_INST *p_inst = &btm_multi_adv_cb.adv_inst[0];
+    tBTM_BLE_MULTI_ADV_INST *p_inst = &btm_multi_adv_cb.p_adv_inst[0];
 
-    for (i = 0; i < BTM_BLE_MULTI_ADV_MAX; i ++, p_inst++)
+    for (i = 0; i <  BTM_BleMaxMultiAdvInstanceCount() - 1; i ++, p_inst++)
     {
         if (enable)
             btm_ble_multi_adv_configure_rpa (p_inst);
@@ -562,21 +527,23 @@ tBTM_STATUS BTM_BleEnableAdvInstance (tBTM_BLE_ADV_PARAMS *p_params,
 {
     UINT8 i;
     tBTM_STATUS rt = BTM_NO_RESOURCES;
-    tBTM_BLE_MULTI_ADV_INST *p_inst = &btm_multi_adv_cb.adv_inst[0];
-    tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
-
+    tBTM_BLE_MULTI_ADV_INST *p_inst = &btm_multi_adv_cb.p_adv_inst[0];
 
     BTM_TRACE_EVENT("BTM_BleEnableAdvInstance called");
 
-    BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
-
-    if (0 == cmn_ble_vsc_cb.adv_inst_max)
+    if (0 == btm_cb.cmn_ble_vsc_cb.adv_inst_max)
     {
         BTM_TRACE_ERROR("Controller does not support Multi ADV");
         return BTM_ERR_PROCESSING;
     }
 
-    for (i = 0; i < BTM_BLE_MULTI_ADV_MAX; i ++, p_inst++)
+    if (NULL == p_inst)
+    {
+        BTM_TRACE_ERROR("Invalid instance in BTM_BleEnableAdvInstance");
+        return BTM_ERR_PROCESSING;
+    }
+
+    for (i = 0; i <  BTM_BleMaxMultiAdvInstanceCount() - 1; i ++, p_inst++)
     {
         if (p_inst->inst_id == 0)
         {
@@ -584,21 +551,28 @@ tBTM_STATUS BTM_BleEnableAdvInstance (tBTM_BLE_ADV_PARAMS *p_params,
 
             /* configure adv parameter */
             if (p_params)
-                btm_ble_multi_adv_set_params(p_inst, p_params, 0);
+                rt = btm_ble_multi_adv_set_params(p_inst, p_params, 0);
+            else
+                rt = BTM_CMD_STARTED;
 
             /* enable adv */
             BTM_TRACE_EVENT("btm_ble_enable_multi_adv being called with inst_id:%d",
                 p_inst->inst_id);
-            if ((rt = btm_ble_enable_multi_adv (TRUE, p_inst->inst_id, BTM_BLE_MULTI_ADV_ENB_EVT))
-                == BTM_CMD_STARTED)
+
+            if (BTM_CMD_STARTED == rt)
             {
-                p_inst->p_cback = p_cback;
-                p_inst->p_ref   = p_ref;
+                if ((rt = btm_ble_enable_multi_adv (TRUE, p_inst->inst_id,
+                          BTM_BLE_MULTI_ADV_ENB_EVT)) == BTM_CMD_STARTED)
+                {
+                    p_inst->p_cback = p_cback;
+                    p_inst->p_ref   = p_ref;
+                }
             }
-            else
+
+            if (BTM_CMD_STARTED != rt)
             {
                 p_inst->inst_id = 0;
-                BTM_TRACE_ERROR("BTM_BleEnableAdvInstance failed, no resources");
+                BTM_TRACE_ERROR("BTM_BleEnableAdvInstance failed");
             }
             break;
         }
@@ -622,20 +596,17 @@ tBTM_STATUS BTM_BleEnableAdvInstance (tBTM_BLE_ADV_PARAMS *p_params,
 tBTM_STATUS BTM_BleUpdateAdvInstParam (UINT8 inst_id, tBTM_BLE_ADV_PARAMS *p_params)
 {
     tBTM_STATUS rt = BTM_ILLEGAL_VALUE;
-    tBTM_BLE_MULTI_ADV_INST *p_inst = &btm_multi_adv_cb.adv_inst[inst_id - 1];
-    tBTM_BLE_VSC_CB cmn_ble_vsc_cb;
+    tBTM_BLE_MULTI_ADV_INST *p_inst = &btm_multi_adv_cb.p_adv_inst[inst_id - 1];
 
     BTM_TRACE_EVENT("BTM_BleUpdateAdvInstParam called with inst_id:%d", inst_id);
 
-    BTM_BleGetVendorCapabilities(&cmn_ble_vsc_cb);
-
-    if (0 == cmn_ble_vsc_cb.adv_inst_max)
+    if (0 == btm_cb.cmn_ble_vsc_cb.adv_inst_max)
     {
         BTM_TRACE_ERROR("Controller does not support Multi ADV");
         return BTM_ERR_PROCESSING;
     }
 
-    if (inst_id <= BTM_BLE_MULTI_ADV_MAX &&
+    if (inst_id <  BTM_BleMaxMultiAdvInstanceCount() &&
         inst_id != BTM_BLE_MULTI_ADV_DEFAULT_STD &&
         p_params != NULL)
     {
@@ -647,9 +618,8 @@ tBTM_STATUS BTM_BleUpdateAdvInstParam (UINT8 inst_id, tBTM_BLE_ADV_PARAMS *p_par
         else
             btm_ble_enable_multi_adv(FALSE, inst_id, 0);
 
-        btm_ble_multi_adv_set_params(p_inst, p_params, 0);
-
-        rt = btm_ble_enable_multi_adv(TRUE, inst_id, BTM_BLE_MULTI_ADV_PARAM_EVT);
+        if (BTM_CMD_STARTED == btm_ble_multi_adv_set_params(p_inst, p_params, 0))
+            rt = btm_ble_enable_multi_adv(TRUE, inst_id, BTM_BLE_MULTI_ADV_PARAM_EVT);
     }
     return rt;
 }
@@ -688,6 +658,7 @@ tBTM_STATUS BTM_BleCfgAdvInstData (UINT8 inst_id, BOOLEAN is_scan_rsp,
         return BTM_ERR_PROCESSING;
     }
 
+
     BTM_TRACE_EVENT("BTM_BleCfgAdvInstData called with inst_id:%d", inst_id);
     if (inst_id > BTM_BLE_MULTI_ADV_MAX || inst_id == BTM_BLE_MULTI_ADV_DEFAULT_STD)
         return BTM_ILLEGAL_VALUE;
@@ -737,14 +708,15 @@ tBTM_STATUS BTM_BleDisableAdvInstance (UINT8 inst_id)
          return BTM_ERR_PROCESSING;
      }
 
-     if (inst_id <= BTM_BLE_MULTI_ADV_MAX && inst_id != BTM_BLE_MULTI_ADV_DEFAULT_STD)
+     if (inst_id < BTM_BleMaxMultiAdvInstanceCount() &&
+         inst_id != BTM_BLE_MULTI_ADV_DEFAULT_STD)
      {
          if ((rt = btm_ble_enable_multi_adv(FALSE, inst_id, BTM_BLE_MULTI_ADV_DISABLE_EVT))
             == BTM_CMD_STARTED)
          {
-            btu_stop_timer(&btm_multi_adv_cb.adv_inst[inst_id-1].raddr_timer_ent);
-            btm_ble_multi_adv_configure_rpa(&btm_multi_adv_cb.adv_inst[inst_id-1]);
-            btm_multi_adv_cb.adv_inst[inst_id-1].inst_id = 0;
+            btm_ble_multi_adv_configure_rpa(&btm_multi_adv_cb.p_adv_inst[inst_id-1]);
+            btu_stop_timer(&btm_multi_adv_cb.p_adv_inst[inst_id-1].raddr_timer_ent);
+            btm_multi_adv_cb.p_adv_inst[inst_id-1].inst_id = 0;
          }
      }
     return rt;
@@ -768,13 +740,14 @@ void btm_ble_multi_adv_vse_cback(UINT8 len, UINT8 *p)
     len--;
 
     BTM_TRACE_EVENT("btm_ble_multi_adv_vse_cback called with event:%d", sub_event);
-    if ((sub_event == HCI_VSE_SUBCODE_BLE_MULTI_ADV_ST_CHG) && (len>=4))
+    if ((sub_event == HCI_VSE_SUBCODE_BLE_MULTI_ADV_ST_CHG) && (len >= 4))
     {
         STREAM_TO_UINT8(adv_inst, p);
         STREAM_TO_UINT8(reason, p);
         STREAM_TO_UINT16(conn_handle, p);
 
-        if (adv_inst <= BTM_BLE_MULTI_ADV_MAX && adv_inst !=  BTM_BLE_MULTI_ADV_DEFAULT_STD)
+        if (adv_inst < BTM_BleMaxMultiAdvInstanceCount() &&
+            adv_inst !=  BTM_BLE_MULTI_ADV_DEFAULT_STD)
         {
             BTM_TRACE_EVENT("btm_ble_multi_adv_reenable called");
             btm_ble_multi_adv_reenable(adv_inst);
@@ -785,7 +758,6 @@ void btm_ble_multi_adv_vse_cback(UINT8 len, UINT8 *p)
             if (btm_cb.ble_ctr_cb.inq_var.connectable_mode == BTM_BLE_CONNECTABLE)
             {
                 btm_ble_set_connectability ( btm_cb.ble_ctr_cb.inq_var.connectable_mode );
-
             }
         }
 
@@ -798,22 +770,89 @@ void btm_ble_multi_adv_vse_cback(UINT8 len, UINT8 *p)
 **
 ** Description      This function initialize the multi adv control block.
 **
-** Parameters
+** Parameters       None
 **
-** Returns          status
+** Returns          void
 **
 *******************************************************************************/
-void btm_ble_multi_adv_init(void)
+void btm_ble_multi_adv_init()
 {
-    UINT8 i;
-
+    UINT8 i = 0;
     memset(&btm_multi_adv_cb, 0, sizeof(tBTM_BLE_MULTI_ADV_CB));
+    memset (&btm_multi_adv_idx_q,0, sizeof (tBTM_BLE_MULTI_ADV_INST_IDX_Q));
+    btm_multi_adv_idx_q.front = -1;
+    btm_multi_adv_idx_q.rear = -1;
 
-    for (i = 0; i < BTM_BLE_MULTI_ADV_MAX; i ++)
-        btm_multi_adv_cb.adv_inst[i].p_rpa_cback = btm_ble_multi_adv_rpa_cmpl[i];
+    if (btm_cb.cmn_ble_vsc_cb.adv_inst_max > 0)
+    {
+        btm_multi_adv_cb.p_adv_inst = GKI_getbuf( sizeof(tBTM_BLE_MULTI_ADV_INST)*
+                                                 (btm_cb.cmn_ble_vsc_cb.adv_inst_max));
+        memset(btm_multi_adv_cb.p_adv_inst, 0, sizeof(tBTM_BLE_MULTI_ADV_INST)*
+                                               (btm_cb.cmn_ble_vsc_cb.adv_inst_max));
+
+        btm_multi_adv_cb.op_q.p_sub_code = GKI_getbuf( sizeof(UINT8) *
+                                                      (btm_cb.cmn_ble_vsc_cb.adv_inst_max));
+        memset(btm_multi_adv_cb.op_q.p_sub_code, 0,
+               sizeof(UINT8)*(btm_cb.cmn_ble_vsc_cb.adv_inst_max));
+
+        btm_multi_adv_cb.op_q.p_inst_id = GKI_getbuf( sizeof(UINT8) *
+                                          (btm_cb.cmn_ble_vsc_cb.adv_inst_max));
+        memset(btm_multi_adv_cb.op_q.p_inst_id, 0,
+               sizeof(UINT8)*(btm_cb.cmn_ble_vsc_cb.adv_inst_max));
+    }
+
+    for (i = 0; i < btm_cb.cmn_ble_vsc_cb.adv_inst_max ; i ++)
+        btm_multi_adv_cb.p_adv_inst[i].index = i;
 
     BTM_RegisterForVSEvents(btm_ble_multi_adv_vse_cback, TRUE);
 }
-#endif
+
+/*******************************************************************************
+**
+** Function         btm_ble_multi_adv_cleanup
+**
+** Description      This function cleans up multi adv control block.
+**
+** Parameters
+** Returns          void
+**
+*******************************************************************************/
+void btm_ble_multi_adv_cleanup(void)
+{
+    if (btm_multi_adv_cb.p_adv_inst)
+        GKI_freebuf(btm_multi_adv_cb.p_adv_inst);
+
+    if (btm_multi_adv_cb.op_q.p_sub_code)
+         GKI_freebuf(btm_multi_adv_cb.op_q.p_sub_code);
+
+    if (btm_multi_adv_cb.op_q.p_inst_id)
+        GKI_freebuf(btm_multi_adv_cb.op_q.p_inst_id);
+
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_multi_adv_get_ref
+**
+** Description      This function obtains the reference pointer for the instance ID provided
+**
+** Parameters       inst_id - Instance ID
+**
+** Returns          void*
+**
+*******************************************************************************/
+void* btm_ble_multi_adv_get_ref(UINT8 inst_id)
+{
+    tBTM_BLE_MULTI_ADV_INST *p_inst = NULL;
+
+    if (inst_id < BTM_BleMaxMultiAdvInstanceCount())
+    {
+        p_inst = &btm_multi_adv_cb.p_adv_inst[inst_id - 1];
+        if (NULL != p_inst)
+            return p_inst->p_ref;
+    }
+
+    return NULL;
+}
 #endif
 
index 69618b1..910a892 100644 (file)
@@ -671,9 +671,6 @@ void btm_reset_complete (void)
      btm_cb.ble_ctr_cb.p_select_cback = NULL;
      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();
-#if BLE_MULTI_ADV_INCLUDED == TRUE
-     btm_ble_multi_adv_init();
-#endif
 #endif
     }
 }
index 23204a7..9a29416 100644 (file)
@@ -1125,9 +1125,9 @@ static void btu_hcif_hdl_command_complete (UINT16 opcode, UINT8 *p, UINT16 evt_l
 
         case HCI_BLE_RAND:
         case HCI_BLE_ENCRYPT:
-
             btm_ble_rand_enc_complete (p, opcode, (tBTM_RAND_ENC_CB *)p_cplt_cback);
             break;
+
         case HCI_BLE_READ_BUFFER_SIZE:
             btm_read_ble_buf_size_complete(p, evt_len);
             break;
index 91bb42e..13965e6 100644 (file)
@@ -413,7 +413,8 @@ typedef struct
 }tBTM_BLE_ADV_DATA;
 
 #ifndef BTM_BLE_MULTI_ADV_MAX
-#define BTM_BLE_MULTI_ADV_MAX   4
+#define BTM_BLE_MULTI_ADV_MAX   10 /* controller returned adv_inst_max should be less
+                                      than this number */
 #endif
 
 #define BTM_BLE_MULTI_ADV_INVALID   0
@@ -438,8 +439,8 @@ typedef struct
 
 typedef struct
 {
-    UINT8   sub_code[BTM_BLE_MULTI_ADV_MAX];
-    UINT8   inst_id[BTM_BLE_MULTI_ADV_MAX];
+    UINT8   *p_sub_code; /* dynamic array to store sub code */
+    UINT8   *p_inst_id;  /* dynamic array to store instance id */
     UINT8   pending_idx;
     UINT8   next_idx;
 }tBTM_BLE_MULTI_ADV_OPQ;
@@ -453,14 +454,21 @@ typedef struct
     UINT8                       adv_evt;
     BD_ADDR                     rpa;
     TIMER_LIST_ENT              raddr_timer_ent;
-    void                        *p_rpa_cback;
     tBTM_BLE_MULTI_ADV_CBACK    *p_cback;
     void                        *p_ref;
+    UINT8                       index;
 }tBTM_BLE_MULTI_ADV_INST;
 
 typedef struct
 {
-    tBTM_BLE_MULTI_ADV_INST adv_inst[BTM_BLE_MULTI_ADV_MAX];
+    UINT8 inst_index_queue[BTM_BLE_MULTI_ADV_MAX];
+    int front;
+    int rear;
+}tBTM_BLE_MULTI_ADV_INST_IDX_Q;
+
+typedef struct
+{
+    tBTM_BLE_MULTI_ADV_INST *p_adv_inst; /* dynamic array to store adv instance */
     tBTM_BLE_MULTI_ADV_OPQ  op_q;
 }tBTM_BLE_MULTI_ADV_CB;
 
@@ -690,11 +698,14 @@ typedef struct
 
 #define BTM_BLE_MAX_FILTER_COUNTER  (BTM_BLE_MAX_ADDR_FILTER + 1) /* per device filter + one generic filter indexed by 0 */
 
+#ifndef BTM_CS_IRK_LIST_MAX
+#define BTM_CS_IRK_LIST_MAX 0x20
+#endif
+
 typedef struct
 {
     BOOLEAN    in_use;
     BD_ADDR    bd_addr;
-    UINT16     feat_mask;      /* per BD_ADDR feature mask */
     UINT8      pf_counter[BTM_BLE_PF_TYPE_MAX]; /* number of filter indexed by tBTM_BLE_PF_COND_TYPE */
 }tBTM_BLE_PF_COUNT;
 
@@ -702,7 +713,7 @@ typedef struct
 {
     BOOLEAN             enable;
     UINT8               op_type;
-    tBTM_BLE_PF_COUNT   addr_filter_count[BTM_BLE_MAX_FILTER_COUNTER]; /* per BDA filter indexed by tBTM_BLE_PF_COND_TYPE */
+    tBTM_BLE_PF_COUNT   *p_addr_filter_count; /* per BDA filter array */
     tBLE_BD_ADDR        cur_filter_target;
     tBTM_BLE_PF_STATUS_CBACK *p_filt_stat_cback;
     tBTM_BLE_ADV_FILTER_ADV_OPQ  op_q;
@@ -1399,7 +1410,16 @@ BTM_API extern void BTM_BleConfigPrivacy(BOOLEAN enable);
 *******************************************************************************/
 BTM_API extern BOOLEAN BTM_BleLocalPrivacyEnabled();
 
-
+/*******************************************************************************
+**
+** Function          BTM_BleMaxMultiAdvInstanceCount
+**
+** Description        Returns max number of multi adv instances  supported by controller
+**
+** Returns          Max multi adv instance count
+**
+*******************************************************************************/
+BTM_API extern UINT8  BTM_BleMaxMultiAdvInstanceCount();
 
 /*******************************************************************************
 **
index 645323d..a210f69 100644 (file)
@@ -225,9 +225,6 @@ typedef union
 typedef void (tGAP_BLE_DEV_NAME_CBACK)(BOOLEAN status, BD_ADDR addr, UINT16 length, char *p_name);
 
 typedef void (tGAP_BLE_RECONN_ADDR_CBACK)(BOOLEAN status, BD_ADDR addr, BD_ADDR reconn_bda);
-#if BLE_PRIVACY_SPT == TRUE
-typedef void (tGAP_BLE_PRIVACY_CBACK)(BOOLEAN status, BD_ADDR addr, BOOLEAN privacy_enabled);
-#endif
 
 /*****************************************************************************
 **  External Function Declarations
index 0b77b78..c1bb989 100644 (file)
 #define L2CA_GET_UPD_ST(x)          ((x) & UPD_ST_MASK)
 #define L2CA_SET_UPD_ST(x, y)      x = (((x) & ~UPD_ST_MASK) | (y))
 
-#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
 #include "vendor_ble.h"
-#else
-#if BLE_PRIVACY_SPT == TRUE
-extern BOOLEAN btm_ble_get_acl_remote_addr(tBTM_SEC_DEV_REC *p_dev_rec, BD_ADDR conn_addr,
-                                    tBLE_ADDR_TYPE *p_addr_type);
-#endif
-#endif
-
 /*******************************************************************************
 **
 **  Function        L2CA_CancelBleConnectReq
@@ -647,17 +639,13 @@ BOOLEAN l2cble_init_direct_conn (tL2C_LCB *p_lcb)
         L2CAP_TRACE_ERROR("initate direct connection fail, topology limitation");
         return FALSE;
     }
-#if BLE_PRIVACY_SPT == TRUE
-#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
-    extern tBTM_STATUS BTM_BleEnableIRKFeature(BOOLEAN enable);
-    if (btm_ble_vendor_irk_list_load_dev(p_dev_rec))
-        BTM_BleEnableIRKFeature(TRUE);
-
-    btm_random_pseudo_to_public(init_addr, &init_addr_type);
-#else
-    btm_ble_get_acl_remote_addr(p_dev_rec, init_addr, &init_addr_type);
-#endif
-#endif
+    if (btm_ble_vendor_irk_list_load_dev(p_dev_rec) &&
+        (btm_cb.cmn_ble_vsc_cb.rpa_offloading == TRUE ))
+    {
+        btm_ble_vendor_enable_irk_feature(TRUE);
+        btm_random_pseudo_to_public(init_addr, &init_addr_type);
+    }
+
     if (!btsnd_hcic_ble_create_ll_conn (scan_int,/* UINT16 scan_int      */
                                         scan_win, /* UINT16 scan_win      */
                                         FALSE,                   /* UINT8 white_list     */
index d3d8ff6..d2e86cd 100644 (file)
@@ -510,7 +510,7 @@ return_type aes_set_key( const unsigned char key[], length_type keylen, aes_cont
         keylen = 24;
         break;
     case 32:
-    /*    case 256:           length in bits (256 = 8*32) */ 
+    /*    case 256:           length in bits (256 = 8*32) */
         keylen = 32;
         break;
     default:
diff --git a/vnd/ble/bta_vendor.c b/vnd/ble/bta_vendor.c
deleted file mode 100644 (file)
index 3201c0b..0000000
+++ /dev/null
@@ -1,305 +0,0 @@
-/******************************************************************************
- *
- *  Copyright (C) 2003-2014 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-/*****************************************************************************
-**
-**  Name:           bta_vendor.c
-**
-**  Description:    This is the implementation VENDOR custom Ble APIs
-**
-*****************************************************************************/
-
-#include "bta_api.h"
-#include "bta_vendor_api.h"
-#include "bta_sys_int.h"
-#include "bta_dm_int.h"
-#include "vendor_api.h"
-#include "vendor_ble.h"
-#include <string.h>
-
-#if (BLE_INCLUDED == TRUE && BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE)
-
-static tBTA_DM_SCAN_PF_CBACK *bta_vendor_ble_scan_pf_cmpl_cback = NULL;
-
-/*******************************************************************************
-**
-** Function         bta_vendor_ble_scan_pf_cmpl
-**
-** Description      ADV payload filtering operation complete callback
-**
-**
-** Returns         TRUE if handled, otherwise FALSE.
-**
-*******************************************************************************/
-static void bta_vendor_ble_scan_pf_cmpl(tBTM_BLE_PF_ACTION action, tBTM_BLE_PF_COND_TYPE cfg_cond, tBTM_STATUS status)
-{
-    tBTA_STATUS st = (status == BTM_SUCCESS) ? BTA_SUCCESS: BTA_FAILURE;
-
-    if (bta_vendor_ble_scan_pf_cmpl_cback)
-        ((tBTA_DM_SCAN_PF_CBACK *) bta_vendor_ble_scan_pf_cmpl_cback)(action, cfg_cond, st);
-
-}
-/*******************************************************************************
-**
-** Function         bta_vendor_ble_scan_pf_enable
-**
-** Description      This function processes events for enabling adv payload filtering
-**                  feature
-**
-** Returns         TRUE if handled, otherwise FALSE.
-**
-*******************************************************************************/
-BOOLEAN bta_vendor_ble_scan_pf_enable(tBTA_SYS_VS_BLE_SCAN_PF_ENABLE *p_data)
-{
-    tBTM_STATUS st;
-    tBTA_STATUS status;
-
-    if ((st = BTM_BleEnableFilterCondition(p_data->enable,
-                                     p_data->p_target,
-                                     (tBTM_BLE_PF_CMPL_CBACK *)p_data->p_cmpl_cback))
-            == BTM_CMD_STARTED)
-    {
-        bta_vendor_ble_scan_pf_cmpl_cback = (tBTA_DM_SCAN_PF_CBACK *)p_data->p_cmpl_cback;
-    }
-    else
-    {
-        status = (st == BTM_SUCCESS) ? BTA_SUCCESS: BTA_FAILURE;
-        if (p_data->p_cmpl_cback)
-            ((tBTA_DM_SCAN_PF_CBACK *) p_data->p_cmpl_cback)(BTA_DM_BLE_PF_CONFIG_EVT, 0, status);
-    }
-
-    return TRUE;
-}
-
-
-/*******************************************************************************
-**
-** Function         bta_vendor_ble_scan_pf_condition
-**
-** Description      This function processes events for configuring the ADV filtering
-**                  condition
-**
-**
-** Returns         TRUE if handled, otherwise FALSE.
-**
-*******************************************************************************/
-BOOLEAN bta_vendor_ble_scan_pf_condition(tBTA_SYS_VS_BLE_SCAN_PF_COND *p_data)
-{
-    tBTM_STATUS st;
-    tBTA_STATUS status;
-
-    if ((st = BTM_BleCfgFilterCondition(p_data->action,
-                              p_data->cond_type,
-                                        (tBTM_BLE_PF_COND_PARAM *)p_data->p_cond,
-                                        bta_vendor_ble_scan_pf_cmpl))
-            == BTM_CMD_STARTED)
-    {
-        bta_vendor_ble_scan_pf_cmpl_cback = (tBTA_DM_SCAN_PF_CBACK *)p_data->p_cmpl_cback;
-    }
-    else
-    {
-        status = (st == BTM_SUCCESS) ? BTA_SUCCESS: BTA_FAILURE;
-        if (p_data->p_cmpl_cback)
-            ((tBTA_DM_SCAN_PF_CBACK *) p_data->p_cmpl_cback)(BTA_DM_BLE_PF_CONFIG_EVT, p_data->cond_type, status);
-    }
-    return TRUE;
-}
-#endif
-/*******************************************************************************
-**
-** Function         bta_vendor_evt_hdlr
-**
-** Description      This function processes events for Broadcom specific features.
-**
-** Returns         TRUE if handled, otherwise FALSE.
-**
-*******************************************************************************/
-BOOLEAN bta_vendor_evt_hdlr(UINT16 event, void *p)
-{
-    BOOLEAN   st = TRUE;
-
-    APPL_TRACE_EVENT("bta_vendor_evt_hdlr :0x%04x", event);
-
-    switch (event)
-    {
-#if BLE_INCLUDED == TRUE && BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE
-    case BTA_VS_BLE_SCAN_PF_ENABLE_EVT:
-        st = bta_vendor_ble_scan_pf_enable((tBTA_SYS_VS_BLE_SCAN_PF_ENABLE *)p);
-        break;
-
-    case BTA_VS_BLE_SCAN_PF_COND_EVT:
-        bta_vendor_ble_scan_pf_condition((tBTA_SYS_VS_BLE_SCAN_PF_COND*)p);
-        break;
-#endif
-
-    default:
-        APPL_TRACE_EVENT("Unknown BTA VS event: %d", event);
-        st = FALSE;
-        break;
-    }
-
-    return st;
-}
-
-
-
-/*******************************************************************************
-**
-** Function         BTA_DmBleCfgFilterCondition
-**
-** Description      This function is called to configure the adv data payload filter
-**                  condition.
-**
-** Parameters       action: to read/write/clear
-**                  cond_type: filter condition type.
-**                  p_cond: filter condition paramter
-**
-** Returns          void
-**
-*******************************************************************************/
-void BTA_DmBleCfgFilterCondition(tBTA_DM_BLE_SCAN_COND_OP action,
-                                 tBTA_DM_BLE_PF_COND_TYPE cond_type,
-                                 tBTA_DM_BLE_PF_COND_PARAM *p_cond,
-                                 tBTA_DM_SCAN_PF_CBACK *p_cmpl_cback)
-{
-#if BLE_INCLUDED == TRUE && BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE
-    tBTA_DM_API_CFG_FILTER_COND *p_msg;
-    UINT16  len = sizeof(tBTA_DM_API_CFG_FILTER_COND) + sizeof(tBTA_DM_BLE_PF_COND_PARAM) + \
-                BTM_BLE_PF_STR_LEN_MAX + BTM_BLE_PF_STR_LEN_MAX + sizeof(tBTA_DM_BLE_PF_COND_MASK);
-
-    UINT8 *p;
-
-    if ((p_msg = (tBTA_DM_API_CFG_FILTER_COND *) GKI_getbuf(len)) != NULL)
-    {
-        memset (p_msg, 0, len);
-
-        p_msg->hdr.event        = BTA_DM_API_CFG_FILTER_COND_EVT;
-        p_msg->action           = action;
-        p_msg->cond_type        = cond_type;
-        p_msg->p_cmpl_cback     = (void *) p_cmpl_cback;
-
-        if (p_cond)
-        {
-            p_msg->p_cond_param = (tBTA_DM_BLE_PF_COND_PARAM *)(p_msg + 1);
-            memcpy(p_msg->p_cond_param, p_cond, sizeof(tBTA_DM_BLE_PF_COND_PARAM));
-
-            p = (UINT8 *)(p_msg->p_cond_param + 1);
-
-            if (cond_type == BTA_DM_BLE_PF_SRVC_DATA_PATTERN ||cond_type == BTA_DM_BLE_PF_MANU_DATA)
-            {
-                p_msg->p_cond_param->manu_data.p_pattern = p;
-                p_msg->p_cond_param->manu_data.data_len = p_cond->manu_data.data_len;
-                memcpy(p_msg->p_cond_param->manu_data.p_pattern, p_cond->manu_data.p_pattern, p_cond->manu_data.data_len);
-                p += p_cond->manu_data.data_len;
-
-                if (cond_type == BTA_DM_BLE_PF_MANU_DATA)
-                {
-                    p_msg->p_cond_param->manu_data.company_id_mask = p_cond->manu_data.company_id_mask;
-                    if ( p_cond->manu_data.p_pattern_mask != NULL)
-                    {
-                        p_msg->p_cond_param->manu_data.p_pattern_mask = p;
-                        memcpy(p_msg->p_cond_param->manu_data.p_pattern_mask, p_cond->manu_data.p_pattern_mask, p_cond->manu_data.data_len);
-                    }
-                }
-            }
-            else if (cond_type == BTA_DM_BLE_PF_LOCAL_NAME)
-            {
-                p_msg->p_cond_param->local_name.p_data = p;
-                memcpy(p_msg->p_cond_param->local_name.p_data, p_cond->local_name.p_data, p_cond->local_name.data_len);
-
-            }
-            else if ((cond_type == BTM_BLE_PF_SRVC_UUID || cond_type == BTM_BLE_PF_SRVC_SOL_UUID))
-            {
-                if (p_cond->srvc_uuid.p_target_addr != NULL)
-                {
-                    p_msg->p_cond_param->srvc_uuid.p_target_addr = (tBLE_BD_ADDR *)(p);
-                    p_msg->p_cond_param->srvc_uuid.p_target_addr->type = p_cond->srvc_uuid.p_target_addr->type;
-                    memcpy(p_msg->p_cond_param->srvc_uuid.p_target_addr->bda, p_cond->srvc_uuid.p_target_addr->bda, BD_ADDR_LEN);
-                    p = (UINT8*)( p_msg->p_cond_param->srvc_uuid.p_target_addr + 1);
-                }
-                if (p_cond->srvc_uuid.p_uuid_mask)
-                {
-                    p_msg->p_cond_param->srvc_uuid.p_uuid_mask = (tBTA_DM_BLE_PF_COND_MASK *)p;
-                    memcpy(p_msg->p_cond_param->srvc_uuid.p_uuid_mask, p_cond->srvc_uuid.p_uuid_mask, sizeof(tBTA_DM_BLE_PF_COND_MASK));
-                }
-            }
-        }
-
-        bta_sys_sendmsg(p_msg);
-    }
-#endif
-}
-
-/*******************************************************************************
-**
-** Function         BTA_DmBleEnableFilterCondition
-**
-** Description      This function is called to enable the adv data payload filter
-**                  condition.
-**
-** Parameters       p_target: enabble the filter condition on a target device; if NULL
-**                            enable the generic scan condition.
-**                  enable: enable or disable the filter condition
-**
-** Returns          void
-**
-*******************************************************************************/
-void BTA_DmBleEnableFilterCondition(BOOLEAN enable, tBLE_BD_ADDR *p_target, tBTA_DM_SCAN_PF_CBACK *p_cmpl_cback)
-{
-#if BLE_INCLUDED == TRUE && BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE
-    tBTA_DM_API_ENABLE_SCAN_FILTER *p_msg;
-    UINT16  len = sizeof(tBTA_DM_API_ENABLE_SCAN_FILTER) + sizeof(tBLE_BD_ADDR);
-
-    if ((p_msg = (tBTA_DM_API_ENABLE_SCAN_FILTER *) GKI_getbuf(len)) != NULL)
-    {
-        memset (p_msg, 0, len);
-
-        p_msg->hdr.event        = BTA_DM_API_ENABLE_SCAN_FILTER_EVT;
-        p_msg->enable       = enable;
-        p_msg->p_cmpl_cback     = (void *) p_cmpl_cback;
-
-        if (p_target)
-        {
-            p_msg->p_target = (tBLE_BD_ADDR *)(p_msg + 1);
-            memcpy(p_msg->p_target, p_target, sizeof(tBLE_BD_ADDR));
-        }
-
-        bta_sys_sendmsg(p_msg);
-    }
-#endif
-}
-
-/*******************************************************************************
-**
-** Function         BTA_BrcmInit
-**
-** Description      This function initializes Broadcom specific
-**
-** Returns          void
-**
-*******************************************************************************/
-void BTA_BrcmInit (void)
-{
-    APPL_TRACE_API("BTA_BrcmInit");
-    bta_sys_cb.p_vs_evt_hdlr = bta_vendor_evt_hdlr;
-#if BLE_INCLUDED == TRUE && BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE
-    btm_ble_vendor_init();
-#endif
-}
-
-
index e00d5e2..ca3dd25 100644 (file)
@@ -26,7 +26,7 @@
 #include <string.h>
 #include "bt_target.h"
 
-#if (BLE_INCLUDED == TRUE && BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE)
+#if (BLE_INCLUDED == TRUE)
 #include "bt_types.h"
 #include "hcimsgs.h"
 #include "btu.h"
@@ -41,14 +41,10 @@ tBTM_BLE_VENDOR_CB  btm_ble_vendor_cb;
 
 static const BD_ADDR     na_bda= {0};
 
-
 /*******************************************************************************
 **         Resolve Address Using IRK List functions
 *******************************************************************************/
 
-#if BLE_PRIVACY_SPT == TRUE
-/* Forward declaration */
-tBTM_STATUS BTM_BleEnableIRKFeature(BOOLEAN enable);
 
 /*******************************************************************************
 **
@@ -64,6 +60,7 @@ tBTM_STATUS BTM_BleEnableIRKFeature(BOOLEAN enable);
 *******************************************************************************/
 void btm_ble_vendor_enq_irk_pending(BD_ADDR target_bda, BD_ADDR psuedo_bda, UINT8 to_add)
 {
+#if BLE_PRIVACY_SPT == TRUE
     tBTM_BLE_IRK_Q          *p_q = &btm_ble_vendor_cb.irk_pend_q;
 
     memcpy(p_q->irk_q[p_q->q_next], target_bda, BD_ADDR_LEN);
@@ -71,8 +68,8 @@ void btm_ble_vendor_enq_irk_pending(BD_ADDR target_bda, BD_ADDR psuedo_bda, UINT
     p_q->irk_q_action[p_q->q_next] = to_add;
 
     p_q->q_next ++;
-    p_q->q_next %= BTM_CS_IRK_LIST_MAX;
-
+    p_q->q_next %= btm_cb.cmn_ble_vsc_cb.max_irk_list_sz;;
+#endif
     return ;
 }
 /*******************************************************************************
@@ -89,6 +86,7 @@ void btm_ble_vendor_enq_irk_pending(BD_ADDR target_bda, BD_ADDR psuedo_bda, UINT
 *******************************************************************************/
 BOOLEAN btm_ble_vendor_find_irk_pending_entry(BD_ADDR psuedo_addr, UINT8 action)
 {
+#if BLE_PRIVACY_SPT == TRUE
     tBTM_BLE_IRK_Q          *p_q = &btm_ble_vendor_cb.irk_pend_q;
     UINT8   i;
 
@@ -99,8 +97,9 @@ BOOLEAN btm_ble_vendor_find_irk_pending_entry(BD_ADDR psuedo_addr, UINT8 action)
             return TRUE;
 
         i ++;
-        i %= BTM_CS_IRK_LIST_MAX;
+        i %= btm_cb.cmn_ble_vsc_cb.max_irk_list_sz;
     }
+#endif
     return FALSE;
 }
 /*******************************************************************************
@@ -117,6 +116,7 @@ BOOLEAN btm_ble_vendor_find_irk_pending_entry(BD_ADDR psuedo_addr, UINT8 action)
 *******************************************************************************/
 BOOLEAN btm_ble_vendor_deq_irk_pending(BD_ADDR target_bda, BD_ADDR psuedo_addr)
 {
+#if BLE_PRIVACY_SPT == TRUE
     tBTM_BLE_IRK_Q          *p_q = &btm_ble_vendor_cb.irk_pend_q;
 
     if (p_q->q_next != p_q->q_pending)
@@ -125,11 +125,11 @@ BOOLEAN btm_ble_vendor_deq_irk_pending(BD_ADDR target_bda, BD_ADDR psuedo_addr)
         memcpy(psuedo_addr, p_q->irk_q_random_pseudo[p_q->q_pending], BD_ADDR_LEN);
 
         p_q->q_pending ++;
-        p_q->q_pending %= BTM_CS_IRK_LIST_MAX;
+        p_q->q_pending %= btm_cb.cmn_ble_vsc_cb.max_irk_list_sz;
 
         return TRUE;
     }
-
+#endif
     return FALSE;
 
 }
@@ -144,16 +144,18 @@ BOOLEAN btm_ble_vendor_deq_irk_pending(BD_ADDR target_bda, BD_ADDR psuedo_addr)
 *******************************************************************************/
 tBTM_BLE_IRK_ENTRY * btm_ble_vendor_find_irk_entry(BD_ADDR target_bda)
 {
+#if BLE_PRIVACY_SPT == TRUE
     tBTM_BLE_IRK_ENTRY  *p_irk_entry = &btm_ble_vendor_cb.irk_list[0];
     UINT8   i;
 
-    for (i = 0; i < BTM_CS_IRK_LIST_MAX; i ++, p_irk_entry++)
+    for (i = 0; i < btm_cb.cmn_ble_vsc_cb.max_irk_list_sz; i ++, p_irk_entry++)
     {
         if (p_irk_entry->in_use && memcmp(p_irk_entry->bd_addr, target_bda, BD_ADDR_LEN) == 0)
         {
             return p_irk_entry ;
         }
     }
+#endif
     return NULL;
 }
 /*******************************************************************************
@@ -167,16 +169,18 @@ tBTM_BLE_IRK_ENTRY * btm_ble_vendor_find_irk_entry(BD_ADDR target_bda)
 *******************************************************************************/
 tBTM_BLE_IRK_ENTRY * btm_ble_vendor_find_irk_entry_by_psuedo_addr (BD_ADDR psuedo_bda)
 {
+#if BLE_PRIVACY_SPT == TRUE
     tBTM_BLE_IRK_ENTRY  *p_irk_entry = &btm_ble_vendor_cb.irk_list[0];
     UINT8   i;
 
-    for (i = 0; i < BTM_CS_IRK_LIST_MAX; i ++, p_irk_entry++)
+    for (i = 0; i < btm_cb.cmn_ble_vsc_cb.max_irk_list_sz; i ++, p_irk_entry++)
     {
         if (p_irk_entry->in_use && memcmp(p_irk_entry->psuedo_bda, psuedo_bda, BD_ADDR_LEN) == 0)
         {
             return p_irk_entry ;
         }
     }
+#endif
     return NULL;
 }
 /*******************************************************************************
@@ -190,10 +194,11 @@ tBTM_BLE_IRK_ENTRY * btm_ble_vendor_find_irk_entry_by_psuedo_addr (BD_ADDR psued
 *******************************************************************************/
 UINT8 btm_ble_vendor_alloc_irk_entry(BD_ADDR target_bda, BD_ADDR pseudo_bda)
 {
+#if BLE_PRIVACY_SPT == TRUE
     tBTM_BLE_IRK_ENTRY  *p_irk_entry = &btm_ble_vendor_cb.irk_list[0];
     UINT8   i;
 
-    for (i = 0; i < BTM_CS_IRK_LIST_MAX; i ++, p_irk_entry++)
+    for (i = 0; i < btm_cb.cmn_ble_vsc_cb.max_irk_list_sz; i ++, p_irk_entry++)
     {
         if (!p_irk_entry->in_use)
         {
@@ -206,6 +211,7 @@ UINT8 btm_ble_vendor_alloc_irk_entry(BD_ADDR target_bda, BD_ADDR pseudo_bda)
             return i;
         }
     }
+#endif
     return BTM_CS_IRK_LIST_INVALID;
 }
 
@@ -220,6 +226,7 @@ UINT8 btm_ble_vendor_alloc_irk_entry(BD_ADDR target_bda, BD_ADDR pseudo_bda)
 *******************************************************************************/
 void btm_ble_vendor_update_irk_list(BD_ADDR target_bda, BD_ADDR pseudo_bda, BOOLEAN add)
 {
+#if BLE_PRIVACY_SPT == TRUE
     tBTM_BLE_IRK_ENTRY   *p_irk_entry = btm_ble_vendor_find_irk_entry(target_bda);
     UINT8       i;
 
@@ -248,6 +255,7 @@ void btm_ble_vendor_update_irk_list(BD_ADDR target_bda, BD_ADDR pseudo_bda, BOOL
             BTM_TRACE_ERROR("No IRK exist in list, can not remove");
         }
     }
+#endif
     return ;
 }
 /*******************************************************************************
@@ -277,13 +285,18 @@ void btm_ble_vendor_irk_vsc_op_cmpl (tBTM_VSC_CMPL *p_params)
 
     op_subcode   = *p ++;
     BTM_TRACE_DEBUG("btm_ble_vendor_irk_vsc_op_cmpl op_subcode = %d", op_subcode);
-    if (evt_len < )
+    if (evt_len < 1)
     {
-        BTM_TRACE_ERROR("can not interpret IRK  VSC cmpl callback");
+        BTM_TRACE_ERROR("cannot interpret IRK VSC cmpl callback");
         return;
     }
 
-
+    if (BTM_BLE_META_IRK_ENABLE == op_subcode)
+    {
+        BTM_TRACE_DEBUG("IRK enable: %d, %d", status, op_subcode);
+        return;
+    }
+    else
     if (op_subcode == BTM_BLE_META_CLEAR_IRK_LIST)
     {
         if (status == HCI_SUCCESS)
@@ -293,7 +306,7 @@ void btm_ble_vendor_irk_vsc_op_cmpl (tBTM_VSC_CMPL *p_params)
 
             BTM_TRACE_DEBUG("p_cb->irk_list_size = %d", p_cb->irk_avail_size);
 
-            for (i = 0; i < BTM_CS_IRK_LIST_MAX; i ++)
+            for (i = 0; i < btm_cb.cmn_ble_vsc_cb.max_irk_list_sz; i ++)
                 memset(&p_cb->irk_list[i], 0, sizeof(tBTM_BLE_IRK_ENTRY));
         }
     }
@@ -349,10 +362,7 @@ void btm_ble_vendor_irk_vsc_op_cmpl (tBTM_VSC_CMPL *p_params)
             p += (1 + 16 + 1); /* skip index, IRK value, address type */
             STREAM_TO_BDADDR(target_bda, p);
             STREAM_TO_BDADDR(rra, p);
-
-#if (defined BLE_VND_INCLUDED && BLE_VND_INCLUDED == TRUE)
             btm_ble_refresh_rra(target_bda, rra);
-#endif
         }
     }
 
@@ -371,6 +381,7 @@ void btm_ble_vendor_irk_vsc_op_cmpl (tBTM_VSC_CMPL *p_params)
 *******************************************************************************/
 tBTM_STATUS btm_ble_remove_irk_entry(tBTM_SEC_DEV_REC *p_dev_rec)
 {
+#if BLE_PRIVACY_SPT == TRUE
     UINT8           param[20], *p;
     tBTM_STATUS     st;
     tBTM_BLE_VENDOR_CB  *p_cb = &btm_ble_vendor_cb;
@@ -393,7 +404,8 @@ tBTM_STATUS btm_ble_remove_irk_entry(tBTM_SEC_DEV_REC *p_dev_rec)
     }
 
     return st;
-
+#endif
+    return BTM_MODE_UNSUPPORTED;
 }
 /*******************************************************************************
 **
@@ -408,6 +420,7 @@ tBTM_STATUS btm_ble_remove_irk_entry(tBTM_SEC_DEV_REC *p_dev_rec)
 *******************************************************************************/
 tBTM_STATUS btm_ble_vendor_clear_irk_list(void)
 {
+#if BLE_PRIVACY_SPT == TRUE
     UINT8           param[20], *p;
     tBTM_STATUS     st;
 
@@ -422,7 +435,8 @@ tBTM_STATUS btm_ble_vendor_clear_irk_list(void)
                                     btm_ble_vendor_irk_vsc_op_cmpl);
 
     return st;
-
+#endif
+    return BTM_MODE_UNSUPPORTED;
 }
 /*******************************************************************************
 **
@@ -437,6 +451,7 @@ tBTM_STATUS btm_ble_vendor_clear_irk_list(void)
 *******************************************************************************/
 tBTM_STATUS btm_ble_read_irk_entry(BD_ADDR target_bda)
 {
+#if BLE_PRIVACY_SPT == TRUE
     UINT8           param[20], *p;
     tBTM_STATUS     st = BTM_UNKNOWN_ADDR;
     tBTM_BLE_IRK_ENTRY *p_entry = btm_ble_vendor_find_irk_entry(target_bda);
@@ -456,7 +471,8 @@ tBTM_STATUS btm_ble_read_irk_entry(BD_ADDR target_bda)
                                     btm_ble_vendor_irk_vsc_op_cmpl);
 
     return st;
-
+#endif
+    return BTM_MODE_UNSUPPORTED;
 }
 
 
@@ -474,6 +490,7 @@ tBTM_STATUS btm_ble_read_irk_entry(BD_ADDR target_bda)
 *******************************************************************************/
 void btm_ble_vendor_irk_list_known_dev(BOOLEAN enable)
 {
+#if BLE_PRIVACY_SPT == TRUE
     UINT8               i;
     UINT8               count = 0;
     tBTM_SEC_DEV_REC    *p_dev_rec = &btm_cb.sec_dev_rec[0];
@@ -489,8 +506,8 @@ void btm_ble_vendor_irk_list_known_dev(BOOLEAN enable)
     }
 
     if ((count > 0 && enable) || !enable)
-        BTM_BleEnableIRKFeature(enable);
-
+        btm_ble_vendor_enable_irk_feature(enable);
+#endif
     return ;
 }
 /*******************************************************************************
@@ -506,6 +523,7 @@ void btm_ble_vendor_irk_list_known_dev(BOOLEAN enable)
 *******************************************************************************/
 BOOLEAN btm_ble_vendor_irk_list_load_dev(tBTM_SEC_DEV_REC *p_dev_rec)
 {
+#if BLE_PRIVACY_SPT == TRUE
     UINT8           param[40], *p;
     tBTM_BLE_VENDOR_CB  *p_cb = &btm_ble_vendor_cb;
     BOOLEAN         rt = FALSE;
@@ -553,6 +571,8 @@ BOOLEAN btm_ble_vendor_irk_list_load_dev(tBTM_SEC_DEV_REC *p_dev_rec)
         BTM_TRACE_DEBUG("Device not a RPA enabled device");
     }
     return rt;
+#endif
+    return FALSE;
 }
 /*******************************************************************************
 **
@@ -567,6 +587,7 @@ BOOLEAN btm_ble_vendor_irk_list_load_dev(tBTM_SEC_DEV_REC *p_dev_rec)
 *******************************************************************************/
 void btm_ble_vendor_irk_list_remove_dev(tBTM_SEC_DEV_REC *p_dev_rec)
 {
+#if BLE_PRIVACY_SPT == TRUE
     tBTM_BLE_VENDOR_CB  *p_cs_cb = &btm_ble_vendor_cb;
     tBTM_BLE_IRK_ENTRY *p_irk_entry;
 
@@ -581,7 +602,8 @@ void btm_ble_vendor_irk_list_remove_dev(tBTM_SEC_DEV_REC *p_dev_rec)
     }
 
     if (p_cs_cb->irk_list_size == 0)
-        BTM_BleEnableIRKFeature(FALSE);
+        btm_ble_vendor_enable_irk_feature(FALSE);
+#endif
 }
 /*******************************************************************************
 **
@@ -596,13 +618,14 @@ void btm_ble_vendor_irk_list_remove_dev(tBTM_SEC_DEV_REC *p_dev_rec)
 *******************************************************************************/
 void btm_ble_vendor_disable_irk_list(void)
 {
-    BTM_BleEnableIRKFeature(FALSE);
-
+#if BLE_PRIVACY_SPT == TRUE
+    btm_ble_vendor_enable_irk_feature(FALSE);
+#endif
 }
 
 /*******************************************************************************
 **
-** Function         BTM_BleEnableIRKFeature
+** Function         btm_ble_vendor_enable_irk_feature
 **
 ** Description      This function is called to enable or disable the RRA
 **                  offloading feature.
@@ -612,8 +635,9 @@ void btm_ble_vendor_disable_irk_list(void)
 ** Returns          BTM_SUCCESS if successful
 **
 *******************************************************************************/
-tBTM_STATUS BTM_BleEnableIRKFeature(BOOLEAN enable)
+tBTM_STATUS btm_ble_vendor_enable_irk_feature(BOOLEAN enable)
 {
+#if BLE_PRIVACY_SPT == TRUE
     UINT8           param[20], *p;
     tBTM_STATUS     st = BTM_WRONG_MODE;
     tBTM_BLE_PF_COUNT *p_bda_filter;
@@ -629,9 +653,75 @@ tBTM_STATUS BTM_BleEnableIRKFeature(BOOLEAN enable)
                                param, btm_ble_vendor_irk_vsc_op_cmpl);
 
     return st;
+#endif
+    return BTM_MODE_UNSUPPORTED;
 }
 
 #endif
+
+/*******************************************************************************
+**
+** Function         btm_ble_vendor_init
+**
+** Description      Initialize customer specific feature information in host stack
+**
+** Parameters  Max IRK list size
+**                   Max filter supported
+**
+** Returns          void
+**
+*******************************************************************************/
+void btm_ble_vendor_init(UINT8 max_irk_list_sz)
+{
+    memset(&btm_ble_vendor_cb, 0, sizeof(tBTM_BLE_VENDOR_CB));
+
+#if BLE_PRIVACY_SPT == TRUE
+    if (max_irk_list_sz > 0)
+    {
+        btm_ble_vendor_cb.irk_list =  (tBTM_BLE_IRK_ENTRY*)GKI_getbuf (sizeof (tBTM_BLE_IRK_ENTRY)
+                                                                        * max_irk_list_sz);
+        btm_ble_vendor_cb.irk_pend_q.irk_q =  (BD_ADDR*) GKI_getbuf (sizeof (BD_ADDR) *
+                                                                     max_irk_list_sz);
+        btm_ble_vendor_cb.irk_pend_q.irk_q_random_pseudo = (BD_ADDR*)GKI_getbuf (sizeof (BD_ADDR) *
+                                                                                 max_irk_list_sz);
+        btm_ble_vendor_cb.irk_pend_q.irk_q_action = (UINT8*) GKI_getbuf (max_irk_list_sz);
+    }
+
+    btm_ble_vendor_cb.irk_avail_size = max_irk_list_sz;
+
+    if (!HCI_LE_HOST_SUPPORTED(btm_cb.devcb.local_lmp_features[HCI_EXT_FEATURES_PAGE_1]))
+        return;
+#endif
+}
+
+/*******************************************************************************
+**
+** Function         btm_ble_vendor_cleanup
+**
+** Description      Cleanup VSC specific dynamic memory
+**
+** Parameters
+**
+** Returns          void
+**
+*******************************************************************************/
+void btm_ble_vendor_cleanup(void)
+{
+#if BLE_PRIVACY_SPT == TRUE
+    if (btm_ble_vendor_cb.irk_list)
+        GKI_freebuf(btm_ble_vendor_cb.irk_list);
+
+    if (btm_ble_vendor_cb.irk_pend_q.irk_q)
+       GKI_freebuf(btm_ble_vendor_cb.irk_pend_q.irk_q);
+
+    if (btm_ble_vendor_cb.irk_pend_q.irk_q_random_pseudo)
+        GKI_freebuf(btm_ble_vendor_cb.irk_pend_q.irk_q_random_pseudo);
+
+    if (btm_ble_vendor_cb.irk_pend_q.irk_q_action)
+        GKI_freebuf(btm_ble_vendor_cb.irk_pend_q.irk_q_action);
 #endif
+    memset(&btm_ble_vendor_cb, 0, sizeof(tBTM_BLE_VENDOR_CB));
+}
+
 
 
diff --git a/vnd/include/bta_vendor_api.h b/vnd/include/bta_vendor_api.h
deleted file mode 100644 (file)
index 9ff5d30..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-
-/******************************************************************************
- *
- *  Copyright (C) 2003-2014 Broadcom Corporation
- *
- *  Licensed under the Apache License, Version 2.0 (the "License");
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at:
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- ******************************************************************************/
-
-/*****************************************************************************
-**
-**  Name:           bta_vendor_api.h
-**
-**  Description:       VENDOR custom Ble API Bluetooth application definitions
-**
-*****************************************************************************/
-#ifndef BTA_VENDOR_API_H
-#define BTA_VENDOR_API_H
-
-#include "bta_api.h"
-#include "bta_sys.h"
-#include "vendor_api.h"
-
-
-
-
-#if (BLE_INCLUDED == TRUE && BLE_ANDROID_CONTROLLER_SCAN_FILTER == TRUE)
-
-/*******************************************************************************
-**
-** Function         BTA_BrcmInit
-**
-** Description      This function initializes Broadcom specific VS handler in BTA
-**
-** Returns          void
-**
-*******************************************************************************/
-BTA_API extern void BTA_BrcmInit (void);
-
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
-
-
index bd4aa33..6207c84 100644 (file)
 #define BTM_BLE_PF_SRVC_DATA_PATTERN_BIT    BTM_BLE_PF_BIT_TO_MASK(BTM_BLE_PF_SRVC_DATA_PATTERN)
 typedef UINT8 tBTM_BLE_PF_SEL_MASK;
 
-
-#ifndef BTM_CS_IRK_LIST_MAX
-#define BTM_CS_IRK_LIST_MAX     0x20
-#endif
+#define BTM_BLE_MAX_FILTER_COUNTER  (BTM_BLE_MAX_ADDR_FILTER + 1) /* per device filter + one generic filter indexed by 0 */
 
 #define BTM_CS_IRK_LIST_INVALID     0xff
 
@@ -79,9 +76,9 @@ typedef struct
 
 typedef struct
 {
-    BD_ADDR         irk_q[BTM_CS_IRK_LIST_MAX];
-    BD_ADDR         irk_q_random_pseudo[BTM_CS_IRK_LIST_MAX];
-    UINT8           irk_q_action[BTM_CS_IRK_LIST_MAX];
+    BD_ADDR         *irk_q;
+    BD_ADDR         *irk_q_random_pseudo;
+    UINT8           *irk_q_action;
     UINT8           q_next;
     UINT8           q_pending;
 } tBTM_BLE_IRK_Q;
@@ -92,14 +89,13 @@ typedef struct
     BOOLEAN             enable;
 
     UINT8               op_type;
-    tBTM_BLE_PF_COUNT   addr_filter_count[BTM_BLE_MAX_FILTER_COUNTER]; /* per BDA filter indexed by tBTM_BLE_PF_COND_TYPE */
     tBLE_BD_ADDR        cur_filter_target;
 
     UINT8               irk_list_size;
     UINT8               irk_avail_size;
-    tBTM_BLE_IRK_ENTRY  irk_list[BTM_CS_IRK_LIST_MAX];
+    tBTM_BLE_IRK_ENTRY  *irk_list;
     tBTM_BLE_IRK_Q      irk_pend_q;
-
+    UINT8                max_filter_supported;
     tBTM_BLE_PF_CMPL_CBACK *p_scan_pf_cback;
 }tBTM_BLE_VENDOR_CB;
 
@@ -122,8 +118,11 @@ extern BOOLEAN btm_ble_vendor_irk_list_load_dev(tBTM_SEC_DEV_REC *p_dev_rec);
 extern void btm_ble_vendor_irk_list_remove_dev(tBTM_SEC_DEV_REC *p_dev_rec);
 extern tBTM_STATUS btm_ble_enable_vendor_feature (BOOLEAN enable, UINT32 feature_bit);
 
-extern void btm_ble_vendor_init(void);
+extern void btm_ble_vendor_init(UINT8 max_irk_list_sz);
+extern void btm_ble_vendor_cleanup(void);
 extern BOOLEAN btm_ble_vendor_write_device_wl_attribute (tBLE_ADDR_TYPE addr_type, BD_ADDR bd_addr, UINT8 attribute);
+extern tBTM_STATUS btm_ble_vendor_enable_irk_feature(BOOLEAN enable);
+
 #ifdef __cplusplus
 }
 #endif