]> granicus.if.org Git - esp-idf/commitdiff
Component/bt: fix add whitelist failed
authorzhiweijian <zhiweijian@espressif.com>
Wed, 27 Sep 2017 07:29:42 +0000 (15:29 +0800)
committerzhiweijian <zhiweijian@espressif.com>
Wed, 11 Oct 2017 07:30:09 +0000 (15:30 +0800)
- fix add whitelist failed
- add add whitelist callback func

13 files changed:
components/bt/bluedroid/api/esp_gap_ble_api.c
components/bt/bluedroid/api/include/esp_gap_ble_api.h
components/bt/bluedroid/bta/dm/bta_dm_act.c
components/bt/bluedroid/bta/dm/bta_dm_api.c
components/bt/bluedroid/bta/dm/bta_dm_int.h
components/bt/bluedroid/bta/include/bta_api.h
components/bt/bluedroid/btc/profile/std/gap/btc_gap_ble.c
components/bt/bluedroid/stack/btm/btm_ble_bgconn.c
components/bt/bluedroid/stack/btm/btm_ble_gap.c
components/bt/bluedroid/stack/gatt/gatt_utils.c
components/bt/bluedroid/stack/include/btm_api.h
components/bt/bluedroid/stack/include/btm_ble_api.h
components/bt/bluedroid/stack/include/btm_ble_int.h

index 713ec474000a031f3f5ce2bf50dc2f42fb748fd0..5276c74caf740851a89affd3094ef4bf85d36f89 100644 (file)
@@ -203,7 +203,9 @@ esp_err_t esp_ble_gap_update_whitelist(bool add_remove, esp_bd_addr_t remote_bda
     if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
         return ESP_ERR_INVALID_STATE;
     }
-
+    if (!remote_bda){
+        return ESP_ERR_INVALID_SIZE;
+    }
     msg.sig = BTC_SIG_API_CALL;
     msg.pid = BTC_PID_GAP_BLE;
     msg.act = BTC_GAP_BLE_ACT_UPDATE_WHITE_LIST;
index 9292f95e6b22392062b8056d97e9d345e4d18358..c7cd9c1931d67b11ebbcdd07e11cf7a3c2d0ed12 100644 (file)
@@ -97,6 +97,7 @@ typedef enum {
     ESP_GAP_BLE_CLEAR_BOND_DEV_COMPLETE_EVT,                /*!< When clear the bond device clear complete, the event comes */
     ESP_GAP_BLE_GET_BOND_DEV_COMPLETE_EVT,                  /*!< When get the bond device list complete, the event comes */
     ESP_GAP_BLE_READ_RSSI_COMPLETE_EVT,                     /*!< When read the rssi complete, the event comes */
+    ESP_GAP_BLE_ADD_WHITELIST_COMPLETE_EVT,                 /*!< When add or remove whitelist complete, the event comes */
     ESP_GAP_BLE_EVT_MAX,
 } esp_gap_ble_cb_event_t;
 
@@ -462,6 +463,10 @@ typedef enum {
     ESP_BLE_EVT_SCAN_RSP         = 0x04,        /*!< Scan Response (SCAN_RSP) */
 } esp_ble_evt_type_t;
 
+typedef enum{
+    ESP_BLE_WHITELIST_REMOVE     = 0X00,    /*!< remove mac from whitelist */
+    ESP_BLE_WHITELIST_ADD        = 0X01,    /*!< add address to whitelist */
+}esp_ble_wl_opration;
 /**
  * @brief Gap callback parameters union
  */
@@ -600,6 +605,13 @@ typedef union {
                                                          if the RSSI cannot be read, the RSSI metric shall be set to 127. */
         esp_bd_addr_t remote_addr;                  /*!< The remote device address */
     } read_rssi_cmpl;                               /*!< Event parameter of ESP_GAP_BLE_READ_RSSI_COMPLETE_EVT */
