From 76559f27fd6e9219516c9ee7deebbdf5b3116105 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20Battrel?= Date: Tue, 7 May 2024 13:14:59 +0200 Subject: [PATCH] Bluetooth: Host: Map HCI cmd disallowed to errno MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Make `bt_hci_cmd_send_sync` return `-EACCES` when receiving `BT_HCI_ERR_CMD_DISALLOWED`. Update some tests that were expecting `-EIO` when getting `BT_HCI_ERR_CMD_DISALLOWED`. Add a warning in `set_random_address` when getting that new error. This is done in case someone try to set a new random address while legacy advertising, scanning or initiating is enabled. This is illegal behavior according to the Core Spec (see Vol 4, Part E 7.8.4). Signed-off-by: Théo Battrel --- subsys/bluetooth/host/hci_core.c | 2 ++ subsys/bluetooth/host/id.c | 9 +++++++++ .../df/connection_cte_req/src/test_cte_req_enable.c | 4 ++-- .../src/test_set_cl_cte_tx_enable.c | 6 +++--- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/subsys/bluetooth/host/hci_core.c b/subsys/bluetooth/host/hci_core.c index d0737cd85fd4c8..b0429fe3b6d649 100644 --- a/subsys/bluetooth/host/hci_core.c +++ b/subsys/bluetooth/host/hci_core.c @@ -344,6 +344,8 @@ int bt_hci_cmd_send_sync(uint16_t opcode, struct net_buf *buf, return -ENOMEM; case BT_HCI_ERR_INVALID_PARAM: return -EINVAL; + case BT_HCI_ERR_CMD_DISALLOWED: + return -EACCES; default: return -EIO; } diff --git a/subsys/bluetooth/host/id.c b/subsys/bluetooth/host/id.c index 69cdadd9c4d31e..618dc6b758606b 100644 --- a/subsys/bluetooth/host/id.c +++ b/subsys/bluetooth/host/id.c @@ -141,6 +141,15 @@ static int set_random_address(const bt_addr_t *addr) err = bt_hci_cmd_send_sync(BT_HCI_OP_LE_SET_RANDOM_ADDRESS, buf, NULL); if (err) { + if (err == -EACCES) { + /* If we are here we probably tried to set a random + * address while a legacy advertising, scanning or + * initiating is enabled, this is illegal. + * + * See Core Spec @ Vol 4, Part E 7.8.4 + */ + LOG_WRN("cmd disallowed"); + } return err; } diff --git a/tests/bluetooth/df/connection_cte_req/src/test_cte_req_enable.c b/tests/bluetooth/df/connection_cte_req/src/test_cte_req_enable.c index e518903cba2c3f..f9f10d5ccabeef 100644 --- a/tests/bluetooth/df/connection_cte_req/src/test_cte_req_enable.c +++ b/tests/bluetooth/df/connection_cte_req/src/test_cte_req_enable.c @@ -97,7 +97,7 @@ ZTEST(test_hci_set_conn_cte_rx_params_with_conn_set, int err; err = send_conn_cte_req_enable(g_conn_handle, &g_data, true); - zassert_equal(err, -EIO, + zassert_equal(err, -EACCES, "Unexpected error value for CTE request enable before set rx params"); } @@ -109,7 +109,7 @@ ZTEST(test_hci_set_conn_cte_rx_params_with_rx_param_set, g_data.cte_request_interval = REQUEST_INTERVAL_TOO_LOW; err = send_conn_cte_req_enable(g_conn_handle, &g_data, true); - zassert_equal(err, -EIO, + zassert_equal(err, -EACCES, "Unexpected error value for CTE request enable with too short request" " interval"); } diff --git a/tests/bluetooth/df/connectionless_cte_tx/src/test_set_cl_cte_tx_enable.c b/tests/bluetooth/df/connectionless_cte_tx/src/test_set_cl_cte_tx_enable.c index 313f94e7762812..35267739edd16c 100644 --- a/tests/bluetooth/df/connectionless_cte_tx/src/test_set_cl_cte_tx_enable.c +++ b/tests/bluetooth/df/connectionless_cte_tx/src/test_set_cl_cte_tx_enable.c @@ -71,7 +71,7 @@ ZTEST(test_set_cl_cte_tx_enable, test_set_cl_cte_tx_enable_cte_params_not_set) /* test logic */ err = send_set_cl_cte_tx_enable(g_adv->handle, g_adv->flags, true); - zassert_equal(err, -EIO, "Unexpected error value for enable CTE before " + zassert_equal(err, -EACCES, "Unexpected error value for enable CTE before " "CTE params set"); /* clean up */ @@ -90,7 +90,7 @@ ZTEST(test_set_cl_cte_tx_enable, test_set_cl_cte_tx_enable_per_adv_coded_phy) /* test logic */ err = send_set_cl_cte_tx_enable(g_adv->handle, g_adv->flags, true); - zassert_equal(err, -EIO, "Unexpected error value for enable CTE for " + zassert_equal(err, -EACCES, "Unexpected error value for enable CTE for " "coded PHY"); /* clean up */ @@ -151,7 +151,7 @@ ZTEST(test_set_cl_cte_tx_enable, test_set_cl_cte_tx_disable_when_no_CTE_enabled) /* test logic */ err = send_set_cl_cte_tx_enable(g_adv->handle, g_adv->flags, false); - zassert_equal(err, -EIO, "Unexpected error value for disable CTE " + zassert_equal(err, -EACCES, "Unexpected error value for disable CTE " "before CTE enable"); /* clean up */