From: "Frédéric Danis" <frederic.danis@collabora.com>
To: linux-bluetooth@vger.kernel.org
Subject: [PATCH BlueZ v2 2/6] mgmt-tester: Add Security Level Changed event tests
Date: Thu, 20 Aug 2026 14:58:02 +0200 [thread overview]
Message-ID: <20260820125806.1253547-3-frederic.danis@collabora.com> (raw)
In-Reply-To: <20260820125806.1253547-1-frederic.danis@collabora.com>
Test that MGMT_EV_SECURITY_LEVEL_CHANGED is correctly received during
BREDR and LE secured connection.
Assisted-by: GPT:GPT-5.3-Codex
---
tools/mgmt-tester.c | 133 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 133 insertions(+)
diff --git a/tools/mgmt-tester.c b/tools/mgmt-tester.c
index 4b432002d..bd8b67209 100644
--- a/tools/mgmt-tester.c
+++ b/tools/mgmt-tester.c
@@ -3776,6 +3776,110 @@ static bool verify_link_key(const void *param, uint16_t length)
return true;
}
+static bool verify_security_level_changed(const void *param, uint16_t length)
+{
+ struct test_data *data = tester_get_data();
+ const uint8_t *event = param;
+ const uint8_t *expected_addr;
+ uint8_t expected_addr_type;
+ uint8_t expected_enc_type;
+ uint8_t tlv_count;
+ uint8_t i;
+ uint16_t offset;
+ bool saw_level = false;
+ bool saw_enc_type = false;
+
+ if (length < sizeof(struct mgmt_addr_info) + 1) {
+ tester_warn("Invalid security level changed length %u", length);
+ return false;
+ }
+
+ expected_addr = hciemu_get_client_bdaddr(data->hciemu);
+ if (!expected_addr) {
+ tester_warn("No central bdaddr");
+ return false;
+ }
+
+ expected_addr_type = data->hciemu_type == HCIEMU_TYPE_LE ?
+ BDADDR_LE_PUBLIC : BDADDR_BREDR;
+ expected_enc_type = data->hciemu_type == HCIEMU_TYPE_LE ?
+ MGMT_CONN_SEC_ENCRYPT_NONE :
+ MGMT_CONN_SEC_ENCRYPT_E0;
+
+ if (memcmp(event, expected_addr, 6)) {
+ tester_warn("Unexpected security level changed address");
+ return false;
+ }
+
+ if (event[6] != expected_addr_type) {
+ tester_warn("Unexpected security level changed address type %u != %u",
+ event[6], expected_addr_type);
+ return false;
+ }
+
+ tlv_count = event[7];
+ offset = sizeof(struct mgmt_addr_info) + 1;
+
+ for (i = 0; i < tlv_count; i++) {
+ const struct mgmt_tlv *tlv;
+ uint16_t type;
+
+ if (offset + sizeof(*tlv) > length) {
+ tester_warn("Malformed security level changed TLV header");
+ return false;
+ }
+
+ tlv = (const struct mgmt_tlv *)(event + offset);
+ type = get_le16(&tlv->type);
+
+ if (offset + sizeof(*tlv) + tlv->length > length) {
+ tester_warn("Malformed security level changed TLV payload");
+ return false;
+ }
+
+ switch (type) {
+ case MGMT_SEC_LEVEL_CHANGED_PARAM_LEVEL:
+ if (tlv->length != 1) {
+ tester_warn("Invalid security level TLV length %u",
+ tlv->length);
+ return false;
+ }
+ saw_level = true;
+ break;
+ case MGMT_SEC_LEVEL_CHANGED_PARAM_ENC_TYPE:
+ if (tlv->length != 1) {
+ tester_warn("Invalid encryption type TLV length %u",
+ tlv->length);
+ return false;
+ }
+
+ if (tlv->value[0] != expected_enc_type) {
+ tester_warn("Unexpected encryption type %u != %u",
+ tlv->value[0],
+ expected_enc_type);
+ return false;
+ }
+
+ saw_enc_type = true;
+ break;
+ }
+
+ offset += sizeof(*tlv) + tlv->length;
+ }
+
+ if (offset != length) {
+ tester_warn("Unexpected security level changed trailing bytes");
+ return false;
+ }
+
+ if (!saw_level || !saw_enc_type) {
+ tester_warn("Missing expected security level changed TLVs");
+ return false;
+ }
+
+ return true;
+}
+
static uint16_t settings_powered_le_sc_bondable[] = {
MGMT_OP_SET_LE,
MGMT_OP_SET_SSP,
@@ -3879,6 +3983,19 @@ static const struct generic_data pairing_acceptor_ssp_1 = {
.just_works = true,
};
+static const struct generic_data pairing_acceptor_ssp_sec_level_changed = {
+ .setup_settings = settings_powered_connectable_bondable_ssp,
+ .client_enable_ssp = true,
+ .expect_alt_ev = MGMT_EV_SECURITY_LEVEL_CHANGED,
+ .expect_alt_ev_len = 16,
+ .verify_alt_ev_func = verify_security_level_changed,
+ .expect_hci_command = BT_HCI_CMD_USER_CONFIRM_REQUEST_REPLY,
+ .expect_hci_func = client_bdaddr_param_func,
+ .io_cap = 0x03, /* NoInputNoOutput */
+ .client_io_cap = 0x03, /* NoInputNoOutput */
+ .just_works = true,
+};
+
static const struct generic_data pairing_acceptor_ssp_2 = {
.setup_settings = settings_powered_connectable_bondable_ssp,
.client_enable_ssp = true,
@@ -3986,6 +4103,16 @@ static const struct generic_data pairing_acceptor_le_1 = {
.verify_alt_ev_func = verify_ltk,
};
+static const struct generic_data pairing_acceptor_le_sec_level_changed = {
+ .setup_settings = settings_powered_bondable_connectable_advertising,
+ .io_cap = 0x03, /* NoInputNoOutput */
+ .client_io_cap = 0x03, /* NoInputNoOutput */
+ .just_works = true,
+ .expect_alt_ev = MGMT_EV_SECURITY_LEVEL_CHANGED,
+ .expect_alt_ev_len = 16,
+ .verify_alt_ev_func = verify_security_level_changed,
+};
+
static const struct generic_data pairing_acceptor_le_2 = {
.setup_settings = settings_powered_bondable_connectable_advertising,
.io_cap = 0x04, /* KeyboardDisplay */
@@ -13832,6 +13959,9 @@ int main(int argc, char *argv[])
test_bredrle("Pairing Acceptor - SSP 1",
&pairing_acceptor_ssp_1, setup_pairing_acceptor,
test_pairing_acceptor);
+ test_bredrle("Pairing Acceptor - SSP Security Level Changed",
+ &pairing_acceptor_ssp_sec_level_changed,
+ setup_pairing_acceptor, test_pairing_acceptor);
test_bredrle("Pairing Acceptor - SSP 2",
&pairing_acceptor_ssp_2, setup_pairing_acceptor,
test_pairing_acceptor);
@@ -13850,6 +13980,9 @@ int main(int argc, char *argv[])
test_le("Pairing Acceptor - LE 1",
&pairing_acceptor_le_1, setup_pairing_acceptor,
test_pairing_acceptor);
+ test_le("Pairing Acceptor - LE Security Level Changed",
+ &pairing_acceptor_le_sec_level_changed,
+ setup_pairing_acceptor, test_pairing_acceptor);
test_le("Pairing Acceptor - LE 2",
&pairing_acceptor_le_2, setup_pairing_acceptor,
test_pairing_acceptor);
--
2.43.0
next prev parent reply other threads:[~2026-08-20 12:58 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-20 12:58 [PATCH BlueZ v2 0/6] mgmt/device: report link security level to D-Bus clients Frédéric Danis
2026-08-20 12:58 ` [PATCH BlueZ v2 1/6] mgmt: Add Security Level Changed event Frédéric Danis
2026-08-20 14:07 ` mgmt/device: report link security level to D-Bus clients bluez.test.bot
2026-08-20 12:58 ` Frédéric Danis [this message]
2026-08-20 12:58 ` [PATCH BlueZ v2 3/6] monitor: Add support for Mgmt Security Level changed event Frédéric Danis
2026-08-20 12:58 ` [PATCH BlueZ v2 4/6] device: Add SecurityLevel properties to org.bluez.Device1 Frédéric Danis
2026-08-20 12:58 ` [PATCH BlueZ v2 5/6] org.bluez.Device: Add Security Level related properties Frédéric Danis
2026-08-20 12:58 ` [PATCH BlueZ v2 6/6] client: Display SecurityLevel in device info Frédéric Danis
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=20260820125806.1253547-3-frederic.danis@collabora.com \
--to=frederic.danis@collabora.com \
--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