From: Pauli Virtanen <pav@iki.fi>
To: linux-bluetooth@vger.kernel.org
Cc: Pauli Virtanen <pav@iki.fi>
Subject: [PATCH BlueZ v5 04/16] emulator: btdev: clear more state on Reset
Date: Wed, 13 May 2026 19:17:21 +0300 [thread overview]
Message-ID: <a477fe53ef2be2f003d52da8cd9541e628c09aa2.1778688966.git.pav@iki.fi> (raw)
In-Reply-To: <cover.1778688966.git.pav@iki.fi>
On controller Reset command, initialize most fields in struct btdev to
zero, similarly to the state just after btdev_create().
This excludes some fields like command bitmasks, which hciemu may have
adjusted.
To make this easier, add struct_group() macro similar to what kernel
uses.
---
emulator/btdev.c | 117 ++++++++++++++++++++++++++++-------------------
1 file changed, 70 insertions(+), 47 deletions(-)
diff --git a/emulator/btdev.c b/emulator/btdev.c
index 3a295b679..ad2e025d1 100644
--- a/emulator/btdev.c
+++ b/emulator/btdev.c
@@ -50,6 +50,12 @@
#define has_bredr(btdev) (!((btdev)->features[4] & 0x20))
#define has_le(btdev) (!!((btdev)->features[4] & 0x40))
+#define struct_group(NAME, MEMBERS...) \
+ union { \
+ struct { MEMBERS }; \
+ struct { MEMBERS } NAME; \
+ }
+
#define ACL_HANDLE BIT(0)
#define SCO_HANDLE BIT(8)
#define CIS_HANDLE SCO_HANDLE
@@ -149,15 +155,6 @@ struct btdev {
struct queue *conns;
- bool auth_init;
- uint8_t link_key[16];
- uint16_t pin[16];
- uint8_t pin_len;
- uint8_t io_cap;
- uint8_t auth_req;
- bool ssp_auth_complete;
- uint8_t ssp_status;
-
btdev_command_func command_handler;
void *command_data;
@@ -196,6 +193,18 @@ struct btdev {
const struct btdev_cmd *emu_cmds;
bool aosp_capable;
+ /* State zeroed on reset */
+ struct_group(reset_group,
+
+ bool auth_init;
+ uint8_t link_key[16];
+ uint16_t pin[16];
+ uint8_t pin_len;
+ uint8_t io_cap;
+ uint8_t auth_req;
+ bool ssp_auth_complete;
+ uint8_t ssp_status;
+
uint16_t default_link_policy;
uint8_t event_mask[8];
uint8_t event_mask_page2[8];
@@ -249,25 +258,26 @@ struct btdev {
struct le_cig le_cig[CIG_SIZE];
uint8_t le_iso_path[2];
- /* Real time length of AL array */
- uint8_t le_al_len;
- /* Real time length of RL array */
- uint8_t le_rl_len;
- struct btdev_al le_al[AL_SIZE];
- struct btdev_rl le_rl[RL_SIZE];
uint8_t le_rl_enable;
- uint16_t le_rl_timeout;
struct pending_conn pending_conn[MAX_PENDING_CONN];
- uint8_t le_local_sk256[32];
-
uint16_t sync_train_interval;
uint32_t sync_train_timeout;
uint8_t sync_train_service_data;
uint16_t le_ext_adv_type;
+ ); /* reset_group */
+
+ /* Real time length of AL array */
+ uint8_t le_al_len;
+ /* Real time length of RL array */
+ uint8_t le_rl_len;
+ struct btdev_al le_al[AL_SIZE];
+ struct btdev_rl le_rl[RL_SIZE];
+ uint16_t le_rl_timeout;
+
struct queue *le_ext_adv;
struct queue *le_per_adv;
struct queue *le_big;
@@ -617,15 +627,52 @@ static void le_big_free(void *data)
free(big);
}
+static void btdev_init_param(struct btdev *btdev)
+{
+ unsigned int i;
+
+ btdev->page_scan_interval = 0x0800;
+ btdev->page_scan_window = 0x0012;
+ btdev->page_scan_type = 0x00;
+
+ btdev->sync_train_interval = 0x0080;
+ btdev->sync_train_timeout = 0x0002ee00;
+ btdev->sync_train_service_data = 0x00;
+
+ btdev->acl_mtu = 192;
+ btdev->acl_max_pkt = 1;
+
+ btdev->sco_mtu = 72;
+ btdev->sco_max_pkt = 1;
+
+ btdev->iso_mtu = 251;
+ btdev->iso_max_pkt = 1;
+
+ for (i = 0; i < ARRAY_SIZE(btdev->le_cig); ++i)
+ btdev->le_cig[i].params.cig_id = 0xff;
+
+ btdev->country_code = 0x00;
+}
+
static void btdev_reset(struct btdev *btdev)
{
/* FIXME: include here clearing of all states that should be
* cleared upon HCI_Reset
*/
- btdev->le_scan_enable = 0x00;
- btdev->le_adv_enable = 0x00;
- btdev->le_pa_enable = 0x00;
+ if (btdev->inquiry_id > 0) {
+ timeout_remove(btdev->inquiry_id);
+ btdev->inquiry_id = 0;
+ }
+
+ queue_remove_all(btdev->conns, NULL, NULL, conn_remove);
+ queue_remove_all(btdev->le_ext_adv, NULL, NULL, le_ext_adv_free);
+ queue_remove_all(btdev->le_per_adv, NULL, NULL, free);
+ queue_remove_all(btdev->le_big, NULL, NULL, le_big_free);
+
+ memset(&btdev->reset_group, 0, sizeof(btdev->reset_group));
+
+ btdev_init_param(btdev);
al_clear(btdev);
rl_clear(btdev);
@@ -633,10 +680,7 @@ static void btdev_reset(struct btdev *btdev)
btdev->le_al_len = AL_SIZE;
btdev->le_rl_len = RL_SIZE;
- queue_remove_all(btdev->conns, NULL, NULL, conn_remove);
- queue_remove_all(btdev->le_ext_adv, NULL, NULL, le_ext_adv_free);
- queue_remove_all(btdev->le_per_adv, NULL, NULL, free);
- queue_remove_all(btdev->le_big, NULL, NULL, le_big_free);
+ btdev->le_rl_timeout = 0x0384;
}
static int cmd_reset(struct btdev *dev, const void *data, uint8_t len)
@@ -8130,7 +8174,6 @@ struct btdev *btdev_create(enum btdev_type type, uint16_t id)
{
struct btdev *btdev;
int index;
- unsigned int i;
btdev = malloc(sizeof(*btdev));
if (!btdev)
@@ -8195,27 +8238,7 @@ struct btdev *btdev_create(enum btdev_type type, uint16_t id)
break;
}
- btdev->page_scan_interval = 0x0800;
- btdev->page_scan_window = 0x0012;
- btdev->page_scan_type = 0x00;
-
- btdev->sync_train_interval = 0x0080;
- btdev->sync_train_timeout = 0x0002ee00;
- btdev->sync_train_service_data = 0x00;
-
- btdev->acl_mtu = 192;
- btdev->acl_max_pkt = 1;
-
- btdev->sco_mtu = 72;
- btdev->sco_max_pkt = 1;
-
- btdev->iso_mtu = 251;
- btdev->iso_max_pkt = 1;
-
- for (i = 0; i < ARRAY_SIZE(btdev->le_cig); ++i)
- btdev->le_cig[i].params.cig_id = 0xff;
-
- btdev->country_code = 0x00;
+ btdev_init_param(btdev);
index = add_btdev(btdev);
if (index < 0) {
--
2.54.0
next prev parent reply other threads:[~2026-05-13 16:17 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-13 16:17 [PATCH BlueZ v5 00/16] Functional/integration testing Pauli Virtanen
2026-05-13 16:17 ` [PATCH BlueZ v5 01/16] emulator: btvirt: check pkt lengths, don't get stuck on malformed Pauli Virtanen
2026-05-13 18:23 ` Functional/integration testing bluez.test.bot
2026-05-13 16:17 ` [PATCH BlueZ v5 02/16] emulator: btvirt: allow specifying where server unix sockets are made Pauli Virtanen
2026-05-13 16:17 ` [PATCH BlueZ v5 03/16] emulator: btvirt: support SCO data packets Pauli Virtanen
2026-05-13 16:17 ` Pauli Virtanen [this message]
2026-05-13 16:17 ` [PATCH BlueZ v5 05/16] test-runner: enable path argument for --unix Pauli Virtanen
2026-05-13 16:17 ` [PATCH BlueZ v5 06/16] test-runner: Add -o/--option option Pauli Virtanen
2026-05-13 16:17 ` [PATCH BlueZ v5 07/16] test-runner: allow source tree root for -k Pauli Virtanen
2026-05-13 16:17 ` [PATCH BlueZ v5 08/16] test-runner: use virtio-serial for implementing -u device forwarding Pauli Virtanen
2026-05-13 16:17 ` [PATCH BlueZ v5 09/16] doc: enable CONFIG_VIRTIO_CONSOLE in tester config Pauli Virtanen
2026-05-13 16:17 ` [PATCH BlueZ v5 10/16] doc: enable KVM paravirtualization & clock support in tester kernel config Pauli Virtanen
2026-05-13 16:17 ` [PATCH BlueZ v5 11/16] doc: add functional/integration testing documentation Pauli Virtanen
2026-05-13 16:17 ` [PATCH BlueZ v5 12/16] test: add functional/integration testing framework Pauli Virtanen
2026-05-13 16:17 ` [PATCH BlueZ v5 13/16] build: add functional testing target Pauli Virtanen
2026-05-13 16:17 ` [PATCH BlueZ v5 14/16] test: functional: impose Python code formatting Pauli Virtanen
2026-05-13 16:17 ` [PATCH BlueZ v5 15/16] test: functional: add some Agent1 interface tests Pauli Virtanen
2026-05-13 16:17 ` [PATCH BlueZ v5 16/16] test: functional: add basic obex file transfer tests Pauli Virtanen
2026-05-14 17:50 ` [PATCH BlueZ v5 00/16] Functional/integration testing patchwork-bot+bluetooth
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=a477fe53ef2be2f003d52da8cd9541e628c09aa2.1778688966.git.pav@iki.fi \
--to=pav@iki.fi \
--cc=linux-bluetooth@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox