Skip to content

Commit

Permalink
Merge branch 'feature/report_acl_conn_cmp_stat_to_app' into 'master'
Browse files Browse the repository at this point in the history
feature/report ACL link related events to application

Closes BT-2097 and BT-1863

See merge request espressif/esp-idf!19276
  • Loading branch information
wmy-espressif committed Dec 9, 2022
2 parents a539ade + fa621cd commit 7d7a710
Show file tree
Hide file tree
Showing 12 changed files with 406 additions and 34 deletions.
66 changes: 66 additions & 0 deletions components/bt/host/bluedroid/api/include/api/esp_bt_defs.h
Expand Up @@ -19,6 +19,7 @@ extern "C" {
return ESP_ERR_INVALID_STATE; \
}

#define ESP_BT_STATUS_BASE_FOR_HCI_ERR 0X0100 /* base for coverting HCI error code to ESP status */

/* relate to BT_STATUS_xxx in bt_def.h */
/// Status Return Value
Expand All @@ -45,6 +46,71 @@ typedef enum {
ESP_BT_STATUS_ERR_ILLEGAL_PARAMETER_FMT, /* relate to HCI_ERR_ILLEGAL_PARAMETER_FMT in stack/hcidefs.h */
ESP_BT_STATUS_MEMORY_FULL = 20, /* relate to BT_STATUS_MEMORY_FULL in bt_def.h */
ESP_BT_STATUS_EIR_TOO_LARGE, /* relate to BT_STATUS_EIR_TOO_LARGE in bt_def.h */
ESP_BT_STATUS_HCI_SUCCESS = ESP_BT_STATUS_BASE_FOR_HCI_ERR,
ESP_BT_STATUS_HCI_PENDING,
ESP_BT_STATUS_HCI_ILLEGAL_COMMAND,
ESP_BT_STATUS_HCI_NO_CONNECTION,
ESP_BT_STATUS_HCI_HW_FAILURE,
ESP_BT_STATUS_HCI_PAGE_TIMEOUT,
ESP_BT_STATUS_HCI_AUTH_FAILURE,
ESP_BT_STATUS_HCI_KEY_MISSING,
ESP_BT_STATUS_HCI_MEMORY_FULL,
ESP_BT_STATUS_HCI_CONNECTION_TOUT,
ESP_BT_STATUS_HCI_MAX_NUM_OF_CONNECTIONS,
ESP_BT_STATUS_HCI_MAX_NUM_OF_SCOS,
ESP_BT_STATUS_HCI_CONNECTION_EXISTS,
ESP_BT_STATUS_HCI_COMMAND_DISALLOWED,
ESP_BT_STATUS_HCI_HOST_REJECT_RESOURCES,
ESP_BT_STATUS_HCI_HOST_REJECT_SECURITY,
ESP_BT_STATUS_HCI_HOST_REJECT_DEVICE,
ESP_BT_STATUS_HCI_HOST_TIMEOUT,
ESP_BT_STATUS_HCI_UNSUPPORTED_VALUE,
ESP_BT_STATUS_HCI_ILLEGAL_PARAMETER_FMT,
ESP_BT_STATUS_HCI_PEER_USER,
ESP_BT_STATUS_HCI_PEER_LOW_RESOURCES,
ESP_BT_STATUS_HCI_PEER_POWER_OFF,
ESP_BT_STATUS_HCI_CONN_CAUSE_LOCAL_HOST,
ESP_BT_STATUS_HCI_REPEATED_ATTEMPTS,
ESP_BT_STATUS_HCI_PAIRING_NOT_ALLOWED,
ESP_BT_STATUS_HCI_UNKNOWN_LMP_PDU,
ESP_BT_STATUS_HCI_UNSUPPORTED_REM_FEATURE,
ESP_BT_STATUS_HCI_SCO_OFFSET_REJECTED,
ESP_BT_STATUS_HCI_SCO_INTERVAL_REJECTED,
ESP_BT_STATUS_HCI_SCO_AIR_MODE,
ESP_BT_STATUS_HCI_INVALID_LMP_PARAM,
ESP_BT_STATUS_HCI_UNSPECIFIED,
ESP_BT_STATUS_HCI_UNSUPPORTED_LMP_PARAMETERS,
ESP_BT_STATUS_HCI_ROLE_CHANGE_NOT_ALLOWED,
ESP_BT_STATUS_HCI_LMP_RESPONSE_TIMEOUT,
ESP_BT_STATUS_HCI_LMP_ERR_TRANS_COLLISION,
ESP_BT_STATUS_HCI_LMP_PDU_NOT_ALLOWED,
ESP_BT_STATUS_HCI_ENCRY_MODE_NOT_ACCEPTABLE,
ESP_BT_STATUS_HCI_UNIT_KEY_USED,
ESP_BT_STATUS_HCI_QOS_NOT_SUPPORTED,
ESP_BT_STATUS_HCI_INSTANT_PASSED,
ESP_BT_STATUS_HCI_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED,
ESP_BT_STATUS_HCI_DIFF_TRANSACTION_COLLISION,
ESP_BT_STATUS_HCI_UNDEFINED_0x2B,
ESP_BT_STATUS_HCI_QOS_UNACCEPTABLE_PARAM,
ESP_BT_STATUS_HCI_QOS_REJECTED,
ESP_BT_STATUS_HCI_CHAN_CLASSIF_NOT_SUPPORTED,
ESP_BT_STATUS_HCI_INSUFFCIENT_SECURITY,
ESP_BT_STATUS_HCI_PARAM_OUT_OF_RANGE,
ESP_BT_STATUS_HCI_UNDEFINED_0x31,
ESP_BT_STATUS_HCI_ROLE_SWITCH_PENDING,
ESP_BT_STATUS_HCI_UNDEFINED_0x33,
ESP_BT_STATUS_HCI_RESERVED_SLOT_VIOLATION,
ESP_BT_STATUS_HCI_ROLE_SWITCH_FAILED,
ESP_BT_STATUS_HCI_INQ_RSP_DATA_TOO_LARGE,
ESP_BT_STATUS_HCI_SIMPLE_PAIRING_NOT_SUPPORTED,
ESP_BT_STATUS_HCI_HOST_BUSY_PAIRING,
ESP_BT_STATUS_HCI_REJ_NO_SUITABLE_CHANNEL,
ESP_BT_STATUS_HCI_CONTROLLER_BUSY,
ESP_BT_STATUS_HCI_UNACCEPT_CONN_INTERVAL,
ESP_BT_STATUS_HCI_DIRECTED_ADVERTISING_TIMEOUT,
ESP_BT_STATUS_HCI_CONN_TOUT_DUE_TO_MIC_FAILURE,
ESP_BT_STATUS_HCI_CONN_FAILED_ESTABLISHMENT,
ESP_BT_STATUS_HCI_MAC_CONNECTION_FAILED,
} esp_bt_status_t;


