From 0772e12f58cd4c839342ac067fe2c2a06cd76d30 Mon Sep 17 00:00:00 2001 From: luoxu Date: Fri, 17 Oct 2025 20:32:50 +0800 Subject: [PATCH] fix(ble_mesh): resolve issues in long packet mode - Fix ignored extended advertising parameters from application - Fix incorrect filtering of extended advertising reports - Fix segmentation logic errors in long packet mode --- .../btc/include/btc_ble_mesh_model_common.h | 23 +++++++++++++++- components/bt/esp_ble_mesh/core/scan.c | 3 +++ components/bt/esp_ble_mesh/core/transport.c | 19 ++++++++------ .../bt/esp_ble_mesh/core/transport.enh.c | 13 ++++++---- .../models/client/client_common.c | 26 +++++++++++++++---- 5 files changed, 65 insertions(+), 19 deletions(-) diff --git a/components/bt/esp_ble_mesh/btc/include/btc_ble_mesh_model_common.h b/components/bt/esp_ble_mesh/btc/include/btc_ble_mesh_model_common.h index 8c1f1d37b9b..73b00db41ff 100644 --- a/components/bt/esp_ble_mesh/btc/include/btc_ble_mesh_model_common.h +++ b/components/bt/esp_ble_mesh/btc/include/btc_ble_mesh_model_common.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2020-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2020-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -32,6 +32,27 @@ static inline void btc_ble_mesh_set_client_common_param(esp_ble_mesh_client_comm output->ctx.send_cred = input->ctx.send_cred; output->ctx.send_tag = input->ctx.send_tag; output->msg_timeout = input->msg_timeout; + if (input->ctx.enh.adv_cfg_used) { + output->ctx.enh.adv_cfg_used = input->ctx.enh.adv_cfg_used; + output->ctx.enh.adv_cfg.adv_cnt = input->ctx.enh.adv_cfg.adv_cnt; + output->ctx.enh.adv_cfg.adv_itvl = input->ctx.enh.adv_cfg.adv_itvl; + output->ctx.enh.adv_cfg.channel_map = input->ctx.enh.adv_cfg.channel_map; + } +#if CONFIG_BLE_MESH_EXT_ADV + if (input->ctx.enh.ext_adv_cfg_used) { + output->ctx.enh.ext_adv_cfg_used = input->ctx.enh.ext_adv_cfg_used; + output->ctx.enh.ext_adv_cfg.primary_phy = input->ctx.enh.ext_adv_cfg.primary_phy; + output->ctx.enh.ext_adv_cfg.secondary_phy = input->ctx.enh.ext_adv_cfg.secondary_phy; + output->ctx.enh.ext_adv_cfg.include_tx_power = input->ctx.enh.ext_adv_cfg.include_tx_power; + output->ctx.enh.ext_adv_cfg.tx_power = input->ctx.enh.ext_adv_cfg.tx_power; + } +#if CONFIG_BLE_MESH_LONG_PACKET + if (input->ctx.enh.long_pkt_cfg_used) { + output->ctx.enh.long_pkt_cfg_used = input->ctx.enh.long_pkt_cfg_used; + output->ctx.enh.long_pkt_cfg = input->ctx.enh.long_pkt_cfg; + } +#endif +#endif } } diff --git a/components/bt/esp_ble_mesh/core/scan.c b/components/bt/esp_ble_mesh/core/scan.c index 0742ddc099d..d161061ca74 100644 --- a/components/bt/esp_ble_mesh/core/scan.c +++ b/components/bt/esp_ble_mesh/core/scan.c @@ -430,6 +430,9 @@ static void bt_mesh_scan_cb(struct bt_mesh_adv_report *adv_rpt) #endif adv_rpt->adv_type != BLE_MESH_ADV_NONCONN_IND && adv_rpt->adv_type != BLE_MESH_ADV_IND +#if CONFIG_BLE_MESH_EXT_ADV + && adv_rpt->adv_type != BLE_MESH_EXT_ADV_NONCONN_IND +#endif #if CONFIG_BLE_MESH_RPR_SRV && CONFIG_BLE_MESH_RPR_SRV_ACTIVE_SCAN && adv_rpt->adv_type != BLE_MESH_ADV_SCAN_RSP #endif diff --git a/components/bt/esp_ble_mesh/core/transport.c b/components/bt/esp_ble_mesh/core/transport.c index bb3575e6f76..88a6158b89e 100644 --- a/components/bt/esp_ble_mesh/core/transport.c +++ b/components/bt/esp_ble_mesh/core/transport.c @@ -800,16 +800,19 @@ int bt_mesh_trans_send(struct bt_mesh_net_tx *tx, struct net_buf_simple *msg, } #if CONFIG_BLE_MESH_LONG_PACKET - if (tx->ctx->enh.long_pkt_cfg_used == true && - (tx->ctx->enh.long_pkt_cfg == BLE_MESH_LONG_PACKET_FORCE || - tx->ctx->enh.long_pkt_cfg == BLE_MESH_LONG_PACKET_PREFER) && - msg->len > BLE_MESH_EXT_SDU_UNSEG_MAX) { + if (tx->ctx->enh.long_pkt_cfg_used == true) { + if (tx->ctx->enh.long_pkt_cfg == BLE_MESH_LONG_PACKET_FORCE && + msg->len > BLE_MESH_EXT_SDU_UNSEG_MAX) { + tx->ctx->send_tag |= BLE_MESH_TAG_SEND_SEGMENTED; + } else if (tx->ctx->enh.long_pkt_cfg == BLE_MESH_LONG_PACKET_PREFER && + msg->len > BLE_MESH_SDU_UNSEG_MAX) { tx->ctx->send_tag |= BLE_MESH_TAG_SEND_SEGMENTED; - } else { - if (msg->len > BLE_MESH_SDU_UNSEG_MAX) { - tx->ctx->send_tag |= BLE_MESH_TAG_SEND_SEGMENTED; - } } + } else { + if (msg->len > BLE_MESH_SDU_UNSEG_MAX) { + tx->ctx->send_tag |= BLE_MESH_TAG_SEND_SEGMENTED; + } + } #else if (msg->len > BLE_MESH_SDU_UNSEG_MAX) { tx->ctx->send_tag |= BLE_MESH_TAG_SEND_SEGMENTED; diff --git a/components/bt/esp_ble_mesh/core/transport.enh.c b/components/bt/esp_ble_mesh/core/transport.enh.c index 434ec0c73a2..318b21bb099 100644 --- a/components/bt/esp_ble_mesh/core/transport.enh.c +++ b/components/bt/esp_ble_mesh/core/transport.enh.c @@ -1151,11 +1151,14 @@ int bt_mesh_trans_send(struct bt_mesh_net_tx *tx, struct net_buf_simple *msg, } #if CONFIG_BLE_MESH_LONG_PACKET - if (tx->ctx->enh.long_pkt_cfg_used == true && - (tx->ctx->enh.long_pkt_cfg == BLE_MESH_LONG_PACKET_FORCE || - tx->ctx->enh.long_pkt_cfg == BLE_MESH_LONG_PACKET_PREFER) && - msg->len > BLE_MESH_EXT_SDU_UNSEG_MAX) { - tx->ctx->send_tag |= BLE_MESH_TAG_SEND_SEGMENTED; + if (tx->ctx->enh.long_pkt_cfg_used == true) { + if (tx->ctx->enh.long_pkt_cfg == BLE_MESH_LONG_PACKET_FORCE && + msg->len > BLE_MESH_EXT_SDU_UNSEG_MAX) { + tx->ctx->send_tag |= BLE_MESH_TAG_SEND_SEGMENTED; + } else if (tx->ctx->enh.long_pkt_cfg == BLE_MESH_LONG_PACKET_PREFER && + msg->len > BLE_MESH_SDU_UNSEG_MAX) { + tx->ctx->send_tag |= BLE_MESH_TAG_SEND_SEGMENTED; + } } else { if (msg->len > BLE_MESH_SDU_UNSEG_MAX) { tx->ctx->send_tag |= BLE_MESH_TAG_SEND_SEGMENTED; diff --git a/components/bt/esp_ble_mesh/models/client/client_common.c b/components/bt/esp_ble_mesh/models/client/client_common.c index d10aa244a3d..5917b69cdf7 100644 --- a/components/bt/esp_ble_mesh/models/client/client_common.c +++ b/components/bt/esp_ble_mesh/models/client/client_common.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2017-2021 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2017-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -183,12 +183,28 @@ static int32_t bt_mesh_client_calc_timeout(struct bt_mesh_msg_ctx *ctx, { int32_t seg_rtx_to = 0, duration = 0, time = 0; uint8_t seg_count = 0, seg_rtx_num = 0; - bool need_seg = false; + bool need_seg = bt_mesh_tag_send_segmented(ctx->send_tag); uint8_t mic_size = 0; - if (msg->len > BLE_MESH_SDU_UNSEG_MAX || - bt_mesh_tag_send_segmented(ctx->send_tag)) { - need_seg = true; /* Needs segmentation */ + if (!need_seg) { +#if CONFIG_BLE_MESH_LONG_PACKET + if (ctx->enh.long_pkt_cfg_used == true) { + if ((ctx->enh.long_pkt_cfg == BLE_MESH_LONG_PACKET_FORCE && + msg->len > BLE_MESH_EXT_SDU_UNSEG_MAX) || + (ctx->enh.long_pkt_cfg == BLE_MESH_LONG_PACKET_PREFER && + msg->len > BLE_MESH_SDU_UNSEG_MAX)) { + need_seg = true; /* Needs segmentation */ + } + } else { + if (msg->len > BLE_MESH_SDU_UNSEG_MAX) { + need_seg = true; /* Needs segmentation */ + } + } +#else + if (msg->len > BLE_MESH_SDU_UNSEG_MAX) { + need_seg = true; /* Needs segmentation */ + } +#endif } mic_size = (need_seg && ctx->send_szmic == BLE_MESH_SEG_SZMIC_LONG &&