Skip to content

Commit 7d7a710

Browse files
committed
Merge branch 'feature/report_acl_conn_cmp_stat_to_app' into 'master'
feature/report ACL link related events to application Closes BT-2097 and BT-1863 See merge request espressif/esp-idf!19276
2 parents a539ade + fa621cd commit 7d7a710

File tree

12 files changed

+406
-34
lines changed

12 files changed

+406
-34
lines changed

components/bt/host/bluedroid/api/include/api/esp_bt_defs.h

+66
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ extern "C" {
1919
return ESP_ERR_INVALID_STATE; \
2020
}
2121

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

2324
/* relate to BT_STATUS_xxx in bt_def.h */
2425
/// Status Return Value
@@ -45,6 +46,71 @@ typedef enum {
4546
ESP_BT_STATUS_ERR_ILLEGAL_PARAMETER_FMT, /* relate to HCI_ERR_ILLEGAL_PARAMETER_FMT in stack/hcidefs.h */
4647
ESP_BT_STATUS_MEMORY_FULL = 20, /* relate to BT_STATUS_MEMORY_FULL in bt_def.h */
4748
ESP_BT_STATUS_EIR_TOO_LARGE, /* relate to BT_STATUS_EIR_TOO_LARGE in bt_def.h */
49+
ESP_BT_STATUS_HCI_SUCCESS = ESP_BT_STATUS_BASE_FOR_HCI_ERR,
50+
ESP_BT_STATUS_HCI_PENDING,
51+
ESP_BT_STATUS_HCI_ILLEGAL_COMMAND,
52+
ESP_BT_STATUS_HCI_NO_CONNECTION,
53+
ESP_BT_STATUS_HCI_HW_FAILURE,
54+
ESP_BT_STATUS_HCI_PAGE_TIMEOUT,
55+
ESP_BT_STATUS_HCI_AUTH_FAILURE,
56+
ESP_BT_STATUS_HCI_KEY_MISSING,
57+
ESP_BT_STATUS_HCI_MEMORY_FULL,
58+
ESP_BT_STATUS_HCI_CONNECTION_TOUT,
59+
ESP_BT_STATUS_HCI_MAX_NUM_OF_CONNECTIONS,
60+
ESP_BT_STATUS_HCI_MAX_NUM_OF_SCOS,
61+
ESP_BT_STATUS_HCI_CONNECTION_EXISTS,
62+
ESP_BT_STATUS_HCI_COMMAND_DISALLOWED,
63+
ESP_BT_STATUS_HCI_HOST_REJECT_RESOURCES,
64+
ESP_BT_STATUS_HCI_HOST_REJECT_SECURITY,
65+
ESP_BT_STATUS_HCI_HOST_REJECT_DEVICE,
66+
ESP_BT_STATUS_HCI_HOST_TIMEOUT,
67+
ESP_BT_STATUS_HCI_UNSUPPORTED_VALUE,
68+
ESP_BT_STATUS_HCI_ILLEGAL_PARAMETER_FMT,
69+
ESP_BT_STATUS_HCI_PEER_USER,
70+
ESP_BT_STATUS_HCI_PEER_LOW_RESOURCES,
71+
ESP_BT_STATUS_HCI_PEER_POWER_OFF,
72+
ESP_BT_STATUS_HCI_CONN_CAUSE_LOCAL_HOST,
73+
ESP_BT_STATUS_HCI_REPEATED_ATTEMPTS,
74+
ESP_BT_STATUS_HCI_PAIRING_NOT_ALLOWED,
75+
ESP_BT_STATUS_HCI_UNKNOWN_LMP_PDU,
76+
ESP_BT_STATUS_HCI_UNSUPPORTED_REM_FEATURE,
77+
ESP_BT_STATUS_HCI_SCO_OFFSET_REJECTED,
78+
ESP_BT_STATUS_HCI_SCO_INTERVAL_REJECTED,
79+
ESP_BT_STATUS_HCI_SCO_AIR_MODE,
80+
ESP_BT_STATUS_HCI_INVALID_LMP_PARAM,
81+
ESP_BT_STATUS_HCI_UNSPECIFIED,
82+
ESP_BT_STATUS_HCI_UNSUPPORTED_LMP_PARAMETERS,
83+
ESP_BT_STATUS_HCI_ROLE_CHANGE_NOT_ALLOWED,
84+
ESP_BT_STATUS_HCI_LMP_RESPONSE_TIMEOUT,
85+
ESP_BT_STATUS_HCI_LMP_ERR_TRANS_COLLISION,
86+
ESP_BT_STATUS_HCI_LMP_PDU_NOT_ALLOWED,
87+
ESP_BT_STATUS_HCI_ENCRY_MODE_NOT_ACCEPTABLE,
88+
ESP_BT_STATUS_HCI_UNIT_KEY_USED,
89+
ESP_BT_STATUS_HCI_QOS_NOT_SUPPORTED,
90+
ESP_BT_STATUS_HCI_INSTANT_PASSED,
91+
ESP_BT_STATUS_HCI_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED,
92+
ESP_BT_STATUS_HCI_DIFF_TRANSACTION_COLLISION,
93+
ESP_BT_STATUS_HCI_UNDEFINED_0x2B,
94+
ESP_BT_STATUS_HCI_QOS_UNACCEPTABLE_PARAM,
95+
ESP_BT_STATUS_HCI_QOS_REJECTED,
96+
ESP_BT_STATUS_HCI_CHAN_CLASSIF_NOT_SUPPORTED,
97+
ESP_BT_STATUS_HCI_INSUFFCIENT_SECURITY,
98+
ESP_BT_STATUS_HCI_PARAM_OUT_OF_RANGE,
99+
ESP_BT_STATUS_HCI_UNDEFINED_0x31,
100+
ESP_BT_STATUS_HCI_ROLE_SWITCH_PENDING,
101+
ESP_BT_STATUS_HCI_UNDEFINED_0x33,
102+
ESP_BT_STATUS_HCI_RESERVED_SLOT_VIOLATION,
103+
ESP_BT_STATUS_HCI_ROLE_SWITCH_FAILED,
104+
ESP_BT_STATUS_HCI_INQ_RSP_DATA_TOO_LARGE,
105+
ESP_BT_STATUS_HCI_SIMPLE_PAIRING_NOT_SUPPORTED,
106+
ESP_BT_STATUS_HCI_HOST_BUSY_PAIRING,
107+
ESP_BT_STATUS_HCI_REJ_NO_SUITABLE_CHANNEL,
108+
ESP_BT_STATUS_HCI_CONTROLLER_BUSY,
109+
ESP_BT_STATUS_HCI_UNACCEPT_CONN_INTERVAL,
110+
ESP_BT_STATUS_HCI_DIRECTED_ADVERTISING_TIMEOUT,
111+
ESP_BT_STATUS_HCI_CONN_TOUT_DUE_TO_MIC_FAILURE,
112+
ESP_BT_STATUS_HCI_CONN_FAILED_ESTABLISHMENT,
113+
ESP_BT_STATUS_HCI_MAC_CONNECTION_FAILED,
48114
} esp_bt_status_t;
49115

