Skip to content

Commit 6ffd089

Browse files
committed
Merge branch 'bugfix/btdm_fix_no_set_rand_addr_event_callback' into 'master'
Component/bt: fix no set rand add callback See merge request idf/esp-idf!2140
2 parents b26ab18 + aa23680 commit 6ffd089

File tree

11 files changed

+90
-39
lines changed

11 files changed

+90
-39
lines changed

components/bt/bluedroid/bta/dm/bta_dm_act.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4625,14 +4625,18 @@ void bta_dm_ble_disconnect (tBTA_DM_MSG *p_data)
46254625
*******************************************************************************/
46264626
void bta_dm_ble_set_rand_address(tBTA_DM_MSG *p_data)
46274627
{
4628-
BOOLEAN set_flag = false;
4628+
tBTM_STATUS status = BTM_SET_STATIC_RAND_ADDR_FAIL;
46294629
if (p_data->set_addr.addr_type != BLE_ADDR_RANDOM) {
46304630
APPL_TRACE_ERROR("Invalid random adress type = %d\n", p_data->set_addr.addr_type);
4631+
if(p_data->set_addr.p_set_rand_addr_cback) {
4632+
(*p_data->set_addr.p_set_rand_addr_cback)(status);
4633+
}
46314634
return;
46324635
}
46334636
//send the setting random address to BTM layer
4634-
if ((set_flag = BTM_BleSetRandAddress(p_data->set_addr.address) != TRUE)){
4635-
APPL_TRACE_ERROR("%s,set random address fail.", __func__);
4637+
status = BTM_BleSetRandAddress(p_data->set_addr.address);
4638+
if(p_data->set_addr.p_set_rand_addr_cback) {
4639+
(*p_data->set_addr.p_set_rand_addr_cback)(status);
46364640
}
46374641

46384642
}

components/bt/bluedroid/bta/dm/bta_dm_api.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2284,12 +2284,12 @@ extern void BTA_DmBleStopAdvertising(void)
22842284
** Description This function set the random address for the APP
22852285
**
22862286
** Parameters rand_addr: the random address whith should be setting
2287-
**
2287+
** p_set_rand_addr_cback: complete callback
22882288
** Returns void
22892289
**
22902290
**
22912291
*******************************************************************************/
2292-
extern void BTA_DmSetRandAddress(BD_ADDR rand_addr)
2292+
extern void BTA_DmSetRandAddress(BD_ADDR rand_addr, tBTA_SET_RAND_ADDR_CBACK *p_set_rand_addr_cback)
22932293
{
22942294
tBTA_DM_APT_SET_DEV_ADDR *p_msg;
22952295
APPL_TRACE_API("set the random address ");
@@ -2298,6 +2298,7 @@ extern void BTA_DmSetRandAddress(BD_ADDR rand_addr)
22982298
memcpy(p_msg->address, rand_addr, BD_ADDR_LEN);
22992299
p_msg->hdr.event = BTA_DM_API_SET_RAND_ADDR_EVT;
23002300
p_msg->addr_type = BLE_ADDR_RANDOM;
2301+
p_msg->p_set_rand_addr_cback = p_set_rand_addr_cback;
23012302
//start sent the msg to the bta system control moudle
23022303
bta_sys_sendmsg(p_msg);
23032304
}

components/bt/bluedroid/bta/include/bta_api.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,8 @@ typedef tBTM_ADD_WHITELIST_CBACK tBTA_ADD_WHITELIST_CBACK;
409409

410410
typedef tBTM_SET_PKT_DATA_LENGTH_CBACK tBTA_SET_PKT_DATA_LENGTH_CBACK;
411411

412+
typedef tBTM_SET_RAND_ADDR_CBACK tBTA_SET_RAND_ADDR_CBACK;
413+
412414
typedef tBTM_SET_LOCAL_PRIVACY_CBACK tBTA_SET_LOCAL_PRIVACY_CBACK;
413415

414416
typedef tBTM_CMPL_CB tBTA_CMPL_CB;
@@ -2060,7 +2062,7 @@ extern void BTA_DmBleScan(BOOLEAN start, UINT32 duration,
20602062

20612063
extern void BTA_DmBleStopAdvertising(void);
20622064

2063-
extern void BTA_DmSetRandAddress(BD_ADDR rand_addr);
2065+
extern void BTA_DmSetRandAddress(BD_ADDR rand_addr, tBTA_SET_RAND_ADDR_CBACK *p_set_rand_addr_cback);
20642066

20652067
#endif
20662068

components/bt/bluedroid/bta/include/bta_dm_int.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -532,6 +532,7 @@ typedef struct {
532532
BT_HDR hdr;
533533
tBLE_ADDR_TYPE addr_type;
534534
BD_ADDR address;
535+
tBTA_SET_RAND_ADDR_CBACK *p_set_rand_addr_cback;
535536
} tBTA_DM_APT_SET_DEV_ADDR;
536537

537538
/* set adv parameter for BLE advertising */

components/bt/bluedroid/btc/profile/std/gap/btc_gap_ble.c

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,9 @@ static esp_bt_status_t btc_hci_to_esp_status(uint8_t hci_status)
115115
case HCI_SUCCESS:
116116
esp_status = ESP_BT_STATUS_SUCCESS;
117117
break;
118+
case HCI_ERR_ESP_VENDOR_FAIL:
119+
esp_status = ESP_BT_STATUS_FAIL;
120+
break;
118121
case HCI_ERR_HOST_TIMEOUT:
119122
esp_status = ESP_BT_STATUS_TIMEOUT;
120123
break;
@@ -169,6 +172,12 @@ static esp_bt_status_t btc_btm_status_to_esp_status (uint8_t btm_status)
169172
case BTM_SET_PRIVACY_FAIL:
170173
esp_status = ESP_BT_STATUS_FAIL;
171174
break;
175+
case BTM_INVALID_STATIC_RAND_ADDR:
176+
esp_status = ESP_BT_STATUS_INVALID_STATIC_RAND_ADDR;
177+
break;
178+
case BTM_SET_STATIC_RAND_ADDR_FAIL:
179+
esp_status = ESP_BT_STATUS_FAIL;
180+
break;
172181
default:
173182
esp_status = ESP_BT_STATUS_FAIL;
174183
break;
@@ -714,6 +723,24 @@ static void btc_add_whitelist_complete_callback(UINT8 status, tBTM_WL_OPERATION
714723
}
715724
}
716725

726+
static void btc_set_rand_addr_callback(UINT8 status)
727+
{
728+
esp_ble_gap_cb_param_t param;
729+
bt_status_t ret;
730+
btc_msg_t msg;
731+
param.set_rand_addr_cmpl.status = btc_btm_status_to_esp_status(status); //todo status
732+
msg.sig = BTC_SIG_API_CB;
733+
msg.pid = BTC_PID_GAP_BLE;
734+
msg.act = ESP_GAP_BLE_SET_STATIC_RAND_ADDR_EVT;
735+
ret = btc_transfer_context(&msg, &param,
736+
sizeof(esp_ble_gap_cb_param_t), NULL);
737+
738+
if (ret != BT_STATUS_SUCCESS) {
739+
LOG_ERROR("%s btc_transfer_context failed\n", __func__);
740+
}
741+
742+
}
743+
717744
static void btc_set_local_privacy_callback(UINT8 status)
718745
{
719746
esp_ble_gap_cb_param_t param;
@@ -821,13 +848,8 @@ static void btc_ble_set_pkt_data_len(BD_ADDR remote_device, uint16_t tx_data_len
821848
BTA_DmBleSetDataLength(remote_device, tx_data_length, p_set_pkt_data_cback);
822849
}
823850

824-
static void btc_ble_set_rand_addr (BD_ADDR rand_addr)
851+
static void btc_ble_set_rand_addr (BD_ADDR rand_addr, tBTA_SET_RAND_ADDR_CBACK *p_set_rand_addr_cback)
825852
{
826-
esp_ble_gap_cb_param_t param;
827-
bt_status_t ret;
828-
btc_msg_t msg;
829-
param.set_rand_addr_cmpl.status = ESP_BT_STATUS_SUCCESS;
830-
831853
if (rand_addr != NULL) {
832854
/*
833855
A static address is a 48-bit randomly generated address and shall meet the following requirements:
@@ -842,25 +864,15 @@ static void btc_ble_set_rand_addr (BD_ADDR rand_addr)
842864
if((rand_addr[0] & BT_STATIC_RAND_ADDR_MASK) == BT_STATIC_RAND_ADDR_MASK
843865
&& memcmp(invalid_rand_addr_a, rand_addr, BD_ADDR_LEN) != 0
844866
&& memcmp(invalid_rand_addr_b, rand_addr, BD_ADDR_LEN) != 0){
845-
BTA_DmSetRandAddress(rand_addr);
867+
BTA_DmSetRandAddress(rand_addr, btc_set_rand_addr_callback);
846868
} else {
847-
param.set_rand_addr_cmpl.status = ESP_BT_STATUS_INVALID_STATIC_RAND_ADDR;
869+
btc_set_rand_addr_callback(BTM_INVALID_STATIC_RAND_ADDR);
848870
LOG_ERROR("Invalid random address, the high bit should be 0b11, all bits of the random part shall not be to 1 or 0");
849871
}
850872
} else {
851-
param.set_rand_addr_cmpl.status = ESP_BT_STATUS_INVALID_STATIC_RAND_ADDR;
873+
btc_set_rand_addr_callback(BTM_INVALID_STATIC_RAND_ADDR);
852874
LOG_ERROR("Invalid random addressm, the address value is NULL");
853875
}
854-
855-
msg.sig = BTC_SIG_API_CB;
856-
msg.pid = BTC_PID_GAP_BLE;
857-
msg.act = ESP_GAP_BLE_SET_STATIC_RAND_ADDR_EVT;
858-
ret = btc_transfer_context(&msg, &param,
859-
sizeof(esp_ble_gap_cb_param_t), NULL);
860-
861-
if (ret != BT_STATUS_SUCCESS) {
862-
LOG_ERROR("%s btc_transfer_context failed\n", __func__);
863-
}
864876
}
865877

866878
static void btc_ble_config_local_privacy(bool privacy_enable, tBTA_SET_LOCAL_PRIVACY_CBACK *set_local_privacy_cback)
@@ -1057,7 +1069,7 @@ void btc_gap_ble_call_handler(btc_msg_t *msg)
10571069
case BTC_GAP_BLE_ACT_SET_RAND_ADDRESS: {
10581070
BD_ADDR bd_addr;
10591071
memcpy(bd_addr, arg->set_rand_addr.rand_addr, sizeof(BD_ADDR));
1060-
btc_ble_set_rand_addr(bd_addr);
1072+
btc_ble_set_rand_addr(bd_addr, btc_set_rand_addr_callback);
10611073
break;
10621074
}
10631075
case BTC_GAP_BLE_ACT_CONFIG_LOCAL_PRIVACY:

components/bt/bluedroid/stack/btm/btm_ble.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1937,7 +1937,14 @@ void btm_ble_conn_complete(UINT8 *p, UINT16 evt_len, BOOLEAN enhanced)
19371937
handle = HCID_GET_HANDLE (handle);
19381938

19391939
btm_ble_connected(bda, handle, HCI_ENCRYPT_MODE_DISABLED, role, bda_type, match);
1940-
1940+
if(role == HCI_ROLE_SLAVE) {
1941+
//clear p_cb->state, controller will stop adv when ble connected.
1942+
tBTM_BLE_INQ_CB *p_cb = &btm_cb.ble_ctr_cb.inq_var;
1943+
if(p_cb) {
1944+
p_cb->adv_mode = BTM_BLE_ADV_DISABLE;
1945+
p_cb->state = BTM_BLE_STOP_ADV;
1946+
}
1947+
}
19411948
l2cble_conn_comp (handle, role, bda, bda_type, conn_interval,
19421949
conn_latency, conn_timeout);
19431950

components/bt/bluedroid/stack/btm/btm_ble_gap.c

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -756,10 +756,18 @@ BOOLEAN BTM_BleConfigPrivacy(BOOLEAN privacy_mode, tBTM_SET_LOCAL_PRIVACY_CBACK
756756
if (p_cb->privacy_mode == BTM_PRIVACY_NONE
757757
&& random_cb->own_addr_type == BLE_ADDR_RANDOM) {
758758
BTM_TRACE_ERROR("Have set random adress, can't set privacy ");
759+
if (random_cb && random_cb->set_local_privacy_cback){
760+
(*random_cb->set_local_privacy_cback)(BTM_SET_PRIVACY_FAIL);
761+
random_cb->set_local_privacy_cback = NULL;
762+
}
759763
return FALSE;
760764
}
761-
if (!(p_cb->inq_var.state != BTM_BLE_STOP_SCAN && p_cb->inq_var.state != BTM_BLE_STOP_ADV)) {
765+
if (!(p_cb->inq_var.state == BTM_BLE_STOP_SCAN || p_cb->inq_var.state == BTM_BLE_STOP_ADV || p_cb->inq_var.state == BTM_BLE_IDLE)) {
762766
BTM_TRACE_ERROR("Advertising or scaning now, can't set privacy ");
767+
if (random_cb && random_cb->set_local_privacy_cback){
768+
(*random_cb->set_local_privacy_cback)(BTM_SET_PRIVACY_FAIL);
769+
random_cb->set_local_privacy_cback = NULL;
770+
}
763771
return FALSE;
764772
}
765773

@@ -1199,11 +1207,18 @@ tBTM_STATUS BTM_BleSetAdvParamsStartAdv(UINT16 adv_int_min, UINT16 adv_int_max,
11991207
*/
12001208
if (btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type == BLE_ADDR_RANDOM && own_bda_type == BLE_ADDR_PUBLIC) {
12011209
BTM_TRACE_ERROR ("own_addr_type is BLE_ADDR_RANDOM but use BLE_ADDR_PUBLIC\n");
1210+
if(adv_cb) {
1211+
(* adv_cb)(HCI_ERR_ESP_VENDOR_FAIL);
1212+
}
12021213
return BTM_ILLEGAL_VALUE;
12031214
}
12041215

12051216
if (!BTM_BLE_ISVALID_PARAM(adv_int_min, BTM_BLE_ADV_INT_MIN, BTM_BLE_ADV_INT_MAX) ||
12061217
!BTM_BLE_ISVALID_PARAM(adv_int_max, BTM_BLE_ADV_INT_MIN, BTM_BLE_ADV_INT_MAX)) {
1218+
BTM_TRACE_ERROR ("adv_int_min or adv_int_max is invalid\n");
1219+
if(adv_cb) {
1220+
(* adv_cb)(HCI_ERR_ESP_VENDOR_FAIL);
1221+
}
12071222
return BTM_ILLEGAL_VALUE;
12081223
}
12091224

@@ -1558,12 +1573,10 @@ tBTM_STATUS BTM_BleWriteAdvDataRaw(UINT8 *p_raw_adv, UINT32 raw_adv_len)
15581573
** Returns void
15591574
**
15601575
*******************************************************************************/
1561-
BOOLEAN BTM_BleSetRandAddress(BD_ADDR rand_addr)
1576+
tBTM_STATUS BTM_BleSetRandAddress(BD_ADDR rand_addr)
15621577
{
1563-
BOOLEAN set_flag = false;
1564-
15651578
if (rand_addr == NULL)
1566-
return set_flag;
1579+
return BTM_SET_STATIC_RAND_ADDR_FAIL;
15671580

15681581
/*
15691582
* Temporary solutions for pair with random address:
@@ -1573,19 +1586,22 @@ BOOLEAN BTM_BleSetRandAddress(BD_ADDR rand_addr)
15731586
#if BLE_PRIVACY_SPT == TRUE
15741587
if (btm_cb.ble_ctr_cb.privacy_mode != BTM_PRIVACY_NONE) {
15751588
BTM_TRACE_ERROR("privacy_mode is not BTM_PRIVACY_NONE ");
1576-
return set_flag;
1589+
return BTM_SET_STATIC_RAND_ADDR_FAIL;
15771590
}
15781591

15791592
#endif
1580-
if (!(btm_cb.ble_ctr_cb.inq_var.state != BTM_BLE_STOP_SCAN && btm_cb.ble_ctr_cb.inq_var.state != BTM_BLE_STOP_ADV)) {
1581-
BTM_TRACE_ERROR("Advertising or scaning now, can't set randaddress ");
1582-
return FALSE;
1593+
if (!(btm_cb.ble_ctr_cb.inq_var.state == BTM_BLE_STOP_SCAN || btm_cb.ble_ctr_cb.inq_var.state == BTM_BLE_STOP_ADV || btm_cb.ble_ctr_cb.inq_var.state == BTM_BLE_IDLE)) {
1594+
BTM_TRACE_ERROR("Advertising or scaning now, can't set randaddress %d", btm_cb.ble_ctr_cb.inq_var.state);
1595+
return BTM_SET_STATIC_RAND_ADDR_FAIL;
15831596
}
15841597
memcpy(btm_cb.ble_ctr_cb.addr_mgnt_cb.private_addr, rand_addr, BD_ADDR_LEN);
15851598
btm_cb.ble_ctr_cb.addr_mgnt_cb.own_addr_type = BLE_ADDR_RANDOM;
15861599
//send the set random address to the controller
1587-
set_flag = btsnd_hcic_ble_set_random_addr(rand_addr);
1588-
return set_flag;
1600+
if(btsnd_hcic_ble_set_random_addr(rand_addr)) {
1601+
return BTM_SUCCESS;
1602+
} else {
1603+
return BTM_SET_STATIC_RAND_ADDR_FAIL;
1604+
}
15891605
}
15901606

15911607
/*******************************************************************************

components/bt/bluedroid/stack/include/btm_api.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ enum {
7272
BTM_CONTROL_LE_DATA_LEN_UNSUPPORTED,/* 22 controller setting data length is unsupported*/
7373
BTM_SET_PRIVACY_SUCCESS, /* 23 enable/disable local privacy success */
7474
BTM_SET_PRIVACY_FAIL, /* 24 enable/disable local privacy failed*/
75+
BTM_SET_STATIC_RAND_ADDR_FAIL, /* 25 Command failed */
76+
BTM_INVALID_STATIC_RAND_ADDR, /* 26 invalid static rand addr */
7577
};
7678

7779
typedef uint8_t tBTM_STATUS;
@@ -182,6 +184,8 @@ typedef void (tBTM_UPDATE_CONN_PARAM_CBACK) (UINT8 status, BD_ADDR bd_addr, tBTM
182184

183185
typedef void (tBTM_SET_PKT_DATA_LENGTH_CBACK) (UINT8 status, tBTM_LE_SET_PKT_DATA_LENGTH_PARAMS *data_length_params);
184186

187+
typedef void (tBTM_SET_RAND_ADDR_CBACK) (UINT8 status);
188+
185189
typedef void (tBTM_ADD_WHITELIST_CBACK) (UINT8 status, tBTM_WL_OPERATION wl_opration);
186190

187191
typedef void (tBTM_SET_LOCAL_PRIVACY_CBACK) (UINT8 status);

components/bt/bluedroid/stack/include/btm_ble_api.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -982,7 +982,7 @@ tBTM_STATUS BTM_BleWriteAdvData(tBTM_BLE_AD_MASK data_mask,
982982
tBTM_STATUS BTM_BleWriteAdvDataRaw(UINT8 *p_raw_adv, UINT32 raw_adv_len);
983983

984984

985-
BOOLEAN BTM_BleSetRandAddress(BD_ADDR rand_addr);
985+
tBTM_STATUS BTM_BleSetRandAddress(BD_ADDR rand_addr);
986986

987987

988988
/*******************************************************************************

components/bt/bluedroid/stack/include/btm_ble_int.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ typedef UINT8 tBTM_BLE_SEC_REQ_ACT;
104104
#define BTM_VSC_CHIP_CAPABILITY_M_VERSION 95
105105

106106
typedef enum {
107+
BTM_BLE_IDLE,
107108
BTM_BLE_SCANNING,
108109
BTM_BLE_SCAN_PENDING,
109110
BTM_BLE_STOP_SCAN,

0 commit comments

Comments
 (0)