All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH BlueZ] tools/l2cap-tester: add tests changing BT_SECURITY after connecting
@ 2026-08-09 16:45 Pauli Virtanen
  2026-08-09 17:46 ` [BlueZ] " bluez.test.bot
  2026-08-11 20:20 ` [PATCH BlueZ] " patchwork-bot+bluetooth
  0 siblings, 2 replies; 3+ messages in thread
From: Pauli Virtanen @ 2026-08-09 16:45 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: Pauli Virtanen

Add tests that change BT_SECURITY value after connection established:

L2CAP BR/EDR Client PIN Code Change Sec - Success
L2CAP LE Client Change Sec - Success
L2CAP LE ATT Client Change Sec  - Success
L2CAP LE EATT Client Change Sec - Success
---
 tools/l2cap-tester.c | 107 ++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 100 insertions(+), 7 deletions(-)

diff --git a/tools/l2cap-tester.c b/tools/l2cap-tester.c
index 3011a811e..69c529aa8 100644
--- a/tools/l2cap-tester.c
+++ b/tools/l2cap-tester.c
@@ -127,6 +127,9 @@ struct l2cap_data {
 	 * The address is filled in with the client bdaddr at runtime.
 	 */
 	const struct l2cap_conn_subrate *conn_subrate;
+
+	/* Change security level to this after connecting */
+	int change_sec_level;
 };
 
 static void print_debug(const char *str, void *user_data)
@@ -356,6 +359,17 @@ static const struct l2cap_data client_connect_pin_success_test = {
 	.client_pin_len = sizeof(pair_device_pin),
 };
 