50116

components/bt/host/bluedroid/api/include/api/esp_gap_bt_api.h

+20
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,8 @@ typedef enum {
215215
ESP_BT_GAP_MODE_CHG_EVT,
216216
ESP_BT_GAP_REMOVE_BOND_DEV_COMPLETE_EVT, /*!< remove bond device complete event */
217217
ESP_BT_GAP_QOS_CMPL_EVT, /*!< QOS complete event */
218+
ESP_BT_GAP_ACL_CONN_CMPL_STAT_EVT, /*!< ACL connection complete status event */
219+
ESP_BT_GAP_ACL_DISCONN_CMPL_STAT_EVT, /*!< ACL disconnection complete status event */
218220
ESP_BT_GAP_EVT_MAX,
219221
} esp_bt_gap_cb_event_t;
220222

@@ -368,6 +370,24 @@ typedef union {
368370
which from the master to a particular slave on the ACL
369371
logical transport. unit is 0.625ms. */
370372
} qos_cmpl; /*!< QoS complete parameter struct */
373+
374+
/**
375+
* @brief ESP_BT_GAP_ACL_CONN_CMPL_STAT_EVT
376+
*/
377+
struct acl_conn_cmpl_stat_param {
378+
esp_bt_status_t stat; /*!< ACL connection status */
379+
uint16_t handle; /*!< ACL connection handle */
380+
esp_bd_addr_t bda; /*!< remote bluetooth device address */
381+
} acl_conn_cmpl_stat; /*!< ACL connection complete status parameter struct */
382+
383+
/**
384+
* @brief ESP_BT_GAP_ACL_DISCONN_CMPL_STAT_EVT
385+
*/
386+
struct acl_disconn_cmpl_stat_param {
387+
esp_bt_status_t reason; /*!< ACL disconnection reason */
388+
uint16_t handle; /*!< ACL connection handle */
389+
esp_bd_addr_t bda; /*!< remote bluetooth device address */
390+
} acl_disconn_cmpl_stat; /*!< ACL disconnection complete status parameter struct */
371391
} esp_bt_gap_cb_param_t;
372392

