* [PATCH BlueZ v1 1/3] emulator: Add support for BT_HCI_CMD_CHANGE_CONN_PKT_TYPE
@ 2025-12-17 20:41 Luiz Augusto von Dentz
2025-12-17 20:41 ` [PATCH BlueZ v1 2/3] emulator: Add support for BT_HCI_CMD_LE_SET_PHY Luiz Augusto von Dentz
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: Luiz Augusto von Dentz @ 2025-12-17 20:41 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This adds support for BT_HCI_CMD_CHANGE_CONN_PKT_TYPE as well as
emit BT_HCI_EVT_CONN_PKT_TYPE_CHANGED when it completes.
---
emulator/btdev.c | 42 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 42 insertions(+)
diff --git a/emulator/btdev.c b/emulator/btdev.c
index c84bcf783658..41e9c68f5f45 100644
--- a/emulator/btdev.c
+++ b/emulator/btdev.c
@@ -1928,6 +1928,45 @@ static int cmd_pin_code_neg_reply_complete(struct btdev *dev, const void *data,
return 0;
}
+static int cmd_change_conn_pkt_type(struct btdev *dev, const void *data,
+ uint8_t len)
+{
+ const struct bt_hci_cmd_change_conn_pkt_type *cmd = data;
+ struct btdev_conn *conn;
+ uint8_t status = BT_HCI_ERR_SUCCESS;
+
+ conn = queue_find(dev->conns, match_handle,
+ UINT_TO_PTR(cpu_to_le16(cmd->handle)));
+ if (!conn)
+ status = BT_HCI_ERR_UNKNOWN_CONN_ID;
+
+ cmd_status(dev, status, BT_HCI_CMD_CHANGE_CONN_PKT_TYPE);
+
+ return 0;
+}
+
+static int cmd_change_conn_pkt_type_complete(struct btdev *dev,
+ const void *data, uint8_t len)
+{
+ const struct bt_hci_cmd_change_conn_pkt_type *cmd = data;
+ struct bt_hci_evt_conn_pkt_type_changed ev;
+ struct btdev_conn *conn;
+
+ conn = queue_find(dev->conns, match_handle,
+ UINT_TO_PTR(cpu_to_le16(cmd->handle)));
+ if (!conn)
+ return 0;
+
+ memset(&ev, 0, sizeof(ev));
+ ev.status = BT_HCI_ERR_SUCCESS;
+ ev.handle = cmd->handle;
+ ev.pkt_type = cmd->pkt_type;
+
+ send_event(dev, BT_HCI_EVT_CONN_PKT_TYPE_CHANGED, &ev, sizeof(ev));
+
+ return 0;
+}
+
static int cmd_auth_requested(struct btdev *dev, const void *data, uint8_t len)
{
cmd_status(dev, BT_HCI_ERR_SUCCESS, BT_HCI_CMD_AUTH_REQUESTED);
@@ -2789,6 +2828,9 @@ static int cmd_enable_dut_mode(struct btdev *dev, const void *data,
CMD(BT_HCI_CMD_PIN_CODE_REQUEST_NEG_REPLY, \
cmd_pin_code_neg_reply, \
cmd_pin_code_neg_reply_complete), \
+ CMD(BT_HCI_CMD_CHANGE_CONN_PKT_TYPE, \
+ cmd_change_conn_pkt_type, \
+ cmd_change_conn_pkt_type_complete), \
CMD(BT_HCI_CMD_AUTH_REQUESTED, cmd_auth_requested, \
cmd_auth_requested_complete), \
CMD(BT_HCI_CMD_SET_CONN_ENCRYPT, cmd_set_conn_encrypt, \
--
2.52.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH BlueZ v1 2/3] emulator: Add support for BT_HCI_CMD_LE_SET_PHY
2025-12-17 20:41 [PATCH BlueZ v1 1/3] emulator: Add support for BT_HCI_CMD_CHANGE_CONN_PKT_TYPE Luiz Augusto von Dentz
@ 2025-12-17 20:41 ` Luiz Augusto von Dentz
2025-12-17 20:41 ` [PATCH BlueZ v1 3/3] tools/l2cap-tester: Add tests for setting BT_PHY Luiz Augusto von Dentz
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Luiz Augusto von Dentz @ 2025-12-17 20:41 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This adds support for BT_HCI_CMD_LE_SET_PHY as well as
emit BT_HCI_EVT_LE_PHY_UPDATE_COMPLETE when it completes.
---
emulator/btdev.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 74 insertions(+)
diff --git a/emulator/btdev.c b/emulator/btdev.c
index 41e9c68f5f45..be43623e8bfb 100644
--- a/emulator/btdev.c
+++ b/emulator/btdev.c
@@ -5082,6 +5082,79 @@ static int cmd_set_default_phy(struct btdev *dev, const void *data,
return 0;
}
+static int cmd_le_set_phy(struct btdev *dev, const void *data,
+ uint8_t len)
+{
+ const struct bt_hci_cmd_le_set_phy *cmd = data;
+ struct btdev_conn *conn;
+ uint8_t status;
+
+ conn = queue_find(dev->conns, match_handle,
+ UINT_TO_PTR(cpu_to_le16(cmd->handle)));
+ if (!conn) {
+ status = BT_HCI_ERR_UNKNOWN_CONN_ID;
+ goto done;
+ }
+
+ if (cmd->all_phys > 0x03 || (!(cmd->all_phys & 0x01) &&
+ (!cmd->tx_phys || cmd->tx_phys > 0x07)) ||
+ (!(cmd->all_phys & 0x02) &&
+ (!cmd->rx_phys || cmd->rx_phys > 0x07)))
+ status = BT_HCI_ERR_INVALID_PARAMETERS;
+ else
+ status = BT_HCI_ERR_SUCCESS;
+
+done:
+ cmd_status(dev, status, BT_HCI_CMD_LE_SET_PHY);
+
+ return 0;
+}
+
+static int cmd_le_set_phy_complete(struct btdev *dev, const void *data,
+ uint8_t len)
+{
+ const struct bt_hci_cmd_le_set_phy *cmd = data;
+ struct bt_hci_evt_le_phy_update_complete ev;
+ struct btdev_conn *conn;
+
+ conn = queue_find(dev->conns, match_handle,
+ UINT_TO_PTR(cpu_to_le16(cmd->handle)));
+ if (!conn)
+ return 0;
+
+ if (cmd->all_phys > 0x03 || (!(cmd->all_phys & 0x01) &&
+ (!cmd->tx_phys || cmd->tx_phys > 0x07)) ||
+ (!(cmd->all_phys & 0x02) &&
+ (!cmd->rx_phys || cmd->rx_phys > 0x07)))
+ return 0;
+
+ memset(&ev, 0, sizeof(ev));
+ ev.handle = cmd->handle;
+
+ /* Use the highest PHY possible */
+ if (cmd->tx_phys & BIT(0))
+ ev.tx_phy = 0x01; /* LE 1M PHY */
+
+ if (cmd->rx_phys & BIT(0))
+ ev.rx_phy = 0x01; /* LE 1M PHY */
+
+ if (cmd->tx_phys & BIT(1))
+ ev.tx_phy |= 0x02; /* LE 2M PHY */
+
+ if (cmd->rx_phys & BIT(1))
+ ev.rx_phy |= 0x02; /* LE 2M PHY */
+
+ if (cmd->tx_phys & BIT(2))
+ ev.tx_phy |= 0x03; /* LE CODED PHY */
+
+ if (cmd->rx_phys & BIT(2))
+ ev.rx_phy |= 0x03; /* LE CODED PHY */
+
+ le_meta_event(dev, BT_HCI_EVT_LE_PHY_UPDATE_COMPLETE, &ev, sizeof(ev));
+
+ return 0;
+}
+
static const uint8_t *ext_adv_gen_rpa(const struct btdev *dev,
struct le_ext_adv *adv)
{
@@ -6335,6 +6408,7 @@ done:
#define CMD_LE_50 \
CMD(BT_HCI_CMD_LE_SET_DEFAULT_PHY, cmd_set_default_phy, NULL), \
+ CMD(BT_HCI_CMD_LE_SET_PHY, cmd_le_set_phy, cmd_le_set_phy_complete), \
CMD(BT_HCI_CMD_LE_SET_ADV_SET_RAND_ADDR, cmd_set_adv_rand_addr, NULL), \
CMD(BT_HCI_CMD_LE_SET_EXT_ADV_PARAMS, cmd_set_ext_adv_params, NULL), \
CMD(BT_HCI_CMD_LE_SET_EXT_ADV_DATA, cmd_set_ext_adv_data, NULL), \
--
2.52.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH BlueZ v1 3/3] tools/l2cap-tester: Add tests for setting BT_PHY
2025-12-17 20:41 [PATCH BlueZ v1 1/3] emulator: Add support for BT_HCI_CMD_CHANGE_CONN_PKT_TYPE Luiz Augusto von Dentz
2025-12-17 20:41 ` [PATCH BlueZ v1 2/3] emulator: Add support for BT_HCI_CMD_LE_SET_PHY Luiz Augusto von Dentz
@ 2025-12-17 20:41 ` Luiz Augusto von Dentz
2025-12-17 21:39 ` [BlueZ,v1,1/3] emulator: Add support for BT_HCI_CMD_CHANGE_CONN_PKT_TYPE bluez.test.bot
2025-12-18 20:40 ` [PATCH BlueZ v1 1/3] " patchwork-bot+bluetooth
3 siblings, 0 replies; 5+ messages in thread
From: Luiz Augusto von Dentz @ 2025-12-17 20:41 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This adds the following tests that use setsockopt(BT_PHY):
L2CAP BR/EDR Client - Set PHY 1M
L2CAP BR/EDR Client - Set PHY 2M
L2CAP BR/EDR Client - Set PHY 3M
L2CAP BR/EDR Server - Set PHY 1M
L2CAP BR/EDR Server - Set PHY 2M
L2CAP BR/EDR Server - Set PHY 3M
L2CAP LE Client - Set PHY 1M
L2CAP LE Client - Set PHY 2M
L2CAP LE Client - Set PHY Coded
L2CAP LE Server - Set PHY 1M
L2CAP LE Server - Set PHY 2M
L2CAP LE Server - Set PHY Coded
L2CAP Ext-Flowctl Client - Set PHY 1M
L2CAP Ext-Flowctl Client - Set PHY 2M
L2CAP Ext-Flowctl Client - Set PHY Coded
L2CAP Ext-Flowctl Server - Set PHY 1M
L2CAP Ext-Flowctl Server - Set PHY 2M
L2CAP Ext-Flowctl Server - Set PHY Coded
---
tools/l2cap-tester.c | 342 ++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 334 insertions(+), 8 deletions(-)
diff --git a/tools/l2cap-tester.c b/tools/l2cap-tester.c
index 4cb56e98078a..c3aa96f84ea0 100644
--- a/tools/l2cap-tester.c
+++ b/tools/l2cap-tester.c
@@ -109,6 +109,9 @@ struct l2cap_data {
/* Expected supported PHYs */
uint32_t phys;
+
+ /* Set PHY */
+ uint32_t phy;
};
static void print_debug(const char *str, void *user_data)
@@ -426,6 +429,35 @@ static const struct l2cap_data client_connect_phy_test_1 = {
BT_PHY_EDR_3M_1SLOT | BT_PHY_EDR_3M_3SLOT | BT_PHY_EDR_3M_5SLOT),
};
+static const struct l2cap_data client_connect_phy_1m_test = {
+ .client_psm = 0x1001,
+ .server_psm = 0x1001,
+ .phys = (BT_PHY_BR_1M_1SLOT |
+ BT_PHY_EDR_2M_1SLOT | BT_PHY_EDR_2M_3SLOT | BT_PHY_EDR_2M_5SLOT |
+ BT_PHY_EDR_3M_1SLOT | BT_PHY_EDR_3M_3SLOT | BT_PHY_EDR_3M_5SLOT),
+ .phy = BT_PHY_BR_1M_1SLOT,
+};
+
+static const struct l2cap_data client_connect_phy_2m_test = {
+ .client_psm = 0x1001,
+ .server_psm = 0x1001,
+ .phys = (BT_PHY_BR_1M_1SLOT |
+ BT_PHY_EDR_2M_1SLOT | BT_PHY_EDR_2M_3SLOT | BT_PHY_EDR_2M_5SLOT |
+ BT_PHY_EDR_3M_1SLOT | BT_PHY_EDR_3M_3SLOT | BT_PHY_EDR_3M_5SLOT),
+ .phy = (BT_PHY_BR_1M_1SLOT |
+ BT_PHY_EDR_2M_1SLOT | BT_PHY_EDR_2M_3SLOT | BT_PHY_EDR_2M_5SLOT),
+};
+
+static const struct l2cap_data client_connect_phy_3m_test = {
+ .client_psm = 0x1001,
+ .server_psm = 0x1001,
+ .phys = (BT_PHY_BR_1M_1SLOT |
+ BT_PHY_EDR_2M_1SLOT | BT_PHY_EDR_2M_3SLOT | BT_PHY_EDR_2M_5SLOT |
+ BT_PHY_EDR_3M_1SLOT | BT_PHY_EDR_3M_3SLOT | BT_PHY_EDR_3M_5SLOT),
+ .phy = (BT_PHY_BR_1M_1SLOT |
+ BT_PHY_EDR_3M_1SLOT | BT_PHY_EDR_3M_3SLOT | BT_PHY_EDR_3M_5SLOT),
+};
+
static const struct l2cap_data client_connect_nval_psm_test_1 = {
.client_psm = 0x1001,
.expect_err = ECONNREFUSED,
@@ -573,6 +605,44 @@ static const struct l2cap_data l2cap_server_phy_test = {
BT_PHY_EDR_3M_1SLOT | BT_PHY_EDR_3M_3SLOT | BT_PHY_EDR_3M_5SLOT),
};
+static const struct l2cap_data l2cap_server_phy_1m_test = {
+ .server_psm = 0x1001,
+ .send_cmd_code = BT_L2CAP_PDU_CONN_REQ,
+ .send_cmd = l2cap_connect_req,
+ .send_cmd_len = sizeof(l2cap_connect_req),
+ .expect_cmd_code = BT_L2CAP_PDU_CONN_RSP,
+ .phys = (BT_PHY_BR_1M_1SLOT |
+ BT_PHY_EDR_2M_1SLOT | BT_PHY_EDR_2M_3SLOT | BT_PHY_EDR_2M_5SLOT |
+ BT_PHY_EDR_3M_1SLOT | BT_PHY_EDR_3M_3SLOT | BT_PHY_EDR_3M_5SLOT),
+ .phy = BT_PHY_BR_1M_1SLOT,
+};
+
+static const struct l2cap_data l2cap_server_phy_2m_test = {
+ .server_psm = 0x1001,
+ .send_cmd_code = BT_L2CAP_PDU_CONN_REQ,
+ .send_cmd = l2cap_connect_req,
+ .send_cmd_len = sizeof(l2cap_connect_req),
+ .expect_cmd_code = BT_L2CAP_PDU_CONN_RSP,
+ .phys = (BT_PHY_BR_1M_1SLOT |
+ BT_PHY_EDR_2M_1SLOT | BT_PHY_EDR_2M_3SLOT | BT_PHY_EDR_2M_5SLOT |
+ BT_PHY_EDR_3M_1SLOT | BT_PHY_EDR_3M_3SLOT | BT_PHY_EDR_3M_5SLOT),
+ .phy = (BT_PHY_BR_1M_1SLOT |
+ BT_PHY_EDR_2M_1SLOT | BT_PHY_EDR_2M_3SLOT | BT_PHY_EDR_2M_5SLOT),
+};
+
+static const struct l2cap_data l2cap_server_phy_3m_test = {
+ .server_psm = 0x1001,
+ .send_cmd_code = BT_L2CAP_PDU_CONN_REQ,
+ .send_cmd = l2cap_connect_req,
+ .send_cmd_len = sizeof(l2cap_connect_req),
+ .expect_cmd_code = BT_L2CAP_PDU_CONN_RSP,
+ .phys = (BT_PHY_BR_1M_1SLOT |
+ BT_PHY_EDR_2M_1SLOT | BT_PHY_EDR_2M_3SLOT | BT_PHY_EDR_2M_5SLOT |
+ BT_PHY_EDR_3M_1SLOT | BT_PHY_EDR_3M_3SLOT | BT_PHY_EDR_3M_5SLOT),
+ .phy = (BT_PHY_BR_1M_1SLOT |
+ BT_PHY_EDR_3M_1SLOT | BT_PHY_EDR_3M_3SLOT | BT_PHY_EDR_3M_5SLOT),
+};
+
static const struct l2cap_data le_client_connect_success_test_1 = {
.client_psm = 0x0080,
.server_psm = 0x0080,
@@ -706,6 +776,33 @@ static const struct l2cap_data le_client_connect_phy_2m_coded_test_1 = {
BT_PHY_LE_CODED_TX | BT_PHY_LE_CODED_RX),
};
+static const struct l2cap_data le_client_set_phy_1m_test = {
+ .client_psm = 0x0080,
+ .server_psm = 0x0080,
+ .phys = (BT_PHY_LE_1M_TX | BT_PHY_LE_1M_RX |
+ BT_PHY_LE_2M_TX | BT_PHY_LE_2M_RX |
+ BT_PHY_LE_CODED_TX | BT_PHY_LE_CODED_RX),
+ .phy = BT_PHY_LE_1M_TX | BT_PHY_LE_1M_RX,
+};
+
+static const struct l2cap_data le_client_set_phy_2m_test = {
+ .client_psm = 0x0080,
+ .server_psm = 0x0080,
+ .phys = (BT_PHY_LE_1M_TX | BT_PHY_LE_1M_RX |
+ BT_PHY_LE_2M_TX | BT_PHY_LE_2M_RX |
+ BT_PHY_LE_CODED_TX | BT_PHY_LE_CODED_RX),
+ .phy = BT_PHY_LE_2M_TX | BT_PHY_LE_2M_RX,
+};
+
+static const struct l2cap_data le_client_set_phy_coded_test = {
+ .client_psm = 0x0080,
+ .server_psm = 0x0080,
+ .phys = (BT_PHY_LE_1M_TX | BT_PHY_LE_1M_RX |
+ BT_PHY_LE_2M_TX | BT_PHY_LE_2M_RX |
+ BT_PHY_LE_CODED_TX | BT_PHY_LE_CODED_RX),
+ .phy = BT_PHY_LE_CODED_TX | BT_PHY_LE_CODED_RX,
+};
+
static uint8_t nonexisting_bdaddr[] = {0x00, 0xAA, 0x01, 0x02, 0x03, 0x00};
static const struct l2cap_data le_client_close_socket_test_1 = {
.client_psm = 0x0080,
@@ -807,6 +904,48 @@ static const struct l2cap_data le_server_phy_2m_coded_test = {
BT_PHY_LE_CODED_TX | BT_PHY_LE_CODED_RX),
};
+static const struct l2cap_data le_server_set_phy_1m_test = {
+ .server_psm = 0x0080,
+ .send_cmd_code = BT_L2CAP_PDU_LE_CONN_REQ,
+ .send_cmd = le_connect_req,
+ .send_cmd_len = sizeof(le_connect_req),
+ .expect_cmd_code = BT_L2CAP_PDU_LE_CONN_RSP,
+ .expect_cmd = le_connect_rsp,
+ .expect_cmd_len = sizeof(le_connect_rsp),
+ .phys = (BT_PHY_LE_1M_TX | BT_PHY_LE_1M_RX |
+ BT_PHY_LE_2M_TX | BT_PHY_LE_2M_RX |
+ BT_PHY_LE_CODED_TX | BT_PHY_LE_CODED_RX),
+ .phy = BT_PHY_LE_1M_TX | BT_PHY_LE_1M_RX,
+};
+
+static const struct l2cap_data le_server_set_phy_2m_test = {
+ .server_psm = 0x0080,
+ .send_cmd_code = BT_L2CAP_PDU_LE_CONN_REQ,
+ .send_cmd = le_connect_req,
+ .send_cmd_len = sizeof(le_connect_req),
+ .expect_cmd_code = BT_L2CAP_PDU_LE_CONN_RSP,
+ .expect_cmd = le_connect_rsp,
+ .expect_cmd_len = sizeof(le_connect_rsp),
+ .phys = (BT_PHY_LE_1M_TX | BT_PHY_LE_1M_RX |
+ BT_PHY_LE_2M_TX | BT_PHY_LE_2M_RX |
+ BT_PHY_LE_CODED_TX | BT_PHY_LE_CODED_RX),
+ .phy = BT_PHY_LE_2M_TX | BT_PHY_LE_2M_RX,
+};
+
+static const struct l2cap_data le_server_set_phy_coded_test = {
+ .server_psm = 0x0080,
+ .send_cmd_code = BT_L2CAP_PDU_LE_CONN_REQ,
+ .send_cmd = le_connect_req,
+ .send_cmd_len = sizeof(le_connect_req),
+ .expect_cmd_code = BT_L2CAP_PDU_LE_CONN_RSP,
+ .expect_cmd = le_connect_rsp,
+ .expect_cmd_len = sizeof(le_connect_rsp),
+ .phys = (BT_PHY_LE_1M_TX | BT_PHY_LE_1M_RX |
+ BT_PHY_LE_2M_TX | BT_PHY_LE_2M_RX |
+ BT_PHY_LE_CODED_TX | BT_PHY_LE_CODED_RX),
+ .phy = BT_PHY_LE_CODED_TX | BT_PHY_LE_CODED_RX,
+};
+
static const uint8_t ecred_connect_req[] = { 0x80, 0x00, /* PSM */
0x40, 0x00, /* MTU */
0x40, 0x00, /* MPS */
@@ -889,6 +1028,48 @@ static const struct l2cap_data ext_flowctl_server_phy_2m_coded_test = {
BT_PHY_LE_CODED_TX | BT_PHY_LE_CODED_RX),
};
+static const struct l2cap_data ext_flowctl_server_set_phy_1m_test = {
+ .server_psm = 0x0080,
+ .send_cmd_code = BT_L2CAP_PDU_ECRED_CONN_REQ,
+ .send_cmd = ecred_connect_req,
+ .send_cmd_len = sizeof(ecred_connect_req),
+ .expect_cmd_code = BT_L2CAP_PDU_ECRED_CONN_RSP,
+ .expect_cmd = ecred_connect_rsp,
+ .expect_cmd_len = sizeof(ecred_connect_rsp),
+ .phys = (BT_PHY_LE_1M_TX | BT_PHY_LE_1M_RX |
+ BT_PHY_LE_2M_TX | BT_PHY_LE_2M_RX |
+ BT_PHY_LE_CODED_TX | BT_PHY_LE_CODED_RX),
+ .phy = BT_PHY_LE_1M_TX | BT_PHY_LE_1M_RX,
+};
+
+static const struct l2cap_data ext_flowctl_server_set_phy_2m_test = {
+ .server_psm = 0x0080,
+ .send_cmd_code = BT_L2CAP_PDU_ECRED_CONN_REQ,
+ .send_cmd = ecred_connect_req,
+ .send_cmd_len = sizeof(ecred_connect_req),
+ .expect_cmd_code = BT_L2CAP_PDU_ECRED_CONN_RSP,
+ .expect_cmd = ecred_connect_rsp,
+ .expect_cmd_len = sizeof(ecred_connect_rsp),
+ .phys = (BT_PHY_LE_1M_TX | BT_PHY_LE_1M_RX |
+ BT_PHY_LE_2M_TX | BT_PHY_LE_2M_RX |
+ BT_PHY_LE_CODED_TX | BT_PHY_LE_CODED_RX),
+ .phy = BT_PHY_LE_2M_TX | BT_PHY_LE_2M_RX,
+};
+
+static const struct l2cap_data ext_flowctl_server_set_phy_coded_test = {
+ .server_psm = 0x0080,
+ .send_cmd_code = BT_L2CAP_PDU_ECRED_CONN_REQ,
+ .send_cmd = ecred_connect_req,
+ .send_cmd_len = sizeof(ecred_connect_req),
+ .expect_cmd_code = BT_L2CAP_PDU_ECRED_CONN_RSP,
+ .expect_cmd = ecred_connect_rsp,
+ .expect_cmd_len = sizeof(ecred_connect_rsp),
+ .phys = (BT_PHY_LE_1M_TX | BT_PHY_LE_1M_RX |
+ BT_PHY_LE_2M_TX | BT_PHY_LE_2M_RX |
+ BT_PHY_LE_CODED_TX | BT_PHY_LE_CODED_RX),
+ .phy = BT_PHY_LE_CODED_TX | BT_PHY_LE_CODED_RX,
+};
+
static const struct l2cap_data le_att_client_connect_success_test_1 = {
.cid = 0x0004,
.sec_level = BT_SECURITY_LOW,
@@ -1031,6 +1212,36 @@ static const struct l2cap_data ext_flowctl_client_phy_2m_coded_test_1 = {
BT_PHY_LE_CODED_TX | BT_PHY_LE_CODED_RX),
};
+static const struct l2cap_data ext_flowctl_client_set_phy_1m_test = {
+ .client_psm = 0x0080,
+ .server_psm = 0x0080,
+ .mode = BT_MODE_EXT_FLOWCTL,
+ .phys = (BT_PHY_LE_1M_TX | BT_PHY_LE_1M_RX |
+ BT_PHY_LE_2M_TX | BT_PHY_LE_2M_RX |
+ BT_PHY_LE_CODED_TX | BT_PHY_LE_CODED_RX),
+ .phy = BT_PHY_LE_1M_TX | BT_PHY_LE_1M_RX,
+};
+
+static const struct l2cap_data ext_flowctl_client_set_phy_2m_test = {
+ .client_psm = 0x0080,
+ .server_psm = 0x0080,
+ .mode = BT_MODE_EXT_FLOWCTL,
+ .phys = (BT_PHY_LE_1M_TX | BT_PHY_LE_1M_RX |
+ BT_PHY_LE_2M_TX | BT_PHY_LE_2M_RX |
+ BT_PHY_LE_CODED_TX | BT_PHY_LE_CODED_RX),
+ .phy = BT_PHY_LE_2M_TX | BT_PHY_LE_2M_RX,
+};
+
+static const struct l2cap_data ext_flowctl_client_set_phy_coded_test = {
+ .client_psm = 0x0080,
+ .server_psm = 0x0080,
+ .mode = BT_MODE_EXT_FLOWCTL,
+ .phys = (BT_PHY_LE_1M_TX | BT_PHY_LE_1M_RX |
+ BT_PHY_LE_2M_TX | BT_PHY_LE_2M_RX |
+ BT_PHY_LE_CODED_TX | BT_PHY_LE_CODED_RX),
+ .phy = BT_PHY_LE_CODED_TX | BT_PHY_LE_CODED_RX,
+};
+
static void client_cmd_complete(uint16_t opcode, uint8_t status,
const void *param, uint8_t len,
void *user_data)
@@ -1492,7 +1703,40 @@ static bool check_mtu(struct test_data *data, int sk)
return true;
}
-static bool check_phys(struct test_data *data,int sk)
+static gboolean check_phy(gpointer args)
+{
+ int sk = PTR_TO_INT(args);
+ struct test_data *data = tester_get_data();
+ const struct l2cap_data *l2data = data->test_data;
+ socklen_t len;
+
+ len = sizeof(data->phys);
+ data->phys = 0;
+
+ tester_print("Checking PHY...");
+
+ if (getsockopt(sk, SOL_BLUETOOTH, BT_PHY, &data->phys, &len) < 0) {
+ tester_warn("getsockopt(BT_PHY): %s (%d)",
+ strerror(errno), errno);
+ tester_test_failed();
+ goto done;
+ }
+
+ if (l2data->phy && l2data->phy != data->phys) {
+ tester_warn("phy 0x%08x != 0x%08x", l2data->phy, data->phys);
+ tester_test_failed();
+ goto done;
+ }
+
+ tester_test_passed();
+
+done:
+ shutdown(sk, SHUT_WR);
+
+ return FALSE;
+}
+
+static int check_phys(struct test_data *data, int sk)
{
const struct l2cap_data *l2data = data->test_data;
socklen_t len;
@@ -1503,15 +1747,29 @@ static bool check_phys(struct test_data *data,int sk)
if (getsockopt(sk, SOL_BLUETOOTH, BT_PHY, &data->phys, &len) < 0) {
tester_warn("getsockopt(BT_PHY): %s (%d)",
strerror(errno), errno);
- return false;
+ return -errno;
}
if (l2data->phys && l2data->phys != data->phys) {
tester_warn("phys 0x%08x != 0x%08x", l2data->phys, data->phys);
- return false;
+ return -EINVAL;
}
- return true;
+ if (l2data->phy) {
+ if (setsockopt(sk, SOL_BLUETOOTH, BT_PHY, &l2data->phy,
+ sizeof(l2data->phy)) < 0) {
+ tester_warn("setsockopt(BT_PHY): %s (%d)",
+ strerror(errno), errno);
+ return -errno;
+ }
+
+ /* Wait for the PHY to change */
+ g_idle_add(check_phy, INT_TO_PTR(sk));
+
+ return -EINPROGRESS;
+ }
+
+ return 0;
}
static gboolean recv_errqueue(GIOChannel *io, GIOCondition cond,
@@ -1689,7 +1947,12 @@ static gboolean l2cap_connect_cb(GIOChannel *io, GIOCondition cond,
return FALSE;
}
- if (!check_phys(data, sk)) {
+ err = check_phys(data, sk);
+ if (err < 0) {
+ if (err == -EINPROGRESS) {
+ g_io_add_watch(io, G_IO_HUP, socket_closed_cb, NULL);
+ return FALSE;
+ }
tester_test_failed();
return FALSE;
}
@@ -2405,7 +2668,7 @@ static gboolean l2cap_accept_cb(GIOChannel *io, GIOCondition cond,
{
struct test_data *data = tester_get_data();
const struct l2cap_data *l2data = data->test_data;
- int sk;
+ int sk, err;
sk = g_io_channel_unix_get_fd(io);
@@ -2414,7 +2677,12 @@ static gboolean l2cap_accept_cb(GIOChannel *io, GIOCondition cond,
return FALSE;
}
- if (!check_phys(data, sk)) {
+ err = check_phys(data, sk);
+ if (err < 0) {
+ if (err == -EINPROGRESS) {
+ g_io_add_watch(io, G_IO_HUP, socket_closed_cb, NULL);
+ return FALSE;
+ }
tester_test_failed();
return FALSE;
}
@@ -2532,7 +2800,8 @@ static void client_l2cap_rsp(uint8_t code, const void *data, uint16_t len,
}
if (!l2data->expect_cmd) {
- tester_test_passed();
+ if (!l2data->phy)
+ tester_test_passed();
return;
}
@@ -2547,6 +2816,9 @@ static void client_l2cap_rsp(uint8_t code, const void *data, uint16_t len,
goto failed;
}
+ if (l2data->phy)
+ return;
+
tester_test_passed();
return;
@@ -2771,6 +3043,15 @@ int main(int argc, char *argv[])
test_l2cap_bredr("L2CAP BR/EDR Client - PHY",
&client_connect_phy_test_1,
setup_powered_client, test_connect);
+ test_l2cap_bredr("L2CAP BR/EDR Client - Set PHY 1M",
+ &client_connect_phy_1m_test,
+ setup_powered_client, test_connect);
+ test_l2cap_bredr("L2CAP BR/EDR Client - Set PHY 2M",
+ &client_connect_phy_2m_test,
+ setup_powered_client, test_connect);
+ test_l2cap_bredr("L2CAP BR/EDR Client - Set PHY 3M",
+ &client_connect_phy_3m_test,
+ setup_powered_client, test_connect);
test_l2cap_bredr("L2CAP BR/EDR Server - Success",
&l2cap_server_success_test,
@@ -2811,6 +3092,15 @@ int main(int argc, char *argv[])
test_l2cap_bredr("L2CAP BR/EDR Server - PHY",
&l2cap_server_phy_test,
setup_powered_server, test_server);
+ test_l2cap_bredr("L2CAP BR/EDR Server - Set PHY 1M",
+ &l2cap_server_phy_1m_test,
+ setup_powered_server, test_server);
+ test_l2cap_bredr("L2CAP BR/EDR Server - Set PHY 2M",
+ &l2cap_server_phy_2m_test,
+ setup_powered_server, test_server);
+ test_l2cap_bredr("L2CAP BR/EDR Server - Set PHY 3M",
+ &l2cap_server_phy_3m_test,
+ setup_powered_server, test_server);
test_l2cap_bredr("L2CAP BR/EDR Ethtool Get Ts Info - Success", NULL,
setup_powered_server, test_l2cap_ethtool_get_ts_info);
@@ -2863,6 +3153,15 @@ int main(int argc, char *argv[])
test_l2cap_le_52("L2CAP LE Client - PHY 2M/Coded",
&le_client_connect_phy_2m_coded_test_1,
setup_powered_client, test_connect);
+ test_l2cap_le_52("L2CAP LE Client - Set PHY 1M",
+ &le_client_set_phy_1m_test,
+ setup_powered_client, test_connect);
+ test_l2cap_le_52("L2CAP LE Client - Set PHY 2M",
+ &le_client_set_phy_2m_test,
+ setup_powered_client, test_connect);
+ test_l2cap_le_52("L2CAP LE Client - Set PHY Coded",
+ &le_client_set_phy_coded_test,
+ setup_powered_client, test_connect);
test_l2cap_le("L2CAP LE Client - Close socket 1",
&le_client_close_socket_test_1,
@@ -2896,6 +3195,15 @@ int main(int argc, char *argv[])
test_l2cap_le_52("L2CAP LE Server - PHY 2M/Coded",
&le_server_phy_2m_coded_test,
setup_powered_server, test_server);
+ test_l2cap_le_52("L2CAP LE Server - Set PHY 1M",
+ &le_server_set_phy_1m_test,
+ setup_powered_server, test_server);
+ test_l2cap_le_52("L2CAP LE Server - Set PHY 2M",
+ &le_server_set_phy_2m_test,
+ setup_powered_server, test_server);
+ test_l2cap_le_52("L2CAP LE Server - Set PHY Coded",
+ &le_server_set_phy_coded_test,
+ setup_powered_server, test_server);
test_l2cap_le("L2CAP Ext-Flowctl Client - Success",
&ext_flowctl_client_connect_success_test_1,
@@ -2932,6 +3240,15 @@ int main(int argc, char *argv[])
test_l2cap_le_52("L2CAP Ext-Flowctl Client - PHY 2M/Coded",
&ext_flowctl_client_phy_2m_coded_test_1,
setup_powered_client, test_connect);
+ test_l2cap_le_52("L2CAP Ext-Flowctl Client - Set PHY 1M",
+ &ext_flowctl_client_set_phy_1m_test,
+ setup_powered_client, test_connect);
+ test_l2cap_le_52("L2CAP Ext-Flowctl Client - Set PHY 2M",
+ &ext_flowctl_client_set_phy_2m_test,
+ setup_powered_client, test_connect);
+ test_l2cap_le_52("L2CAP Ext-Flowctl Client - Set PHY Coded",
+ &ext_flowctl_client_set_phy_coded_test,
+ setup_powered_client, test_connect);
test_l2cap_le("L2CAP Ext-Flowctl Server - Success",
&ext_flowctl_server_success_test,
@@ -2945,6 +3262,15 @@ int main(int argc, char *argv[])
test_l2cap_le_52("L2CAP Ext-Flowctl Server - PHY 2M/Coded",
&ext_flowctl_server_phy_2m_coded_test,
setup_powered_server, test_server);
+ test_l2cap_le_52("L2CAP Ext-Flowctl Server - Set PHY 1M",
+ &ext_flowctl_server_set_phy_1m_test,
+ setup_powered_server, test_server);
+ test_l2cap_le_52("L2CAP Ext-Flowctl Server - Set PHY 2M",
+ &ext_flowctl_server_set_phy_2m_test,
+ setup_powered_server, test_server);
+ test_l2cap_le_52("L2CAP Ext-Flowctl Server - Set PHY Coded",
+ &ext_flowctl_server_set_phy_coded_test,
+ setup_powered_server, test_server);
test_l2cap_le("L2CAP LE ATT Client - Success",
&le_att_client_connect_success_test_1,
--
2.52.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* RE: [BlueZ,v1,1/3] emulator: Add support for BT_HCI_CMD_CHANGE_CONN_PKT_TYPE
2025-12-17 20:41 [PATCH BlueZ v1 1/3] emulator: Add support for BT_HCI_CMD_CHANGE_CONN_PKT_TYPE Luiz Augusto von Dentz
2025-12-17 20:41 ` [PATCH BlueZ v1 2/3] emulator: Add support for BT_HCI_CMD_LE_SET_PHY Luiz Augusto von Dentz
2025-12-17 20:41 ` [PATCH BlueZ v1 3/3] tools/l2cap-tester: Add tests for setting BT_PHY Luiz Augusto von Dentz
@ 2025-12-17 21:39 ` bluez.test.bot
2025-12-18 20:40 ` [PATCH BlueZ v1 1/3] " patchwork-bot+bluetooth
3 siblings, 0 replies; 5+ messages in thread
From: bluez.test.bot @ 2025-12-17 21:39 UTC (permalink / raw)
To: linux-bluetooth, luiz.dentz
[-- Attachment #1: Type: text/plain, Size: 1492 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=1034336
---Test result---
Test Summary:
CheckPatch PENDING 0.45 seconds
GitLint PENDING 0.40 seconds
BuildEll PASS 20.18 seconds
BluezMake PASS 654.20 seconds
MakeCheck PASS 22.02 seconds
MakeDistcheck PASS 246.24 seconds
CheckValgrind PASS 304.13 seconds
CheckSmatch WARNING 353.48 seconds
bluezmakeextell PASS 183.24 seconds
IncrementalBuild PENDING 0.45 seconds
ScanBuild PASS 1034.54 seconds
Details
##############################
Test: CheckPatch - PENDING
Desc: Run checkpatch.pl script
Output:
##############################
Test: GitLint - PENDING
Desc: Run gitlint
Output:
##############################
Test: CheckSmatch - WARNING
Desc: Run smatch tool with source
Output:
emulator/btdev.c:470:29: warning: Variable length array is used.emulator/btdev.c:470:29: warning: Variable length array is used.
##############################
Test: IncrementalBuild - PENDING
Desc: Incremental build with the patches in the series
Output:
---
Regards,
Linux Bluetooth
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH BlueZ v1 1/3] emulator: Add support for BT_HCI_CMD_CHANGE_CONN_PKT_TYPE
2025-12-17 20:41 [PATCH BlueZ v1 1/3] emulator: Add support for BT_HCI_CMD_CHANGE_CONN_PKT_TYPE Luiz Augusto von Dentz
` (2 preceding siblings ...)
2025-12-17 21:39 ` [BlueZ,v1,1/3] emulator: Add support for BT_HCI_CMD_CHANGE_CONN_PKT_TYPE bluez.test.bot
@ 2025-12-18 20:40 ` patchwork-bot+bluetooth
3 siblings, 0 replies; 5+ messages in thread
From: patchwork-bot+bluetooth @ 2025-12-18 20:40 UTC (permalink / raw)
To: Luiz Augusto von Dentz; +Cc: linux-bluetooth
Hello:
This series was applied to bluetooth/bluez.git (master)
by Luiz Augusto von Dentz <luiz.von.dentz@intel.com>:
On Wed, 17 Dec 2025 15:41:31 -0500 you wrote:
> From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
>
> This adds support for BT_HCI_CMD_CHANGE_CONN_PKT_TYPE as well as
> emit BT_HCI_EVT_CONN_PKT_TYPE_CHANGED when it completes.
> ---
> emulator/btdev.c | 42 ++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 42 insertions(+)
Here is the summary with links:
- [BlueZ,v1,1/3] emulator: Add support for BT_HCI_CMD_CHANGE_CONN_PKT_TYPE
https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=c599007776a8
- [BlueZ,v1,2/3] emulator: Add support for BT_HCI_CMD_LE_SET_PHY
https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=87bafc8d2dd5
- [BlueZ,v1,3/3] tools/l2cap-tester: Add tests for setting BT_PHY
https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=a431702e9ec2
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2025-12-18 20:43 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-12-17 20:41 [PATCH BlueZ v1 1/3] emulator: Add support for BT_HCI_CMD_CHANGE_CONN_PKT_TYPE Luiz Augusto von Dentz
2025-12-17 20:41 ` [PATCH BlueZ v1 2/3] emulator: Add support for BT_HCI_CMD_LE_SET_PHY Luiz Augusto von Dentz
2025-12-17 20:41 ` [PATCH BlueZ v1 3/3] tools/l2cap-tester: Add tests for setting BT_PHY Luiz Augusto von Dentz
2025-12-17 21:39 ` [BlueZ,v1,1/3] emulator: Add support for BT_HCI_CMD_CHANGE_CONN_PKT_TYPE bluez.test.bot
2025-12-18 20:40 ` [PATCH BlueZ v1 1/3] " patchwork-bot+bluetooth
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).