* [BlueZ PATCH 1/5] tools/mgmt-tester: Enable High-Speed(HS) test cases
@ 2021-06-22 1:01 Tedd Ho-Jeong An
2021-06-22 1:01 ` [BlueZ PATCH 2/5] monitor: Add Unknown Advertising ID error code Tedd Ho-Jeong An
` (4 more replies)
0 siblings, 5 replies; 6+ messages in thread
From: Tedd Ho-Jeong An @ 2021-06-22 1:01 UTC (permalink / raw)
To: linux-bluetooth
From: Tedd Ho-Jeong An <tedd.an@intel.com>
This patch enables the BT High-Speed(HS) test cases by enabling the HS
in the kernel config.
---
doc/tester.config | 1 +
tools/mgmt-tester.c | 10 +++++-----
2 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/doc/tester.config b/doc/tester.config
index 661d7a0b0..850fb6a38 100644
--- a/doc/tester.config
+++ b/doc/tester.config
@@ -29,6 +29,7 @@ CONFIG_BT_RFCOMM=y
CONFIG_BT_BNEP=y
CONFIG_BT_HIDP=y
CONFIG_BT_LE=y
+CONFIG_BT_HS=y
CONFIG_BT_HCIVHCI=y
diff --git a/tools/mgmt-tester.c b/tools/mgmt-tester.c
index fcce699d3..8cae376f4 100644
--- a/tools/mgmt-tester.c
+++ b/tools/mgmt-tester.c
@@ -5315,7 +5315,7 @@ static const char ext_ctrl_info1[] = {
0x00, 0x00, 0x00, 0x01, 0xaa, 0x00, /* btaddr */
0x09, /* version */
0x3f, 0x00, /* manufacturer */
- 0xff, 0xbe, 0x01, 0x00, /* supported settings */
+ 0xff, 0xbf, 0x01, 0x00, /* supported settings */
0x80, 0x00, 0x00, 0x00, /* current settings */
0x09, 0x00, /* eir length */
0x04, /* dev class length */
@@ -5360,7 +5360,7 @@ static const char ext_ctrl_info2[] = {
0x00, 0x00, 0x00, 0x01, 0xaa, 0x00, /* btaddr */
0x09, /* version */
0x3f, 0x00, /* manufacturer */
- 0xff, 0xbe, 0x01, 0x00, /* supported settings */
+ 0xff, 0xbf, 0x01, 0x00, /* supported settings */
0x81, 0x02, 0x00, 0x00, /* current settings */
0x0D, 0x00, /* eir length */
0x04, /* dev class length */
@@ -5391,7 +5391,7 @@ static const char ext_ctrl_info3[] = {
0x00, 0x00, 0x00, 0x01, 0xaa, 0x00, /* btaddr */
0x09, /* version */
0x3f, 0x00, /* manufacturer */
- 0xff, 0xbe, 0x01, 0x00, /* supported settings */
+ 0xff, 0xbf, 0x01, 0x00, /* supported settings */
0x80, 0x02, 0x00, 0x00, /* current settings */
0x16, 0x00, /* eir length */
0x04, /* dev class length */
@@ -5426,7 +5426,7 @@ static const char ext_ctrl_info4[] = {
0x00, 0x00, 0x00, 0x01, 0xaa, 0x00, /* btaddr */
0x09, /* version */
0x3f, 0x00, /* manufacturer */
- 0xff, 0xbe, 0x01, 0x00, /* supported settings */
+ 0xff, 0xbf, 0x01, 0x00, /* supported settings */
0x80, 0x02, 0x00, 0x00, /* current settings */
0x1a, 0x00, /* eir length */
0x04, /* dev class length */
@@ -5485,7 +5485,7 @@ static const char ext_ctrl_info5[] = {
0x00, 0x00, 0x00, 0x01, 0xaa, 0x00, /* btaddr */
0x09, /* version */
0x3f, 0x00, /* manufacturer */
- 0xff, 0xbe, 0x01, 0x00, /* supported settings */
+ 0xff, 0xbf, 0x01, 0x00, /* supported settings */
0x81, 0x02, 0x00, 0x00, /* current settings */
0x1a, 0x00, /* eir len */
0x04, /* dev class len */
--
2.26.3
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [BlueZ PATCH 2/5] monitor: Add Unknown Advertising ID error code
2021-06-22 1:01 [BlueZ PATCH 1/5] tools/mgmt-tester: Enable High-Speed(HS) test cases Tedd Ho-Jeong An
@ 2021-06-22 1:01 ` Tedd Ho-Jeong An
2021-06-22 1:01 ` [BlueZ PATCH 3/5] emulator/btdev: Add support multiple instance of extended advertising Tedd Ho-Jeong An
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Tedd Ho-Jeong An @ 2021-06-22 1:01 UTC (permalink / raw)
To: linux-bluetooth
From: Tedd Ho-Jeong An <tedd.an@intel.com>
This patch adds Unknown Advertising ID error code (0x42)
---
monitor/bt.h | 1 +
1 file changed, 1 insertion(+)
diff --git a/monitor/bt.h b/monitor/bt.h
index ac4f976fc..d60bbdb20 100644
--- a/monitor/bt.h
+++ b/monitor/bt.h
@@ -3657,6 +3657,7 @@ struct bt_hci_evt_le_req_peer_sca_complete {
#define BT_HCI_ERR_INVALID_PARAMETERS 0x12
#define BT_HCI_ERR_UNSPECIFIED_ERROR 0x1f
#define BT_HCI_ERR_CONN_FAILED_TO_ESTABLISH 0x3e
+#define BT_HCI_ERR_UNKNOWN_ADVERTISING_ID 0x42
struct bt_l2cap_hdr {
uint16_t len;
--
2.26.3
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [BlueZ PATCH 3/5] emulator/btdev: Add support multiple instance of extended advertising
2021-06-22 1:01 [BlueZ PATCH 1/5] tools/mgmt-tester: Enable High-Speed(HS) test cases Tedd Ho-Jeong An
2021-06-22 1:01 ` [BlueZ PATCH 2/5] monitor: Add Unknown Advertising ID error code Tedd Ho-Jeong An
@ 2021-06-22 1:01 ` Tedd Ho-Jeong An
2021-06-22 1:01 ` [BlueZ PATCH 4/5] emulator/bthost: Create ext adv params before setting adv data Tedd Ho-Jeong An
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Tedd Ho-Jeong An @ 2021-06-22 1:01 UTC (permalink / raw)
To: linux-bluetooth
From: Tedd Ho-Jeong An <tedd.an@intel.com>
This patch adds support multiple instance of extended advertising.
---
emulator/btdev.c | 417 ++++++++++++++++++++++++++++++++++++-----------
1 file changed, 321 insertions(+), 96 deletions(-)
diff --git a/emulator/btdev.c b/emulator/btdev.c
index eba9f57f9..dc9603b79 100644
--- a/emulator/btdev.c
+++ b/emulator/btdev.c
@@ -52,6 +52,7 @@ struct hook {
};
#define MAX_HOOK_ENTRIES 16
+#define MAX_EXT_ADV_SETS 3
struct btdev_conn {
uint16_t handle;
@@ -72,6 +73,21 @@ struct btdev_rl {
uint8_t local_irk[16];
};
+struct le_ext_adv {
+ uint8_t handle;
+ uint8_t enable;
+ uint8_t type; /* evt_properties */
+ uint8_t own_addr_type; /* own_addr_type */
+ uint8_t direct_addr_type; /* peer_addr_type */
+ uint8_t direct_addr[6]; /* peer_addr */
+ uint8_t filter_policy; /* filter_policy */
+ uint8_t random_addr[6];
+ uint8_t adv_data[252];
+ uint8_t adv_data_len;
+ uint8_t scan_data[252];
+ uint8_t scan_data_len;
+};
+
struct btdev {
enum btdev_type type;
@@ -185,6 +201,8 @@ struct btdev {
uint16_t le_ext_adv_type;
+ struct queue *le_ext_adv;
+
btdev_debug_func_t debug_callback;
btdev_destroy_func_t debug_destroy;
void *debug_data;
@@ -1010,8 +1028,9 @@ static struct btdev_conn *conn_link(struct btdev *dev, struct btdev *remote,
conn2->link = conn1;
util_debug(dev->debug_callback, dev->debug_data,
- "conn1 %p handle 0x%04x conn2 %p handle 0x%04x",
- conn1, conn1->handle, conn2, conn2->handle);
+ "conn1 %p handle 0x%04x", conn1, conn1->handle);
+ util_debug(dev->debug_callback, dev->debug_data,
+ "conn2 %p handle 0x%04x", conn2, conn2->handle);
return conn1;
}
@@ -3083,18 +3102,6 @@ static const uint8_t *scan_addr(const struct btdev *btdev)
return btdev->bdaddr;
}
-static bool ext_adv_match(struct btdev *scan, struct btdev *adv)
-{
- /* Match everything if this is not directed advertising */
- if (!(adv->le_ext_adv_type & 0x04))
- return true;
-
- if (scan->le_scan_own_addr_type != adv->le_adv_direct_addr_type)
- return false;
-
- return !memcmp(scan_addr(scan), adv->le_adv_direct_addr, 6);
-}
-
static const uint8_t *adv_addr(const struct btdev *btdev)
{
if (btdev->le_adv_own_addr == 0x01)
@@ -4192,13 +4199,103 @@ static int cmd_set_default_phy(struct btdev *dev, const void *data,
return 0;
}
+static const uint8_t *ext_adv_addr(const struct btdev *btdev,
+ struct le_ext_adv *ext_adv)
+{
+ if (ext_adv->own_addr_type == 0x01)
+ return ext_adv->random_addr;
+
+ return btdev->bdaddr;
+}
+
+static bool ext_adv_match_addr(const struct btdev *btdev,
+ struct le_ext_adv *ext_adv)
+{
+ /* Match everything if this is not directed advertising */
+ if (!(ext_adv->type & 0x04))
+ return true;
+
+ if (btdev->le_scan_own_addr_type != ext_adv->direct_addr_type)
+ return false;
+
+ return !memcmp(scan_addr(btdev), ext_adv->direct_addr, 6);
+}
+
+static bool match_ext_adv_handle(const void *data, const void *match_data)
+{
+ const struct le_ext_adv *ext_adv = data;
+ uint8_t handle = PTR_TO_UINT(match_data);
+
+ return ext_adv->handle == handle;
+}
+
+static void ext_adv_disable(void *data, void *user_data)
+{
+ struct le_ext_adv *ext_adv = data;
+ uint8_t handle = PTR_TO_UINT(user_data);
+
+ if (handle && ext_adv->handle != handle)
+ return;
+
+ ext_adv->enable = 0x00;
+}
+
+static bool ext_adv_is_connectable(struct le_ext_adv *ext_adv)
+{
+ if (!ext_adv->enable)
+ return false;
+
+ return ext_adv->type & 0x01;
+}
+
+static struct le_ext_adv *le_ext_adv_new(struct btdev *btdev, uint8_t handle)
+{
+ struct le_ext_adv *ext_adv;
+
+ ext_adv = new0(struct le_ext_adv, 1);
+ ext_adv->handle = handle;
+
+ /* Add to queue */
+ if (!queue_push_tail(btdev->le_ext_adv, ext_adv)) {
+ free(ext_adv);
+ return NULL;
+ }
+
+ return ext_adv;
+}
+
+static void le_ext_adv_free(void *data)
+{
+ struct le_ext_adv *ext_adv = data;
+
+ free(ext_adv);
+}
+
static int cmd_set_adv_rand_addr(struct btdev *dev, const void *data,
uint8_t len)
{
const struct bt_hci_cmd_le_set_adv_set_rand_addr *cmd = data;
+ struct le_ext_adv *ext_adv;
uint8_t status = BT_HCI_ERR_SUCCESS;
- memcpy(dev->random_addr, cmd->bdaddr, 6);
+ /* Check if Ext Adv is already existed */
+ ext_adv = queue_find(dev->le_ext_adv, match_ext_adv_handle,
+ UINT_TO_PTR(cmd->handle));
+ if (!ext_adv) {
+ status = BT_HCI_ERR_UNKNOWN_ADVERTISING_ID;
+ cmd_complete(dev, BT_HCI_CMD_LE_SET_ADV_SET_RAND_ADDR, &status,
+ sizeof(status));
+ return 0;
+ }
+
+ if (ext_adv_is_connectable(ext_adv)) {
+ status = BT_HCI_ERR_COMMAND_DISALLOWED;
+ cmd_complete(dev, BT_HCI_CMD_LE_SET_ADV_SET_RAND_ADDR, &status,
+ sizeof(status));
+ return 0;
+ }
+
+ memcpy(ext_adv->random_addr, cmd->bdaddr, 6);
cmd_complete(dev, BT_HCI_CMD_LE_SET_ADV_SET_RAND_ADDR, &status,
sizeof(status));
@@ -4210,20 +4307,43 @@ static int cmd_set_ext_adv_params(struct btdev *dev, const void *data,
{
const struct bt_hci_cmd_le_set_ext_adv_params *cmd = data;
struct bt_hci_rsp_le_set_ext_adv_params rsp;
+ struct le_ext_adv *ext_adv;
uint8_t status;
- if (dev->le_adv_enable) {
+ /* Check if Ext Adv is already existed */
+ ext_adv = queue_find(dev->le_ext_adv, match_ext_adv_handle,
+ UINT_TO_PTR(cmd->handle));
+ if (!ext_adv) {
+ /* No more than maximum number */
+ if (queue_length(dev->le_ext_adv) >= MAX_EXT_ADV_SETS) {
+ status = BT_HCI_ERR_MEM_CAPACITY_EXCEEDED;
+ cmd_complete(dev, BT_HCI_CMD_LE_SET_EXT_ADV_PARAMS,
+ &status, sizeof(status));
+ return 0;
+ }
+
+ /* Create new set */
+ ext_adv = le_ext_adv_new(dev, cmd->handle);
+ if (!ext_adv) {
+ status = BT_HCI_ERR_MEM_CAPACITY_EXCEEDED;
+ cmd_complete(dev, BT_HCI_CMD_LE_SET_EXT_ADV_PARAMS,
+ &status, sizeof(status));
+ return 0;
+ }
+ }
+
+ if (ext_adv->enable) {
status = BT_HCI_ERR_COMMAND_DISALLOWED;
cmd_complete(dev, BT_HCI_CMD_LE_SET_EXT_ADV_PARAMS, &status,
sizeof(status));
return 0;
}
- dev->le_ext_adv_type = le16_to_cpu(cmd->evt_properties);
- dev->le_adv_own_addr = cmd->own_addr_type;
- dev->le_adv_direct_addr_type = cmd->peer_addr_type;
- memcpy(dev->le_adv_direct_addr, cmd->peer_addr, 6);
- dev->le_adv_filter_policy = cmd->filter_policy;
+ ext_adv->type = le16_to_cpu(cmd->evt_properties);
+ ext_adv->own_addr_type = cmd->own_addr_type;
+ ext_adv->direct_addr_type = cmd->peer_addr_type;
+ memcpy(ext_adv->direct_addr, cmd->peer_addr, 6);
+ ext_adv->filter_policy = cmd->filter_policy;
rsp.status = BT_HCI_ERR_SUCCESS;
rsp.tx_power = 0;
@@ -4236,10 +4356,20 @@ static int cmd_set_ext_adv_data(struct btdev *dev, const void *data,
uint8_t len)
{
const struct bt_hci_cmd_le_set_ext_adv_data *cmd = data;
+ struct le_ext_adv *ext_adv;
uint8_t status = BT_HCI_ERR_SUCCESS;
- dev->le_adv_data_len = cmd->data_len;
- memcpy(dev->le_adv_data, cmd->data, 31);
+ ext_adv = queue_find(dev->le_ext_adv, match_ext_adv_handle,
+ 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,
+ sizeof(status));
+ return 0;
+ }
+
+ ext_adv->adv_data_len = cmd->data_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));
@@ -4250,10 +4380,20 @@ static int cmd_set_ext_scan_rsp_data(struct btdev *dev, const void *data,
uint8_t len)
{
const struct bt_hci_cmd_le_set_ext_scan_rsp_data *cmd = data;
+ struct le_ext_adv *ext_adv;
uint8_t status = BT_HCI_ERR_SUCCESS;
- dev->le_scan_data_len = cmd->data_len;
- memcpy(dev->le_scan_data, cmd->data, 31);
+ ext_adv = queue_find(dev->le_ext_adv, match_ext_adv_handle,
+ 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,
+ sizeof(status));
+ return 0;
+ }
+
+ ext_adv->scan_data_len = cmd->data_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));
@@ -4261,6 +4401,7 @@ static int cmd_set_ext_scan_rsp_data(struct btdev *dev, const void *data,
}
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 {
@@ -4274,8 +4415,8 @@ static void send_ext_adv(struct btdev *btdev, const struct btdev *remote,
memset(&meta_event.lear, 0, sizeof(meta_event.lear));
meta_event.num_reports = 1;
meta_event.lear.event_type = cpu_to_le16(type);
- meta_event.lear.addr_type = remote->le_adv_own_addr;
- memcpy(meta_event.lear.addr, adv_addr(remote), 6);
+ meta_event.lear.addr_type = ext_adv->own_addr_type;
+ memcpy(meta_event.lear.addr, ext_adv_addr(remote, ext_adv), 6);
meta_event.lear.rssi = 127;
meta_event.lear.tx_power = 127;
/* Right now we dont care about phy in adv report */
@@ -4284,12 +4425,12 @@ static void send_ext_adv(struct btdev *btdev, const struct btdev *remote,
/* Scan or advertising response */
if (is_scan_rsp) {
- meta_event.lear.data_len = remote->le_scan_data_len;
- memcpy(meta_event.lear.data, remote->le_scan_data,
+ meta_event.lear.data_len = ext_adv->scan_data_len;
+ memcpy(meta_event.lear.data, ext_adv->scan_data,
meta_event.lear.data_len);
} else {
- meta_event.lear.data_len = remote->le_adv_data_len;
- memcpy(meta_event.lear.data, remote->le_adv_data,
+ meta_event.lear.data_len = ext_adv->adv_data_len;
+ memcpy(meta_event.lear.data, ext_adv->adv_data,
meta_event.lear.data_len);
}
@@ -4297,12 +4438,13 @@ static void send_ext_adv(struct btdev *btdev, const struct btdev *remote,
1 + 24 + meta_event.lear.data_len);
}
-static void le_set_ext_adv_enable_complete(struct btdev *btdev)
+static void le_set_ext_adv_enable_complete(struct btdev *btdev,
+ struct le_ext_adv *ext_adv)
{
uint16_t report_type;
int i;
- report_type = get_ext_adv_type(btdev->le_ext_adv_type);
+ report_type = get_ext_adv_type(ext_adv->type);
for (i = 0; i < MAX_BTDEV_ENTRIES; i++) {
if (!btdev_list[i] || btdev_list[i] == btdev)
@@ -4311,26 +4453,27 @@ static void le_set_ext_adv_enable_complete(struct btdev *btdev)
if (!btdev_list[i]->le_scan_enable)
continue;
- if (!ext_adv_match(btdev_list[i], btdev))
+ if (!ext_adv_match_addr(btdev_list[i], ext_adv))
continue;
- send_ext_adv(btdev_list[i], btdev, report_type, false);
+ send_ext_adv(btdev_list[i], btdev, ext_adv, report_type, false);
if (btdev_list[i]->le_scan_type != 0x01)
continue;
/* if scannable bit is set the send scan response */
- if (btdev->le_ext_adv_type & 0x02) {
- if (btdev->le_ext_adv_type == 0x13)
+ if (ext_adv->type & 0x02) {
+ if (ext_adv->type == 0x13)
report_type = 0x1b;
- else if (btdev->le_ext_adv_type == 0x12)
+ else if (ext_adv->type == 0x12)
report_type = 0x1a;
- else if (!(btdev->le_ext_adv_type & 0x10))
+ else if (!(ext_adv->type & 0x10))
report_type &= 0x08;
else
continue;
- send_ext_adv(btdev_list[i], btdev, report_type, true);
+ send_ext_adv(btdev_list[i], btdev, ext_adv,
+ report_type, true);
}
}
}
@@ -4339,31 +4482,62 @@ static int cmd_set_ext_adv_enable(struct btdev *dev, const void *data,
uint8_t len)
{
const struct bt_hci_cmd_le_set_ext_adv_enable *cmd = data;
- uint8_t status;
+ uint8_t status = BT_HCI_ERR_SUCCESS;
+ int i;
- if (dev->le_adv_enable == cmd->enable)
- status = BT_HCI_ERR_COMMAND_DISALLOWED;
- else {
+ /* Num of set is zero */
+ if (!cmd->num_of_sets) {
+ if (cmd->enable) {
+ status = BT_HCI_ERR_INVALID_PARAMETERS;
+ goto exit_complete;
+ }
+
+ /* Disable all advertising sets */
+ queue_foreach(dev->le_ext_adv, ext_adv_disable, NULL);
+ goto exit_complete;
+ }
+
+ /* Process each sets */
+ for (i = 0; i < cmd->num_of_sets; i++) {
const struct bt_hci_cmd_ext_adv_set *eas;
+ struct le_ext_adv *ext_adv;
- if (cmd->num_of_sets) {
- eas = data + sizeof(*cmd);
- if (eas->duration || cmd->num_of_sets > 1)
- status = BT_HCI_ERR_INVALID_PARAMETERS;
- else
- status = BT_HCI_ERR_SUCCESS;
- } else
- status = BT_HCI_ERR_SUCCESS;
+ eas = data + sizeof(*cmd) + (sizeof(*eas) * i);
+
+ ext_adv = queue_find(dev->le_ext_adv, match_ext_adv_handle,
+ UINT_TO_PTR(eas->handle));
+ if (!ext_adv) {
+ status = BT_HCI_ERR_UNKNOWN_ADVERTISING_ID;
+ goto exit_complete;
+ }
+
+ if (ext_adv->enable == cmd->enable) {
+ status = BT_HCI_ERR_COMMAND_DISALLOWED;
+ goto exit_complete;
+ }
- if (status == BT_HCI_ERR_SUCCESS)
- dev->le_adv_enable = cmd->enable;
+ ext_adv->enable = cmd->enable;
}
+exit_complete:
cmd_complete(dev, BT_HCI_CMD_LE_SET_EXT_ADV_ENABLE, &status,
sizeof(status));
- if (status == BT_HCI_ERR_SUCCESS && dev->le_adv_enable)
- le_set_ext_adv_enable_complete(dev);
+ if (status == BT_HCI_ERR_SUCCESS && cmd->enable) {
+ /* Go through each sets and send adv event to peer device */
+ for (i = 0; i < cmd->num_of_sets; i++) {
+ const struct bt_hci_cmd_ext_adv_set *eas;
+ struct le_ext_adv *ext_adv;
+
+ eas = data + sizeof(*cmd) + (sizeof(*eas) * i);
+
+ ext_adv = queue_find(dev->le_ext_adv,
+ match_ext_adv_handle,
+ UINT_TO_PTR(eas->handle));
+ if (ext_adv)
+ le_set_ext_adv_enable_complete(dev, ext_adv);
+ }
+ }
return 0;
}
@@ -4383,8 +4557,7 @@ static int cmd_read_num_adv_sets(struct btdev *dev, const void *data,
memset(&rsp, 0, sizeof(rsp));
rsp.status = BT_HCI_ERR_SUCCESS;
- /* Support one set as of now */
- rsp.num_of_sets = 1;
+ rsp.num_of_sets = MAX_EXT_ADV_SETS;
cmd_complete(dev, BT_HCI_CMD_LE_READ_NUM_SUPPORTED_ADV_SETS, &rsp,
sizeof(rsp));
@@ -4394,8 +4567,29 @@ static int cmd_read_num_adv_sets(struct btdev *dev, const void *data,
static int cmd_remove_adv_set(struct btdev *dev, const void *data,
uint8_t len)
{
+ const struct bt_hci_cmd_le_remove_adv_set *cmd = data;
+ struct le_ext_adv *ext_adv;
uint8_t status = BT_HCI_ERR_SUCCESS;
+ ext_adv = queue_find(dev->le_ext_adv, match_ext_adv_handle,
+ 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,
+ sizeof(status));
+ return 0;
+ }
+
+ if (ext_adv->enable) {
+ status = BT_HCI_ERR_COMMAND_DISALLOWED;
+ cmd_complete(dev, BT_HCI_CMD_LE_REMOVE_ADV_SET, &status,
+ sizeof(status));
+ return 0;
+ }
+
+ queue_remove(dev->le_ext_adv, ext_adv);
+ free(ext_adv);
+
cmd_complete(dev, BT_HCI_CMD_LE_REMOVE_ADV_SET, &status,
sizeof(status));
@@ -4405,8 +4599,23 @@ static int cmd_remove_adv_set(struct btdev *dev, const void *data,
static int cmd_clear_adv_sets(struct btdev *dev, const void *data,
uint8_t len)
{
+ const struct queue_entry *entry;
uint8_t status = BT_HCI_ERR_SUCCESS;
+ for (entry = queue_get_entries(dev->le_ext_adv); entry;
+ entry = entry->next) {
+ struct le_ext_adv *ext_adv = entry->data;
+
+ if (ext_adv->enable) {
+ status = BT_HCI_ERR_COMMAND_DISALLOWED;
+ cmd_complete(dev, BT_HCI_CMD_LE_CLEAR_ADV_SETS, &status,
+ sizeof(status));
+ return 0;
+ }
+ }
+
+ queue_remove_all(dev->le_ext_adv, NULL, NULL, le_ext_adv_free);
+
cmd_complete(dev, BT_HCI_CMD_LE_CLEAR_ADV_SETS, &status,
sizeof(status));
@@ -4513,68 +4722,72 @@ static int cmd_set_ext_scan_enable(struct btdev *dev, const void *data,
return 0;
}
-static int cmd_set_ext_scan_enable_complete(struct btdev *dev, const void *data,
- uint8_t len)
+static void scan_ext_adv(struct btdev *dev, struct btdev *remote)
{
- const struct bt_hci_cmd_le_set_ext_scan_enable *cmd = data;
- int i;
-
- if (!dev->le_scan_enable || !cmd->enable)
- return 0;
+ const struct queue_entry *entry;
- for (i = 0; i < MAX_BTDEV_ENTRIES; i++) {
+ for (entry = queue_get_entries(remote->le_ext_adv); entry;
+ entry = entry->next) {
+ struct le_ext_adv *ext_adv = entry->data;
uint16_t report_type;
- if (!btdev_list[i] || btdev_list[i] == dev)
+ if (!ext_adv->enable)
continue;
- if (!btdev_list[i]->le_adv_enable)
+ if (!ext_adv_match_addr(dev, ext_adv))
continue;
- if (!ext_adv_match(dev, btdev_list[i]))
- continue;
-
- report_type = get_ext_adv_type(btdev_list[i]->le_ext_adv_type);
- send_ext_adv(dev, btdev_list[i], report_type, false);
+ report_type = get_ext_adv_type(ext_adv->type);
+ send_ext_adv(dev, remote, ext_adv, report_type, false);
if (dev->le_scan_type != 0x01)
continue;
/* if scannable bit is set the send scan response */
- if (btdev_list[i]->le_ext_adv_type & 0x02) {
- if (btdev_list[i]->le_ext_adv_type == 0x13)
+ if (ext_adv->type & 0x02) {
+ if (ext_adv->type == 0x13)
report_type = 0x1b;
- else if (btdev_list[i]->le_ext_adv_type == 0x12)
+ else if (ext_adv->type == 0x12)
report_type = 0x1a;
- else if (!(btdev_list[i]->le_ext_adv_type & 0x10))
+ else if (!(ext_adv->type & 0x10))
report_type &= 0x08;
else
continue;
- send_ext_adv(dev, btdev_list[i], report_type, true);
+ send_ext_adv(dev, remote, ext_adv, report_type, true);
}
}
-
- return 0;
}
-static int cmd_ext_create_conn(struct btdev *dev, const void *data, uint8_t len)
+static int cmd_set_ext_scan_enable_complete(struct btdev *dev, const void *data,
+ uint8_t len)
{
- cmd_status(dev, BT_HCI_ERR_SUCCESS, BT_HCI_CMD_LE_EXT_CREATE_CONN);
+ const struct bt_hci_cmd_le_set_ext_scan_enable *cmd = data;
+ int i;
+
+ if (!dev->le_scan_enable || !cmd->enable)
+ return 0;
+
+ for (i = 0; i < MAX_BTDEV_ENTRIES; i++) {
+ if (!btdev_list[i] || btdev_list[i] == dev)
+ continue;
+
+ scan_ext_adv(dev, btdev_list[i]);
+ }
return 0;
}
-static bool ext_adv_connectable(struct btdev *btdev)
+static int cmd_ext_create_conn(struct btdev *dev, const void *data, uint8_t len)
{
- if (!btdev->le_adv_enable)
- return false;
+ cmd_status(dev, BT_HCI_ERR_SUCCESS, BT_HCI_CMD_LE_EXT_CREATE_CONN);
- return btdev->le_ext_adv_type & 0x01;
+ return 0;
}
static void le_ext_conn_complete(struct btdev *btdev,
const struct bt_hci_cmd_le_ext_create_conn *cmd,
+ struct le_ext_adv *ext_adv,
uint8_t status)
{
struct bt_hci_evt_le_enhanced_conn_complete ev;
@@ -4589,10 +4802,10 @@ static void le_ext_conn_complete(struct btdev *btdev,
if (!conn)
return;
- if (!btdev->le_ext_adv_type) {
- btdev->le_adv_enable = 0;
- conn->link->dev->le_adv_enable = 0;
- }
+ /* Disable EXT ADV */
+ queue_foreach(btdev->le_ext_adv, ext_adv_disable, NULL);
+ queue_foreach(conn->link->dev->le_ext_adv, ext_adv_disable,
+ NULL);
ev.status = status;
ev.peer_addr_type = btdev->le_scan_own_addr_type;
@@ -4625,19 +4838,30 @@ static int cmd_ext_create_conn_complete(struct btdev *dev, const void *data,
uint8_t len)
{
const struct bt_hci_cmd_le_ext_create_conn *cmd = data;
+ const struct queue_entry *entry;
struct btdev *remote;
dev->le_scan_own_addr_type = cmd->own_addr_type;
remote = find_btdev_by_bdaddr_type(cmd->peer_addr, cmd->peer_addr_type);
- if (remote && ext_adv_connectable(remote) &&
- ext_adv_match(dev, remote) &&
- remote->le_adv_own_addr == cmd->peer_addr_type)
- le_ext_conn_complete(dev, cmd, 0);
- else
- le_ext_conn_complete(dev, cmd,
+ if (!remote) {
+ le_ext_conn_complete(dev, cmd, NULL,
BT_HCI_ERR_CONN_FAILED_TO_ESTABLISH);
+ return 0;
+ }
+ for (entry = queue_get_entries(remote->le_ext_adv); entry;
+ entry = entry->next) {
+ struct le_ext_adv *ext_adv = entry->data;
+
+ if (ext_adv_is_connectable(ext_adv) &&
+ ext_adv_match_addr(dev, ext_adv) &&
+ ext_adv->own_addr_type == cmd->peer_addr_type) {
+ le_ext_conn_complete(dev, cmd, ext_adv, 0);
+ return 0;
+ }
+
+ }
return 0;
}
@@ -5748,6 +5972,7 @@ struct btdev *btdev_create(enum btdev_type type, uint16_t id)
get_bdaddr(id, index, btdev->bdaddr);
btdev->conns = queue_new();
+ btdev->le_ext_adv = queue_new();
return btdev;
}
--
2.26.3
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [BlueZ PATCH 4/5] emulator/bthost: Create ext adv params before setting adv data
2021-06-22 1:01 [BlueZ PATCH 1/5] tools/mgmt-tester: Enable High-Speed(HS) test cases Tedd Ho-Jeong An
2021-06-22 1:01 ` [BlueZ PATCH 2/5] monitor: Add Unknown Advertising ID error code Tedd Ho-Jeong An
2021-06-22 1:01 ` [BlueZ PATCH 3/5] emulator/btdev: Add support multiple instance of extended advertising Tedd Ho-Jeong An
@ 2021-06-22 1:01 ` Tedd Ho-Jeong An
2021-06-22 1:01 ` [BlueZ PATCH 5/5] tools/mgmt-tester: Update to support multiple extended adv instances Tedd Ho-Jeong An
2021-06-22 1:27 ` [BlueZ,1/5] tools/mgmt-tester: Enable High-Speed(HS) test cases bluez.test.bot
4 siblings, 0 replies; 6+ messages in thread
From: Tedd Ho-Jeong An @ 2021-06-22 1:01 UTC (permalink / raw)
To: linux-bluetooth
From: Tedd Ho-Jeong An <tedd.an@intel.com>
Based on the SPEC 5.2 Vol 4, Part E, Section 7.8.54, the
LE_Set_Extended_Advertising_Data_Command may be issued after an
advertising set identifed by the Advertising_Handle has been created
using the HCI_LE_Set_Extended_Advertising_Parameters command.
---
emulator/bthost.c | 26 ++++++++++++++++++++------
emulator/bthost.h | 1 +
2 files changed, 21 insertions(+), 6 deletions(-)
diff --git a/emulator/bthost.c b/emulator/bthost.c
index 16934d35a..62f5a1bae 100644
--- a/emulator/bthost.c
+++ b/emulator/bthost.c
@@ -2549,6 +2549,7 @@ void bthost_set_ext_adv_data(struct bthost *bthost, const uint8_t *data,
memset(adv_cp, 0, sizeof(*adv_cp));
memset(adv_cp->data, 0, 31);
+ adv_cp->handle = 1;
adv_cp->operation = 0x03;
adv_cp->fragment_preference = 0x01;
@@ -2572,20 +2573,33 @@ void bthost_set_adv_enable(struct bthost *bthost, uint8_t enable)
send_command(bthost, BT_HCI_CMD_LE_SET_ADV_ENABLE, &enable, 1);
}
-void bthost_set_ext_adv_enable(struct bthost *bthost, uint8_t enable)
+void bthost_set_ext_adv_params(struct bthost *bthost)
{
struct bt_hci_cmd_le_set_ext_adv_params cp;
- struct bt_hci_cmd_le_set_ext_adv_enable cp_enable;
memset(&cp, 0, sizeof(cp));
+ cp.handle = 0x01;
cp.evt_properties = cpu_to_le16(0x0013);
send_command(bthost, BT_HCI_CMD_LE_SET_EXT_ADV_PARAMS,
&cp, sizeof(cp));
+}
+
+void bthost_set_ext_adv_enable(struct bthost *bthost, uint8_t enable)
+{
+ struct bt_hci_cmd_le_set_ext_adv_enable *cp_enable;
+ struct bt_hci_cmd_ext_adv_set *cp_set;
+ uint8_t cp[6];
+
+ memset(cp, 0, 6);
+
+ cp_enable = (struct bt_hci_cmd_le_set_ext_adv_enable *)cp;
+ cp_set = (struct bt_hci_cmd_ext_adv_set *)(cp + sizeof(*cp_enable));
+
+ cp_enable->enable = enable;
+ cp_enable->num_of_sets = 1;
+ cp_set->handle = 1;
- memset(&cp_enable, 0, sizeof(cp_enable));
- cp_enable.enable = enable;
- send_command(bthost, BT_HCI_CMD_LE_SET_EXT_ADV_ENABLE, &cp_enable,
- sizeof(cp_enable));
+ send_command(bthost, BT_HCI_CMD_LE_SET_EXT_ADV_ENABLE, cp, 6);
}
void bthost_write_ssp_mode(struct bthost *bthost, uint8_t mode)
diff --git a/emulator/bthost.h b/emulator/bthost.h
index 7e5286df3..5a85b7232 100644
--- a/emulator/bthost.h
+++ b/emulator/bthost.h
@@ -80,6 +80,7 @@ void bthost_set_adv_enable(struct bthost *bthost, uint8_t enable);
void bthost_set_ext_adv_data(struct bthost *bthost, const uint8_t *data,
uint8_t len);
+void bthost_set_ext_adv_params(struct bthost *bthost);
void bthost_set_ext_adv_enable(struct bthost *bthost, uint8_t enable);
void bthost_write_ssp_mode(struct bthost *bthost, uint8_t mode);
--
2.26.3
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [BlueZ PATCH 5/5] tools/mgmt-tester: Update to support multiple extended adv instances
2021-06-22 1:01 [BlueZ PATCH 1/5] tools/mgmt-tester: Enable High-Speed(HS) test cases Tedd Ho-Jeong An
` (2 preceding siblings ...)
2021-06-22 1:01 ` [BlueZ PATCH 4/5] emulator/bthost: Create ext adv params before setting adv data Tedd Ho-Jeong An
@ 2021-06-22 1:01 ` Tedd Ho-Jeong An
2021-06-22 1:27 ` [BlueZ,1/5] tools/mgmt-tester: Enable High-Speed(HS) test cases bluez.test.bot
4 siblings, 0 replies; 6+ messages in thread
From: Tedd Ho-Jeong An @ 2021-06-22 1:01 UTC (permalink / raw)
To: linux-bluetooth
From: Tedd Ho-Jeong An <tedd.an@intel.com>
This patch updates to align with the multiple extended advertising
support.
---
tools/mgmt-tester.c | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/tools/mgmt-tester.c b/tools/mgmt-tester.c
index 8cae376f4..aacabcbd3 100644
--- a/tools/mgmt-tester.c
+++ b/tools/mgmt-tester.c
@@ -5871,9 +5871,10 @@ static void setup_bthost(void)
if (data->hciemu_type == HCIEMU_TYPE_LE ||
test->client_enable_adv) {
- if (data->hciemu_type >= HCIEMU_TYPE_BREDRLE50)
+ if (data->hciemu_type >= HCIEMU_TYPE_BREDRLE50) {
+ bthost_set_ext_adv_params(bthost);
bthost_set_ext_adv_enable(bthost, 0x01);
- else
+ } else
bthost_set_adv_enable(bthost, 0x01);
} else
bthost_write_scan_enable(bthost, 0x03);
@@ -7554,7 +7555,7 @@ static const uint8_t read_adv_features_rsp_3[] = {
0xff, 0xff, 0x01, 0x00, /* supported flags */
0x1f, /* max_adv_data_len */
0x1f, /* max_scan_rsp_len */
- 0x01, /* max_instances */
+ 0x03, /* max_instances */
0x00, /* num_instances */
};
@@ -8120,7 +8121,7 @@ static const struct generic_data remove_ext_advertising_success_2 = {
};
static const uint8_t set_ext_adv_data_test2[] = {
- 0x01, /* handle */
+ 0x02, /* handle */
0x03, /* complete data */
0x01, /* controller should not fragment */
0x07, /* adv data len */
@@ -9654,6 +9655,7 @@ static void trigger_device_found(void *user_data)
bthost_set_adv_enable(bthost, 0x01);
} else if (data->hciemu_type >= HCIEMU_TYPE_BREDRLE50) {
+ bthost_set_ext_adv_params(bthost);
if (test->set_adv)
bthost_set_ext_adv_data(bthost, test->adv_data,
test->adv_data_len);
@@ -11067,7 +11069,6 @@ int main(int argc, char *argv[])
&add_advertising_name_data_appear,
setup_command_generic,
test_command_generic);
-
test_le_full("Adv. connectable & connected (slave) - Success",
&conn_slave_adv_conneactable_test,
setup_advertise_while_connected,
--
2.26.3
^ permalink raw reply related [flat|nested] 6+ messages in thread
* RE: [BlueZ,1/5] tools/mgmt-tester: Enable High-Speed(HS) test cases
2021-06-22 1:01 [BlueZ PATCH 1/5] tools/mgmt-tester: Enable High-Speed(HS) test cases Tedd Ho-Jeong An
` (3 preceding siblings ...)
2021-06-22 1:01 ` [BlueZ PATCH 5/5] tools/mgmt-tester: Update to support multiple extended adv instances Tedd Ho-Jeong An
@ 2021-06-22 1:27 ` bluez.test.bot
4 siblings, 0 replies; 6+ messages in thread
From: bluez.test.bot @ 2021-06-22 1:27 UTC (permalink / raw)
To: linux-bluetooth, hj.tedd.an
[-- Attachment #1: Type: text/plain, Size: 1953 bytes --]
This is automated email and please do not reply to this email!
Dear submitter,
Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=504695
---Test result---
Test Summary:
CheckPatch PASS 1.82 seconds
GitLint PASS 0.69 seconds
Prep - Setup ELL PASS 52.95 seconds
Build - Prep PASS 0.15 seconds
Build - Configure PASS 9.29 seconds
Build - Make PASS 216.88 seconds
Make Check PASS 8.81 seconds
Make Distcheck PASS 257.00 seconds
Build w/ext ELL - Configure PASS 8.88 seconds
Build w/ext ELL - Make PASS 210.90 seconds
Details
##############################
Test: CheckPatch - PASS
Desc: Run checkpatch.pl script with rule in .checkpatch.conf
##############################
Test: GitLint - PASS
Desc: Run gitlint with rule in .gitlint
##############################
Test: Prep - Setup ELL - PASS
Desc: Clone, build, and install ELL
##############################
Test: Build - Prep - PASS
Desc: Prepare environment for build
##############################
Test: Build - Configure - PASS
Desc: Configure the BlueZ source tree
##############################
Test: Build - Make - PASS
Desc: Build the BlueZ source tree
##############################
Test: Make Check - PASS
Desc: Run 'make check'
##############################
Test: Make Distcheck - PASS
Desc: Run distcheck to check the distribution
##############################
Test: Build w/ext ELL - Configure - PASS
Desc: Configure BlueZ source with '--enable-external-ell' configuration
##############################
Test: Build w/ext ELL - Make - PASS
Desc: Build BlueZ source with '--enable-external-ell' configuration
---
Regards,
Linux Bluetooth
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2021-06-22 1:27 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-22 1:01 [BlueZ PATCH 1/5] tools/mgmt-tester: Enable High-Speed(HS) test cases Tedd Ho-Jeong An
2021-06-22 1:01 ` [BlueZ PATCH 2/5] monitor: Add Unknown Advertising ID error code Tedd Ho-Jeong An
2021-06-22 1:01 ` [BlueZ PATCH 3/5] emulator/btdev: Add support multiple instance of extended advertising Tedd Ho-Jeong An
2021-06-22 1:01 ` [BlueZ PATCH 4/5] emulator/bthost: Create ext adv params before setting adv data Tedd Ho-Jeong An
2021-06-22 1:01 ` [BlueZ PATCH 5/5] tools/mgmt-tester: Update to support multiple extended adv instances Tedd Ho-Jeong An
2021-06-22 1:27 ` [BlueZ,1/5] tools/mgmt-tester: Enable High-Speed(HS) test cases bluez.test.bot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).