Skip to content

Commit 82bd4dd

Browse files
committed
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
1 parent f3950b3 commit 82bd4dd

File tree

5 files changed

+65
-19
lines changed

5 files changed

+65
-19
lines changed

components/bt/esp_ble_mesh/btc/include/btc_ble_mesh_model_common.h

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2020-2023 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2020-2025 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
@@ -32,6 +32,27 @@ static inline void btc_ble_mesh_set_client_common_param(esp_ble_mesh_client_comm
3232
output->ctx.send_cred = input->ctx.send_cred;
3333
output->ctx.send_tag = input->ctx.send_tag;
3434
output->msg_timeout = input->msg_timeout;
35+
if (input->ctx.enh.adv_cfg_used) {
36+
output->ctx.enh.adv_cfg_used = input->ctx.enh.adv_cfg_used;
37+
output->ctx.enh.adv_cfg.adv_cnt = input->ctx.enh.adv_cfg.adv_cnt;
38+
output->ctx.enh.adv_cfg.adv_itvl = input->ctx.enh.adv_cfg.adv_itvl;
39+
output->ctx.enh.adv_cfg.channel_map = input->ctx.enh.adv_cfg.channel_map;
40+
}
41+
#if CONFIG_BLE_MESH_EXT_ADV
42+
if (input->ctx.enh.ext_adv_cfg_used) {
43+
output->ctx.enh.ext_adv_cfg_used = input->ctx.enh.ext_adv_cfg_used;
44+
output->ctx.enh.ext_adv_cfg.primary_phy = input->ctx.enh.ext_adv_cfg.primary_phy;
45+
output->ctx.enh.ext_adv_cfg.secondary_phy = input->ctx.enh.ext_adv_cfg.secondary_phy;
46+
output->ctx.enh.ext_adv_cfg.include_tx_power = input->ctx.enh.ext_adv_cfg.include_tx_power;
47+
output->ctx.enh.ext_adv_cfg.tx_power = input->ctx.enh.ext_adv_cfg.tx_power;
48+
}
49+
#if CONFIG_BLE_MESH_LONG_PACKET
50+
if (input->ctx.enh.long_pkt_cfg_used) {
51+
output->ctx.enh.long_pkt_cfg_used = input->ctx.enh.long_pkt_cfg_used;
52+
output->ctx.enh.long_pkt_cfg = input->ctx.enh.long_pkt_cfg;
53+
}
54+
#endif
55+
#endif
3556
}
3657
}
3758

components/bt/esp_ble_mesh/core/scan.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,9 @@ static void bt_mesh_scan_cb(struct bt_mesh_adv_report *adv_rpt)
430430
#endif
431431
adv_rpt->adv_type != BLE_MESH_ADV_NONCONN_IND &&
432432
adv_rpt->adv_type != BLE_MESH_ADV_IND
433+
#if CONFIG_BLE_MESH_EXT_ADV
434+
&& adv_rpt->adv_type != BLE_MESH_EXT_ADV_NONCONN_IND
435+
#endif
433436
#if CONFIG_BLE_MESH_RPR_SRV && CONFIG_BLE_MESH_RPR_SRV_ACTIVE_SCAN
434437
&& adv_rpt->adv_type != BLE_MESH_ADV_SCAN_RSP
435438
#endif

components/bt/esp_ble_mesh/core/transport.c

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -800,16 +800,19 @@ int bt_mesh_trans_send(struct bt_mesh_net_tx *tx, struct net_buf_simple *msg,
800800
}
801801

