From 700181eb1f1052e48d665bc130bef59f112ef60b Mon Sep 17 00:00:00 2001 From: Rahul Tank Date: Fri, 9 Jan 2026 15:04:19 +0530 Subject: [PATCH] fix(nimble): Bugfixes for various issues --- .../btc/profile/esp/blufi/nimble_host/esp_blufi.c | 10 +++++++--- components/bt/host/nimble/Kconfig.in | 13 +++++++------ .../bt/host/nimble/esp-hci/src/esp_nimble_hci.c | 2 +- components/bt/host/nimble/nimble | 2 +- .../bt/host/nimble/port/include/ble_svc_gap_stub.h | 3 +++ .../bt/host/nimble/port/include/esp_nimble_cfg.h | 12 ++---------- components/protocomm/src/simple_ble/simple_ble.c | 3 +++ .../main/ble_chan_initiator.h | 1 - .../bluetooth/nimble/ble_cts/cts_cent/main/main.c | 2 +- .../nimble/ble_gattc_gatts_coex/main/main.c | 2 +- .../bluetooth/nimble/ble_htp/htp_cent/main/main.c | 4 ++-- .../proximity_sensor_cent/main/main.c | 4 ++-- examples/bluetooth/nimble/blecent/README.md | 2 +- examples/bluetooth/nimble/bleprph/README.md | 2 +- .../nimble/common/nimble_central_utils/peer.c | 2 +- 15 files changed, 33 insertions(+), 31 deletions(-) diff --git a/components/bt/common/btc/profile/esp/blufi/nimble_host/esp_blufi.c b/components/bt/common/btc/profile/esp/blufi/nimble_host/esp_blufi.c index 0f26b9aa94..2cf920a54a 100644 --- a/components/bt/common/btc/profile/esp/blufi/nimble_host/esp_blufi.c +++ b/components/bt/common/btc/profile/esp/blufi/nimble_host/esp_blufi.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -331,7 +331,9 @@ esp_blufi_gap_event(struct ble_gap_event *event, void *arg) } if (event->connect.status != 0) { /* Connection failed; resume advertising. */ - ((void(*)(void))arg)(); + if (arg != NULL) { + ((void(*)(void))arg)(); + } } return 0; case BLE_GAP_EVENT_DISCONNECT: @@ -366,7 +368,9 @@ esp_blufi_gap_event(struct ble_gap_event *event, void *arg) case BLE_GAP_EVENT_ADV_COMPLETE: ESP_LOGI(TAG, "advertise complete; reason=%d", event->adv_complete.reason); - ((void(*)(void))arg)(); + if (arg != NULL) { + ((void(*)(void))arg)(); + } return 0; case BLE_GAP_EVENT_SUBSCRIBE: diff --git a/components/bt/host/nimble/Kconfig.in b/components/bt/host/nimble/Kconfig.in index acb4ef6009..e59bde1ee4 100644 --- a/components/bt/host/nimble/Kconfig.in +++ b/components/bt/host/nimble/Kconfig.in @@ -160,10 +160,11 @@ menu "Security (SMP)" default 0 help LE Security Mode 1 Levels: - 1. No Security - 2. Unauthenticated pairing with encryption - 3. Authenticated pairing with encryption - 4. Authenticated LE Secure Connections pairing with encryption using a 128-bit strength encryption key. + 1(0). No Security + 2(1). Unauthenticated pairing with encryption + 3(2). Authenticated pairing with encryption + 4(3). Authenticated LE Secure Connections pairing with encryption using a + 128-bit strength encryption key. config BT_NIMBLE_SM_SC_ONLY int "Enable Secure Connections Only Mode" @@ -736,7 +737,7 @@ menu "BLE 6.x Features" if BT_NIMBLE_60_FEATURE_SUPPORT config BT_NIMBLE_CHANNEL_SOUNDING - bool "ble channel souding feature" + bool "ble channel sounding feature" default n help Used to enable/disable the channel sounding feature @@ -1186,7 +1187,7 @@ menu "Extra Features" depends on BT_NIMBLE_ENABLED && BT_NIMBLE_SECURITY_ENABLE help Enable support for user defined static passkey for SMP - + config BT_NIMBLE_DTM_MODE_TEST bool "Enable DTM related test procedure support" default y diff --git a/components/bt/host/nimble/esp-hci/src/esp_nimble_hci.c b/components/bt/host/nimble/esp-hci/src/esp_nimble_hci.c index fe99401d7e..097d249295 100644 --- a/components/bt/host/nimble/esp-hci/src/esp_nimble_hci.c +++ b/components/bt/host/nimble/esp-hci/src/esp_nimble_hci.c @@ -191,7 +191,7 @@ static void ble_hci_rx_acl(uint8_t *data, uint16_t len) m = ble_transport_alloc_acl_from_ll(); if (!m) { - if (retry_count % 5) { + if (retry_count % 5 == 0) { esp_rom_printf("ACL buf alloc failed %d times\n", retry_count); esp_rom_printf("Free ACL mbufs: %d\n", os_msys_num_free()); } diff --git a/components/bt/host/nimble/nimble b/components/bt/host/nimble/nimble index d8e5977c04..8930f4a977 160000 --- a/components/bt/host/nimble/nimble +++ b/components/bt/host/nimble/nimble @@ -1 +1 @@ -Subproject commit d8e5977c04a018b8a7fd5fde19afa8517d3b4178 +Subproject commit 8930f4a97731876f033a17bf0984485320a24d23 diff --git a/components/bt/host/nimble/port/include/ble_svc_gap_stub.h b/components/bt/host/nimble/port/include/ble_svc_gap_stub.h index 1fb456f219..1d5f48284c 100644 --- a/components/bt/host/nimble/port/include/ble_svc_gap_stub.h +++ b/components/bt/host/nimble/port/include/ble_svc_gap_stub.h @@ -39,12 +39,15 @@ static inline const char *ble_svc_gap_device_name(void) static inline int ble_svc_gap_device_appearance_set(uint16_t appearance) { + (void)appearance; ESP_LOGE(BLE_SVC_GAP_TAG, "GAP service not enabled. Enable CONFIG_BT_NIMBLE_GAP_SERVICE to use this API."); return -1; } static inline int ble_svc_gap_device_key_material_set(uint8_t *session_key, uint8_t *iv) { + (void)session_key; + (void)iv; ESP_LOGE(BLE_SVC_GAP_TAG, "GAP service not enabled. Enable CONFIG_BT_NIMBLE_GAP_SERVICE to use this API."); return -1; } diff --git a/components/bt/host/nimble/port/include/esp_nimble_cfg.h b/components/bt/host/nimble/port/include/esp_nimble_cfg.h index 245cecd8cc..af22b75fb0 100644 --- a/components/bt/host/nimble/port/include/esp_nimble_cfg.h +++ b/components/bt/host/nimble/port/include/esp_nimble_cfg.h @@ -2158,7 +2158,7 @@ #ifdef CONFIG_BT_NIMBLE_STATIC_PASSKEY #define MYNEWT_VAL_STATIC_PASSKEY CONFIG_BT_NIMBLE_STATIC_PASSKEY #else -#define CONFIG_BT_NIMBLE_STATIC_PASSKEY (0) +#define MYNEWT_VAL_STATIC_PASSKEY (0) #endif #endif @@ -2222,7 +2222,7 @@ #ifdef CONFIG_BT_NIMBLE_EXTRA_ADV_FIELDS #define MYNEWT_VAL_BLE_EXTRA_ADV_FIELDS CONFIG_BT_NIMBLE_EXTRA_ADV_FIELDS #else -#define CONFIG_BT_NIMBLE_EXTRA_ADV_FIELDS (0) +#define MYNEWT_VAL_BLE_EXTRA_ADV_FIELDS (0) #endif #endif @@ -2242,14 +2242,6 @@ #endif #endif -#ifndef MYNEWT_VAL_BLE_STATIC_TO_DYNAMIC -#ifdef CONFIG_BT_NIMBLE_STATIC_TO_DYNAMIC -#define MYNEWT_VAL_BLE_STATIC_TO_DYNAMIC CONFIG_BT_NIMBLE_STATIC_TO_DYNAMIC -#else -#define MYNEWT_VAL_BLE_STATIC_TO_DYNAMIC (0) -#endif -#endif - #ifndef MYNEWT_VAL_BLE_RESTART_PAIR #define MYNEWT_VAL_BLE_RESTART_PAIR (1) #endif diff --git a/components/protocomm/src/simple_ble/simple_ble.c b/components/protocomm/src/simple_ble/simple_ble.c index bf292da635..543a4a1cde 100644 --- a/components/protocomm/src/simple_ble/simple_ble.c +++ b/components/protocomm/src/simple_ble/simple_ble.c @@ -33,6 +33,9 @@ static esp_bd_addr_t s_cached_remote_bda = {0x0,}; uint8_t get_keep_ble_on() { + if (g_ble_cfg_p == NULL) { + return 0; + } return g_ble_cfg_p->keep_ble_on; } diff --git a/examples/bluetooth/nimble/ble_chan_sound_initiator/main/ble_chan_initiator.h b/examples/bluetooth/nimble/ble_chan_sound_initiator/main/ble_chan_initiator.h index 4997060d65..23bf251286 100644 --- a/examples/bluetooth/nimble/ble_chan_sound_initiator/main/ble_chan_initiator.h +++ b/examples/bluetooth/nimble/ble_chan_sound_initiator/main/ble_chan_initiator.h @@ -24,7 +24,6 @@ union ble_store_key; #define BLE_HCI_LE_CS_SUBEVENT_DONE_STATUS_ABORTED 0xF #define LOCAL_PROCEDURE_MEM 1024 // Replace with an appropriate constant value -struct ble_hs_cfg; struct ble_gatt_register_ctxt; /** GATT server. */ diff --git a/examples/bluetooth/nimble/ble_cts/cts_cent/main/main.c b/examples/bluetooth/nimble/ble_cts/cts_cent/main/main.c index 2d3bb9d659..d8c5840ec8 100644 --- a/examples/bluetooth/nimble/ble_cts/cts_cent/main/main.c +++ b/examples/bluetooth/nimble/ble_cts/cts_cent/main/main.c @@ -520,7 +520,7 @@ ble_cts_cent_gap_event(struct ble_gap_event *event, void *arg) (event->cache_assoc.cache_state == 0) ? "INVALID" : "LOADED"); /* Perform service discovery */ rc = peer_disc_all(event->cache_assoc.conn_handle, - blecent_on_disc_complete, NULL); + ble_cts_cent_on_disc_complete, NULL); if(rc != 0) { MODLOG_DFLT(ERROR, "Failed to discover services; rc=%d\n", rc); return 0; diff --git a/examples/bluetooth/nimble/ble_gattc_gatts_coex/main/main.c b/examples/bluetooth/nimble/ble_gattc_gatts_coex/main/main.c index d9d16a91e0..e33df0579f 100644 --- a/examples/bluetooth/nimble/ble_gattc_gatts_coex/main/main.c +++ b/examples/bluetooth/nimble/ble_gattc_gatts_coex/main/main.c @@ -348,7 +348,7 @@ blecoex_gap_event(struct ble_gap_event *event, void *arg) case BLE_GAP_EVENT_CONNECT: MODLOG_DFLT(INFO, "%s connection %s; status=%d ", - client_connect == 1 ? "Client" : "Server", + client_connect == 1 ? "Client" : "Server", event->connect.status == 0 ? "established" : "failed", event->connect.status); diff --git a/examples/bluetooth/nimble/ble_htp/htp_cent/main/main.c b/examples/bluetooth/nimble/ble_htp/htp_cent/main/main.c index 447631ae3e..2ee915c563 100644 --- a/examples/bluetooth/nimble/ble_htp/htp_cent/main/main.c +++ b/examples/bluetooth/nimble/ble_htp/htp_cent/main/main.c @@ -628,8 +628,8 @@ ble_htp_cent_gap_event(struct ble_gap_event *event, void *arg) event->cache_assoc.status, (event->cache_assoc.cache_state == 0) ? "INVALID" : "LOADED"); /* Perform service discovery */ - rc = peer_disc_all(event->cache_assoc.conn_handle, - blecent_on_disc_complete, NULL); + rc = peer_disc_all(event->connect.conn_handle, + ble_htp_cent_on_disc_complete, NULL); if(rc != 0) { MODLOG_DFLT(ERROR, "Failed to discover services; rc=%d\n", rc); return 0; diff --git a/examples/bluetooth/nimble/ble_proximity_sensor/proximity_sensor_cent/main/main.c b/examples/bluetooth/nimble/ble_proximity_sensor/proximity_sensor_cent/main/main.c index db7c007b33..52369ad198 100644 --- a/examples/bluetooth/nimble/ble_proximity_sensor/proximity_sensor_cent/main/main.c +++ b/examples/bluetooth/nimble/ble_proximity_sensor/proximity_sensor_cent/main/main.c @@ -581,8 +581,8 @@ ble_prox_cent_gap_event(struct ble_gap_event *event, void *arg) event->cache_assoc.status, (event->cache_assoc.cache_state == 0) ? "INVALID" : "LOADED"); /* Perform service discovery */ - rc = peer_disc_all(event->cache_assoc.conn_handle, - blecent_on_disc_complete, NULL); + rc = peer_disc_all(event->connect.conn_handle, + ble_prox_cent_on_disc_complete, NULL); if(rc != 0) { MODLOG_DFLT(ERROR, "Failed to discover services; rc=%d\n", rc); return 0; diff --git a/examples/bluetooth/nimble/blecent/README.md b/examples/bluetooth/nimble/blecent/README.md index f8cd4537b0..fbb4999ff9 100644 --- a/examples/bluetooth/nimble/blecent/README.md +++ b/examples/bluetooth/nimble/blecent/README.md @@ -166,7 +166,7 @@ The following configuration flags can be adjusted to significantly reduce RAM us | CONFIG_COMPILER_OPTIMIZATION_SIZE | n → y | 8408 | | CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE | n → y | 5896 | | CONFIG_ESP_COEX_SW_COEXIST_ENABLE | y → n | 896 | -| ESP_TASK_WDT_EN | y → n | 528 | +| CONFIG_ESP_TASK_WDT_EN | y → n | 528 | | CONFIG_LOG_DEFAULT_LEVEL_NONE | n → y | 2592 | ## Troubleshooting diff --git a/examples/bluetooth/nimble/bleprph/README.md b/examples/bluetooth/nimble/bleprph/README.md index 31bcc1e7ff..6421a90e94 100644 --- a/examples/bluetooth/nimble/bleprph/README.md +++ b/examples/bluetooth/nimble/bleprph/README.md @@ -104,7 +104,7 @@ Notification sent succesfully The following configuration flags can be adjusted to significantly reduce RAM usage in your ESP-IDF project while retaining basic BLE functionality. | Config Option | Old → New Value | RAM Saved (Bytes) | -|--------------------------------------------------|-----------------|--------------------| +| -------------------------------------------------|---------------- | ------------------ | | CONFIG_BT_NIMBLE_SM_SC | y → n | 2016 | | CONFIG_BT_NIMBLE_LL_CFG_FEAT_LE_ENCRYPTION | y → n | 32 | | CONFIG_BT_NIMBLE_GATT_MAX_PROCS | 4 → 2 | 112 | diff --git a/examples/bluetooth/nimble/common/nimble_central_utils/peer.c b/examples/bluetooth/nimble/common/nimble_central_utils/peer.c index 1ccb7283e2..1034cff33b 100644 --- a/examples/bluetooth/nimble/common/nimble_central_utils/peer.c +++ b/examples/bluetooth/nimble/common/nimble_central_utils/peer.c @@ -515,7 +515,7 @@ peer_inc_add(struct peer *peer, uint16_t svc_start_handle, } } - /* Including the services into inlucding list */ + /* Including the services into including list */ cur_svc = peer_svc_find_range(peer, gatt_incl_svc->handle);