Skip to content

Commit

Permalink
Merge branch 'test/ctrl_acl_u_pkt_type_v5.0' into 'release/v5.0'
Browse files Browse the repository at this point in the history
feat(bt/bluedroid): Added an API to specify data types for ACL-U traffic

See merge request espressif/esp-idf!27599
  • Loading branch information
jack0c committed Dec 15, 2023
2 parents 5e319c6 + e7a5263 commit 871247d
Show file tree
Hide file tree
Showing 13 changed files with 297 additions and 8 deletions.
21 changes: 20 additions & 1 deletion components/bt/host/bluedroid/api/esp_gap_bt_api.c
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
Expand Down Expand Up @@ -424,4 +424,23 @@ esp_err_t esp_bt_gap_set_qos(esp_bd_addr_t remote_bda, uint32_t t_poll)
arg.set_qos.t_poll = t_poll;
return (btc_transfer_context(&msg, &arg, sizeof(btc_gap_bt_args_t), NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
}

esp_err_t esp_bt_gap_set_acl_pkt_types(esp_bd_addr_t remote_bda, uint16_t pkt_types)
{
btc_msg_t msg;
btc_gap_bt_args_t arg;

if (esp_bluedroid_get_status() != ESP_BLUEDROID_STATUS_ENABLED) {
return ESP_ERR_INVALID_STATE;
}

msg.sig = BTC_SIG_API_CALL;
msg.pid = BTC_PID_GAP_BT;
msg.act = BTC_GAP_BT_ACT_SET_ACL_PKT_TYPES;

memcpy(&arg.set_acl_pkt_types.bda, remote_bda, sizeof(bt_bdaddr_t));
arg.set_acl_pkt_types.pkt_types = pkt_types;
return (btc_transfer_context(&msg, &arg, sizeof(btc_gap_bt_args_t), NULL, NULL) == BT_STATUS_SUCCESS ? ESP_OK : ESP_FAIL);
}

#endif /* #if BTC_GAP_BT_INCLUDED == TRUE */
53 changes: 51 additions & 2 deletions components/bt/host/bluedroid/api/include/api/esp_gap_bt_api.h
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
Expand Down Expand Up @@ -91,7 +91,35 @@ typedef struct {

typedef uint8_t esp_bt_eir_type_t;


/* ACL Packet Types */
#define ESP_BT_ACL_PKT_TYPES_MASK_DM1 0x0008
#define ESP_BT_ACL_PKT_TYPES_MASK_DH1 0x0010
#define ESP_BT_ACL_PKT_TYPES_MASK_DM3 0x0400
#define ESP_BT_ACL_PKT_TYPES_MASK_DH3 0x0800
#define ESP_BT_ACL_PKT_TYPES_MASK_DM5 0x4000
#define ESP_BT_ACL_PKT_TYPES_MASK_DH5 0x8000
#define ESP_BT_ACL_PKT_TYPES_MASK_NO_2_DH1 0x0002
#define ESP_BT_ACL_PKT_TYPES_MASK_NO_3_DH1 0x0004
#define ESP_BT_ACL_PKT_TYPES_MASK_NO_2_DH3 0x0100
#define ESP_BT_ACL_PKT_TYPES_MASK_NO_3_DH3 0x0200
#define ESP_BT_ACL_PKT_TYPES_MASK_NO_2_DH5 0x1000
#define ESP_BT_ACL_PKT_TYPES_MASK_NO_3_DH5 0x2000

// DM1 cann not be disabled. All options are mandatory to include DM1.
#define ESP_BT_ACL_DM1_ONLY (ESP_BT_ACL_PKT_TYPES_MASK_DM1 | 0x330e) /* 0x330e */
#define ESP_BT_ACL_DH1_ONLY (ESP_BT_ACL_PKT_TYPES_MASK_DH1 | 0x330e) /* 0x331e */
#define ESP_BT_ACL_DM3_ONLY (ESP_BT_ACL_PKT_TYPES_MASK_DM3 | 0x330e) /* 0x370e */
#define ESP_BT_ACL_DH3_ONLY (ESP_BT_ACL_PKT_TYPES_MASK_DH3 | 0x330e) /* 0x3b0e */
#define ESP_BT_ACL_DM5_ONLY (ESP_BT_ACL_PKT_TYPES_MASK_DM5 | 0x330e) /* 0x730e */
#define ESP_BT_ACL_DH5_ONLY (ESP_BT_ACL_PKT_TYPES_MASK_DH5 | 0x330e) /* 0xb30e */
#define ESP_BT_ACL_2_DH1_ONLY (~ESP_BT_ACL_PKT_TYPES_MASK_NO_2_DH1 & 0x330e) /* 0x330c */
#define ESP_BT_ACL_3_DH1_ONLY (~ESP_BT_ACL_PKT_TYPES_MASK_NO_3_DH1 & 0x330e) /* 0x330a */
#define ESP_BT_ACL_2_DH3_ONLY (~ESP_BT_ACL_PKT_TYPES_MASK_NO_2_DH3 & 0x330e) /* 0x320e */
#define ESP_BT_ACL_3_DH3_ONLY (~ESP_BT_ACL_PKT_TYPES_MASK_NO_3_DH3 & 0x330e) /* 0x310e */
#define ESP_BT_ACL_2_DH5_ONLY (~ESP_BT_ACL_PKT_TYPES_MASK_NO_2_DH5 & 0x330e) /* 0x230e */
#define ESP_BT_ACL_3_DH5_ONLY (~ESP_BT_ACL_PKT_TYPES_MASK_NO_3_DH5 & 0x330e) /* 0x130e */

typedef uint16_t esp_bt_acl_pkt_type_t;

/* ESP_BT_EIR_FLAG bit definition */
#define ESP_BT_EIR_FLAG_LIMIT_DISC (0x01 << 0)
Expand Down Expand Up @@ -218,6 +246,7 @@ typedef enum {
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_ACL_PKT_TYPE_CHANGED_EVT, /*!< Set ACL packet types event */
ESP_BT_GAP_EVT_MAX,
} esp_bt_gap_cb_event_t;

Expand Down Expand Up @@ -377,6 +406,15 @@ typedef union {
logical transport. unit is 0.625ms. */
} qos_cmpl; /*!< QoS complete parameter struct */

/**
* @brief ESP_BT_GAP_ACL_PKT_TYPE_CHANGED_EVT
*/
struct set_acl_pkt_types_param {
esp_bt_status_t status; /*!< set ACL packet types status */
esp_bd_addr_t bda; /*!< remote bluetooth device address */
uint16_t pkt_types; /*!< packet types successfully set */
} set_acl_pkt_types; /*!< set ACL packet types parameter struct */

/**
* @brief ESP_BT_GAP_ACL_CONN_CMPL_STAT_EVT
*/
Expand Down Expand Up @@ -791,6 +829,17 @@ esp_err_t esp_bt_gap_read_remote_name(esp_bd_addr_t remote_bda);
*/
esp_err_t esp_bt_gap_set_qos(esp_bd_addr_t remote_bda, uint32_t t_poll);

/**
* @brief Set ACL packet types. FOR INTERNAL TESTING ONLY.
* An ESP_BT_GAP_SET_ACL_PPKT_TYPES_EVT event will reported to
* the APP layer.
*
* @return - ESP_OK: success
* - ESP_ERR_INVALID_STATE: if bluetooth stack is not yet enabled
* - other: failed
*/
esp_err_t esp_bt_gap_set_acl_pkt_types(esp_bd_addr_t remote_bda, esp_bt_acl_pkt_type_t pkt_types);

#ifdef __cplusplus
}
#endif
Expand Down
22 changes: 22 additions & 0 deletions components/bt/host/bluedroid/bta/dm/bta_dm_act.c
Expand Up @@ -825,6 +825,28 @@ void bta_dm_config_eir (tBTA_DM_MSG *p_data)

bta_dm_set_eir(NULL);
}