373393
/**

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

+41
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ static BOOLEAN bta_dm_check_av(UINT16 event);
7171
static void bta_dm_bl_change_cback (tBTM_BL_EVENT_DATA *p_data);
7272

7373

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

7677
/* Extended Inquiry Response */
@@ -511,6 +512,7 @@ static void bta_dm_sys_hw_cback( tBTA_SYS_HW_EVT status )
511512
BTM_SetDefaultLinkPolicy(bta_dm_cb.cur_policy);
512513
#endif
513514
BTM_RegBusyLevelNotif (bta_dm_bl_change_cback, NULL, BTM_BL_UPDATE_MASK | BTM_BL_ROLE_CHG_MASK);
515+
BTM_RegAclLinkStatNotif (bta_dm_acl_link_stat_cback);
514516

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

33183320
}
33193321

3322+
/*******************************************************************************
3323+
**
3324+
** Function bta_dm_acl_link_stat_cback
3325+
**
3326+
** Description Callback from btm to report acl link status
3327+
**
3328+
** Returns void
3329+
**
3330+
*******************************************************************************/
3331+
static void bta_dm_acl_link_stat_cback(tBTM_ACL_LINK_STAT_EVENT_DATA *p_data)
3332+
{
3333+
tBTA_DM_SEC sec_event;
3334+
memset(&sec_event, 0, sizeof(tBTA_DM_SEC));
3335+
sec_event.acl_link_stat.event = p_data->event;
3336+
3337+
switch (sec_event.acl_link_stat.event) {
3338+
case BTA_ACL_LINK_STAT_CONN_CMPL: {
3339+
sec_event.acl_link_stat.link_act.conn_cmpl.status = p_data->link_act.conn_cmpl.status;
3340+
sec_event.acl_link_stat.link_act.conn_cmpl.handle = p_data->link_act.conn_cmpl.handle;
3341+
bdcpy(sec_event.acl_link_stat.link_act.conn_cmpl.bd_addr, p_data->link_act.conn_cmpl.bd_addr);
3342+
break;
3343+
}
3344+
case BTA_ACL_LINK_STAT_DISCONN_CMPL: {
3345+
sec_event.acl_link_stat.link_act.disconn_cmpl.reason = p_data->link_act.disconn_cmpl.reason;
3346+
sec_event.acl_link_stat.link_act.disconn_cmpl.handle = p_data->link_act.disconn_cmpl.handle;
3347+
bdcpy(sec_event.acl_link_stat.link_act.disconn_cmpl.bd_addr, p_data->link_act.disconn_cmpl.bd_addr);
3348+
break;
3349+
}
3350+
default: {
3351+
APPL_TRACE_WARNING("bta_dm_acl_link_stat: invalid event %d", sec_event.acl_link_stat.event);
3352+
return;
3353+
}
3354+
}
3355+
3356+
if (bta_dm_cb.p_sec_cback) {
3357+
(*bta_dm_cb.p_sec_cback)(BTA_DM_ACL_LINK_STAT_EVT, &sec_event);
3358+
}
3359+
}
3360+
33203361
/*******************************************************************************
33213362
**
33223363
** Function bta_dm_rs_cback

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

+29
Original file line numberDiff line numberDiff line change
@@ -656,6 +656,7 @@ typedef UINT8 tBTA_SIG_STRENGTH_MASK;
656656
#define BTA_DM_BLE_DEV_UNPAIRED_EVT 29 /* BLE unpair event */
657657
#define BTA_DM_SP_KEY_REQ_EVT 30 /* Simple Pairing Passkey request */
658658
#define BTA_DM_PM_MODE_CHG_EVT 31 /* Mode changed event */
659+
#define BTA_DM_ACL_LINK_STAT_EVT 32 /* ACL connection status report event */
659660

660661
typedef UINT8 tBTA_DM_SEC_EVT;
661662

@@ -819,6 +820,33 @@ typedef struct {
819820
#endif
820821
} tBTA_DM_LINK_DOWN;
821822