+static const struct l2cap_data client_connect_pin_change_sec_success_test = {
+	.client_psm = 0x1001,
+	.server_psm = 0x1001,
+	.sec_level  = BT_SECURITY_MEDIUM,
+	.pin = pair_device_pin,
+	.pin_len = sizeof(pair_device_pin),
+	.client_pin = pair_device_pin,
+	.client_pin_len = sizeof(pair_device_pin),
+	.change_sec_level = BT_SECURITY_HIGH,
+};
+
 static uint8_t l2_data[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
 
 const uint8_t l2_data_32k[32768] = { [0 ... 4095] =  0x00,
@@ -859,6 +873,13 @@ static const struct l2cap_data le_client_connect_success_test_2 = {
 	.sec_level  = BT_SECURITY_MEDIUM,
 };
 
+static const struct l2cap_data le_client_change_sec_success_test = {
+	.client_psm = 0x0080,
+	.server_psm = 0x0080,
+	.sec_level  = BT_SECURITY_LOW,
+	.change_sec_level = BT_SECURITY_MEDIUM,
+};
+
 static const uint8_t cmd_reject_rsp[] = { 0x01, 0x01, 0x02, 0x00, 0x00, 0x00 };
 
 static const struct l2cap_data le_client_connect_reject_test_1 = {
@@ -1187,6 +1208,12 @@ static const struct l2cap_data le_att_client_connect_success_test_1 = {
 	.sec_level = BT_SECURITY_LOW,
 };
 
+static const struct l2cap_data le_att_client_change_sec_success_test = {
+	.cid = 0x0004,
+	.sec_level = BT_SECURITY_LOW,
+	.change_sec_level = BT_SECURITY_MEDIUM,
+};
+
 static const struct l2cap_data le_att_server_success_test_1 = {
 	.cid = 0x0004,
 };
@@ -1198,6 +1225,14 @@ static const struct l2cap_data le_eatt_client_connect_success_test_1 = {
 	.sec_level = BT_SECURITY_LOW,
 };
 
+static const struct l2cap_data le_eatt_client_change_sec_success_test = {
+	.client_psm = 0x0027,
+	.server_psm = 0x0027,
+	.mode = BT_MODE_EXT_FLOWCTL,
+	.sec_level = BT_SECURITY_LOW,
+	.change_sec_level = BT_SECURITY_MEDIUM,
+};
+
 static const uint8_t eatt_connect_req[] = {	0x27, 0x00, /* PSM */
 						0x40, 0x00, /* MTU */
 						0x40, 0x00, /* MPS */
@@ -1848,11 +1883,12 @@ static bool check_mtu(struct test_data *data, int sk)
 	return true;
 }
 
-static gboolean check_phy(gpointer args)
+static gboolean check_phy_and_sec(gpointer args)
 {
 	int sk = PTR_TO_INT(args);
 	struct test_data *data = tester_get_data();
 	const struct l2cap_data *l2data = data->test_data;
+	struct bt_security sec;
 	socklen_t len;
 
 	len = sizeof(data->phys);
@@ -1874,6 +1910,24 @@ static gboolean check_phy(gpointer args)
 		return TRUE;
 	}
 
+	tester_print("Checking security level...");
+
+	len = sizeof(sec);
+	if (getsockopt(sk, SOL_BLUETOOTH, BT_SECURITY, &sec, &len) < 0) {
+		tester_warn("getsockopt(BT_SECURITY): %s (%d)",
+							strerror(errno), errno);
+		tester_test_failed();
+		goto done;
+	}
+
+	if (l2data->change_sec_level && sec.level != l2data->change_sec_level) {
+		tester_print("sec.level %d != %d", sec.level,
+						l2data->change_sec_level);
+
+		/* Retry */
+		return TRUE;
+	}
+
 	data->step--;
 
 done:
@@ -1882,10 +1936,12 @@ done:
 	return FALSE;
 }
 
-static int check_phys(struct test_data *data, int sk)
+static int check_phys_and_sec(struct test_data *data, int sk)
 {
 	const struct l2cap_data *l2data = data->test_data;
 	socklen_t len;
+	bool changed = false;
+	int err;
 
 	len = sizeof(data->phys);
 	data->phys = 0;
@@ -1901,17 +1957,41 @@ static int check_phys(struct test_data *data, int sk)
 		return -EINVAL;
 	}
 
+	if (l2data->change_sec_level) {
+		struct bt_security sec;
+
+		memset(&sec, 0, sizeof(sec));
+		sec.level = l2data->change_sec_level;
+
+		tester_print("Changing security level to %d", sec.level);
+
+		if (setsockopt(sk, SOL_BLUETOOTH, BT_SECURITY, &sec,
+							sizeof(sec)) < 0) {
+			err = -errno;
+			tester_warn("Can't set security level: %s (%d)",
+							strerror(errno), errno);
+			return err;
+		}
+
+		changed = true;
+	}
+
 	if (l2data->phy) {
 		if (setsockopt(sk, SOL_BLUETOOTH, BT_PHY, &l2data->phy,
 						sizeof(l2data->phy)) < 0) {
+			err = -errno;
 			tester_warn("setsockopt(BT_PHY): %s (%d)",
 					strerror(errno), errno);
-			return -errno;
+			return err;
 		}
 
-		/* Wait for the PHY to change */
+		changed = true;
+	}
+
+	if (changed) {
+		/* Wait for the change */
 		data->step++;
-		g_timeout_add(50, check_phy, INT_TO_PTR(sk));
+		g_timeout_add(50, check_phy_and_sec, INT_TO_PTR(sk));
 
 		return -EINPROGRESS;
 	}
@@ -2094,7 +2174,7 @@ static gboolean l2cap_connect_cb(GIOChannel *io, GIOCondition cond,
 		return FALSE;
 	}
 
-	err = check_phys(data, sk);
+	err = check_phys_and_sec(data, sk);
 	if (err < 0) {
 		if (err == -EINPROGRESS) {
 			g_io_add_watch(io, G_IO_HUP, socket_closed_cb, NULL);
@@ -2824,7 +2904,7 @@ static gboolean l2cap_accept_cb(GIOChannel *io, GIOCondition cond,
 		return FALSE;
 	}
 
-	err = check_phys(data, sk);
+	err = check_phys_and_sec(data, sk);
 	if (err < 0) {
 		if (err == -EINPROGRESS) {
 			g_io_add_watch(io, G_IO_HUP, socket_closed_cb, NULL);
@@ -3157,6 +3237,10 @@ int main(int argc, char *argv[])
 					&client_connect_pin_success_test,
 					setup_powered_client, test_connect);
 
+	test_l2cap_bredr("L2CAP BR/EDR Client PIN Code Change Sec - Success",
+				&client_connect_pin_change_sec_success_test,
+				setup_powered_client, test_connect);
+
 	test_l2cap_bredr("L2CAP BR/EDR Client - Read Success",
 					&client_connect_read_success_test,
 					setup_powered_client, test_connect);
@@ -3332,6 +3416,9 @@ int main(int argc, char *argv[])
 	test_l2cap_le("L2CAP LE Client SMP - Success",
 				&le_client_connect_success_test_2,
 				setup_powered_client, test_connect);
+	test_l2cap_le("L2CAP LE Client Change Sec - Success",
+				&le_client_change_sec_success_test,
+				setup_powered_client, test_connect);
 	test_l2cap_le("L2CAP LE Client - Command Reject",
 					&le_client_connect_reject_test_1,
 					setup_powered_client, test_connect);
@@ -3466,6 +3553,9 @@ int main(int argc, char *argv[])
 	test_l2cap_le("L2CAP LE ATT Client - Success",
 				&le_att_client_connect_success_test_1,
 				setup_powered_client, test_connect);
+	test_l2cap_le("L2CAP LE ATT Client Change Sec  - Success",
+				&le_att_client_change_sec_success_test,
+				setup_powered_client, test_connect);
 	test_l2cap_le("L2CAP LE ATT Server - Success",
 				&le_att_server_success_test_1,
 				setup_powered_server, test_server);
@@ -3473,6 +3563,9 @@ int main(int argc, char *argv[])
 	test_l2cap_le("L2CAP LE EATT Client - Success",
 				&le_eatt_client_connect_success_test_1,
 				setup_powered_client, test_connect);
+	test_l2cap_le("L2CAP LE EATT Client Change Sec - Success",
+				&le_eatt_client_change_sec_success_test,
+				setup_powered_client, test_connect);
 	test_l2cap_le("L2CAP LE EATT Server - Success",
 				&le_eatt_server_success_test_1,
 				setup_powered_server, test_server);
-- 
2.55.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2026-08-11 20:20 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-09 16:45 [PATCH BlueZ] tools/l2cap-tester: add tests changing BT_SECURITY after connecting Pauli Virtanen
2026-08-09 17:46 ` [BlueZ] " bluez.test.bot
2026-08-11 20:20 ` [PATCH BlueZ] " patchwork-bot+bluetooth

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.