2021-10-07 19:56:13

by Tedd Ho-Jeong An

[permalink] [raw]
Subject: [RFC BlueZ PATCH v10 3/4] emulator: Add support to get the advertising address

From: Tedd Ho-Jeong An <[email protected]>

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 | 10 ++++++++++
emulator/hciemu.h | 3 +++
4 files changed, 41 insertions(+), 5 deletions(-)

diff --git a/emulator/btdev.c b/emulator/btdev.c
index 2c199ed85..fd6d699c6 100644
--- a/emulator/btdev.c
+++ b/emulator/btdev.c
@@ -4648,6 +4648,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 {
@@ -4763,6 +4764,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;
}

@@ -4817,6 +4821,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)
@@ -4881,7 +4887,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;
}
@@ -5147,6 +5153,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));
@@ -5160,10 +5171,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));
@@ -6371,6 +6379,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));
diff --git a/emulator/btdev.h b/emulator/btdev.h
index cce49db3b..cd259cf9b 100644
--- a/emulator/btdev.h
+++ b/emulator/btdev.h
@@ -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);
diff --git a/emulator/hciemu.c b/emulator/hciemu.c
index d18b3469b..28d1aa0d1 100644
--- a/emulator/hciemu.c
+++ b/emulator/hciemu.c
@@ -597,6 +597,16 @@ void hciemu_set_central_le_rl_len(struct hciemu *hciemu, uint8_t len)
btdev_set_rl_len(hciemu->dev, len);
}

+const uint8_t *hciemu_get_central_adv_addr(struct hciemu *hciemu,
+ uint8_t handle)
+{
+ if (!hciemu || !hciemu->dev)
+ return NULL;
+
+
+ return btdev_get_adv_addr(hciemu->dev, handle);
+}
+
bool hciemu_add_central_post_command_hook(struct hciemu *hciemu,
hciemu_command_func_t function, void *user_data)
{
diff --git a/emulator/hciemu.h b/emulator/hciemu.h
index 73a90c1e6..71302d52f 100644
--- a/emulator/hciemu.h
+++ b/emulator/hciemu.h
@@ -64,6 +64,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);

--
2.25.1