Increase maximum advertising data length and implement LE Read Maximum Advertising Data Length command. As expected by Zephyr BAP Server --- emulator/btdev.c | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/emulator/btdev.c b/emulator/btdev.c index 7bb40670c..4cf48a5af 100644 --- a/emulator/btdev.c +++ b/emulator/btdev.c @@ -25,6 +25,8 @@ #include <fcntl.h> #include <unistd.h> +#include <glib.h> + #include "lib/bluetooth.h" #include "lib/hci.h" @@ -45,6 +47,7 @@ #define CIG_SIZE 3 #define MAX_PA_DATA_LEN 252 +#define MAX_EXT_ADV_LEN 252 #define has_bredr(btdev) (!((btdev)->features[4] & 0x20)) #define has_le(btdev) (!!((btdev)->features[4] & 0x40)) @@ -99,9 +102,9 @@ struct le_ext_adv { uint8_t filter_policy; /* filter_policy */ uint8_t random_addr[6]; bool rpa; - uint8_t adv_data[252]; + uint8_t adv_data[MAX_EXT_ADV_LEN]; uint8_t adv_data_len; - uint8_t scan_data[252]; + uint8_t scan_data[MAX_EXT_ADV_LEN]; uint8_t scan_data_len; unsigned int broadcast_id; unsigned int timeout_id; @@ -4950,7 +4953,7 @@ static int cmd_set_ext_adv_data(struct btdev *dev, const void *data, return 0; } - ext_adv->adv_data_len = cmd->data_len; + ext_adv->adv_data_len = MIN(cmd->data_len, MAX_EXT_ADV_LEN); memcpy(ext_adv->adv_data, cmd->data, cmd->data_len); cmd_complete(dev, BT_HCI_CMD_LE_SET_EXT_ADV_DATA, &status, sizeof(status)); @@ -4974,7 +4977,7 @@ static int cmd_set_ext_scan_rsp_data(struct btdev *dev, const void *data, return 0; } - ext_adv->scan_data_len = cmd->data_len; + ext_adv->scan_data_len = MIN(cmd->data_len, MAX_EXT_ADV_LEN); memcpy(ext_adv->scan_data, cmd->data, cmd->data_len); cmd_complete(dev, BT_HCI_CMD_LE_SET_EXT_SCAN_RSP_DATA, &status, sizeof(status)); @@ -5008,7 +5011,7 @@ static void send_ext_adv(struct btdev *btdev, const struct btdev *remote, uint8_t num_reports; union { struct bt_hci_le_ext_adv_report lear; - uint8_t raw[24 + 31]; + uint8_t raw[24 + MAX_EXT_ADV_LEN]; }; } meta_event; @@ -5213,8 +5216,16 @@ exit_complete: static int cmd_read_max_adv_data_len(struct btdev *dev, const void *data, uint8_t len) { - /* TODO */ - return -ENOTSUP; + struct bt_hci_rsp_le_read_max_adv_data_len rsp; + + memset(&rsp, 0, sizeof(rsp)); + + rsp.status = BT_HCI_ERR_SUCCESS; + rsp.max_len = MAX_EXT_ADV_LEN; + cmd_complete(dev, BT_HCI_CMD_LE_READ_MAX_ADV_DATA_LEN, &rsp, + sizeof(rsp)); + + return 0; } static int cmd_read_num_adv_sets(struct btdev *dev, const void *data, -- 2.49.0