2021-07-20 02:56:08

by Tedd Ho-Jeong An

[permalink] [raw]
Subject: [BlueZ PATCH v8 1/2] emulator: Add support to config the white and resolve list

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

This patch adds interfaces to config the white list and resolve list in
the btdev.
---
emulator/btdev.c | 41 +++++++++++++++++++++++++++++++----------
emulator/btdev.h | 4 ++++
emulator/hciemu.c | 16 ++++++++++++++++
emulator/hciemu.h | 4 ++++
4 files changed, 55 insertions(+), 10 deletions(-)

diff --git a/emulator/btdev.c b/emulator/btdev.c
index c9ec22ebe..5041a68e6 100644
--- a/emulator/btdev.c
+++ b/emulator/btdev.c
@@ -33,8 +33,8 @@
#include "monitor/bt.h"
#include "btdev.h"

-#define WL_SIZE 16
-#define RL_SIZE 16
+#define WL_SIZE 3
+#define RL_SIZE 4
#define CIS_SIZE 3

#define has_bredr(btdev) (!((btdev)->features[4] & 0x20))
@@ -190,6 +190,10 @@ struct btdev {
} __attribute__ ((packed)) le_cig;
uint8_t le_iso_path[2];

+ /* Real time length of WL array */
+ uint8_t le_wl_len;
+ /* Real time length of RL array */
+ uint8_t le_rl_len;
struct btdev_wl le_wl[WL_SIZE];
struct btdev_rl le_rl[RL_SIZE];
uint8_t le_rl_enable;
@@ -456,6 +460,18 @@ static void rl_clear(struct btdev *dev)
rl_reset(&dev->le_rl[i]);
}