823+
enum {
824+
BTA_ACL_LINK_STAT_CONN_CMPL,
825+
BTA_ACL_LINK_STAT_DISCONN_CMPL
826+
};
827+
typedef UINT8 tBTA_ACL_LINK_STAT_EVT;
828+
829+
typedef struct {
830+
UINT8 status; /* ACL link connection status */
831+
UINT16 handle; /* ACL connection handle */
832+
BD_ADDR bd_addr; /* peer bluetooth address */
833+
} tBTA_DM_ACL_CONN_CMPL_STAT;
834+
835+
typedef struct {
836+
UINT8 reason; /* ACL link disconnection reason */
837+
UINT16 handle; /* ACL connection handle */
838+
BD_ADDR bd_addr; /* peer bluetooth address */
839+
} tBTA_DM_ACL_DISCONN_CMPL_STAT;
840+
841+
/* Structure associated with BTA_DM_ACL_LINK_STAT_EVT */
842+
typedef struct {
843+
tBTA_ACL_LINK_STAT_EVT event; /* ACL link event */
844+
union {
845+
tBTA_DM_ACL_CONN_CMPL_STAT conn_cmpl;
846+
tBTA_DM_ACL_DISCONN_CMPL_STAT disconn_cmpl;
847+
} link_act;
848+
} tBTA_DM_ACL_LINK_STAT;
849+
822850
/* Structure associated with BTA_DM_ROLE_CHG_EVT */
823851
typedef struct {
824852
BD_ADDR bd_addr; /* BD address peer device. */
@@ -957,6 +985,7 @@ typedef union {
957985
tBTA_DM_AUTHORIZE authorize; /* Authorization request. */
958986
tBTA_DM_LINK_UP link_up; /* ACL connection up event */
959987
tBTA_DM_LINK_DOWN link_down; /* ACL connection down event */
988+
tBTA_DM_ACL_LINK_STAT acl_link_stat; /* ACL link status event */
960989
tBTA_DM_BUSY_LEVEL busy_level; /* System busy level */
961990
tBTA_DM_SP_CFM_REQ cfm_req; /* user confirm request */
962991
tBTA_DM_SP_KEY_REQ key_req; /* user passkey request */

components/bt/host/bluedroid/btc/core/btc_dm.c

+38
Original file line numberDiff line numberDiff line change
@@ -677,6 +677,40 @@ bt_status_t btc_dm_disable_service(tBTA_SERVICE_ID service_id)
677677
return BT_STATUS_SUCCESS;
678678
}
679679

680+
static void btc_dm_acl_link_stat(tBTA_DM_ACL_LINK_STAT *p_acl_link_stat)
681+
{
682+
#if (BTC_GAP_BT_INCLUDED == TRUE)
683+
esp_bt_gap_cb_param_t param;
684+
esp_bt_gap_cb_event_t event = ESP_BT_GAP_EVT_MAX;
685+
686+
switch (p_acl_link_stat->event) {
687+
case BTA_ACL_LINK_STAT_CONN_CMPL: {
688+
event = ESP_BT_GAP_ACL_CONN_CMPL_STAT_EVT;
689+
param.acl_conn_cmpl_stat.stat = p_acl_link_stat->link_act.conn_cmpl.status | ESP_BT_STATUS_BASE_FOR_HCI_ERR;
690+
param.acl_conn_cmpl_stat.handle = p_acl_link_stat->link_act.conn_cmpl.handle;
691+
memcpy(param.acl_conn_cmpl_stat.bda, p_acl_link_stat->link_act.conn_cmpl.bd_addr, ESP_BD_ADDR_LEN);
692+
break;
693+
}
694+
case BTA_ACL_LINK_STAT_DISCONN_CMPL: {
695+
event = ESP_BT_GAP_ACL_DISCONN_CMPL_STAT_EVT;
696+
param.acl_disconn_cmpl_stat.reason = p_acl_link_stat->link_act.disconn_cmpl.reason | ESP_BT_STATUS_BASE_FOR_HCI_ERR;
697+
param.acl_disconn_cmpl_stat.handle = p_acl_link_stat->link_act.disconn_cmpl.handle;
698+
memcpy(param.acl_disconn_cmpl_stat.bda, p_acl_link_stat->link_act.disconn_cmpl.bd_addr, ESP_BD_ADDR_LEN);
699+
break;
700+
}
701+
default: {
702+
BTC_TRACE_WARNING("%s: invalid event %x", __FUNCTION__, event);
703+
return;
704+
}
705+
}
706+
707+
esp_bt_gap_cb_t cb = (esp_bt_gap_cb_t)btc_profile_cb_get(BTC_PID_GAP_BT);
708+
if (cb) {
709+
cb(event, &param);
710+
}
711+
#endif
712+
}
713+
680714
void btc_dm_sec_cb_handler(btc_msg_t *msg)
681715
{
682716
btc_dm_sec_args_t *arg = (btc_dm_sec_args_t *)(msg->arg);
@@ -755,6 +789,10 @@ void btc_dm_sec_cb_handler(btc_msg_t *msg)
755789
break;
756790
#endif ///BT_SSP_INCLUDED == TRUE
757791

792+
case BTA_DM_ACL_LINK_STAT_EVT: {
793+
btc_dm_acl_link_stat(&p_data->acl_link_stat);
794+
break;
795+
}
758796
case BTA_DM_DEV_UNPAIRED_EVT: {
759797
btc_dm_dev_unpaired_evt(&p_data->link_down);
760798
break;

0 commit comments

Comments
 (0)