@@ -4653,6 +4653,7 @@ static void send_ext_adv(struct btdev *btdev, const struct btdev *remote,
struct le_ext_adv *ext_adv,
uint16_t type, bool is_scan_rsp)
{
+
struct __packed {
uint8_t num_reports;
union {
@@ -4768,6 +4769,9 @@ static int cmd_set_ext_adv_enable(struct btdev *dev, const void *data,
/* Disable all advertising sets */
queue_foreach(dev->le_ext_adv, ext_adv_disable, NULL);
+
+ dev->le_adv_enable = 0x00;
+
goto exit_complete;
}
@@ -4822,6 +4826,8 @@ static int cmd_set_ext_adv_enable(struct btdev *dev, const void *data,
ext_adv->enable = cmd->enable;
+ dev->le_adv_enable = 0x01;
+
if (!cmd->enable)
ext_adv_disable(ext_adv, NULL);
else if (eas->duration)
@@ -4886,7 +4892,7 @@ static int cmd_remove_adv_set(struct btdev *dev, const void *data,
UINT_TO_PTR(cmd->handle));
if (!ext_adv) {
status = BT_HCI_ERR_UNKNOWN_ADVERTISING_ID;
- cmd_complete(dev, BT_HCI_CMD_LE_SET_EXT_ADV_DATA, &status,
+ cmd_complete(dev, BT_HCI_CMD_LE_REMOVE_ADV_SET, &status,
sizeof(status));
return 0;
}
@@ -5152,6 +5158,11 @@ static void le_ext_conn_complete(struct btdev *btdev,
ev.latency = lecc->latency;
ev.supv_timeout = lecc->supv_timeout;
+ /* Set Local RPA if an RPA was generated for the advertising */
+ if (ext_adv->rpa)
+ memcpy(ev.local_rpa, ext_adv->random_addr,
+ sizeof(ev.local_rpa));
+
le_meta_event(conn->link->dev,
BT_HCI_EVT_LE_ENHANCED_CONN_COMPLETE, &ev,
sizeof(ev));
@@ -5165,10 +5176,7 @@ static void le_ext_conn_complete(struct btdev *btdev,
memcpy(ev.peer_addr, cmd->peer_addr, 6);
ev.role = 0x00;
- /* Set Local RPA if an RPA was generated for the advertising */
- if (ext_adv->rpa)
- memcpy(ev.local_rpa, ext_adv->random_addr,
- sizeof(ev.local_rpa));
+ memset(ev.local_rpa, 0, sizeof(ev.local_rpa));
le_meta_event(btdev, BT_HCI_EVT_LE_ENHANCED_CONN_COMPLETE, &ev,
sizeof(ev));
@@ -6376,6 +6384,19 @@ uint8_t btdev_get_le_scan_enable(struct btdev *btdev)
return btdev->le_scan_enable;
}
+const uint8_t *btdev_get_adv_addr(struct btdev *btdev, uint8_t handle)
+{
+ struct le_ext_adv *ext_adv;
+
+ /* Check if Ext Adv is already existed */
+ ext_adv = queue_find(btdev->le_ext_adv, match_ext_adv_handle,
+ UINT_TO_PTR(handle));
+ if (!ext_adv)
+ return NULL;
+
+ return ext_adv_addr(btdev, ext_adv);
+}
+
void btdev_set_le_states(struct btdev *btdev, const uint8_t *le_states)
{
memcpy(btdev->le_states, le_states, sizeof(btdev->le_states));
@@ -78,6 +78,8 @@ uint8_t btdev_get_scan_enable(struct btdev *btdev);
uint8_t btdev_get_le_scan_enable(struct btdev *btdev);
+const uint8_t *btdev_get_adv_addr(struct btdev *btdev, uint8_t handle);
+
void btdev_set_le_states(struct btdev *btdev, const uint8_t *le_states);
void btdev_set_al_len(struct btdev *btdev, uint8_t len);
@@ -629,6 +629,21 @@ void hciemu_set_central_le_rl_len(struct hciemu *hciemu, uint8_t len)
btdev_set_rl_len(dev, len);
}
+const uint8_t *hciemu_get_central_adv_addr(struct hciemu *hciemu,
+ uint8_t handle)
+{
+ struct btdev *dev;
+
+ if (!hciemu || !hciemu->vhci)
+ return NULL;
+
+ dev = vhci_get_btdev(hciemu->vhci);
+ if (!dev)
+ return NULL;
+
+ return btdev_get_adv_addr(dev, handle);
+}
+
bool hciemu_add_central_post_command_hook(struct hciemu *hciemu,
hciemu_command_func_t function, void *user_data)
{
@@ -65,6 +65,9 @@ void hciemu_set_central_le_al_len(struct hciemu *hciemu, uint8_t len);
void hciemu_set_central_le_rl_len(struct hciemu *hciemu, uint8_t len);
+const uint8_t *hciemu_get_central_adv_addr(struct hciemu *hciemu,
+ uint8_t handle);
+
typedef void (*hciemu_command_func_t)(uint16_t opcode, const void *data,
uint8_t len, void *user_data);
From: Tedd Ho-Jeong An <tedd.an@intel.com> This patch add supprt emulator to get the advertising address of the central device. --- emulator/btdev.c | 31 ++++++++++++++++++++++++++----- emulator/btdev.h | 2 ++ emulator/hciemu.c | 15 +++++++++++++++ emulator/hciemu.h | 3 +++ 4 files changed, 46 insertions(+), 5 deletions(-)