/*******************************************************************************
**
** Function bta_dm_set_acl_pkt_types
**
** Description Sets ACL packet types
**
**
** Returns void
**
*******************************************************************************/
void bta_dm_set_acl_pkt_types (tBTA_DM_MSG *p_data)
{
if (p_data->set_acl_pkt_types.set_acl_pkt_types_cb != NULL) {
BTM_SetAclPktTypes(p_data->set_acl_pkt_types.rmt_addr,
p_data->set_acl_pkt_types.pkt_types,
p_data->set_acl_pkt_types.set_acl_pkt_types_cb);
} else {
APPL_TRACE_ERROR("%s(), the callback function can't be NULL.", __func__);
}
}

#endif
/*******************************************************************************
**
Expand Down
24 changes: 24 additions & 0 deletions components/bt/host/bluedroid/bta/dm/bta_dm_api.c
Expand Up @@ -271,6 +271,30 @@ void BTA_DmSetAfhChannels(const uint8_t *channels, tBTA_CMPL_CB *set_afh_cb)
bta_sys_sendmsg(p_msg);
}
}

/*******************************************************************************
**
** Function BTA_DmSetAclPktTypes
**
** Description This function sets the packet types used for ACL traffic.
**
**
** Returns void
**
*******************************************************************************/
void BTA_DmSetAclPktTypes(BD_ADDR remote_addr, UINT16 pkt_types, tBTM_CMPL_CB *p_cb)
{
tBTA_DM_API_SET_ACL_PKT_TYPES *p_msg;

if ((p_msg = (tBTA_DM_API_SET_ACL_PKT_TYPES *) osi_malloc(sizeof(tBTA_DM_API_SET_ACL_PKT_TYPES))) != NULL) {
p_msg->hdr.event = BTA_DM_API_SET_ACL_PKT_TYPES_EVT;
bdcpy(p_msg->rmt_addr, remote_addr);
p_msg->pkt_types = pkt_types;
p_msg->set_acl_pkt_types_cb = p_cb;

bta_sys_sendmsg(p_msg);
}
}
#endif /// CLASSIC_BT_INCLUDED == TRUE