Expand Down
20 changes: 20 additions & 0 deletions components/bt/host/bluedroid/api/include/api/esp_gap_bt_api.h
Expand Up @@ -215,6 +215,8 @@ typedef enum {
ESP_BT_GAP_MODE_CHG_EVT,
ESP_BT_GAP_REMOVE_BOND_DEV_COMPLETE_EVT, /*!< remove bond device complete event */
ESP_BT_GAP_QOS_CMPL_EVT, /*!< QOS complete event */
ESP_BT_GAP_ACL_CONN_CMPL_STAT_EVT, /*!< ACL connection complete status event */
ESP_BT_GAP_ACL_DISCONN_CMPL_STAT_EVT, /*!< ACL disconnection complete status event */
ESP_BT_GAP_EVT_MAX,
} esp_bt_gap_cb_event_t;

Expand Down Expand Up @@ -368,6 +370,24 @@ typedef union {
which from the master to a particular slave on the ACL
logical transport. unit is 0.625ms. */
} qos_cmpl; /*!< QoS complete parameter struct */

/**
* @brief ESP_BT_GAP_ACL_CONN_CMPL_STAT_EVT
*/
struct acl_conn_cmpl_stat_param {
esp_bt_status_t stat; /*!< ACL connection status */
uint16_t handle; /*!< ACL connection handle */
esp_bd_addr_t bda; /*!< remote bluetooth device address */
} acl_conn_cmpl_stat; /*!< ACL connection complete status parameter struct */

/**
* @brief ESP_BT_GAP_ACL_DISCONN_CMPL_STAT_EVT
*/
struct acl_disconn_cmpl_stat_param {
esp_bt_status_t reason; /*!< ACL disconnection reason */
uint16_t handle; /*!< ACL connection handle */
esp_bd_addr_t bda; /*!< remote bluetooth device address */
} acl_disconn_cmpl_stat; /*!< ACL disconnection complete status parameter struct */
} esp_bt_gap_cb_param_t;