+    /**
+     * @brief ESP_GAP_BLE_ADD_WHITELIST_COMPLETE_EVT
+     */
+    struct ble_add_whitelist_cmpl_evt_param {
+        esp_bt_status_t status;                     /*!< Indicate the add or remove whitelist operation success status */
+        esp_ble_wl_opration wl_opration;            /*!< The value is ESP_BLE_WHITELIST_ADD if add address to whitelist operation success, ESP_BLE_WHITELIST_REMOVE if remove address from the whitelist operation success */
+    } add_whitelist_cmpl;                           /*!< Event parameter of ESP_GAP_BLE_ADD_WHITELIST_COMPLETE_EVT */
 } esp_ble_gap_cb_param_t;
 
 /**
index 916547fd055bfbb540e374ad7e1da50a7ca0c097..8db2011e8b4e501c970dd788951bc5d3a6a90326 100644 (file)
@@ -525,7 +525,7 @@ void bta_dm_set_dev_name (tBTA_DM_MSG *p_data)
 
 void bta_dm_update_white_list(tBTA_DM_MSG *p_data)
 {
-    BTM_BleUpdateAdvWhitelist(p_data->white_list.add_remove, p_data->white_list.remote_addr);
+    BTM_BleUpdateAdvWhitelist(p_data->white_list.add_remove, p_data->white_list.remote_addr, p_data->white_list.add_wl_cb);
 }
 
 void bta_dm_ble_read_adv_tx_power(tBTA_DM_MSG *p_data)
index 2f3c7a912fabac2962ef87e486156549fa26176a..84159187713fbecb6ba787a175d2b771c3144fff 100644 (file)
@@ -183,12 +183,13 @@ void BTA_DmSetDeviceName(char *p_name)
 
 }
 
-void BTA_DmUpdateWhiteList(BOOLEAN add_remove,  BD_ADDR remote_addr)
+void BTA_DmUpdateWhiteList(BOOLEAN add_remove,  BD_ADDR remote_addr, tBTA_ADD_WHITELIST_CBACK *add_wl_cb)
 {
     tBTA_DM_API_UPDATE_WHITE_LIST *p_msg;
     if ((p_msg = (tBTA_DM_API_UPDATE_WHITE_LIST *)osi_malloc(sizeof(tBTA_DM_API_UPDATE_WHITE_LIST))) != NULL) {
         p_msg->hdr.event = BTA_DM_API_UPDATE_WHITE_LIST_EVT;
         p_msg->add_remove = add_remove;
+        p_msg->add_wl_cb = add_wl_cb;
         memcpy(p_msg->remote_addr, remote_addr, sizeof(BD_ADDR));
 
         bta_sys_sendmsg(p_msg);
index 5676758aa979cd14f7cddaf53e5d0155ce0d8642..fbef4cbdfc3484b25422f7c2420f3f4859f3d721 100644 (file)
@@ -183,6 +183,7 @@ typedef struct {
     BT_HDR    hdr;
     BOOLEAN   add_remove;
     BD_ADDR   remote_addr;
+    tBTA_ADD_WHITELIST_CBACK *add_wl_cb;
 }tBTA_DM_API_UPDATE_WHITE_LIST;
 
 typedef struct {
index 12fd911cc8101228ef698ccd2a8d408af14b2e51..65852cdcae5cbd12efef434c9d24a7963a8b4f86 100644 (file)
@@ -402,6 +402,8 @@ typedef void (tBTA_SET_ADV_DATA_CMPL_CBACK) (tBTA_STATUS status);
 
 typedef void (tBTA_START_ADV_CMPL_CBACK) (tBTA_STATUS status);
 
+typedef tBTM_ADD_WHITELIST_CBACK tBTA_ADD_WHITELIST_CBACK;
+
 typedef tBTM_SET_PKT_DATA_LENGTH_CBACK tBTA_SET_PKT_DATA_LENGTH_CBACK;
 
 typedef tBTM_SET_LOCAL_PRIVACY_CBACK tBTA_SET_LOCAL_PRIVACY_CBACK;
@@ -1410,7 +1412,7 @@ extern void BTA_DisableTestMode(void);
 *******************************************************************************/
 extern void BTA_DmSetDeviceName(char *p_name);
 
-extern void BTA_DmUpdateWhiteList(BOOLEAN add_remove,  BD_ADDR remote_addr);
+extern void BTA_DmUpdateWhiteList(BOOLEAN add_remove,  BD_ADDR remote_addr, tBTA_ADD_WHITELIST_CBACK *add_wl_cb);
 
 extern void BTA_DmBleReadAdvTxPower(tBTA_CMPL_CB *cmpl_cb);
 
index d77b1249f2ab01fa8fdb36b8cfcc6748daf0fe61..3e3c8a00553136d0979f4cfff5b1fab4152dd228 100644 (file)
@@ -681,6 +681,24 @@ static void btc_set_pkt_length_callback(UINT8 status, tBTM_LE_SET_PKT_DATA_LENGT
     }
 }
 
