Merge branch 'bugfix/fix_privacy_callback_trigger_multipe_times' into 'master'

Bugfix/fix privacy callback trigger multiple times

See merge request espressif/esp-idf!47205
This commit is contained in:
Island
2026-04-03 20:35:47 +08:00
8 changed files with 71 additions and 32 deletions
@@ -38,6 +38,7 @@
#include "bta/utl.h"
#include "stack/gap_api.h" /* For GAP_BleReadPeerPrefConnParams */
#include <string.h>
#include <stdint.h>
#include "device/controller.h"
#include "bta_dm_gap.h"
@@ -265,6 +266,27 @@ UINT8 *g_disc_raw_data_buf;
#if (BLE_INCLUDED == TRUE)
tBTM_BLE_LEGACY_GAP_CBACK ble_legacy_gap_cb;
static uint64_t ble_legacy_gap_oneshot_mask;
void BTM_BleLegacyGapOneshotArm(tBTM_BLE_LEGACY_GAP_EVENT event)
{
if (event < BTM_BLE_LEGACY_GAP_MAX_EVT) {
ble_legacy_gap_oneshot_mask |= (1ULL << event);
}
}
void BTM_BleLegacyGapOneshotFireIfArmed(tBTM_BLE_LEGACY_GAP_EVENT event, tBTM_BLE_LEGACY_GAP_CB_PARAMS *params)
{
if (event >= BTM_BLE_LEGACY_GAP_MAX_EVT) {
return;
}
uint64_t bit = (1ULL << event);
if ((ble_legacy_gap_oneshot_mask & bit) == 0) {
return;
}
ble_legacy_gap_oneshot_mask &= ~bit;
BTM_LegacyBleCallbackTrigger(event, params);
}
void BTM_BleLegacyGapRegisterCallback(tBTM_BLE_LEGACY_GAP_CBACK cb)
{
@@ -5226,7 +5248,7 @@ void bta_dm_ble_set_conn_params (tBTA_DM_MSG *p_data)
void bta_dm_ble_set_scan_fil_params(tBTA_DM_MSG *p_data)
{
tBTM_STATUS status;
tBTM_BLE_LEGACY_GAP_CB_PARAMS cb_params;
status = BTM_BleSetScanFilterParams (p_data->ble_set_scan_fil_params.client_if,
p_data->ble_set_scan_fil_params.scan_int,
@@ -5240,7 +5262,7 @@ void bta_dm_ble_set_scan_fil_params(tBTA_DM_MSG *p_data)
APPL_TRACE_ERROR("%s(), fail to set scan params.", __func__);
}
tBTM_BLE_LEGACY_GAP_CB_PARAMS cb_params = {0};
memset(&cb_params, 0, sizeof(cb_params));
cb_params.status = status;
BTM_LegacyBleCallbackTrigger(BTM_BLE_LEGACY_GAP_SCAN_PARAMS_SET_COMPLETE_EVT, &cb_params);
}
@@ -5291,6 +5313,8 @@ void bta_dm_ble_disconnect (tBTA_DM_MSG *p_data)
void bta_dm_ble_set_rand_address(tBTA_DM_MSG *p_data)
{
tBTM_STATUS status = BTM_SET_STATIC_RAND_ADDR_FAIL;
tBTM_BLE_LEGACY_GAP_CB_PARAMS cb_params;
if (p_data->set_addr.addr_type != BLE_ADDR_RANDOM) {
APPL_TRACE_ERROR("Invalid random address type = %d\n", p_data->set_addr.addr_type);
goto _addr_set_end;
@@ -5299,7 +5323,7 @@ void bta_dm_ble_set_rand_address(tBTA_DM_MSG *p_data)
status = BTM_BleSetRandAddress(p_data->set_addr.address);
_addr_set_end:
tBTM_BLE_LEGACY_GAP_CB_PARAMS cb_params = {0};
memset(&cb_params, 0, sizeof(cb_params));
cb_params.status = status;
BTM_LegacyBleCallbackTrigger(BTM_BLE_LEGACY_GAP_SET_RANDOM_ADDR_EVT, &cb_params);
@@ -5369,6 +5393,8 @@ void bta_dm_ble_set_key_material (tBTA_DM_MSG *p_data)
void bta_dm_ble_scan (tBTA_DM_MSG *p_data)
{
tBTM_STATUS status;
tBTM_BLE_LEGACY_GAP_CB_PARAMS cb_params;
if (p_data->ble_scan.start) {
/*Save the callback to be called when a scan results are available */
bta_dm_search_cb.p_scan_cback = p_data->ble_scan.p_cback;
@@ -5378,7 +5404,7 @@ void bta_dm_ble_scan (tBTA_DM_MSG *p_data)
APPL_TRACE_WARNING(" %s start scan failed. status=0x%x\n", __FUNCTION__, status);
}
tBTM_BLE_LEGACY_GAP_CB_PARAMS cb_params = {0};
memset(&cb_params, 0, sizeof(cb_params));
status = (status == BTM_CMD_STARTED ? BTA_SUCCESS : BTA_FAILURE);
cb_params.status = status;
BTM_LegacyBleCallbackTrigger(BTM_BLE_LEGACY_GAP_SCAN_START_COMPLETE_EVT, &cb_params);
@@ -5391,7 +5417,7 @@ void bta_dm_ble_scan (tBTA_DM_MSG *p_data)
APPL_TRACE_WARNING(" %s stop scan failed, status=0x%x\n", __FUNCTION__, status);
}
tBTM_BLE_LEGACY_GAP_CB_PARAMS cb_params = {0};
memset(&cb_params, 0, sizeof(cb_params));
status = (status == BTM_CMD_STARTED ? BTA_SUCCESS : BTA_FAILURE);
cb_params.status = status;
BTM_LegacyBleCallbackTrigger(BTM_BLE_LEGACY_GAP_SCAN_STOP_COMPLETE_EVT, &cb_params);
@@ -5419,6 +5445,8 @@ void bta_dm_ble_scan (tBTA_DM_MSG *p_data)
void bta_dm_ble_start_adv_with_params (tBTA_DM_MSG *p_data)
{
tBTM_STATUS status = BTA_FAILURE;
tBTM_BLE_LEGACY_GAP_CB_PARAMS cb_params;
status = BTM_BleStartAdvWithParams(p_data->ble_set_adv_params_all.adv_int_min,
p_data->ble_set_adv_params_all.adv_int_max,
p_data->ble_set_adv_params_all.adv_type,
@@ -5435,7 +5463,7 @@ void bta_dm_ble_start_adv_with_params (tBTA_DM_MSG *p_data)
status = BTM_BleStartAdv();
_adv_param_error:
tBTM_BLE_LEGACY_GAP_CB_PARAMS cb_params = {0};
memset(&cb_params, 0, sizeof(cb_params));
cb_params.status = status;
BTM_LegacyBleCallbackTrigger(BTM_BLE_LEGACY_GAP_ADV_START_COMPLETE_EVT, &cb_params);
}
@@ -5471,11 +5499,12 @@ void bta_dm_ble_update_duplicate_exceptional_list(tBTA_DM_MSG *p_data)
void bta_dm_ble_set_adv_config (tBTA_DM_MSG *p_data)
{
tBTM_STATUS status;
tBTM_BLE_LEGACY_GAP_CB_PARAMS cb_params;
status = BTM_BleWriteAdvData(p_data->ble_set_adv_data.data_mask,
(tBTM_BLE_ADV_DATA *)p_data->ble_set_adv_data.p_adv_cfg);
tBTM_BLE_LEGACY_GAP_CB_PARAMS cb_params = {0};
memset(&cb_params, 0, sizeof(cb_params));
cb_params.status = status;
BTM_LegacyBleCallbackTrigger(BTM_BLE_LEGACY_GAP_ADV_DATA_SET_COMPLETE_EVT, &cb_params);
}
@@ -5492,11 +5521,12 @@ void bta_dm_ble_set_adv_config (tBTA_DM_MSG *p_data)
void bta_dm_ble_set_adv_config_raw (tBTA_DM_MSG *p_data)
{
tBTM_STATUS status;
tBTM_BLE_LEGACY_GAP_CB_PARAMS cb_params;
status = BTM_BleWriteAdvDataRaw(p_data->ble_set_adv_data_raw.p_raw_adv,
p_data->ble_set_adv_data_raw.raw_adv_len);
tBTM_BLE_LEGACY_GAP_CB_PARAMS cb_params = {0};
memset(&cb_params, 0, sizeof(cb_params));
cb_params.status = status;
BTM_LegacyBleCallbackTrigger(BTM_BLE_LEGACY_GAP_ADV_RAW_SET_COMPLETE_EVT, &cb_params);
}
@@ -5513,11 +5543,12 @@ void bta_dm_ble_set_adv_config_raw (tBTA_DM_MSG *p_data)
void bta_dm_ble_set_scan_rsp (tBTA_DM_MSG *p_data)
{
tBTM_STATUS status;
tBTM_BLE_LEGACY_GAP_CB_PARAMS cb_params;
status = BTM_BleWriteScanRsp(p_data->ble_set_adv_data.data_mask,
(tBTM_BLE_ADV_DATA *)p_data->ble_set_adv_data.p_adv_cfg);
tBTM_BLE_LEGACY_GAP_CB_PARAMS cb_params = {0};
memset(&cb_params, 0, sizeof(cb_params));
cb_params.status = status;
BTM_LegacyBleCallbackTrigger(BTM_BLE_LEGACY_GAP_SCAN_RSP_SET_COMPLETE_EVT, &cb_params);
}
@@ -5534,11 +5565,12 @@ void bta_dm_ble_set_scan_rsp (tBTA_DM_MSG *p_data)
void bta_dm_ble_set_scan_rsp_raw (tBTA_DM_MSG *p_data)
{
tBTM_STATUS status;
tBTM_BLE_LEGACY_GAP_CB_PARAMS cb_params;
status = BTM_BleWriteScanRspRaw(p_data->ble_set_adv_data_raw.p_raw_adv,
p_data->ble_set_adv_data_raw.raw_adv_len);
tBTM_BLE_LEGACY_GAP_CB_PARAMS cb_params = {0};
memset(&cb_params, 0, sizeof(cb_params));
cb_params.status = status;
BTM_LegacyBleCallbackTrigger(BTM_BLE_LEGACY_GAP_RSP_RAW_SET_COMPLETE_EVT, &cb_params);
}
@@ -5556,10 +5588,13 @@ void bta_dm_ble_set_data_length(tBTA_DM_MSG *p_data)
{
UINT8 status = BTM_SUCCESS;
tACL_CONN *p_acl_cb = btm_bda_to_acl(p_data->ble_set_data_length.remote_bda, BT_TRANSPORT_LE);
tBTM_BLE_LEGACY_GAP_CB_PARAMS cb_params;
uint16_t length;
if (p_acl_cb == NULL) {
APPL_TRACE_ERROR("%s error: Invalid connection remote_bda.", __func__);
uint16_t length = controller_get_interface()->get_acl_data_size_ble();
tBTM_BLE_LEGACY_GAP_CB_PARAMS cb_params = {0};
length = controller_get_interface()->get_acl_data_size_ble();
memset(&cb_params, 0, sizeof(cb_params));
cb_params.data_length_params.status = BTM_UNKNOWN_ADDR;
cb_params.data_length_params.rx_len = length;
cb_params.data_length_params.tx_len = length;
@@ -5591,7 +5626,7 @@ void bta_dm_ble_set_data_length(tBTA_DM_MSG *p_data)
if (status != BTM_SUCCESS) {
APPL_TRACE_ERROR("%s failed\n", __FUNCTION__);
if (p_acl_cb->data_length_params.tx_len == 0){
uint16_t length = controller_get_interface()->get_acl_data_size_ble();
length = controller_get_interface()->get_acl_data_size_ble();
p_acl_cb->data_length_params.rx_len = length;
p_acl_cb->data_length_params.tx_len = length;
}
@@ -5602,7 +5637,7 @@ void bta_dm_ble_set_data_length(tBTA_DM_MSG *p_data)
}
_data_length_set_complete:
tBTM_BLE_LEGACY_GAP_CB_PARAMS cb_params = {0};
memset(&cb_params, 0, sizeof(cb_params));
cb_params.data_length_params.status = status;
cb_params.data_length_params.rx_len = p_acl_cb->data_length_params.rx_len;
cb_params.data_length_params.tx_len = p_acl_cb->data_length_params.tx_len;
@@ -5624,13 +5659,15 @@ _data_length_set_complete:
void bta_dm_ble_advstop (tBTA_DM_MSG *p_data)
{
tBTM_STATUS status;
tBTM_BLE_LEGACY_GAP_CB_PARAMS cb_params;
status = BTM_BleAdvStop();
if (status != BTM_SUCCESS) {
APPL_TRACE_ERROR("%s failed\n", __FUNCTION__);
}
tBTM_BLE_LEGACY_GAP_CB_PARAMS cb_params = {0};
memset(&cb_params, 0, sizeof(cb_params));
cb_params.status = status;
BTM_LegacyBleCallbackTrigger(BTM_BLE_LEGACY_GAP_ADV_STOP_COMPLETE_EVT, &cb_params);
@@ -103,10 +103,17 @@ typedef union {
#define BTM_BLE_LEGACY_GAP_SET_VENDOR_EVT_MASK_COMPLETE_EVT 0x15
#define BTM_BLE_LEGACY_GAP_SET_CHANNELS_COMPLETE_EVT 0x16
#define BTM_BLE_LEGACY_GAP_SET_PRIVACY_MODE_COMPLETE_EVT 0x17
// BTM_BLE_LEGACY_GAP_MAX_EVT should not be modified
#define BTM_BLE_LEGACY_GAP_MAX_EVT 0x40
typedef void (*tBTM_BLE_LEGACY_GAP_CBACK)(tBTM_BLE_LEGACY_GAP_EVENT event, tBTM_BLE_LEGACY_GAP_CB_PARAMS *params);
void BTM_BleLegacyGapRegisterCallback(tBTM_BLE_LEGACY_GAP_CBACK cb);
void BTM_LegacyBleCallbackTrigger(tBTM_BLE_LEGACY_GAP_EVENT event, tBTM_BLE_LEGACY_GAP_CB_PARAMS *params);
/* Arm legacy GAP one-shot: next HCI complete for this event may invoke the registered callback once. */
void BTM_BleLegacyGapOneshotArm(tBTM_BLE_LEGACY_GAP_EVENT event);
/* If armed, disarm and call BTM_LegacyBleCallbackTrigger; otherwise no-op. */
void BTM_BleLegacyGapOneshotFireIfArmed(tBTM_BLE_LEGACY_GAP_EVENT event, tBTM_BLE_LEGACY_GAP_CB_PARAMS *params);
#endif // #if BLE_INCLUDED == TRUE
#endif /* BTA_DM_GAP_H */
@@ -2280,6 +2280,7 @@ tBTM_STATUS BTM_ReadChannelMap(BD_ADDR remote_bda)
{
tACL_CONN *p;
tBTM_BLE_CH_MAP_RESULTS result;
tBTM_BLE_LEGACY_GAP_CB_PARAMS cb_params;
UINT8 status;
BTM_TRACE_DEBUG("BTM_ReadChannelMap: RemBdAddr: %02x%02x%02x%02x%02x%02x\n",
@@ -2310,7 +2311,7 @@ tBTM_STATUS BTM_ReadChannelMap(BD_ADDR remote_bda)
result.status = BTM_UNKNOWN_ADDR;
_ch_map_err:
tBTM_BLE_LEGACY_GAP_CB_PARAMS cb_params = {0};
memset(&cb_params, 0, sizeof(cb_params));
// `ch_map_read` is same as `results`
memcpy(&cb_params.ch_map_results, &result, sizeof(tBTM_BLE_CH_MAP_RESULTS));
BTM_LegacyBleCallbackTrigger(BTM_BLE_LEGACY_GAP_READ_CHANNEL_MAP_EVT, &cb_params);
@@ -2362,6 +2363,7 @@ void btm_read_channel_map_complete(UINT8 *p)
BTM_TRACE_DEBUG("btm_read_channel_map_complete\n");
if (btm_cb.devcb.is_ch_map_cb) {
tBTM_BLE_LEGACY_GAP_CB_PARAMS cb_params;
/* Reset the callback pointer to prevent duplicate calls */
btm_cb.devcb.is_ch_map_cb = false;
/* Extract HCI status from the response */
@@ -2390,7 +2392,7 @@ void btm_read_channel_map_complete(UINT8 *p)
}
/* Invoke the registered callback with the results */
tBTM_BLE_LEGACY_GAP_CB_PARAMS cb_params = {0};
memset(&cb_params, 0, sizeof(cb_params));
// `ch_map_read` is same as `results`
memcpy(&cb_params.ch_map_results, &results, sizeof(tBTM_BLE_CH_MAP_RESULTS));
BTM_LegacyBleCallbackTrigger(BTM_BLE_LEGACY_GAP_READ_CHANNEL_MAP_EVT, &cb_params);
@@ -80,10 +80,9 @@ static void btm_gen_resolve_paddr_cmpl(tSMP_ENC *p)
BTM_TRACE_DEBUG("set random address failed");
status = BTM_SET_PRIVACY_FAIL;
}
tBTM_BLE_LEGACY_GAP_CB_PARAMS cb_params = {0};
cb_params.status = status;
BTM_LegacyBleCallbackTrigger(BTM_BLE_LEGACY_GAP_SET_PRIVACY_EVT, &cb_params);
BTM_BleLegacyGapOneshotFireIfArmed(BTM_BLE_LEGACY_GAP_SET_PRIVACY_EVT, &cb_params);
}
/*******************************************************************************
**
@@ -283,6 +283,7 @@ BOOLEAN btm_update_dev_to_white_list(BOOLEAN to_add, BD_ADDR bd_addr, tBLE_ADDR_
{
BOOLEAN result = TRUE;
UINT8 status;
tBTM_BLE_LEGACY_GAP_CB_PARAMS cb_params;
#if (BLE_50_FEATURE_SUPPORT == TRUE)
if (addr_type > BLE_ADDR_RANDOM && addr_type != BLE_ADDR_ANONYMOUS)
#else
@@ -366,7 +367,7 @@ BOOLEAN btm_update_dev_to_white_list(BOOLEAN to_add, BD_ADDR bd_addr, tBLE_ADDR_
return TRUE;
_wl_end:
tBTM_BLE_LEGACY_GAP_CB_PARAMS cb_params = {0};
memset(&cb_params, 0, sizeof(cb_params));
cb_params.white_list_update.status = status;
cb_params.white_list_update.operation = to_add ? BTM_WHITELIST_ADD : BTM_WHITELIST_REMOVE;
BTM_LegacyBleCallbackTrigger(BTM_BLE_LEGACY_GAP_WHITE_LIST_UPDATE_EVT, &cb_params);
@@ -37,6 +37,7 @@
#include "hci/hci_layer.h"
#if BLE_INCLUDED == TRUE
#include "l2c_int.h"
#include "bta_dm_gap.h"
#include "stack/gattdefs.h"
#include "gatt_int.h"
@@ -493,7 +494,7 @@ BOOLEAN BTM_BleConfigPrivacy(BOOLEAN privacy_mode)
}
if (random_cb){
random_cb->cb_is_triggered = false;
BTM_BleLegacyGapOneshotArm(BTM_BLE_LEGACY_GAP_SET_PRIVACY_EVT);
}else{
BTM_TRACE_ERROR("%s,random_cb = NULL", __func__);
}
@@ -4104,7 +4105,7 @@ BOOLEAN BTM_BleAddDevToResolvingList(BD_ADDR addr,
BTM_TRACE_ERROR("Add device to resolving list error");
return FALSE;
}
BTM_BleLegacyGapOneshotArm(BTM_BLE_LEGACY_GAP_ADD_DEV_TO_RPA_LIST_EVT);
return TRUE;
}
@@ -298,7 +298,7 @@ void btm_ble_add_resolving_list_entry_complete(UINT8 *p, UINT16 evt_len)
tBTM_BLE_LEGACY_GAP_CB_PARAMS cb_params = {0};
cb_params.status = status;
BTM_LegacyBleCallbackTrigger(BTM_BLE_LEGACY_GAP_ADD_DEV_TO_RPA_LIST_EVT, &cb_params);
BTM_BleLegacyGapOneshotFireIfArmed(BTM_BLE_LEGACY_GAP_ADD_DEV_TO_RPA_LIST_EVT, &cb_params);
BTM_TRACE_DEBUG("%s status = %d", __func__, status);
@@ -436,19 +436,12 @@ void btm_ble_set_addr_resolution_enable_complete(UINT8 *p, UINT16 evt_len)
BTM_TRACE_DEBUG("%s status = %d", __func__, status);
tBTM_LE_RANDOM_CB *random_cb = &btm_cb.ble_ctr_cb.addr_mgnt_cb;
if (random_cb->cb_is_triggered) {
return;
}
if (status != HCI_SUCCESS) {
BTM_TRACE_ERROR("set local privacy failed with status: 0x%x", status);
}
random_cb->cb_is_triggered = true;
tBTM_BLE_LEGACY_GAP_CB_PARAMS cb_params = {0};
cb_params.status = (status == HCI_SUCCESS)? BTM_SUCCESS : BTM_ILLEGAL_VALUE;
BTM_LegacyBleCallbackTrigger(BTM_BLE_LEGACY_GAP_SET_PRIVACY_EVT, &cb_params);
BTM_BleLegacyGapOneshotFireIfArmed(BTM_BLE_LEGACY_GAP_SET_PRIVACY_EVT, &cb_params);
}
/*******************************************************************************
@@ -203,7 +203,6 @@ typedef struct {
tBTM_BLE_ADDR_CBACK *p_generate_cback;
void *p;
TIMER_LIST_ENT raddr_timer_ent;
bool cb_is_triggered;
} tBTM_LE_RANDOM_CB;
#define BTM_BLE_MAX_BG_CONN_DEV_NUM 10