Log rejected queued connects and keep the guard until a fixed release is tagged

This commit is contained in:
J. Nick Koston
2026-09-17 17:57:54 -05:00
parent a5100e13fb
commit 860aecf539
3 changed files with 16 additions and 12 deletions
@@ -443,15 +443,13 @@ async def to_code(config: ConfigType) -> None:
cg.add_define("USE_ESP32_BLE_SOFTWARE_COEXISTENCE")
# First release per series with espressif/esp-idf@82e71c1767 (see bluedroid_stubs.cpp).
# 5.4.5, 5.5.6 and 6.1.1 are not tagged yet but the fix is on their branches.
# First tagged release per series with espressif/esp-idf@82e71c1767 (see bluedroid_stubs.cpp).
# A series without an entry keeps the guard until a fixed release is tagged; the guard is
# harmless on fixed sources. The 5.4, 5.5 and 6.1 branches carry the fix but have no tag yet.
DIRECT_CONN_FIX_VERSIONS = {
(5, 2): cv.Version(5, 2, 8),
(5, 3): cv.Version(5, 3, 6),
(5, 4): cv.Version(5, 4, 5),
(5, 5): cv.Version(5, 5, 6),
(6, 0): cv.Version(6, 0, 3),
(6, 1): cv.Version(6, 1, 1),
}
DIRECT_CONN_FIX_ALL_FROM = cv.Version(6, 2, 0)
@@ -11,10 +11,13 @@
#ifdef USE_ESP32_BLE_TRACKER_DIRECT_CONN_GUARD
#include <esp_idf_version.h>
#include <cstdint>
#include "esphome/core/log.h"
namespace esphome::esp32_ble_tracker {}
namespace esphome::esp32_ble_tracker {
static const char *const TAG = "esp32_ble_tracker";
} // namespace esphome::esp32_ble_tracker
// in_use is the first member of the private tL2C_LCB (checked ESP-IDF 5.0 to 6.1)
static_assert(ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(6, 2, 0),
"ESP-IDF 6.2 and later have the fix, this guard should not be enabled (esphome/esphome#19373)");
@@ -25,12 +28,15 @@ bool __real_l2cble_init_direct_conn(void *p_lcb);
void l2cu_release_lcb(void *p_lcb);
bool __wrap_l2cble_init_direct_conn(void *p_lcb) {
if (p_lcb == nullptr || !*static_cast<const bool *>(p_lcb)) {
// in_use is the first member of the private tL2C_LCB (checked ESP-IDF 5.0 to 6.1)
const auto *in_use = static_cast<const uint8_t *>(p_lcb);
if (p_lcb == nullptr || *in_use == 0) {
ESP_LOGW(esphome::esp32_ble_tracker::TAG, "Dropped queued connect on a released link block");
return false;
}
const bool started = __real_l2cble_init_direct_conn(p_lcb);
// Every failure path releases the block except unknown device, also fixed upstream
if (!started && *static_cast<const bool *>(p_lcb)) {
if (!started && *in_use != 0) {
l2cu_release_lcb(p_lcb);
}
return started;
@@ -55,13 +55,13 @@ def test_guard_only_in_client_builds_on_unfixed_idf(
("5.3.5", True),
("5.3.6", False),
("5.4.4", True),
("5.4.5", False),
("5.4.5", True), # no fixed 5.4, 5.5 or 6.1 tag yet
("5.5.5", True),
("5.5.6", False),
("5.5.6", True),
("6.0.2", True),
("6.0.3", False),
("6.1.0", True),
("6.1.1", False),
("6.1.1", True),
("6.2.0", False),
("7.0.0", False),
],