/**
Expand Down
41 changes: 41 additions & 0 deletions components/bt/host/bluedroid/bta/dm/bta_dm_act.c
Expand Up @@ -71,6 +71,7 @@ static BOOLEAN bta_dm_check_av(UINT16 event);
static void bta_dm_bl_change_cback (tBTM_BL_EVENT_DATA *p_data);


static void bta_dm_acl_link_stat_cback(tBTM_ACL_LINK_STAT_EVENT_DATA *p_data);
static void bta_dm_policy_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr);

/* Extended Inquiry Response */
Expand Down Expand Up @@ -511,6 +512,7 @@ static void bta_dm_sys_hw_cback( tBTA_SYS_HW_EVT status )
BTM_SetDefaultLinkPolicy(bta_dm_cb.cur_policy);
#endif
BTM_RegBusyLevelNotif (bta_dm_bl_change_cback, NULL, BTM_BL_UPDATE_MASK | BTM_BL_ROLE_CHG_MASK);
BTM_RegAclLinkStatNotif (bta_dm_acl_link_stat_cback);

#if BLE_VND_INCLUDED == TRUE
BTM_BleReadControllerFeatures (bta_dm_ctrl_features_rd_cmpl_cback);
Expand Down Expand Up @@ -3317,6 +3319,45 @@ static void bta_dm_bl_change_cback (tBTM_BL_EVENT_DATA *p_data)

}

/*******************************************************************************
**
** Function bta_dm_acl_link_stat_cback
**
** Description Callback from btm to report acl link status
**
** Returns void
**
*******************************************************************************/
static void bta_dm_acl_link_stat_cback(tBTM_ACL_LINK_STAT_EVENT_DATA *p_data)
{
tBTA_DM_SEC sec_event;
memset(&sec_event, 0, sizeof(tBTA_DM_SEC));
sec_event.acl_link_stat.event = p_data->event;

switch (sec_event.acl_link_stat.event) {
case BTA_ACL_LINK_STAT_CONN_CMPL: {
sec_event.acl_link_stat.link_act.conn_cmpl.status = p_data->link_act.conn_cmpl.status;
sec_event.acl_link_stat.link_act.conn_cmpl.handle = p_data->link_act.conn_cmpl.handle;
bdcpy(sec_event.acl_link_stat.link_act.conn_cmpl.bd_addr, p_data->link_act.conn_cmpl.bd_addr);
break;
}
case BTA_ACL_LINK_STAT_DISCONN_CMPL: {
sec_event.acl_link_stat.link_act.disconn_cmpl.reason = p_data->link_act.disconn_cmpl.reason;
sec_event.acl_link_stat.link_act.disconn_cmpl.handle = p_data->link_act.disconn_cmpl.handle;
bdcpy(sec_event.acl_link_stat.link_act.disconn_cmpl.bd_addr, p_data->link_act.disconn_cmpl.bd_addr);
break;
}
default: {
APPL_TRACE_WARNING("bta_dm_acl_link_stat: invalid event %d", sec_event.acl_link_stat.event);
return;
}
}

if (bta_dm_cb.p_sec_cback) {
(*bta_dm_cb.p_sec_cback)(BTA_DM_ACL_LINK_STAT_EVT, &sec_event);
}
}

/*******************************************************************************
**
** Function bta_dm_rs_cback
Expand Down
29 changes: 29 additions & 0 deletions components/bt/host/bluedroid/bta/include/bta/bta_api.h
Expand Up @@ -656,6 +656,7 @@ typedef UINT8 tBTA_SIG_STRENGTH_MASK;
#define BTA_DM_BLE_DEV_UNPAIRED_EVT 29 /* BLE unpair event */
#define BTA_DM_SP_KEY_REQ_EVT 30 /* Simple Pairing Passkey request */
#define BTA_DM_PM_MODE_CHG_EVT 31 /* Mode changed event */
#define BTA_DM_ACL_LINK_STAT_EVT 32 /* ACL connection status report event */

typedef UINT8 tBTA_DM_SEC_EVT;

Expand Down Expand Up @@ -819,6 +820,33 @@ typedef struct {
#endif
} tBTA_DM_LINK_DOWN;

enum {
BTA_ACL_LINK_STAT_CONN_CMPL,
BTA_ACL_LINK_STAT_DISCONN_CMPL
};
typedef UINT8 tBTA_ACL_LINK_STAT_EVT;

typedef struct {
UINT8 status; /* ACL link connection status */
UINT16 handle; /* ACL connection handle */
BD_ADDR bd_addr; /* peer bluetooth address */
} tBTA_DM_ACL_CONN_CMPL_STAT;

