diff --git a/components/bt/common/ble_log/Kconfig.in b/components/bt/common/ble_log/Kconfig.in index 2bb05ede5af..edf459311de 100644 --- a/components/bt/common/ble_log/Kconfig.in +++ b/components/bt/common/ble_log/Kconfig.in @@ -91,6 +91,12 @@ if BLE_LOG_ENABLED checksum of frame head and payload all together by default, or only calculate the checksum of frame head to minimize performance decrease + config BLE_LOG_XOR_CHECKSUM_ENABLED + bool "Enable XOR checksum for BLE Log payload integrity check" + default y + help + XOR checksum is introduced for integrity check performance optimization. + config BLE_LOG_ENH_STAT_ENABLED bool "Enable enhanced statistics for BLE Log" default n diff --git a/components/bt/common/ble_log/src/ble_log_rt.c b/components/bt/common/ble_log/src/ble_log_rt.c index 382438c0cd8..7268797e361 100644 --- a/components/bt/common/ble_log/src/ble_log_rt.c +++ b/components/bt/common/ble_log/src/ble_log_rt.c @@ -60,7 +60,9 @@ BLE_LOG_IRAM_ATTR BLE_LOG_STATIC void ble_log_rt_task(void *pvParameters) if (rt_ts_enabled) { ble_log_ts_info_t *ts_info = NULL; ble_log_ts_info_update(&ts_info); - ble_log_write_hex(BLE_LOG_SRC_INTERNAL, (const uint8_t *)ts_info, sizeof(ble_log_ts_info_t)); + if (ts_info) { + ble_log_write_hex(BLE_LOG_SRC_INTERNAL, (const uint8_t *)ts_info, sizeof(ble_log_ts_info_t)); + } } #endif /* CONFIG_BLE_LOG_TS_ENABLED */ @@ -139,6 +141,7 @@ bool ble_log_sync_enable(bool enable) return false; } rt_ts_enabled = enable; + ble_log_ts_reset(enable); return true; } #endif /* CONFIG_BLE_LOG_TS_ENABLED */ diff --git a/components/bt/common/ble_log/src/ble_log_ts.c b/components/bt/common/ble_log/src/ble_log_ts.c index 38ad21c2108..e01611da10d 100644 --- a/components/bt/common/ble_log/src/ble_log_ts.c +++ b/components/bt/common/ble_log/src/ble_log_ts.c @@ -63,6 +63,10 @@ void ble_log_ts_deinit(void) void ble_log_ts_info_update(ble_log_ts_info_t **info) { + if (!ts_inited) { + return; + } + BLE_LOG_ENTER_CRITICAL(); ts_info->io_level = !ts_info->io_level; gpio_set_level(CONFIG_BLE_LOG_SYNC_IO_NUM, ts_info->io_level); @@ -73,3 +77,16 @@ void ble_log_ts_info_update(ble_log_ts_info_t **info) *info = ts_info; } + +void ble_log_ts_reset(bool status) +{ + if (!ts_inited) { + return; + } + + if (!status && !ts_info->io_level) { + gpio_set_level(CONFIG_BLE_LOG_SYNC_IO_NUM, 1); + } + ts_info->io_level = 0; + gpio_set_level(CONFIG_BLE_LOG_SYNC_IO_NUM, 0); +} diff --git a/components/bt/common/ble_log/src/ble_log_util.c b/components/bt/common/ble_log/src/ble_log_util.c index 7657ad92ddc..c084d6d249c 100644 --- a/components/bt/common/ble_log/src/ble_log_util.c +++ b/components/bt/common/ble_log/src/ble_log_util.c @@ -17,7 +17,60 @@ portMUX_TYPE ble_log_spin_lock = portMUX_INITIALIZER_UNLOCKED; #endif /* !UNIT_TEST */ /* INTERNAL INTERFACE */ -BLE_LOG_IRAM_ATTR uint32_t ble_log_fast_checksum(const uint8_t *data, size_t len) +#if CONFIG_BLE_LOG_XOR_CHECKSUM_ENABLED +#include "esp_compiler.h" + +static inline uint32_t ror32(uint32_t word, uint32_t shift) +{ + if (unlikely(shift == 0)) { + return word; + } + return (word >> shift) | (word << ((32 - shift) & 0x1F)); +} + +__attribute__((optimize("-O3"))) +BLE_LOG_IRAM_ATTR +uint32_t ble_log_fast_checksum(const uint8_t *data, size_t len) +{ + /* Validate input length */ + if (unlikely(len == 0)) { + return 0; + } + + /* Step 1: Force 32-bit align read and calculate offset */ + const uint32_t start_offset_shift = ((uintptr_t)data & 0x3) << 3; + const uint32_t *p_aligned = (const uint32_t *)((uintptr_t)data & ~0x3); + const uint32_t *p_end_aligned = (const uint32_t *)((uintptr_t)(data + len) & ~0x3); + + /* Step 2: Handle first word with mask (Little endian) */ + uint32_t checksum = (*p_aligned) & (0xFFFFFFFFU << start_offset_shift); + + /* Step 3: Check if first word is last word */ + const uint32_t end_offset_shift = ((uintptr_t)(data + len) & 0x3) << 3; + const uint32_t end_offset_shift_mask = ~(0xFFFFFFFFU << end_offset_shift); + if (unlikely(p_aligned == p_end_aligned)) { + if (end_offset_shift) { + checksum &= end_offset_shift_mask; + } + } else { + /* Step 4: Handle word in the middle */ + p_aligned++; + while (p_aligned < p_end_aligned) { + checksum ^= *p_aligned++; + } + + /* Step 5: Handle last word with mask (Little endian) */ + if (end_offset_shift) { + checksum ^= (*p_aligned) & end_offset_shift_mask; + } + } + + /* Step 6: Rotate the final result */ + return ror32(checksum, start_offset_shift); +} +#else /* !CONFIG_BLE_LOG_XOR_CHECKSUM_ENABLED */ +BLE_LOG_IRAM_ATTR +uint32_t ble_log_fast_checksum(const uint8_t *data, size_t len) { uint32_t sum = 0; size_t i = 0; @@ -46,3 +99,4 @@ BLE_LOG_IRAM_ATTR uint32_t ble_log_fast_checksum(const uint8_t *data, size_t len return sum; } +#endif /* CONFIG_BLE_LOG_XOR_CHECKSUM_ENABLED */ diff --git a/components/bt/common/ble_log/src/internal_include/ble_log_ts.h b/components/bt/common/ble_log/src/internal_include/ble_log_ts.h index 5e0864b2587..6a09cd70f1b 100644 --- a/components/bt/common/ble_log/src/internal_include/ble_log_ts.h +++ b/components/bt/common/ble_log/src/internal_include/ble_log_ts.h @@ -53,5 +53,6 @@ typedef struct { bool ble_log_ts_init(void); void ble_log_ts_deinit(void); void ble_log_ts_info_update(ble_log_ts_info_t **ts_info); +void ble_log_ts_reset(bool status); #endif /* __BLE_LOG_TS_H__ */ diff --git a/components/bt/common/ble_log/src/internal_include/ble_log_util.h b/components/bt/common/ble_log/src/internal_include/ble_log_util.h index d0e7c460f0c..352ae80cbd5 100644 --- a/components/bt/common/ble_log/src/internal_include/ble_log_util.h +++ b/components/bt/common/ble_log/src/internal_include/ble_log_util.h @@ -130,7 +130,7 @@ bool ble_log_cas_acquire(volatile bool *cas_lock); void ble_log_cas_release(volatile bool *cas_lock); #endif /* UNIT_TEST */ -#define BLE_LOG_VERSION (2) +#define BLE_LOG_VERSION (3) /* TYPEDEF */ typedef enum { diff --git a/components/bt/host/bluedroid/api/esp_bluedroid_hci.c b/components/bt/host/bluedroid/api/esp_bluedroid_hci.c index ac64d17d049..4d02016d89f 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 0baa265f2a1..76d7960b73a 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) 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 520e2a67a85..5ba8036bad6 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) @@ -75,6 +78,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); } @@ -252,6 +258,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);