From f6929c26d395ca18474cea385b694235f03d30e6 Mon Sep 17 00:00:00 2001 From: Zhou Xiao Date: Thu, 15 Jan 2026 17:13:24 +0800 Subject: [PATCH 1/5] change(ble): optimized os_mbuf_copydata thread safety protection (cherry picked from commit 52754b1aa443bfaae6c47025e6a29904d67a2606) Co-authored-by: Zhou Xiao --- components/bt/common/ble_log/src/ble_log_lbm.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/components/bt/common/ble_log/src/ble_log_lbm.c b/components/bt/common/ble_log/src/ble_log_lbm.c index 4504663c5f..5c0043a1da 100644 --- a/components/bt/common/ble_log/src/ble_log_lbm.c +++ b/components/bt/common/ble_log/src/ble_log_lbm.c @@ -107,8 +107,7 @@ void ble_log_lbm_write_trans(ble_log_prph_trans_t **trans, ble_log_src_t src_cod } if (len_append) { #if CONFIG_SOC_ESP_NIMBLE_CONTROLLER - if (omdata && !BLE_LOG_IN_ISR()) { - /* os_mbuf_copydata is in flash and not safe to call from ISR */ + if (omdata) { os_mbuf_copydata((struct os_mbuf *)addr_append, 0, len_append, buf + BLE_LOG_FRAME_HEAD_LEN + len); } @@ -494,6 +493,9 @@ void ble_log_write_hex_ll(uint32_t len, const uint8_t *addr, if (BLE_LOG_IN_ISR()) { /* Reuse common LBM acquire logic */ lbm = ble_log_lbm_acquire(); + + /* os_mbuf_copydata is in flash and not safe to call from ISR */ + omdata = false; } else { lbm = (use_ll_task)? &(lbm_ctx->lbm_ll_task): &(lbm_ctx->lbm_ll_hci); } From ed00cb4e006de222aa803c97b32183d4f07a897a Mon Sep 17 00:00:00 2001 From: Zhou Xiao Date: Thu, 15 Jan 2026 17:13:25 +0800 Subject: [PATCH 2/5] feat(ble): support ll log payload length limit for ble log v2 (cherry picked from commit 82ee820cf87deeee983700129ce904c68bf5deb3) Co-authored-by: Zhou Xiao --- components/bt/common/ble_log/Kconfig.in | 36 +++++++++++++----- .../bt/common/ble_log/src/ble_log_lbm.c | 38 ++++++++++++------- 2 files changed, 51 insertions(+), 23 deletions(-) diff --git a/components/bt/common/ble_log/Kconfig.in b/components/bt/common/ble_log/Kconfig.in index 35405367e2..ed65ce3612 100644 --- a/components/bt/common/ble_log/Kconfig.in +++ b/components/bt/common/ble_log/Kconfig.in @@ -70,15 +70,33 @@ if BLE_LOG_ENABLED help Enable BLE Log for Link Layer - config BLE_LOG_LBM_LL_TRANS_SIZE - int "Buffer size for each peripheral transport of Link Layer LBM" - depends on BLE_LOG_LL_ENABLED - default 1024 - help - There're 2 Link Layer dedicated log buffer managers (LBMs) with - compare-and-swap (CAS) protection. Each LBM is managing 2 ping- - pong buffers, which means there will be additional 2 * 2 * - BLE_LOG_LBM_LL_TRANS_SIZE bytes buffer allocated + if BLE_LOG_LL_ENABLED + config BLE_LOG_LBM_LL_TRANS_SIZE + int "Buffer size for each peripheral transport of Link Layer LBM" + default 1024 + help + There're 2 Link Layer dedicated log buffer managers (LBMs) with + compare-and-swap (CAS) protection. Each LBM is managing 2 ping- + pong buffers, which means there will be additional 2 * 2 * + BLE_LOG_LBM_LL_TRANS_SIZE bytes buffer allocated + + config BLE_LOG_LL_HCI_LOG_PAYLOAD_LEN_LIMIT_ENABLED + bool "Enable LL HCI Log Payload Length Limit" + default n + help + Enable length limit for LL HCI Log payload (addr_append). + When enabled, if len_append exceeds the configured limit, + it will be truncated to the maximum length. + + config BLE_LOG_LL_HCI_LOG_PAYLOAD_LEN_LIMIT + int "LL HCI Log Payload Length Limit (bytes)" + depends on BLE_LOG_LL_HCI_LOG_PAYLOAD_LEN_LIMIT_ENABLED + default 32 + help + Maximum length for LL HCI Log payload (len_append). + When the feature is enabled and len_append exceeds this value, + it will be truncated. + endif config BLE_LOG_PAYLOAD_CHECKSUM_ENABLED bool "Enable payload checksum for BLE Log data integrity check" diff --git a/components/bt/common/ble_log/src/ble_log_lbm.c b/components/bt/common/ble_log/src/ble_log_lbm.c index 5c0043a1da..8c95a815d5 100644 --- a/components/bt/common/ble_log/src/ble_log_lbm.c +++ b/components/bt/common/ble_log/src/ble_log_lbm.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2025-2026 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -426,17 +426,17 @@ BLE_LOG_IRAM_ATTR bool ble_log_write_hex(ble_log_src_t src_code, const uint8_t *addr, size_t len) { BLE_LOG_REF_COUNT_ACQUIRE(&lbm_ref_count); - size_t payload_len = len + sizeof(uint32_t); if (!lbm_enabled) { goto exit; } /* Get transport */ + size_t payload_len = len + sizeof(uint32_t); ble_log_lbm_t *lbm = ble_log_lbm_acquire(); ble_log_prph_trans_t **trans = ble_log_lbm_get_trans(lbm, payload_len); if (!trans) { ble_log_lbm_release(lbm); - goto exit; + goto failed; } /* Write transport */ @@ -451,12 +451,13 @@ bool ble_log_write_hex(ble_log_src_t src_code, const uint8_t *addr, size_t len) BLE_LOG_REF_COUNT_RELEASE(&lbm_ref_count); return true; -exit: +failed: #if CONFIG_BLE_LOG_ENH_STAT_ENABLED if (lbm_inited) { ble_log_stat_mgr_update(src_code, payload_len, true); } #endif /* CONFIG_BLE_LOG_ENH_STAT_ENABLED */ +exit: BLE_LOG_REF_COUNT_RELEASE(&lbm_ref_count); return false; } @@ -467,10 +468,12 @@ void ble_log_write_hex_ll(uint32_t len, const uint8_t *addr, uint32_t len_append, const uint8_t *addr_append, uint32_t flag) { BLE_LOG_REF_COUNT_ACQUIRE(&lbm_ref_count); - size_t payload_len = len + len_append; + if (!lbm_enabled) { + goto exit; + } - /* Source code shall be determined before LBM enable status check */ - ble_log_src_t src_code; + /* Source code shall be determined before LBM determination */ + ble_log_src_t src_code = BLE_LOG_SRC_MAX; bool use_ll_task = false; if (flag & BIT(BLE_LOG_LL_FLAG_ISR)) { src_code = BLE_LOG_SRC_LL_ISR; @@ -484,10 +487,6 @@ void ble_log_write_hex_ll(uint32_t len, const uint8_t *addr, } bool omdata = flag & BIT(BLE_LOG_LL_FLAG_OMDATA); - if (!lbm_enabled) { - goto exit; - } - /* Determine LBM by flag */ ble_log_lbm_t *lbm; if (BLE_LOG_IN_ISR()) { @@ -497,14 +496,24 @@ void ble_log_write_hex_ll(uint32_t len, const uint8_t *addr, /* os_mbuf_copydata is in flash and not safe to call from ISR */ omdata = false; } else { - lbm = (use_ll_task)? &(lbm_ctx->lbm_ll_task): &(lbm_ctx->lbm_ll_hci); + if (use_ll_task) { + lbm = &(lbm_ctx->lbm_ll_task); + } else { + lbm = &(lbm_ctx->lbm_ll_hci); +#if CONFIG_BLE_LOG_LL_HCI_LOG_PAYLOAD_LEN_LIMIT_ENABLED + if (len_append > CONFIG_BLE_LOG_LL_HCI_LOG_PAYLOAD_LEN_LIMIT) { + len_append = CONFIG_BLE_LOG_LL_HCI_LOG_PAYLOAD_LEN_LIMIT; + } +#endif /* CONFIG_BLE_LOG_LL_HCI_LOG_PAYLOAD_LEN_LIMIT_ENABLED */ + } } /* Get transport */ + size_t payload_len = len + len_append; ble_log_prph_trans_t **trans = ble_log_lbm_get_trans(lbm, payload_len); if (!trans) { ble_log_lbm_release(lbm); - goto exit; + goto failed; } /* Write transport */ @@ -514,12 +523,13 @@ void ble_log_write_hex_ll(uint32_t len, const uint8_t *addr, BLE_LOG_REF_COUNT_RELEASE(&lbm_ref_count); return; -exit: +failed: #if CONFIG_BLE_LOG_ENH_STAT_ENABLED if (lbm_inited) { ble_log_stat_mgr_update(src_code, payload_len, true); } #endif /* CONFIG_BLE_LOG_ENH_STAT_ENABLED */ +exit: BLE_LOG_REF_COUNT_RELEASE(&lbm_ref_count); return; } From f72669602ee0368567cd446213f671e4eac43a0b Mon Sep 17 00:00:00 2001 From: Zhou Xiao Date: Mon, 22 Dec 2025 17:05:22 +0800 Subject: [PATCH 3/5] feat(ble): supported ble log v2 hci log for NimBLE host --- components/bt/host/nimble/esp-hci/src/esp_nimble_hci.c | 9 +++++++++ 1 file changed, 9 insertions(+) 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 6dded0363b..4ce220882e 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 @@ -27,6 +27,9 @@ #if CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED #include "ble_log/ble_log_spi_out.h" #endif // CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED +#if CONFIG_BLE_LOG_ENABLED +#include "ble_log.h" +#endif /* CONFIG_BLE_LOG_ENABLED */ #define NIMBLE_VHCI_TIMEOUT_MS 2000 #define BLE_HCI_EVENT_HDR_LEN (2) @@ -80,6 +83,9 @@ void esp_vhci_host_send_packet_wrapper(uint8_t *data, uint16_t len) #if CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED ble_log_spi_out_hci_write(BLE_LOG_SPI_OUT_SOURCE_HCI_DOWNSTREAM, data, len); #endif // CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED +#if CONFIG_BLE_LOG_ENABLED + ble_log_write_hex(BLE_LOG_SRC_HCI, data, len); +#endif /* CONFIG_BLE_LOG_ENABLED */ esp_vhci_host_send_packet(data, len); } @@ -260,6 +266,9 @@ static int host_rcv_pkt(uint8_t *data, uint16_t len) #if CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED ble_log_spi_out_hci_write(BLE_LOG_SPI_OUT_SOURCE_HCI_UPSTREAM, data, len); #endif // CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED +#if CONFIG_BLE_LOG_ENABLED + ble_log_write_hex(BLE_LOG_SRC_HCI, data, len); +#endif /* CONFIG_BLE_LOG_ENABLED */ bt_record_hci_data(data, len); From ec6abe15371fc902051d169c4edab60a25caf8ea Mon Sep 17 00:00:00 2001 From: Zhou Xiao Date: Mon, 22 Dec 2025 17:05:34 +0800 Subject: [PATCH 4/5] feat(ble): supported ble log v2 hci log for Bluedroid host --- components/bt/host/bluedroid/api/esp_bluedroid_hci.c | 6 ++++++ components/bt/host/bluedroid/hci/hci_hal_h4.c | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/components/bt/host/bluedroid/api/esp_bluedroid_hci.c b/components/bt/host/bluedroid/api/esp_bluedroid_hci.c index ac64d17d04..4d02016d89 100644 --- a/components/bt/host/bluedroid/api/esp_bluedroid_hci.c +++ b/components/bt/host/bluedroid/api/esp_bluedroid_hci.c @@ -19,6 +19,9 @@ #if CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED #include "ble_log/ble_log_spi_out.h" #endif // CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED +#if CONFIG_BLE_LOG_ENABLED +#include "ble_log.h" +#endif /* CONFIG_BLE_LOG_ENABLED */ static esp_bluedroid_hci_driver_operations_t s_hci_driver_ops = { 0 }; @@ -70,6 +73,9 @@ void hci_host_send_packet(uint8_t *data, uint16_t len) #if CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED ble_log_spi_out_hci_write(BLE_LOG_SPI_OUT_SOURCE_HCI_DOWNSTREAM, data, len); #endif // CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED +#if CONFIG_BLE_LOG_ENABLED + ble_log_write_hex(BLE_LOG_SRC_HCI, data, len); +#endif /* CONFIG_BLE_LOG_ENABLED */ #if (BT_CONTROLLER_INCLUDED == TRUE) esp_vhci_host_send_packet(data, len); #else /* BT_CONTROLLER_INCLUDED == TRUE */ diff --git a/components/bt/host/bluedroid/hci/hci_hal_h4.c b/components/bt/host/bluedroid/hci/hci_hal_h4.c index 0baa265f2a..76d7960b73 100644 --- a/components/bt/host/bluedroid/hci/hci_hal_h4.c +++ b/components/bt/host/bluedroid/hci/hci_hal_h4.c @@ -45,6 +45,9 @@ #if CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED #include "ble_log/ble_log_spi_out.h" #endif // CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED +#if CONFIG_BLE_LOG_ENABLED +#include "ble_log.h" +#endif /* CONFIG_BLE_LOG_ENABLED */ #define HCI_BLE_EVENT 0x3e #define PACKET_TYPE_TO_INBOUND_INDEX(type) ((type) - 2) @@ -605,6 +608,9 @@ static int host_recv_pkt_cb(uint8_t *data, uint16_t len) #if CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED ble_log_spi_out_hci_write(BLE_LOG_SPI_OUT_SOURCE_HCI_UPSTREAM, data, len); #endif // CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED +#if CONFIG_BLE_LOG_ENABLED + ble_log_write_hex(BLE_LOG_SRC_HCI, data, len); +#endif /* CONFIG_BLE_LOG_ENABLED */ //Target has packet to host, malloc new buffer for packet BT_HDR *pkt = NULL; #if (BLE_42_SCAN_EN == TRUE) From 6b442e969e5d4a245bc8f196adddfa15bd9398a4 Mon Sep 17 00:00:00 2001 From: Zhou Xiao Date: Thu, 15 Jan 2026 17:13:27 +0800 Subject: [PATCH 5/5] feat(ble): added sdkconfig to control ble host side hci log (cherry picked from commit 52c2bd2dd6ad55daf4c75f9ef4b0df58282b62ab) Co-authored-by: Zhou Xiao --- components/bt/common/ble_log/Kconfig.in | 6 ++++++ components/bt/host/bluedroid/api/esp_bluedroid_hci.c | 4 ++-- components/bt/host/bluedroid/hci/hci_hal_h4.c | 4 ++-- components/bt/host/nimble/esp-hci/src/esp_nimble_hci.c | 10 +++++----- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/components/bt/common/ble_log/Kconfig.in b/components/bt/common/ble_log/Kconfig.in index ed65ce3612..a707f82d3a 100644 --- a/components/bt/common/ble_log/Kconfig.in +++ b/components/bt/common/ble_log/Kconfig.in @@ -98,6 +98,12 @@ if BLE_LOG_ENABLED it will be truncated. endif + config BLE_LOG_HOST_SIDE_HCI_LOG_ENABLED + bool "Enable BLE Host side HCI Logging" + default y + help + Enable BLE Host side HCI Logging + config BLE_LOG_PAYLOAD_CHECKSUM_ENABLED bool "Enable payload checksum for BLE Log data integrity check" default y diff --git a/components/bt/host/bluedroid/api/esp_bluedroid_hci.c b/components/bt/host/bluedroid/api/esp_bluedroid_hci.c index 4d02016d89..82f0246e3e 100644 --- a/components/bt/host/bluedroid/api/esp_bluedroid_hci.c +++ b/components/bt/host/bluedroid/api/esp_bluedroid_hci.c @@ -73,9 +73,9 @@ void hci_host_send_packet(uint8_t *data, uint16_t len) #if CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED ble_log_spi_out_hci_write(BLE_LOG_SPI_OUT_SOURCE_HCI_DOWNSTREAM, data, len); #endif // CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED -#if CONFIG_BLE_LOG_ENABLED +#if CONFIG_BLE_LOG_HOST_SIDE_HCI_LOG_ENABLED ble_log_write_hex(BLE_LOG_SRC_HCI, data, len); -#endif /* CONFIG_BLE_LOG_ENABLED */ +#endif /* CONFIG_BLE_LOG_HOST_SIDE_HCI_LOG_ENABLED */ #if (BT_CONTROLLER_INCLUDED == TRUE) esp_vhci_host_send_packet(data, len); #else /* BT_CONTROLLER_INCLUDED == TRUE */ diff --git a/components/bt/host/bluedroid/hci/hci_hal_h4.c b/components/bt/host/bluedroid/hci/hci_hal_h4.c index 76d7960b73..d797f166b6 100644 --- a/components/bt/host/bluedroid/hci/hci_hal_h4.c +++ b/components/bt/host/bluedroid/hci/hci_hal_h4.c @@ -608,9 +608,9 @@ static int host_recv_pkt_cb(uint8_t *data, uint16_t len) #if CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED ble_log_spi_out_hci_write(BLE_LOG_SPI_OUT_SOURCE_HCI_UPSTREAM, data, len); #endif // CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED -#if CONFIG_BLE_LOG_ENABLED +#if CONFIG_BLE_LOG_HOST_SIDE_HCI_LOG_ENABLED ble_log_write_hex(BLE_LOG_SRC_HCI, data, len); -#endif /* CONFIG_BLE_LOG_ENABLED */ +#endif /* CONFIG_BLE_LOG_HOST_SIDE_HCI_LOG_ENABLED */ //Target has packet to host, malloc new buffer for packet BT_HDR *pkt = NULL; #if (BLE_42_SCAN_EN == TRUE) 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 4ce220882e..fe99401d7e 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 @@ -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 */ @@ -83,9 +83,9 @@ void esp_vhci_host_send_packet_wrapper(uint8_t *data, uint16_t len) #if CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED ble_log_spi_out_hci_write(BLE_LOG_SPI_OUT_SOURCE_HCI_DOWNSTREAM, data, len); #endif // CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED -#if CONFIG_BLE_LOG_ENABLED +#if CONFIG_BLE_LOG_HOST_SIDE_HCI_LOG_ENABLED ble_log_write_hex(BLE_LOG_SRC_HCI, data, len); -#endif /* CONFIG_BLE_LOG_ENABLED */ +#endif /* CONFIG_BLE_LOG_HOST_SIDE_HCI_LOG_ENABLED */ esp_vhci_host_send_packet(data, len); } @@ -266,9 +266,9 @@ static int host_rcv_pkt(uint8_t *data, uint16_t len) #if CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED ble_log_spi_out_hci_write(BLE_LOG_SPI_OUT_SOURCE_HCI_UPSTREAM, data, len); #endif // CONFIG_BT_BLE_LOG_SPI_OUT_HCI_ENABLED -#if CONFIG_BLE_LOG_ENABLED +#if CONFIG_BLE_LOG_HOST_SIDE_HCI_LOG_ENABLED ble_log_write_hex(BLE_LOG_SRC_HCI, data, len); -#endif /* CONFIG_BLE_LOG_ENABLED */ +#endif /* CONFIG_BLE_LOG_HOST_SIDE_HCI_LOG_ENABLED */ bt_record_hci_data(data, len);