typedef struct {
UINT8 reason; /* ACL link disconnection reason */
UINT16 handle; /* ACL connection handle */
BD_ADDR bd_addr; /* peer bluetooth address */
} tBTA_DM_ACL_DISCONN_CMPL_STAT;

/* Structure associated with BTA_DM_ACL_LINK_STAT_EVT */
typedef struct {
tBTA_ACL_LINK_STAT_EVT event; /* ACL link event */
union {
tBTA_DM_ACL_CONN_CMPL_STAT conn_cmpl;
tBTA_DM_ACL_DISCONN_CMPL_STAT disconn_cmpl;
} link_act;
} tBTA_DM_ACL_LINK_STAT;

/* Structure associated with BTA_DM_ROLE_CHG_EVT */
typedef struct {
BD_ADDR bd_addr; /* BD address peer device. */
Expand Down Expand Up @@ -957,6 +985,7 @@ typedef union {
tBTA_DM_AUTHORIZE authorize; /* Authorization request. */
tBTA_DM_LINK_UP link_up; /* ACL connection up event */
tBTA_DM_LINK_DOWN link_down; /* ACL connection down event */
tBTA_DM_ACL_LINK_STAT acl_link_stat; /* ACL link status event */
tBTA_DM_BUSY_LEVEL busy_level; /* System busy level */
tBTA_DM_SP_CFM_REQ cfm_req; /* user confirm request */
tBTA_DM_SP_KEY_REQ key_req; /* user passkey request */
Expand Down
38 changes: 38 additions & 0 deletions components/bt/host/bluedroid/btc/core/btc_dm.c
Expand Up @@ -677,6 +677,40 @@ bt_status_t btc_dm_disable_service(tBTA_SERVICE_ID service_id)
return BT_STATUS_SUCCESS;
}

static void btc_dm_acl_link_stat(tBTA_DM_ACL_LINK_STAT *p_acl_link_stat)
{
#if (BTC_GAP_BT_INCLUDED == TRUE)
esp_bt_gap_cb_param_t param;
esp_bt_gap_cb_event_t event = ESP_BT_GAP_EVT_MAX;

switch (p_acl_link_stat->event) {
case BTA_ACL_LINK_STAT_CONN_CMPL: {
event = ESP_BT_GAP_ACL_CONN_CMPL_STAT_EVT;
param.acl_conn_cmpl_stat.stat = p_acl_link_stat->link_act.conn_cmpl.status | ESP_BT_STATUS_BASE_FOR_HCI_ERR;
param.acl_conn_cmpl_stat.handle = p_acl_link_stat->link_act.conn_cmpl.handle;
memcpy(param.acl_conn_cmpl_stat.bda, p_acl_link_stat->link_act.conn_cmpl.bd_addr, ESP_BD_ADDR_LEN);
break;
}
case BTA_ACL_LINK_STAT_DISCONN_CMPL: {
event = ESP_BT_GAP_ACL_DISCONN_CMPL_STAT_EVT;
param.acl_disconn_cmpl_stat.reason = p_acl_link_stat->link_act.disconn_cmpl.reason | ESP_BT_STATUS_BASE_FOR_HCI_ERR;
param.acl_disconn_cmpl_stat.handle = p_acl_link_stat->link_act.disconn_cmpl.handle;
memcpy(param.acl_disconn_cmpl_stat.bda, p_acl_link_stat->link_act.disconn_cmpl.bd_addr, ESP_BD_ADDR_LEN);
break;
}
default: {
BTC_TRACE_WARNING("%s: invalid event %x", __FUNCTION__, event);
return;
}
}

esp_bt_gap_cb_t cb = (esp_bt_gap_cb_t)btc_profile_cb_get(BTC_PID_GAP_BT);
if (cb) {
cb(event, &param);
}
#endif
}

void btc_dm_sec_cb_handler(btc_msg_t *msg)
{
btc_dm_sec_args_t *arg = (btc_dm_sec_args_t *)(msg->arg);
Expand Down Expand Up @@ -755,6 +789,10 @@ void btc_dm_sec_cb_handler(btc_msg_t *msg)
break;
#endif ///BT_SSP_INCLUDED == TRUE

case BTA_DM_ACL_LINK_STAT_EVT: {
btc_dm_acl_link_stat(&p_data->acl_link_stat);
break;
}
case BTA_DM_DEV_UNPAIRED_EVT: {
btc_dm_dev_unpaired_evt(&p_data->link_down);
break;
Expand Down

0 comments on commit 7d7a710

Please sign in to comment.