mirror of
https://github.com/espressif/esp-idf.git
synced 2026-10-03 03:31:41 +03:00
feat(ble/bluedroid): add DBAF host support (Core 6.0)
(cherry picked from commit e20d3f0197)
Co-authored-by: zhiweijian <zhiweijian@espressif.com>
This commit is contained in:
@@ -1274,6 +1274,18 @@ void btc_ble_5_gap_callback(tBTA_DM_BLE_5_GAP_EVENT event,
|
||||
break;
|
||||
}
|
||||
#endif // #if (BLE_FEAT_ADV_MONITOR == TRUE)
|
||||
#if (BLE_FEAT_DBAF == TRUE)
|
||||
case BTA_DM_BLE_5_GAP_SET_DECISION_DATA_COMPLETE_EVT: {
|
||||
msg.act = ESP_GAP_BLE_SET_DECISION_DATA_COMPLETE_EVT;
|
||||
param.set_decision_data.status = btc_btm_status_to_esp_status(params->status);
|
||||
break;
|
||||
}
|
||||
case BTA_DM_BLE_5_GAP_SET_DECISION_INSTRUCTIONS_COMPLETE_EVT: {
|
||||
msg.act = ESP_GAP_BLE_SET_DECISION_INSTRUCTIONS_COMPLETE_EVT;
|
||||
param.set_decision_instructions.status = btc_btm_status_to_esp_status(params->status);
|
||||
break;
|
||||
}
|
||||
#endif // #if (BLE_FEAT_DBAF == TRUE)
|
||||
#if (BLE_50_EXTEND_ADV_EN == TRUE)
|
||||
case BTA_DM_BLE_5_GAP_ADV_TERMINATED_EVT: {
|
||||
param.adv_terminate.status = params->adv_term.status;
|
||||
@@ -2385,6 +2397,84 @@ void btc_gap_ble_arg_deep_copy(btc_msg_t *msg, void *p_dest, void *p_src)
|
||||
break;
|
||||
}
|
||||
#endif // #if (BT_BLE_FEAT_PAWR_EN == TRUE)
|
||||
#if (BLE_FEAT_DBAF == TRUE)
|
||||
case BTC_GAP_BLE_SET_DECISION_DATA: {
|
||||
btc_ble_5_gap_args_t *src = (btc_ble_5_gap_args_t *)p_src;
|
||||
btc_ble_5_gap_args_t *dst = (btc_ble_5_gap_args_t *)p_dest;
|
||||
|
||||
dst->set_decision_data.data = NULL;
|
||||
if (src->set_decision_data.data_len > 0 && src->set_decision_data.data) {
|
||||
dst->set_decision_data.data = osi_malloc(src->set_decision_data.data_len);
|
||||
if (dst->set_decision_data.data) {
|
||||
memcpy(dst->set_decision_data.data, src->set_decision_data.data,
|
||||
src->set_decision_data.data_len);
|
||||
} else {
|
||||
BTC_TRACE_WARNING("%s no mem, decision data drop %u", __func__, src->set_decision_data.data_len);
|
||||
dst->set_decision_data.data_len = 0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case BTC_GAP_BLE_SET_DECISION_INSTRUCTIONS: {
|
||||
btc_ble_5_gap_args_t *src = (btc_ble_5_gap_args_t *)p_src;
|
||||
btc_ble_5_gap_args_t *dst = (btc_ble_5_gap_args_t *)p_dest;
|
||||
bool oom = false;
|
||||
|
||||
dst->set_decision_instructions.test_flags = NULL;
|
||||
dst->set_decision_instructions.test_fields = NULL;
|
||||
dst->set_decision_instructions.test_params = NULL;
|
||||
if (src->set_decision_instructions.num_tests > ESP_BLE_GAP_DECISION_MAX_TESTS) {
|
||||
BTC_TRACE_WARNING("%s invalid num_tests %u", __func__,
|
||||
src->set_decision_instructions.num_tests);
|
||||
oom = true;
|
||||
}
|
||||
if (!oom && src->set_decision_instructions.num_tests > 0) {
|
||||
if (src->set_decision_instructions.test_flags) {
|
||||
dst->set_decision_instructions.test_flags = osi_malloc(src->set_decision_instructions.num_tests);
|
||||
if (dst->set_decision_instructions.test_flags) {
|
||||
memcpy(dst->set_decision_instructions.test_flags, src->set_decision_instructions.test_flags,
|
||||
src->set_decision_instructions.num_tests);
|
||||
} else {
|
||||
oom = true;
|
||||
}
|
||||
}
|
||||
if (!oom && src->set_decision_instructions.test_fields) {
|
||||
dst->set_decision_instructions.test_fields = osi_malloc(src->set_decision_instructions.num_tests);
|
||||
if (dst->set_decision_instructions.test_fields) {
|
||||
memcpy(dst->set_decision_instructions.test_fields, src->set_decision_instructions.test_fields,
|
||||
src->set_decision_instructions.num_tests);
|
||||
} else {
|
||||
oom = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!oom && src->set_decision_instructions.num_tests > 0 &&
|
||||
src->set_decision_instructions.test_params) {
|
||||
size_t test_params_len = (size_t)src->set_decision_instructions.num_tests *
|
||||
ESP_BLE_GAP_DECISION_TEST_PARAM_LEN;
|
||||
dst->set_decision_instructions.test_params = osi_malloc(test_params_len);
|
||||
if (dst->set_decision_instructions.test_params) {
|
||||
memcpy(dst->set_decision_instructions.test_params, src->set_decision_instructions.test_params,
|
||||
test_params_len);
|
||||
} else {
|
||||
oom = true;
|
||||
}
|
||||
}
|
||||
if (oom) {
|
||||
BTC_TRACE_WARNING("%s no mem, decision instructions drop", __func__);
|
||||
if (dst->set_decision_instructions.test_flags) {
|
||||
osi_free(dst->set_decision_instructions.test_flags);
|
||||
dst->set_decision_instructions.test_flags = NULL;
|
||||
}
|
||||
if (dst->set_decision_instructions.test_fields) {
|
||||
osi_free(dst->set_decision_instructions.test_fields);
|
||||
dst->set_decision_instructions.test_fields = NULL;
|
||||
}
|
||||
dst->set_decision_instructions.num_tests = 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
#endif // #if (BLE_FEAT_DBAF == TRUE)
|
||||
default:
|
||||
BTC_TRACE_ERROR("Unhandled deep copy %d\n", msg->act);
|
||||
break;
|
||||
@@ -2655,6 +2745,28 @@ void btc_gap_ble_arg_deep_free(btc_msg_t *msg)
|
||||
break;
|
||||
}
|
||||
#endif // #if (BT_BLE_FEAT_PAWR_EN == TRUE)
|
||||
#if (BLE_FEAT_DBAF == TRUE)
|
||||
case BTC_GAP_BLE_SET_DECISION_DATA: {
|
||||
uint8_t *data = ((btc_ble_5_gap_args_t *)msg->arg)->set_decision_data.data;
|
||||
if (data) {
|
||||
osi_free(data);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case BTC_GAP_BLE_SET_DECISION_INSTRUCTIONS: {
|
||||
btc_ble_5_gap_args_t *args = (btc_ble_5_gap_args_t *)msg->arg;
|
||||
if (args->set_decision_instructions.test_flags) {
|
||||
osi_free(args->set_decision_instructions.test_flags);
|
||||
}
|
||||
if (args->set_decision_instructions.test_fields) {
|
||||
osi_free(args->set_decision_instructions.test_fields);
|
||||
}
|
||||
if (args->set_decision_instructions.test_params) {
|
||||
osi_free(args->set_decision_instructions.test_params);
|
||||
}
|
||||
break;
|
||||
}
|
||||
#endif // #if (BLE_FEAT_DBAF == TRUE)
|
||||
default:
|
||||
BTC_TRACE_DEBUG("Unhandled deep free %d\n", msg->act);
|
||||
break;
|
||||
@@ -3315,6 +3427,20 @@ void btc_gap_ble_call_handler(btc_msg_t *msg)
|
||||
BTA_DmBleGapEnableMonitorAdv(arg_5->enable_monitor_adv.enable);
|
||||
break;
|
||||
#endif // #if (BLE_FEAT_ADV_MONITOR == TRUE)
|
||||
#if (BLE_FEAT_DBAF == TRUE)
|
||||
case BTC_GAP_BLE_SET_DECISION_DATA:
|
||||
BTA_DmBleGapSetDecisionData(arg_5->set_decision_data.adv_handle,
|
||||
arg_5->set_decision_data.decision_type_flags,
|
||||
arg_5->set_decision_data.data_len,
|
||||
arg_5->set_decision_data.data);
|
||||
break;
|
||||
case BTC_GAP_BLE_SET_DECISION_INSTRUCTIONS:
|
||||
BTA_DmBleGapSetDecisionInstructions(arg_5->set_decision_instructions.num_tests,
|
||||
arg_5->set_decision_instructions.test_flags,
|
||||
arg_5->set_decision_instructions.test_fields,
|
||||
arg_5->set_decision_instructions.test_params);
|
||||
break;
|
||||
#endif // #if (BLE_FEAT_DBAF == TRUE)
|
||||
#if (BT_BLE_FEAT_PAWR_EN == TRUE)
|
||||
case BTC_GAP_BLE_SET_PA_SUBEVT_DATA:
|
||||
BTA_DmBleGapSetPASubevtData(arg_5->per_adv_subevent_data_params.adv_handle, arg_5->per_adv_subevent_data_params.num_subevents_with_data, (uint8_t *)(arg_5->per_adv_subevent_data_params.subevent_params));
|
||||
|
||||
@@ -147,6 +147,10 @@ typedef enum {
|
||||
BTC_GAP_BLE_READ_MONITOR_ADV_LIST_SIZE,
|
||||
BTC_GAP_BLE_ENABLE_MONITOR_ADV,
|
||||
#endif // #if (BLE_FEAT_ADV_MONITOR == TRUE)
|
||||
#if (BLE_FEAT_DBAF == TRUE)
|
||||
BTC_GAP_BLE_SET_DECISION_DATA,
|
||||
BTC_GAP_BLE_SET_DECISION_INSTRUCTIONS,
|
||||
#endif // #if (BLE_FEAT_DBAF == TRUE)
|
||||
BTC_GAP_BLE_READ_CHANNEL_MAP,
|
||||
#if (BT_BLE_FEAT_PAWR_EN == TRUE)
|
||||
BTC_GAP_BLE_SET_PA_SUBEVT_DATA,
|
||||
@@ -588,6 +592,20 @@ typedef union {
|
||||
uint8_t enable;
|
||||
} enable_monitor_adv;
|
||||
#endif // #if (BLE_FEAT_ADV_MONITOR == TRUE)
|
||||
#if (BLE_FEAT_DBAF == TRUE)
|
||||
struct set_decision_data_args {
|
||||
uint8_t adv_handle;
|
||||
uint8_t decision_type_flags;
|
||||
uint8_t data_len;
|
||||
uint8_t *data;
|
||||
} set_decision_data;
|
||||
struct set_decision_instructions_args {
|
||||
uint8_t num_tests;
|
||||
uint8_t *test_flags;
|
||||
uint8_t *test_fields;
|
||||
uint8_t *test_params;
|
||||
} set_decision_instructions;
|
||||
#endif // #if (BLE_FEAT_DBAF == TRUE)
|
||||
#if (BT_BLE_FEAT_PAWR_EN == TRUE)
|
||||
// BTC_GAP_BLE_SET_PA_SUBEVT_DATA
|
||||
struct per_adv_subevent_data_params_args {
|
||||
|
||||
Reference in New Issue
Block a user