diff --git a/include/zephyr/bluetooth/bluetooth.h b/include/zephyr/bluetooth/bluetooth.h index 3a3409ecf0a..202d29eb9ca 100644 --- a/include/zephyr/bluetooth/bluetooth.h +++ b/include/zephyr/bluetooth/bluetooth.h @@ -1822,8 +1822,11 @@ int bt_le_per_adv_sync_delete(struct bt_le_per_adv_sync *per_adv_sync); * such as synced, terminated and when data is received. * * @param cb Callback struct. Must point to memory that remains valid. + * + * @retval 0 Success. + * @retval -EEXIST if @p cb was already registered. */ -void bt_le_per_adv_sync_cb_register(struct bt_le_per_adv_sync_cb *cb); +int bt_le_per_adv_sync_cb_register(struct bt_le_per_adv_sync_cb *cb); /** * @brief Enables receiving periodic advertising reports for a sync. @@ -2309,8 +2312,11 @@ int bt_le_scan_stop(void); * API was used to start the scanner. * * @param cb Callback struct. Must point to memory that remains valid. + * + * @retval 0 Success. + * @retval -EEXIST if @p cb was already registered. */ -void bt_le_scan_cb_register(struct bt_le_scan_cb *cb); +int bt_le_scan_cb_register(struct bt_le_scan_cb *cb); /** * @brief Unregister scanner packet callbacks. diff --git a/include/zephyr/bluetooth/conn.h b/include/zephyr/bluetooth/conn.h index c3c2fb06cfe..9b7f4d9153b 100644 --- a/include/zephyr/bluetooth/conn.h +++ b/include/zephyr/bluetooth/conn.h @@ -1256,8 +1256,11 @@ struct bt_conn_cb { * Register callbacks to monitor the state of connections. * * @param cb Callback struct. Must point to memory that remains valid. + * + * @retval 0 Success. + * @retval -EEXIST if @p cb was already registered. */ -void bt_conn_cb_register(struct bt_conn_cb *cb); +int bt_conn_cb_register(struct bt_conn_cb *cb); /** * @brief Unregister connection callbacks. diff --git a/include/zephyr/bluetooth/testing.h b/include/zephyr/bluetooth/testing.h index 58aae9726ff..74806a53a6d 100644 --- a/include/zephyr/bluetooth/testing.h +++ b/include/zephyr/bluetooth/testing.h @@ -53,8 +53,11 @@ struct bt_test_cb { /** Register callbacks for Bluetooth testing purposes * * @param cb bt_test_cb callback structure + * + * @retval 0 Success. + * @retval -EEXIST if @p cb was already registered. */ -void bt_test_cb_register(struct bt_test_cb *cb); +int bt_test_cb_register(struct bt_test_cb *cb); /** Unregister callbacks for Bluetooth testing purposes * diff --git a/subsys/bluetooth/host/conn.c b/subsys/bluetooth/host/conn.c index af70be35cc8..1b2117058e5 100644 --- a/subsys/bluetooth/host/conn.c +++ b/subsys/bluetooth/host/conn.c @@ -2508,11 +2508,15 @@ bt_security_t bt_conn_get_security(const struct bt_conn *conn) } #endif /* CONFIG_BT_SMP */ -void bt_conn_cb_register(struct bt_conn_cb *cb) +int bt_conn_cb_register(struct bt_conn_cb *cb) { - if (!sys_slist_find(&conn_cbs, &cb->_node, NULL)) { - sys_slist_append(&conn_cbs, &cb->_node); + if (sys_slist_find(&conn_cbs, &cb->_node, NULL)) { + return -EEXIST; } + + sys_slist_append(&conn_cbs, &cb->_node); + + return 0; } int bt_conn_cb_unregister(struct bt_conn_cb *cb) diff --git a/subsys/bluetooth/host/scan.c b/subsys/bluetooth/host/scan.c index c7ac96b0e85..65868e941a0 100644 --- a/subsys/bluetooth/host/scan.c +++ b/subsys/bluetooth/host/scan.c @@ -1586,11 +1586,15 @@ int bt_le_scan_stop(void) return bt_le_scan_update(false); } -void bt_le_scan_cb_register(struct bt_le_scan_cb *cb) +int bt_le_scan_cb_register(struct bt_le_scan_cb *cb) { - if (!sys_slist_find(&scan_cbs, &cb->node, NULL)) { - sys_slist_append(&scan_cbs, &cb->node); + if (sys_slist_find(&scan_cbs, &cb->node, NULL)) { + return -EEXIST; } + + sys_slist_append(&scan_cbs, &cb->node); + + return 0; } void bt_le_scan_cb_unregister(struct bt_le_scan_cb *cb) @@ -1833,11 +1837,15 @@ int bt_le_per_adv_sync_delete(struct bt_le_per_adv_sync *per_adv_sync) return err; } -void bt_le_per_adv_sync_cb_register(struct bt_le_per_adv_sync_cb *cb) +int bt_le_per_adv_sync_cb_register(struct bt_le_per_adv_sync_cb *cb) { - if (!sys_slist_find(&pa_sync_cbs, &cb->node, NULL)) { - sys_slist_append(&pa_sync_cbs, &cb->node); + if (sys_slist_find(&pa_sync_cbs, &cb->node, NULL)) { + return -EEXIST; } + + sys_slist_append(&pa_sync_cbs, &cb->node); + + return 0; } static int bt_le_set_per_adv_recv_enable( diff --git a/subsys/bluetooth/host/testing.c b/subsys/bluetooth/host/testing.c index 690708fadc5..16fb15b94e6 100644 --- a/subsys/bluetooth/host/testing.c +++ b/subsys/bluetooth/host/testing.c @@ -20,11 +20,15 @@ static sys_slist_t cb_slist; -void bt_test_cb_register(struct bt_test_cb *cb) +int bt_test_cb_register(struct bt_test_cb *cb) { - if (!sys_slist_find(&cb_slist, &cb->node, NULL)) { - sys_slist_append(&cb_slist, &cb->node); + if (sys_slist_find(&cb_slist, &cb->node, NULL)) { + return -EEXIST; } + + sys_slist_append(&cb_slist, &cb->node); + + return 0; } void bt_test_cb_unregister(struct bt_test_cb *cb)