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; }