#if (SDP_INCLUDED == TRUE)
Expand Down
1 change: 1 addition & 0 deletions components/bt/host/bluedroid/bta/dm/bta_dm_main.c
Expand Up @@ -61,6 +61,7 @@ const tBTA_DM_ACTION bta_dm_action[BTA_DM_MAX_EVT] = {
bta_dm_get_dev_name, /* BTA_DM_API_GET_NAME_EVT */
#if (CLASSIC_BT_INCLUDED == TRUE)
bta_dm_config_eir, /* BTA_DM_API_CONFIG_EIR_EVT */
bta_dm_set_acl_pkt_types, /* BTA_DM_API_SET_ACL_PKT_TYPES_EVT */
#endif
bta_dm_set_afh_channels, /* BTA_DM_API_SET_AFH_CHANNELS_EVT */
#if (SDP_INCLUDED == TRUE)
Expand Down
11 changes: 11 additions & 0 deletions components/bt/host/bluedroid/bta/dm/include/bta_dm_int.h
Expand Up @@ -56,6 +56,7 @@ enum {
BTA_DM_API_GET_NAME_EVT,
#if (CLASSIC_BT_INCLUDED == TRUE)
BTA_DM_API_CONFIG_EIR_EVT,
BTA_DM_API_SET_ACL_PKT_TYPES_EVT,
#endif
BTA_DM_API_SET_AFH_CHANNELS_EVT,
#if (SDP_INCLUDED == TRUE)
Expand Down Expand Up @@ -267,6 +268,14 @@ typedef struct {
tBTA_CMPL_CB *set_afh_cb;
}tBTA_DM_API_SET_AFH_CHANNELS;

/* data type for BTA_DM_API_SET_ACL_PKT_TYPES_EVT */
typedef struct {
BT_HDR hdr;
BD_ADDR rmt_addr;
UINT16 pkt_types;
tBTM_CMPL_CB *set_acl_pkt_types_cb;
} tBTA_DM_API_SET_ACL_PKT_TYPES;

/* data type for BTA_DM_API_GET_REMOTE_NAME_EVT */
typedef struct {
BT_HDR hdr;
Expand Down Expand Up @@ -1086,6 +1095,7 @@ typedef union {
tBTA_DM_API_CONFIG_EIR config_eir;

tBTA_DM_API_SET_AFH_CHANNELS set_afh_channels;
tBTA_DM_API_SET_ACL_PKT_TYPES set_acl_pkt_types;
#if (SDP_INCLUDED == TRUE)
tBTA_DM_API_GET_REMOTE_NAME get_rmt_name;
#endif
Expand Down Expand Up @@ -1587,6 +1597,7 @@ extern void bta_dm_set_dev_name (tBTA_DM_MSG *p_data);
extern void bta_dm_get_dev_name (tBTA_DM_MSG *p_data);
#if (CLASSIC_BT_INCLUDED == TRUE)
extern void bta_dm_config_eir (tBTA_DM_MSG *p_data);
extern void bta_dm_set_acl_pkt_types (tBTA_DM_MSG *p_data);
#endif
extern void bta_dm_set_afh_channels (tBTA_DM_MSG *p_data);
extern void bta_dm_read_rmt_name(tBTA_DM_MSG *p_data);
Expand Down
14 changes: 14 additions & 0 deletions components/bt/host/bluedroid/bta/include/bta/bta_api.h
Expand Up @@ -438,6 +438,8 @@ typedef tBTM_RSSI_RESULTS tBTA_RSSI_RESULTS;
typedef tBTM_SET_AFH_CHANNELS_RESULTS tBTA_SET_AFH_CHANNELS_RESULTS;
typedef tBTM_BLE_SET_CHANNELS_RESULTS tBTA_BLE_SET_CHANNELS_RESULTS;

typedef tBTM_SET_ACL_PKT_TYPES_RESULTS tBTA_SET_ACL_PKT_TYPES_RESULTS;

typedef tBTM_REMOTE_DEV_NAME tBTA_REMOTE_DEV_NAME;

/* advertising channel map */
Expand Down Expand Up @@ -1762,6 +1764,18 @@ void BTA_DmSetAfhChannels(const uint8_t *channels, tBTA_CMPL_CB *set_afh_cb);
void BTA_DmSetQos(BD_ADDR bd_addr, UINT32 t_poll, tBTM_CMPL_CB *p_cb);
#endif /// (BTA_DM_QOS_INCLUDED == TRUE)

/*******************************************************************************
**
** Function BTA_DmSetAclPktTypes
**
** Description This function sets the packet types used for ACL traffic.
**
**
** Returns void
**
*******************************************************************************/
void BTA_DmSetAclPktTypes(BD_ADDR remote_addr, UINT16 pkt_types, tBTM_CMPL_CB *p_cb);

#if (BLE_INCLUDED == TRUE)
/*******************************************************************************
**
Expand Down
40 changes: 39 additions & 1 deletion components/bt/host/bluedroid/btc/profile/std/gap/btc_gap_bt.c
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
Expand Down Expand Up @@ -726,6 +726,33 @@ static void btc_gap_bt_set_afh_channels(btc_gap_bt_args_t *arg)
BTA_DmSetAfhChannels(arg->set_afh_channels.channels, btc_gap_bt_set_afh_channels_cmpl_callback);
}

static void btc_gap_bt_set_acl_pkt_types_cmpl_callback(void *p_data)
{
tBTA_SET_ACL_PKT_TYPES_RESULTS *result = (tBTA_SET_ACL_PKT_TYPES_RESULTS *)p_data;
esp_bt_gap_cb_param_t param;
bt_status_t ret;
btc_msg_t msg;
msg.sig = BTC_SIG_API_CB;
msg.pid = BTC_PID_GAP_BT;
msg.act = BTC_GAP_BT_SET_ACL_PKT_TYPES_EVT;

param.set_acl_pkt_types.status = btc_btm_status_to_esp_status(result->status);
memcpy(param.set_acl_pkt_types.bda, result->rem_bda, sizeof(esp_bd_addr_t));
param.set_acl_pkt_types.pkt_types = result->pkt_types;

ret = btc_transfer_context(&msg, &param, sizeof(esp_bt_gap_cb_param_t), NULL, NULL);
if (ret != BT_STATUS_SUCCESS) {
BTC_TRACE_ERROR("%s btc_transfer_context failed\n", __func__);
}
}

static void btc_gap_set_acl_pkt_types(btc_gap_bt_args_t *arg)
{
BTA_DmSetAclPktTypes(arg->set_acl_pkt_types.bda.address,
arg->set_acl_pkt_types.pkt_types,
btc_gap_bt_set_acl_pkt_types_cmpl_callback);
}

static void btc_gap_bt_read_remote_name_cmpl_callback(void *p_data)
{
tBTA_REMOTE_DEV_NAME *result = (tBTA_REMOTE_DEV_NAME *)p_data;
Expand Down Expand Up @@ -798,6 +825,7 @@ void btc_gap_bt_arg_deep_copy(btc_msg_t *msg, void *p_dest, void *p_src)
case BTC_GAP_BT_ACT_SET_AFH_CHANNELS:
case BTC_GAP_BT_ACT_READ_REMOTE_NAME:
case BTC_GAP_BT_ACT_SET_QOS:
case BTC_GAP_BT_ACT_SET_ACL_PKT_TYPES:
break;
#if (BT_SSP_INCLUDED == TRUE)
case BTC_GAP_BT_ACT_PASSKEY_REPLY:
Expand Down Expand Up @@ -864,6 +892,7 @@ void btc_gap_bt_arg_deep_free(btc_msg_t *msg)
case BTC_GAP_BT_ACT_SET_AFH_CHANNELS:
case BTC_GAP_BT_ACT_READ_REMOTE_NAME:
case BTC_GAP_BT_ACT_SET_QOS:
case BTC_GAP_BT_ACT_SET_ACL_PKT_TYPES:
break;
#if (BT_SSP_INCLUDED == TRUE)
case BTC_GAP_BT_ACT_PASSKEY_REPLY:
Expand Down Expand Up @@ -966,6 +995,10 @@ void btc_gap_bt_call_handler(btc_msg_t *msg)
btc_gap_bt_set_qos(arg);
break;
}
case BTC_GAP_BT_ACT_SET_ACL_PKT_TYPES: {
btc_gap_set_acl_pkt_types(arg);
break;
}
default:
break;
}
Expand Down Expand Up @@ -1009,6 +1042,7 @@ void btc_gap_bt_cb_deep_free(btc_msg_t *msg)
case BTC_GAP_BT_REMOVE_BOND_DEV_COMPLETE_EVT:
case BTC_GAP_BT_QOS_EVT:
#if (BT_SSP_INCLUDED == TRUE)
case BTC_GAP_BT_SET_ACL_PKT_TYPES_EVT:
case BTC_GAP_BT_CFM_REQ_EVT:
case BTC_GAP_BT_KEY_NOTIF_EVT:
case BTC_GAP_BT_KEY_REQ_EVT:
Expand Down Expand Up @@ -1093,6 +1127,10 @@ void btc_gap_bt_cb_handler(btc_msg_t *msg)
btc_gap_bt_cb_to_app(ESP_BT_GAP_QOS_CMPL_EVT, (esp_bt_gap_cb_param_t *)msg->arg);
break;
}
case BTC_GAP_BT_SET_ACL_PKT_TYPES_EVT: {
btc_gap_bt_cb_to_app(ESP_BT_GAP_ACL_PKT_TYPE_CHANGED_EVT, (esp_bt_gap_cb_param_t *)msg->arg);
break;
}
default:
BTC_TRACE_ERROR("%s: Unhandled event (%d)!\n", __FUNCTION__, msg->act);
break;
Expand Down
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2015-2023 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
Expand Down Expand Up @@ -31,6 +31,7 @@ typedef enum {
BTC_GAP_BT_MODE_CHG_EVT,
BTC_GAP_BT_REMOVE_BOND_DEV_COMPLETE_EVT,
BTC_GAP_BT_QOS_EVT,
BTC_GAP_BT_SET_ACL_PKT_TYPES_EVT,
}btc_gap_bt_evt_t;

typedef enum {
Expand All @@ -51,6 +52,7 @@ typedef enum {
BTC_GAP_BT_ACT_SET_AFH_CHANNELS,
BTC_GAP_BT_ACT_READ_REMOTE_NAME,
BTC_GAP_BT_ACT_SET_QOS,
BTC_GAP_BT_ACT_SET_ACL_PKT_TYPES,
} btc_gap_bt_act_t;

/* btc_bt_gap_args_t */
Expand Down Expand Up @@ -147,6 +149,12 @@ typedef union {
uint32_t t_poll;
} set_qos;

// BTC_GAP_BT_ACT_SET_ACL_PKT_TYPES
struct set_acl_pkt_types_args {
bt_bdaddr_t bda;
uint16_t pkt_types;
} set_acl_pkt_types;

} btc_gap_bt_args_t;

void btc_gap_bt_call_handler(btc_msg_t *msg);
Expand Down

0 comments on commit 871247d

Please sign in to comment.