This is an automated email from the ASF dual-hosted git repository.

sjanc pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-nimble.git

commit 6e354a94429493661c99705f917175d9c76b55ad
Author: Mariusz Skamra <[email protected]>
AuthorDate: Wed Apr 29 13:18:38 2026 +0200

    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 ab5f43393..a76c64cdf 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)
 {

Reply via email to