summaryrefslogtreecommitdiff
path: root/emulator
diff options
context:
space:
mode:
authorKeyur Parekh <kpare@dolby.com>2021-03-11 10:35:50 -0800
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2021-03-15 14:43:39 -0700
commitef2412c14664cc64b3f9f4a502c50f453d3bc16e (patch)
tree325d98b5274b6a731cfd5e61a1b71861c5bf5967 /emulator
parent3ce089b0b50e06500ae5724d510965aada57f047 (diff)
downloadbluez-ef2412c14664cc64b3f9f4a502c50f453d3bc16e.tar.gz
emulator: Periodic Advertising Command
This adds support for Periodic Advertising HCI command in the emulator. These changes are the first step in making the emulator useful for testing the LE Audio Broadcast feature
Diffstat (limited to 'emulator')
-rw-r--r--emulator/btdev.c50
1 files changed, 44 insertions, 6 deletions
diff --git a/emulator/btdev.c b/emulator/btdev.c
index 93c038e74..7faf2dbcf 100644
--- a/emulator/btdev.c
+++ b/emulator/btdev.c
@@ -141,6 +141,12 @@ struct btdev {
uint8_t le_scan_own_addr_type;
uint8_t le_filter_dup;
uint8_t le_adv_enable;
+ uint8_t le_periodic_adv_enable;
+ uint16_t le_periodic_adv_properties;
+ uint16_t le_periodic_min_interval;
+ uint16_t le_periodic_max_interval;
+ uint8_t le_periodic_data_len;
+ uint8_t le_periodic_data[31];
uint8_t le_ltk[16];
struct {
struct bt_hci_cmd_le_set_cig_params params;
@@ -3934,22 +3940,54 @@ static int cmd_clear_adv_sets(struct btdev *dev, const void *data,
static int cmd_set_per_adv_params(struct btdev *dev, const void *data,
uint8_t len)
{
- /* TODO */
- return -ENOTSUP;
+ const struct bt_hci_cmd_le_set_periodic_adv_params *cmd = data;
+ uint8_t status;
+
+ if (dev->le_periodic_adv_enable) {
+ status = BT_HCI_ERR_COMMAND_DISALLOWED;
+ } else {
+ status = BT_HCI_ERR_SUCCESS;
+ dev->le_periodic_adv_properties = le16_to_cpu(cmd->properties);
+ dev->le_periodic_min_interval = cmd->min_interval;
+ dev->le_periodic_max_interval = cmd->max_interval;
+ }
+
+ cmd_complete(dev, BT_HCI_CMD_LE_SET_PERIODIC_ADV_PARAMS, &status,
+ sizeof(status));
+ return 0;
}
static int cmd_set_per_adv_data(struct btdev *dev, const void *data,
uint8_t len)
{
- /* TODO */
- return -ENOTSUP;
+ const struct bt_hci_cmd_le_set_periodic_adv_data *cmd = data;
+ uint8_t status = BT_HCI_ERR_SUCCESS;
+
+ dev->le_periodic_data_len = cmd->data_len;
+ memcpy(dev->le_periodic_data, cmd->data, 31);
+ cmd_complete(dev, BT_HCI_CMD_LE_SET_PERIODIC_ADV_DATA, &status,
+ sizeof(status));
+
+ return 0;
}
static int cmd_set_per_adv_enable(struct btdev *dev, const void *data,
uint8_t len)
{
- /* TODO */
- return -ENOTSUP;
+ const struct bt_hci_cmd_le_set_periodic_adv_enable *cmd = data;
+ uint8_t status;
+
+ if (dev->le_periodic_adv_enable == cmd->enable) {
+ status = BT_HCI_ERR_COMMAND_DISALLOWED;
+ } else {
+ dev->le_periodic_adv_enable = cmd->enable;
+ status = BT_HCI_ERR_SUCCESS;
+ }
+
+ cmd_complete(dev, BT_HCI_CMD_LE_SET_PERIODIC_ADV_ENABLE, &status,
+ sizeof(status));
+
+ return 0;
}
static int cmd_set_ext_scan_params(struct btdev *dev, const void *data,