From: zhiweijian Date: Wed, 27 Sep 2017 07:29:42 +0000 (+0800) Subject: Component/bt: fix add whitelist failed X-Git-Tag: v3.1-dev~185^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=cd3d9715bbedb6c8538d1d99715b048e0a940da6;p=esp-idf Component/bt: fix add whitelist failed - fix add whitelist failed - add add whitelist callback func --- diff --git a/components/bt/bluedroid/api/esp_gap_ble_api.c b/components/bt/bluedroid/api/esp_gap_ble_api.c index 713ec47400..5276c74caf 100644 --- a/components/bt/bluedroid/api/esp_gap_ble_api.c +++ b/components/bt/bluedroid/api/esp_gap_ble_api.c @@ -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; diff --git a/components/bt/bluedroid/api/include/esp_gap_ble_api.h b/components/bt/bluedroid/api/include/esp_gap_ble_api.h index 9292f95e6b..c7cd9c1931 100644 --- a/components/bt/bluedroid/api/include/esp_gap_ble_api.h +++ b/components/bt/bluedroid/api/include/esp_gap_ble_api.h @@ -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; /** diff --git a/components/bt/bluedroid/bta/dm/bta_dm_act.c b/components/bt/bluedroid/bta/dm/bta_dm_act.c index 916547fd05..8db2011e8b 100644 --- a/components/bt/bluedroid/bta/dm/bta_dm_act.c +++ b/components/bt/bluedroid/bta/dm/bta_dm_act.c @@ -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) diff --git a/components/bt/bluedroid/bta/dm/bta_dm_api.c b/components/bt/bluedroid/bta/dm/bta_dm_api.c index 2f3c7a912f..8415918771 100644 --- a/components/bt/bluedroid/bta/dm/bta_dm_api.c +++ b/components/bt/bluedroid/bta/dm/bta_dm_api.c @@ -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); diff --git a/components/bt/bluedroid/bta/dm/bta_dm_int.h b/components/bt/bluedroid/bta/dm/bta_dm_int.h index 5676758aa9..fbef4cbdfc 100644 --- a/components/bt/bluedroid/bta/dm/bta_dm_int.h +++ b/components/bt/bluedroid/bta/dm/bta_dm_int.h @@ -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 { diff --git a/components/bt/bluedroid/bta/include/bta_api.h b/components/bt/bluedroid/bta/include/bta_api.h index 12fd911cc8..65852cdcae 100644 --- a/components/bt/bluedroid/bta/include/bta_api.h +++ b/components/bt/bluedroid/bta/include/bta_api.h @@ -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); diff --git a/components/bt/bluedroid/btc/profile/std/gap/btc_gap_ble.c b/components/bt/bluedroid/btc/profile/std/gap/btc_gap_ble.c index d77b1249f2..3e3c8a0055 100644 --- a/components/bt/bluedroid/btc/profile/std/gap/btc_gap_ble.c +++ b/components/bt/bluedroid/btc/profile/std/gap/btc_gap_ble.c @@ -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, ¶m, + 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); diff --git a/components/bt/bluedroid/stack/btm/btm_ble_bgconn.c b/components/bt/bluedroid/stack/btm/btm_ble_bgconn.c index 4d57f3edcb..1a9b12654b 100644 --- a/components/bt/bluedroid/stack/btm/btm_ble_bgconn.c +++ b/components/bt/bluedroid/stack/btm/btm_ble_bgconn.c @@ -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(); + } /******************************************************************************* ** diff --git a/components/bt/bluedroid/stack/btm/btm_ble_gap.c b/components/bt/bluedroid/stack/btm/btm_ble_gap.c index 4e62504a05..02d886c984 100644 --- a/components/bt/bluedroid/stack/btm/btm_ble_gap.c +++ b/components/bt/bluedroid/stack/btm/btm_ble_gap.c @@ -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); } /******************************************************************************* diff --git a/components/bt/bluedroid/stack/gatt/gatt_utils.c b/components/bt/bluedroid/stack/gatt/gatt_utils.c index 3439a31d14..37e213227b 100644 --- a/components/bt/bluedroid/stack/gatt/gatt_utils.c +++ b/components/bt/bluedroid/stack/gatt/gatt_utils.c @@ -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); } } } diff --git a/components/bt/bluedroid/stack/include/btm_api.h b/components/bt/bluedroid/stack/include/btm_api.h index e477eae110..bbdfd1b721 100644 --- a/components/bt/bluedroid/stack/include/btm_api.h +++ b/components/bt/bluedroid/stack/include/btm_api.h @@ -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); diff --git a/components/bt/bluedroid/stack/include/btm_ble_api.h b/components/bt/bluedroid/stack/include/btm_ble_api.h index d23313cb81..f09b2dca59 100644 --- a/components/bt/bluedroid/stack/include/btm_ble_api.h +++ b/components/bt/bluedroid/stack/include/btm_ble_api.h @@ -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); /******************************************************************************* ** diff --git a/components/bt/bluedroid/stack/include/btm_ble_int.h b/components/bt/bluedroid/stack/include/btm_ble_int.h index a73a42e76d..a99af77d8a 100644 --- a/components/bt/bluedroid/stack/include/btm_ble_int.h +++ b/components/bt/bluedroid/stack/include/btm_ble_int.h @@ -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);