diff --git a/emulator/btdev.c b/emulator/btdev.c
index a7fda2c..90b3d9f 100644
--- a/emulator/btdev.c
+++ b/emulator/btdev.c
return false;
}
+static struct btdev_rl *rl_find(struct btdev *dev, uint8_t type, uint8_t *addr)
+{
+ unsigned int i;
+
+ for (i = 0; i < ARRAY_SIZE(dev->le_rl); i++) {
+ struct btdev_rl *rl = &dev->le_rl[i];
+
+ if (RL_ADDR_EQUAL(rl, type, addr))
+ return rl;
+ }
+
+ return NULL;
+}
+
static int cmd_set_ext_adv_enable(struct btdev *dev, const void *data,
uint8_t len)
{
for (i = 0; i < cmd->num_of_sets; i++) {
const struct bt_hci_cmd_ext_adv_set *eas;
struct le_ext_adv *ext_adv;
+ bool random_addr;
eas = data + sizeof(*cmd) + (sizeof(*eas) * i);
goto exit_complete;
}
+ random_addr = bacmp((bdaddr_t *)ext_adv->random_addr,
+ BDADDR_ANY);
+
+ /* If the advertising set's Own_Address_Type parameter
+ * is set to 0x01 and the random address for
+ * the advertising set has not been initialized, the
+ * Controller shall return the error code Invalid HCI
+ * Command Parameters (0x12).
+ */
+ if (ext_adv->own_addr_type == 0x01 && !random_addr) {
+ status = BT_HCI_ERR_INVALID_PARAMETERS;
+ goto exit_complete;
+ }
+
+ /* If the advertising set's Own_Address_Type parameter is set
+ * to 0x03, the controller's resolving list did not contain a
+ * matching entry, and the random address for the advertising
+ * set has not been initialized, the Controller shall return the
+ * error code Invalid HCI Command Parameters (0x12).
+ */
+ if (ext_adv->own_addr_type == 0x03 && !random_addr) {
+ if (!dev->le_rl_enable ||
+ !rl_find(dev, ext_adv->direct_addr_type,
+ ext_adv->direct_addr)) {
+ status = BT_HCI_ERR_INVALID_PARAMETERS;
+ goto exit_complete;
+ }
+ }
+
ext_adv->enable = cmd->enable;
if (!cmd->enable)