From 7e45208c1e7178230d5e2d7111b3e5822d0e4c65 Mon Sep 17 00:00:00 2001 From: Mariusz Skamra Date: Wed, 29 Apr 2026 13:13:54 +0200 Subject: [PATCH 1/3] nimble/host: Fix the iso connection handle type This fixes the connection handle type, which is two octet value as per Core specification. --- nimble/host/src/ble_iso.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nimble/host/src/ble_iso.c b/nimble/host/src/ble_iso.c index 600e7ed5bf..9ac20760fd 100644 --- a/nimble/host/src/ble_iso.c +++ b/nimble/host/src/ble_iso.c @@ -73,7 +73,7 @@ struct ble_iso_big { struct ble_iso_conn { SLIST_ENTRY(ble_iso_conn) next; enum ble_iso_conn_type type; - uint8_t handle; + uint16_t handle; struct ble_iso_rx_data_info rx_info; struct os_mbuf *rx_buf; From a51b3fb495de8d7653ed403de09d1a28c80b7cc7 Mon Sep 17 00:00:00 2001 From: Mariusz Skamra Date: Wed, 29 Apr 2026 13:15:34 +0200 Subject: [PATCH 2/3] nimble/host: Fix uninitialized ISO conn handle This sets the initial conn handle value to 0xFFFF, which is the value outside of valid range. --- nimble/host/src/ble_iso.c | 1 + 1 file changed, 1 insertion(+) diff --git a/nimble/host/src/ble_iso.c b/nimble/host/src/ble_iso.c index 9ac20760fd..ab5f433935 100644 --- a/nimble/host/src/ble_iso.c +++ b/nimble/host/src/ble_iso.c @@ -184,6 +184,7 @@ ble_iso_bis_alloc(struct ble_iso_big *big) memset(new_bis, 0, sizeof *new_bis); new_bis->conn.type = BLE_ISO_CONN_BIS; + new_bis->conn.handle = BLE_HS_CONN_HANDLE_NONE; new_bis->big = big; ble_iso_conn_append(&new_bis->conn); From 08f7195a078542451174a669c69d4193346eaa8d Mon Sep 17 00:00:00 2001 From: Mariusz Skamra Date: Wed, 29 Apr 2026 13:18:38 +0200 Subject: [PATCH 3/3] nimble/host: Refactor ble_iso_big_conn_handles_init This refactors ble_iso_big_conn_handles_init macro into function. Few asserts have been added to catch the potential issues. The nested loop has been removed. --- nimble/host/src/ble_iso.c | 63 +++++++++++++++++++++++++-------------- 1 file changed, 41 insertions(+), 22 deletions(-) diff --git a/nimble/host/src/ble_iso.c b/nimble/host/src/ble_iso.c index ab5f433935..a76c64cdf7 100644 --- a/nimble/host/src/ble_iso.c +++ b/nimble/host/src/ble_iso.c @@ -34,28 +34,6 @@ #define min(a, b) ((a) < (b) ? (a) : (b)) #endif -#define ble_iso_big_conn_handles_init(_big, _handles, _num_handles) \ - do { \ - struct ble_iso_conn *conn = SLIST_FIRST(&ble_iso_conns); \ - \ - for (uint8_t i = 0; i < (_num_handles); i++) { \ - while (conn != NULL) { \ - if (conn->type == BLE_ISO_CONN_BIS) { \ - struct ble_iso_bis *bis; \ - \ - bis = CONTAINER_OF(conn, struct ble_iso_bis, conn); \ - if (bis->big == (_big)) { \ - conn->handle = le16toh((_handles)[i]); \ - conn = SLIST_NEXT(conn, next); \ - break; \ - } \ - } \ - \ - conn = SLIST_NEXT(conn, next); \ - } \ - } \ - } while (0); - enum ble_iso_conn_type { BLE_ISO_CONN_BIS, }; @@ -96,6 +74,47 @@ static struct os_mempool ble_iso_bis_pool; static os_membuf_t ble_iso_bis_mem[ OS_MEMPOOL_SIZE(MYNEWT_VAL(BLE_ISO_MAX_BISES), sizeof (struct ble_iso_bis))]; +static int +ble_iso_big_conn_handles_init(struct ble_iso_big *big, const void *data, uint8_t num_handles) +{ + const uint8_t *handles = data; + struct ble_iso_conn *conn; + struct ble_iso_bis *bis; + uint8_t num_bis; + + BLE_HS_DBG_ASSERT(big != NULL); + BLE_HS_DBG_ASSERT(handles != NULL); + BLE_HS_DBG_ASSERT(num_handles > 0); + + num_bis = 0; + + SLIST_FOREACH(conn, &ble_iso_conns, next) { + if (conn->type != BLE_ISO_CONN_BIS) { + continue; + } + + bis = CONTAINER_OF(conn, struct ble_iso_bis, conn); + if (bis->big != big) { + continue; + } + + BLE_HS_DBG_ASSERT(conn->handle == BLE_HS_CONN_HANDLE_NONE); + + conn->handle = get_le16(&handles[num_bis * sizeof(uint16_t)]); + + if (++num_bis == num_handles) { + break; + } + } + + if (num_bis != num_handles) { + BLE_HS_LOG_ERROR("Not enough handles for BIG\n"); + return BLE_HS_EINVAL; + } + + return 0; +} + static void ble_iso_conn_append(struct ble_iso_conn *conn) {