From 5272b7e75b1fdb4613a5ffb92f8783897c38b3ba Mon Sep 17 00:00:00 2001 From: zhiweijian Date: Wed, 1 Apr 2026 14:23:16 +0800 Subject: [PATCH] fix(ble/bluedroid): Fixed privacy callback triggering multiple times --- .../bt/host/bluedroid/bta/dm/bta_dm_act.c | 67 ++++++++++++++----- .../bluedroid/bta/dm/include/bta_dm_gap.h | 7 ++ .../bt/host/bluedroid/stack/btm/btm_acl.c | 6 +- .../host/bluedroid/stack/btm/btm_ble_addr.c | 3 +- .../host/bluedroid/stack/btm/btm_ble_bgconn.c | 3 +- .../bt/host/bluedroid/stack/btm/btm_ble_gap.c | 5 +- .../bluedroid/stack/btm/btm_ble_privacy.c | 11 +-- .../bluedroid/stack/btm/include/btm_ble_int.h | 1 - 8 files changed, 71 insertions(+), 32 deletions(-) diff --git a/components/bt/host/bluedroid/bta/dm/bta_dm_act.c b/components/bt/host/bluedroid/bta/dm/bta_dm_act.c index ede4c723f7..8b44f27a28 100644 --- a/components/bt/host/bluedroid/bta/dm/bta_dm_act.c +++ b/components/bt/host/bluedroid/bta/dm/bta_dm_act.c @@ -38,6 +38,7 @@ #include "bta/utl.h" #include "stack/gap_api.h" /* For GAP_BleReadPeerPrefConnParams */ #include +#include #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); diff --git a/components/bt/host/bluedroid/bta/dm/include/bta_dm_gap.h b/components/bt/host/bluedroid/bta/dm/include/bta_dm_gap.h index 35dce1be9f..de3d48033b 100644 --- a/components/bt/host/bluedroid/bta/dm/include/bta_dm_gap.h +++ b/components/bt/host/bluedroid/bta/dm/include/bta_dm_gap.h @@ -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 */ diff --git a/components/bt/host/bluedroid/stack/btm/btm_acl.c b/components/bt/host/bluedroid/stack/btm/btm_acl.c index 45e80f9ce8..5b7b261868 100644 --- a/components/bt/host/bluedroid/stack/btm/btm_acl.c +++ b/components/bt/host/bluedroid/stack/btm/btm_acl.c @@ -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); diff --git a/components/bt/host/bluedroid/stack/btm/btm_ble_addr.c b/components/bt/host/bluedroid/stack/btm/btm_ble_addr.c index 07cae2a5d3..5bb4a80e7e 100644 --- a/components/bt/host/bluedroid/stack/btm/btm_ble_addr.c +++ b/components/bt/host/bluedroid/stack/btm/btm_ble_addr.c @@ -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); } /******************************************************************************* ** diff --git a/components/bt/host/bluedroid/stack/btm/btm_ble_bgconn.c b/components/bt/host/bluedroid/stack/btm/btm_ble_bgconn.c index 8ebfe0e290..7a0e4dd760 100644 --- a/components/bt/host/bluedroid/stack/btm/btm_ble_bgconn.c +++ b/components/bt/host/bluedroid/stack/btm/btm_ble_bgconn.c @@ -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); diff --git a/components/bt/host/bluedroid/stack/btm/btm_ble_gap.c b/components/bt/host/bluedroid/stack/btm/btm_ble_gap.c index 50d89d8b0b..2446251dd5 100644 --- a/components/bt/host/bluedroid/stack/btm/btm_ble_gap.c +++ b/components/bt/host/bluedroid/stack/btm/btm_ble_gap.c @@ -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; } diff --git a/components/bt/host/bluedroid/stack/btm/btm_ble_privacy.c b/components/bt/host/bluedroid/stack/btm/btm_ble_privacy.c index 1bf66625fc..45f3af5bcd 100644 --- a/components/bt/host/bluedroid/stack/btm/btm_ble_privacy.c +++ b/components/bt/host/bluedroid/stack/btm/btm_ble_privacy.c @@ -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); } /******************************************************************************* diff --git a/components/bt/host/bluedroid/stack/btm/include/btm_ble_int.h b/components/bt/host/bluedroid/stack/btm/include/btm_ble_int.h index 3f200ae10b..02fa86b47e 100644 --- a/components/bt/host/bluedroid/stack/btm/include/btm_ble_int.h +++ b/components/bt/host/bluedroid/stack/btm/include/btm_ble_int.h @@ -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