+static void btc_add_whitelist_complete_callback(UINT8 status, tBTM_WL_OPERATION wl_opration)
+{
+    esp_ble_gap_cb_param_t param;
+    bt_status_t ret;
+    btc_msg_t msg;
+    msg.sig = BTC_SIG_API_CB;
+    msg.pid = BTC_PID_GAP_BLE;
+    msg.act = ESP_GAP_BLE_ADD_WHITELIST_COMPLETE_EVT;
+    param.add_whitelist_cmpl.status = btc_hci_to_esp_status(status);
+    param.add_whitelist_cmpl.wl_opration = wl_opration;
+    ret = btc_transfer_context(&msg, &param,
+                               sizeof(esp_ble_gap_cb_param_t), NULL);
+
+    if (ret != BT_STATUS_SUCCESS) {
+        LOG_ERROR("%s btc_transfer_context failed\n", __func__);
+    }
+}
+
 static void btc_set_local_privacy_callback(UINT8 status)
 {
     esp_ble_gap_cb_param_t param;
@@ -1031,7 +1049,7 @@ void btc_gap_ble_call_handler(btc_msg_t *msg)
         btc_ble_config_local_privacy(arg->cfg_local_privacy.privacy_enable, btc_set_local_privacy_callback);
         break;    
     case BTC_GAP_BLE_ACT_UPDATE_WHITE_LIST:
-        BTA_DmUpdateWhiteList(arg->update_white_list.add_remove, arg->update_white_list.remote_bda);
+        BTA_DmUpdateWhiteList(arg->update_white_list.add_remove, arg->update_white_list.remote_bda, btc_add_whitelist_complete_callback);
         break;
     case BTC_GAP_BLE_ACT_READ_RSSI:
         BTA_DmBleReadRSSI(arg->read_rssi.remote_addr, btc_read_ble_rssi_cmpl_callback);
index 4d57f3edcb81fba64738902a1254b7d0e9febb32..1a9b12654b50933f01e79286ef18185645d2ebc6 100644 (file)
@@ -41,7 +41,7 @@
 #if (BLE_INCLUDED == TRUE)
 
 static void btm_suspend_wl_activity(tBTM_BLE_WL_STATE wl_state);
-static void btm_resume_wl_activity(tBTM_BLE_WL_STATE wl_state);
+static void btm_wl_update_to_controller(void);
 
 // Unfortunately (for now?) we have to maintain a copy of the device whitelist
 // on the host to determine if a device is pending to be connected or not. This
@@ -185,9 +185,10 @@ BOOLEAN btm_add_dev_to_controller (BOOLEAN to_add, BD_ADDR bd_addr)
     else {
         BTM_ReadDevInfo(bd_addr, &dev_type, &addr_type);
 
-        started = btsnd_hcic_ble_remove_from_white_list (addr_type, bd_addr);
         if (to_add) {
             started = btsnd_hcic_ble_add_white_list (addr_type, bd_addr);
+        }else{
+            started = btsnd_hcic_ble_remove_from_white_list (addr_type, bd_addr);
         }
     }
 
@@ -253,7 +254,7 @@ void btm_enq_wl_dev_operation(BOOLEAN to_add, BD_ADDR bd_addr)
 **                  the white list.
 **
 *******************************************************************************/
-BOOLEAN btm_update_dev_to_white_list(BOOLEAN to_add, BD_ADDR bd_addr)
+BOOLEAN btm_update_dev_to_white_list(BOOLEAN to_add, BD_ADDR bd_addr, tBTM_ADD_WHITELIST_CBACK *add_wl_cb)
 {
     tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
 
@@ -261,6 +262,10 @@ BOOLEAN btm_update_dev_to_white_list(BOOLEAN to_add, BD_ADDR bd_addr)
         BTM_TRACE_DEBUG("%s Whitelist full, unable to add device", __func__);
         return FALSE;
     }
+    if (add_wl_cb){
+        //save add whitelist complete callback
+        p_cb->add_wl_cb = add_wl_cb;
+    }
 
     if (to_add) {
         /* added the bd_addr to the connection hash map queue */
@@ -273,8 +278,8 @@ BOOLEAN btm_update_dev_to_white_list(BOOLEAN to_add, BD_ADDR bd_addr)
     btm_suspend_wl_activity(p_cb->wl_state);
     /* save the bd_addr to the btm_cb env */
     btm_enq_wl_dev_operation(to_add, bd_addr);
-    /* save the ba_addr to the controller white list & start the auto connet */
-    btm_resume_wl_activity(p_cb->wl_state);
+    /* save the ba_addr to the controller white list */
+    btm_wl_update_to_controller();
     return TRUE;
 }
 
@@ -336,9 +341,16 @@ void btm_ble_white_list_init(UINT8 white_list_size)
 void btm_ble_add_2_white_list_complete(UINT8 status)
 {
     BTM_TRACE_EVENT("%s status=%d", __func__, status);
+    tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
     if (status == HCI_SUCCESS) {
         --btm_cb.ble_ctr_cb.white_list_avail_size;
     }
+    // add whitelist complete callback
+    if (p_cb->add_wl_cb)
+    {
+        (*p_cb->add_wl_cb)(status, BTM_WHITELIST_ADD);
+    }
+
 }
 
 /*******************************************************************************
@@ -350,11 +362,16 @@ void btm_ble_add_2_white_list_complete(UINT8 status)
 *******************************************************************************/
 void btm_ble_remove_from_white_list_complete(UINT8 *p, UINT16 evt_len)
 {
+    tBTM_BLE_CB *p_cb = &btm_cb.ble_ctr_cb;
     UNUSED(evt_len);
     BTM_TRACE_EVENT ("%s status=%d", __func__, *p);
     if (*p == HCI_SUCCESS) {
         ++btm_cb.ble_ctr_cb.white_list_avail_size;
     }
+    if (p_cb->add_wl_cb)
+    {
+        (*p_cb->add_wl_cb)(*p, BTM_WHITELIST_REMOVE);
+    }
 }
 
 /*******************************************************************************
@@ -594,14 +611,32 @@ static void btm_suspend_wl_activity(tBTM_BLE_WL_STATE wl_state)
 ** Returns          none.
 **
 *******************************************************************************/
-static void btm_resume_wl_activity(tBTM_BLE_WL_STATE wl_state)
+void btm_resume_wl_activity(tBTM_BLE_WL_STATE wl_state)
 {
     btm_ble_resume_bg_conn();
-
     if (wl_state & BTM_BLE_WL_ADV) {
         btm_ble_start_adv();
     }
 
+}
+
+/*******************************************************************************
+**
+** Function         btm_wl_update_to_controller
+**
+** Description      This function is to update white list to controller
+**
+** Returns          none.
+**
+*******************************************************************************/
+static void btm_wl_update_to_controller(void)
+{
+    /* whitelist will be added in the btm_ble_resume_bg_conn(), we do not
+       support background connection now, so we nedd to use btm_execute_wl_dev_operation
+       to add whitelist directly ,if we support background connection in the future,
+       please delete btm_execute_wl_dev_operation(). */
+    btm_execute_wl_dev_operation();
+
 }
 /*******************************************************************************
 **
index 4e62504a05675f3f80ba1eaaff3a21fbb2dd6092..02d886c984d63b1cdcce27fde3a49da7ea286522 100644 (file)
@@ -244,9 +244,9 @@ void BTM_BleRegiseterConnParamCallback(tBTM_UPDATE_CONN_PARAM_CBACK *update_conn
 ** Returns          void
 **
 *******************************************************************************/
-BOOLEAN BTM_BleUpdateAdvWhitelist(BOOLEAN add_remove, BD_ADDR remote_bda)
+BOOLEAN BTM_BleUpdateAdvWhitelist(BOOLEAN add_remove, BD_ADDR remote_bda, tBTM_ADD_WHITELIST_CBACK *add_wl_cb)
 {
-    return btm_update_dev_to_white_list(add_remove, remote_bda);
+    return btm_update_dev_to_white_list(add_remove, remote_bda, add_wl_cb);
 }
 
 /*******************************************************************************
@@ -882,7 +882,7 @@ void BTM_BleClearBgConnDev(void)
 BOOLEAN BTM_BleUpdateBgConnDev(BOOLEAN add_remove, BD_ADDR   remote_bda)
 {
     BTM_TRACE_EVENT("%s() add=%d", __func__, add_remove);
-    return btm_update_dev_to_white_list(add_remove, remote_bda);
+    return btm_update_dev_to_white_list(add_remove, remote_bda, NULL);
 }
 
 /*******************************************************************************
index 3439a31d14468f7b3b75e2e674e2803f809968b8..37e213227b7f303823e732c04f345f211377820b 100644 (file)
@@ -2416,7 +2416,7 @@ BOOLEAN gatt_add_bg_dev_list(tGATT_REG *p_reg,  BD_ADDR bd_addr, BOOLEAN is_init
                     p_dev->listen_gif[i] = gatt_if;
 
                     if (i == 0) {
-                        ret = BTM_BleUpdateAdvWhitelist(TRUE, bd_addr);
+                        ret = BTM_BleUpdateAdvWhitelist(TRUE, bd_addr, NULL);
                     } else {
                         ret = TRUE;
                     }
@@ -2556,7 +2556,7 @@ BOOLEAN gatt_remove_bg_dev_from_list(tGATT_REG *p_reg, BD_ADDR bd_addr, BOOLEAN
                 }
 
                 if (p_dev->listen_gif[0] == 0) {
-                    ret = BTM_BleUpdateAdvWhitelist(FALSE, p_dev->remote_bda);
+                    ret = BTM_BleUpdateAdvWhitelist(FALSE, p_dev->remote_bda, NULL);
                 } else {
                     ret = TRUE;
                 }
@@ -2617,7 +2617,7 @@ void gatt_deregister_bgdev_list(tGATT_IF gatt_if)
                     }
 
                     if (p_dev_list->listen_gif[0] == 0) {
-                        BTM_BleUpdateAdvWhitelist(FALSE, p_dev_list->remote_bda);
+                        BTM_BleUpdateAdvWhitelist(FALSE, p_dev_list->remote_bda, NULL);
                     }
                 }
             }
index e477eae11096a690cbbded7e94058a4e7a4969a7..bbdfd1b721c0d712182d115262f14239022974c8 100644 (file)
@@ -146,6 +146,11 @@ typedef struct {
     UINT16              supervision_tout;
 }tBTM_LE_UPDATE_CONN_PRAMS;
 
+typedef enum{
+    BTM_WHITELIST_REMOVE     = 0X00,
+    BTM_WHITELIST_ADD        = 0X01,
+}tBTM_WL_OPERATION;
+
 
 typedef void (tBTM_DEV_STATUS_CB) (tBTM_DEV_STATUS status);
 
@@ -177,6 +182,8 @@ typedef void (tBTM_UPDATE_CONN_PARAM_CBACK) (UINT8 status, BD_ADDR bd_addr, tBTM
 
 typedef void (tBTM_SET_PKT_DATA_LENGTH_CBACK) (UINT8 status, tBTM_LE_SET_PKT_DATA_LENGTH_PARAMS *data_length_params);
 
+typedef void (tBTM_ADD_WHITELIST_CBACK) (UINT8 status, tBTM_WL_OPERATION wl_opration);
+
 typedef void (tBTM_SET_LOCAL_PRIVACY_CBACK) (UINT8 status);
 
 
index d23313cb8126f714bde5bc29522ca6b219813a14..f09b2dca59b88e0aa5a297acdb2e56fede32fcbd 100644 (file)
@@ -1695,7 +1695,7 @@ void BTM_BleTurnOnPrivacyOnRemote(BD_ADDR bd_addr,
 **
 *******************************************************************************/
 //extern
-BOOLEAN BTM_BleUpdateAdvWhitelist(BOOLEAN add_remove, BD_ADDR emote_bda);
+BOOLEAN BTM_BleUpdateAdvWhitelist(BOOLEAN add_remove, BD_ADDR emote_bda, tBTM_ADD_WHITELIST_CBACK *add_wl_cb);
 
 /*******************************************************************************
 **
index a73a42e76d79b6858fee61e59aaf177eb0ad4176..a99af77d8a456d7f5b41a1d262ddbd5948b0353a 100644 (file)
@@ -314,6 +314,7 @@ typedef struct {
 
     /* white list information */
     UINT8 white_list_avail_size;
+    tBTM_ADD_WHITELIST_CBACK *add_wl_cb;
     tBTM_BLE_WL_STATE wl_state;
 
     fixed_queue_t *conn_pending_q;
@@ -405,7 +406,7 @@ void btm_ble_update_sec_key_size(BD_ADDR bd_addr, UINT8 enc_key_size);
 UINT8 btm_ble_read_sec_key_size(BD_ADDR bd_addr);
 
 /* white list function */
-BOOLEAN btm_update_dev_to_white_list(BOOLEAN to_add, BD_ADDR bd_addr);
+BOOLEAN btm_update_dev_to_white_list(BOOLEAN to_add, BD_ADDR bd_addr, tBTM_ADD_WHITELIST_CBACK *add_wl_cb);
 void btm_update_scanner_filter_policy(tBTM_BLE_SFP scan_policy);
 void btm_update_adv_filter_policy(tBTM_BLE_AFP adv_policy);
 void btm_ble_clear_white_list (void);