+/* Set the real time length of WL array */
+void btdev_set_wl_len(struct btdev *btdev, uint8_t len)
+{
+ btdev->le_wl_len = len;
+}
+
+/* Set the real time length of RL array */
+void btdev_set_rl_len(struct btdev *btdev, uint8_t len)
+{
+ btdev->le_rl_len = len;
+}
+
static void btdev_reset(struct btdev *btdev)
{
/* FIXME: include here clearing of all states that should be
@@ -467,6 +483,9 @@ static void btdev_reset(struct btdev *btdev)

wl_clear(btdev);
rl_clear(btdev);
+
+ btdev->le_wl_len = WL_SIZE;
+ btdev->le_rl_len = RL_SIZE;
}

static int cmd_reset(struct btdev *dev, const void *data, uint8_t len)
@@ -3495,7 +3514,7 @@ static int cmd_read_wl_size(struct btdev *dev, const void *data, uint8_t len)
struct bt_hci_rsp_le_read_white_list_size rsp;

rsp.status = BT_HCI_ERR_SUCCESS;
- rsp.size = WL_SIZE;
+ rsp.size = dev->le_wl_len;
cmd_complete(dev, BT_HCI_CMD_LE_READ_WHITE_LIST_SIZE, &rsp,
sizeof(rsp));

@@ -3582,7 +3601,7 @@ static int cmd_add_wl(struct btdev *dev, const void *data, uint8_t len)
if (cmd->addr_type > 0x01)
return -EINVAL;

- for (i = 0; i < WL_SIZE; i++) {
+ for (i = 0; i < dev->le_wl_len; i++) {
struct btdev_wl *wl = &dev->le_wl[i];

if (WL_ADDR_EQUAL(wl, cmd->addr_type, &cmd->addr)) {
@@ -3633,7 +3652,7 @@ static int cmd_remove_wl(struct btdev *dev, const void *data, uint8_t len)
if (cmd->addr_type > 0x01)
return -EINVAL;

- for (i = 0; i < WL_SIZE; i++) {
+ for (i = 0; i < dev->le_wl_len; i++) {
struct btdev_wl *wl = &dev->le_wl[i];

ba2str(&wl->addr, addr);
@@ -3648,7 +3667,7 @@ static int cmd_remove_wl(struct btdev *dev, const void *data, uint8_t len)
}
}

- if (i == WL_SIZE)
+ if (i == dev->le_wl_len)
return -EINVAL;

status = BT_HCI_ERR_SUCCESS;
@@ -3679,7 +3698,7 @@ static int cmd_add_rl(struct btdev *dev, const void *data, uint8_t len)
if (cmd->addr_type > 0x01)
return -EINVAL;

- for (i = 0; i < RL_SIZE; i++) {
+ for (i = 0; i < dev->le_rl_len; i++) {
struct btdev_rl *rl = &dev->le_rl[i];

if (RL_ADDR_EQUAL(rl, cmd->addr_type, &cmd->addr)) {
@@ -3730,7 +3749,7 @@ static int cmd_remove_rl(struct btdev *dev, const void *data, uint8_t len)
if (cmd->addr_type > 0x01)
return -EINVAL;

- for (i = 0; i < RL_SIZE; i++) {
+ for (i = 0; i < dev->le_rl_len; i++) {
struct btdev_rl *rl = &dev->le_rl[i];

if (RL_ADDR_EQUAL(rl, cmd->addr_type, &cmd->addr)) {
@@ -3739,7 +3758,7 @@ static int cmd_remove_rl(struct btdev *dev, const void *data, uint8_t len)
}
}

- if (i == RL_SIZE)
+ if (i == dev->le_rl_len)
return -EINVAL;

status = BT_HCI_ERR_SUCCESS;
@@ -3777,7 +3796,7 @@ static int cmd_read_rl_size(struct btdev *dev, const void *data, uint8_t len)
struct bt_hci_rsp_le_read_resolv_list_size rsp;

rsp.status = BT_HCI_ERR_SUCCESS;
- rsp.size = RL_SIZE;
+ rsp.size = dev->le_rl_len;

cmd_complete(dev, BT_HCI_CMD_LE_READ_RESOLV_LIST_SIZE,
&rsp, sizeof(rsp));
@@ -6166,6 +6185,8 @@ struct btdev *btdev_create(enum btdev_type type, uint16_t id)
btdev->conns = queue_new();
btdev->le_ext_adv = queue_new();

+ btdev->le_wl_len = WL_SIZE;
+ btdev->le_rl_len = RL_SIZE;
return btdev;
}

diff --git a/emulator/btdev.h b/emulator/btdev.h
index f7cba149a..b427a3a66 100644
--- a/emulator/btdev.h
+++ b/emulator/btdev.h
@@ -80,6 +80,10 @@ uint8_t btdev_get_le_scan_enable(struct btdev *btdev);

void btdev_set_le_states(struct btdev *btdev, const uint8_t *le_states);

+void btdev_set_wl_len(struct btdev *btdev, uint8_t len);
+
+void btdev_set_rl_len(struct btdev *btdev, uint8_t len);
+
void btdev_set_command_handler(struct btdev *btdev, btdev_command_func handler,
void *user_data);

diff --git a/emulator/hciemu.c b/emulator/hciemu.c
index a3ec44243..b8d85bb23 100644
--- a/emulator/hciemu.c
+++ b/emulator/hciemu.c
@@ -580,6 +580,22 @@ void hciemu_set_master_le_states(struct hciemu *hciemu, const uint8_t *le_states
btdev_set_le_states(hciemu->dev, le_states);
}

+void hciemu_set_master_le_wl_len(struct hciemu *hciemu, uint8_t len)
+{
+ if (!hciemu || !hciemu->dev)
+ return;
+
+ btdev_set_wl_len(hciemu->dev, len);
+}
+
+void hciemu_set_master_le_rl_len(struct hciemu *hciemu, uint8_t len)
+{
+ if (!hciemu || !hciemu->dev)
+ return;
+
+ btdev_set_rl_len(hciemu->dev, len);
+}
+
bool hciemu_add_master_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 8bf2d070e..4a89b8d59 100644
--- a/emulator/hciemu.h
+++ b/emulator/hciemu.h
@@ -60,6 +60,10 @@ uint8_t hciemu_get_master_le_scan_enable(struct hciemu *hciemu);
void hciemu_set_master_le_states(struct hciemu *hciemu,
const uint8_t *le_states);

+void hciemu_set_master_le_wl_len(struct hciemu *hciemu, uint8_t len);
+
+void hciemu_set_master_le_rl_len(struct hciemu *hciemu, uint8_t len);
+
typedef void (*hciemu_command_func_t)(uint16_t opcode, const void *data,
uint8_t len, void *user_data);

--
2.26.3