802802
#if CONFIG_BLE_MESH_LONG_PACKET
803-
if (tx->ctx->enh.long_pkt_cfg_used == true &&
804-
(tx->ctx->enh.long_pkt_cfg == BLE_MESH_LONG_PACKET_FORCE ||
805-
tx->ctx->enh.long_pkt_cfg == BLE_MESH_LONG_PACKET_PREFER) &&
806-
msg->len > BLE_MESH_EXT_SDU_UNSEG_MAX) {
803+
if (tx->ctx->enh.long_pkt_cfg_used == true) {
804+
if (tx->ctx->enh.long_pkt_cfg == BLE_MESH_LONG_PACKET_FORCE &&
805+
msg->len > BLE_MESH_EXT_SDU_UNSEG_MAX) {
806+
tx->ctx->send_tag |= BLE_MESH_TAG_SEND_SEGMENTED;
807+
} else if (tx->ctx->enh.long_pkt_cfg == BLE_MESH_LONG_PACKET_PREFER &&
808+
msg->len > BLE_MESH_SDU_UNSEG_MAX) {
807809
tx->ctx->send_tag |= BLE_MESH_TAG_SEND_SEGMENTED;
808-
} else {
809-
if (msg->len > BLE_MESH_SDU_UNSEG_MAX) {
810-
tx->ctx->send_tag |= BLE_MESH_TAG_SEND_SEGMENTED;
811-
}
812810
}
811+
} else {
812+
if (msg->len > BLE_MESH_SDU_UNSEG_MAX) {
813+
tx->ctx->send_tag |= BLE_MESH_TAG_SEND_SEGMENTED;
814+
}
815+
}
813816
#else
814817
if (msg->len > BLE_MESH_SDU_UNSEG_MAX) {
815818
tx->ctx->send_tag |= BLE_MESH_TAG_SEND_SEGMENTED;

components/bt/esp_ble_mesh/core/transport.enh.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1151,11 +1151,14 @@ int bt_mesh_trans_send(struct bt_mesh_net_tx *tx, struct net_buf_simple *msg,
11511151
}
11521152

11531153
#if CONFIG_BLE_MESH_LONG_PACKET
1154-
if (tx->ctx->enh.long_pkt_cfg_used == true &&
1155-
(tx->ctx->enh.long_pkt_cfg == BLE_MESH_LONG_PACKET_FORCE ||
1156-
tx->ctx->enh.long_pkt_cfg == BLE_MESH_LONG_PACKET_PREFER) &&
1157-
msg->len > BLE_MESH_EXT_SDU_UNSEG_MAX) {
1158-
tx->ctx->send_tag |= BLE_MESH_TAG_SEND_SEGMENTED;
1154+
if (tx->ctx->enh.long_pkt_cfg_used == true) {
1155+
if (tx->ctx->enh.long_pkt_cfg == BLE_MESH_LONG_PACKET_FORCE &&
1156+
msg->len > BLE_MESH_EXT_SDU_UNSEG_MAX) {
1157+
tx->ctx->send_tag |= BLE_MESH_TAG_SEND_SEGMENTED;
1158+
} else if (tx->ctx->enh.long_pkt_cfg == BLE_MESH_LONG_PACKET_PREFER &&
1159+
msg->len > BLE_MESH_SDU_UNSEG_MAX) {
1160+
tx->ctx->send_tag |= BLE_MESH_TAG_SEND_SEGMENTED;
1161+
}
11591162
} else {
11601163
if (msg->len > BLE_MESH_SDU_UNSEG_MAX) {
11611164
tx->ctx->send_tag |= BLE_MESH_TAG_SEND_SEGMENTED;

components/bt/esp_ble_mesh/models/client/client_common.c

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2017-2021 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2017-2025 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
@@ -183,12 +183,28 @@ static int32_t bt_mesh_client_calc_timeout(struct bt_mesh_msg_ctx *ctx,
183183
{
184184
int32_t seg_rtx_to = 0, duration = 0, time = 0;
185185
uint8_t seg_count = 0, seg_rtx_num = 0;
186-
bool need_seg = false;
186+
bool need_seg = bt_mesh_tag_send_segmented(ctx->send_tag);
187187
uint8_t mic_size = 0;
188188

189-
if (msg->len > BLE_MESH_SDU_UNSEG_MAX ||
190-
bt_mesh_tag_send_segmented(ctx->send_tag)) {
191-
need_seg = true; /* Needs segmentation */
189+
if (!need_seg) {
190+
#if CONFIG_BLE_MESH_LONG_PACKET
191+
if (ctx->enh.long_pkt_cfg_used == true) {
192+
if ((ctx->enh.long_pkt_cfg == BLE_MESH_LONG_PACKET_FORCE &&
193+
msg->len > BLE_MESH_EXT_SDU_UNSEG_MAX) ||
194+
(ctx->enh.long_pkt_cfg == BLE_MESH_LONG_PACKET_PREFER &&
195+
msg->len > BLE_MESH_SDU_UNSEG_MAX)) {
196+
need_seg = true; /* Needs segmentation */
197+
}
198+
} else {
199+
if (msg->len > BLE_MESH_SDU_UNSEG_MAX) {
200+
need_seg = true; /* Needs segmentation */
201+
}
202+
}
203+
#else
204+
if (msg->len > BLE_MESH_SDU_UNSEG_MAX) {
205+
need_seg = true; /* Needs segmentation */
206+
}
207+
#endif
192208
}
193209

194210
mic_size = (need_seg && ctx->send_szmic == BLE_MESH_SEG_SZMIC_LONG &&

0 commit comments

Comments
 (0)