From 1f4c6ee31bef6511063bad4b0e75b0cdc3df7842 Mon Sep 17 00:00:00 2001 From: luoxu Date: Thu, 23 Apr 2026 11:22:32 +0800 Subject: [PATCH] fix(ble_mesh): fix Friend queue losing segmented messages for LPN --- components/bt/esp_ble_mesh/core/friend.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/components/bt/esp_ble_mesh/core/friend.c b/components/bt/esp_ble_mesh/core/friend.c index dd7c58b1ed0..ed02cd3129e 100644 --- a/components/bt/esp_ble_mesh/core/friend.c +++ b/components/bt/esp_ble_mesh/core/friend.c @@ -1270,12 +1270,11 @@ static void enqueue_friend_pdu(struct bt_mesh_friend *frnd, net_buf_slist_put(&seg->queue, buf); if (type == BLE_MESH_FRIEND_PDU_COMPLETE) { - struct net_buf *sbuf; - while ((sbuf = (void *)sys_slist_get(&seg->queue))) { - sbuf->frags = NULL; - sbuf->flags &= ~NET_BUF_FRAGS; - } - + /* First merge segments into the main queue (preserves the slist chain), + * then clear frags/flags. Note: net_buf.frags and net_buf.node.next + * share the same memory (union), so clearing frags before merge would + * break the slist chain. + */ sys_slist_merge_slist(&frnd->queue, &seg->queue); frnd->queue_size += seg->seg_count;