@@ -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,